diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md
index 2616af48fed0..ad522ec4e8d6 100644
--- a/.github/ISSUE_TEMPLATE/Bug_report.md
+++ b/.github/ISSUE_TEMPLATE/Bug_report.md
@@ -4,6 +4,11 @@ about: Create a report to help us improve
---
+**IMPORTANT NOTICE**
+If you do not complete the template below it is likely that your issue will not be addressed. When providing information about your issue please be as extensive as possible so that it can be solved by as little as possible responses.
+
+**FAILURE TO COMPLETE THE REQUESTED INFORMATION WILL RESULT IN YOUR ISSUE BEING CLOSED**
+
**Describe the bug**
_A clear and concise description of what the bug is._
@@ -11,9 +16,12 @@ _A clear and concise description of what the bug is._
_Also, make sure these boxes are checked [x] before submitting your issue - Thank you!_
- [ ] _Searched the problem in issues and in the wiki_
- [ ] _Hardware used_ :
+- [ ] _Development/Compiler/Upload tools used_ :
+- [ ] _If a pre-compiled release or development binary was used, which one?_ :
+- [ ] _You have tried latest release or development binaries?_ :
- [ ] _Provide the output of command_``status 0`` :
```
-STATUS 0 OUTPUT HERE
+STATUS 0 OUTPUT HERE - DO NOT DELETE THE MARKERS ABOVE AND BELOW THIS LINE
```
**To Reproduce**
diff --git a/.github/ISSUE_TEMPLATE/Custom.md b/.github/ISSUE_TEMPLATE/Custom.md
index 159549128389..4d1eba459a45 100644
--- a/.github/ISSUE_TEMPLATE/Custom.md
+++ b/.github/ISSUE_TEMPLATE/Custom.md
@@ -4,13 +4,21 @@ about: Users Troubleshooting Help
---
+**IMPORTANT NOTICE**
+If you do not complete the template below it is likely that your issue will not be addressed. When providing information about your issue please be as extensive as possible so that it can be solved by as little as possible responses.
+
+**FAILURE TO COMPLETE THE REQUESTED INFORMATION WILL RESULT IN YOUR ISSUE BEING CLOSED**
+
Make sure these boxes are checked [x] before submitting your issue - Thank you!
- [ ] Searched the problem in issues (https://github.com/arendst/Sonoff-Tasmota/issues)
- [ ] Searched the problem in the wiki (https://github.com/arendst/Sonoff-Tasmota/wiki/Troubleshooting)
- [ ] Searched the problem in the forum (https://groups.google.com/d/forum/sonoffusers)
- [ ] Searched the problem in the chat (https://discord.gg/Ks2Kzd4)
+- [ ] Development/Compiler/Upload tools used :
- [ ] Hardware used :
+- [ ] If a pre-compiled release or development binary was used, which one? :
+- [ ] You have tried latest release or development binaries? :
- [ ] Provide the output of command ``status 0`` :
```
STATUS 0 OUTPUT HERE
diff --git a/.gitignore b/.gitignore
index b6460347bd88..028a76667bf7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,3 +12,6 @@ build
## Visual Studio Code specific ######
.vscode
+.vscode/.browse.c_cpp.db*
+.vscode/c_cpp_properties.json
+.vscode/launch.json
diff --git a/API.md b/API.md
new file mode 100644
index 000000000000..23e45369dcae
--- /dev/null
+++ b/API.md
@@ -0,0 +1,65 @@
+## Sonoff-Tasmota basic API information
+Sonoff-Tasmota can easily be extended by developers using provided function pointers as callback Ids. This document lists the available callback function Ids. See the wiki (https://github.com/arendst/Sonoff-Tasmota/wiki/Sensor-API) for more information.
+
+Callback availability can be checked by searching for either XdrvCall, XsnsCall, XdspCall and XnrgCall.
+
+## Driver, Sensor and Energy Callback Ids
+The following table lists Callback Ids and their availability for a Driver, Sensor or Energy service.
+
+Callback Id | Bool | Version | xdrv | xsns | xnrg | Description
+----------------------------|------|----------|------|------|------|----------------------------------
+FUNC_SETTINGS_OVERRIDE | | 6.2.1.19 | x | | | Override start-up settings
+FUNC_MODULE_INIT | x | 6.2.1.17 | x | | | Init module specific parameters
+FUNC_PRE_INIT | | | x | | x | Once GPIO have been established
+FUNC_INIT | | | x | x | x | At end of initialisation
+FUNC_LOOP | | | x | | | In main loop
+FUNC_EVERY_50_MSECOND | | | x | x | |
+FUNC_EVERY_100_MSECOND | | | x | x | |
+FUNC_EVERY_200_MSECOND | | | | x | x |
+FUNC_EVERY_250_MSECOND | | | x | | |
+FUNC_EVERY_SECOND | | | x | x | x |
+FUNC_PREP_BEFORE_TELEPERIOD | | | | x | | Deprecated. Use a FUNC_EVERY_
+FUNC_JSON_APPEND | | | | x | | Extend teleperiod JSON text
+FUNC_WEB_APPEND | | | | x | | Extend webgui ajax info
+FUNC_SAVE_BEFORE_RESTART | | | | x | | Just before a planned restart
+FUNC_COMMAND | x | | x | x | | When a command is not recognized
+FUNC_MQTT_SUBSCRIBE | | 5.12.0k | x | | | At end of MQTT subscriptions
+FUNC_MQTT_INIT | | 5.12.0k | x | | | Once at end of MQTT connection
+FUNC_MQTT_DATA | x | 5.12.0k | x | | | Before decoding command
+FUNC_SET_POWER | | | x | | | Before setting relays
+FUNC_SET_DEVICE_POWER | x | 6.2.1.18 | x | | | Set relay
+FUNC_SHOW_SENSOR | | | x | | | When FUNC_JSON_APPEND completes
+FUNC_RULES_PROCESS | x | 6.0.0 | x | | | Process specific rule
+FUNC_SERIAL | x | | x | | x | Process serial data
+FUNC_FREE_MEM | | | x | | | Show free memory for debugging
+FUNC_BUTTON_PRESSED | x | 6.2.1.18 | x | | | When a button is pressed
+FUNC_WEB_ADD_BUTTON | | 6.2.1.14 | x | x | | Add a Configuration Button to GUI
+FUNC_WEB_ADD_MAIN_BUTTON | | 6.2.1.14 | x | x | | Add a main button to GUI
+FUNC_WEB_ADD_HANDLER | | 6.2.1.14 | x | x | | Add a webserver handler
+
+## Display Call back Ids
+The following table lists all Callback Ids for a Display service.
+
+Callback Id | Bool | Version | Description
+------------------------------|------|----------|---------------------
+FUNC_DISPLAY_INIT_DRIVER | | 6.1.1.7 |
+FUNC_DISPLAY_INIT | | 6.1.1.7 |
+FUNC_DISPLAY_EVERY_50_MSECOND | | 6.1.1.7 |
+FUNC_DISPLAY_EVERY_SECOND | | 6.1.1.7 |
+FUNC_DISPLAY_MODEL | x | 6.1.1.7 |
+FUNC_DISPLAY_MODE | | 6.1.1.7 |
+FUNC_DISPLAY_POWER | | 6.1.1.7 |
+FUNC_DISPLAY_CLEAR | | 6.1.1.7 |
+FUNC_DISPLAY_DRAW_FRAME | | 6.1.1.7 |
+FUNC_DISPLAY_DRAW_HLINE | | 6.1.1.7 |
+FUNC_DISPLAY_DRAW_VLINE | | 6.1.1.7 |
+FUNC_DISPLAY_DRAW_LINE | | 6.1.1.7 |
+FUNC_DISPLAY_DRAW_CIRCLE | | 6.1.1.7 |
+FUNC_DISPLAY_FILL_CIRCLE | | 6.1.1.7 |
+FUNC_DISPLAY_DRAW_RECTANGLE | | 6.1.1.7 |
+FUNC_DISPLAY_FILL_RECTANGLE | | 6.1.1.7 |
+FUNC_DISPLAY_TEXT_SIZE | | 6.1.1.7 |
+FUNC_DISPLAY_FONT_SIZE | | 6.1.1.7 |
+FUNC_DISPLAY_ROTATION | | 6.1.1.7 |
+FUNC_DISPLAY_DRAW_STRING | | 6.1.1.7 |
+FUNC_DISPLAY_ONOFF | | 6.1.1.7 |
diff --git a/Doxyfile b/Doxyfile
new file mode 100644
index 000000000000..2df4d1c2cabf
--- /dev/null
+++ b/Doxyfile
@@ -0,0 +1,2489 @@
+# Doxyfile 1.8.14
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See
+# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME = Sonoff-Tasmota
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER =
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF = "Provide ESP8266 based itead Sonoff with Web, MQTT and OTA firmware using Arduino IDE or PlatformIO"
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = ./
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF = "The $name class" \
+ "The $name widget" \
+ "The $name file" \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB = YES
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES = NO
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines (in the resulting output). You can put ^^ in the value part of an
+# alias to insert a newline as if a physical newline was in the original file.
+
+ALIASES = "abstract=" \
+ "access=" \
+ "subpackage=" \
+ "license=copyright" \
+ "description=" \
+ "see="
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING = ino=C
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT = YES
+
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# to that level are automatically included in the table of contents, even if
+# they do not have an id attribute.
+# Note: This feature currently applies only to Markdown headings.
+# Minimum value: 0, maximum value: 99, default value: 0.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+TOC_INCLUDE_HEADINGS = 0
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING = NO
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE = YES
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS = YES
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES = YES
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if ... \endif and \cond
+# ... \endcond blocks.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC = YES
+
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered.
+# The default value is: NO.
+
+WARN_AS_ERROR = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT = sonoff \
+ lib
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: https://www.gnu.org/software/libiconv/) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
+# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf.
+
+FILE_PATTERNS = *.c \
+ *.cc \
+ *.cxx \
+ *.cpp \
+ *.c++ \
+ *.java \
+ *.ii \
+ *.ixx \
+ *.ipp \
+ *.i++ \
+ *.inl \
+ *.idl \
+ *.ddl \
+ *.odl \
+ *.h \
+ *.hh \
+ *.hxx \
+ *.hpp \
+ *.h++ \
+ *.cs \
+ *.d \
+ *.php \
+ *.php4 \
+ *.php5 \
+ *.phtml \
+ *.inc \
+ *.m \
+ *.markdown \
+ *.md \
+ *.mm \
+ *.dox \
+ *.py \
+ *.pyw \
+ *.f90 \
+ *.f95 \
+ *.f03 \
+ *.f08 \
+ *.f \
+ *.for \
+ *.tcl \
+ *.vhd \
+ *.vhdl \
+ *.ucf \
+ *.ino \
+ *.qsf
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS = */.git*
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+#
+#
+# where is the value of the INPUT_FILTER tag, and is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES = YES
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see https://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION = .xhtml
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP = YES
+
+# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
+# documentation will contain a main index with vertical navigation menus that
+# are dynamically created via Javascript. If disabled, the navigation index will
+# consists of multiple levels of tabs that are statically embedded in every HTML
+# page. Disable this option to support browsers that do not have Javascript,
+# like the Qt help browser.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_MENUS = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: https://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See https://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://doc.qt.io/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://doc.qt.io/qt-4.8/qthelpproject.html#virtual-folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://doc.qt.io/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# https://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from https://www.mathjax.org before deployment.
+# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH = https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use + S
+# (what the is depends on the OS and browser, but it is typically
+# , /, or both). Inside the search box use the to jump into the search results window, the results can be navigated
+# using the . Press to select an item or to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing +. Also here use the
+# to select a filter and or to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: https://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: https://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE = plain
+
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE =
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
+# the structure of the code including all documentation. Note that this feature
+# is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK = YES
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS = YES
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH = YES
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH = YES
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT = svg
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG = YES
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH =
+
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for plantuml.
+
+PLANTUML_CFG_FILE =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP = YES
diff --git a/README.md b/README.md
index 7a257be8e47d..09354028aa3f 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,8 @@ Alternative firmware for _ESP8266 based devices_ like [iTead](https://www.itead.
[![GitHub version](https://img.shields.io/github/release/arendst/Sonoff-Tasmota.svg)](https://github.com/arendst/Sonoff-Tasmota/releases/latest)
[![GitHub download](https://img.shields.io/github/downloads/arendst/Sonoff-Tasmota/total.svg)](https://github.com/arendst/Sonoff-Tasmota/releases/latest)
-[![License](https://img.shields.io/github/license/arendst/Sonoff-Tasmota.svg)](https://github.com/arendst/Sonoff-Tasmota/blob/master/LICENSE.txt)
+[![License](https://img.shields.io/github/license/arendst/Sonoff-Tasmota.svg)](https://github.com/arendst/Sonoff-Tasmota/blob/development/LICENSE.txt)
+[![Chat](https://img.shields.io/discord/479389167382691863.svg)](https://discord.gg/Ks2Kzd4)
If you like **Sonoff-Tasmota**, give it a star, or fork it and contribute!
@@ -12,7 +13,18 @@ If you like **Sonoff-Tasmota**, give it a star, or fork it and contribute!
[![GitHub forks](https://img.shields.io/github/forks/arendst/Sonoff-Tasmota.svg?style=social&label=Fork)](https://github.com/arendst/Sonoff-Tasmota/network)
[![donate](https://img.shields.io/badge/donate-PayPal-blue.svg)](https://paypal.me/tasmota)
-See [RELEASENOTES.md](https://github.com/arendst/Sonoff-Tasmota/blob/master/RELEASENOTES.md) for release information
+See [RELEASENOTES.md](https://github.com/arendst/Sonoff-Tasmota/blob/development/RELEASENOTES.md) for release information.
+
+In addition to the [release webpage](https://github.com/arendst/Sonoff-Tasmota/releases/latest) the binaries can also be OTA downloaded from http://thehackbox.org/tasmota/release/
+
+### Development
+[![Dev Version](https://img.shields.io/badge/development%20version-6.4.1.x-blue.svg)](https://github.com/arendst/Sonoff-Tasmota)
+[![Download Dev](https://img.shields.io/badge/download-development-yellow.svg)](http://thehackbox.org/tasmota/)
+[![Build Status](https://img.shields.io/travis/arendst/Sonoff-Tasmota.svg)](https://travis-ci.org/arendst/Sonoff-Tasmota)
+
+See [RELEASENOTES.md](https://github.com/arendst/Sonoff-Tasmota/blob/development/RELEASENOTES.md) for release information and [sonoff/_changelog.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_changelog.ino) for detailed change information.
+
+The development codebase is checked hourly for changes and if new commits have been merged and compile successfuly they will be posted at http://thehackbox.org/tasmota/ (this web address can be used for OTA too). It is important to note that these are based on the current development codebase and it is not recommended to flash it to devices used in production or which are hard to reach in the event that you need to manually flash the device if OTA failed. The last compiled commit number is also posted on the same page along with the current build status (if a firmware rebuild is in progress).
### Disclaimer
:warning: **DANGER OF ELECTROCUTION** :warning:
@@ -52,7 +64,7 @@ See [Community](https://groups.google.com/d/forum/sonoffusers) for forum.
See [Chat](https://discord.gg/Ks2Kzd4) for more user experience.
The following devices are supported:
-- [iTead Sonoff Basic](https://www.itead.cc/smart-home/sonoff-wifi-wireless-switch-1.html)
+- [iTead Sonoff Basic (R2)](https://www.itead.cc/smart-home/sonoff-wifi-wireless-switch-1.html)
- [iTead Sonoff RF](https://www.itead.cc/smart-home/sonoff-rf.html)
- [iTead Sonoff SV](https://www.itead.cc/smart-home/sonoff-sv.html)
- [iTead Sonoff TH10/TH16 with temperature sensor](https://www.itead.cc/smart-home/sonoff-th.html)
@@ -83,9 +95,15 @@ The following devices are supported:
- [MagicHome PWM LED controller](https://github.com/arendst/Sonoff-Tasmota/wiki/MagicHome-LED-strip-controller)
- AriLux AL-LC01, AL-LC06 and AL-LC11 PWM LED controller
- [Supla device - Espablo-inCan mod. for electrical Installation box](https://forum.supla.org/viewtopic.php?f=33&t=2188)
-- [BlitzWolf BW-SHP2 Smart Socket with Energy Monitoring](https://www.banggood.com/BlitzWolf-BW-SHP2-Smart-WIFI-Socket-EU-Plug-220V-16A-Work-with-Amazon-Alexa-Google-Assistant-p-1292899.html)
+- [BlitzWolf BW-SHP2 Smart Socket with Energy Monitoring](https://www.banggood.com/BlitzWolf-BW-SHP2-Smart-WIFI-Socket-EU-Plug-220V-16A-Work-with-Amazon-Alexa-Google-Assistant-p-1292899.html)
- [Luani HVIO board](https://luani.de/projekte/esp8266-hvio/)
-- Wemos D1 mini, NodeMcu and Ledunia
+- [Wemos D1 mini](https://wiki.wemos.cc/products:d1:d1_mini)
+- [HuaFan Smart Socket](https://github.com/arendst/Sonoff-Tasmota/wiki/HuaFan-Smart-Socket)
+- [Hyleton-313 Smart Plug](https://github.com/arendst/Sonoff-Tasmota/wiki/Hyleton-313-Smart-Plug)
+- [Allterco Shelly 1](https://shelly.cloud/shelly1-open-source/)
+- [Allterco Shelly 2 with Energy Monitoring](https://shelly.cloud/shelly2/)
+- NodeMcu and Ledunia
+- [KS-602 based switches like GresaTek, Jesiya, NewRice, Lyasi etc](https://ucexperiment.wordpress.com/2017/11/14/reprogramming-a-lyasi-wifi-wall-switch-with-esp8285/)
### Contribute
You can contribute to Sonoff-Tasmota by
@@ -101,21 +119,27 @@ You can contribute to Sonoff-Tasmota by
Libraries used with Sonoff-Tasmota are:
- [ESP8266 core for Arduino](https://github.com/esp8266/Arduino)
- [Adafruit CCS811](https://github.com/adafruit/Adafruit_CCS811)
+- [Adafruit ILI9341](https://github.com/adafruit/Adafruit_ILI9341)
+- [Adafruit LED Backpack](https://github.com/adafruit/Adafruit-LED-Backpack-Library)
- [Adafruit SGP30](https://github.com/adafruit/Adafruit_SGP30)
+- [Adafruit SSD1306](https://github.com/adafruit/Adafruit_SSD1306)
+- [Adafruit GFX](https://github.com/adafruit/Adafruit-GFX-Library)
- [ArduinoJson](https://arduinojson.org/)
+- [arduino mqtt](https://github.com/256dpi/arduino-mqtt)
- [Bosch BME680](https://github.com/BoschSensortec/BME680_driver)
- [C2 Programmer](http://app.cear.ufpb.br/~lucas.hartmann/tag/efm8bb1/)
-- [Esp8266MqttClient](https://github.com/tuanpmt/ESP8266MQTTClient)
+- [esp-epaper-29-ws-20171230-gemu](https://github.com/gemu2015/Sonoff-Tasmota/tree/displays/lib)
- [esp-knx-ip](https://github.com/envy/esp-knx-ip)
-- [esp-mqtt-arduino](https://github.com/i-n-g-o/esp-mqtt-arduino)
-- [ESPAsyncUDP](https://github.com/me-no-dev/ESPAsyncUDP)
- [I2Cdevlib](https://github.com/jrowberg/i2cdevlib)
- [IRremoteEsp8266](https://github.com/markszabo/IRremoteESP8266)
- [JobaTsl2561](https://github.com/joba-1/Joba_Tsl2561)
+- [Liquid Cristal](https://github.com/marcoschwartz/LiquidCrystal_I2C)
- [MultiChannelGasSensor](http://wiki.seeedstudio.com/Grove-Multichannel_Gas_Sensor/)
- [NeoPixelBus](https://github.com/Makuna/NeoPixelBus)
+- [NewPing](https://bitbucket.org/teckel12/arduino-new-ping/wiki/Home)
- [OneWire](https://github.com/PaulStoffregen/OneWire)
- [PubSubClient](https://github.com/knolleary/pubsubclient)
+- [rc-switch](https://github.com/sui77/rc-switch)
#### People inspiring me
People helping to keep the show on the road:
@@ -129,16 +153,19 @@ People helping to keep the show on the road:
- Flexiti for his initial timer implementation
- reloxx13 for his [TasmoAdmin](https://github.com/reloxx13/TasmoAdmin) management tool
- Joachim Banzhaf for his TSL2561 library and driver
-- Gijs Noorlander for his MHZ19 and SenseAir drivers
+- Gijs Noorlander for his MHZ19, SenseAir and updated PubSubClient drivers
- Emontnemery for his HomeAssistant Discovery concept and many code tuning tips
- Aidan Mountford for his HSB support
- Daniel Ztolnai for his Serial Bridge implementation
-- Gerhard Mutz for his SGP30 and Sunrise/Sunset driver
+- Gerhard Mutz for his SGP30, Sunrise/Sunset and display support drivers
- Nuno Ferreira for his HC-SR04 driver
- Adrian Scillato for his (security)fixes and implementing and maintaining KNX
- Gennaro Tortone for implementing and maintaining Eastron drivers
- Raymond Mouthaan for managing Wemos Wiki information
-- Norbert Richter, Frogmore42 and Jason2866 for providing many issue answers
+- Norbert Richter for his decode-config.py tool
+- Andre Thomas for providing [thehackbox](http://thehackbox.org/tasmota/) OTA support and daily development builds
+- Joel Stein and digiblur for their Tuya research and driver
+- Frogmore42 and Jason2866 for providing many issue answers
- Many more providing Tips, Pocs or PRs
### License
diff --git a/REFERENCE.md b/REFERENCE.md
new file mode 100644
index 000000000000..22bd77899db7
--- /dev/null
+++ b/REFERENCE.md
@@ -0,0 +1,17 @@
+## Tasmota Reference
+Tasmota backgound information.
+
+## Supported Smart Switch with Energy Monitoring GPIO usage
+Module | GPIO00 | GPIO01 | GPIO02 | GPIO03 | GPIO04 | GPIO05 | GPIO12 | GPIO13 | GPIO14 | GPIO15
+-------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------
+Sonoff Pow | KEY1 | - | - | - | - | NRG_SEL | REL1 | NRG_CF1 | HLW_CF | LED1
+Sonoff Pow R2 | KEY1 | RXD | - | TXD | - | - | REL1 | LED1_INV | - | -
+Shelly 2 | - | RXD | - | TXD | REL1 | REL2 | SWT1 | - | SWT2 | -
+Huafan SS | LED1_INV | - | - | LED2_INV | KEY1 | REL1_INV | NRG_CF1 | NRG_SEL | HLW_CF | -
+KMC 70011 | KEY1 | - | - | - | HLW_CF | NRG_CF1 | NRG_SEL | LED1_INV | REL1 | -
+Teckin | - | KEY1 | - | LED2_INV | HJL_CF | NRG_CF1 | NRG_SEL_INV | LED1_INV | REL1 | -
+AplicWDP303075 | - | - | - | KEY1 | HLW_CF | NRG_CF1 | NRG_SEL_INV | LED1_INV | REL1 | -
+Gosund SP1 v23 | - | LED1_INV | - | KEY1 | HJL_CF | NRG_CF1 | NRG_SEL_INV | LED2_INV | REL1 | -
+SK03 Outdoor | KEY1 | - | - | - | HLW_CF | NRG_CF1 | NRG_SEL_INV | LED2_INV | LED1_INV | REL1
+BlitzWolf SHP | LED2_INV | - | LED1_INV | - | - | HJL_CF | NRG_SEL_INV | KEY1 | NRG_CF1 | REL1
+Teckin US | LED2_INV | - | LED1_INV | - | REL1 | HJL_CF | NRG_SEL_INV | KEY1 | NRG_CF1 | -
diff --git a/RELEASENOTES.md b/RELEASENOTES.md
index 7cacefa47c25..1198a61654c4 100644
--- a/RELEASENOTES.md
+++ b/RELEASENOTES.md
@@ -15,156 +15,247 @@ To save memory space all other binaries support **WifiManager only**.
See _changelog.ino how to enable them again.
- Define WIFI_CONFIG_TOOL now contains the default behaviour once a SSID has been configured.
- If no SSID is configured making a wifi connection impossible the new define WIFI_CONFIG_NO_SSID will be used.
-- While define WIFI_CONFIG_NO_SSID is set to WIFI_WPSCONFIG in user_config.h the compiler will check for define USE_WPS and if not enabled WIFI_CONFIG_NO_SSID will default to WIFI_MANAGER using the webserver. If define USE_WEBSERVER is also not enabled WIFI_CONFIG_NO_SSID will default to WIFI_SMARTCONFIG. If define USE_SMARTCONFIG is also not enabled WIFI_CONFIG_NO_SSID will default to a new option WIFI_SERIAL allowing to enter wifi parameters to serial which is always possible.
+- While define WIFI_CONFIG_NO_SSID is set to WIFI_WPSCONFIG in my_user_config.h the compiler will check for define USE_WPS and if not enabled WIFI_CONFIG_NO_SSID will default to WIFI_MANAGER using the webserver. If define USE_WEBSERVER is also not enabled WIFI_CONFIG_NO_SSID will default to WIFI_SMARTCONFIG. If define USE_SMARTCONFIG is also not enabled WIFI_CONFIG_NO_SSID will default to a new option WIFI_SERIAL allowing to enter wifi parameters to serial which is always possible.
+
+## Supported Modules
+The following hardware modules are supported.
+
+Module | Description
+------------------|-----------------------
+01 Sonoff Basic | Sonoff Basic Wifi Smart Switch
+02 Sonoff RF | Sonoff RF Wifi Smart Switch with RF (434MHz) receiver
+03 Sonoff SV | Sonoff SV Safe Voltage Wifi Smart Switch
+04 Sonoff TH | Sonoff TH10/TH16 Wifi Smart Switch with Sensor connection
+05 Sonoff Dual | Sonoff Dual Wifi Smart Switch
+06 Sonoff Pow | Sonoff Pow Wifi Smart Switch with Energy Monitoring
+07 Sonoff 4CH | Sonoff 4CH 4-gang Wifi Smart Switch
+08 Sonoff S2X | Sonoff S20/S26 Wifi Smart Socket
+09 Slampher | Sonoff Slampher Wifi Smart Light Bulb Socket with RF (434MHz) receiver
+10 Sonoff Touch | Sonoff Touch Wifi Light Switch
+11 Sonoff LED | Sonoff Led Wifi Led Pack (Retired)
+12 1 Channel | 1 Channel Inching/Self Locking Wifi Switch 5V/12V
+13 4 Channel | 4 Channel Inching/Self Locking Wifi Switch (Retired)
+14 Motor C/AC | Motor Clockwise/Antoclockwise Wifi Switch (Retired)
+15 ElectroDragon | Electrodragon Wifi IoT Board
+16 EXS Relay(s) | Electronic Experience Store 1 or 2-gang Wifi Module
+17 WiOn | WiOn Wifi Smart Socket
+18 Generic | Any ESP8266/ESP8285 device like WeMos and NodeMCU
+19 Sonoff Dev | Sonoff Dev Wifi Development Board
+20 H801 | H801 Wifi RGBWW Led Controller
+21 Sonoff SC | Sonoff SC Wifi Environmental Monitor
+22 Sonoff BN-SZ | Sonoff BN-SZ01 Wifi Ceiling Led (Retired)
+23 Sonoff 4CH Pro | Sonoff 4CH Pro 4-gang Wifi Smart Switch
+24 Huafan SS | HuaFan Wifi Smart Socket
+25 Sonoff Bridge | Sonoff RF (434MHz) transceive to Wifi Bridge
+26 Sonoff B1 | Sonoff B1 Wifi RGBWW Led Bulb
+27 AiLight | Ai-Thinker RGBW Led Bulb
+28 Sonoff T1 1CH | Sonoff T1 1-gang Wifi Light Switch
+29 Sonoff T1 2CH | Sonoff T1 2-gang Wifi Light Switch
+30 Sonoff T1 3CH | Sonoff T1 3-gang Wifi Light Switch
+31 Supla Espablo | 2-gang Wifi Module
+32 Witty Cloud | Witty Cloud ESP8266 Wifi Development Board
+33 Yunshan Relay | ESP8266 Wifi Network Relay Module
+34 MagicHome | MagicHome, Flux-light and some Arilux LC10 RGB(W) Led Controller
+35 Luani HVIO | Luani ESP8266 Wifi I/O Module
+36 KMC 70011 | KMC Wifi Smart Socket with Energy Monitoring
+37 Arilux LC01 | Arilux AL-LC01 RGB Led Controller
+38 Arilux LC11 | Arilux AL-LC11 RGBWW Led Controller
+39 Sonoff Dual R2 | Sonoff Dual R2 Wifi Smart Switch
+40 Arilux LC06 | Arilux AL-LC06 RGB(WW) Led Controller
+41 Sonoff S31 | Sonoff S31 Wifi Smart Socket with Energy Monitoring
+42 Zengge WF017 | Zengge WF017 Wifi RGB(W) Led Controller
+43 Sonoff Pow R2 | Sonoff Pow R2 Wifi Smart Switch with Energy Monitoring
+44 Sonoff iFan02 | Sonoff iFan02 Wifi Smart Ceiling Fan with Light
+45 BlitzWolf SHP | BlitzWolf BW-SHP2, BW-SHP6, HomeCube SP1, Gosund SP111, Teckin SP22 Wifi Smart Switch with Energy Monitoring
+46 Shelly 1 | Shelly 1 Open Source Wifi Relay Module
+47 Shelly 2 | Shelly 2 Wifi 2-gang Relay Module with Energy Monitoring
+48 Xiaomi Philips | Xiaomi Philips Wifi WW Led Bulb
+49 Neo Coolcam | Neo Coolcam Wifi Smart Socket
+50 ESP Switch | ESP Switch 4-gang Wifi Switch with Leds
+51 OBI Socket | OBI Wifi Smart Socket
+52 Teckin | Teckin SP20 Wifi Smart Switch with Energy Monitoring
+53 AplicWDP303075 | Aplic WDP 303075 CSL Wifi Smart Switch with Energy Monitoring
+54 Tuya Dimmer | MIUO (and other Tuya based) Wifi Dimmer for Incandescent Lights and Led
+55 Gosund SP1 v23 | Gosund SP1 v2.3 Wifi Smart Switch with Energy Monitoring
+56 ARMTR Dimmer | ARMtronix Wifi dimmer for Incandescent Lights and Led
+57 SK03 Outdoor | SK03 Outdoor Wifi Smart Switch with Energy Monitoring
+58 PS-16-DZ | PS-16-DZ Wifi dimmer for Incandescent Lights and Led
+59 Teckin US | Teckin US and ZooZee SA102 Wifi Smart Switch with Energy Monitoring
+60 Manzoku strip | Manzoku Wifi Smart Power Strip with four Relays
## Provided Binary Downloads
-The following binary downloads have been compiled with ESP8266/Arduino library version **2.3.0**
+The following binary downloads have been compiled with ESP8266/Arduino library core version **2.4.2** patched with the Alexa fix.
- **sonoff-minimal.bin** = The Minimal version allows intermediate OTA uploads to support larger versions and does NOT change any persistent parameter. This version **should NOT be used for initial installation**.
- **sonoff-classic.bin** = The Classic version allows **initial installation** using either WifiManager, Wps or SmartConfig.
- **sonoff.bin** = The Sonoff version without Wps and SmartConfig configuration but adds more sensors.
- **sonoff-BG.bin** to **sonoff-TW.bin** = The Sonoff version without Wps and SmartConfig configuration in different languages.
- **sonoff-sensors.bin** = The Sensors version without Wps and SmartConfig configuration but adds even more useful sensors.
+- **sonoff-display.bin** = The Display version without Wps and SmartConfig configuration but adds display support.
- **sonoff-knx.bin** = The Knx version without Wps and SmartConfig configuration and some other features but adds KNX support.
-See [Tasmota ESP/Arduino library version related issues](https://github.com/arendst/Sonoff-Tasmota/wiki/Theo's-Tasmota-Tips#20180523---relation-tasmota-and-esp8266arduino-core-version) why these files are still released using ESP/Arduino library version v2.3.0.
-
### Available Features and Sensors
-| Feature or Sensor | minimal | classic | sonoff | knx | sensors | Remarks
-|--------------------------------|---------|---------|--------|------|---------|--------
-| ESP/Arduino lib v2.3.0 | 340k | 477k | 473k | 492k | 497k |
-| ESP/Arduino lib v2.4.2 | 360k | 491k | 491k | 509k | 513k | No sleep
-| | | | | | |
-| MY_LANGUAGE en-GB | x | x | x | x | x |
-| USE_WPS | - | x | - | - | - | WPS
-| USE_SMARTCONFIG | - | x | - | - | - | SmartConfig
-| USE_ARDUINO_OTA | - | - | - | - | - |
-| MQTT_LIBRARY_TYPE PUBSUBCLIENT | x | x | x | x | x |
-| USE_DOMOTICZ | - | x | x | x | x |
-| USE_HOME_ASSISTANT | - | x | x | x | x |
-| USE_MQTT_TLS | - | - | - | - | - |
-| USE_KNX | - | - | - | x | - |
-| USE_WEBSERVER | x | x | x | x | x | WifiManager
-| USE_EMULATION | - | x | x | - | x |
-| USE_DISCOVERY | - | x | x | x | x |
-| WEBSERVER_ADVERTISE | - | x | x | x | x |
-| MQTT_HOST_DISCOVERY | - | x | x | x | x |
-| USE_TIMERS | - | - | x | x | x |
-| USE_TIMERS_WEB | - | - | x | x | x |
-| USE_SUNRISE | - | - | x | x | x |
-| USE_RULES | - | - | x | x | x |
+| Feature or Sensor | minimal | basic | classic | sonoff | knx | sensors | Remarks
+|--------------------------------|---------|-------|---------|--------|------|---------|--------
+| ESP/Arduino lib v2.3.0 | 346k | 429k | 482k | 504k | 522k | 535k |
+| ESP/Arduino lib v2.4.2 | 366k | 446k | 496k | 522k | 538k | 551k | No wifi sleep
+| | | | | | | |
+| MY_LANGUAGE en-GB | x | x | x | x | x | x |
+| MQTT_LIBRARY_TYPE PUBSUBCLIENT | x | x | x | x | x | x |
+| USE_WPS | - | - | x | - | - | - | WPS
+| USE_SMARTCONFIG | - | - | x | - | - | - | SmartConfig
+| USE_ARDUINO_OTA | - | - | - | - | - | - |
+| USE_DOMOTICZ | - | - | x | x | x | x |
+| USE_HOME_ASSISTANT | - | - | - | x | x | x |
+| USE_MQTT_TLS | - | - | - | - | - | - |
+| USE_KNX | - | - | - | - | x | - |
+| USE_WEBSERVER | x | x | x | x | x | x | WifiManager
+| USE_EMULATION | - | x | x | x | - | x |
+| USE_DISCOVERY | - | - | x | x | x | x |
+| WEBSERVER_ADVERTISE | - | - | x | x | x | x |
+| MQTT_HOST_DISCOVERY | - | - | x | x | x | x |
+| USE_TIMERS | - | x | - | x | x | x |
+| USE_TIMERS_WEB | - | x | - | x | x | x |
+| USE_SUNRISE | - | x | - | x | x | x |
+| USE_RULES | - | x | - | x | x | x |
| | | | | | |
-| USE_ADC_VCC | x | x | x | x | x |
-| USE_DS18B20 | - | - | - | - | - | Single sensor
-| USE_DS18x20 | - | x | x | x | x | Multiple sensors
-| USE_DS18x20_LEGACY | - | - | - | - | - | Multiple sensors
-| | | | | | |
-| Feature or Sensor | minimal | classic | sonoff | knx | sensors |
-| USE_I2C | - | - | x | x | x |
-| USE_SHT | - | - | x | x | x |
-| USE_HTU | - | - | x | x | x |
-| USE_BMP | - | - | x | x | x |
-| USE_BME680 | - | - | - | - | x |
-| USE_BH1750 | - | - | x | x | x |
-| USE_VEML6070 | - | - | - | - | x |
-| USE_ADS1115 | - | - | - | - | x |
-| USE_ADS1115_I2CDEV | - | - | - | - | - |
-| USE_INA219 | - | - | - | - | x |
-| USE_SHT3X | - | - | x | x | x |
-| USE_TSL2561 | - | - | - | - | x |
-| USE_MGS | - | - | - | - | x |
-| USE_SGP30 | - | - | x | x | x |
-| USE_SI1145 | - | - | - | - | x |
-| USE_LM75AD | - | - | x | x | x |
-| USE_APDS9960 | - | - | - | - | - |
-| USE_MCP230xx | - | - | - | - | - |
-| USE_MPR121 | - | - | - | - | - |
-| USE_CCS811 | - | - | - | - | - |
-| USE_MPU6050 | - | - | - | - | - |
-| | | | | | |
-| Feature or Sensor | minimal | classic | sonoff | knx | sensors |
-| USE_SPI | - | - | - | - | - |
-| USE_MHZ19 | - | - | x | x | x |
-| USE_SENSEAIR | - | - | x | x | x |
-| USE_PMS5003 | - | - | x | x | x |
-| USE_NOVA_SDS | - | - | x | x | x |
-| USE_PZEM004T | - | - | x | x | x |
-| USE_SERIAL_BRIDGE | - | - | x | x | x |
-| USE_SDM120 | - | - | - | - | x |
-| USE_SDM630 | - | - | - | - | x |
-| USE_IR_REMOTE | - | - | x | x | x |
-| USE_IR_HVAC | - | - | - | - | x |
-| USE_IR_RECEIVE | - | - | x | x | x |
-| USE_WS2812 | - | x | x | x | x |
-| USE_WS2812_DMA | - | - | - | - | - |
-| USE_ARILUX_RF | - | - | x | x | x |
-| USE_SR04 | - | - | x | x | x |
-| USE_TM1638 | - | - | - | - | - |
-| USE_RF_FLASH | - | - | x | x | x |
+| USE_ADC_VCC | x | x | x | x | x | - |
+| USE_DS18B20 | - | - | - | - | - | - | Single sensor
+| USE_DS18x20 | - | - | x | x | x | x | Multiple sensors
+| USE_DS18x20_LEGACY | - | - | - | - | - | - | Multiple sensors
+| | | | | | | |
+| Feature or Sensor | minimal | basic | classic | sonoff | knx | sensors |
+| USE_I2C | - | - | - | x | x | x |
+| USE_SHT | - | - | - | x | x | x |
+| USE_HTU | - | - | - | x | x | x |
+| USE_BMP | - | - | - | x | x | x |
+| USE_BME680 | - | - | - | - | - | x |
+| USE_BH1750 | - | - | - | x | x | x |
+| USE_VEML6070 | - | - | - | - | - | x |
+| USE_ADS1115 | - | - | - | - | - | x |
+| USE_ADS1115_I2CDEV | - | - | - | - | - | - |
+| USE_INA219 | - | - | - | - | - | x |
+| USE_SHT3X | - | - | - | x | x | x |
+| USE_TSL2561 | - | - | - | - | - | x |
+| USE_MGS | - | - | - | - | - | x |
+| USE_SGP30 | - | - | - | x | x | x |
+| USE_SI1145 | - | - | - | - | - | x |
+| USE_LM75AD | - | - | - | x | x | x |
+| USE_APDS9960 | - | - | - | - | - | - |
+| USE_MCP230xx | - | - | - | - | - | - |
+| USE_PCA9685 | - | - | - | - | - | - |
+| USE_MPR121 | - | - | - | - | - | - |
+| USE_CCS811 | - | - | - | - | - | - |
+| USE_MPU6050 | - | - | - | - | - | - |
+| USE_DS3231 | - | - | - | - | - | - |
+| USE_MGC3130 | - | - | - | - | - | - |
+| | | | | | | |
+| Feature or Sensor | minimal | basic | classic | sonoff | knx | sensors |
+| USE_SPI | - | - | - | - | - | - |
+| USE_MHZ19 | - | - | - | x | x | x |
+| USE_SENSEAIR | - | - | - | x | x | x |
+| USE_PMS5003 | - | - | - | x | x | x |
+| USE_NOVA_SDS | - | - | - | x | x | x |
+| USE_PZEM004T | - | - | - | x | x | x |
+| USE_PZEM_AC | - | - | - | x | x | x |
+| USE_PZEM_DC | - | - | - | x | x | x |
+| USE_MCP39F501 | - | x | - | x | x | x |
+| USE_SERIAL_BRIDGE | - | - | - | x | x | x |
+| USE_SDM120 | - | - | - | - | - | x |
+| USE_SDM630 | - | - | - | - | - | x |
+| USE_MP3_PLAYER | - | - | - | - | - | x |
+| USE_TUYA_DIMMER | - | x | - | x | x | x |
+| USE_ARMTRONIX_DIMMERS | - | x | - | x | x | x |
+| USE_PS_16_DZ | - | x | - | x | x | x |
+| USE_AZ7798 | - | - | - | - | - | - |
+| USE_IR_REMOTE | - | - | - | x | x | x |
+| USE_IR_HVAC | - | - | - | - | - | x |
+| USE_IR_RECEIVE | - | - | - | x | x | x |
+| USE_WS2812 | - | - | x | x | x | x |
+| USE_WS2812_DMA | - | - | - | - | - | - |
+| USE_ARILUX_RF | - | - | - | x | x | x |
+| USE_SR04 | - | - | - | x | x | x |
+| USE_TM1638 | - | - | - | - | - | x |
+| USE_HX711 | - | - | - | x | x | x |
+| USE_RF_FLASH | - | - | - | x | x | x |
+| USE_TX20_WIND_SENSOR | - | - | - | x | x | x |
+| USE_RC_SWITCH | - | - | - | x | x | x |
+| USE_RF_SENSOR | - | - | - | - | - | x | AlectoV2 only
+| USE_DISPLAY | - | - | - | - | - | - |
## Changelog
-Version 6.2.0 20180901
- * Allow user override of define MAX_RULE_VARS and MAX_RULE_TIMERS (#3561)
- * Disable wifi sleep for both Esp8266/Arduino core 2.4.1 and 2.4.2 to solve device freeze caused by Espressif SDK bug (#3554)
- * Change DS18B20 driver to provide better instant results
- * Change some sensor drivers to provide instant results
- * Change define USE_ALL_SENSORS to USE_SENSORS as it doesn't contain all sensors due to duplicate I2C addresses
- * Change some sensor update timings: AdcEvery 200 -> 250, Senseair 300 -> 250, SDM120 300 -> 250, SDM630 300 -> 250
- * Change default Wifi config option from WPS to Wifi Manager if WPS is disabled or Wifi Smartconfig if webserver is disabled or Wifi Serial input if Smartconfig is disabled
- * Change SHT1x driver to provide better instant results and fix I2C interference
- * Change DHT driver to provide better instant results and add decimals to DHT11 (#3164)
- * Change DS18x20 driver to provide better instant results (#3169)
- * Change CounterType 1 from milliseconds to microseconds (#3437)
- * Change scheduler for better sleep support using Uptime, Delay, PulseTime and TelePeriod, Blinktime (#3581)
- * Remove unused functionality from Sonoff-minimal to save space
- * Remove WPS and SmartConfig from sonoff-minimal saving 56k code space
- * Remove TSL2561 debug message and update library (#2415)
- * Remove forced restart when sleep command is executed (#3554)
- * Fix invalid response using more than 4 switches and domoticz
- * Fix sonoff-minimal not using default settings
- * Fix unsecure main webpage update
- * Fix DHT driver mixing values for different sensors (#1797)
- * Fix EnergyReset3 regression not clearing total energy (#2723)
- * Fix rules once regression from v6.1.0 (#3198, #3226)
- * Fix command Scale buffer overflow (#3236)
- * Fix possible WDT due to long MQTT publish handling (#3313)
- * Fix command TimeDst/TimeStd invalid JSON (#3322)
- * Fix handling of default names when using names starting with shortcut character ",0,1 or 2 (#3392, #3600, #3618)
- * Fix LM75AD I2C sensor detection (#3408)
- * Fix iFan02 power on state (#3412, #3530)
- * Fix some Pow R2 and S31 checksum errors using optimized re-sync (#3425)
- * Fix SDM120 reporting wrong negative values to Domoticz (#3521)
- * Fix MQTT reconnection detection when using TasmotaMqtt library (#3558)
- * Fix OtaMagic when file path contains a dash (-) (#3563)
- * Fix Sonoff Bridge data reception when using Portisch EFM8 firmware using in data buffer length (#3605)
- * Add read sensor retry to DS18B20, DS18x20, DHT, SHT1X and HTU21
- * Add user selection of Wifi Smartconfig as define USE_SMARTCONFIG in user_config.h
- * Add boot loop detection and perform some solutions
- * Add wifi and mqtt status led blinkyblinky to be disabled by SetOption31 1. Does not work when LedPower is On (deliberate) (#871, #2230, #3114, #3155)
- * Add support for TM1638 switch (#2226)
- * Add GPIO options ButtonXn, SwitchXn and CounterXn to select INPUT mode instead of INPUT_PULLUP (#2525)
- * Add support for APDS9960 proximity sensor (#3051)
- * Add support for MPR121 controller in input mode for touch buttons (#3142)
- * Add support for MCP230xx for general purpose input expansion and command Sensor29 (#3188)
- * Add default Wifi Configuration tool as define WIFI_CONFIG_NO_SSID in user_config.h if no SSID is configured (#3224)
- * Add command Timers 0/1 to globally disable or enable armed timers (#3270)
- * Add support for CCS811 sensor (#3309)
- * Add Turkish language file (#3332)
- * Add command SerialSend4 to send binary serial data (#3345)
- * Add initial support for sensor MPU6050 (#3352)
- * Add rule triggers Wifi#Connected and Wifi#Disconnected (#3359)
- * Add option + to command Rule to concatenate new rule with existing rules (#3365)
- * Add message when JavaScript is not enabled in webbrowser (#3388)
- * Add build time setting of ButtonTopic and SwitchTopic (#3414)
- * Add iFan02 Fanspeed + and Fanspeed - command options (#3415)
- * Add Individual HSBColorX commands (#3430, #3615)
- * Add output support on MCP23008/MCP23017 (#3436)
- * Add modulo option to rules like rule1 on Time#Minute|5 do backlog power on;delay 200;power off endon (#3466)
- * Add RGB support for Domoticz (#3547)
- * Add all ruletimer values to command RuleTimer result message (#3571)
- * Add command Publish2 for publishing retained MQTT messages (#3593)
- * Add commands ButtonDebounce 40..1000 and SwitchDebounce 40..1000 to have user control over debounce timing. Default is 50mS (#3594)
- * Add RuleX debug options 8,9,10 (StopOnError) to control RuleX execution status after an exception restart (#3607)
- * Add rule variables %sunrise%, %sunset%, %uptime% and %time% (#3608)
- * Add optional MQTT_TELE_RETAIN to Energy Margins message (#3612, 3614)
+Version 6.4.1 20181225
+ * Change RAM usage BMP/BME I2C sensors
+ * Change FallbackTopic from cmnd/\/ to cmnd/\_fb/ to discriminate from Topic (#1528)
+ * Change FallbackTopic detection (#4706)
+ * Change Hass discovery to short MQTT messages as used by Hass 0.81 and up (#4711)
+ * Change MQTT GUI password handling (#4723)
+ * Fix possible dtostrf buffer overflows by increasing buffers
+ * Fix wifi strongest signal detection (#4704)
+ * Fix Alexa "this value is outside the range of the device". Needs power cycle and Alexa deletion/discovery cycle. (#3159, #4712)
+ * Add Slovak language file (#4663)
+ * Add support for AZ-Instrument 7798 CO2 meter/datalogger (#4672)
+ * Add define WIFI_SOFT_AP_CHANNEL in my_user_config.h to set Soft Access Point Channel number between 1 and 13 as used by Wifi Manager web GUI (#4673)
+ * Add define USE_MQTT_TLS_CA_CERT for checking MQTT TLS against root ca using Let's Encrypt cert from sonoff_letsencrypt.h - not supported with core 2.3.0 (#4703)
+
+Version 6.4.0 20181217
+ * Change GUI Configure Module by using AJAX for data fetch to cut page size (and memory use) by 40%.
+ In case of web page errors clear your browser cache or do Page Reload (F5 or Ctrl+R)
+ * Change enforcing flashmode dout but it is still mandatory
+ * Change bootcount update (being first) flash write to 10 seconds after restart
+ * Change display and epaper drivers
+ * Change command WebSend Host header field from IP address to hostname (#4331)
+ * Change log buffer size from 512 to 520 to accommodate http sensor data (#4354)
+ * Change default WIFI_CONFIG_TOOL from WIFI_WAIT to WIFI_RETRY in my_user_config.h (#4400)
+ * Change webgui refresh time delay for Save Settings and local OTA Upload (#4423)
+ * Change SR-04 driver to use NewPing library (#4488)
+ * Change MCP230xx driver to support interrupt retention over teleperiod (#4547)
+ * Change support for MPU6050 using DMP (#4581)
+ * Fix unintended function overload of WifiState
+ * Fix wifi connection errors using wifi disconnect and ESP.reset instead of ESP.restart
+ * Fix Sonoff Pow R2 and Sonoff S31 Serial interface hang caused by Sonoff Basic R2 driver delay implementation (and possibly core bug)
+ * Fix MQTT connection error after restart
+ * Fix wifi re-scan connection baseline
+ * Fix possible strncat buffer overflows
+ * Fix intermittent Pzem sensor energy overflow calculation error
+ * Fix shelly2 ghost switching caused by lack of pull-up inputs (#4255)
+ * Fix hardware serial pin configuration. To keep using hardware serial swap current Rx/Tx pin configuration only (#4280)
+ * Fix MqttRetry values above 255 seconds (#4424)
+ * Fix WifiManager functionality on initial installation (#4433)
+ * Fix ArduinoOTA for Core 2.5.0 (#4620)
+ * Add minutes to commands Timezone to allow all possible world timezones
+ * Add more strict checks for GPIO selections
+ * Add code image and optional commit number to version
+ * Add dynamic delay to main loop providing time for wifi background tasks
+ * Add additional start-up delay during initial wifi connection
+ * Add support for decoding Theo V2 sensors as documented on https://sidweb.nl using 434MHz RF sensor receiver
+ * Add support for decoding Alecto V2 sensors like ACH2010, WS3000 and DKW2012 weather stations using 868MHz RF sensor receiver
+ * Add user definition of defines WIFI_RSSI_THRESHOLD (default 10) and WIFI_RESCAN_MINUTES (default 44)
+ * Add command SetOption58 0/1 to enable IR raw data info in JSON message (#2116)
+ * Add command IRSend \|0,\,\,.. to allow raw data transmission (#2116)
+ * Add command SetOption56 0/1 to enable wifi network scan and select highest RSSI (#3173)
+ * Add command SetOption57 0/1 to enable wifi network re-scan every 44 minutes with a rssi threshold of 10 to select highest RSSI (#3173)
+ * Add support for SDM220 (#3610)
+ * Add default sleep 1 to sonoff-basic to lower energy consumption (#4217)
+ * Add wifi status to Tuya (#4221)
+ * Add delays to reduce CPU usage at boot time (#4233)
+ * Add command SetOption24 0/1 to select pressure unit as hPa or mmHg (#4241)
+ * Add optional hardware serial when GPIO13(Rx) and GPIO15(Tx) are selected removing hardware serial from GPIO01(Tx) and GPIO03(Rx) (#4288)
+ * Add support for Gosund SP1 v2.3 Power Socket with Energy Monitoring (#4297)
+ * Add support for Armtronix dimmers. See wiki for info (#4321)
+ * Add to command WebSend option to send a direct path when command starts with a slash (#4329)
+ * Add support for LG HVac and IrRemote (#4377)
+ * Add initial support for Hass sensor discovery (#4380)
+ * Add support for Fujitsu HVac and IrRemote (#4387)
+ * Add support for I2C MGC3130 Electric Field Effect sensor by Christian Baars (#3774, #4404)
+ * Add command CalcRes to set number of decimals (0 - 7) used in commands ADD, SUB, MULT and SCALE (#4420)
+ * Add CPU average load to state message (#4431)
+ * Add command SetOption59 0/1 to change state topic from tele/STATE to stat/RESULT (#4450)
+ * Add support for SM Smart Wifi Dimmer PS-16-DZ (#4465)
+ * Add support for Teckin US Power Socket with Energy Monitoring (#4481)
+ * Add command SetOption60 0/1 to select dynamic sleep (0) or sleep (1) (#4497)
+ * Add support for iFan02 Fanspeed in Domoticz using a selector (#4517)
+ * Add support for GPIO02 for newer Sonoff Basic (#4518)
+ * Add Announce Switches to MQTT Discovery (#4531)
+ * Add support for Manzoku Power Strip (#4590)
diff --git a/arduino/version 2.4.0/boards.txt b/arduino/version 2.4.0/boards.txt
deleted file mode 100644
index 1f6d47cc69e4..000000000000
--- a/arduino/version 2.4.0/boards.txt
+++ /dev/null
@@ -1,3341 +0,0 @@
-#
-# this file is script-generated and is likely to be overwritten by ./tools/boards.txt.py
-#
-
-menu.BoardModel=Model
-menu.UploadSpeed=Upload Speed
-menu.UploadTool=Upload Using
-menu.CpuFrequency=CPU Frequency
-menu.CrystalFreq=Crystal Frequency
-menu.FlashSize=Flash Size
-menu.FlashMode=Flash Mode
-menu.FlashFreq=Flash Frequency
-menu.ResetMethod=Reset Method
-menu.ESPModule=Module
-menu.Debug=Debug port
-menu.DebugLevel=Debug Level
-menu.LwIPVariant=lwIP Variant
-menu.led=Builtin Led
-
-##############################################################
-generic.name=Generic ESP8266 Module
-generic.build.board=ESP8266_GENERIC
-generic.upload.tool=esptool
-generic.upload.maximum_data_size=81920
-generic.upload.wait_for_upload_port=true
-generic.serial.disableDTR=true
-generic.serial.disableRTS=true
-generic.build.mcu=esp8266
-generic.build.core=esp8266
-generic.build.variant=generic
-generic.build.spiffs_pagesize=256
-generic.build.debug_port=
-generic.build.debug_level=
-
-generic.menu.UploadTool.esptool=Serial
-generic.menu.UploadTool.esptool.upload.tool=esptool
-generic.menu.UploadTool.esptool.upload.verbose=-vv
-generic.menu.UploadTool.espupload=OTA_upload
-generic.menu.UploadTool.espupload.upload.tool=espupload
-
-generic.menu.CpuFrequency.80=80 MHz
-generic.menu.CpuFrequency.80.build.f_cpu=80000000L
-generic.menu.CpuFrequency.160=160 MHz
-generic.menu.CpuFrequency.160.build.f_cpu=160000000L
-generic.menu.ResetMethod.ck=ck
-generic.menu.ResetMethod.ck.upload.resetmethod=ck
-generic.menu.ResetMethod.nodemcu=nodemcu
-generic.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-generic.menu.CrystalFreq.26=26 MHz
-generic.menu.CrystalFreq.40=40 MHz
-generic.menu.CrystalFreq.40.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
-generic.menu.FlashFreq.40=40MHz
-generic.menu.FlashFreq.40.build.flash_freq=40
-generic.menu.FlashFreq.80=80MHz
-generic.menu.FlashFreq.80.build.flash_freq=80
-generic.menu.FlashMode.qio=QIO
-generic.menu.FlashMode.qio.build.flash_mode=qio
-generic.menu.FlashMode.qout=QOUT
-generic.menu.FlashMode.qout.build.flash_mode=qout
-generic.menu.FlashMode.dio=DIO
-generic.menu.FlashMode.dio.build.flash_mode=dio
-generic.menu.FlashMode.dout=DOUT
-generic.menu.FlashMode.dout.build.flash_mode=dout
-generic.menu.FlashSize.512K0=512K (no SPIFFS)
-generic.menu.FlashSize.512K0.build.flash_size=512K
-generic.menu.FlashSize.512K0.build.flash_ld=eagle.flash.512k0.ld
-generic.menu.FlashSize.512K0.build.spiffs_pagesize=256
-generic.menu.FlashSize.512K0.upload.maximum_size=499696
-generic.menu.FlashSize.512K64=512K (64K SPIFFS)
-generic.menu.FlashSize.512K64.build.flash_size=512K
-generic.menu.FlashSize.512K64.build.flash_ld=eagle.flash.512k64.ld
-generic.menu.FlashSize.512K64.build.spiffs_pagesize=256
-generic.menu.FlashSize.512K64.upload.maximum_size=434160
-generic.menu.FlashSize.512K64.build.spiffs_start=0x6B000
-generic.menu.FlashSize.512K64.build.spiffs_end=0x7B000
-generic.menu.FlashSize.512K64.build.spiffs_blocksize=4096
-generic.menu.FlashSize.512K128=512K (128K SPIFFS)
-generic.menu.FlashSize.512K128.build.flash_size=512K
-generic.menu.FlashSize.512K128.build.flash_ld=eagle.flash.512k128.ld
-generic.menu.FlashSize.512K128.build.spiffs_pagesize=256
-generic.menu.FlashSize.512K128.upload.maximum_size=368624
-generic.menu.FlashSize.512K128.build.spiffs_start=0x5B000
-generic.menu.FlashSize.512K128.build.spiffs_end=0x7B000
-generic.menu.FlashSize.512K128.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M0=1M (no SPIFFS)
-generic.menu.FlashSize.1M0.build.flash_size=1M
-generic.menu.FlashSize.1M0.build.flash_ld=eagle.flash.1m0.ld
-generic.menu.FlashSize.1M0.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M0.upload.maximum_size=1023984
-generic.menu.FlashSize.1M64=1M (64K SPIFFS)
-generic.menu.FlashSize.1M64.build.flash_size=1M
-generic.menu.FlashSize.1M64.build.flash_ld=eagle.flash.1m64.ld
-generic.menu.FlashSize.1M64.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M64.upload.maximum_size=958448
-generic.menu.FlashSize.1M64.build.spiffs_start=0xEB000
-generic.menu.FlashSize.1M64.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M64.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M128=1M (128K SPIFFS)
-generic.menu.FlashSize.1M128.build.flash_size=1M
-generic.menu.FlashSize.1M128.build.flash_ld=eagle.flash.1m128.ld
-generic.menu.FlashSize.1M128.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M128.upload.maximum_size=892912
-generic.menu.FlashSize.1M128.build.spiffs_start=0xDB000
-generic.menu.FlashSize.1M128.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M128.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M144=1M (144K SPIFFS)
-generic.menu.FlashSize.1M144.build.flash_size=1M
-generic.menu.FlashSize.1M144.build.flash_ld=eagle.flash.1m144.ld
-generic.menu.FlashSize.1M144.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M144.upload.maximum_size=876528
-generic.menu.FlashSize.1M144.build.spiffs_start=0xD7000
-generic.menu.FlashSize.1M144.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M144.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M160=1M (160K SPIFFS)
-generic.menu.FlashSize.1M160.build.flash_size=1M
-generic.menu.FlashSize.1M160.build.flash_ld=eagle.flash.1m160.ld
-generic.menu.FlashSize.1M160.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M160.upload.maximum_size=860144
-generic.menu.FlashSize.1M160.build.spiffs_start=0xD3000
-generic.menu.FlashSize.1M160.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M160.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M192=1M (192K SPIFFS)
-generic.menu.FlashSize.1M192.build.flash_size=1M
-generic.menu.FlashSize.1M192.build.flash_ld=eagle.flash.1m192.ld
-generic.menu.FlashSize.1M192.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M192.upload.maximum_size=827376
-generic.menu.FlashSize.1M192.build.spiffs_start=0xCB000
-generic.menu.FlashSize.1M192.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M192.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M256=1M (256K SPIFFS)
-generic.menu.FlashSize.1M256.build.flash_size=1M
-generic.menu.FlashSize.1M256.build.flash_ld=eagle.flash.1m256.ld
-generic.menu.FlashSize.1M256.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M256.upload.maximum_size=761840
-generic.menu.FlashSize.1M256.build.spiffs_start=0xBB000
-generic.menu.FlashSize.1M256.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M256.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M512=1M (512K SPIFFS)
-generic.menu.FlashSize.1M512.build.flash_size=1M
-generic.menu.FlashSize.1M512.build.flash_ld=eagle.flash.1m512.ld
-generic.menu.FlashSize.1M512.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M512.upload.maximum_size=499696
-generic.menu.FlashSize.1M512.build.spiffs_start=0x7B000
-generic.menu.FlashSize.1M512.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M512.build.spiffs_blocksize=8192
-generic.menu.FlashSize.2M=2M (1M SPIFFS)
-generic.menu.FlashSize.2M.build.flash_size=2M
-generic.menu.FlashSize.2M.build.flash_ld=eagle.flash.2m.ld
-generic.menu.FlashSize.2M.build.spiffs_pagesize=256
-generic.menu.FlashSize.2M.upload.maximum_size=1044464
-generic.menu.FlashSize.2M.build.spiffs_start=0x100000
-generic.menu.FlashSize.2M.build.spiffs_end=0x1FB000
-generic.menu.FlashSize.2M.build.spiffs_blocksize=8192
-generic.menu.FlashSize.4M1M=4M (1M SPIFFS)
-generic.menu.FlashSize.4M1M.build.flash_size=4M
-generic.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-generic.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-generic.menu.FlashSize.4M1M.upload.maximum_size=1044464
-generic.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-generic.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-generic.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-generic.menu.FlashSize.4M3M=4M (3M SPIFFS)
-generic.menu.FlashSize.4M3M.build.flash_size=4M
-generic.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-generic.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-generic.menu.FlashSize.4M3M.upload.maximum_size=1044464
-generic.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-generic.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-generic.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-generic.menu.FlashSize.8M7M=8M (7M SPIFFS)
-generic.menu.FlashSize.8M7M.build.flash_size=8M
-generic.menu.FlashSize.8M7M.build.flash_ld=eagle.flash.8m.ld
-generic.menu.FlashSize.8M7M.build.spiffs_pagesize=256
-generic.menu.FlashSize.8M7M.upload.maximum_size=1044464
-generic.menu.FlashSize.8M7M.build.spiffs_start=0x100000
-generic.menu.FlashSize.8M7M.build.spiffs_end=0x7FB000
-generic.menu.FlashSize.8M7M.build.spiffs_blocksize=8192
-generic.menu.FlashSize.16M15M=16M (15M SPIFFS)
-generic.menu.FlashSize.16M15M.build.flash_size=16M
-generic.menu.FlashSize.16M15M.build.flash_ld=eagle.flash.16m.ld
-generic.menu.FlashSize.16M15M.build.spiffs_pagesize=256
-generic.menu.FlashSize.16M15M.upload.maximum_size=1044464
-generic.menu.FlashSize.16M15M.build.spiffs_start=0x100000
-generic.menu.FlashSize.16M15M.build.spiffs_end=0xFFB000
-generic.menu.FlashSize.16M15M.build.spiffs_blocksize=8192
-generic.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-generic.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-generic.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-generic.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-generic.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-generic.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-generic.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-generic.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-generic.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-generic.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-generic.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-generic.menu.LwIPVariant.OpenSource=v1.4 Open Source
-generic.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-generic.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-generic.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-generic.menu.Debug.Disabled=Disabled
-generic.menu.Debug.Disabled.build.debug_port=
-generic.menu.Debug.Serial=Serial
-generic.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-generic.menu.Debug.Serial1=Serial1
-generic.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-generic.menu.DebugLevel.None____=None
-generic.menu.DebugLevel.None____.build.debug_level=
-generic.menu.DebugLevel.SSL=SSL
-generic.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-generic.menu.DebugLevel.TLS_MEM=TLS_MEM
-generic.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-generic.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-generic.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-generic.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-generic.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-generic.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-generic.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-generic.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-generic.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-generic.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-generic.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-generic.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-generic.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-generic.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-generic.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-generic.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.CORE=CORE
-generic.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-generic.menu.DebugLevel.WIFI=WIFI
-generic.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-generic.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-generic.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-generic.menu.DebugLevel.UPDATER=UPDATER
-generic.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-generic.menu.DebugLevel.OTA=OTA
-generic.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-generic.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-generic.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-generic.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-generic.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-generic.menu.UploadSpeed.115200=115200
-generic.menu.UploadSpeed.115200.upload.speed=115200
-generic.menu.UploadSpeed.9600=9600
-generic.menu.UploadSpeed.9600.upload.speed=9600
-generic.menu.UploadSpeed.57600=57600
-generic.menu.UploadSpeed.57600.upload.speed=57600
-generic.menu.UploadSpeed.230400.linux=230400
-generic.menu.UploadSpeed.230400.macosx=230400
-generic.menu.UploadSpeed.230400.upload.speed=230400
-generic.menu.UploadSpeed.256000.windows=256000
-generic.menu.UploadSpeed.256000.upload.speed=256000
-generic.menu.UploadSpeed.460800.linux=460800
-generic.menu.UploadSpeed.460800.macosx=460800
-generic.menu.UploadSpeed.460800.upload.speed=460800
-generic.menu.UploadSpeed.512000.windows=512000
-generic.menu.UploadSpeed.512000.upload.speed=512000
-generic.menu.UploadSpeed.921600=921600
-generic.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-esp8285.name=Generic ESP8285 Module
-esp8285.build.board=ESP8266_ESP01
-esp8285.upload.tool=esptool
-esp8285.upload.maximum_data_size=81920
-esp8285.upload.wait_for_upload_port=true
-esp8285.serial.disableDTR=true
-esp8285.serial.disableRTS=true
-esp8285.build.mcu=esp8266
-esp8285.build.core=esp8266
-esp8285.build.variant=generic
-esp8285.build.spiffs_pagesize=256
-esp8285.build.debug_port=
-esp8285.build.debug_level=
-esp8285.menu.CpuFrequency.80=80 MHz
-esp8285.menu.CpuFrequency.80.build.f_cpu=80000000L
-esp8285.menu.CpuFrequency.160=160 MHz
-esp8285.menu.CpuFrequency.160.build.f_cpu=160000000L
-esp8285.menu.ResetMethod.ck=ck
-esp8285.menu.ResetMethod.ck.upload.resetmethod=ck
-esp8285.menu.ResetMethod.nodemcu=nodemcu
-esp8285.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-esp8285.menu.CrystalFreq.26=26 MHz
-esp8285.menu.CrystalFreq.40=40 MHz
-esp8285.menu.CrystalFreq.40.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
-esp8285.build.flash_mode=dout
-esp8285.build.flash_freq=40
-esp8285.menu.FlashSize.1M0=1M (no SPIFFS)
-esp8285.menu.FlashSize.1M0.build.flash_size=1M
-esp8285.menu.FlashSize.1M0.build.flash_ld=eagle.flash.1m0.ld
-esp8285.menu.FlashSize.1M0.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M0.upload.maximum_size=1023984
-esp8285.menu.FlashSize.1M64=1M (64K SPIFFS)
-esp8285.menu.FlashSize.1M64.build.flash_size=1M
-esp8285.menu.FlashSize.1M64.build.flash_ld=eagle.flash.1m64.ld
-esp8285.menu.FlashSize.1M64.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M64.upload.maximum_size=958448
-esp8285.menu.FlashSize.1M64.build.spiffs_start=0xEB000
-esp8285.menu.FlashSize.1M64.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M64.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M128=1M (128K SPIFFS)
-esp8285.menu.FlashSize.1M128.build.flash_size=1M
-esp8285.menu.FlashSize.1M128.build.flash_ld=eagle.flash.1m128.ld
-esp8285.menu.FlashSize.1M128.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M128.upload.maximum_size=892912
-esp8285.menu.FlashSize.1M128.build.spiffs_start=0xDB000
-esp8285.menu.FlashSize.1M128.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M128.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M144=1M (144K SPIFFS)
-esp8285.menu.FlashSize.1M144.build.flash_size=1M
-esp8285.menu.FlashSize.1M144.build.flash_ld=eagle.flash.1m144.ld
-esp8285.menu.FlashSize.1M144.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M144.upload.maximum_size=876528
-esp8285.menu.FlashSize.1M144.build.spiffs_start=0xD7000
-esp8285.menu.FlashSize.1M144.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M144.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M160=1M (160K SPIFFS)
-esp8285.menu.FlashSize.1M160.build.flash_size=1M
-esp8285.menu.FlashSize.1M160.build.flash_ld=eagle.flash.1m160.ld
-esp8285.menu.FlashSize.1M160.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M160.upload.maximum_size=860144
-esp8285.menu.FlashSize.1M160.build.spiffs_start=0xD3000
-esp8285.menu.FlashSize.1M160.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M160.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M192=1M (192K SPIFFS)
-esp8285.menu.FlashSize.1M192.build.flash_size=1M
-esp8285.menu.FlashSize.1M192.build.flash_ld=eagle.flash.1m192.ld
-esp8285.menu.FlashSize.1M192.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M192.upload.maximum_size=827376
-esp8285.menu.FlashSize.1M192.build.spiffs_start=0xCB000
-esp8285.menu.FlashSize.1M192.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M192.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M256=1M (256K SPIFFS)
-esp8285.menu.FlashSize.1M256.build.flash_size=1M
-esp8285.menu.FlashSize.1M256.build.flash_ld=eagle.flash.1m256.ld
-esp8285.menu.FlashSize.1M256.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M256.upload.maximum_size=761840
-esp8285.menu.FlashSize.1M256.build.spiffs_start=0xBB000
-esp8285.menu.FlashSize.1M256.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M256.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M512=1M (512K SPIFFS)
-esp8285.menu.FlashSize.1M512.build.flash_size=1M
-esp8285.menu.FlashSize.1M512.build.flash_ld=eagle.flash.1m512.ld
-esp8285.menu.FlashSize.1M512.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M512.upload.maximum_size=499696
-esp8285.menu.FlashSize.1M512.build.spiffs_start=0x7B000
-esp8285.menu.FlashSize.1M512.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M512.build.spiffs_blocksize=8192
-esp8285.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-esp8285.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-esp8285.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-esp8285.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-esp8285.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-esp8285.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-esp8285.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-esp8285.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-esp8285.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-esp8285.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-esp8285.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-esp8285.menu.LwIPVariant.OpenSource=v1.4 Open Source
-esp8285.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-esp8285.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-esp8285.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-esp8285.menu.Debug.Disabled=Disabled
-esp8285.menu.Debug.Disabled.build.debug_port=
-esp8285.menu.Debug.Serial=Serial
-esp8285.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-esp8285.menu.Debug.Serial1=Serial1
-esp8285.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-esp8285.menu.DebugLevel.None____=None
-esp8285.menu.DebugLevel.None____.build.debug_level=
-esp8285.menu.DebugLevel.SSL=SSL
-esp8285.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-esp8285.menu.DebugLevel.TLS_MEM=TLS_MEM
-esp8285.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-esp8285.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-esp8285.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-esp8285.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-esp8285.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-esp8285.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-esp8285.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-esp8285.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-esp8285.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-esp8285.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-esp8285.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-esp8285.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-esp8285.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-esp8285.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-esp8285.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-esp8285.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.CORE=CORE
-esp8285.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-esp8285.menu.DebugLevel.WIFI=WIFI
-esp8285.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-esp8285.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-esp8285.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-esp8285.menu.DebugLevel.UPDATER=UPDATER
-esp8285.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-esp8285.menu.DebugLevel.OTA=OTA
-esp8285.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-esp8285.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-esp8285.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-esp8285.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-esp8285.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-esp8285.menu.UploadSpeed.115200=115200
-esp8285.menu.UploadSpeed.115200.upload.speed=115200
-esp8285.menu.UploadSpeed.9600=9600
-esp8285.menu.UploadSpeed.9600.upload.speed=9600
-esp8285.menu.UploadSpeed.57600=57600
-esp8285.menu.UploadSpeed.57600.upload.speed=57600
-esp8285.menu.UploadSpeed.230400.linux=230400
-esp8285.menu.UploadSpeed.230400.macosx=230400
-esp8285.menu.UploadSpeed.230400.upload.speed=230400
-esp8285.menu.UploadSpeed.256000.windows=256000
-esp8285.menu.UploadSpeed.256000.upload.speed=256000
-esp8285.menu.UploadSpeed.460800.linux=460800
-esp8285.menu.UploadSpeed.460800.macosx=460800
-esp8285.menu.UploadSpeed.460800.upload.speed=460800
-esp8285.menu.UploadSpeed.512000.windows=512000
-esp8285.menu.UploadSpeed.512000.upload.speed=512000
-esp8285.menu.UploadSpeed.921600=921600
-esp8285.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-espduino.name=ESPDuino (ESP-13 Module)
-espduino.build.board=ESP8266_ESP13
-espduino.build.variant=ESPDuino
-espduino.menu.ResetMethod.v2=ESPduino-V2
-espduino.menu.ResetMethod.v2.upload.resetmethod=nodemcu
-espduino.menu.ResetMethod.v1=ESPduino-V1
-espduino.menu.ResetMethod.v1.upload.resetmethod=ck
-espduino.menu.UploadTool.esptool=Serial
-espduino.menu.UploadTool.esptool.upload.tool=esptool
-espduino.menu.UploadTool.esptool.upload.verbose=-vv
-espduino.menu.UploadTool.espota=OTA
-espduino.menu.UploadTool.espota.upload.tool=espota
-espduino.upload.tool=esptool
-espduino.upload.maximum_data_size=81920
-espduino.upload.wait_for_upload_port=true
-espduino.serial.disableDTR=true
-espduino.serial.disableRTS=true
-espduino.build.mcu=esp8266
-espduino.build.core=esp8266
-espduino.build.spiffs_pagesize=256
-espduino.build.debug_port=
-espduino.build.debug_level=
-espduino.menu.CpuFrequency.80=80 MHz
-espduino.menu.CpuFrequency.80.build.f_cpu=80000000L
-espduino.menu.CpuFrequency.160=160 MHz
-espduino.menu.CpuFrequency.160.build.f_cpu=160000000L
-espduino.build.flash_mode=dio
-espduino.build.flash_freq=40
-espduino.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espduino.menu.FlashSize.4M1M.build.flash_size=4M
-espduino.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espduino.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espduino.menu.FlashSize.4M1M.upload.maximum_size=1044464
-espduino.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espduino.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espduino.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espduino.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espduino.menu.FlashSize.4M3M.build.flash_size=4M
-espduino.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espduino.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-espduino.menu.FlashSize.4M3M.upload.maximum_size=1044464
-espduino.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espduino.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espduino.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espduino.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-espduino.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-espduino.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-espduino.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-espduino.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-espduino.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-espduino.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-espduino.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-espduino.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-espduino.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-espduino.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-espduino.menu.LwIPVariant.OpenSource=v1.4 Open Source
-espduino.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-espduino.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-espduino.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-espduino.menu.Debug.Disabled=Disabled
-espduino.menu.Debug.Disabled.build.debug_port=
-espduino.menu.Debug.Serial=Serial
-espduino.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-espduino.menu.Debug.Serial1=Serial1
-espduino.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-espduino.menu.DebugLevel.None____=None
-espduino.menu.DebugLevel.None____.build.debug_level=
-espduino.menu.DebugLevel.SSL=SSL
-espduino.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-espduino.menu.DebugLevel.TLS_MEM=TLS_MEM
-espduino.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-espduino.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-espduino.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-espduino.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-espduino.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-espduino.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-espduino.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-espduino.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-espduino.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-espduino.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-espduino.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espduino.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-espduino.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-espduino.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-espduino.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espduino.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.CORE=CORE
-espduino.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-espduino.menu.DebugLevel.WIFI=WIFI
-espduino.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-espduino.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-espduino.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-espduino.menu.DebugLevel.UPDATER=UPDATER
-espduino.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-espduino.menu.DebugLevel.OTA=OTA
-espduino.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-espduino.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-espduino.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-espduino.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-espduino.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-espduino.menu.UploadSpeed.115200=115200
-espduino.menu.UploadSpeed.115200.upload.speed=115200
-espduino.menu.UploadSpeed.9600=9600
-espduino.menu.UploadSpeed.9600.upload.speed=9600
-espduino.menu.UploadSpeed.57600=57600
-espduino.menu.UploadSpeed.57600.upload.speed=57600
-espduino.menu.UploadSpeed.230400.linux=230400
-espduino.menu.UploadSpeed.230400.macosx=230400
-espduino.menu.UploadSpeed.230400.upload.speed=230400
-espduino.menu.UploadSpeed.256000.windows=256000
-espduino.menu.UploadSpeed.256000.upload.speed=256000
-espduino.menu.UploadSpeed.460800.linux=460800
-espduino.menu.UploadSpeed.460800.macosx=460800
-espduino.menu.UploadSpeed.460800.upload.speed=460800
-espduino.menu.UploadSpeed.512000.windows=512000
-espduino.menu.UploadSpeed.512000.upload.speed=512000
-espduino.menu.UploadSpeed.921600=921600
-espduino.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-huzzah.name=Adafruit HUZZAH ESP8266
-huzzah.build.board=ESP8266_ESP12
-huzzah.build.variant=adafruit
-huzzah.upload.tool=esptool
-huzzah.upload.maximum_data_size=81920
-huzzah.upload.wait_for_upload_port=true
-huzzah.serial.disableDTR=true
-huzzah.serial.disableRTS=true
-huzzah.build.mcu=esp8266
-huzzah.build.core=esp8266
-huzzah.build.spiffs_pagesize=256
-huzzah.build.debug_port=
-huzzah.build.debug_level=
-huzzah.menu.CpuFrequency.80=80 MHz
-huzzah.menu.CpuFrequency.80.build.f_cpu=80000000L
-huzzah.menu.CpuFrequency.160=160 MHz
-huzzah.menu.CpuFrequency.160.build.f_cpu=160000000L
-huzzah.upload.resetmethod=nodemcu
-huzzah.build.flash_mode=qio
-huzzah.build.flash_freq=40
-huzzah.menu.FlashSize.4M1M=4M (1M SPIFFS)
-huzzah.menu.FlashSize.4M1M.build.flash_size=4M
-huzzah.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-huzzah.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-huzzah.menu.FlashSize.4M1M.upload.maximum_size=1044464
-huzzah.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-huzzah.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-huzzah.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-huzzah.menu.FlashSize.4M3M=4M (3M SPIFFS)
-huzzah.menu.FlashSize.4M3M.build.flash_size=4M
-huzzah.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-huzzah.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-huzzah.menu.FlashSize.4M3M.upload.maximum_size=1044464
-huzzah.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-huzzah.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-huzzah.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-huzzah.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-huzzah.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-huzzah.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-huzzah.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-huzzah.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-huzzah.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-huzzah.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-huzzah.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-huzzah.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-huzzah.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-huzzah.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-huzzah.menu.LwIPVariant.OpenSource=v1.4 Open Source
-huzzah.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-huzzah.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-huzzah.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-huzzah.menu.Debug.Disabled=Disabled
-huzzah.menu.Debug.Disabled.build.debug_port=
-huzzah.menu.Debug.Serial=Serial
-huzzah.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-huzzah.menu.Debug.Serial1=Serial1
-huzzah.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-huzzah.menu.DebugLevel.None____=None
-huzzah.menu.DebugLevel.None____.build.debug_level=
-huzzah.menu.DebugLevel.SSL=SSL
-huzzah.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-huzzah.menu.DebugLevel.TLS_MEM=TLS_MEM
-huzzah.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-huzzah.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-huzzah.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-huzzah.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-huzzah.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-huzzah.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-huzzah.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-huzzah.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-huzzah.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-huzzah.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-huzzah.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-huzzah.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-huzzah.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-huzzah.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-huzzah.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-huzzah.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.CORE=CORE
-huzzah.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-huzzah.menu.DebugLevel.WIFI=WIFI
-huzzah.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-huzzah.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-huzzah.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-huzzah.menu.DebugLevel.UPDATER=UPDATER
-huzzah.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-huzzah.menu.DebugLevel.OTA=OTA
-huzzah.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-huzzah.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-huzzah.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-huzzah.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-huzzah.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-huzzah.menu.UploadSpeed.115200=115200
-huzzah.menu.UploadSpeed.115200.upload.speed=115200
-huzzah.menu.UploadSpeed.9600=9600
-huzzah.menu.UploadSpeed.9600.upload.speed=9600
-huzzah.menu.UploadSpeed.57600=57600
-huzzah.menu.UploadSpeed.57600.upload.speed=57600
-huzzah.menu.UploadSpeed.230400.linux=230400
-huzzah.menu.UploadSpeed.230400.macosx=230400
-huzzah.menu.UploadSpeed.230400.upload.speed=230400
-huzzah.menu.UploadSpeed.256000.windows=256000
-huzzah.menu.UploadSpeed.256000.upload.speed=256000
-huzzah.menu.UploadSpeed.460800.linux=460800
-huzzah.menu.UploadSpeed.460800.macosx=460800
-huzzah.menu.UploadSpeed.460800.upload.speed=460800
-huzzah.menu.UploadSpeed.512000.windows=512000
-huzzah.menu.UploadSpeed.512000.upload.speed=512000
-huzzah.menu.UploadSpeed.921600=921600
-huzzah.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-espresso_lite_v1.name=ESPresso Lite 1.0
-espresso_lite_v1.build.board=ESP8266_ESPRESSO_LITE_V1
-espresso_lite_v1.build.variant=espresso_lite_v1
-espresso_lite_v1.upload.tool=esptool
-espresso_lite_v1.upload.maximum_data_size=81920
-espresso_lite_v1.upload.wait_for_upload_port=true
-espresso_lite_v1.serial.disableDTR=true
-espresso_lite_v1.serial.disableRTS=true
-espresso_lite_v1.build.mcu=esp8266
-espresso_lite_v1.build.core=esp8266
-espresso_lite_v1.build.spiffs_pagesize=256
-espresso_lite_v1.build.debug_port=
-espresso_lite_v1.build.debug_level=
-espresso_lite_v1.menu.CpuFrequency.80=80 MHz
-espresso_lite_v1.menu.CpuFrequency.80.build.f_cpu=80000000L
-espresso_lite_v1.menu.CpuFrequency.160=160 MHz
-espresso_lite_v1.menu.CpuFrequency.160.build.f_cpu=160000000L
-espresso_lite_v1.build.flash_mode=dio
-espresso_lite_v1.build.flash_freq=40
-espresso_lite_v1.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espresso_lite_v1.menu.FlashSize.4M1M.build.flash_size=4M
-espresso_lite_v1.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espresso_lite_v1.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espresso_lite_v1.menu.FlashSize.4M1M.upload.maximum_size=1044464
-espresso_lite_v1.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espresso_lite_v1.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espresso_lite_v1.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espresso_lite_v1.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espresso_lite_v1.menu.FlashSize.4M3M.build.flash_size=4M
-espresso_lite_v1.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espresso_lite_v1.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-espresso_lite_v1.menu.FlashSize.4M3M.upload.maximum_size=1044464
-espresso_lite_v1.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espresso_lite_v1.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espresso_lite_v1.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espresso_lite_v1.menu.ResetMethod.ck=ck
-espresso_lite_v1.menu.ResetMethod.ck.upload.resetmethod=ck
-espresso_lite_v1.menu.ResetMethod.nodemcu=nodemcu
-espresso_lite_v1.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-espresso_lite_v1.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-espresso_lite_v1.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-espresso_lite_v1.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-espresso_lite_v1.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-espresso_lite_v1.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-espresso_lite_v1.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-espresso_lite_v1.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-espresso_lite_v1.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-espresso_lite_v1.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-espresso_lite_v1.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-espresso_lite_v1.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-espresso_lite_v1.menu.LwIPVariant.OpenSource=v1.4 Open Source
-espresso_lite_v1.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-espresso_lite_v1.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-espresso_lite_v1.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-espresso_lite_v1.menu.Debug.Disabled=Disabled
-espresso_lite_v1.menu.Debug.Disabled.build.debug_port=
-espresso_lite_v1.menu.Debug.Serial=Serial
-espresso_lite_v1.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-espresso_lite_v1.menu.Debug.Serial1=Serial1
-espresso_lite_v1.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-espresso_lite_v1.menu.DebugLevel.None____=None
-espresso_lite_v1.menu.DebugLevel.None____.build.debug_level=
-espresso_lite_v1.menu.DebugLevel.SSL=SSL
-espresso_lite_v1.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-espresso_lite_v1.menu.DebugLevel.TLS_MEM=TLS_MEM
-espresso_lite_v1.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-espresso_lite_v1.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-espresso_lite_v1.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.CORE=CORE
-espresso_lite_v1.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-espresso_lite_v1.menu.DebugLevel.WIFI=WIFI
-espresso_lite_v1.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-espresso_lite_v1.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-espresso_lite_v1.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-espresso_lite_v1.menu.DebugLevel.UPDATER=UPDATER
-espresso_lite_v1.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-espresso_lite_v1.menu.DebugLevel.OTA=OTA
-espresso_lite_v1.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-espresso_lite_v1.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-espresso_lite_v1.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-espresso_lite_v1.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-espresso_lite_v1.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-espresso_lite_v1.menu.UploadSpeed.115200=115200
-espresso_lite_v1.menu.UploadSpeed.115200.upload.speed=115200
-espresso_lite_v1.menu.UploadSpeed.9600=9600
-espresso_lite_v1.menu.UploadSpeed.9600.upload.speed=9600
-espresso_lite_v1.menu.UploadSpeed.57600=57600
-espresso_lite_v1.menu.UploadSpeed.57600.upload.speed=57600
-espresso_lite_v1.menu.UploadSpeed.230400.linux=230400
-espresso_lite_v1.menu.UploadSpeed.230400.macosx=230400
-espresso_lite_v1.menu.UploadSpeed.230400.upload.speed=230400
-espresso_lite_v1.menu.UploadSpeed.256000.windows=256000
-espresso_lite_v1.menu.UploadSpeed.256000.upload.speed=256000
-espresso_lite_v1.menu.UploadSpeed.460800.linux=460800
-espresso_lite_v1.menu.UploadSpeed.460800.macosx=460800
-espresso_lite_v1.menu.UploadSpeed.460800.upload.speed=460800
-espresso_lite_v1.menu.UploadSpeed.512000.windows=512000
-espresso_lite_v1.menu.UploadSpeed.512000.upload.speed=512000
-espresso_lite_v1.menu.UploadSpeed.921600=921600
-espresso_lite_v1.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-espresso_lite_v2.name=ESPresso Lite 2.0
-espresso_lite_v2.build.board=ESP8266_ESPRESSO_LITE_V2
-espresso_lite_v2.build.variant=espresso_lite_v2
-espresso_lite_v2.upload.tool=esptool
-espresso_lite_v2.upload.maximum_data_size=81920
-espresso_lite_v2.upload.wait_for_upload_port=true
-espresso_lite_v2.serial.disableDTR=true
-espresso_lite_v2.serial.disableRTS=true
-espresso_lite_v2.build.mcu=esp8266
-espresso_lite_v2.build.core=esp8266
-espresso_lite_v2.build.spiffs_pagesize=256
-espresso_lite_v2.build.debug_port=
-espresso_lite_v2.build.debug_level=
-espresso_lite_v2.menu.CpuFrequency.80=80 MHz
-espresso_lite_v2.menu.CpuFrequency.80.build.f_cpu=80000000L
-espresso_lite_v2.menu.CpuFrequency.160=160 MHz
-espresso_lite_v2.menu.CpuFrequency.160.build.f_cpu=160000000L
-espresso_lite_v2.build.flash_mode=dio
-espresso_lite_v2.build.flash_freq=40
-espresso_lite_v2.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espresso_lite_v2.menu.FlashSize.4M1M.build.flash_size=4M
-espresso_lite_v2.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espresso_lite_v2.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espresso_lite_v2.menu.FlashSize.4M1M.upload.maximum_size=1044464
-espresso_lite_v2.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espresso_lite_v2.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espresso_lite_v2.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espresso_lite_v2.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espresso_lite_v2.menu.FlashSize.4M3M.build.flash_size=4M
-espresso_lite_v2.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espresso_lite_v2.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-espresso_lite_v2.menu.FlashSize.4M3M.upload.maximum_size=1044464
-espresso_lite_v2.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espresso_lite_v2.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espresso_lite_v2.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espresso_lite_v2.menu.ResetMethod.ck=ck
-espresso_lite_v2.menu.ResetMethod.ck.upload.resetmethod=ck
-espresso_lite_v2.menu.ResetMethod.nodemcu=nodemcu
-espresso_lite_v2.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-espresso_lite_v2.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-espresso_lite_v2.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-espresso_lite_v2.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-espresso_lite_v2.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-espresso_lite_v2.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-espresso_lite_v2.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-espresso_lite_v2.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-espresso_lite_v2.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-espresso_lite_v2.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-espresso_lite_v2.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-espresso_lite_v2.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-espresso_lite_v2.menu.LwIPVariant.OpenSource=v1.4 Open Source
-espresso_lite_v2.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-espresso_lite_v2.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-espresso_lite_v2.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-espresso_lite_v2.menu.Debug.Disabled=Disabled
-espresso_lite_v2.menu.Debug.Disabled.build.debug_port=
-espresso_lite_v2.menu.Debug.Serial=Serial
-espresso_lite_v2.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-espresso_lite_v2.menu.Debug.Serial1=Serial1
-espresso_lite_v2.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-espresso_lite_v2.menu.DebugLevel.None____=None
-espresso_lite_v2.menu.DebugLevel.None____.build.debug_level=
-espresso_lite_v2.menu.DebugLevel.SSL=SSL
-espresso_lite_v2.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-espresso_lite_v2.menu.DebugLevel.TLS_MEM=TLS_MEM
-espresso_lite_v2.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-espresso_lite_v2.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-espresso_lite_v2.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.CORE=CORE
-espresso_lite_v2.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-espresso_lite_v2.menu.DebugLevel.WIFI=WIFI
-espresso_lite_v2.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-espresso_lite_v2.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-espresso_lite_v2.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-espresso_lite_v2.menu.DebugLevel.UPDATER=UPDATER
-espresso_lite_v2.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-espresso_lite_v2.menu.DebugLevel.OTA=OTA
-espresso_lite_v2.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-espresso_lite_v2.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-espresso_lite_v2.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-espresso_lite_v2.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-espresso_lite_v2.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-espresso_lite_v2.menu.UploadSpeed.115200=115200
-espresso_lite_v2.menu.UploadSpeed.115200.upload.speed=115200
-espresso_lite_v2.menu.UploadSpeed.9600=9600
-espresso_lite_v2.menu.UploadSpeed.9600.upload.speed=9600
-espresso_lite_v2.menu.UploadSpeed.57600=57600
-espresso_lite_v2.menu.UploadSpeed.57600.upload.speed=57600
-espresso_lite_v2.menu.UploadSpeed.230400.linux=230400
-espresso_lite_v2.menu.UploadSpeed.230400.macosx=230400
-espresso_lite_v2.menu.UploadSpeed.230400.upload.speed=230400
-espresso_lite_v2.menu.UploadSpeed.256000.windows=256000
-espresso_lite_v2.menu.UploadSpeed.256000.upload.speed=256000
-espresso_lite_v2.menu.UploadSpeed.460800.linux=460800
-espresso_lite_v2.menu.UploadSpeed.460800.macosx=460800
-espresso_lite_v2.menu.UploadSpeed.460800.upload.speed=460800
-espresso_lite_v2.menu.UploadSpeed.512000.windows=512000
-espresso_lite_v2.menu.UploadSpeed.512000.upload.speed=512000
-espresso_lite_v2.menu.UploadSpeed.921600=921600
-espresso_lite_v2.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-phoenix_v1.name=Phoenix 1.0
-phoenix_v1.build.board=ESP8266_PHOENIX_V1
-phoenix_v1.build.variant=phoenix_v1
-phoenix_v1.upload.tool=esptool
-phoenix_v1.upload.maximum_data_size=81920
-phoenix_v1.upload.wait_for_upload_port=true
-phoenix_v1.serial.disableDTR=true
-phoenix_v1.serial.disableRTS=true
-phoenix_v1.build.mcu=esp8266
-phoenix_v1.build.core=esp8266
-phoenix_v1.build.spiffs_pagesize=256
-phoenix_v1.build.debug_port=
-phoenix_v1.build.debug_level=
-phoenix_v1.menu.CpuFrequency.80=80 MHz
-phoenix_v1.menu.CpuFrequency.80.build.f_cpu=80000000L
-phoenix_v1.menu.CpuFrequency.160=160 MHz
-phoenix_v1.menu.CpuFrequency.160.build.f_cpu=160000000L
-phoenix_v1.build.flash_mode=dio
-phoenix_v1.build.flash_freq=40
-phoenix_v1.menu.FlashSize.4M1M=4M (1M SPIFFS)
-phoenix_v1.menu.FlashSize.4M1M.build.flash_size=4M
-phoenix_v1.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-phoenix_v1.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-phoenix_v1.menu.FlashSize.4M1M.upload.maximum_size=1044464
-phoenix_v1.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-phoenix_v1.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-phoenix_v1.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-phoenix_v1.menu.FlashSize.4M3M=4M (3M SPIFFS)
-phoenix_v1.menu.FlashSize.4M3M.build.flash_size=4M
-phoenix_v1.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-phoenix_v1.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-phoenix_v1.menu.FlashSize.4M3M.upload.maximum_size=1044464
-phoenix_v1.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-phoenix_v1.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-phoenix_v1.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-phoenix_v1.menu.ResetMethod.ck=ck
-phoenix_v1.menu.ResetMethod.ck.upload.resetmethod=ck
-phoenix_v1.menu.ResetMethod.nodemcu=nodemcu
-phoenix_v1.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-phoenix_v1.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-phoenix_v1.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-phoenix_v1.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-phoenix_v1.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-phoenix_v1.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-phoenix_v1.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-phoenix_v1.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-phoenix_v1.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-phoenix_v1.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-phoenix_v1.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-phoenix_v1.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-phoenix_v1.menu.LwIPVariant.OpenSource=v1.4 Open Source
-phoenix_v1.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-phoenix_v1.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-phoenix_v1.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-phoenix_v1.menu.Debug.Disabled=Disabled
-phoenix_v1.menu.Debug.Disabled.build.debug_port=
-phoenix_v1.menu.Debug.Serial=Serial
-phoenix_v1.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-phoenix_v1.menu.Debug.Serial1=Serial1
-phoenix_v1.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-phoenix_v1.menu.DebugLevel.None____=None
-phoenix_v1.menu.DebugLevel.None____.build.debug_level=
-phoenix_v1.menu.DebugLevel.SSL=SSL
-phoenix_v1.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-phoenix_v1.menu.DebugLevel.TLS_MEM=TLS_MEM
-phoenix_v1.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-phoenix_v1.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-phoenix_v1.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-phoenix_v1.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-phoenix_v1.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.CORE=CORE
-phoenix_v1.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-phoenix_v1.menu.DebugLevel.WIFI=WIFI
-phoenix_v1.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-phoenix_v1.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-phoenix_v1.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-phoenix_v1.menu.DebugLevel.UPDATER=UPDATER
-phoenix_v1.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-phoenix_v1.menu.DebugLevel.OTA=OTA
-phoenix_v1.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-phoenix_v1.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-phoenix_v1.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-phoenix_v1.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-phoenix_v1.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-phoenix_v1.menu.UploadSpeed.115200=115200
-phoenix_v1.menu.UploadSpeed.115200.upload.speed=115200
-phoenix_v1.menu.UploadSpeed.9600=9600
-phoenix_v1.menu.UploadSpeed.9600.upload.speed=9600
-phoenix_v1.menu.UploadSpeed.57600=57600
-phoenix_v1.menu.UploadSpeed.57600.upload.speed=57600
-phoenix_v1.menu.UploadSpeed.230400.linux=230400
-phoenix_v1.menu.UploadSpeed.230400.macosx=230400
-phoenix_v1.menu.UploadSpeed.230400.upload.speed=230400
-phoenix_v1.menu.UploadSpeed.256000.windows=256000
-phoenix_v1.menu.UploadSpeed.256000.upload.speed=256000
-phoenix_v1.menu.UploadSpeed.460800.linux=460800
-phoenix_v1.menu.UploadSpeed.460800.macosx=460800
-phoenix_v1.menu.UploadSpeed.460800.upload.speed=460800
-phoenix_v1.menu.UploadSpeed.512000.windows=512000
-phoenix_v1.menu.UploadSpeed.512000.upload.speed=512000
-phoenix_v1.menu.UploadSpeed.921600=921600
-phoenix_v1.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-phoenix_v2.name=Phoenix 2.0
-phoenix_v2.build.board=ESP8266_PHOENIX_V2
-phoenix_v2.build.variant=phoenix_v2
-phoenix_v2.upload.tool=esptool
-phoenix_v2.upload.maximum_data_size=81920
-phoenix_v2.upload.wait_for_upload_port=true
-phoenix_v2.serial.disableDTR=true
-phoenix_v2.serial.disableRTS=true
-phoenix_v2.build.mcu=esp8266
-phoenix_v2.build.core=esp8266
-phoenix_v2.build.spiffs_pagesize=256
-phoenix_v2.build.debug_port=
-phoenix_v2.build.debug_level=
-phoenix_v2.menu.CpuFrequency.80=80 MHz
-phoenix_v2.menu.CpuFrequency.80.build.f_cpu=80000000L
-phoenix_v2.menu.CpuFrequency.160=160 MHz
-phoenix_v2.menu.CpuFrequency.160.build.f_cpu=160000000L
-phoenix_v2.build.flash_mode=dio
-phoenix_v2.build.flash_freq=40
-phoenix_v2.menu.FlashSize.4M1M=4M (1M SPIFFS)
-phoenix_v2.menu.FlashSize.4M1M.build.flash_size=4M
-phoenix_v2.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-phoenix_v2.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-phoenix_v2.menu.FlashSize.4M1M.upload.maximum_size=1044464
-phoenix_v2.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-phoenix_v2.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-phoenix_v2.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-phoenix_v2.menu.FlashSize.4M3M=4M (3M SPIFFS)
-phoenix_v2.menu.FlashSize.4M3M.build.flash_size=4M
-phoenix_v2.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-phoenix_v2.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-phoenix_v2.menu.FlashSize.4M3M.upload.maximum_size=1044464
-phoenix_v2.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-phoenix_v2.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-phoenix_v2.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-phoenix_v2.menu.ResetMethod.ck=ck
-phoenix_v2.menu.ResetMethod.ck.upload.resetmethod=ck
-phoenix_v2.menu.ResetMethod.nodemcu=nodemcu
-phoenix_v2.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-phoenix_v2.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-phoenix_v2.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-phoenix_v2.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-phoenix_v2.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-phoenix_v2.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-phoenix_v2.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-phoenix_v2.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-phoenix_v2.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-phoenix_v2.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-phoenix_v2.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-phoenix_v2.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-phoenix_v2.menu.LwIPVariant.OpenSource=v1.4 Open Source
-phoenix_v2.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-phoenix_v2.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-phoenix_v2.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-phoenix_v2.menu.Debug.Disabled=Disabled
-phoenix_v2.menu.Debug.Disabled.build.debug_port=
-phoenix_v2.menu.Debug.Serial=Serial
-phoenix_v2.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-phoenix_v2.menu.Debug.Serial1=Serial1
-phoenix_v2.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-phoenix_v2.menu.DebugLevel.None____=None
-phoenix_v2.menu.DebugLevel.None____.build.debug_level=
-phoenix_v2.menu.DebugLevel.SSL=SSL
-phoenix_v2.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-phoenix_v2.menu.DebugLevel.TLS_MEM=TLS_MEM
-phoenix_v2.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-phoenix_v2.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-phoenix_v2.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-phoenix_v2.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-phoenix_v2.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.CORE=CORE
-phoenix_v2.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-phoenix_v2.menu.DebugLevel.WIFI=WIFI
-phoenix_v2.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-phoenix_v2.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-phoenix_v2.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-phoenix_v2.menu.DebugLevel.UPDATER=UPDATER
-phoenix_v2.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-phoenix_v2.menu.DebugLevel.OTA=OTA
-phoenix_v2.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-phoenix_v2.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-phoenix_v2.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-phoenix_v2.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-phoenix_v2.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-phoenix_v2.menu.UploadSpeed.115200=115200
-phoenix_v2.menu.UploadSpeed.115200.upload.speed=115200
-phoenix_v2.menu.UploadSpeed.9600=9600
-phoenix_v2.menu.UploadSpeed.9600.upload.speed=9600
-phoenix_v2.menu.UploadSpeed.57600=57600
-phoenix_v2.menu.UploadSpeed.57600.upload.speed=57600
-phoenix_v2.menu.UploadSpeed.230400.linux=230400
-phoenix_v2.menu.UploadSpeed.230400.macosx=230400
-phoenix_v2.menu.UploadSpeed.230400.upload.speed=230400
-phoenix_v2.menu.UploadSpeed.256000.windows=256000
-phoenix_v2.menu.UploadSpeed.256000.upload.speed=256000
-phoenix_v2.menu.UploadSpeed.460800.linux=460800
-phoenix_v2.menu.UploadSpeed.460800.macosx=460800
-phoenix_v2.menu.UploadSpeed.460800.upload.speed=460800
-phoenix_v2.menu.UploadSpeed.512000.windows=512000
-phoenix_v2.menu.UploadSpeed.512000.upload.speed=512000
-phoenix_v2.menu.UploadSpeed.921600=921600
-phoenix_v2.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-nodemcu.name=NodeMCU 0.9 (ESP-12 Module)
-nodemcu.build.board=ESP8266_NODEMCU
-nodemcu.build.variant=nodemcu
-nodemcu.upload.tool=esptool
-nodemcu.upload.maximum_data_size=81920
-nodemcu.upload.wait_for_upload_port=true
-nodemcu.serial.disableDTR=true
-nodemcu.serial.disableRTS=true
-nodemcu.build.mcu=esp8266
-nodemcu.build.core=esp8266
-nodemcu.build.spiffs_pagesize=256
-nodemcu.build.debug_port=
-nodemcu.build.debug_level=
-nodemcu.menu.CpuFrequency.80=80 MHz
-nodemcu.menu.CpuFrequency.80.build.f_cpu=80000000L
-nodemcu.menu.CpuFrequency.160=160 MHz
-nodemcu.menu.CpuFrequency.160.build.f_cpu=160000000L
-nodemcu.upload.resetmethod=nodemcu
-nodemcu.build.flash_mode=qio
-nodemcu.build.flash_freq=40
-nodemcu.menu.FlashSize.4M1M=4M (1M SPIFFS)
-nodemcu.menu.FlashSize.4M1M.build.flash_size=4M
-nodemcu.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-nodemcu.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-nodemcu.menu.FlashSize.4M1M.upload.maximum_size=1044464
-nodemcu.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-nodemcu.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-nodemcu.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-nodemcu.menu.FlashSize.4M3M=4M (3M SPIFFS)
-nodemcu.menu.FlashSize.4M3M.build.flash_size=4M
-nodemcu.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-nodemcu.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-nodemcu.menu.FlashSize.4M3M.upload.maximum_size=1044464
-nodemcu.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-nodemcu.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-nodemcu.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-nodemcu.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-nodemcu.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-nodemcu.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-nodemcu.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-nodemcu.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-nodemcu.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-nodemcu.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-nodemcu.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-nodemcu.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-nodemcu.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-nodemcu.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-nodemcu.menu.LwIPVariant.OpenSource=v1.4 Open Source
-nodemcu.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-nodemcu.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-nodemcu.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-nodemcu.menu.Debug.Disabled=Disabled
-nodemcu.menu.Debug.Disabled.build.debug_port=
-nodemcu.menu.Debug.Serial=Serial
-nodemcu.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-nodemcu.menu.Debug.Serial1=Serial1
-nodemcu.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-nodemcu.menu.DebugLevel.None____=None
-nodemcu.menu.DebugLevel.None____.build.debug_level=
-nodemcu.menu.DebugLevel.SSL=SSL
-nodemcu.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-nodemcu.menu.DebugLevel.TLS_MEM=TLS_MEM
-nodemcu.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-nodemcu.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-nodemcu.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-nodemcu.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-nodemcu.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-nodemcu.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-nodemcu.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-nodemcu.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-nodemcu.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-nodemcu.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-nodemcu.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-nodemcu.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-nodemcu.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-nodemcu.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.CORE=CORE
-nodemcu.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-nodemcu.menu.DebugLevel.WIFI=WIFI
-nodemcu.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-nodemcu.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-nodemcu.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-nodemcu.menu.DebugLevel.UPDATER=UPDATER
-nodemcu.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-nodemcu.menu.DebugLevel.OTA=OTA
-nodemcu.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-nodemcu.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-nodemcu.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-nodemcu.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-nodemcu.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-nodemcu.menu.UploadSpeed.115200=115200
-nodemcu.menu.UploadSpeed.115200.upload.speed=115200
-nodemcu.menu.UploadSpeed.9600=9600
-nodemcu.menu.UploadSpeed.9600.upload.speed=9600
-nodemcu.menu.UploadSpeed.57600=57600
-nodemcu.menu.UploadSpeed.57600.upload.speed=57600
-nodemcu.menu.UploadSpeed.230400.linux=230400
-nodemcu.menu.UploadSpeed.230400.macosx=230400
-nodemcu.menu.UploadSpeed.230400.upload.speed=230400
-nodemcu.menu.UploadSpeed.256000.windows=256000
-nodemcu.menu.UploadSpeed.256000.upload.speed=256000
-nodemcu.menu.UploadSpeed.460800.linux=460800
-nodemcu.menu.UploadSpeed.460800.macosx=460800
-nodemcu.menu.UploadSpeed.460800.upload.speed=460800
-nodemcu.menu.UploadSpeed.512000.windows=512000
-nodemcu.menu.UploadSpeed.512000.upload.speed=512000
-nodemcu.menu.UploadSpeed.921600=921600
-nodemcu.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-nodemcuv2.name=NodeMCU 1.0 (ESP-12E Module)
-nodemcuv2.build.board=ESP8266_NODEMCU
-nodemcuv2.build.variant=nodemcu
-nodemcuv2.upload.tool=esptool
-nodemcuv2.upload.maximum_data_size=81920
-nodemcuv2.upload.wait_for_upload_port=true
-nodemcuv2.serial.disableDTR=true
-nodemcuv2.serial.disableRTS=true
-nodemcuv2.build.mcu=esp8266
-nodemcuv2.build.core=esp8266
-nodemcuv2.build.spiffs_pagesize=256
-nodemcuv2.build.debug_port=
-nodemcuv2.build.debug_level=
-nodemcuv2.menu.CpuFrequency.80=80 MHz
-nodemcuv2.menu.CpuFrequency.80.build.f_cpu=80000000L
-nodemcuv2.menu.CpuFrequency.160=160 MHz
-nodemcuv2.menu.CpuFrequency.160.build.f_cpu=160000000L
-nodemcuv2.upload.resetmethod=nodemcu
-nodemcuv2.build.flash_mode=dio
-nodemcuv2.build.flash_freq=40
-nodemcuv2.menu.FlashSize.4M1M=4M (1M SPIFFS)
-nodemcuv2.menu.FlashSize.4M1M.build.flash_size=4M
-nodemcuv2.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-nodemcuv2.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-nodemcuv2.menu.FlashSize.4M1M.upload.maximum_size=1044464
-nodemcuv2.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-nodemcuv2.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-nodemcuv2.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-nodemcuv2.menu.FlashSize.4M3M=4M (3M SPIFFS)
-nodemcuv2.menu.FlashSize.4M3M.build.flash_size=4M
-nodemcuv2.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-nodemcuv2.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-nodemcuv2.menu.FlashSize.4M3M.upload.maximum_size=1044464
-nodemcuv2.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-nodemcuv2.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-nodemcuv2.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-nodemcuv2.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-nodemcuv2.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-nodemcuv2.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-nodemcuv2.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-nodemcuv2.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-nodemcuv2.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-nodemcuv2.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-nodemcuv2.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-nodemcuv2.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-nodemcuv2.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-nodemcuv2.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-nodemcuv2.menu.LwIPVariant.OpenSource=v1.4 Open Source
-nodemcuv2.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-nodemcuv2.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-nodemcuv2.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-nodemcuv2.menu.Debug.Disabled=Disabled
-nodemcuv2.menu.Debug.Disabled.build.debug_port=
-nodemcuv2.menu.Debug.Serial=Serial
-nodemcuv2.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-nodemcuv2.menu.Debug.Serial1=Serial1
-nodemcuv2.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-nodemcuv2.menu.DebugLevel.None____=None
-nodemcuv2.menu.DebugLevel.None____.build.debug_level=
-nodemcuv2.menu.DebugLevel.SSL=SSL
-nodemcuv2.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-nodemcuv2.menu.DebugLevel.TLS_MEM=TLS_MEM
-nodemcuv2.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-nodemcuv2.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-nodemcuv2.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-nodemcuv2.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-nodemcuv2.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.CORE=CORE
-nodemcuv2.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-nodemcuv2.menu.DebugLevel.WIFI=WIFI
-nodemcuv2.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-nodemcuv2.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-nodemcuv2.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-nodemcuv2.menu.DebugLevel.UPDATER=UPDATER
-nodemcuv2.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-nodemcuv2.menu.DebugLevel.OTA=OTA
-nodemcuv2.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-nodemcuv2.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-nodemcuv2.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-nodemcuv2.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-nodemcuv2.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-nodemcuv2.menu.UploadSpeed.115200=115200
-nodemcuv2.menu.UploadSpeed.115200.upload.speed=115200
-nodemcuv2.menu.UploadSpeed.9600=9600
-nodemcuv2.menu.UploadSpeed.9600.upload.speed=9600
-nodemcuv2.menu.UploadSpeed.57600=57600
-nodemcuv2.menu.UploadSpeed.57600.upload.speed=57600
-nodemcuv2.menu.UploadSpeed.230400.linux=230400
-nodemcuv2.menu.UploadSpeed.230400.macosx=230400
-nodemcuv2.menu.UploadSpeed.230400.upload.speed=230400
-nodemcuv2.menu.UploadSpeed.256000.windows=256000
-nodemcuv2.menu.UploadSpeed.256000.upload.speed=256000
-nodemcuv2.menu.UploadSpeed.460800.linux=460800
-nodemcuv2.menu.UploadSpeed.460800.macosx=460800
-nodemcuv2.menu.UploadSpeed.460800.upload.speed=460800
-nodemcuv2.menu.UploadSpeed.512000.windows=512000
-nodemcuv2.menu.UploadSpeed.512000.upload.speed=512000
-nodemcuv2.menu.UploadSpeed.921600=921600
-nodemcuv2.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-modwifi.name=Olimex MOD-WIFI-ESP8266(-DEV)
-modwifi.build.board=MOD_WIFI_ESP8266
-modwifi.upload.tool=esptool
-modwifi.upload.maximum_data_size=81920
-modwifi.upload.wait_for_upload_port=true
-modwifi.serial.disableDTR=true
-modwifi.serial.disableRTS=true
-modwifi.build.mcu=esp8266
-modwifi.build.core=esp8266
-modwifi.build.variant=generic
-modwifi.build.spiffs_pagesize=256
-modwifi.build.debug_port=
-modwifi.build.debug_level=
-modwifi.menu.CpuFrequency.80=80 MHz
-modwifi.menu.CpuFrequency.80.build.f_cpu=80000000L
-modwifi.menu.CpuFrequency.160=160 MHz
-modwifi.menu.CpuFrequency.160.build.f_cpu=160000000L
-modwifi.upload.resetmethod=ck
-modwifi.build.flash_mode=qio
-modwifi.build.flash_freq=40
-modwifi.menu.FlashSize.2M=2M (1M SPIFFS)
-modwifi.menu.FlashSize.2M.build.flash_size=2M
-modwifi.menu.FlashSize.2M.build.flash_ld=eagle.flash.2m.ld
-modwifi.menu.FlashSize.2M.build.spiffs_pagesize=256
-modwifi.menu.FlashSize.2M.upload.maximum_size=1044464
-modwifi.menu.FlashSize.2M.build.spiffs_start=0x100000
-modwifi.menu.FlashSize.2M.build.spiffs_end=0x1FB000
-modwifi.menu.FlashSize.2M.build.spiffs_blocksize=8192
-modwifi.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-modwifi.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-modwifi.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-modwifi.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-modwifi.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-modwifi.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-modwifi.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-modwifi.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-modwifi.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-modwifi.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-modwifi.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-modwifi.menu.LwIPVariant.OpenSource=v1.4 Open Source
-modwifi.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-modwifi.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-modwifi.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-modwifi.menu.Debug.Disabled=Disabled
-modwifi.menu.Debug.Disabled.build.debug_port=
-modwifi.menu.Debug.Serial=Serial
-modwifi.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-modwifi.menu.Debug.Serial1=Serial1
-modwifi.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-modwifi.menu.DebugLevel.None____=None
-modwifi.menu.DebugLevel.None____.build.debug_level=
-modwifi.menu.DebugLevel.SSL=SSL
-modwifi.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-modwifi.menu.DebugLevel.TLS_MEM=TLS_MEM
-modwifi.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-modwifi.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-modwifi.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-modwifi.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-modwifi.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-modwifi.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-modwifi.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-modwifi.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-modwifi.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-modwifi.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-modwifi.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-modwifi.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-modwifi.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-modwifi.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-modwifi.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-modwifi.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.CORE=CORE
-modwifi.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-modwifi.menu.DebugLevel.WIFI=WIFI
-modwifi.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-modwifi.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-modwifi.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-modwifi.menu.DebugLevel.UPDATER=UPDATER
-modwifi.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-modwifi.menu.DebugLevel.OTA=OTA
-modwifi.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-modwifi.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-modwifi.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-modwifi.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-modwifi.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-modwifi.menu.UploadSpeed.115200=115200
-modwifi.menu.UploadSpeed.115200.upload.speed=115200
-modwifi.menu.UploadSpeed.9600=9600
-modwifi.menu.UploadSpeed.9600.upload.speed=9600
-modwifi.menu.UploadSpeed.57600=57600
-modwifi.menu.UploadSpeed.57600.upload.speed=57600
-modwifi.menu.UploadSpeed.230400.linux=230400
-modwifi.menu.UploadSpeed.230400.macosx=230400
-modwifi.menu.UploadSpeed.230400.upload.speed=230400
-modwifi.menu.UploadSpeed.256000.windows=256000
-modwifi.menu.UploadSpeed.256000.upload.speed=256000
-modwifi.menu.UploadSpeed.460800.linux=460800
-modwifi.menu.UploadSpeed.460800.macosx=460800
-modwifi.menu.UploadSpeed.460800.upload.speed=460800
-modwifi.menu.UploadSpeed.512000.windows=512000
-modwifi.menu.UploadSpeed.512000.upload.speed=512000
-modwifi.menu.UploadSpeed.921600=921600
-modwifi.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-thing.name=SparkFun ESP8266 Thing
-thing.build.board=ESP8266_THING
-thing.build.variant=thing
-thing.upload.tool=esptool
-thing.upload.maximum_data_size=81920
-thing.upload.wait_for_upload_port=true
-thing.serial.disableDTR=true
-thing.serial.disableRTS=true
-thing.build.mcu=esp8266
-thing.build.core=esp8266
-thing.build.spiffs_pagesize=256
-thing.build.debug_port=
-thing.build.debug_level=
-thing.menu.CpuFrequency.80=80 MHz
-thing.menu.CpuFrequency.80.build.f_cpu=80000000L
-thing.menu.CpuFrequency.160=160 MHz
-thing.menu.CpuFrequency.160.build.f_cpu=160000000L
-thing.upload.resetmethod=ck
-thing.build.flash_mode=qio
-thing.build.flash_freq=40
-thing.menu.FlashSize.512K0=512K (no SPIFFS)
-thing.menu.FlashSize.512K0.build.flash_size=512K
-thing.menu.FlashSize.512K0.build.flash_ld=eagle.flash.512k0.ld
-thing.menu.FlashSize.512K0.build.spiffs_pagesize=256
-thing.menu.FlashSize.512K0.upload.maximum_size=499696
-thing.menu.FlashSize.512K64=512K (64K SPIFFS)
-thing.menu.FlashSize.512K64.build.flash_size=512K
-thing.menu.FlashSize.512K64.build.flash_ld=eagle.flash.512k64.ld
-thing.menu.FlashSize.512K64.build.spiffs_pagesize=256
-thing.menu.FlashSize.512K64.upload.maximum_size=434160
-thing.menu.FlashSize.512K64.build.spiffs_start=0x6B000
-thing.menu.FlashSize.512K64.build.spiffs_end=0x7B000
-thing.menu.FlashSize.512K64.build.spiffs_blocksize=4096
-thing.menu.FlashSize.512K128=512K (128K SPIFFS)
-thing.menu.FlashSize.512K128.build.flash_size=512K
-thing.menu.FlashSize.512K128.build.flash_ld=eagle.flash.512k128.ld
-thing.menu.FlashSize.512K128.build.spiffs_pagesize=256
-thing.menu.FlashSize.512K128.upload.maximum_size=368624
-thing.menu.FlashSize.512K128.build.spiffs_start=0x5B000
-thing.menu.FlashSize.512K128.build.spiffs_end=0x7B000
-thing.menu.FlashSize.512K128.build.spiffs_blocksize=4096
-thing.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-thing.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-thing.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-thing.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-thing.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-thing.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-thing.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-thing.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-thing.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-thing.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-thing.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-thing.menu.LwIPVariant.OpenSource=v1.4 Open Source
-thing.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-thing.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-thing.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-thing.menu.Debug.Disabled=Disabled
-thing.menu.Debug.Disabled.build.debug_port=
-thing.menu.Debug.Serial=Serial
-thing.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-thing.menu.Debug.Serial1=Serial1
-thing.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-thing.menu.DebugLevel.None____=None
-thing.menu.DebugLevel.None____.build.debug_level=
-thing.menu.DebugLevel.SSL=SSL
-thing.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-thing.menu.DebugLevel.TLS_MEM=TLS_MEM
-thing.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-thing.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-thing.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-thing.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-thing.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-thing.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-thing.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-thing.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-thing.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-thing.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-thing.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-thing.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-thing.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-thing.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-thing.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-thing.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.CORE=CORE
-thing.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-thing.menu.DebugLevel.WIFI=WIFI
-thing.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-thing.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-thing.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-thing.menu.DebugLevel.UPDATER=UPDATER
-thing.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-thing.menu.DebugLevel.OTA=OTA
-thing.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-thing.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-thing.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-thing.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-thing.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-thing.menu.UploadSpeed.115200=115200
-thing.menu.UploadSpeed.115200.upload.speed=115200
-thing.menu.UploadSpeed.9600=9600
-thing.menu.UploadSpeed.9600.upload.speed=9600
-thing.menu.UploadSpeed.57600=57600
-thing.menu.UploadSpeed.57600.upload.speed=57600
-thing.menu.UploadSpeed.230400.linux=230400
-thing.menu.UploadSpeed.230400.macosx=230400
-thing.menu.UploadSpeed.230400.upload.speed=230400
-thing.menu.UploadSpeed.256000.windows=256000
-thing.menu.UploadSpeed.256000.upload.speed=256000
-thing.menu.UploadSpeed.460800.linux=460800
-thing.menu.UploadSpeed.460800.macosx=460800
-thing.menu.UploadSpeed.460800.upload.speed=460800
-thing.menu.UploadSpeed.512000.windows=512000
-thing.menu.UploadSpeed.512000.upload.speed=512000
-thing.menu.UploadSpeed.921600=921600
-thing.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-thingdev.name=SparkFun ESP8266 Thing Dev
-thingdev.build.board=ESP8266_THING_DEV
-thingdev.build.variant=thing
-thingdev.upload.tool=esptool
-thingdev.upload.maximum_data_size=81920
-thingdev.upload.wait_for_upload_port=true
-thingdev.serial.disableDTR=true
-thingdev.serial.disableRTS=true
-thingdev.build.mcu=esp8266
-thingdev.build.core=esp8266
-thingdev.build.spiffs_pagesize=256
-thingdev.build.debug_port=
-thingdev.build.debug_level=
-thingdev.menu.CpuFrequency.80=80 MHz
-thingdev.menu.CpuFrequency.80.build.f_cpu=80000000L
-thingdev.menu.CpuFrequency.160=160 MHz
-thingdev.menu.CpuFrequency.160.build.f_cpu=160000000L
-thingdev.upload.resetmethod=nodemcu
-thingdev.build.flash_mode=dio
-thingdev.build.flash_freq=40
-thingdev.menu.FlashSize.512K0=512K (no SPIFFS)
-thingdev.menu.FlashSize.512K0.build.flash_size=512K
-thingdev.menu.FlashSize.512K0.build.flash_ld=eagle.flash.512k0.ld
-thingdev.menu.FlashSize.512K0.build.spiffs_pagesize=256
-thingdev.menu.FlashSize.512K0.upload.maximum_size=499696
-thingdev.menu.FlashSize.512K64=512K (64K SPIFFS)
-thingdev.menu.FlashSize.512K64.build.flash_size=512K
-thingdev.menu.FlashSize.512K64.build.flash_ld=eagle.flash.512k64.ld
-thingdev.menu.FlashSize.512K64.build.spiffs_pagesize=256
-thingdev.menu.FlashSize.512K64.upload.maximum_size=434160
-thingdev.menu.FlashSize.512K64.build.spiffs_start=0x6B000
-thingdev.menu.FlashSize.512K64.build.spiffs_end=0x7B000
-thingdev.menu.FlashSize.512K64.build.spiffs_blocksize=4096
-thingdev.menu.FlashSize.512K128=512K (128K SPIFFS)
-thingdev.menu.FlashSize.512K128.build.flash_size=512K
-thingdev.menu.FlashSize.512K128.build.flash_ld=eagle.flash.512k128.ld
-thingdev.menu.FlashSize.512K128.build.spiffs_pagesize=256
-thingdev.menu.FlashSize.512K128.upload.maximum_size=368624
-thingdev.menu.FlashSize.512K128.build.spiffs_start=0x5B000
-thingdev.menu.FlashSize.512K128.build.spiffs_end=0x7B000
-thingdev.menu.FlashSize.512K128.build.spiffs_blocksize=4096
-thingdev.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-thingdev.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-thingdev.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-thingdev.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-thingdev.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-thingdev.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-thingdev.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-thingdev.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-thingdev.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-thingdev.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-thingdev.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-thingdev.menu.LwIPVariant.OpenSource=v1.4 Open Source
-thingdev.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-thingdev.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-thingdev.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-thingdev.menu.Debug.Disabled=Disabled
-thingdev.menu.Debug.Disabled.build.debug_port=
-thingdev.menu.Debug.Serial=Serial
-thingdev.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-thingdev.menu.Debug.Serial1=Serial1
-thingdev.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-thingdev.menu.DebugLevel.None____=None
-thingdev.menu.DebugLevel.None____.build.debug_level=
-thingdev.menu.DebugLevel.SSL=SSL
-thingdev.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-thingdev.menu.DebugLevel.TLS_MEM=TLS_MEM
-thingdev.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-thingdev.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-thingdev.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-thingdev.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-thingdev.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-thingdev.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-thingdev.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-thingdev.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-thingdev.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-thingdev.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-thingdev.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-thingdev.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-thingdev.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-thingdev.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-thingdev.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-thingdev.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.CORE=CORE
-thingdev.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-thingdev.menu.DebugLevel.WIFI=WIFI
-thingdev.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-thingdev.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-thingdev.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-thingdev.menu.DebugLevel.UPDATER=UPDATER
-thingdev.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-thingdev.menu.DebugLevel.OTA=OTA
-thingdev.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-thingdev.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-thingdev.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-thingdev.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-thingdev.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-thingdev.menu.UploadSpeed.115200=115200
-thingdev.menu.UploadSpeed.115200.upload.speed=115200
-thingdev.menu.UploadSpeed.9600=9600
-thingdev.menu.UploadSpeed.9600.upload.speed=9600
-thingdev.menu.UploadSpeed.57600=57600
-thingdev.menu.UploadSpeed.57600.upload.speed=57600
-thingdev.menu.UploadSpeed.230400.linux=230400
-thingdev.menu.UploadSpeed.230400.macosx=230400
-thingdev.menu.UploadSpeed.230400.upload.speed=230400
-thingdev.menu.UploadSpeed.256000.windows=256000
-thingdev.menu.UploadSpeed.256000.upload.speed=256000
-thingdev.menu.UploadSpeed.460800.linux=460800
-thingdev.menu.UploadSpeed.460800.macosx=460800
-thingdev.menu.UploadSpeed.460800.upload.speed=460800
-thingdev.menu.UploadSpeed.512000.windows=512000
-thingdev.menu.UploadSpeed.512000.upload.speed=512000
-thingdev.menu.UploadSpeed.921600=921600
-thingdev.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-esp210.name=SweetPea ESP-210
-esp210.build.board=ESP8266_ESP210
-esp210.upload.tool=esptool
-esp210.upload.maximum_data_size=81920
-esp210.upload.wait_for_upload_port=true
-esp210.serial.disableDTR=true
-esp210.serial.disableRTS=true
-esp210.build.mcu=esp8266
-esp210.build.core=esp8266
-esp210.build.variant=generic
-esp210.build.spiffs_pagesize=256
-esp210.build.debug_port=
-esp210.build.debug_level=
-esp210.menu.CpuFrequency.80=80 MHz
-esp210.menu.CpuFrequency.80.build.f_cpu=80000000L
-esp210.menu.CpuFrequency.160=160 MHz
-esp210.menu.CpuFrequency.160.build.f_cpu=160000000L
-esp210.upload.resetmethod=ck
-esp210.build.flash_mode=qio
-esp210.build.flash_freq=40
-esp210.menu.FlashSize.4M1M=4M (1M SPIFFS)
-esp210.menu.FlashSize.4M1M.build.flash_size=4M
-esp210.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-esp210.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-esp210.menu.FlashSize.4M1M.upload.maximum_size=1044464
-esp210.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-esp210.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-esp210.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-esp210.menu.FlashSize.4M3M=4M (3M SPIFFS)
-esp210.menu.FlashSize.4M3M.build.flash_size=4M
-esp210.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-esp210.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-esp210.menu.FlashSize.4M3M.upload.maximum_size=1044464
-esp210.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-esp210.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-esp210.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-esp210.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-esp210.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-esp210.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-esp210.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-esp210.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-esp210.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-esp210.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-esp210.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-esp210.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-esp210.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-esp210.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-esp210.menu.LwIPVariant.OpenSource=v1.4 Open Source
-esp210.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-esp210.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-esp210.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-esp210.menu.Debug.Disabled=Disabled
-esp210.menu.Debug.Disabled.build.debug_port=
-esp210.menu.Debug.Serial=Serial
-esp210.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-esp210.menu.Debug.Serial1=Serial1
-esp210.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-esp210.menu.DebugLevel.None____=None
-esp210.menu.DebugLevel.None____.build.debug_level=
-esp210.menu.DebugLevel.SSL=SSL
-esp210.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-esp210.menu.DebugLevel.TLS_MEM=TLS_MEM
-esp210.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-esp210.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-esp210.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-esp210.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-esp210.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-esp210.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-esp210.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-esp210.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-esp210.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-esp210.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-esp210.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-esp210.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-esp210.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-esp210.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-esp210.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-esp210.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.CORE=CORE
-esp210.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-esp210.menu.DebugLevel.WIFI=WIFI
-esp210.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-esp210.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-esp210.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-esp210.menu.DebugLevel.UPDATER=UPDATER
-esp210.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-esp210.menu.DebugLevel.OTA=OTA
-esp210.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-esp210.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-esp210.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-esp210.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-esp210.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-esp210.menu.UploadSpeed.57600=57600
-esp210.menu.UploadSpeed.57600.upload.speed=57600
-esp210.menu.UploadSpeed.9600=9600
-esp210.menu.UploadSpeed.9600.upload.speed=9600
-esp210.menu.UploadSpeed.115200=115200
-esp210.menu.UploadSpeed.115200.upload.speed=115200
-esp210.menu.UploadSpeed.230400.linux=230400
-esp210.menu.UploadSpeed.230400.macosx=230400
-esp210.menu.UploadSpeed.230400.upload.speed=230400
-esp210.menu.UploadSpeed.256000.windows=256000
-esp210.menu.UploadSpeed.256000.upload.speed=256000
-esp210.menu.UploadSpeed.460800.linux=460800
-esp210.menu.UploadSpeed.460800.macosx=460800
-esp210.menu.UploadSpeed.460800.upload.speed=460800
-esp210.menu.UploadSpeed.512000.windows=512000
-esp210.menu.UploadSpeed.512000.upload.speed=512000
-esp210.menu.UploadSpeed.921600=921600
-esp210.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-d1_mini.name=WeMos D1 R2 & mini
-d1_mini.build.board=ESP8266_WEMOS_D1MINI
-d1_mini.build.variant=d1_mini
-d1_mini.upload.tool=esptool
-d1_mini.upload.maximum_data_size=81920
-d1_mini.upload.wait_for_upload_port=true
-d1_mini.serial.disableDTR=true
-d1_mini.serial.disableRTS=true
-d1_mini.build.mcu=esp8266
-d1_mini.build.core=esp8266
-d1_mini.build.spiffs_pagesize=256
-d1_mini.build.debug_port=
-d1_mini.build.debug_level=
-d1_mini.menu.CpuFrequency.80=80 MHz
-d1_mini.menu.CpuFrequency.80.build.f_cpu=80000000L
-d1_mini.menu.CpuFrequency.160=160 MHz
-d1_mini.menu.CpuFrequency.160.build.f_cpu=160000000L
-d1_mini.upload.resetmethod=nodemcu
-d1_mini.build.flash_mode=dio
-d1_mini.build.flash_freq=40
-d1_mini.menu.FlashSize.4M1M=4M (1M SPIFFS)
-d1_mini.menu.FlashSize.4M1M.build.flash_size=4M
-d1_mini.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-d1_mini.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-d1_mini.menu.FlashSize.4M1M.upload.maximum_size=1044464
-d1_mini.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-d1_mini.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-d1_mini.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-d1_mini.menu.FlashSize.4M3M=4M (3M SPIFFS)
-d1_mini.menu.FlashSize.4M3M.build.flash_size=4M
-d1_mini.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-d1_mini.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-d1_mini.menu.FlashSize.4M3M.upload.maximum_size=1044464
-d1_mini.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-d1_mini.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-d1_mini.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-d1_mini.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-d1_mini.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-d1_mini.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-d1_mini.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-d1_mini.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-d1_mini.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-d1_mini.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-d1_mini.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-d1_mini.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-d1_mini.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-d1_mini.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini.menu.LwIPVariant.OpenSource=v1.4 Open Source
-d1_mini.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-d1_mini.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-d1_mini.menu.Debug.Disabled=Disabled
-d1_mini.menu.Debug.Disabled.build.debug_port=
-d1_mini.menu.Debug.Serial=Serial
-d1_mini.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-d1_mini.menu.Debug.Serial1=Serial1
-d1_mini.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-d1_mini.menu.DebugLevel.None____=None
-d1_mini.menu.DebugLevel.None____.build.debug_level=
-d1_mini.menu.DebugLevel.SSL=SSL
-d1_mini.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-d1_mini.menu.DebugLevel.TLS_MEM=TLS_MEM
-d1_mini.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-d1_mini.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-d1_mini.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-d1_mini.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-d1_mini.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-d1_mini.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-d1_mini.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-d1_mini.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-d1_mini.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-d1_mini.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1_mini.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-d1_mini.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-d1_mini.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1_mini.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.CORE=CORE
-d1_mini.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-d1_mini.menu.DebugLevel.WIFI=WIFI
-d1_mini.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-d1_mini.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-d1_mini.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-d1_mini.menu.DebugLevel.UPDATER=UPDATER
-d1_mini.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-d1_mini.menu.DebugLevel.OTA=OTA
-d1_mini.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-d1_mini.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-d1_mini.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-d1_mini.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-d1_mini.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-d1_mini.menu.UploadSpeed.921600=921600
-d1_mini.menu.UploadSpeed.921600.upload.speed=921600
-d1_mini.menu.UploadSpeed.9600=9600
-d1_mini.menu.UploadSpeed.9600.upload.speed=9600
-d1_mini.menu.UploadSpeed.57600=57600
-d1_mini.menu.UploadSpeed.57600.upload.speed=57600
-d1_mini.menu.UploadSpeed.115200=115200
-d1_mini.menu.UploadSpeed.115200.upload.speed=115200
-d1_mini.menu.UploadSpeed.230400.linux=230400
-d1_mini.menu.UploadSpeed.230400.macosx=230400
-d1_mini.menu.UploadSpeed.230400.upload.speed=230400
-d1_mini.menu.UploadSpeed.256000.windows=256000
-d1_mini.menu.UploadSpeed.256000.upload.speed=256000
-d1_mini.menu.UploadSpeed.460800.linux=460800
-d1_mini.menu.UploadSpeed.460800.macosx=460800
-d1_mini.menu.UploadSpeed.460800.upload.speed=460800
-d1_mini.menu.UploadSpeed.512000.windows=512000
-d1_mini.menu.UploadSpeed.512000.upload.speed=512000
-
-##############################################################
-d1_mini_pro.name=WeMos D1 mini Pro
-d1_mini_pro.build.board=ESP8266_WEMOS_D1MINIPRO
-d1_mini_pro.build.variant=d1_mini
-d1_mini_pro.upload.tool=esptool
-d1_mini_pro.upload.maximum_data_size=81920
-d1_mini_pro.upload.wait_for_upload_port=true
-d1_mini_pro.serial.disableDTR=true
-d1_mini_pro.serial.disableRTS=true
-d1_mini_pro.build.mcu=esp8266
-d1_mini_pro.build.core=esp8266
-d1_mini_pro.build.spiffs_pagesize=256
-d1_mini_pro.build.debug_port=
-d1_mini_pro.build.debug_level=
-d1_mini_pro.menu.CpuFrequency.80=80 MHz
-d1_mini_pro.menu.CpuFrequency.80.build.f_cpu=80000000L
-d1_mini_pro.menu.CpuFrequency.160=160 MHz
-d1_mini_pro.menu.CpuFrequency.160.build.f_cpu=160000000L
-d1_mini_pro.upload.resetmethod=nodemcu
-d1_mini_pro.build.flash_mode=dio
-d1_mini_pro.build.flash_freq=40
-d1_mini_pro.menu.FlashSize.16M15M=16M (15M SPIFFS)
-d1_mini_pro.menu.FlashSize.16M15M.build.flash_size=16M
-d1_mini_pro.menu.FlashSize.16M15M.build.flash_ld=eagle.flash.16m.ld
-d1_mini_pro.menu.FlashSize.16M15M.build.spiffs_pagesize=256
-d1_mini_pro.menu.FlashSize.16M15M.upload.maximum_size=1044464
-d1_mini_pro.menu.FlashSize.16M15M.build.spiffs_start=0x100000
-d1_mini_pro.menu.FlashSize.16M15M.build.spiffs_end=0xFFB000
-d1_mini_pro.menu.FlashSize.16M15M.build.spiffs_blocksize=8192
-d1_mini_pro.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-d1_mini_pro.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-d1_mini_pro.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-d1_mini_pro.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-d1_mini_pro.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-d1_mini_pro.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-d1_mini_pro.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-d1_mini_pro.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-d1_mini_pro.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-d1_mini_pro.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-d1_mini_pro.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini_pro.menu.LwIPVariant.OpenSource=v1.4 Open Source
-d1_mini_pro.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-d1_mini_pro.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini_pro.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-d1_mini_pro.menu.Debug.Disabled=Disabled
-d1_mini_pro.menu.Debug.Disabled.build.debug_port=
-d1_mini_pro.menu.Debug.Serial=Serial
-d1_mini_pro.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-d1_mini_pro.menu.Debug.Serial1=Serial1
-d1_mini_pro.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-d1_mini_pro.menu.DebugLevel.None____=None
-d1_mini_pro.menu.DebugLevel.None____.build.debug_level=
-d1_mini_pro.menu.DebugLevel.SSL=SSL
-d1_mini_pro.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-d1_mini_pro.menu.DebugLevel.TLS_MEM=TLS_MEM
-d1_mini_pro.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-d1_mini_pro.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-d1_mini_pro.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.CORE=CORE
-d1_mini_pro.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-d1_mini_pro.menu.DebugLevel.WIFI=WIFI
-d1_mini_pro.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-d1_mini_pro.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-d1_mini_pro.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-d1_mini_pro.menu.DebugLevel.UPDATER=UPDATER
-d1_mini_pro.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-d1_mini_pro.menu.DebugLevel.OTA=OTA
-d1_mini_pro.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-d1_mini_pro.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-d1_mini_pro.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-d1_mini_pro.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-d1_mini_pro.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-d1_mini_pro.menu.UploadSpeed.921600=921600
-d1_mini_pro.menu.UploadSpeed.921600.upload.speed=921600
-d1_mini_pro.menu.UploadSpeed.9600=9600
-d1_mini_pro.menu.UploadSpeed.9600.upload.speed=9600
-d1_mini_pro.menu.UploadSpeed.57600=57600
-d1_mini_pro.menu.UploadSpeed.57600.upload.speed=57600
-d1_mini_pro.menu.UploadSpeed.115200=115200
-d1_mini_pro.menu.UploadSpeed.115200.upload.speed=115200
-d1_mini_pro.menu.UploadSpeed.230400.linux=230400
-d1_mini_pro.menu.UploadSpeed.230400.macosx=230400
-d1_mini_pro.menu.UploadSpeed.230400.upload.speed=230400
-d1_mini_pro.menu.UploadSpeed.256000.windows=256000
-d1_mini_pro.menu.UploadSpeed.256000.upload.speed=256000
-d1_mini_pro.menu.UploadSpeed.460800.linux=460800
-d1_mini_pro.menu.UploadSpeed.460800.macosx=460800
-d1_mini_pro.menu.UploadSpeed.460800.upload.speed=460800
-d1_mini_pro.menu.UploadSpeed.512000.windows=512000
-d1_mini_pro.menu.UploadSpeed.512000.upload.speed=512000
-
-##############################################################
-d1_mini_lite.name=Wemos D1 mini Lite
-d1_mini_lite.build.board=ESP8266_WEMOS_D1MINILITE
-d1_mini_lite.build.variant=d1_mini
-d1_mini_lite.upload.tool=esptool
-d1_mini_lite.upload.maximum_data_size=81920
-d1_mini_lite.upload.wait_for_upload_port=true
-d1_mini_lite.serial.disableDTR=true
-d1_mini_lite.serial.disableRTS=true
-d1_mini_lite.build.mcu=esp8266
-d1_mini_lite.build.core=esp8266
-d1_mini_lite.build.spiffs_pagesize=256
-d1_mini_lite.build.debug_port=
-d1_mini_lite.build.debug_level=
-d1_mini_lite.menu.CpuFrequency.80=80 MHz
-d1_mini_lite.menu.CpuFrequency.80.build.f_cpu=80000000L
-d1_mini_lite.menu.CpuFrequency.160=160 MHz
-d1_mini_lite.menu.CpuFrequency.160.build.f_cpu=160000000L
-d1_mini_lite.upload.resetmethod=nodemcu
-d1_mini_lite.build.flash_mode=dout
-d1_mini_lite.build.flash_freq=40
-d1_mini_lite.menu.FlashSize.1M0=1M (no SPIFFS)
-d1_mini_lite.menu.FlashSize.1M0.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M0.build.flash_ld=eagle.flash.1m0.ld
-d1_mini_lite.menu.FlashSize.1M0.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M0.upload.maximum_size=1023984
-d1_mini_lite.menu.FlashSize.1M64=1M (64K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M64.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M64.build.flash_ld=eagle.flash.1m64.ld
-d1_mini_lite.menu.FlashSize.1M64.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M64.upload.maximum_size=958448
-d1_mini_lite.menu.FlashSize.1M64.build.spiffs_start=0xEB000
-d1_mini_lite.menu.FlashSize.1M64.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M64.build.spiffs_blocksize=4096
-d1_mini_lite.menu.FlashSize.1M128=1M (128K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M128.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M128.build.flash_ld=eagle.flash.1m128.ld
-d1_mini_lite.menu.FlashSize.1M128.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M128.upload.maximum_size=892912
-d1_mini_lite.menu.FlashSize.1M128.build.spiffs_start=0xDB000
-d1_mini_lite.menu.FlashSize.1M128.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M128.build.spiffs_blocksize=4096
-d1_mini_lite.menu.FlashSize.1M144=1M (144K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M144.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M144.build.flash_ld=eagle.flash.1m144.ld
-d1_mini_lite.menu.FlashSize.1M144.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M144.upload.maximum_size=876528
-d1_mini_lite.menu.FlashSize.1M144.build.spiffs_start=0xD7000
-d1_mini_lite.menu.FlashSize.1M144.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M144.build.spiffs_blocksize=4096
-d1_mini_lite.menu.FlashSize.1M160=1M (160K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M160.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M160.build.flash_ld=eagle.flash.1m160.ld
-d1_mini_lite.menu.FlashSize.1M160.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M160.upload.maximum_size=860144
-d1_mini_lite.menu.FlashSize.1M160.build.spiffs_start=0xD3000
-d1_mini_lite.menu.FlashSize.1M160.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M160.build.spiffs_blocksize=4096
-d1_mini_lite.menu.FlashSize.1M192=1M (192K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M192.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M192.build.flash_ld=eagle.flash.1m192.ld
-d1_mini_lite.menu.FlashSize.1M192.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M192.upload.maximum_size=827376
-d1_mini_lite.menu.FlashSize.1M192.build.spiffs_start=0xCB000
-d1_mini_lite.menu.FlashSize.1M192.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M192.build.spiffs_blocksize=4096
-d1_mini_lite.menu.FlashSize.1M256=1M (256K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M256.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M256.build.flash_ld=eagle.flash.1m256.ld
-d1_mini_lite.menu.FlashSize.1M256.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M256.upload.maximum_size=761840
-d1_mini_lite.menu.FlashSize.1M256.build.spiffs_start=0xBB000
-d1_mini_lite.menu.FlashSize.1M256.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M256.build.spiffs_blocksize=4096
-d1_mini_lite.menu.FlashSize.1M512=1M (512K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M512.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M512.build.flash_ld=eagle.flash.1m512.ld
-d1_mini_lite.menu.FlashSize.1M512.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M512.upload.maximum_size=499696
-d1_mini_lite.menu.FlashSize.1M512.build.spiffs_start=0x7B000
-d1_mini_lite.menu.FlashSize.1M512.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M512.build.spiffs_blocksize=8192
-d1_mini_lite.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-d1_mini_lite.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-d1_mini_lite.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-d1_mini_lite.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-d1_mini_lite.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-d1_mini_lite.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-d1_mini_lite.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-d1_mini_lite.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-d1_mini_lite.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-d1_mini_lite.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-d1_mini_lite.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini_lite.menu.LwIPVariant.OpenSource=v1.4 Open Source
-d1_mini_lite.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-d1_mini_lite.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini_lite.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-d1_mini_lite.menu.Debug.Disabled=Disabled
-d1_mini_lite.menu.Debug.Disabled.build.debug_port=
-d1_mini_lite.menu.Debug.Serial=Serial
-d1_mini_lite.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-d1_mini_lite.menu.Debug.Serial1=Serial1
-d1_mini_lite.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-d1_mini_lite.menu.DebugLevel.None____=None
-d1_mini_lite.menu.DebugLevel.None____.build.debug_level=
-d1_mini_lite.menu.DebugLevel.SSL=SSL
-d1_mini_lite.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-d1_mini_lite.menu.DebugLevel.TLS_MEM=TLS_MEM
-d1_mini_lite.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-d1_mini_lite.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-d1_mini_lite.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.CORE=CORE
-d1_mini_lite.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-d1_mini_lite.menu.DebugLevel.WIFI=WIFI
-d1_mini_lite.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-d1_mini_lite.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-d1_mini_lite.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-d1_mini_lite.menu.DebugLevel.UPDATER=UPDATER
-d1_mini_lite.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-d1_mini_lite.menu.DebugLevel.OTA=OTA
-d1_mini_lite.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-d1_mini_lite.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-d1_mini_lite.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-d1_mini_lite.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-d1_mini_lite.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-d1_mini_lite.menu.UploadSpeed.921600=921600
-d1_mini_lite.menu.UploadSpeed.921600.upload.speed=921600
-d1_mini_lite.menu.UploadSpeed.9600=9600
-d1_mini_lite.menu.UploadSpeed.9600.upload.speed=9600
-d1_mini_lite.menu.UploadSpeed.57600=57600
-d1_mini_lite.menu.UploadSpeed.57600.upload.speed=57600
-d1_mini_lite.menu.UploadSpeed.115200=115200
-d1_mini_lite.menu.UploadSpeed.115200.upload.speed=115200
-d1_mini_lite.menu.UploadSpeed.230400.linux=230400
-d1_mini_lite.menu.UploadSpeed.230400.macosx=230400
-d1_mini_lite.menu.UploadSpeed.230400.upload.speed=230400
-d1_mini_lite.menu.UploadSpeed.256000.windows=256000
-d1_mini_lite.menu.UploadSpeed.256000.upload.speed=256000
-d1_mini_lite.menu.UploadSpeed.460800.linux=460800
-d1_mini_lite.menu.UploadSpeed.460800.macosx=460800
-d1_mini_lite.menu.UploadSpeed.460800.upload.speed=460800
-d1_mini_lite.menu.UploadSpeed.512000.windows=512000
-d1_mini_lite.menu.UploadSpeed.512000.upload.speed=512000
-
-##############################################################
-d1.name=WeMos D1 R1
-d1.build.board=ESP8266_WEMOS_D1MINI
-d1.build.variant=d1
-d1.upload.tool=esptool
-d1.upload.maximum_data_size=81920
-d1.upload.wait_for_upload_port=true
-d1.serial.disableDTR=true
-d1.serial.disableRTS=true
-d1.build.mcu=esp8266
-d1.build.core=esp8266
-d1.build.spiffs_pagesize=256
-d1.build.debug_port=
-d1.build.debug_level=
-d1.menu.CpuFrequency.80=80 MHz
-d1.menu.CpuFrequency.80.build.f_cpu=80000000L
-d1.menu.CpuFrequency.160=160 MHz
-d1.menu.CpuFrequency.160.build.f_cpu=160000000L
-d1.upload.resetmethod=nodemcu
-d1.build.flash_mode=dio
-d1.build.flash_freq=40
-d1.menu.FlashSize.4M1M=4M (1M SPIFFS)
-d1.menu.FlashSize.4M1M.build.flash_size=4M
-d1.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-d1.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-d1.menu.FlashSize.4M1M.upload.maximum_size=1044464
-d1.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-d1.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-d1.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-d1.menu.FlashSize.4M3M=4M (3M SPIFFS)
-d1.menu.FlashSize.4M3M.build.flash_size=4M
-d1.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-d1.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-d1.menu.FlashSize.4M3M.upload.maximum_size=1044464
-d1.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-d1.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-d1.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-d1.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-d1.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-d1.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-d1.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-d1.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-d1.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-d1.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-d1.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-d1.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-d1.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-d1.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-d1.menu.LwIPVariant.OpenSource=v1.4 Open Source
-d1.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-d1.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-d1.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-d1.menu.Debug.Disabled=Disabled
-d1.menu.Debug.Disabled.build.debug_port=
-d1.menu.Debug.Serial=Serial
-d1.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-d1.menu.Debug.Serial1=Serial1
-d1.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-d1.menu.DebugLevel.None____=None
-d1.menu.DebugLevel.None____.build.debug_level=
-d1.menu.DebugLevel.SSL=SSL
-d1.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-d1.menu.DebugLevel.TLS_MEM=TLS_MEM
-d1.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-d1.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-d1.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-d1.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-d1.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-d1.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-d1.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-d1.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-d1.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-d1.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-d1.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-d1.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-d1.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-d1.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.CORE=CORE
-d1.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-d1.menu.DebugLevel.WIFI=WIFI
-d1.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-d1.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-d1.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-d1.menu.DebugLevel.UPDATER=UPDATER
-d1.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-d1.menu.DebugLevel.OTA=OTA
-d1.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-d1.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-d1.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-d1.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-d1.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-d1.menu.UploadSpeed.921600=921600
-d1.menu.UploadSpeed.921600.upload.speed=921600
-d1.menu.UploadSpeed.9600=9600
-d1.menu.UploadSpeed.9600.upload.speed=9600
-d1.menu.UploadSpeed.57600=57600
-d1.menu.UploadSpeed.57600.upload.speed=57600
-d1.menu.UploadSpeed.115200=115200
-d1.menu.UploadSpeed.115200.upload.speed=115200
-d1.menu.UploadSpeed.230400.linux=230400
-d1.menu.UploadSpeed.230400.macosx=230400
-d1.menu.UploadSpeed.230400.upload.speed=230400
-d1.menu.UploadSpeed.256000.windows=256000
-d1.menu.UploadSpeed.256000.upload.speed=256000
-d1.menu.UploadSpeed.460800.linux=460800
-d1.menu.UploadSpeed.460800.macosx=460800
-d1.menu.UploadSpeed.460800.upload.speed=460800
-d1.menu.UploadSpeed.512000.windows=512000
-d1.menu.UploadSpeed.512000.upload.speed=512000
-
-##############################################################
-espino.name=ESPino (ESP-12 Module)
-espino.build.board=ESP8266_ESP12
-espino.build.variant=espino
-espino.upload.tool=esptool
-espino.upload.maximum_data_size=81920
-espino.upload.wait_for_upload_port=true
-espino.serial.disableDTR=true
-espino.serial.disableRTS=true
-espino.build.mcu=esp8266
-espino.build.core=esp8266
-espino.build.spiffs_pagesize=256
-espino.build.debug_port=
-espino.build.debug_level=
-espino.menu.CpuFrequency.80=80 MHz
-espino.menu.CpuFrequency.80.build.f_cpu=80000000L
-espino.menu.CpuFrequency.160=160 MHz
-espino.menu.CpuFrequency.160.build.f_cpu=160000000L
-espino.menu.ResetMethod.ck=ck
-espino.menu.ResetMethod.ck.upload.resetmethod=ck
-espino.menu.ResetMethod.nodemcu=nodemcu
-espino.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-espino.build.flash_mode=qio
-espino.build.flash_freq=40
-espino.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espino.menu.FlashSize.4M1M.build.flash_size=4M
-espino.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espino.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espino.menu.FlashSize.4M1M.upload.maximum_size=1044464
-espino.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espino.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espino.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espino.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espino.menu.FlashSize.4M3M.build.flash_size=4M
-espino.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espino.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-espino.menu.FlashSize.4M3M.upload.maximum_size=1044464
-espino.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espino.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espino.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espino.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-espino.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-espino.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-espino.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-espino.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-espino.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-espino.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-espino.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-espino.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-espino.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-espino.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-espino.menu.LwIPVariant.OpenSource=v1.4 Open Source
-espino.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-espino.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-espino.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-espino.menu.Debug.Disabled=Disabled
-espino.menu.Debug.Disabled.build.debug_port=
-espino.menu.Debug.Serial=Serial
-espino.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-espino.menu.Debug.Serial1=Serial1
-espino.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-espino.menu.DebugLevel.None____=None
-espino.menu.DebugLevel.None____.build.debug_level=
-espino.menu.DebugLevel.SSL=SSL
-espino.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-espino.menu.DebugLevel.TLS_MEM=TLS_MEM
-espino.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-espino.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-espino.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-espino.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-espino.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-espino.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-espino.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-espino.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-espino.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-espino.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-espino.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espino.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-espino.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-espino.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-espino.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espino.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.CORE=CORE
-espino.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-espino.menu.DebugLevel.WIFI=WIFI
-espino.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-espino.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-espino.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-espino.menu.DebugLevel.UPDATER=UPDATER
-espino.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-espino.menu.DebugLevel.OTA=OTA
-espino.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-espino.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-espino.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-espino.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-espino.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-espino.menu.UploadSpeed.115200=115200
-espino.menu.UploadSpeed.115200.upload.speed=115200
-espino.menu.UploadSpeed.9600=9600
-espino.menu.UploadSpeed.9600.upload.speed=9600
-espino.menu.UploadSpeed.57600=57600
-espino.menu.UploadSpeed.57600.upload.speed=57600
-espino.menu.UploadSpeed.230400.linux=230400
-espino.menu.UploadSpeed.230400.macosx=230400
-espino.menu.UploadSpeed.230400.upload.speed=230400
-espino.menu.UploadSpeed.256000.windows=256000
-espino.menu.UploadSpeed.256000.upload.speed=256000
-espino.menu.UploadSpeed.460800.linux=460800
-espino.menu.UploadSpeed.460800.macosx=460800
-espino.menu.UploadSpeed.460800.upload.speed=460800
-espino.menu.UploadSpeed.512000.windows=512000
-espino.menu.UploadSpeed.512000.upload.speed=512000
-espino.menu.UploadSpeed.921600=921600
-espino.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-espinotee.name=ThaiEasyElec's ESPino
-espinotee.build.board=ESP8266_ESP13
-espinotee.build.variant=espinotee
-espinotee.upload.tool=esptool
-espinotee.upload.maximum_data_size=81920
-espinotee.upload.wait_for_upload_port=true
-espinotee.serial.disableDTR=true
-espinotee.serial.disableRTS=true
-espinotee.build.mcu=esp8266
-espinotee.build.core=esp8266
-espinotee.build.spiffs_pagesize=256
-espinotee.build.debug_port=
-espinotee.build.debug_level=
-espinotee.menu.CpuFrequency.80=80 MHz
-espinotee.menu.CpuFrequency.80.build.f_cpu=80000000L
-espinotee.menu.CpuFrequency.160=160 MHz
-espinotee.menu.CpuFrequency.160.build.f_cpu=160000000L
-espinotee.upload.resetmethod=nodemcu
-espinotee.build.flash_mode=qio
-espinotee.build.flash_freq=40
-espinotee.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espinotee.menu.FlashSize.4M1M.build.flash_size=4M
-espinotee.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espinotee.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espinotee.menu.FlashSize.4M1M.upload.maximum_size=1044464
-espinotee.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espinotee.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espinotee.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espinotee.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espinotee.menu.FlashSize.4M3M.build.flash_size=4M
-espinotee.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espinotee.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-espinotee.menu.FlashSize.4M3M.upload.maximum_size=1044464
-espinotee.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espinotee.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espinotee.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espinotee.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-espinotee.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-espinotee.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-espinotee.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-espinotee.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-espinotee.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-espinotee.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-espinotee.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-espinotee.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-espinotee.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-espinotee.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-espinotee.menu.LwIPVariant.OpenSource=v1.4 Open Source
-espinotee.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-espinotee.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-espinotee.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-espinotee.menu.Debug.Disabled=Disabled
-espinotee.menu.Debug.Disabled.build.debug_port=
-espinotee.menu.Debug.Serial=Serial
-espinotee.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-espinotee.menu.Debug.Serial1=Serial1
-espinotee.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-espinotee.menu.DebugLevel.None____=None
-espinotee.menu.DebugLevel.None____.build.debug_level=
-espinotee.menu.DebugLevel.SSL=SSL
-espinotee.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-espinotee.menu.DebugLevel.TLS_MEM=TLS_MEM
-espinotee.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-espinotee.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-espinotee.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-espinotee.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-espinotee.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-espinotee.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-espinotee.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-espinotee.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-espinotee.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-espinotee.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-espinotee.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espinotee.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-espinotee.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-espinotee.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-espinotee.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espinotee.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.CORE=CORE
-espinotee.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-espinotee.menu.DebugLevel.WIFI=WIFI
-espinotee.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-espinotee.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-espinotee.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-espinotee.menu.DebugLevel.UPDATER=UPDATER
-espinotee.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-espinotee.menu.DebugLevel.OTA=OTA
-espinotee.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-espinotee.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-espinotee.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-espinotee.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-espinotee.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-espinotee.menu.UploadSpeed.115200=115200
-espinotee.menu.UploadSpeed.115200.upload.speed=115200
-espinotee.menu.UploadSpeed.9600=9600
-espinotee.menu.UploadSpeed.9600.upload.speed=9600
-espinotee.menu.UploadSpeed.57600=57600
-espinotee.menu.UploadSpeed.57600.upload.speed=57600
-espinotee.menu.UploadSpeed.230400.linux=230400
-espinotee.menu.UploadSpeed.230400.macosx=230400
-espinotee.menu.UploadSpeed.230400.upload.speed=230400
-espinotee.menu.UploadSpeed.256000.windows=256000
-espinotee.menu.UploadSpeed.256000.upload.speed=256000
-espinotee.menu.UploadSpeed.460800.linux=460800
-espinotee.menu.UploadSpeed.460800.macosx=460800
-espinotee.menu.UploadSpeed.460800.upload.speed=460800
-espinotee.menu.UploadSpeed.512000.windows=512000
-espinotee.menu.UploadSpeed.512000.upload.speed=512000
-espinotee.menu.UploadSpeed.921600=921600
-espinotee.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-wifinfo.name=WifInfo
-wifinfo.menu.ESPModule.ESP12.build.board=ESP8266_ESP12
-wifinfo.menu.ESPModule.ESP12.upload.maximum_size=1044464
-wifinfo.menu.ESPModule.ESP12.build.spiffs_pagesize=256
-wifinfo.menu.ESPModule.ESP12.build.flash_ld=eagle.flash.4m1m.ld
-wifinfo.menu.ESPModule.ESP07192.build.spiffs_blocksize=4096
-wifinfo.menu.ESPModule.ESP07192.build.spiffs_end=0xFB000
-wifinfo.menu.ESPModule.ESP12=ESP12 (4M/1M SPIFFS)
-wifinfo.menu.ESPModule.ESP12.build.spiffs_start=0x300000
-wifinfo.menu.ESPModule.ESP12.build.spiffs_end=0x3FB000
-wifinfo.menu.ESPModule.ESP07192.build.spiffs_start=0xCB000
-wifinfo.menu.ESPModule.ESP07192.build.board=ESP8266_ESP07
-wifinfo.menu.ESPModule.ESP12.build.spiffs_blocksize=8192
-wifinfo.menu.ESPModule.ESP12.build.flash_size=4M
-wifinfo.build.board=WIFINFO
-wifinfo.build.variant=wifinfo
-wifinfo.menu.ESPModule.ESP07192.build.flash_ld=eagle.flash.1m192.ld
-wifinfo.menu.ESPModule.ESP07192.build.flash_size=1M
-wifinfo.menu.ESPModule.ESP07192=ESP07 (1M/192K SPIFFS)
-wifinfo.menu.ESPModule.ESP07192.upload.maximum_size=827376
-wifinfo.upload.tool=esptool
-wifinfo.upload.maximum_data_size=81920
-wifinfo.upload.wait_for_upload_port=true
-wifinfo.serial.disableDTR=true
-wifinfo.serial.disableRTS=true
-wifinfo.build.mcu=esp8266
-wifinfo.build.core=esp8266
-wifinfo.build.spiffs_pagesize=256
-wifinfo.build.debug_port=
-wifinfo.build.debug_level=
-wifinfo.menu.CpuFrequency.80=80 MHz
-wifinfo.menu.CpuFrequency.80.build.f_cpu=80000000L
-wifinfo.menu.CpuFrequency.160=160 MHz
-wifinfo.menu.CpuFrequency.160.build.f_cpu=160000000L
-wifinfo.build.flash_mode=qio
-wifinfo.menu.FlashFreq.40=40MHz
-wifinfo.menu.FlashFreq.40.build.flash_freq=40
-wifinfo.menu.FlashFreq.80=80MHz
-wifinfo.menu.FlashFreq.80.build.flash_freq=80
-wifinfo.menu.FlashSize.1M0=1M (no SPIFFS)
-wifinfo.menu.FlashSize.1M0.build.flash_size=1M
-wifinfo.menu.FlashSize.1M0.build.flash_ld=eagle.flash.1m0.ld
-wifinfo.menu.FlashSize.1M0.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M0.upload.maximum_size=1023984
-wifinfo.menu.FlashSize.1M64=1M (64K SPIFFS)
-wifinfo.menu.FlashSize.1M64.build.flash_size=1M
-wifinfo.menu.FlashSize.1M64.build.flash_ld=eagle.flash.1m64.ld
-wifinfo.menu.FlashSize.1M64.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M64.upload.maximum_size=958448
-wifinfo.menu.FlashSize.1M64.build.spiffs_start=0xEB000
-wifinfo.menu.FlashSize.1M64.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M64.build.spiffs_blocksize=4096
-wifinfo.menu.FlashSize.1M128=1M (128K SPIFFS)
-wifinfo.menu.FlashSize.1M128.build.flash_size=1M
-wifinfo.menu.FlashSize.1M128.build.flash_ld=eagle.flash.1m128.ld
-wifinfo.menu.FlashSize.1M128.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M128.upload.maximum_size=892912
-wifinfo.menu.FlashSize.1M128.build.spiffs_start=0xDB000
-wifinfo.menu.FlashSize.1M128.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M128.build.spiffs_blocksize=4096
-wifinfo.menu.FlashSize.1M144=1M (144K SPIFFS)
-wifinfo.menu.FlashSize.1M144.build.flash_size=1M
-wifinfo.menu.FlashSize.1M144.build.flash_ld=eagle.flash.1m144.ld
-wifinfo.menu.FlashSize.1M144.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M144.upload.maximum_size=876528
-wifinfo.menu.FlashSize.1M144.build.spiffs_start=0xD7000
-wifinfo.menu.FlashSize.1M144.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M144.build.spiffs_blocksize=4096
-wifinfo.menu.FlashSize.1M160=1M (160K SPIFFS)
-wifinfo.menu.FlashSize.1M160.build.flash_size=1M
-wifinfo.menu.FlashSize.1M160.build.flash_ld=eagle.flash.1m160.ld
-wifinfo.menu.FlashSize.1M160.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M160.upload.maximum_size=860144
-wifinfo.menu.FlashSize.1M160.build.spiffs_start=0xD3000
-wifinfo.menu.FlashSize.1M160.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M160.build.spiffs_blocksize=4096
-wifinfo.menu.FlashSize.1M192=1M (192K SPIFFS)
-wifinfo.menu.FlashSize.1M192.build.flash_size=1M
-wifinfo.menu.FlashSize.1M192.build.flash_ld=eagle.flash.1m192.ld
-wifinfo.menu.FlashSize.1M192.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M192.upload.maximum_size=827376
-wifinfo.menu.FlashSize.1M192.build.spiffs_start=0xCB000
-wifinfo.menu.FlashSize.1M192.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M192.build.spiffs_blocksize=4096
-wifinfo.menu.FlashSize.1M256=1M (256K SPIFFS)
-wifinfo.menu.FlashSize.1M256.build.flash_size=1M
-wifinfo.menu.FlashSize.1M256.build.flash_ld=eagle.flash.1m256.ld
-wifinfo.menu.FlashSize.1M256.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M256.upload.maximum_size=761840
-wifinfo.menu.FlashSize.1M256.build.spiffs_start=0xBB000
-wifinfo.menu.FlashSize.1M256.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M256.build.spiffs_blocksize=4096
-wifinfo.menu.FlashSize.1M512=1M (512K SPIFFS)
-wifinfo.menu.FlashSize.1M512.build.flash_size=1M
-wifinfo.menu.FlashSize.1M512.build.flash_ld=eagle.flash.1m512.ld
-wifinfo.menu.FlashSize.1M512.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M512.upload.maximum_size=499696
-wifinfo.menu.FlashSize.1M512.build.spiffs_start=0x7B000
-wifinfo.menu.FlashSize.1M512.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M512.build.spiffs_blocksize=8192
-wifinfo.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-wifinfo.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-wifinfo.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-wifinfo.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-wifinfo.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-wifinfo.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-wifinfo.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-wifinfo.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-wifinfo.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-wifinfo.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-wifinfo.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-wifinfo.menu.LwIPVariant.OpenSource=v1.4 Open Source
-wifinfo.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-wifinfo.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-wifinfo.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-wifinfo.menu.Debug.Disabled=Disabled
-wifinfo.menu.Debug.Disabled.build.debug_port=
-wifinfo.menu.Debug.Serial=Serial
-wifinfo.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-wifinfo.menu.Debug.Serial1=Serial1
-wifinfo.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-wifinfo.menu.DebugLevel.None____=None
-wifinfo.menu.DebugLevel.None____.build.debug_level=
-wifinfo.menu.DebugLevel.SSL=SSL
-wifinfo.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-wifinfo.menu.DebugLevel.TLS_MEM=TLS_MEM
-wifinfo.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-wifinfo.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-wifinfo.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-wifinfo.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-wifinfo.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-wifinfo.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-wifinfo.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-wifinfo.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-wifinfo.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-wifinfo.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-wifinfo.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-wifinfo.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-wifinfo.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-wifinfo.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.CORE=CORE
-wifinfo.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-wifinfo.menu.DebugLevel.WIFI=WIFI
-wifinfo.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-wifinfo.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-wifinfo.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-wifinfo.menu.DebugLevel.UPDATER=UPDATER
-wifinfo.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-wifinfo.menu.DebugLevel.OTA=OTA
-wifinfo.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-wifinfo.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-wifinfo.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-wifinfo.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-wifinfo.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-wifinfo.menu.UploadSpeed.115200=115200
-wifinfo.menu.UploadSpeed.115200.upload.speed=115200
-wifinfo.menu.UploadSpeed.9600=9600
-wifinfo.menu.UploadSpeed.9600.upload.speed=9600
-wifinfo.menu.UploadSpeed.57600=57600
-wifinfo.menu.UploadSpeed.57600.upload.speed=57600
-wifinfo.menu.UploadSpeed.230400.linux=230400
-wifinfo.menu.UploadSpeed.230400.macosx=230400
-wifinfo.menu.UploadSpeed.230400.upload.speed=230400
-wifinfo.menu.UploadSpeed.256000.windows=256000
-wifinfo.menu.UploadSpeed.256000.upload.speed=256000
-wifinfo.menu.UploadSpeed.460800.linux=460800
-wifinfo.menu.UploadSpeed.460800.macosx=460800
-wifinfo.menu.UploadSpeed.460800.upload.speed=460800
-wifinfo.menu.UploadSpeed.512000.windows=512000
-wifinfo.menu.UploadSpeed.512000.upload.speed=512000
-wifinfo.menu.UploadSpeed.921600=921600
-wifinfo.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-arduino-esp8266.name=Arduino
-arduino-esp8266.menu.BoardModel.starottodeved.build.board=ESP8266_ARDUINO_STAR_OTTO
-arduino-esp8266.menu.BoardModel.primo.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
-arduino-esp8266.menu.BoardModel.starottodeved.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
-arduino-esp8266.menu.BoardModel.starottodeved.build.variant=arduino_uart
-arduino-esp8266.menu.BoardModel.unowifideved.build.board=ESP8266_ARDUINO_UNOWIFI
-arduino-esp8266.menu.BoardModel.unowifideved.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
-arduino-esp8266.menu.BoardModel.primo=Primo
-arduino-esp8266.menu.BoardModel.unowifideved.build.variant=arduino_uart
-arduino-esp8266.menu.BoardModel.primo.build.variant=arduino_spi
-arduino-esp8266.menu.BoardModel.starottodeved=Star OTTO
-arduino-esp8266.build.board=ESP8266_ARDUINO
-arduino-esp8266.menu.BoardModel.primo.build.board=ESP8266_ARDUINO_PRIMO
-arduino-esp8266.menu.BoardModel.unowifideved=Uno WiFi
-arduino-esp8266.upload.tool=esptool
-arduino-esp8266.upload.maximum_data_size=81920
-arduino-esp8266.upload.wait_for_upload_port=true
-arduino-esp8266.serial.disableDTR=true
-arduino-esp8266.serial.disableRTS=true
-arduino-esp8266.build.mcu=esp8266
-arduino-esp8266.build.core=esp8266
-arduino-esp8266.build.variant=generic
-arduino-esp8266.build.spiffs_pagesize=256
-arduino-esp8266.build.debug_port=
-arduino-esp8266.build.debug_level=
-arduino-esp8266.menu.CpuFrequency.80=80 MHz
-arduino-esp8266.menu.CpuFrequency.80.build.f_cpu=80000000L
-arduino-esp8266.menu.CpuFrequency.160=160 MHz
-arduino-esp8266.menu.CpuFrequency.160.build.f_cpu=160000000L
-arduino-esp8266.build.flash_mode=qio
-arduino-esp8266.build.flash_freq=40
-arduino-esp8266.menu.FlashSize.4M1M=4M (1M SPIFFS)
-arduino-esp8266.menu.FlashSize.4M1M.build.flash_size=4M
-arduino-esp8266.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-arduino-esp8266.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-arduino-esp8266.menu.FlashSize.4M1M.upload.maximum_size=1044464
-arduino-esp8266.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-arduino-esp8266.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-arduino-esp8266.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-arduino-esp8266.menu.FlashSize.4M3M=4M (3M SPIFFS)
-arduino-esp8266.menu.FlashSize.4M3M.build.flash_size=4M
-arduino-esp8266.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-arduino-esp8266.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-arduino-esp8266.menu.FlashSize.4M3M.upload.maximum_size=1044464
-arduino-esp8266.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-arduino-esp8266.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-arduino-esp8266.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-arduino-esp8266.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-arduino-esp8266.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-arduino-esp8266.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-arduino-esp8266.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-arduino-esp8266.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-arduino-esp8266.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-arduino-esp8266.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-arduino-esp8266.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-arduino-esp8266.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-arduino-esp8266.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-arduino-esp8266.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-arduino-esp8266.menu.LwIPVariant.OpenSource=v1.4 Open Source
-arduino-esp8266.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-arduino-esp8266.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-arduino-esp8266.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-arduino-esp8266.menu.Debug.Disabled=Disabled
-arduino-esp8266.menu.Debug.Disabled.build.debug_port=
-arduino-esp8266.menu.Debug.Serial=Serial
-arduino-esp8266.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-arduino-esp8266.menu.Debug.Serial1=Serial1
-arduino-esp8266.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-arduino-esp8266.menu.DebugLevel.None____=None
-arduino-esp8266.menu.DebugLevel.None____.build.debug_level=
-arduino-esp8266.menu.DebugLevel.SSL=SSL
-arduino-esp8266.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-arduino-esp8266.menu.DebugLevel.TLS_MEM=TLS_MEM
-arduino-esp8266.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-arduino-esp8266.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-arduino-esp8266.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.CORE=CORE
-arduino-esp8266.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-arduino-esp8266.menu.DebugLevel.WIFI=WIFI
-arduino-esp8266.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-arduino-esp8266.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-arduino-esp8266.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-arduino-esp8266.menu.DebugLevel.UPDATER=UPDATER
-arduino-esp8266.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-arduino-esp8266.menu.DebugLevel.OTA=OTA
-arduino-esp8266.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-arduino-esp8266.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-arduino-esp8266.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-arduino-esp8266.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-arduino-esp8266.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-arduino-esp8266.menu.UploadSpeed.115200=115200
-arduino-esp8266.menu.UploadSpeed.115200.upload.speed=115200
-arduino-esp8266.menu.UploadSpeed.9600=9600
-arduino-esp8266.menu.UploadSpeed.9600.upload.speed=9600
-arduino-esp8266.menu.UploadSpeed.57600=57600
-arduino-esp8266.menu.UploadSpeed.57600.upload.speed=57600
-arduino-esp8266.menu.UploadSpeed.230400.linux=230400
-arduino-esp8266.menu.UploadSpeed.230400.macosx=230400
-arduino-esp8266.menu.UploadSpeed.230400.upload.speed=230400
-arduino-esp8266.menu.UploadSpeed.256000.windows=256000
-arduino-esp8266.menu.UploadSpeed.256000.upload.speed=256000
-arduino-esp8266.menu.UploadSpeed.460800.linux=460800
-arduino-esp8266.menu.UploadSpeed.460800.macosx=460800
-arduino-esp8266.menu.UploadSpeed.460800.upload.speed=460800
-arduino-esp8266.menu.UploadSpeed.512000.windows=512000
-arduino-esp8266.menu.UploadSpeed.512000.upload.speed=512000
-arduino-esp8266.menu.UploadSpeed.921600=921600
-arduino-esp8266.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-gen4iod.name=4D Systems gen4 IoD Range
-gen4iod.build.board=GEN4_IOD
-gen4iod.build.f_cpu=160000000L
-gen4iod.build.variant=generic
-gen4iod.upload.tool=esptool
-gen4iod.upload.maximum_data_size=81920
-gen4iod.upload.wait_for_upload_port=true
-gen4iod.serial.disableDTR=true
-gen4iod.serial.disableRTS=true
-gen4iod.build.mcu=esp8266
-gen4iod.build.core=esp8266
-gen4iod.build.spiffs_pagesize=256
-gen4iod.build.debug_port=
-gen4iod.build.debug_level=
-gen4iod.menu.CpuFrequency.80=80 MHz
-gen4iod.menu.CpuFrequency.80.build.f_cpu=80000000L
-gen4iod.menu.CpuFrequency.160=160 MHz
-gen4iod.menu.CpuFrequency.160.build.f_cpu=160000000L
-gen4iod.build.flash_mode=qio
-gen4iod.build.flash_freq=80
-gen4iod.menu.FlashSize.512K0=512K (no SPIFFS)
-gen4iod.menu.FlashSize.512K0.build.flash_size=512K
-gen4iod.menu.FlashSize.512K0.build.flash_ld=eagle.flash.512k0.ld
-gen4iod.menu.FlashSize.512K0.build.spiffs_pagesize=256
-gen4iod.menu.FlashSize.512K0.upload.maximum_size=499696
-gen4iod.menu.FlashSize.512K64=512K (64K SPIFFS)
-gen4iod.menu.FlashSize.512K64.build.flash_size=512K
-gen4iod.menu.FlashSize.512K64.build.flash_ld=eagle.flash.512k64.ld
-gen4iod.menu.FlashSize.512K64.build.spiffs_pagesize=256
-gen4iod.menu.FlashSize.512K64.upload.maximum_size=434160
-gen4iod.menu.FlashSize.512K64.build.spiffs_start=0x6B000
-gen4iod.menu.FlashSize.512K64.build.spiffs_end=0x7B000
-gen4iod.menu.FlashSize.512K64.build.spiffs_blocksize=4096
-gen4iod.menu.FlashSize.512K128=512K (128K SPIFFS)
-gen4iod.menu.FlashSize.512K128.build.flash_size=512K
-gen4iod.menu.FlashSize.512K128.build.flash_ld=eagle.flash.512k128.ld
-gen4iod.menu.FlashSize.512K128.build.spiffs_pagesize=256
-gen4iod.menu.FlashSize.512K128.upload.maximum_size=368624
-gen4iod.menu.FlashSize.512K128.build.spiffs_start=0x5B000
-gen4iod.menu.FlashSize.512K128.build.spiffs_end=0x7B000
-gen4iod.menu.FlashSize.512K128.build.spiffs_blocksize=4096
-gen4iod.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-gen4iod.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-gen4iod.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-gen4iod.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-gen4iod.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-gen4iod.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-gen4iod.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-gen4iod.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-gen4iod.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-gen4iod.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-gen4iod.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-gen4iod.menu.LwIPVariant.OpenSource=v1.4 Open Source
-gen4iod.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-gen4iod.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-gen4iod.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-gen4iod.menu.Debug.Disabled=Disabled
-gen4iod.menu.Debug.Disabled.build.debug_port=
-gen4iod.menu.Debug.Serial=Serial
-gen4iod.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-gen4iod.menu.Debug.Serial1=Serial1
-gen4iod.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-gen4iod.menu.DebugLevel.None____=None
-gen4iod.menu.DebugLevel.None____.build.debug_level=
-gen4iod.menu.DebugLevel.SSL=SSL
-gen4iod.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-gen4iod.menu.DebugLevel.TLS_MEM=TLS_MEM
-gen4iod.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-gen4iod.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-gen4iod.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-gen4iod.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-gen4iod.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-gen4iod.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-gen4iod.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-gen4iod.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-gen4iod.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-gen4iod.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-gen4iod.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-gen4iod.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-gen4iod.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-gen4iod.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.CORE=CORE
-gen4iod.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-gen4iod.menu.DebugLevel.WIFI=WIFI
-gen4iod.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-gen4iod.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-gen4iod.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-gen4iod.menu.DebugLevel.UPDATER=UPDATER
-gen4iod.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-gen4iod.menu.DebugLevel.OTA=OTA
-gen4iod.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-gen4iod.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-gen4iod.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-gen4iod.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-gen4iod.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-gen4iod.menu.UploadSpeed.115200=115200
-gen4iod.menu.UploadSpeed.115200.upload.speed=115200
-gen4iod.menu.UploadSpeed.9600=9600
-gen4iod.menu.UploadSpeed.9600.upload.speed=9600
-gen4iod.menu.UploadSpeed.57600=57600
-gen4iod.menu.UploadSpeed.57600.upload.speed=57600
-gen4iod.menu.UploadSpeed.230400.linux=230400
-gen4iod.menu.UploadSpeed.230400.macosx=230400
-gen4iod.menu.UploadSpeed.230400.upload.speed=230400
-gen4iod.menu.UploadSpeed.256000.windows=256000
-gen4iod.menu.UploadSpeed.256000.upload.speed=256000
-gen4iod.menu.UploadSpeed.460800.linux=460800
-gen4iod.menu.UploadSpeed.460800.macosx=460800
-gen4iod.menu.UploadSpeed.460800.upload.speed=460800
-gen4iod.menu.UploadSpeed.512000.windows=512000
-gen4iod.menu.UploadSpeed.512000.upload.speed=512000
-gen4iod.menu.UploadSpeed.921600=921600
-gen4iod.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-oak.name=DigiStump Oak
-oak.build.board=ESP8266_OAK
-oak.build.variant=oak
-oak.upload.maximum_size=1040368
-oak.upload.tool=esptool
-oak.upload.maximum_data_size=81920
-oak.upload.wait_for_upload_port=true
-oak.serial.disableDTR=true
-oak.serial.disableRTS=true
-oak.build.mcu=esp8266
-oak.build.core=esp8266
-oak.build.spiffs_pagesize=256
-oak.build.debug_port=
-oak.build.debug_level=
-oak.menu.CpuFrequency.80=80 MHz
-oak.menu.CpuFrequency.80.build.f_cpu=80000000L
-oak.menu.CpuFrequency.160=160 MHz
-oak.menu.CpuFrequency.160.build.f_cpu=160000000L
-oak.build.flash_mode=dio
-oak.build.flash_freq=40
-oak.menu.FlashSize.4M1M=4M (1M SPIFFS)
-oak.menu.FlashSize.4M1M.build.flash_size=4M
-oak.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-oak.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-oak.menu.FlashSize.4M1M.upload.maximum_size=1044464
-oak.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-oak.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-oak.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-oak.menu.FlashSize.4M3M=4M (3M SPIFFS)
-oak.menu.FlashSize.4M3M.build.flash_size=4M
-oak.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-oak.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-oak.menu.FlashSize.4M3M.upload.maximum_size=1044464
-oak.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-oak.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-oak.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-oak.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536)
-oak.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-oak.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-oak.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-oak.menu.LwIPVariant.v2mss1460=v2 Prebuilt (MSS=1460, unstable)
-oak.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-oak.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-oak.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-oak.menu.LwIPVariant.Prebuilt=v1.4 Prebuilt
-oak.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-oak.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-oak.menu.LwIPVariant.OpenSource=v1.4 Open Source
-oak.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-oak.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-oak.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-oak.menu.Debug.Disabled=Disabled
-oak.menu.Debug.Disabled.build.debug_port=
-oak.menu.Debug.Serial=Serial
-oak.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-oak.menu.Debug.Serial1=Serial1
-oak.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-oak.menu.DebugLevel.None____=None
-oak.menu.DebugLevel.None____.build.debug_level=
-oak.menu.DebugLevel.SSL=SSL
-oak.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-oak.menu.DebugLevel.TLS_MEM=TLS_MEM
-oak.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-oak.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-oak.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-oak.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-oak.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-oak.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-oak.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-oak.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-oak.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-oak.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-oak.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-oak.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-oak.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-oak.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-oak.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-oak.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.CORE=CORE
-oak.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-oak.menu.DebugLevel.WIFI=WIFI
-oak.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-oak.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-oak.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-oak.menu.DebugLevel.UPDATER=UPDATER
-oak.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-oak.menu.DebugLevel.OTA=OTA
-oak.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-oak.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-oak.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA
-oak.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-oak.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-oak.menu.UploadSpeed.921600=921600
-oak.menu.UploadSpeed.921600.upload.speed=921600
-oak.menu.UploadSpeed.9600=9600
-oak.menu.UploadSpeed.9600.upload.speed=9600
-oak.menu.UploadSpeed.57600=57600
-oak.menu.UploadSpeed.57600.upload.speed=57600
-oak.menu.UploadSpeed.115200=115200
-oak.menu.UploadSpeed.115200.upload.speed=115200
-oak.menu.UploadSpeed.230400.linux=230400
-oak.menu.UploadSpeed.230400.macosx=230400
-oak.menu.UploadSpeed.230400.upload.speed=230400
-oak.menu.UploadSpeed.256000.windows=256000
-oak.menu.UploadSpeed.256000.upload.speed=256000
-oak.menu.UploadSpeed.460800.linux=460800
-oak.menu.UploadSpeed.460800.macosx=460800
-oak.menu.UploadSpeed.460800.upload.speed=460800
-oak.menu.UploadSpeed.512000.windows=512000
-oak.menu.UploadSpeed.512000.upload.speed=512000
-
diff --git a/arduino/version 2.4.0/platform.txt b/arduino/version 2.4.0/platform.txt
deleted file mode 100644
index d284f64dacf2..000000000000
--- a/arduino/version 2.4.0/platform.txt
+++ /dev/null
@@ -1,133 +0,0 @@
-
-# ESP8266 platform
-# ------------------------------
-
-# For more info:
-# https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification
-
-name=ESP8266 Modules
-version=2.4.0
-
-
-
-
-compiler.warning_flags=-w
-compiler.warning_flags.none=-w
-compiler.warning_flags.default=
-compiler.warning_flags.more=-Wall
-compiler.warning_flags.all=-Wall -Wextra
-
-build.lwip_lib=-llwip_gcc
-build.lwip_include=lwip/include
-build.lwip_flags=-DLWIP_OPEN_SRC
-
-compiler.path={runtime.tools.xtensa-lx106-elf-gcc.path}/bin/
-compiler.sdk.path={runtime.platform.path}/tools/sdk
-compiler.libc.path={runtime.platform.path}/tools/sdk/libc/xtensa-lx106-elf
-compiler.cpreprocessor.flags=-D__ets__ -DICACHE_FLASH -U__STRICT_ANSI__ "-I{compiler.sdk.path}/include" "-I{compiler.sdk.path}/{build.lwip_include}" "-I{compiler.libc.path}/include" "-I{build.path}/core"
-
-compiler.c.cmd=xtensa-lx106-elf-gcc
-compiler.c.flags=-c {compiler.warning_flags} -Os -g -Wpointer-arith -Wno-implicit-function-declaration -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -falign-functions=4 -MMD -std=gnu99 -ffunction-sections -fdata-sections
-
-compiler.S.cmd=xtensa-lx106-elf-gcc
-compiler.S.flags=-c -g -x assembler-with-cpp -MMD -mlongcalls
-
-# compiler.c.elf.flags=-g {compiler.warning_flags} -Os -nostdlib -Wl,--no-check-sections -u call_user_start -u _printf_float -u _scanf_float -Wl,-static "-L{compiler.sdk.path}/lib" "-L{compiler.sdk.path}/ld" "-L{compiler.libc.path}/lib" "-T{build.flash_ld}" -Wl,--gc-sections -Wl,-wrap,system_restart_local -Wl,-wrap,spi_flash_read
-compiler.c.elf.flags=-g {compiler.warning_flags} -Os -nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static "-L{compiler.sdk.path}/lib" "-L{compiler.sdk.path}/ld" "-L{compiler.libc.path}/lib" "-T{build.flash_ld}" -Wl,--gc-sections -Wl,-wrap,system_restart_local -Wl,-wrap,spi_flash_read
-
-compiler.c.elf.cmd=xtensa-lx106-elf-gcc
-compiler.c.elf.libs=-lhal -lphy -lpp -lnet80211 {build.lwip_lib} -lwpa -lcrypto -lmain -lwps -laxtls -lespnow -lsmartconfig -lairkiss -lmesh -lwpa2 -lstdc++ -lm -lc -lgcc
-
-compiler.cpp.cmd=xtensa-lx106-elf-g++
-compiler.cpp.flags=-c {compiler.warning_flags} -Os -g -mlongcalls -mtext-section-literals -fno-exceptions -fno-rtti -falign-functions=4 -std=c++11 -MMD -ffunction-sections -fdata-sections
-
-compiler.as.cmd=xtensa-lx106-elf-as
-
-compiler.ar.cmd=xtensa-lx106-elf-ar
-compiler.ar.flags=cru
-
-compiler.elf2hex.cmd=esptool
-compiler.elf2hex.flags=
-
-compiler.size.cmd=xtensa-lx106-elf-size
-
-compiler.esptool.cmd=esptool
-compiler.esptool.cmd.windows=esptool.exe
-
-# This can be overriden in boards.txt
-build.extra_flags=-DESP8266
-
-# These can be overridden in platform.local.txt
-compiler.c.extra_flags=
-compiler.c.elf.extra_flags=
-compiler.S.extra_flags=
-compiler.cpp.extra_flags=
-compiler.ar.extra_flags=
-compiler.objcopy.eep.extra_flags=
-compiler.elf2hex.extra_flags=
-
-## generate file with git version number
-## needs bash, git, and echo
-
-## windows-compatible version may be added later
-
-
-## Compile c files
-recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.c.flags} -DF_CPU={build.f_cpu} {build.lwip_flags} {build.debug_port} {build.debug_level} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"
-
-## Compile c++ files
-recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpreprocessor.flags} {compiler.cpp.flags} -DF_CPU={build.f_cpu} {build.lwip_flags} {build.debug_port} {build.debug_level} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"
-
-## Compile S files
-recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.S.flags} -DF_CPU={build.f_cpu} {build.lwip_flags} {build.debug_port} {build.debug_level} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"
-
-## Create archives
-recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{build.path}/arduino.ar" "{object_file}"
-
-## Combine gc-sections, archives, and objects
-recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" -Wl,--start-group {object_files} "{build.path}/arduino.ar" {compiler.c.elf.libs} -Wl,--end-group "-L{build.path}"
-
-## Create eeprom
-recipe.objcopy.eep.pattern=
-
-## Create hex
-#recipe.objcopy.hex.pattern="{compiler.path}{compiler.elf2hex.cmd}" {compiler.elf2hex.flags} {compiler.elf2hex.extra_flags} "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.hex"
-
-recipe.objcopy.hex.pattern="{runtime.tools.esptool.path}/{compiler.esptool.cmd}" -eo "{runtime.platform.path}/bootloaders/eboot/eboot.elf" -bo "{build.path}/{build.project_name}.bin" -bm {build.flash_mode} -bf {build.flash_freq} -bz {build.flash_size} -bs .text -bp 4096 -ec -eo "{build.path}/{build.project_name}.elf" -bs .irom0.text -bs .text -bs .data -bs .rodata -bc -ec
-
-## Save hex
-recipe.output.tmp_file={build.project_name}.bin
-recipe.output.save_file={build.project_name}.{build.variant}.bin
-
-## Compute size
-recipe.size.pattern="{compiler.path}{compiler.size.cmd}" -A "{build.path}/{build.project_name}.elf"
-recipe.size.regex=^(?:\.irom0\.text|\.text|\.data|\.rodata|)\s+([0-9]+).*
-recipe.size.regex.data=^(?:\.data|\.rodata|\.bss)\s+([0-9]+).*
-#recipe.size.regex.eeprom=^(?:\.eeprom)\s+([0-9]+).*
-
-# ------------------------------
-
-tools.esptool.cmd=esptool
-tools.esptool.cmd.windows=esptool.exe
-tools.esptool.path={runtime.tools.esptool.path}
-tools.esptool.network_cmd=python
-tools.esptool.network_cmd.windows=python.exe
-
-tools.esptool.upload.protocol=esp
-tools.esptool.upload.params.verbose=-vv
-tools.esptool.upload.params.quiet=
-tools.esptool.upload.pattern="{path}/{cmd}" {upload.verbose} -cd {upload.resetmethod} -cb {upload.speed} -cp "{serial.port}" -ca 0x00000 -cf "{build.path}/{build.project_name}.bin"
-tools.esptool.upload.network_pattern="{network_cmd}" "{runtime.platform.path}/tools/espota.py" -i "{serial.port}" -p "{network.port}" "--auth={network.password}" -f "{build.path}/{build.project_name}.bin"
-
-tools.mkspiffs.cmd=mkspiffs
-tools.mkspiffs.cmd.windows=mkspiffs.exe
-tools.mkspiffs.path={runtime.tools.mkspiffs.path}
-
-tools.espupload.cmd=python
-tools.espupload.cmd.windows=python.exe
-tools.espupload.path={runtime.platform.path}/tools
-
-tools.espupload.upload.protocol=espupload
-tools.espupload.upload.params.verbose=
-tools.espupload.upload.params.quiet=
-tools.espupload.upload.pattern="{cmd}" "{path}/espupload.py" -f "{build.path}/{build.project_name}.bin"
diff --git a/arduino/version 2.4.1/boards.txt b/arduino/version 2.4.1/boards.txt
deleted file mode 100644
index 0d948f012a15..000000000000
--- a/arduino/version 2.4.1/boards.txt
+++ /dev/null
@@ -1,3796 +0,0 @@
-#
-# this file is script-generated and is likely to be overwritten by boards.txt.py
-#
-
-menu.BoardModel=Model
-menu.UploadSpeed=Upload Speed
-menu.UploadTool=Upload Using
-menu.CpuFrequency=CPU Frequency
-menu.CrystalFreq=Crystal Frequency
-menu.FlashSize=Flash Size
-menu.FlashMode=Flash Mode
-menu.FlashFreq=Flash Frequency
-menu.ResetMethod=Reset Method
-menu.ESPModule=Module
-menu.Debug=Debug port
-menu.DebugLevel=Debug Level
-menu.LwIPVariant=lwIP Variant
-menu.led=Builtin Led
-menu.FlashErase=Erase Flash
-
-##############################################################
-generic.name=Generic ESP8266 Module
-generic.build.board=ESP8266_GENERIC
-generic.upload.tool=esptool
-generic.upload.maximum_data_size=81920
-generic.upload.wait_for_upload_port=true
-generic.upload.erase_cmd=
-generic.serial.disableDTR=true
-generic.serial.disableRTS=true
-generic.build.mcu=esp8266
-generic.build.core=esp8266
-generic.build.variant=generic
-generic.build.spiffs_pagesize=256
-generic.build.debug_port=
-generic.build.debug_level=
-
-generic.menu.UploadTool.esptool=Serial
-generic.menu.UploadTool.esptool.upload.tool=esptool
-generic.menu.UploadTool.esptool.upload.verbose=-vv
-generic.menu.UploadTool.espupload=OTA_upload
-generic.menu.UploadTool.espupload.upload.tool=espupload
-
-generic.menu.CpuFrequency.80=80 MHz
-generic.menu.CpuFrequency.80.build.f_cpu=80000000L
-generic.menu.CpuFrequency.160=160 MHz
-generic.menu.CpuFrequency.160.build.f_cpu=160000000L
-generic.menu.ResetMethod.ck=ck
-generic.menu.ResetMethod.ck.upload.resetmethod=ck
-generic.menu.ResetMethod.nodemcu=nodemcu
-generic.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-generic.menu.ResetMethod.none=none
-generic.menu.ResetMethod.none.upload.resetmethod=none
-generic.menu.ResetMethod.dtrset=dtrset
-generic.menu.ResetMethod.dtrset.upload.resetmethod=dtrset
-generic.menu.CrystalFreq.26=26 MHz
-generic.menu.CrystalFreq.40=40 MHz
-generic.menu.CrystalFreq.40.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
-generic.menu.FlashFreq.40=40MHz
-generic.menu.FlashFreq.40.build.flash_freq=40
-generic.menu.FlashFreq.80=80MHz
-generic.menu.FlashFreq.80.build.flash_freq=80
-generic.menu.FlashMode.qio=QIO
-generic.menu.FlashMode.qio.build.flash_mode=qio
-generic.menu.FlashMode.qout=QOUT
-generic.menu.FlashMode.qout.build.flash_mode=qout
-generic.menu.FlashMode.dio=DIO
-generic.menu.FlashMode.dio.build.flash_mode=dio
-generic.menu.FlashMode.dout=DOUT
-generic.menu.FlashMode.dout.build.flash_mode=dout
-generic.menu.FlashSize.512K0=512K (no SPIFFS)
-generic.menu.FlashSize.512K0.build.flash_size=512K
-generic.menu.FlashSize.512K0.build.flash_size_bytes=0x80000
-generic.menu.FlashSize.512K0.build.flash_ld=eagle.flash.512k0.ld
-generic.menu.FlashSize.512K0.build.spiffs_pagesize=256
-generic.menu.FlashSize.512K0.upload.maximum_size=499696
-generic.menu.FlashSize.512K0.build.rfcal_addr=0x7C000
-generic.menu.FlashSize.512K64=512K (64K SPIFFS)
-generic.menu.FlashSize.512K64.build.flash_size=512K
-generic.menu.FlashSize.512K64.build.flash_size_bytes=0x80000
-generic.menu.FlashSize.512K64.build.flash_ld=eagle.flash.512k64.ld
-generic.menu.FlashSize.512K64.build.spiffs_pagesize=256
-generic.menu.FlashSize.512K64.upload.maximum_size=434160
-generic.menu.FlashSize.512K64.build.rfcal_addr=0x7C000
-generic.menu.FlashSize.512K64.build.spiffs_start=0x6B000
-generic.menu.FlashSize.512K64.build.spiffs_end=0x7B000
-generic.menu.FlashSize.512K64.build.spiffs_blocksize=4096
-generic.menu.FlashSize.512K128=512K (128K SPIFFS)
-generic.menu.FlashSize.512K128.build.flash_size=512K
-generic.menu.FlashSize.512K128.build.flash_size_bytes=0x80000
-generic.menu.FlashSize.512K128.build.flash_ld=eagle.flash.512k128.ld
-generic.menu.FlashSize.512K128.build.spiffs_pagesize=256
-generic.menu.FlashSize.512K128.upload.maximum_size=368624
-generic.menu.FlashSize.512K128.build.rfcal_addr=0x7C000
-generic.menu.FlashSize.512K128.build.spiffs_start=0x5B000
-generic.menu.FlashSize.512K128.build.spiffs_end=0x7B000
-generic.menu.FlashSize.512K128.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M0=1M (no SPIFFS)
-generic.menu.FlashSize.1M0.build.flash_size=1M
-generic.menu.FlashSize.1M0.build.flash_size_bytes=0x100000
-generic.menu.FlashSize.1M0.build.flash_ld=eagle.flash.1m0.ld
-generic.menu.FlashSize.1M0.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M0.upload.maximum_size=1023984
-generic.menu.FlashSize.1M0.build.rfcal_addr=0xFC000
-generic.menu.FlashSize.1M64=1M (64K SPIFFS)
-generic.menu.FlashSize.1M64.build.flash_size=1M
-generic.menu.FlashSize.1M64.build.flash_size_bytes=0x100000
-generic.menu.FlashSize.1M64.build.flash_ld=eagle.flash.1m64.ld
-generic.menu.FlashSize.1M64.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M64.upload.maximum_size=958448
-generic.menu.FlashSize.1M64.build.rfcal_addr=0xFC000
-generic.menu.FlashSize.1M64.build.spiffs_start=0xEB000
-generic.menu.FlashSize.1M64.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M64.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M128=1M (128K SPIFFS)
-generic.menu.FlashSize.1M128.build.flash_size=1M
-generic.menu.FlashSize.1M128.build.flash_size_bytes=0x100000
-generic.menu.FlashSize.1M128.build.flash_ld=eagle.flash.1m128.ld
-generic.menu.FlashSize.1M128.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M128.upload.maximum_size=892912
-generic.menu.FlashSize.1M128.build.rfcal_addr=0xFC000
-generic.menu.FlashSize.1M128.build.spiffs_start=0xDB000
-generic.menu.FlashSize.1M128.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M128.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M144=1M (144K SPIFFS)
-generic.menu.FlashSize.1M144.build.flash_size=1M
-generic.menu.FlashSize.1M144.build.flash_size_bytes=0x100000
-generic.menu.FlashSize.1M144.build.flash_ld=eagle.flash.1m144.ld
-generic.menu.FlashSize.1M144.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M144.upload.maximum_size=876528
-generic.menu.FlashSize.1M144.build.rfcal_addr=0xFC000
-generic.menu.FlashSize.1M144.build.spiffs_start=0xD7000
-generic.menu.FlashSize.1M144.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M144.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M160=1M (160K SPIFFS)
-generic.menu.FlashSize.1M160.build.flash_size=1M
-generic.menu.FlashSize.1M160.build.flash_size_bytes=0x100000
-generic.menu.FlashSize.1M160.build.flash_ld=eagle.flash.1m160.ld
-generic.menu.FlashSize.1M160.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M160.upload.maximum_size=860144
-generic.menu.FlashSize.1M160.build.rfcal_addr=0xFC000
-generic.menu.FlashSize.1M160.build.spiffs_start=0xD3000
-generic.menu.FlashSize.1M160.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M160.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M192=1M (192K SPIFFS)
-generic.menu.FlashSize.1M192.build.flash_size=1M
-generic.menu.FlashSize.1M192.build.flash_size_bytes=0x100000
-generic.menu.FlashSize.1M192.build.flash_ld=eagle.flash.1m192.ld
-generic.menu.FlashSize.1M192.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M192.upload.maximum_size=827376
-generic.menu.FlashSize.1M192.build.rfcal_addr=0xFC000
-generic.menu.FlashSize.1M192.build.spiffs_start=0xCB000
-generic.menu.FlashSize.1M192.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M192.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M256=1M (256K SPIFFS)
-generic.menu.FlashSize.1M256.build.flash_size=1M
-generic.menu.FlashSize.1M256.build.flash_size_bytes=0x100000
-generic.menu.FlashSize.1M256.build.flash_ld=eagle.flash.1m256.ld
-generic.menu.FlashSize.1M256.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M256.upload.maximum_size=761840
-generic.menu.FlashSize.1M256.build.rfcal_addr=0xFC000
-generic.menu.FlashSize.1M256.build.spiffs_start=0xBB000
-generic.menu.FlashSize.1M256.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M256.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M512=1M (512K SPIFFS)
-generic.menu.FlashSize.1M512.build.flash_size=1M
-generic.menu.FlashSize.1M512.build.flash_size_bytes=0x100000
-generic.menu.FlashSize.1M512.build.flash_ld=eagle.flash.1m512.ld
-generic.menu.FlashSize.1M512.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M512.upload.maximum_size=499696
-generic.menu.FlashSize.1M512.build.rfcal_addr=0xFC000
-generic.menu.FlashSize.1M512.build.spiffs_start=0x7B000
-generic.menu.FlashSize.1M512.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M512.build.spiffs_blocksize=8192
-generic.menu.FlashSize.2M=2M (1M SPIFFS)
-generic.menu.FlashSize.2M.build.flash_size=2M
-generic.menu.FlashSize.2M.build.flash_size_bytes=0x200000
-generic.menu.FlashSize.2M.build.flash_ld=eagle.flash.2m.ld
-generic.menu.FlashSize.2M.build.spiffs_pagesize=256
-generic.menu.FlashSize.2M.upload.maximum_size=1044464
-generic.menu.FlashSize.2M.build.rfcal_addr=0x1FC000
-generic.menu.FlashSize.2M.build.spiffs_start=0x100000
-generic.menu.FlashSize.2M.build.spiffs_end=0x1FB000
-generic.menu.FlashSize.2M.build.spiffs_blocksize=8192
-generic.menu.FlashSize.4M1M=4M (1M SPIFFS)
-generic.menu.FlashSize.4M1M.build.flash_size=4M
-generic.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-generic.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-generic.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-generic.menu.FlashSize.4M1M.upload.maximum_size=1044464
-generic.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-generic.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-generic.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-generic.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-generic.menu.FlashSize.4M3M=4M (3M SPIFFS)
-generic.menu.FlashSize.4M3M.build.flash_size=4M
-generic.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-generic.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-generic.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-generic.menu.FlashSize.4M3M.upload.maximum_size=1044464
-generic.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-generic.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-generic.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-generic.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-generic.menu.FlashSize.8M7M=8M (7M SPIFFS)
-generic.menu.FlashSize.8M7M.build.flash_size=8M
-generic.menu.FlashSize.8M7M.build.flash_size_bytes=0x800000
-generic.menu.FlashSize.8M7M.build.flash_ld=eagle.flash.8m.ld
-generic.menu.FlashSize.8M7M.build.spiffs_pagesize=256
-generic.menu.FlashSize.8M7M.upload.maximum_size=1044464
-generic.menu.FlashSize.8M7M.build.rfcal_addr=0x7FC000
-generic.menu.FlashSize.8M7M.build.spiffs_start=0x100000
-generic.menu.FlashSize.8M7M.build.spiffs_end=0x7FB000
-generic.menu.FlashSize.8M7M.build.spiffs_blocksize=8192
-generic.menu.FlashSize.16M15M=16M (15M SPIFFS)
-generic.menu.FlashSize.16M15M.build.flash_size=16M
-generic.menu.FlashSize.16M15M.build.flash_size_bytes=0x1000000
-generic.menu.FlashSize.16M15M.build.flash_ld=eagle.flash.16m.ld
-generic.menu.FlashSize.16M15M.build.spiffs_pagesize=256
-generic.menu.FlashSize.16M15M.upload.maximum_size=1044464
-generic.menu.FlashSize.16M15M.build.rfcal_addr=0xFFC000
-generic.menu.FlashSize.16M15M.build.spiffs_start=0x100000
-generic.menu.FlashSize.16M15M.build.spiffs_end=0xFFB000
-generic.menu.FlashSize.16M15M.build.spiffs_blocksize=8192
-generic.menu.led.2=2
-generic.menu.led.2.build.led=-DLED_BUILTIN=2
-generic.menu.led.0=0
-generic.menu.led.0.build.led=-DLED_BUILTIN=0
-generic.menu.led.1=1
-generic.menu.led.1.build.led=-DLED_BUILTIN=1
-generic.menu.led.3=3
-generic.menu.led.3.build.led=-DLED_BUILTIN=3
-generic.menu.led.4=4
-generic.menu.led.4.build.led=-DLED_BUILTIN=4
-generic.menu.led.5=5
-generic.menu.led.5.build.led=-DLED_BUILTIN=5
-generic.menu.led.6=6
-generic.menu.led.6.build.led=-DLED_BUILTIN=6
-generic.menu.led.7=7
-generic.menu.led.7.build.led=-DLED_BUILTIN=7
-generic.menu.led.8=8
-generic.menu.led.8.build.led=-DLED_BUILTIN=8
-generic.menu.led.9=9
-generic.menu.led.9.build.led=-DLED_BUILTIN=9
-generic.menu.led.10=10
-generic.menu.led.10.build.led=-DLED_BUILTIN=10
-generic.menu.led.11=11
-generic.menu.led.11.build.led=-DLED_BUILTIN=11
-generic.menu.led.12=12
-generic.menu.led.12.build.led=-DLED_BUILTIN=12
-generic.menu.led.13=13
-generic.menu.led.13.build.led=-DLED_BUILTIN=13
-generic.menu.led.14=14
-generic.menu.led.14.build.led=-DLED_BUILTIN=14
-generic.menu.led.15=15
-generic.menu.led.15.build.led=-DLED_BUILTIN=15
-generic.menu.LwIPVariant.v2mss536=v2 Lower Memory
-generic.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-generic.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-generic.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-generic.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-generic.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-generic.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-generic.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-generic.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-generic.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-generic.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-generic.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-generic.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-generic.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-generic.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-generic.menu.Debug.Disabled=Disabled
-generic.menu.Debug.Disabled.build.debug_port=
-generic.menu.Debug.Serial=Serial
-generic.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-generic.menu.Debug.Serial1=Serial1
-generic.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-generic.menu.DebugLevel.None____=None
-generic.menu.DebugLevel.None____.build.debug_level=
-generic.menu.DebugLevel.SSL=SSL
-generic.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-generic.menu.DebugLevel.TLS_MEM=TLS_MEM
-generic.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-generic.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-generic.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-generic.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-generic.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-generic.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-generic.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-generic.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-generic.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-generic.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-generic.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-generic.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-generic.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-generic.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-generic.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-generic.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.CORE=CORE
-generic.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-generic.menu.DebugLevel.WIFI=WIFI
-generic.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-generic.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-generic.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-generic.menu.DebugLevel.UPDATER=UPDATER
-generic.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-generic.menu.DebugLevel.OTA=OTA
-generic.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-generic.menu.DebugLevel.OOM=OOM
-generic.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-generic.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-generic.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-generic.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-generic.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-generic.menu.FlashErase.none=Only Sketch
-generic.menu.FlashErase.none.upload.erase_cmd=
-generic.menu.FlashErase.sdk=Sketch + WiFi Settings
-generic.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-generic.menu.FlashErase.all=All Flash Contents
-generic.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-generic.menu.UploadSpeed.115200=115200
-generic.menu.UploadSpeed.115200.upload.speed=115200
-generic.menu.UploadSpeed.9600=9600
-generic.menu.UploadSpeed.9600.upload.speed=9600
-generic.menu.UploadSpeed.57600=57600
-generic.menu.UploadSpeed.57600.upload.speed=57600
-generic.menu.UploadSpeed.230400.linux=230400
-generic.menu.UploadSpeed.230400.macosx=230400
-generic.menu.UploadSpeed.230400.upload.speed=230400
-generic.menu.UploadSpeed.256000.windows=256000
-generic.menu.UploadSpeed.256000.upload.speed=256000
-generic.menu.UploadSpeed.460800.linux=460800
-generic.menu.UploadSpeed.460800.macosx=460800
-generic.menu.UploadSpeed.460800.upload.speed=460800
-generic.menu.UploadSpeed.512000.windows=512000
-generic.menu.UploadSpeed.512000.upload.speed=512000
-generic.menu.UploadSpeed.921600=921600
-generic.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-esp8285.name=Generic ESP8285 Module
-esp8285.build.board=ESP8266_ESP01
-esp8285.upload.tool=esptool
-esp8285.upload.maximum_data_size=81920
-esp8285.upload.wait_for_upload_port=true
-esp8285.upload.erase_cmd=
-esp8285.serial.disableDTR=true
-esp8285.serial.disableRTS=true
-esp8285.build.mcu=esp8266
-esp8285.build.core=esp8266
-esp8285.build.variant=generic
-esp8285.build.spiffs_pagesize=256
-esp8285.build.debug_port=
-esp8285.build.debug_level=
-esp8285.menu.CpuFrequency.80=80 MHz
-esp8285.menu.CpuFrequency.80.build.f_cpu=80000000L
-esp8285.menu.CpuFrequency.160=160 MHz
-esp8285.menu.CpuFrequency.160.build.f_cpu=160000000L
-esp8285.menu.ResetMethod.ck=ck
-esp8285.menu.ResetMethod.ck.upload.resetmethod=ck
-esp8285.menu.ResetMethod.nodemcu=nodemcu
-esp8285.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-esp8285.menu.ResetMethod.none=none
-esp8285.menu.ResetMethod.none.upload.resetmethod=none
-esp8285.menu.ResetMethod.dtrset=dtrset
-esp8285.menu.ResetMethod.dtrset.upload.resetmethod=dtrset
-esp8285.menu.CrystalFreq.26=26 MHz
-esp8285.menu.CrystalFreq.40=40 MHz
-esp8285.menu.CrystalFreq.40.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
-esp8285.build.flash_mode=dout
-esp8285.build.flash_freq=40
-esp8285.menu.FlashSize.1M0=1M (no SPIFFS)
-esp8285.menu.FlashSize.1M0.build.flash_size=1M
-esp8285.menu.FlashSize.1M0.build.flash_size_bytes=0x100000
-esp8285.menu.FlashSize.1M0.build.flash_ld=eagle.flash.1m0.ld
-esp8285.menu.FlashSize.1M0.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M0.upload.maximum_size=1023984
-esp8285.menu.FlashSize.1M0.build.rfcal_addr=0xFC000
-esp8285.menu.FlashSize.1M64=1M (64K SPIFFS)
-esp8285.menu.FlashSize.1M64.build.flash_size=1M
-esp8285.menu.FlashSize.1M64.build.flash_size_bytes=0x100000
-esp8285.menu.FlashSize.1M64.build.flash_ld=eagle.flash.1m64.ld
-esp8285.menu.FlashSize.1M64.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M64.upload.maximum_size=958448
-esp8285.menu.FlashSize.1M64.build.rfcal_addr=0xFC000
-esp8285.menu.FlashSize.1M64.build.spiffs_start=0xEB000
-esp8285.menu.FlashSize.1M64.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M64.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M128=1M (128K SPIFFS)
-esp8285.menu.FlashSize.1M128.build.flash_size=1M
-esp8285.menu.FlashSize.1M128.build.flash_size_bytes=0x100000
-esp8285.menu.FlashSize.1M128.build.flash_ld=eagle.flash.1m128.ld
-esp8285.menu.FlashSize.1M128.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M128.upload.maximum_size=892912
-esp8285.menu.FlashSize.1M128.build.rfcal_addr=0xFC000
-esp8285.menu.FlashSize.1M128.build.spiffs_start=0xDB000
-esp8285.menu.FlashSize.1M128.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M128.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M144=1M (144K SPIFFS)
-esp8285.menu.FlashSize.1M144.build.flash_size=1M
-esp8285.menu.FlashSize.1M144.build.flash_size_bytes=0x100000
-esp8285.menu.FlashSize.1M144.build.flash_ld=eagle.flash.1m144.ld
-esp8285.menu.FlashSize.1M144.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M144.upload.maximum_size=876528
-esp8285.menu.FlashSize.1M144.build.rfcal_addr=0xFC000
-esp8285.menu.FlashSize.1M144.build.spiffs_start=0xD7000
-esp8285.menu.FlashSize.1M144.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M144.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M160=1M (160K SPIFFS)
-esp8285.menu.FlashSize.1M160.build.flash_size=1M
-esp8285.menu.FlashSize.1M160.build.flash_size_bytes=0x100000
-esp8285.menu.FlashSize.1M160.build.flash_ld=eagle.flash.1m160.ld
-esp8285.menu.FlashSize.1M160.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M160.upload.maximum_size=860144
-esp8285.menu.FlashSize.1M160.build.rfcal_addr=0xFC000
-esp8285.menu.FlashSize.1M160.build.spiffs_start=0xD3000
-esp8285.menu.FlashSize.1M160.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M160.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M192=1M (192K SPIFFS)
-esp8285.menu.FlashSize.1M192.build.flash_size=1M
-esp8285.menu.FlashSize.1M192.build.flash_size_bytes=0x100000
-esp8285.menu.FlashSize.1M192.build.flash_ld=eagle.flash.1m192.ld
-esp8285.menu.FlashSize.1M192.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M192.upload.maximum_size=827376
-esp8285.menu.FlashSize.1M192.build.rfcal_addr=0xFC000
-esp8285.menu.FlashSize.1M192.build.spiffs_start=0xCB000
-esp8285.menu.FlashSize.1M192.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M192.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M256=1M (256K SPIFFS)
-esp8285.menu.FlashSize.1M256.build.flash_size=1M
-esp8285.menu.FlashSize.1M256.build.flash_size_bytes=0x100000
-esp8285.menu.FlashSize.1M256.build.flash_ld=eagle.flash.1m256.ld
-esp8285.menu.FlashSize.1M256.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M256.upload.maximum_size=761840
-esp8285.menu.FlashSize.1M256.build.rfcal_addr=0xFC000
-esp8285.menu.FlashSize.1M256.build.spiffs_start=0xBB000
-esp8285.menu.FlashSize.1M256.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M256.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M512=1M (512K SPIFFS)
-esp8285.menu.FlashSize.1M512.build.flash_size=1M
-esp8285.menu.FlashSize.1M512.build.flash_size_bytes=0x100000
-esp8285.menu.FlashSize.1M512.build.flash_ld=eagle.flash.1m512.ld
-esp8285.menu.FlashSize.1M512.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M512.upload.maximum_size=499696
-esp8285.menu.FlashSize.1M512.build.rfcal_addr=0xFC000
-esp8285.menu.FlashSize.1M512.build.spiffs_start=0x7B000
-esp8285.menu.FlashSize.1M512.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M512.build.spiffs_blocksize=8192
-esp8285.menu.led.2=2
-esp8285.menu.led.2.build.led=-DLED_BUILTIN=2
-esp8285.menu.led.0=0
-esp8285.menu.led.0.build.led=-DLED_BUILTIN=0
-esp8285.menu.led.1=1
-esp8285.menu.led.1.build.led=-DLED_BUILTIN=1
-esp8285.menu.led.3=3
-esp8285.menu.led.3.build.led=-DLED_BUILTIN=3
-esp8285.menu.led.4=4
-esp8285.menu.led.4.build.led=-DLED_BUILTIN=4
-esp8285.menu.led.5=5
-esp8285.menu.led.5.build.led=-DLED_BUILTIN=5
-esp8285.menu.led.6=6
-esp8285.menu.led.6.build.led=-DLED_BUILTIN=6
-esp8285.menu.led.7=7
-esp8285.menu.led.7.build.led=-DLED_BUILTIN=7
-esp8285.menu.led.8=8
-esp8285.menu.led.8.build.led=-DLED_BUILTIN=8
-esp8285.menu.led.9=9
-esp8285.menu.led.9.build.led=-DLED_BUILTIN=9
-esp8285.menu.led.10=10
-esp8285.menu.led.10.build.led=-DLED_BUILTIN=10
-esp8285.menu.led.11=11
-esp8285.menu.led.11.build.led=-DLED_BUILTIN=11
-esp8285.menu.led.12=12
-esp8285.menu.led.12.build.led=-DLED_BUILTIN=12
-esp8285.menu.led.13=13
-esp8285.menu.led.13.build.led=-DLED_BUILTIN=13
-esp8285.menu.led.14=14
-esp8285.menu.led.14.build.led=-DLED_BUILTIN=14
-esp8285.menu.led.15=15
-esp8285.menu.led.15.build.led=-DLED_BUILTIN=15
-esp8285.menu.LwIPVariant.v2mss536=v2 Lower Memory
-esp8285.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-esp8285.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-esp8285.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-esp8285.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-esp8285.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-esp8285.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-esp8285.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-esp8285.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-esp8285.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-esp8285.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-esp8285.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-esp8285.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-esp8285.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-esp8285.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-esp8285.menu.Debug.Disabled=Disabled
-esp8285.menu.Debug.Disabled.build.debug_port=
-esp8285.menu.Debug.Serial=Serial
-esp8285.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-esp8285.menu.Debug.Serial1=Serial1
-esp8285.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-esp8285.menu.DebugLevel.None____=None
-esp8285.menu.DebugLevel.None____.build.debug_level=
-esp8285.menu.DebugLevel.SSL=SSL
-esp8285.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-esp8285.menu.DebugLevel.TLS_MEM=TLS_MEM
-esp8285.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-esp8285.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-esp8285.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-esp8285.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-esp8285.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-esp8285.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-esp8285.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-esp8285.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-esp8285.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-esp8285.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-esp8285.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-esp8285.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-esp8285.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-esp8285.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-esp8285.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-esp8285.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.CORE=CORE
-esp8285.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-esp8285.menu.DebugLevel.WIFI=WIFI
-esp8285.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-esp8285.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-esp8285.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-esp8285.menu.DebugLevel.UPDATER=UPDATER
-esp8285.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-esp8285.menu.DebugLevel.OTA=OTA
-esp8285.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-esp8285.menu.DebugLevel.OOM=OOM
-esp8285.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-esp8285.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-esp8285.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-esp8285.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-esp8285.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-esp8285.menu.FlashErase.none=Only Sketch
-esp8285.menu.FlashErase.none.upload.erase_cmd=
-esp8285.menu.FlashErase.sdk=Sketch + WiFi Settings
-esp8285.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-esp8285.menu.FlashErase.all=All Flash Contents
-esp8285.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-esp8285.menu.UploadSpeed.115200=115200
-esp8285.menu.UploadSpeed.115200.upload.speed=115200
-esp8285.menu.UploadSpeed.9600=9600
-esp8285.menu.UploadSpeed.9600.upload.speed=9600
-esp8285.menu.UploadSpeed.57600=57600
-esp8285.menu.UploadSpeed.57600.upload.speed=57600
-esp8285.menu.UploadSpeed.230400.linux=230400
-esp8285.menu.UploadSpeed.230400.macosx=230400
-esp8285.menu.UploadSpeed.230400.upload.speed=230400
-esp8285.menu.UploadSpeed.256000.windows=256000
-esp8285.menu.UploadSpeed.256000.upload.speed=256000
-esp8285.menu.UploadSpeed.460800.linux=460800
-esp8285.menu.UploadSpeed.460800.macosx=460800
-esp8285.menu.UploadSpeed.460800.upload.speed=460800
-esp8285.menu.UploadSpeed.512000.windows=512000
-esp8285.menu.UploadSpeed.512000.upload.speed=512000
-esp8285.menu.UploadSpeed.921600=921600
-esp8285.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-espduino.name=ESPDuino (ESP-13 Module)
-espduino.build.board=ESP8266_ESP13
-espduino.build.variant=ESPDuino
-espduino.menu.ResetMethod.v2=ESPduino-V2
-espduino.menu.ResetMethod.v2.upload.resetmethod=nodemcu
-espduino.menu.ResetMethod.v1=ESPduino-V1
-espduino.menu.ResetMethod.v1.upload.resetmethod=ck
-espduino.menu.UploadTool.esptool=Serial
-espduino.menu.UploadTool.esptool.upload.tool=esptool
-espduino.menu.UploadTool.esptool.upload.verbose=-vv
-espduino.menu.UploadTool.espota=OTA
-espduino.menu.UploadTool.espota.upload.tool=espota
-espduino.upload.tool=esptool
-espduino.upload.maximum_data_size=81920
-espduino.upload.wait_for_upload_port=true
-espduino.upload.erase_cmd=
-espduino.serial.disableDTR=true
-espduino.serial.disableRTS=true
-espduino.build.mcu=esp8266
-espduino.build.core=esp8266
-espduino.build.spiffs_pagesize=256
-espduino.build.debug_port=
-espduino.build.debug_level=
-espduino.menu.CpuFrequency.80=80 MHz
-espduino.menu.CpuFrequency.80.build.f_cpu=80000000L
-espduino.menu.CpuFrequency.160=160 MHz
-espduino.menu.CpuFrequency.160.build.f_cpu=160000000L
-espduino.build.flash_mode=dio
-espduino.build.flash_freq=40
-espduino.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espduino.menu.FlashSize.4M1M.build.flash_size=4M
-espduino.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-espduino.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espduino.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espduino.menu.FlashSize.4M1M.upload.maximum_size=1044464
-espduino.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-espduino.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espduino.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espduino.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espduino.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espduino.menu.FlashSize.4M3M.build.flash_size=4M
-espduino.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-espduino.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espduino.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-espduino.menu.FlashSize.4M3M.upload.maximum_size=1044464
-espduino.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-espduino.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espduino.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espduino.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espduino.menu.LwIPVariant.v2mss536=v2 Lower Memory
-espduino.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-espduino.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-espduino.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-espduino.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-espduino.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-espduino.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-espduino.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-espduino.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-espduino.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-espduino.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-espduino.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-espduino.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-espduino.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-espduino.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-espduino.menu.Debug.Disabled=Disabled
-espduino.menu.Debug.Disabled.build.debug_port=
-espduino.menu.Debug.Serial=Serial
-espduino.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-espduino.menu.Debug.Serial1=Serial1
-espduino.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-espduino.menu.DebugLevel.None____=None
-espduino.menu.DebugLevel.None____.build.debug_level=
-espduino.menu.DebugLevel.SSL=SSL
-espduino.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-espduino.menu.DebugLevel.TLS_MEM=TLS_MEM
-espduino.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-espduino.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-espduino.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-espduino.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-espduino.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-espduino.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-espduino.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-espduino.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-espduino.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-espduino.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-espduino.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espduino.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-espduino.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-espduino.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-espduino.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espduino.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.CORE=CORE
-espduino.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-espduino.menu.DebugLevel.WIFI=WIFI
-espduino.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-espduino.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-espduino.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-espduino.menu.DebugLevel.UPDATER=UPDATER
-espduino.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-espduino.menu.DebugLevel.OTA=OTA
-espduino.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-espduino.menu.DebugLevel.OOM=OOM
-espduino.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-espduino.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-espduino.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-espduino.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-espduino.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-espduino.menu.FlashErase.none=Only Sketch
-espduino.menu.FlashErase.none.upload.erase_cmd=
-espduino.menu.FlashErase.sdk=Sketch + WiFi Settings
-espduino.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-espduino.menu.FlashErase.all=All Flash Contents
-espduino.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-espduino.menu.UploadSpeed.115200=115200
-espduino.menu.UploadSpeed.115200.upload.speed=115200
-espduino.menu.UploadSpeed.9600=9600
-espduino.menu.UploadSpeed.9600.upload.speed=9600
-espduino.menu.UploadSpeed.57600=57600
-espduino.menu.UploadSpeed.57600.upload.speed=57600
-espduino.menu.UploadSpeed.230400.linux=230400
-espduino.menu.UploadSpeed.230400.macosx=230400
-espduino.menu.UploadSpeed.230400.upload.speed=230400
-espduino.menu.UploadSpeed.256000.windows=256000
-espduino.menu.UploadSpeed.256000.upload.speed=256000
-espduino.menu.UploadSpeed.460800.linux=460800
-espduino.menu.UploadSpeed.460800.macosx=460800
-espduino.menu.UploadSpeed.460800.upload.speed=460800
-espduino.menu.UploadSpeed.512000.windows=512000
-espduino.menu.UploadSpeed.512000.upload.speed=512000
-espduino.menu.UploadSpeed.921600=921600
-espduino.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-huzzah.name=Adafruit Feather HUZZAH ESP8266
-huzzah.build.board=ESP8266_ESP12
-huzzah.build.variant=adafruit
-huzzah.upload.tool=esptool
-huzzah.upload.maximum_data_size=81920
-huzzah.upload.wait_for_upload_port=true
-huzzah.upload.erase_cmd=
-huzzah.serial.disableDTR=true
-huzzah.serial.disableRTS=true
-huzzah.build.mcu=esp8266
-huzzah.build.core=esp8266
-huzzah.build.spiffs_pagesize=256
-huzzah.build.debug_port=
-huzzah.build.debug_level=
-huzzah.menu.CpuFrequency.80=80 MHz
-huzzah.menu.CpuFrequency.80.build.f_cpu=80000000L
-huzzah.menu.CpuFrequency.160=160 MHz
-huzzah.menu.CpuFrequency.160.build.f_cpu=160000000L
-huzzah.upload.resetmethod=nodemcu
-huzzah.build.flash_mode=qio
-huzzah.build.flash_freq=40
-huzzah.menu.FlashSize.4M1M=4M (1M SPIFFS)
-huzzah.menu.FlashSize.4M1M.build.flash_size=4M
-huzzah.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-huzzah.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-huzzah.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-huzzah.menu.FlashSize.4M1M.upload.maximum_size=1044464
-huzzah.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-huzzah.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-huzzah.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-huzzah.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-huzzah.menu.FlashSize.4M3M=4M (3M SPIFFS)
-huzzah.menu.FlashSize.4M3M.build.flash_size=4M
-huzzah.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-huzzah.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-huzzah.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-huzzah.menu.FlashSize.4M3M.upload.maximum_size=1044464
-huzzah.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-huzzah.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-huzzah.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-huzzah.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-huzzah.menu.LwIPVariant.v2mss536=v2 Lower Memory
-huzzah.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-huzzah.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-huzzah.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-huzzah.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-huzzah.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-huzzah.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-huzzah.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-huzzah.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-huzzah.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-huzzah.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-huzzah.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-huzzah.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-huzzah.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-huzzah.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-huzzah.menu.Debug.Disabled=Disabled
-huzzah.menu.Debug.Disabled.build.debug_port=
-huzzah.menu.Debug.Serial=Serial
-huzzah.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-huzzah.menu.Debug.Serial1=Serial1
-huzzah.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-huzzah.menu.DebugLevel.None____=None
-huzzah.menu.DebugLevel.None____.build.debug_level=
-huzzah.menu.DebugLevel.SSL=SSL
-huzzah.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-huzzah.menu.DebugLevel.TLS_MEM=TLS_MEM
-huzzah.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-huzzah.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-huzzah.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-huzzah.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-huzzah.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-huzzah.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-huzzah.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-huzzah.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-huzzah.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-huzzah.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-huzzah.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-huzzah.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-huzzah.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-huzzah.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-huzzah.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-huzzah.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.CORE=CORE
-huzzah.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-huzzah.menu.DebugLevel.WIFI=WIFI
-huzzah.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-huzzah.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-huzzah.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-huzzah.menu.DebugLevel.UPDATER=UPDATER
-huzzah.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-huzzah.menu.DebugLevel.OTA=OTA
-huzzah.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-huzzah.menu.DebugLevel.OOM=OOM
-huzzah.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-huzzah.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-huzzah.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-huzzah.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-huzzah.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-huzzah.menu.FlashErase.none=Only Sketch
-huzzah.menu.FlashErase.none.upload.erase_cmd=
-huzzah.menu.FlashErase.sdk=Sketch + WiFi Settings
-huzzah.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-huzzah.menu.FlashErase.all=All Flash Contents
-huzzah.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-huzzah.menu.UploadSpeed.115200=115200
-huzzah.menu.UploadSpeed.115200.upload.speed=115200
-huzzah.menu.UploadSpeed.9600=9600
-huzzah.menu.UploadSpeed.9600.upload.speed=9600
-huzzah.menu.UploadSpeed.57600=57600
-huzzah.menu.UploadSpeed.57600.upload.speed=57600
-huzzah.menu.UploadSpeed.230400.linux=230400
-huzzah.menu.UploadSpeed.230400.macosx=230400
-huzzah.menu.UploadSpeed.230400.upload.speed=230400
-huzzah.menu.UploadSpeed.256000.windows=256000
-huzzah.menu.UploadSpeed.256000.upload.speed=256000
-huzzah.menu.UploadSpeed.460800.linux=460800
-huzzah.menu.UploadSpeed.460800.macosx=460800
-huzzah.menu.UploadSpeed.460800.upload.speed=460800
-huzzah.menu.UploadSpeed.512000.windows=512000
-huzzah.menu.UploadSpeed.512000.upload.speed=512000
-huzzah.menu.UploadSpeed.921600=921600
-huzzah.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-espresso_lite_v1.name=ESPresso Lite 1.0
-espresso_lite_v1.build.board=ESP8266_ESPRESSO_LITE_V1
-espresso_lite_v1.build.variant=espresso_lite_v1
-espresso_lite_v1.upload.tool=esptool
-espresso_lite_v1.upload.maximum_data_size=81920
-espresso_lite_v1.upload.wait_for_upload_port=true
-espresso_lite_v1.upload.erase_cmd=
-espresso_lite_v1.serial.disableDTR=true
-espresso_lite_v1.serial.disableRTS=true
-espresso_lite_v1.build.mcu=esp8266
-espresso_lite_v1.build.core=esp8266
-espresso_lite_v1.build.spiffs_pagesize=256
-espresso_lite_v1.build.debug_port=
-espresso_lite_v1.build.debug_level=
-espresso_lite_v1.menu.CpuFrequency.80=80 MHz
-espresso_lite_v1.menu.CpuFrequency.80.build.f_cpu=80000000L
-espresso_lite_v1.menu.CpuFrequency.160=160 MHz
-espresso_lite_v1.menu.CpuFrequency.160.build.f_cpu=160000000L
-espresso_lite_v1.build.flash_mode=dio
-espresso_lite_v1.build.flash_freq=40
-espresso_lite_v1.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espresso_lite_v1.menu.FlashSize.4M1M.build.flash_size=4M
-espresso_lite_v1.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-espresso_lite_v1.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espresso_lite_v1.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espresso_lite_v1.menu.FlashSize.4M1M.upload.maximum_size=1044464
-espresso_lite_v1.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-espresso_lite_v1.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espresso_lite_v1.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espresso_lite_v1.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espresso_lite_v1.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espresso_lite_v1.menu.FlashSize.4M3M.build.flash_size=4M
-espresso_lite_v1.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-espresso_lite_v1.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espresso_lite_v1.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-espresso_lite_v1.menu.FlashSize.4M3M.upload.maximum_size=1044464
-espresso_lite_v1.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-espresso_lite_v1.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espresso_lite_v1.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espresso_lite_v1.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espresso_lite_v1.menu.ResetMethod.ck=ck
-espresso_lite_v1.menu.ResetMethod.ck.upload.resetmethod=ck
-espresso_lite_v1.menu.ResetMethod.nodemcu=nodemcu
-espresso_lite_v1.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-espresso_lite_v1.menu.LwIPVariant.v2mss536=v2 Lower Memory
-espresso_lite_v1.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-espresso_lite_v1.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-espresso_lite_v1.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-espresso_lite_v1.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-espresso_lite_v1.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-espresso_lite_v1.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-espresso_lite_v1.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-espresso_lite_v1.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-espresso_lite_v1.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-espresso_lite_v1.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-espresso_lite_v1.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-espresso_lite_v1.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-espresso_lite_v1.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-espresso_lite_v1.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-espresso_lite_v1.menu.Debug.Disabled=Disabled
-espresso_lite_v1.menu.Debug.Disabled.build.debug_port=
-espresso_lite_v1.menu.Debug.Serial=Serial
-espresso_lite_v1.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-espresso_lite_v1.menu.Debug.Serial1=Serial1
-espresso_lite_v1.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-espresso_lite_v1.menu.DebugLevel.None____=None
-espresso_lite_v1.menu.DebugLevel.None____.build.debug_level=
-espresso_lite_v1.menu.DebugLevel.SSL=SSL
-espresso_lite_v1.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-espresso_lite_v1.menu.DebugLevel.TLS_MEM=TLS_MEM
-espresso_lite_v1.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-espresso_lite_v1.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-espresso_lite_v1.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.CORE=CORE
-espresso_lite_v1.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-espresso_lite_v1.menu.DebugLevel.WIFI=WIFI
-espresso_lite_v1.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-espresso_lite_v1.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-espresso_lite_v1.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-espresso_lite_v1.menu.DebugLevel.UPDATER=UPDATER
-espresso_lite_v1.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-espresso_lite_v1.menu.DebugLevel.OTA=OTA
-espresso_lite_v1.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-espresso_lite_v1.menu.DebugLevel.OOM=OOM
-espresso_lite_v1.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-espresso_lite_v1.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-espresso_lite_v1.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-espresso_lite_v1.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-espresso_lite_v1.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-espresso_lite_v1.menu.FlashErase.none=Only Sketch
-espresso_lite_v1.menu.FlashErase.none.upload.erase_cmd=
-espresso_lite_v1.menu.FlashErase.sdk=Sketch + WiFi Settings
-espresso_lite_v1.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-espresso_lite_v1.menu.FlashErase.all=All Flash Contents
-espresso_lite_v1.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-espresso_lite_v1.menu.UploadSpeed.115200=115200
-espresso_lite_v1.menu.UploadSpeed.115200.upload.speed=115200
-espresso_lite_v1.menu.UploadSpeed.9600=9600
-espresso_lite_v1.menu.UploadSpeed.9600.upload.speed=9600
-espresso_lite_v1.menu.UploadSpeed.57600=57600
-espresso_lite_v1.menu.UploadSpeed.57600.upload.speed=57600
-espresso_lite_v1.menu.UploadSpeed.230400.linux=230400
-espresso_lite_v1.menu.UploadSpeed.230400.macosx=230400
-espresso_lite_v1.menu.UploadSpeed.230400.upload.speed=230400
-espresso_lite_v1.menu.UploadSpeed.256000.windows=256000
-espresso_lite_v1.menu.UploadSpeed.256000.upload.speed=256000
-espresso_lite_v1.menu.UploadSpeed.460800.linux=460800
-espresso_lite_v1.menu.UploadSpeed.460800.macosx=460800
-espresso_lite_v1.menu.UploadSpeed.460800.upload.speed=460800
-espresso_lite_v1.menu.UploadSpeed.512000.windows=512000
-espresso_lite_v1.menu.UploadSpeed.512000.upload.speed=512000
-espresso_lite_v1.menu.UploadSpeed.921600=921600
-espresso_lite_v1.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-espresso_lite_v2.name=ESPresso Lite 2.0
-espresso_lite_v2.build.board=ESP8266_ESPRESSO_LITE_V2
-espresso_lite_v2.build.variant=espresso_lite_v2
-espresso_lite_v2.upload.tool=esptool
-espresso_lite_v2.upload.maximum_data_size=81920
-espresso_lite_v2.upload.wait_for_upload_port=true
-espresso_lite_v2.upload.erase_cmd=
-espresso_lite_v2.serial.disableDTR=true
-espresso_lite_v2.serial.disableRTS=true
-espresso_lite_v2.build.mcu=esp8266
-espresso_lite_v2.build.core=esp8266
-espresso_lite_v2.build.spiffs_pagesize=256
-espresso_lite_v2.build.debug_port=
-espresso_lite_v2.build.debug_level=
-espresso_lite_v2.menu.CpuFrequency.80=80 MHz
-espresso_lite_v2.menu.CpuFrequency.80.build.f_cpu=80000000L
-espresso_lite_v2.menu.CpuFrequency.160=160 MHz
-espresso_lite_v2.menu.CpuFrequency.160.build.f_cpu=160000000L
-espresso_lite_v2.build.flash_mode=dio
-espresso_lite_v2.build.flash_freq=40
-espresso_lite_v2.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espresso_lite_v2.menu.FlashSize.4M1M.build.flash_size=4M
-espresso_lite_v2.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-espresso_lite_v2.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espresso_lite_v2.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espresso_lite_v2.menu.FlashSize.4M1M.upload.maximum_size=1044464
-espresso_lite_v2.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-espresso_lite_v2.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espresso_lite_v2.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espresso_lite_v2.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espresso_lite_v2.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espresso_lite_v2.menu.FlashSize.4M3M.build.flash_size=4M
-espresso_lite_v2.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-espresso_lite_v2.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espresso_lite_v2.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-espresso_lite_v2.menu.FlashSize.4M3M.upload.maximum_size=1044464
-espresso_lite_v2.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-espresso_lite_v2.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espresso_lite_v2.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espresso_lite_v2.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espresso_lite_v2.menu.ResetMethod.ck=ck
-espresso_lite_v2.menu.ResetMethod.ck.upload.resetmethod=ck
-espresso_lite_v2.menu.ResetMethod.nodemcu=nodemcu
-espresso_lite_v2.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-espresso_lite_v2.menu.LwIPVariant.v2mss536=v2 Lower Memory
-espresso_lite_v2.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-espresso_lite_v2.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-espresso_lite_v2.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-espresso_lite_v2.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-espresso_lite_v2.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-espresso_lite_v2.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-espresso_lite_v2.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-espresso_lite_v2.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-espresso_lite_v2.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-espresso_lite_v2.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-espresso_lite_v2.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-espresso_lite_v2.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-espresso_lite_v2.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-espresso_lite_v2.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-espresso_lite_v2.menu.Debug.Disabled=Disabled
-espresso_lite_v2.menu.Debug.Disabled.build.debug_port=
-espresso_lite_v2.menu.Debug.Serial=Serial
-espresso_lite_v2.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-espresso_lite_v2.menu.Debug.Serial1=Serial1
-espresso_lite_v2.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-espresso_lite_v2.menu.DebugLevel.None____=None
-espresso_lite_v2.menu.DebugLevel.None____.build.debug_level=
-espresso_lite_v2.menu.DebugLevel.SSL=SSL
-espresso_lite_v2.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-espresso_lite_v2.menu.DebugLevel.TLS_MEM=TLS_MEM
-espresso_lite_v2.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-espresso_lite_v2.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-espresso_lite_v2.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.CORE=CORE
-espresso_lite_v2.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-espresso_lite_v2.menu.DebugLevel.WIFI=WIFI
-espresso_lite_v2.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-espresso_lite_v2.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-espresso_lite_v2.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-espresso_lite_v2.menu.DebugLevel.UPDATER=UPDATER
-espresso_lite_v2.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-espresso_lite_v2.menu.DebugLevel.OTA=OTA
-espresso_lite_v2.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-espresso_lite_v2.menu.DebugLevel.OOM=OOM
-espresso_lite_v2.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-espresso_lite_v2.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-espresso_lite_v2.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-espresso_lite_v2.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-espresso_lite_v2.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-espresso_lite_v2.menu.FlashErase.none=Only Sketch
-espresso_lite_v2.menu.FlashErase.none.upload.erase_cmd=
-espresso_lite_v2.menu.FlashErase.sdk=Sketch + WiFi Settings
-espresso_lite_v2.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-espresso_lite_v2.menu.FlashErase.all=All Flash Contents
-espresso_lite_v2.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-espresso_lite_v2.menu.UploadSpeed.115200=115200
-espresso_lite_v2.menu.UploadSpeed.115200.upload.speed=115200
-espresso_lite_v2.menu.UploadSpeed.9600=9600
-espresso_lite_v2.menu.UploadSpeed.9600.upload.speed=9600
-espresso_lite_v2.menu.UploadSpeed.57600=57600
-espresso_lite_v2.menu.UploadSpeed.57600.upload.speed=57600
-espresso_lite_v2.menu.UploadSpeed.230400.linux=230400
-espresso_lite_v2.menu.UploadSpeed.230400.macosx=230400
-espresso_lite_v2.menu.UploadSpeed.230400.upload.speed=230400
-espresso_lite_v2.menu.UploadSpeed.256000.windows=256000
-espresso_lite_v2.menu.UploadSpeed.256000.upload.speed=256000
-espresso_lite_v2.menu.UploadSpeed.460800.linux=460800
-espresso_lite_v2.menu.UploadSpeed.460800.macosx=460800
-espresso_lite_v2.menu.UploadSpeed.460800.upload.speed=460800
-espresso_lite_v2.menu.UploadSpeed.512000.windows=512000
-espresso_lite_v2.menu.UploadSpeed.512000.upload.speed=512000
-espresso_lite_v2.menu.UploadSpeed.921600=921600
-espresso_lite_v2.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-phoenix_v1.name=Phoenix 1.0
-phoenix_v1.build.board=ESP8266_PHOENIX_V1
-phoenix_v1.build.variant=phoenix_v1
-phoenix_v1.upload.tool=esptool
-phoenix_v1.upload.maximum_data_size=81920
-phoenix_v1.upload.wait_for_upload_port=true
-phoenix_v1.upload.erase_cmd=
-phoenix_v1.serial.disableDTR=true
-phoenix_v1.serial.disableRTS=true
-phoenix_v1.build.mcu=esp8266
-phoenix_v1.build.core=esp8266
-phoenix_v1.build.spiffs_pagesize=256
-phoenix_v1.build.debug_port=
-phoenix_v1.build.debug_level=
-phoenix_v1.menu.CpuFrequency.80=80 MHz
-phoenix_v1.menu.CpuFrequency.80.build.f_cpu=80000000L
-phoenix_v1.menu.CpuFrequency.160=160 MHz
-phoenix_v1.menu.CpuFrequency.160.build.f_cpu=160000000L
-phoenix_v1.build.flash_mode=dio
-phoenix_v1.build.flash_freq=40
-phoenix_v1.menu.FlashSize.4M1M=4M (1M SPIFFS)
-phoenix_v1.menu.FlashSize.4M1M.build.flash_size=4M
-phoenix_v1.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-phoenix_v1.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-phoenix_v1.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-phoenix_v1.menu.FlashSize.4M1M.upload.maximum_size=1044464
-phoenix_v1.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-phoenix_v1.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-phoenix_v1.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-phoenix_v1.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-phoenix_v1.menu.FlashSize.4M3M=4M (3M SPIFFS)
-phoenix_v1.menu.FlashSize.4M3M.build.flash_size=4M
-phoenix_v1.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-phoenix_v1.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-phoenix_v1.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-phoenix_v1.menu.FlashSize.4M3M.upload.maximum_size=1044464
-phoenix_v1.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-phoenix_v1.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-phoenix_v1.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-phoenix_v1.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-phoenix_v1.menu.ResetMethod.ck=ck
-phoenix_v1.menu.ResetMethod.ck.upload.resetmethod=ck
-phoenix_v1.menu.ResetMethod.nodemcu=nodemcu
-phoenix_v1.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-phoenix_v1.menu.LwIPVariant.v2mss536=v2 Lower Memory
-phoenix_v1.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-phoenix_v1.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-phoenix_v1.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-phoenix_v1.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-phoenix_v1.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-phoenix_v1.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-phoenix_v1.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-phoenix_v1.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-phoenix_v1.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-phoenix_v1.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-phoenix_v1.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-phoenix_v1.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-phoenix_v1.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-phoenix_v1.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-phoenix_v1.menu.Debug.Disabled=Disabled
-phoenix_v1.menu.Debug.Disabled.build.debug_port=
-phoenix_v1.menu.Debug.Serial=Serial
-phoenix_v1.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-phoenix_v1.menu.Debug.Serial1=Serial1
-phoenix_v1.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-phoenix_v1.menu.DebugLevel.None____=None
-phoenix_v1.menu.DebugLevel.None____.build.debug_level=
-phoenix_v1.menu.DebugLevel.SSL=SSL
-phoenix_v1.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-phoenix_v1.menu.DebugLevel.TLS_MEM=TLS_MEM
-phoenix_v1.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-phoenix_v1.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-phoenix_v1.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-phoenix_v1.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-phoenix_v1.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.CORE=CORE
-phoenix_v1.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-phoenix_v1.menu.DebugLevel.WIFI=WIFI
-phoenix_v1.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-phoenix_v1.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-phoenix_v1.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-phoenix_v1.menu.DebugLevel.UPDATER=UPDATER
-phoenix_v1.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-phoenix_v1.menu.DebugLevel.OTA=OTA
-phoenix_v1.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-phoenix_v1.menu.DebugLevel.OOM=OOM
-phoenix_v1.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-phoenix_v1.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-phoenix_v1.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-phoenix_v1.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-phoenix_v1.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-phoenix_v1.menu.FlashErase.none=Only Sketch
-phoenix_v1.menu.FlashErase.none.upload.erase_cmd=
-phoenix_v1.menu.FlashErase.sdk=Sketch + WiFi Settings
-phoenix_v1.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-phoenix_v1.menu.FlashErase.all=All Flash Contents
-phoenix_v1.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-phoenix_v1.menu.UploadSpeed.115200=115200
-phoenix_v1.menu.UploadSpeed.115200.upload.speed=115200
-phoenix_v1.menu.UploadSpeed.9600=9600
-phoenix_v1.menu.UploadSpeed.9600.upload.speed=9600
-phoenix_v1.menu.UploadSpeed.57600=57600
-phoenix_v1.menu.UploadSpeed.57600.upload.speed=57600
-phoenix_v1.menu.UploadSpeed.230400.linux=230400
-phoenix_v1.menu.UploadSpeed.230400.macosx=230400
-phoenix_v1.menu.UploadSpeed.230400.upload.speed=230400
-phoenix_v1.menu.UploadSpeed.256000.windows=256000
-phoenix_v1.menu.UploadSpeed.256000.upload.speed=256000
-phoenix_v1.menu.UploadSpeed.460800.linux=460800
-phoenix_v1.menu.UploadSpeed.460800.macosx=460800
-phoenix_v1.menu.UploadSpeed.460800.upload.speed=460800
-phoenix_v1.menu.UploadSpeed.512000.windows=512000
-phoenix_v1.menu.UploadSpeed.512000.upload.speed=512000
-phoenix_v1.menu.UploadSpeed.921600=921600
-phoenix_v1.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-phoenix_v2.name=Phoenix 2.0
-phoenix_v2.build.board=ESP8266_PHOENIX_V2
-phoenix_v2.build.variant=phoenix_v2
-phoenix_v2.upload.tool=esptool
-phoenix_v2.upload.maximum_data_size=81920
-phoenix_v2.upload.wait_for_upload_port=true
-phoenix_v2.upload.erase_cmd=
-phoenix_v2.serial.disableDTR=true
-phoenix_v2.serial.disableRTS=true
-phoenix_v2.build.mcu=esp8266
-phoenix_v2.build.core=esp8266
-phoenix_v2.build.spiffs_pagesize=256
-phoenix_v2.build.debug_port=
-phoenix_v2.build.debug_level=
-phoenix_v2.menu.CpuFrequency.80=80 MHz
-phoenix_v2.menu.CpuFrequency.80.build.f_cpu=80000000L
-phoenix_v2.menu.CpuFrequency.160=160 MHz
-phoenix_v2.menu.CpuFrequency.160.build.f_cpu=160000000L
-phoenix_v2.build.flash_mode=dio
-phoenix_v2.build.flash_freq=40
-phoenix_v2.menu.FlashSize.4M1M=4M (1M SPIFFS)
-phoenix_v2.menu.FlashSize.4M1M.build.flash_size=4M
-phoenix_v2.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-phoenix_v2.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-phoenix_v2.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-phoenix_v2.menu.FlashSize.4M1M.upload.maximum_size=1044464
-phoenix_v2.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-phoenix_v2.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-phoenix_v2.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-phoenix_v2.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-phoenix_v2.menu.FlashSize.4M3M=4M (3M SPIFFS)
-phoenix_v2.menu.FlashSize.4M3M.build.flash_size=4M
-phoenix_v2.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-phoenix_v2.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-phoenix_v2.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-phoenix_v2.menu.FlashSize.4M3M.upload.maximum_size=1044464
-phoenix_v2.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-phoenix_v2.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-phoenix_v2.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-phoenix_v2.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-phoenix_v2.menu.ResetMethod.ck=ck
-phoenix_v2.menu.ResetMethod.ck.upload.resetmethod=ck
-phoenix_v2.menu.ResetMethod.nodemcu=nodemcu
-phoenix_v2.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-phoenix_v2.menu.LwIPVariant.v2mss536=v2 Lower Memory
-phoenix_v2.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-phoenix_v2.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-phoenix_v2.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-phoenix_v2.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-phoenix_v2.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-phoenix_v2.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-phoenix_v2.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-phoenix_v2.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-phoenix_v2.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-phoenix_v2.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-phoenix_v2.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-phoenix_v2.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-phoenix_v2.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-phoenix_v2.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-phoenix_v2.menu.Debug.Disabled=Disabled
-phoenix_v2.menu.Debug.Disabled.build.debug_port=
-phoenix_v2.menu.Debug.Serial=Serial
-phoenix_v2.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-phoenix_v2.menu.Debug.Serial1=Serial1
-phoenix_v2.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-phoenix_v2.menu.DebugLevel.None____=None
-phoenix_v2.menu.DebugLevel.None____.build.debug_level=
-phoenix_v2.menu.DebugLevel.SSL=SSL
-phoenix_v2.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-phoenix_v2.menu.DebugLevel.TLS_MEM=TLS_MEM
-phoenix_v2.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-phoenix_v2.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-phoenix_v2.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-phoenix_v2.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-phoenix_v2.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.CORE=CORE
-phoenix_v2.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-phoenix_v2.menu.DebugLevel.WIFI=WIFI
-phoenix_v2.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-phoenix_v2.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-phoenix_v2.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-phoenix_v2.menu.DebugLevel.UPDATER=UPDATER
-phoenix_v2.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-phoenix_v2.menu.DebugLevel.OTA=OTA
-phoenix_v2.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-phoenix_v2.menu.DebugLevel.OOM=OOM
-phoenix_v2.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-phoenix_v2.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-phoenix_v2.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-phoenix_v2.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-phoenix_v2.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-phoenix_v2.menu.FlashErase.none=Only Sketch
-phoenix_v2.menu.FlashErase.none.upload.erase_cmd=
-phoenix_v2.menu.FlashErase.sdk=Sketch + WiFi Settings
-phoenix_v2.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-phoenix_v2.menu.FlashErase.all=All Flash Contents
-phoenix_v2.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-phoenix_v2.menu.UploadSpeed.115200=115200
-phoenix_v2.menu.UploadSpeed.115200.upload.speed=115200
-phoenix_v2.menu.UploadSpeed.9600=9600
-phoenix_v2.menu.UploadSpeed.9600.upload.speed=9600
-phoenix_v2.menu.UploadSpeed.57600=57600
-phoenix_v2.menu.UploadSpeed.57600.upload.speed=57600
-phoenix_v2.menu.UploadSpeed.230400.linux=230400
-phoenix_v2.menu.UploadSpeed.230400.macosx=230400
-phoenix_v2.menu.UploadSpeed.230400.upload.speed=230400
-phoenix_v2.menu.UploadSpeed.256000.windows=256000
-phoenix_v2.menu.UploadSpeed.256000.upload.speed=256000
-phoenix_v2.menu.UploadSpeed.460800.linux=460800
-phoenix_v2.menu.UploadSpeed.460800.macosx=460800
-phoenix_v2.menu.UploadSpeed.460800.upload.speed=460800
-phoenix_v2.menu.UploadSpeed.512000.windows=512000
-phoenix_v2.menu.UploadSpeed.512000.upload.speed=512000
-phoenix_v2.menu.UploadSpeed.921600=921600
-phoenix_v2.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-nodemcu.name=NodeMCU 0.9 (ESP-12 Module)
-nodemcu.build.board=ESP8266_NODEMCU
-nodemcu.build.variant=nodemcu
-nodemcu.upload.tool=esptool
-nodemcu.upload.maximum_data_size=81920
-nodemcu.upload.wait_for_upload_port=true
-nodemcu.upload.erase_cmd=
-nodemcu.serial.disableDTR=true
-nodemcu.serial.disableRTS=true
-nodemcu.build.mcu=esp8266
-nodemcu.build.core=esp8266
-nodemcu.build.spiffs_pagesize=256
-nodemcu.build.debug_port=
-nodemcu.build.debug_level=
-nodemcu.menu.CpuFrequency.80=80 MHz
-nodemcu.menu.CpuFrequency.80.build.f_cpu=80000000L
-nodemcu.menu.CpuFrequency.160=160 MHz
-nodemcu.menu.CpuFrequency.160.build.f_cpu=160000000L
-nodemcu.upload.resetmethod=nodemcu
-nodemcu.build.flash_mode=qio
-nodemcu.build.flash_freq=40
-nodemcu.menu.FlashSize.4M1M=4M (1M SPIFFS)
-nodemcu.menu.FlashSize.4M1M.build.flash_size=4M
-nodemcu.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-nodemcu.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-nodemcu.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-nodemcu.menu.FlashSize.4M1M.upload.maximum_size=1044464
-nodemcu.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-nodemcu.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-nodemcu.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-nodemcu.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-nodemcu.menu.FlashSize.4M3M=4M (3M SPIFFS)
-nodemcu.menu.FlashSize.4M3M.build.flash_size=4M
-nodemcu.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-nodemcu.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-nodemcu.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-nodemcu.menu.FlashSize.4M3M.upload.maximum_size=1044464
-nodemcu.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-nodemcu.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-nodemcu.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-nodemcu.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-nodemcu.menu.LwIPVariant.v2mss536=v2 Lower Memory
-nodemcu.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-nodemcu.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-nodemcu.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-nodemcu.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-nodemcu.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-nodemcu.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-nodemcu.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-nodemcu.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-nodemcu.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-nodemcu.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-nodemcu.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-nodemcu.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-nodemcu.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-nodemcu.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-nodemcu.menu.Debug.Disabled=Disabled
-nodemcu.menu.Debug.Disabled.build.debug_port=
-nodemcu.menu.Debug.Serial=Serial
-nodemcu.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-nodemcu.menu.Debug.Serial1=Serial1
-nodemcu.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-nodemcu.menu.DebugLevel.None____=None
-nodemcu.menu.DebugLevel.None____.build.debug_level=
-nodemcu.menu.DebugLevel.SSL=SSL
-nodemcu.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-nodemcu.menu.DebugLevel.TLS_MEM=TLS_MEM
-nodemcu.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-nodemcu.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-nodemcu.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-nodemcu.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-nodemcu.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-nodemcu.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-nodemcu.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-nodemcu.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-nodemcu.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-nodemcu.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-nodemcu.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-nodemcu.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-nodemcu.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-nodemcu.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.CORE=CORE
-nodemcu.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-nodemcu.menu.DebugLevel.WIFI=WIFI
-nodemcu.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-nodemcu.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-nodemcu.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-nodemcu.menu.DebugLevel.UPDATER=UPDATER
-nodemcu.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-nodemcu.menu.DebugLevel.OTA=OTA
-nodemcu.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-nodemcu.menu.DebugLevel.OOM=OOM
-nodemcu.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-nodemcu.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-nodemcu.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-nodemcu.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-nodemcu.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-nodemcu.menu.FlashErase.none=Only Sketch
-nodemcu.menu.FlashErase.none.upload.erase_cmd=
-nodemcu.menu.FlashErase.sdk=Sketch + WiFi Settings
-nodemcu.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-nodemcu.menu.FlashErase.all=All Flash Contents
-nodemcu.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-nodemcu.menu.UploadSpeed.115200=115200
-nodemcu.menu.UploadSpeed.115200.upload.speed=115200
-nodemcu.menu.UploadSpeed.9600=9600
-nodemcu.menu.UploadSpeed.9600.upload.speed=9600
-nodemcu.menu.UploadSpeed.57600=57600
-nodemcu.menu.UploadSpeed.57600.upload.speed=57600
-nodemcu.menu.UploadSpeed.230400.linux=230400
-nodemcu.menu.UploadSpeed.230400.macosx=230400
-nodemcu.menu.UploadSpeed.230400.upload.speed=230400
-nodemcu.menu.UploadSpeed.256000.windows=256000
-nodemcu.menu.UploadSpeed.256000.upload.speed=256000
-nodemcu.menu.UploadSpeed.460800.linux=460800
-nodemcu.menu.UploadSpeed.460800.macosx=460800
-nodemcu.menu.UploadSpeed.460800.upload.speed=460800
-nodemcu.menu.UploadSpeed.512000.windows=512000
-nodemcu.menu.UploadSpeed.512000.upload.speed=512000
-nodemcu.menu.UploadSpeed.921600=921600
-nodemcu.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-nodemcuv2.name=NodeMCU 1.0 (ESP-12E Module)
-nodemcuv2.build.board=ESP8266_NODEMCU
-nodemcuv2.build.variant=nodemcu
-nodemcuv2.upload.tool=esptool
-nodemcuv2.upload.maximum_data_size=81920
-nodemcuv2.upload.wait_for_upload_port=true
-nodemcuv2.upload.erase_cmd=
-nodemcuv2.serial.disableDTR=true
-nodemcuv2.serial.disableRTS=true
-nodemcuv2.build.mcu=esp8266
-nodemcuv2.build.core=esp8266
-nodemcuv2.build.spiffs_pagesize=256
-nodemcuv2.build.debug_port=
-nodemcuv2.build.debug_level=
-nodemcuv2.menu.CpuFrequency.80=80 MHz
-nodemcuv2.menu.CpuFrequency.80.build.f_cpu=80000000L
-nodemcuv2.menu.CpuFrequency.160=160 MHz
-nodemcuv2.menu.CpuFrequency.160.build.f_cpu=160000000L
-nodemcuv2.upload.resetmethod=nodemcu
-nodemcuv2.build.flash_mode=dio
-nodemcuv2.build.flash_freq=40
-nodemcuv2.menu.FlashSize.4M1M=4M (1M SPIFFS)
-nodemcuv2.menu.FlashSize.4M1M.build.flash_size=4M
-nodemcuv2.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-nodemcuv2.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-nodemcuv2.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-nodemcuv2.menu.FlashSize.4M1M.upload.maximum_size=1044464
-nodemcuv2.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-nodemcuv2.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-nodemcuv2.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-nodemcuv2.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-nodemcuv2.menu.FlashSize.4M3M=4M (3M SPIFFS)
-nodemcuv2.menu.FlashSize.4M3M.build.flash_size=4M
-nodemcuv2.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-nodemcuv2.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-nodemcuv2.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-nodemcuv2.menu.FlashSize.4M3M.upload.maximum_size=1044464
-nodemcuv2.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-nodemcuv2.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-nodemcuv2.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-nodemcuv2.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-nodemcuv2.menu.LwIPVariant.v2mss536=v2 Lower Memory
-nodemcuv2.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-nodemcuv2.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-nodemcuv2.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-nodemcuv2.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-nodemcuv2.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-nodemcuv2.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-nodemcuv2.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-nodemcuv2.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-nodemcuv2.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-nodemcuv2.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-nodemcuv2.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-nodemcuv2.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-nodemcuv2.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-nodemcuv2.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-nodemcuv2.menu.Debug.Disabled=Disabled
-nodemcuv2.menu.Debug.Disabled.build.debug_port=
-nodemcuv2.menu.Debug.Serial=Serial
-nodemcuv2.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-nodemcuv2.menu.Debug.Serial1=Serial1
-nodemcuv2.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-nodemcuv2.menu.DebugLevel.None____=None
-nodemcuv2.menu.DebugLevel.None____.build.debug_level=
-nodemcuv2.menu.DebugLevel.SSL=SSL
-nodemcuv2.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-nodemcuv2.menu.DebugLevel.TLS_MEM=TLS_MEM
-nodemcuv2.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-nodemcuv2.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-nodemcuv2.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-nodemcuv2.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-nodemcuv2.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.CORE=CORE
-nodemcuv2.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-nodemcuv2.menu.DebugLevel.WIFI=WIFI
-nodemcuv2.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-nodemcuv2.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-nodemcuv2.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-nodemcuv2.menu.DebugLevel.UPDATER=UPDATER
-nodemcuv2.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-nodemcuv2.menu.DebugLevel.OTA=OTA
-nodemcuv2.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-nodemcuv2.menu.DebugLevel.OOM=OOM
-nodemcuv2.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-nodemcuv2.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-nodemcuv2.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-nodemcuv2.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-nodemcuv2.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-nodemcuv2.menu.FlashErase.none=Only Sketch
-nodemcuv2.menu.FlashErase.none.upload.erase_cmd=
-nodemcuv2.menu.FlashErase.sdk=Sketch + WiFi Settings
-nodemcuv2.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-nodemcuv2.menu.FlashErase.all=All Flash Contents
-nodemcuv2.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-nodemcuv2.menu.UploadSpeed.115200=115200
-nodemcuv2.menu.UploadSpeed.115200.upload.speed=115200
-nodemcuv2.menu.UploadSpeed.9600=9600
-nodemcuv2.menu.UploadSpeed.9600.upload.speed=9600
-nodemcuv2.menu.UploadSpeed.57600=57600
-nodemcuv2.menu.UploadSpeed.57600.upload.speed=57600
-nodemcuv2.menu.UploadSpeed.230400.linux=230400
-nodemcuv2.menu.UploadSpeed.230400.macosx=230400
-nodemcuv2.menu.UploadSpeed.230400.upload.speed=230400
-nodemcuv2.menu.UploadSpeed.256000.windows=256000
-nodemcuv2.menu.UploadSpeed.256000.upload.speed=256000
-nodemcuv2.menu.UploadSpeed.460800.linux=460800
-nodemcuv2.menu.UploadSpeed.460800.macosx=460800
-nodemcuv2.menu.UploadSpeed.460800.upload.speed=460800
-nodemcuv2.menu.UploadSpeed.512000.windows=512000
-nodemcuv2.menu.UploadSpeed.512000.upload.speed=512000
-nodemcuv2.menu.UploadSpeed.921600=921600
-nodemcuv2.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-modwifi.name=Olimex MOD-WIFI-ESP8266(-DEV)
-modwifi.build.board=MOD_WIFI_ESP8266
-modwifi.upload.tool=esptool
-modwifi.upload.maximum_data_size=81920
-modwifi.upload.wait_for_upload_port=true
-modwifi.upload.erase_cmd=
-modwifi.serial.disableDTR=true
-modwifi.serial.disableRTS=true
-modwifi.build.mcu=esp8266
-modwifi.build.core=esp8266
-modwifi.build.variant=generic
-modwifi.build.spiffs_pagesize=256
-modwifi.build.debug_port=
-modwifi.build.debug_level=
-modwifi.menu.CpuFrequency.80=80 MHz
-modwifi.menu.CpuFrequency.80.build.f_cpu=80000000L
-modwifi.menu.CpuFrequency.160=160 MHz
-modwifi.menu.CpuFrequency.160.build.f_cpu=160000000L
-modwifi.upload.resetmethod=ck
-modwifi.build.flash_mode=qio
-modwifi.build.flash_freq=40
-modwifi.menu.FlashSize.2M=2M (1M SPIFFS)
-modwifi.menu.FlashSize.2M.build.flash_size=2M
-modwifi.menu.FlashSize.2M.build.flash_size_bytes=0x200000
-modwifi.menu.FlashSize.2M.build.flash_ld=eagle.flash.2m.ld
-modwifi.menu.FlashSize.2M.build.spiffs_pagesize=256
-modwifi.menu.FlashSize.2M.upload.maximum_size=1044464
-modwifi.menu.FlashSize.2M.build.rfcal_addr=0x1FC000
-modwifi.menu.FlashSize.2M.build.spiffs_start=0x100000
-modwifi.menu.FlashSize.2M.build.spiffs_end=0x1FB000
-modwifi.menu.FlashSize.2M.build.spiffs_blocksize=8192
-modwifi.menu.LwIPVariant.v2mss536=v2 Lower Memory
-modwifi.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-modwifi.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-modwifi.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-modwifi.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-modwifi.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-modwifi.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-modwifi.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-modwifi.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-modwifi.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-modwifi.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-modwifi.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-modwifi.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-modwifi.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-modwifi.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-modwifi.menu.Debug.Disabled=Disabled
-modwifi.menu.Debug.Disabled.build.debug_port=
-modwifi.menu.Debug.Serial=Serial
-modwifi.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-modwifi.menu.Debug.Serial1=Serial1
-modwifi.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-modwifi.menu.DebugLevel.None____=None
-modwifi.menu.DebugLevel.None____.build.debug_level=
-modwifi.menu.DebugLevel.SSL=SSL
-modwifi.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-modwifi.menu.DebugLevel.TLS_MEM=TLS_MEM
-modwifi.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-modwifi.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-modwifi.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-modwifi.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-modwifi.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-modwifi.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-modwifi.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-modwifi.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-modwifi.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-modwifi.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-modwifi.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-modwifi.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-modwifi.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-modwifi.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-modwifi.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-modwifi.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.CORE=CORE
-modwifi.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-modwifi.menu.DebugLevel.WIFI=WIFI
-modwifi.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-modwifi.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-modwifi.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-modwifi.menu.DebugLevel.UPDATER=UPDATER
-modwifi.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-modwifi.menu.DebugLevel.OTA=OTA
-modwifi.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-modwifi.menu.DebugLevel.OOM=OOM
-modwifi.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-modwifi.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-modwifi.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-modwifi.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-modwifi.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-modwifi.menu.FlashErase.none=Only Sketch
-modwifi.menu.FlashErase.none.upload.erase_cmd=
-modwifi.menu.FlashErase.sdk=Sketch + WiFi Settings
-modwifi.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-modwifi.menu.FlashErase.all=All Flash Contents
-modwifi.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-modwifi.menu.UploadSpeed.115200=115200
-modwifi.menu.UploadSpeed.115200.upload.speed=115200
-modwifi.menu.UploadSpeed.9600=9600
-modwifi.menu.UploadSpeed.9600.upload.speed=9600
-modwifi.menu.UploadSpeed.57600=57600
-modwifi.menu.UploadSpeed.57600.upload.speed=57600
-modwifi.menu.UploadSpeed.230400.linux=230400
-modwifi.menu.UploadSpeed.230400.macosx=230400
-modwifi.menu.UploadSpeed.230400.upload.speed=230400
-modwifi.menu.UploadSpeed.256000.windows=256000
-modwifi.menu.UploadSpeed.256000.upload.speed=256000
-modwifi.menu.UploadSpeed.460800.linux=460800
-modwifi.menu.UploadSpeed.460800.macosx=460800
-modwifi.menu.UploadSpeed.460800.upload.speed=460800
-modwifi.menu.UploadSpeed.512000.windows=512000
-modwifi.menu.UploadSpeed.512000.upload.speed=512000
-modwifi.menu.UploadSpeed.921600=921600
-modwifi.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-thing.name=SparkFun ESP8266 Thing
-thing.build.board=ESP8266_THING
-thing.build.variant=thing
-thing.upload.tool=esptool
-thing.upload.maximum_data_size=81920
-thing.upload.wait_for_upload_port=true
-thing.upload.erase_cmd=
-thing.serial.disableDTR=true
-thing.serial.disableRTS=true
-thing.build.mcu=esp8266
-thing.build.core=esp8266
-thing.build.spiffs_pagesize=256
-thing.build.debug_port=
-thing.build.debug_level=
-thing.menu.CpuFrequency.80=80 MHz
-thing.menu.CpuFrequency.80.build.f_cpu=80000000L
-thing.menu.CpuFrequency.160=160 MHz
-thing.menu.CpuFrequency.160.build.f_cpu=160000000L
-thing.upload.resetmethod=ck
-thing.build.flash_mode=qio
-thing.build.flash_freq=40
-thing.menu.FlashSize.512K0=512K (no SPIFFS)
-thing.menu.FlashSize.512K0.build.flash_size=512K
-thing.menu.FlashSize.512K0.build.flash_size_bytes=0x80000
-thing.menu.FlashSize.512K0.build.flash_ld=eagle.flash.512k0.ld
-thing.menu.FlashSize.512K0.build.spiffs_pagesize=256
-thing.menu.FlashSize.512K0.upload.maximum_size=499696
-thing.menu.FlashSize.512K0.build.rfcal_addr=0x7C000
-thing.menu.FlashSize.512K64=512K (64K SPIFFS)
-thing.menu.FlashSize.512K64.build.flash_size=512K
-thing.menu.FlashSize.512K64.build.flash_size_bytes=0x80000
-thing.menu.FlashSize.512K64.build.flash_ld=eagle.flash.512k64.ld
-thing.menu.FlashSize.512K64.build.spiffs_pagesize=256
-thing.menu.FlashSize.512K64.upload.maximum_size=434160
-thing.menu.FlashSize.512K64.build.rfcal_addr=0x7C000
-thing.menu.FlashSize.512K64.build.spiffs_start=0x6B000
-thing.menu.FlashSize.512K64.build.spiffs_end=0x7B000
-thing.menu.FlashSize.512K64.build.spiffs_blocksize=4096
-thing.menu.FlashSize.512K128=512K (128K SPIFFS)
-thing.menu.FlashSize.512K128.build.flash_size=512K
-thing.menu.FlashSize.512K128.build.flash_size_bytes=0x80000
-thing.menu.FlashSize.512K128.build.flash_ld=eagle.flash.512k128.ld
-thing.menu.FlashSize.512K128.build.spiffs_pagesize=256
-thing.menu.FlashSize.512K128.upload.maximum_size=368624
-thing.menu.FlashSize.512K128.build.rfcal_addr=0x7C000
-thing.menu.FlashSize.512K128.build.spiffs_start=0x5B000
-thing.menu.FlashSize.512K128.build.spiffs_end=0x7B000
-thing.menu.FlashSize.512K128.build.spiffs_blocksize=4096
-thing.menu.LwIPVariant.v2mss536=v2 Lower Memory
-thing.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-thing.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-thing.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-thing.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-thing.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-thing.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-thing.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-thing.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-thing.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-thing.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-thing.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-thing.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-thing.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-thing.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-thing.menu.Debug.Disabled=Disabled
-thing.menu.Debug.Disabled.build.debug_port=
-thing.menu.Debug.Serial=Serial
-thing.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-thing.menu.Debug.Serial1=Serial1
-thing.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-thing.menu.DebugLevel.None____=None
-thing.menu.DebugLevel.None____.build.debug_level=
-thing.menu.DebugLevel.SSL=SSL
-thing.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-thing.menu.DebugLevel.TLS_MEM=TLS_MEM
-thing.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-thing.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-thing.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-thing.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-thing.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-thing.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-thing.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-thing.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-thing.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-thing.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-thing.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-thing.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-thing.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-thing.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-thing.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-thing.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.CORE=CORE
-thing.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-thing.menu.DebugLevel.WIFI=WIFI
-thing.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-thing.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-thing.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-thing.menu.DebugLevel.UPDATER=UPDATER
-thing.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-thing.menu.DebugLevel.OTA=OTA
-thing.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-thing.menu.DebugLevel.OOM=OOM
-thing.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-thing.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-thing.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-thing.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-thing.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-thing.menu.FlashErase.none=Only Sketch
-thing.menu.FlashErase.none.upload.erase_cmd=
-thing.menu.FlashErase.sdk=Sketch + WiFi Settings
-thing.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-thing.menu.FlashErase.all=All Flash Contents
-thing.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-thing.menu.UploadSpeed.115200=115200
-thing.menu.UploadSpeed.115200.upload.speed=115200
-thing.menu.UploadSpeed.9600=9600
-thing.menu.UploadSpeed.9600.upload.speed=9600
-thing.menu.UploadSpeed.57600=57600
-thing.menu.UploadSpeed.57600.upload.speed=57600
-thing.menu.UploadSpeed.230400.linux=230400
-thing.menu.UploadSpeed.230400.macosx=230400
-thing.menu.UploadSpeed.230400.upload.speed=230400
-thing.menu.UploadSpeed.256000.windows=256000
-thing.menu.UploadSpeed.256000.upload.speed=256000
-thing.menu.UploadSpeed.460800.linux=460800
-thing.menu.UploadSpeed.460800.macosx=460800
-thing.menu.UploadSpeed.460800.upload.speed=460800
-thing.menu.UploadSpeed.512000.windows=512000
-thing.menu.UploadSpeed.512000.upload.speed=512000
-thing.menu.UploadSpeed.921600=921600
-thing.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-thingdev.name=SparkFun ESP8266 Thing Dev
-thingdev.build.board=ESP8266_THING_DEV
-thingdev.build.variant=thing
-thingdev.upload.tool=esptool
-thingdev.upload.maximum_data_size=81920
-thingdev.upload.wait_for_upload_port=true
-thingdev.upload.erase_cmd=
-thingdev.serial.disableDTR=true
-thingdev.serial.disableRTS=true
-thingdev.build.mcu=esp8266
-thingdev.build.core=esp8266
-thingdev.build.spiffs_pagesize=256
-thingdev.build.debug_port=
-thingdev.build.debug_level=
-thingdev.menu.CpuFrequency.80=80 MHz
-thingdev.menu.CpuFrequency.80.build.f_cpu=80000000L
-thingdev.menu.CpuFrequency.160=160 MHz
-thingdev.menu.CpuFrequency.160.build.f_cpu=160000000L
-thingdev.upload.resetmethod=nodemcu
-thingdev.build.flash_mode=dio
-thingdev.build.flash_freq=40
-thingdev.menu.FlashSize.512K0=512K (no SPIFFS)
-thingdev.menu.FlashSize.512K0.build.flash_size=512K
-thingdev.menu.FlashSize.512K0.build.flash_size_bytes=0x80000
-thingdev.menu.FlashSize.512K0.build.flash_ld=eagle.flash.512k0.ld
-thingdev.menu.FlashSize.512K0.build.spiffs_pagesize=256
-thingdev.menu.FlashSize.512K0.upload.maximum_size=499696
-thingdev.menu.FlashSize.512K0.build.rfcal_addr=0x7C000
-thingdev.menu.FlashSize.512K64=512K (64K SPIFFS)
-thingdev.menu.FlashSize.512K64.build.flash_size=512K
-thingdev.menu.FlashSize.512K64.build.flash_size_bytes=0x80000
-thingdev.menu.FlashSize.512K64.build.flash_ld=eagle.flash.512k64.ld
-thingdev.menu.FlashSize.512K64.build.spiffs_pagesize=256
-thingdev.menu.FlashSize.512K64.upload.maximum_size=434160
-thingdev.menu.FlashSize.512K64.build.rfcal_addr=0x7C000
-thingdev.menu.FlashSize.512K64.build.spiffs_start=0x6B000
-thingdev.menu.FlashSize.512K64.build.spiffs_end=0x7B000
-thingdev.menu.FlashSize.512K64.build.spiffs_blocksize=4096
-thingdev.menu.FlashSize.512K128=512K (128K SPIFFS)
-thingdev.menu.FlashSize.512K128.build.flash_size=512K
-thingdev.menu.FlashSize.512K128.build.flash_size_bytes=0x80000
-thingdev.menu.FlashSize.512K128.build.flash_ld=eagle.flash.512k128.ld
-thingdev.menu.FlashSize.512K128.build.spiffs_pagesize=256
-thingdev.menu.FlashSize.512K128.upload.maximum_size=368624
-thingdev.menu.FlashSize.512K128.build.rfcal_addr=0x7C000
-thingdev.menu.FlashSize.512K128.build.spiffs_start=0x5B000
-thingdev.menu.FlashSize.512K128.build.spiffs_end=0x7B000
-thingdev.menu.FlashSize.512K128.build.spiffs_blocksize=4096
-thingdev.menu.LwIPVariant.v2mss536=v2 Lower Memory
-thingdev.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-thingdev.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-thingdev.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-thingdev.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-thingdev.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-thingdev.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-thingdev.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-thingdev.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-thingdev.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-thingdev.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-thingdev.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-thingdev.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-thingdev.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-thingdev.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-thingdev.menu.Debug.Disabled=Disabled
-thingdev.menu.Debug.Disabled.build.debug_port=
-thingdev.menu.Debug.Serial=Serial
-thingdev.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-thingdev.menu.Debug.Serial1=Serial1
-thingdev.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-thingdev.menu.DebugLevel.None____=None
-thingdev.menu.DebugLevel.None____.build.debug_level=
-thingdev.menu.DebugLevel.SSL=SSL
-thingdev.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-thingdev.menu.DebugLevel.TLS_MEM=TLS_MEM
-thingdev.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-thingdev.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-thingdev.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-thingdev.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-thingdev.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-thingdev.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-thingdev.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-thingdev.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-thingdev.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-thingdev.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-thingdev.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-thingdev.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-thingdev.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-thingdev.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-thingdev.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-thingdev.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.CORE=CORE
-thingdev.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-thingdev.menu.DebugLevel.WIFI=WIFI
-thingdev.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-thingdev.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-thingdev.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-thingdev.menu.DebugLevel.UPDATER=UPDATER
-thingdev.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-thingdev.menu.DebugLevel.OTA=OTA
-thingdev.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-thingdev.menu.DebugLevel.OOM=OOM
-thingdev.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-thingdev.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-thingdev.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-thingdev.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-thingdev.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-thingdev.menu.FlashErase.none=Only Sketch
-thingdev.menu.FlashErase.none.upload.erase_cmd=
-thingdev.menu.FlashErase.sdk=Sketch + WiFi Settings
-thingdev.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-thingdev.menu.FlashErase.all=All Flash Contents
-thingdev.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-thingdev.menu.UploadSpeed.115200=115200
-thingdev.menu.UploadSpeed.115200.upload.speed=115200
-thingdev.menu.UploadSpeed.9600=9600
-thingdev.menu.UploadSpeed.9600.upload.speed=9600
-thingdev.menu.UploadSpeed.57600=57600
-thingdev.menu.UploadSpeed.57600.upload.speed=57600
-thingdev.menu.UploadSpeed.230400.linux=230400
-thingdev.menu.UploadSpeed.230400.macosx=230400
-thingdev.menu.UploadSpeed.230400.upload.speed=230400
-thingdev.menu.UploadSpeed.256000.windows=256000
-thingdev.menu.UploadSpeed.256000.upload.speed=256000
-thingdev.menu.UploadSpeed.460800.linux=460800
-thingdev.menu.UploadSpeed.460800.macosx=460800
-thingdev.menu.UploadSpeed.460800.upload.speed=460800
-thingdev.menu.UploadSpeed.512000.windows=512000
-thingdev.menu.UploadSpeed.512000.upload.speed=512000
-thingdev.menu.UploadSpeed.921600=921600
-thingdev.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-esp210.name=SweetPea ESP-210
-esp210.build.board=ESP8266_ESP210
-esp210.upload.tool=esptool
-esp210.upload.maximum_data_size=81920
-esp210.upload.wait_for_upload_port=true
-esp210.upload.erase_cmd=
-esp210.serial.disableDTR=true
-esp210.serial.disableRTS=true
-esp210.build.mcu=esp8266
-esp210.build.core=esp8266
-esp210.build.variant=generic
-esp210.build.spiffs_pagesize=256
-esp210.build.debug_port=
-esp210.build.debug_level=
-esp210.menu.CpuFrequency.80=80 MHz
-esp210.menu.CpuFrequency.80.build.f_cpu=80000000L
-esp210.menu.CpuFrequency.160=160 MHz
-esp210.menu.CpuFrequency.160.build.f_cpu=160000000L
-esp210.upload.resetmethod=ck
-esp210.build.flash_mode=qio
-esp210.build.flash_freq=40
-esp210.menu.FlashSize.4M1M=4M (1M SPIFFS)
-esp210.menu.FlashSize.4M1M.build.flash_size=4M
-esp210.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-esp210.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-esp210.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-esp210.menu.FlashSize.4M1M.upload.maximum_size=1044464
-esp210.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-esp210.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-esp210.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-esp210.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-esp210.menu.FlashSize.4M3M=4M (3M SPIFFS)
-esp210.menu.FlashSize.4M3M.build.flash_size=4M
-esp210.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-esp210.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-esp210.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-esp210.menu.FlashSize.4M3M.upload.maximum_size=1044464
-esp210.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-esp210.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-esp210.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-esp210.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-esp210.menu.LwIPVariant.v2mss536=v2 Lower Memory
-esp210.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-esp210.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-esp210.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-esp210.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-esp210.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-esp210.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-esp210.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-esp210.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-esp210.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-esp210.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-esp210.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-esp210.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-esp210.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-esp210.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-esp210.menu.Debug.Disabled=Disabled
-esp210.menu.Debug.Disabled.build.debug_port=
-esp210.menu.Debug.Serial=Serial
-esp210.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-esp210.menu.Debug.Serial1=Serial1
-esp210.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-esp210.menu.DebugLevel.None____=None
-esp210.menu.DebugLevel.None____.build.debug_level=
-esp210.menu.DebugLevel.SSL=SSL
-esp210.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-esp210.menu.DebugLevel.TLS_MEM=TLS_MEM
-esp210.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-esp210.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-esp210.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-esp210.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-esp210.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-esp210.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-esp210.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-esp210.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-esp210.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-esp210.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-esp210.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-esp210.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-esp210.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-esp210.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-esp210.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-esp210.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.CORE=CORE
-esp210.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-esp210.menu.DebugLevel.WIFI=WIFI
-esp210.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-esp210.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-esp210.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-esp210.menu.DebugLevel.UPDATER=UPDATER
-esp210.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-esp210.menu.DebugLevel.OTA=OTA
-esp210.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-esp210.menu.DebugLevel.OOM=OOM
-esp210.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-esp210.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-esp210.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-esp210.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-esp210.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-esp210.menu.FlashErase.none=Only Sketch
-esp210.menu.FlashErase.none.upload.erase_cmd=
-esp210.menu.FlashErase.sdk=Sketch + WiFi Settings
-esp210.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-esp210.menu.FlashErase.all=All Flash Contents
-esp210.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-esp210.menu.UploadSpeed.57600=57600
-esp210.menu.UploadSpeed.57600.upload.speed=57600
-esp210.menu.UploadSpeed.9600=9600
-esp210.menu.UploadSpeed.9600.upload.speed=9600
-esp210.menu.UploadSpeed.115200=115200
-esp210.menu.UploadSpeed.115200.upload.speed=115200
-esp210.menu.UploadSpeed.230400.linux=230400
-esp210.menu.UploadSpeed.230400.macosx=230400
-esp210.menu.UploadSpeed.230400.upload.speed=230400
-esp210.menu.UploadSpeed.256000.windows=256000
-esp210.menu.UploadSpeed.256000.upload.speed=256000
-esp210.menu.UploadSpeed.460800.linux=460800
-esp210.menu.UploadSpeed.460800.macosx=460800
-esp210.menu.UploadSpeed.460800.upload.speed=460800
-esp210.menu.UploadSpeed.512000.windows=512000
-esp210.menu.UploadSpeed.512000.upload.speed=512000
-esp210.menu.UploadSpeed.921600=921600
-esp210.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-d1_mini.name=WeMos D1 R2 & mini
-d1_mini.build.board=ESP8266_WEMOS_D1MINI
-d1_mini.build.variant=d1_mini
-d1_mini.upload.tool=esptool
-d1_mini.upload.maximum_data_size=81920
-d1_mini.upload.wait_for_upload_port=true
-d1_mini.upload.erase_cmd=
-d1_mini.serial.disableDTR=true
-d1_mini.serial.disableRTS=true
-d1_mini.build.mcu=esp8266
-d1_mini.build.core=esp8266
-d1_mini.build.spiffs_pagesize=256
-d1_mini.build.debug_port=
-d1_mini.build.debug_level=
-d1_mini.menu.CpuFrequency.80=80 MHz
-d1_mini.menu.CpuFrequency.80.build.f_cpu=80000000L
-d1_mini.menu.CpuFrequency.160=160 MHz
-d1_mini.menu.CpuFrequency.160.build.f_cpu=160000000L
-d1_mini.upload.resetmethod=nodemcu
-d1_mini.build.flash_mode=dio
-d1_mini.build.flash_freq=40
-d1_mini.menu.FlashSize.4M1M=4M (1M SPIFFS)
-d1_mini.menu.FlashSize.4M1M.build.flash_size=4M
-d1_mini.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-d1_mini.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-d1_mini.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-d1_mini.menu.FlashSize.4M1M.upload.maximum_size=1044464
-d1_mini.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-d1_mini.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-d1_mini.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-d1_mini.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-d1_mini.menu.FlashSize.4M3M=4M (3M SPIFFS)
-d1_mini.menu.FlashSize.4M3M.build.flash_size=4M
-d1_mini.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-d1_mini.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-d1_mini.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-d1_mini.menu.FlashSize.4M3M.upload.maximum_size=1044464
-d1_mini.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-d1_mini.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-d1_mini.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-d1_mini.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-d1_mini.menu.LwIPVariant.v2mss536=v2 Lower Memory
-d1_mini.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-d1_mini.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-d1_mini.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-d1_mini.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-d1_mini.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-d1_mini.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-d1_mini.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-d1_mini.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-d1_mini.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-d1_mini.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-d1_mini.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-d1_mini.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-d1_mini.menu.Debug.Disabled=Disabled
-d1_mini.menu.Debug.Disabled.build.debug_port=
-d1_mini.menu.Debug.Serial=Serial
-d1_mini.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-d1_mini.menu.Debug.Serial1=Serial1
-d1_mini.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-d1_mini.menu.DebugLevel.None____=None
-d1_mini.menu.DebugLevel.None____.build.debug_level=
-d1_mini.menu.DebugLevel.SSL=SSL
-d1_mini.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-d1_mini.menu.DebugLevel.TLS_MEM=TLS_MEM
-d1_mini.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-d1_mini.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-d1_mini.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-d1_mini.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-d1_mini.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-d1_mini.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-d1_mini.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-d1_mini.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-d1_mini.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-d1_mini.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1_mini.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-d1_mini.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-d1_mini.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1_mini.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.CORE=CORE
-d1_mini.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-d1_mini.menu.DebugLevel.WIFI=WIFI
-d1_mini.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-d1_mini.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-d1_mini.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-d1_mini.menu.DebugLevel.UPDATER=UPDATER
-d1_mini.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-d1_mini.menu.DebugLevel.OTA=OTA
-d1_mini.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-d1_mini.menu.DebugLevel.OOM=OOM
-d1_mini.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-d1_mini.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-d1_mini.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-d1_mini.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-d1_mini.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-d1_mini.menu.FlashErase.none=Only Sketch
-d1_mini.menu.FlashErase.none.upload.erase_cmd=
-d1_mini.menu.FlashErase.sdk=Sketch + WiFi Settings
-d1_mini.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-d1_mini.menu.FlashErase.all=All Flash Contents
-d1_mini.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-d1_mini.menu.UploadSpeed.921600=921600
-d1_mini.menu.UploadSpeed.921600.upload.speed=921600
-d1_mini.menu.UploadSpeed.9600=9600
-d1_mini.menu.UploadSpeed.9600.upload.speed=9600
-d1_mini.menu.UploadSpeed.57600=57600
-d1_mini.menu.UploadSpeed.57600.upload.speed=57600
-d1_mini.menu.UploadSpeed.115200=115200
-d1_mini.menu.UploadSpeed.115200.upload.speed=115200
-d1_mini.menu.UploadSpeed.230400.linux=230400
-d1_mini.menu.UploadSpeed.230400.macosx=230400
-d1_mini.menu.UploadSpeed.230400.upload.speed=230400
-d1_mini.menu.UploadSpeed.256000.windows=256000
-d1_mini.menu.UploadSpeed.256000.upload.speed=256000
-d1_mini.menu.UploadSpeed.460800.linux=460800
-d1_mini.menu.UploadSpeed.460800.macosx=460800
-d1_mini.menu.UploadSpeed.460800.upload.speed=460800
-d1_mini.menu.UploadSpeed.512000.windows=512000
-d1_mini.menu.UploadSpeed.512000.upload.speed=512000
-
-##############################################################
-d1_mini_pro.name=WeMos D1 mini Pro
-d1_mini_pro.build.board=ESP8266_WEMOS_D1MINIPRO
-d1_mini_pro.build.variant=d1_mini
-d1_mini_pro.upload.tool=esptool
-d1_mini_pro.upload.maximum_data_size=81920
-d1_mini_pro.upload.wait_for_upload_port=true
-d1_mini_pro.upload.erase_cmd=
-d1_mini_pro.serial.disableDTR=true
-d1_mini_pro.serial.disableRTS=true
-d1_mini_pro.build.mcu=esp8266
-d1_mini_pro.build.core=esp8266
-d1_mini_pro.build.spiffs_pagesize=256
-d1_mini_pro.build.debug_port=
-d1_mini_pro.build.debug_level=
-d1_mini_pro.menu.CpuFrequency.80=80 MHz
-d1_mini_pro.menu.CpuFrequency.80.build.f_cpu=80000000L
-d1_mini_pro.menu.CpuFrequency.160=160 MHz
-d1_mini_pro.menu.CpuFrequency.160.build.f_cpu=160000000L
-d1_mini_pro.upload.resetmethod=nodemcu
-d1_mini_pro.build.flash_mode=dio
-d1_mini_pro.build.flash_freq=40
-d1_mini_pro.menu.FlashSize.16M15M=16M (15M SPIFFS)
-d1_mini_pro.menu.FlashSize.16M15M.build.flash_size=16M
-d1_mini_pro.menu.FlashSize.16M15M.build.flash_size_bytes=0x1000000
-d1_mini_pro.menu.FlashSize.16M15M.build.flash_ld=eagle.flash.16m.ld
-d1_mini_pro.menu.FlashSize.16M15M.build.spiffs_pagesize=256
-d1_mini_pro.menu.FlashSize.16M15M.upload.maximum_size=1044464
-d1_mini_pro.menu.FlashSize.16M15M.build.rfcal_addr=0xFFC000
-d1_mini_pro.menu.FlashSize.16M15M.build.spiffs_start=0x100000
-d1_mini_pro.menu.FlashSize.16M15M.build.spiffs_end=0xFFB000
-d1_mini_pro.menu.FlashSize.16M15M.build.spiffs_blocksize=8192
-d1_mini_pro.menu.LwIPVariant.v2mss536=v2 Lower Memory
-d1_mini_pro.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-d1_mini_pro.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-d1_mini_pro.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-d1_mini_pro.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-d1_mini_pro.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-d1_mini_pro.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-d1_mini_pro.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-d1_mini_pro.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-d1_mini_pro.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-d1_mini_pro.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini_pro.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-d1_mini_pro.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-d1_mini_pro.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini_pro.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-d1_mini_pro.menu.Debug.Disabled=Disabled
-d1_mini_pro.menu.Debug.Disabled.build.debug_port=
-d1_mini_pro.menu.Debug.Serial=Serial
-d1_mini_pro.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-d1_mini_pro.menu.Debug.Serial1=Serial1
-d1_mini_pro.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-d1_mini_pro.menu.DebugLevel.None____=None
-d1_mini_pro.menu.DebugLevel.None____.build.debug_level=
-d1_mini_pro.menu.DebugLevel.SSL=SSL
-d1_mini_pro.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-d1_mini_pro.menu.DebugLevel.TLS_MEM=TLS_MEM
-d1_mini_pro.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-d1_mini_pro.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-d1_mini_pro.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.CORE=CORE
-d1_mini_pro.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-d1_mini_pro.menu.DebugLevel.WIFI=WIFI
-d1_mini_pro.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-d1_mini_pro.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-d1_mini_pro.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-d1_mini_pro.menu.DebugLevel.UPDATER=UPDATER
-d1_mini_pro.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-d1_mini_pro.menu.DebugLevel.OTA=OTA
-d1_mini_pro.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-d1_mini_pro.menu.DebugLevel.OOM=OOM
-d1_mini_pro.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-d1_mini_pro.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-d1_mini_pro.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-d1_mini_pro.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-d1_mini_pro.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-d1_mini_pro.menu.FlashErase.none=Only Sketch
-d1_mini_pro.menu.FlashErase.none.upload.erase_cmd=
-d1_mini_pro.menu.FlashErase.sdk=Sketch + WiFi Settings
-d1_mini_pro.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-d1_mini_pro.menu.FlashErase.all=All Flash Contents
-d1_mini_pro.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-d1_mini_pro.menu.UploadSpeed.921600=921600
-d1_mini_pro.menu.UploadSpeed.921600.upload.speed=921600
-d1_mini_pro.menu.UploadSpeed.9600=9600
-d1_mini_pro.menu.UploadSpeed.9600.upload.speed=9600
-d1_mini_pro.menu.UploadSpeed.57600=57600
-d1_mini_pro.menu.UploadSpeed.57600.upload.speed=57600
-d1_mini_pro.menu.UploadSpeed.115200=115200
-d1_mini_pro.menu.UploadSpeed.115200.upload.speed=115200
-d1_mini_pro.menu.UploadSpeed.230400.linux=230400
-d1_mini_pro.menu.UploadSpeed.230400.macosx=230400
-d1_mini_pro.menu.UploadSpeed.230400.upload.speed=230400
-d1_mini_pro.menu.UploadSpeed.256000.windows=256000
-d1_mini_pro.menu.UploadSpeed.256000.upload.speed=256000
-d1_mini_pro.menu.UploadSpeed.460800.linux=460800
-d1_mini_pro.menu.UploadSpeed.460800.macosx=460800
-d1_mini_pro.menu.UploadSpeed.460800.upload.speed=460800
-d1_mini_pro.menu.UploadSpeed.512000.windows=512000
-d1_mini_pro.menu.UploadSpeed.512000.upload.speed=512000
-
-##############################################################
-d1_mini_lite.name=WeMos D1 mini Lite
-d1_mini_lite.build.board=ESP8266_WEMOS_D1MINILITE
-d1_mini_lite.build.variant=d1_mini
-d1_mini_lite.upload.tool=esptool
-d1_mini_lite.upload.maximum_data_size=81920
-d1_mini_lite.upload.wait_for_upload_port=true
-d1_mini_lite.upload.erase_cmd=
-d1_mini_lite.serial.disableDTR=true
-d1_mini_lite.serial.disableRTS=true
-d1_mini_lite.build.mcu=esp8266
-d1_mini_lite.build.core=esp8266
-d1_mini_lite.build.spiffs_pagesize=256
-d1_mini_lite.build.debug_port=
-d1_mini_lite.build.debug_level=
-d1_mini_lite.menu.CpuFrequency.80=80 MHz
-d1_mini_lite.menu.CpuFrequency.80.build.f_cpu=80000000L
-d1_mini_lite.menu.CpuFrequency.160=160 MHz
-d1_mini_lite.menu.CpuFrequency.160.build.f_cpu=160000000L
-d1_mini_lite.upload.resetmethod=nodemcu
-d1_mini_lite.build.flash_mode=dout
-d1_mini_lite.build.flash_freq=40
-d1_mini_lite.menu.FlashSize.1M0=1M (no SPIFFS)
-d1_mini_lite.menu.FlashSize.1M0.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M0.build.flash_size_bytes=0x100000
-d1_mini_lite.menu.FlashSize.1M0.build.flash_ld=eagle.flash.1m0.ld
-d1_mini_lite.menu.FlashSize.1M0.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M0.upload.maximum_size=1023984
-d1_mini_lite.menu.FlashSize.1M0.build.rfcal_addr=0xFC000
-d1_mini_lite.menu.FlashSize.1M64=1M (64K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M64.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M64.build.flash_size_bytes=0x100000
-d1_mini_lite.menu.FlashSize.1M64.build.flash_ld=eagle.flash.1m64.ld
-d1_mini_lite.menu.FlashSize.1M64.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M64.upload.maximum_size=958448
-d1_mini_lite.menu.FlashSize.1M64.build.rfcal_addr=0xFC000
-d1_mini_lite.menu.FlashSize.1M64.build.spiffs_start=0xEB000
-d1_mini_lite.menu.FlashSize.1M64.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M64.build.spiffs_blocksize=4096
-d1_mini_lite.menu.FlashSize.1M128=1M (128K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M128.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M128.build.flash_size_bytes=0x100000
-d1_mini_lite.menu.FlashSize.1M128.build.flash_ld=eagle.flash.1m128.ld
-d1_mini_lite.menu.FlashSize.1M128.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M128.upload.maximum_size=892912
-d1_mini_lite.menu.FlashSize.1M128.build.rfcal_addr=0xFC000
-d1_mini_lite.menu.FlashSize.1M128.build.spiffs_start=0xDB000
-d1_mini_lite.menu.FlashSize.1M128.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M128.build.spiffs_blocksize=4096
-d1_mini_lite.menu.FlashSize.1M144=1M (144K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M144.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M144.build.flash_size_bytes=0x100000
-d1_mini_lite.menu.FlashSize.1M144.build.flash_ld=eagle.flash.1m144.ld
-d1_mini_lite.menu.FlashSize.1M144.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M144.upload.maximum_size=876528
-d1_mini_lite.menu.FlashSize.1M144.build.rfcal_addr=0xFC000
-d1_mini_lite.menu.FlashSize.1M144.build.spiffs_start=0xD7000
-d1_mini_lite.menu.FlashSize.1M144.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M144.build.spiffs_blocksize=4096
-d1_mini_lite.menu.FlashSize.1M160=1M (160K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M160.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M160.build.flash_size_bytes=0x100000
-d1_mini_lite.menu.FlashSize.1M160.build.flash_ld=eagle.flash.1m160.ld
-d1_mini_lite.menu.FlashSize.1M160.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M160.upload.maximum_size=860144
-d1_mini_lite.menu.FlashSize.1M160.build.rfcal_addr=0xFC000
-d1_mini_lite.menu.FlashSize.1M160.build.spiffs_start=0xD3000
-d1_mini_lite.menu.FlashSize.1M160.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M160.build.spiffs_blocksize=4096
-d1_mini_lite.menu.FlashSize.1M192=1M (192K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M192.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M192.build.flash_size_bytes=0x100000
-d1_mini_lite.menu.FlashSize.1M192.build.flash_ld=eagle.flash.1m192.ld
-d1_mini_lite.menu.FlashSize.1M192.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M192.upload.maximum_size=827376
-d1_mini_lite.menu.FlashSize.1M192.build.rfcal_addr=0xFC000
-d1_mini_lite.menu.FlashSize.1M192.build.spiffs_start=0xCB000
-d1_mini_lite.menu.FlashSize.1M192.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M192.build.spiffs_blocksize=4096
-d1_mini_lite.menu.FlashSize.1M256=1M (256K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M256.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M256.build.flash_size_bytes=0x100000
-d1_mini_lite.menu.FlashSize.1M256.build.flash_ld=eagle.flash.1m256.ld
-d1_mini_lite.menu.FlashSize.1M256.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M256.upload.maximum_size=761840
-d1_mini_lite.menu.FlashSize.1M256.build.rfcal_addr=0xFC000
-d1_mini_lite.menu.FlashSize.1M256.build.spiffs_start=0xBB000
-d1_mini_lite.menu.FlashSize.1M256.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M256.build.spiffs_blocksize=4096
-d1_mini_lite.menu.FlashSize.1M512=1M (512K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M512.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M512.build.flash_size_bytes=0x100000
-d1_mini_lite.menu.FlashSize.1M512.build.flash_ld=eagle.flash.1m512.ld
-d1_mini_lite.menu.FlashSize.1M512.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M512.upload.maximum_size=499696
-d1_mini_lite.menu.FlashSize.1M512.build.rfcal_addr=0xFC000
-d1_mini_lite.menu.FlashSize.1M512.build.spiffs_start=0x7B000
-d1_mini_lite.menu.FlashSize.1M512.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M512.build.spiffs_blocksize=8192
-d1_mini_lite.menu.LwIPVariant.v2mss536=v2 Lower Memory
-d1_mini_lite.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-d1_mini_lite.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-d1_mini_lite.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-d1_mini_lite.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-d1_mini_lite.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-d1_mini_lite.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-d1_mini_lite.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-d1_mini_lite.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-d1_mini_lite.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-d1_mini_lite.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini_lite.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-d1_mini_lite.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-d1_mini_lite.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini_lite.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-d1_mini_lite.menu.Debug.Disabled=Disabled
-d1_mini_lite.menu.Debug.Disabled.build.debug_port=
-d1_mini_lite.menu.Debug.Serial=Serial
-d1_mini_lite.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-d1_mini_lite.menu.Debug.Serial1=Serial1
-d1_mini_lite.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-d1_mini_lite.menu.DebugLevel.None____=None
-d1_mini_lite.menu.DebugLevel.None____.build.debug_level=
-d1_mini_lite.menu.DebugLevel.SSL=SSL
-d1_mini_lite.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-d1_mini_lite.menu.DebugLevel.TLS_MEM=TLS_MEM
-d1_mini_lite.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-d1_mini_lite.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-d1_mini_lite.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.CORE=CORE
-d1_mini_lite.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-d1_mini_lite.menu.DebugLevel.WIFI=WIFI
-d1_mini_lite.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-d1_mini_lite.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-d1_mini_lite.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-d1_mini_lite.menu.DebugLevel.UPDATER=UPDATER
-d1_mini_lite.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-d1_mini_lite.menu.DebugLevel.OTA=OTA
-d1_mini_lite.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-d1_mini_lite.menu.DebugLevel.OOM=OOM
-d1_mini_lite.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-d1_mini_lite.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-d1_mini_lite.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-d1_mini_lite.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-d1_mini_lite.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-d1_mini_lite.menu.FlashErase.none=Only Sketch
-d1_mini_lite.menu.FlashErase.none.upload.erase_cmd=
-d1_mini_lite.menu.FlashErase.sdk=Sketch + WiFi Settings
-d1_mini_lite.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-d1_mini_lite.menu.FlashErase.all=All Flash Contents
-d1_mini_lite.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-d1_mini_lite.menu.UploadSpeed.921600=921600
-d1_mini_lite.menu.UploadSpeed.921600.upload.speed=921600
-d1_mini_lite.menu.UploadSpeed.9600=9600
-d1_mini_lite.menu.UploadSpeed.9600.upload.speed=9600
-d1_mini_lite.menu.UploadSpeed.57600=57600
-d1_mini_lite.menu.UploadSpeed.57600.upload.speed=57600
-d1_mini_lite.menu.UploadSpeed.115200=115200
-d1_mini_lite.menu.UploadSpeed.115200.upload.speed=115200
-d1_mini_lite.menu.UploadSpeed.230400.linux=230400
-d1_mini_lite.menu.UploadSpeed.230400.macosx=230400
-d1_mini_lite.menu.UploadSpeed.230400.upload.speed=230400
-d1_mini_lite.menu.UploadSpeed.256000.windows=256000
-d1_mini_lite.menu.UploadSpeed.256000.upload.speed=256000
-d1_mini_lite.menu.UploadSpeed.460800.linux=460800
-d1_mini_lite.menu.UploadSpeed.460800.macosx=460800
-d1_mini_lite.menu.UploadSpeed.460800.upload.speed=460800
-d1_mini_lite.menu.UploadSpeed.512000.windows=512000
-d1_mini_lite.menu.UploadSpeed.512000.upload.speed=512000
-
-##############################################################
-d1.name=WeMos D1 R1
-d1.build.board=ESP8266_WEMOS_D1R1
-d1.build.variant=d1
-d1.upload.tool=esptool
-d1.upload.maximum_data_size=81920
-d1.upload.wait_for_upload_port=true
-d1.upload.erase_cmd=
-d1.serial.disableDTR=true
-d1.serial.disableRTS=true
-d1.build.mcu=esp8266
-d1.build.core=esp8266
-d1.build.spiffs_pagesize=256
-d1.build.debug_port=
-d1.build.debug_level=
-d1.menu.CpuFrequency.80=80 MHz
-d1.menu.CpuFrequency.80.build.f_cpu=80000000L
-d1.menu.CpuFrequency.160=160 MHz
-d1.menu.CpuFrequency.160.build.f_cpu=160000000L
-d1.upload.resetmethod=nodemcu
-d1.build.flash_mode=dio
-d1.build.flash_freq=40
-d1.menu.FlashSize.4M1M=4M (1M SPIFFS)
-d1.menu.FlashSize.4M1M.build.flash_size=4M
-d1.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-d1.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-d1.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-d1.menu.FlashSize.4M1M.upload.maximum_size=1044464
-d1.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-d1.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-d1.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-d1.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-d1.menu.FlashSize.4M3M=4M (3M SPIFFS)
-d1.menu.FlashSize.4M3M.build.flash_size=4M
-d1.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-d1.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-d1.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-d1.menu.FlashSize.4M3M.upload.maximum_size=1044464
-d1.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-d1.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-d1.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-d1.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-d1.menu.LwIPVariant.v2mss536=v2 Lower Memory
-d1.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-d1.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-d1.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-d1.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-d1.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-d1.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-d1.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-d1.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-d1.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-d1.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-d1.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-d1.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-d1.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-d1.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-d1.menu.Debug.Disabled=Disabled
-d1.menu.Debug.Disabled.build.debug_port=
-d1.menu.Debug.Serial=Serial
-d1.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-d1.menu.Debug.Serial1=Serial1
-d1.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-d1.menu.DebugLevel.None____=None
-d1.menu.DebugLevel.None____.build.debug_level=
-d1.menu.DebugLevel.SSL=SSL
-d1.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-d1.menu.DebugLevel.TLS_MEM=TLS_MEM
-d1.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-d1.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-d1.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-d1.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-d1.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-d1.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-d1.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-d1.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-d1.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-d1.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-d1.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-d1.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-d1.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-d1.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.CORE=CORE
-d1.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-d1.menu.DebugLevel.WIFI=WIFI
-d1.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-d1.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-d1.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-d1.menu.DebugLevel.UPDATER=UPDATER
-d1.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-d1.menu.DebugLevel.OTA=OTA
-d1.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-d1.menu.DebugLevel.OOM=OOM
-d1.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-d1.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-d1.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-d1.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-d1.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-d1.menu.FlashErase.none=Only Sketch
-d1.menu.FlashErase.none.upload.erase_cmd=
-d1.menu.FlashErase.sdk=Sketch + WiFi Settings
-d1.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-d1.menu.FlashErase.all=All Flash Contents
-d1.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-d1.menu.UploadSpeed.921600=921600
-d1.menu.UploadSpeed.921600.upload.speed=921600
-d1.menu.UploadSpeed.9600=9600
-d1.menu.UploadSpeed.9600.upload.speed=9600
-d1.menu.UploadSpeed.57600=57600
-d1.menu.UploadSpeed.57600.upload.speed=57600
-d1.menu.UploadSpeed.115200=115200
-d1.menu.UploadSpeed.115200.upload.speed=115200
-d1.menu.UploadSpeed.230400.linux=230400
-d1.menu.UploadSpeed.230400.macosx=230400
-d1.menu.UploadSpeed.230400.upload.speed=230400
-d1.menu.UploadSpeed.256000.windows=256000
-d1.menu.UploadSpeed.256000.upload.speed=256000
-d1.menu.UploadSpeed.460800.linux=460800
-d1.menu.UploadSpeed.460800.macosx=460800
-d1.menu.UploadSpeed.460800.upload.speed=460800
-d1.menu.UploadSpeed.512000.windows=512000
-d1.menu.UploadSpeed.512000.upload.speed=512000
-
-##############################################################
-espino.name=ESPino (ESP-12 Module)
-espino.build.board=ESP8266_ESP12
-espino.build.variant=espino
-espino.upload.tool=esptool
-espino.upload.maximum_data_size=81920
-espino.upload.wait_for_upload_port=true
-espino.upload.erase_cmd=
-espino.serial.disableDTR=true
-espino.serial.disableRTS=true
-espino.build.mcu=esp8266
-espino.build.core=esp8266
-espino.build.spiffs_pagesize=256
-espino.build.debug_port=
-espino.build.debug_level=
-espino.menu.CpuFrequency.80=80 MHz
-espino.menu.CpuFrequency.80.build.f_cpu=80000000L
-espino.menu.CpuFrequency.160=160 MHz
-espino.menu.CpuFrequency.160.build.f_cpu=160000000L
-espino.menu.ResetMethod.ck=ck
-espino.menu.ResetMethod.ck.upload.resetmethod=ck
-espino.menu.ResetMethod.nodemcu=nodemcu
-espino.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-espino.build.flash_mode=qio
-espino.build.flash_freq=40
-espino.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espino.menu.FlashSize.4M1M.build.flash_size=4M
-espino.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-espino.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espino.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espino.menu.FlashSize.4M1M.upload.maximum_size=1044464
-espino.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-espino.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espino.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espino.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espino.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espino.menu.FlashSize.4M3M.build.flash_size=4M
-espino.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-espino.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espino.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-espino.menu.FlashSize.4M3M.upload.maximum_size=1044464
-espino.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-espino.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espino.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espino.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espino.menu.LwIPVariant.v2mss536=v2 Lower Memory
-espino.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-espino.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-espino.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-espino.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-espino.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-espino.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-espino.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-espino.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-espino.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-espino.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-espino.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-espino.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-espino.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-espino.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-espino.menu.Debug.Disabled=Disabled
-espino.menu.Debug.Disabled.build.debug_port=
-espino.menu.Debug.Serial=Serial
-espino.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-espino.menu.Debug.Serial1=Serial1
-espino.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-espino.menu.DebugLevel.None____=None
-espino.menu.DebugLevel.None____.build.debug_level=
-espino.menu.DebugLevel.SSL=SSL
-espino.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-espino.menu.DebugLevel.TLS_MEM=TLS_MEM
-espino.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-espino.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-espino.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-espino.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-espino.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-espino.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-espino.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-espino.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-espino.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-espino.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-espino.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espino.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-espino.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-espino.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-espino.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espino.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.CORE=CORE
-espino.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-espino.menu.DebugLevel.WIFI=WIFI
-espino.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-espino.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-espino.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-espino.menu.DebugLevel.UPDATER=UPDATER
-espino.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-espino.menu.DebugLevel.OTA=OTA
-espino.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-espino.menu.DebugLevel.OOM=OOM
-espino.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-espino.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-espino.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-espino.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-espino.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-espino.menu.FlashErase.none=Only Sketch
-espino.menu.FlashErase.none.upload.erase_cmd=
-espino.menu.FlashErase.sdk=Sketch + WiFi Settings
-espino.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-espino.menu.FlashErase.all=All Flash Contents
-espino.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-espino.menu.UploadSpeed.115200=115200
-espino.menu.UploadSpeed.115200.upload.speed=115200
-espino.menu.UploadSpeed.9600=9600
-espino.menu.UploadSpeed.9600.upload.speed=9600
-espino.menu.UploadSpeed.57600=57600
-espino.menu.UploadSpeed.57600.upload.speed=57600
-espino.menu.UploadSpeed.230400.linux=230400
-espino.menu.UploadSpeed.230400.macosx=230400
-espino.menu.UploadSpeed.230400.upload.speed=230400
-espino.menu.UploadSpeed.256000.windows=256000
-espino.menu.UploadSpeed.256000.upload.speed=256000
-espino.menu.UploadSpeed.460800.linux=460800
-espino.menu.UploadSpeed.460800.macosx=460800
-espino.menu.UploadSpeed.460800.upload.speed=460800
-espino.menu.UploadSpeed.512000.windows=512000
-espino.menu.UploadSpeed.512000.upload.speed=512000
-espino.menu.UploadSpeed.921600=921600
-espino.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-espinotee.name=ThaiEasyElec's ESPino
-espinotee.build.board=ESP8266_ESP13
-espinotee.build.variant=espinotee
-espinotee.upload.tool=esptool
-espinotee.upload.maximum_data_size=81920
-espinotee.upload.wait_for_upload_port=true
-espinotee.upload.erase_cmd=
-espinotee.serial.disableDTR=true
-espinotee.serial.disableRTS=true
-espinotee.build.mcu=esp8266
-espinotee.build.core=esp8266
-espinotee.build.spiffs_pagesize=256
-espinotee.build.debug_port=
-espinotee.build.debug_level=
-espinotee.menu.CpuFrequency.80=80 MHz
-espinotee.menu.CpuFrequency.80.build.f_cpu=80000000L
-espinotee.menu.CpuFrequency.160=160 MHz
-espinotee.menu.CpuFrequency.160.build.f_cpu=160000000L
-espinotee.upload.resetmethod=nodemcu
-espinotee.build.flash_mode=qio
-espinotee.build.flash_freq=40
-espinotee.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espinotee.menu.FlashSize.4M1M.build.flash_size=4M
-espinotee.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-espinotee.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espinotee.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espinotee.menu.FlashSize.4M1M.upload.maximum_size=1044464
-espinotee.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-espinotee.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espinotee.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espinotee.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espinotee.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espinotee.menu.FlashSize.4M3M.build.flash_size=4M
-espinotee.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-espinotee.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espinotee.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-espinotee.menu.FlashSize.4M3M.upload.maximum_size=1044464
-espinotee.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-espinotee.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espinotee.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espinotee.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espinotee.menu.LwIPVariant.v2mss536=v2 Lower Memory
-espinotee.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-espinotee.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-espinotee.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-espinotee.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-espinotee.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-espinotee.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-espinotee.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-espinotee.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-espinotee.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-espinotee.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-espinotee.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-espinotee.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-espinotee.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-espinotee.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-espinotee.menu.Debug.Disabled=Disabled
-espinotee.menu.Debug.Disabled.build.debug_port=
-espinotee.menu.Debug.Serial=Serial
-espinotee.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-espinotee.menu.Debug.Serial1=Serial1
-espinotee.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-espinotee.menu.DebugLevel.None____=None
-espinotee.menu.DebugLevel.None____.build.debug_level=
-espinotee.menu.DebugLevel.SSL=SSL
-espinotee.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-espinotee.menu.DebugLevel.TLS_MEM=TLS_MEM
-espinotee.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-espinotee.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-espinotee.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-espinotee.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-espinotee.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-espinotee.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-espinotee.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-espinotee.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-espinotee.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-espinotee.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-espinotee.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espinotee.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-espinotee.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-espinotee.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-espinotee.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espinotee.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.CORE=CORE
-espinotee.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-espinotee.menu.DebugLevel.WIFI=WIFI
-espinotee.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-espinotee.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-espinotee.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-espinotee.menu.DebugLevel.UPDATER=UPDATER
-espinotee.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-espinotee.menu.DebugLevel.OTA=OTA
-espinotee.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-espinotee.menu.DebugLevel.OOM=OOM
-espinotee.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-espinotee.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-espinotee.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-espinotee.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-espinotee.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-espinotee.menu.FlashErase.none=Only Sketch
-espinotee.menu.FlashErase.none.upload.erase_cmd=
-espinotee.menu.FlashErase.sdk=Sketch + WiFi Settings
-espinotee.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-espinotee.menu.FlashErase.all=All Flash Contents
-espinotee.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-espinotee.menu.UploadSpeed.115200=115200
-espinotee.menu.UploadSpeed.115200.upload.speed=115200
-espinotee.menu.UploadSpeed.9600=9600
-espinotee.menu.UploadSpeed.9600.upload.speed=9600
-espinotee.menu.UploadSpeed.57600=57600
-espinotee.menu.UploadSpeed.57600.upload.speed=57600
-espinotee.menu.UploadSpeed.230400.linux=230400
-espinotee.menu.UploadSpeed.230400.macosx=230400
-espinotee.menu.UploadSpeed.230400.upload.speed=230400
-espinotee.menu.UploadSpeed.256000.windows=256000
-espinotee.menu.UploadSpeed.256000.upload.speed=256000
-espinotee.menu.UploadSpeed.460800.linux=460800
-espinotee.menu.UploadSpeed.460800.macosx=460800
-espinotee.menu.UploadSpeed.460800.upload.speed=460800
-espinotee.menu.UploadSpeed.512000.windows=512000
-espinotee.menu.UploadSpeed.512000.upload.speed=512000
-espinotee.menu.UploadSpeed.921600=921600
-espinotee.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-wifinfo.name=WifInfo
-wifinfo.menu.ESPModule.ESP12.build.board=ESP8266_ESP12
-wifinfo.menu.ESPModule.ESP12.upload.maximum_size=1044464
-wifinfo.menu.ESPModule.ESP12.build.spiffs_pagesize=256
-wifinfo.menu.ESPModule.ESP12.build.flash_ld=eagle.flash.4m1m.ld
-wifinfo.menu.ESPModule.ESP07192.build.spiffs_blocksize=4096
-wifinfo.menu.ESPModule.ESP07192.build.spiffs_end=0xFB000
-wifinfo.menu.ESPModule.ESP12=ESP12 (4M/1M SPIFFS)
-wifinfo.menu.ESPModule.ESP12.build.spiffs_start=0x300000
-wifinfo.menu.ESPModule.ESP12.build.spiffs_end=0x3FB000
-wifinfo.menu.ESPModule.ESP07192.build.spiffs_start=0xCB000
-wifinfo.menu.ESPModule.ESP07192.build.board=ESP8266_ESP07
-wifinfo.menu.ESPModule.ESP12.build.spiffs_blocksize=8192
-wifinfo.menu.ESPModule.ESP12.build.flash_size=4M
-wifinfo.build.board=WIFINFO
-wifinfo.build.variant=wifinfo
-wifinfo.menu.ESPModule.ESP07192.build.flash_ld=eagle.flash.1m192.ld
-wifinfo.menu.ESPModule.ESP07192.build.flash_size=1M
-wifinfo.menu.ESPModule.ESP07192=ESP07 (1M/192K SPIFFS)
-wifinfo.menu.ESPModule.ESP07192.upload.maximum_size=827376
-wifinfo.upload.tool=esptool
-wifinfo.upload.maximum_data_size=81920
-wifinfo.upload.wait_for_upload_port=true
-wifinfo.upload.erase_cmd=
-wifinfo.serial.disableDTR=true
-wifinfo.serial.disableRTS=true
-wifinfo.build.mcu=esp8266
-wifinfo.build.core=esp8266
-wifinfo.build.spiffs_pagesize=256
-wifinfo.build.debug_port=
-wifinfo.build.debug_level=
-wifinfo.menu.CpuFrequency.80=80 MHz
-wifinfo.menu.CpuFrequency.80.build.f_cpu=80000000L
-wifinfo.menu.CpuFrequency.160=160 MHz
-wifinfo.menu.CpuFrequency.160.build.f_cpu=160000000L
-wifinfo.upload.resetmethod=nodemcu
-wifinfo.build.flash_mode=qio
-wifinfo.menu.FlashFreq.40=40MHz
-wifinfo.menu.FlashFreq.40.build.flash_freq=40
-wifinfo.menu.FlashFreq.80=80MHz
-wifinfo.menu.FlashFreq.80.build.flash_freq=80
-wifinfo.menu.FlashSize.1M0=1M (no SPIFFS)
-wifinfo.menu.FlashSize.1M0.build.flash_size=1M
-wifinfo.menu.FlashSize.1M0.build.flash_size_bytes=0x100000
-wifinfo.menu.FlashSize.1M0.build.flash_ld=eagle.flash.1m0.ld
-wifinfo.menu.FlashSize.1M0.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M0.upload.maximum_size=1023984
-wifinfo.menu.FlashSize.1M0.build.rfcal_addr=0xFC000
-wifinfo.menu.FlashSize.1M64=1M (64K SPIFFS)
-wifinfo.menu.FlashSize.1M64.build.flash_size=1M
-wifinfo.menu.FlashSize.1M64.build.flash_size_bytes=0x100000
-wifinfo.menu.FlashSize.1M64.build.flash_ld=eagle.flash.1m64.ld
-wifinfo.menu.FlashSize.1M64.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M64.upload.maximum_size=958448
-wifinfo.menu.FlashSize.1M64.build.rfcal_addr=0xFC000
-wifinfo.menu.FlashSize.1M64.build.spiffs_start=0xEB000
-wifinfo.menu.FlashSize.1M64.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M64.build.spiffs_blocksize=4096
-wifinfo.menu.FlashSize.1M128=1M (128K SPIFFS)
-wifinfo.menu.FlashSize.1M128.build.flash_size=1M
-wifinfo.menu.FlashSize.1M128.build.flash_size_bytes=0x100000
-wifinfo.menu.FlashSize.1M128.build.flash_ld=eagle.flash.1m128.ld
-wifinfo.menu.FlashSize.1M128.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M128.upload.maximum_size=892912
-wifinfo.menu.FlashSize.1M128.build.rfcal_addr=0xFC000
-wifinfo.menu.FlashSize.1M128.build.spiffs_start=0xDB000
-wifinfo.menu.FlashSize.1M128.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M128.build.spiffs_blocksize=4096
-wifinfo.menu.FlashSize.1M144=1M (144K SPIFFS)
-wifinfo.menu.FlashSize.1M144.build.flash_size=1M
-wifinfo.menu.FlashSize.1M144.build.flash_size_bytes=0x100000
-wifinfo.menu.FlashSize.1M144.build.flash_ld=eagle.flash.1m144.ld
-wifinfo.menu.FlashSize.1M144.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M144.upload.maximum_size=876528
-wifinfo.menu.FlashSize.1M144.build.rfcal_addr=0xFC000
-wifinfo.menu.FlashSize.1M144.build.spiffs_start=0xD7000
-wifinfo.menu.FlashSize.1M144.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M144.build.spiffs_blocksize=4096
-wifinfo.menu.FlashSize.1M160=1M (160K SPIFFS)
-wifinfo.menu.FlashSize.1M160.build.flash_size=1M
-wifinfo.menu.FlashSize.1M160.build.flash_size_bytes=0x100000
-wifinfo.menu.FlashSize.1M160.build.flash_ld=eagle.flash.1m160.ld
-wifinfo.menu.FlashSize.1M160.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M160.upload.maximum_size=860144
-wifinfo.menu.FlashSize.1M160.build.rfcal_addr=0xFC000
-wifinfo.menu.FlashSize.1M160.build.spiffs_start=0xD3000
-wifinfo.menu.FlashSize.1M160.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M160.build.spiffs_blocksize=4096
-wifinfo.menu.FlashSize.1M192=1M (192K SPIFFS)
-wifinfo.menu.FlashSize.1M192.build.flash_size=1M
-wifinfo.menu.FlashSize.1M192.build.flash_size_bytes=0x100000
-wifinfo.menu.FlashSize.1M192.build.flash_ld=eagle.flash.1m192.ld
-wifinfo.menu.FlashSize.1M192.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M192.upload.maximum_size=827376
-wifinfo.menu.FlashSize.1M192.build.rfcal_addr=0xFC000
-wifinfo.menu.FlashSize.1M192.build.spiffs_start=0xCB000
-wifinfo.menu.FlashSize.1M192.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M192.build.spiffs_blocksize=4096
-wifinfo.menu.FlashSize.1M256=1M (256K SPIFFS)
-wifinfo.menu.FlashSize.1M256.build.flash_size=1M
-wifinfo.menu.FlashSize.1M256.build.flash_size_bytes=0x100000
-wifinfo.menu.FlashSize.1M256.build.flash_ld=eagle.flash.1m256.ld
-wifinfo.menu.FlashSize.1M256.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M256.upload.maximum_size=761840
-wifinfo.menu.FlashSize.1M256.build.rfcal_addr=0xFC000
-wifinfo.menu.FlashSize.1M256.build.spiffs_start=0xBB000
-wifinfo.menu.FlashSize.1M256.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M256.build.spiffs_blocksize=4096
-wifinfo.menu.FlashSize.1M512=1M (512K SPIFFS)
-wifinfo.menu.FlashSize.1M512.build.flash_size=1M
-wifinfo.menu.FlashSize.1M512.build.flash_size_bytes=0x100000
-wifinfo.menu.FlashSize.1M512.build.flash_ld=eagle.flash.1m512.ld
-wifinfo.menu.FlashSize.1M512.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M512.upload.maximum_size=499696
-wifinfo.menu.FlashSize.1M512.build.rfcal_addr=0xFC000
-wifinfo.menu.FlashSize.1M512.build.spiffs_start=0x7B000
-wifinfo.menu.FlashSize.1M512.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M512.build.spiffs_blocksize=8192
-wifinfo.menu.LwIPVariant.v2mss536=v2 Lower Memory
-wifinfo.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-wifinfo.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-wifinfo.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-wifinfo.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-wifinfo.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-wifinfo.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-wifinfo.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-wifinfo.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-wifinfo.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-wifinfo.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-wifinfo.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-wifinfo.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-wifinfo.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-wifinfo.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-wifinfo.menu.Debug.Disabled=Disabled
-wifinfo.menu.Debug.Disabled.build.debug_port=
-wifinfo.menu.Debug.Serial=Serial
-wifinfo.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-wifinfo.menu.Debug.Serial1=Serial1
-wifinfo.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-wifinfo.menu.DebugLevel.None____=None
-wifinfo.menu.DebugLevel.None____.build.debug_level=
-wifinfo.menu.DebugLevel.SSL=SSL
-wifinfo.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-wifinfo.menu.DebugLevel.TLS_MEM=TLS_MEM
-wifinfo.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-wifinfo.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-wifinfo.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-wifinfo.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-wifinfo.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-wifinfo.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-wifinfo.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-wifinfo.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-wifinfo.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-wifinfo.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-wifinfo.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-wifinfo.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-wifinfo.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-wifinfo.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.CORE=CORE
-wifinfo.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-wifinfo.menu.DebugLevel.WIFI=WIFI
-wifinfo.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-wifinfo.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-wifinfo.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-wifinfo.menu.DebugLevel.UPDATER=UPDATER
-wifinfo.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-wifinfo.menu.DebugLevel.OTA=OTA
-wifinfo.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-wifinfo.menu.DebugLevel.OOM=OOM
-wifinfo.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-wifinfo.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-wifinfo.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-wifinfo.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-wifinfo.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-wifinfo.menu.FlashErase.none=Only Sketch
-wifinfo.menu.FlashErase.none.upload.erase_cmd=
-wifinfo.menu.FlashErase.sdk=Sketch + WiFi Settings
-wifinfo.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-wifinfo.menu.FlashErase.all=All Flash Contents
-wifinfo.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-wifinfo.menu.UploadSpeed.115200=115200
-wifinfo.menu.UploadSpeed.115200.upload.speed=115200
-wifinfo.menu.UploadSpeed.9600=9600
-wifinfo.menu.UploadSpeed.9600.upload.speed=9600
-wifinfo.menu.UploadSpeed.57600=57600
-wifinfo.menu.UploadSpeed.57600.upload.speed=57600
-wifinfo.menu.UploadSpeed.230400.linux=230400
-wifinfo.menu.UploadSpeed.230400.macosx=230400
-wifinfo.menu.UploadSpeed.230400.upload.speed=230400
-wifinfo.menu.UploadSpeed.256000.windows=256000
-wifinfo.menu.UploadSpeed.256000.upload.speed=256000
-wifinfo.menu.UploadSpeed.460800.linux=460800
-wifinfo.menu.UploadSpeed.460800.macosx=460800
-wifinfo.menu.UploadSpeed.460800.upload.speed=460800
-wifinfo.menu.UploadSpeed.512000.windows=512000
-wifinfo.menu.UploadSpeed.512000.upload.speed=512000
-wifinfo.menu.UploadSpeed.921600=921600
-wifinfo.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-arduino-esp8266.name=Arduino
-arduino-esp8266.menu.BoardModel.starottodeved.build.board=ESP8266_ARDUINO_STAR_OTTO
-arduino-esp8266.menu.BoardModel.primo.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
-arduino-esp8266.menu.BoardModel.starottodeved.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
-arduino-esp8266.menu.BoardModel.starottodeved.build.variant=arduino_uart
-arduino-esp8266.menu.BoardModel.unowifideved.build.board=ESP8266_ARDUINO_UNOWIFI
-arduino-esp8266.menu.BoardModel.unowifideved.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
-arduino-esp8266.menu.BoardModel.primo=Primo
-arduino-esp8266.menu.BoardModel.unowifideved.build.variant=arduino_uart
-arduino-esp8266.menu.BoardModel.primo.build.variant=arduino_spi
-arduino-esp8266.menu.BoardModel.starottodeved=Star OTTO
-arduino-esp8266.build.board=ESP8266_ARDUINO
-arduino-esp8266.menu.BoardModel.primo.build.board=ESP8266_ARDUINO_PRIMO
-arduino-esp8266.menu.BoardModel.unowifideved=Uno WiFi
-arduino-esp8266.upload.tool=esptool
-arduino-esp8266.upload.maximum_data_size=81920
-arduino-esp8266.upload.wait_for_upload_port=true
-arduino-esp8266.upload.erase_cmd=
-arduino-esp8266.serial.disableDTR=true
-arduino-esp8266.serial.disableRTS=true
-arduino-esp8266.build.mcu=esp8266
-arduino-esp8266.build.core=esp8266
-arduino-esp8266.build.variant=generic
-arduino-esp8266.build.spiffs_pagesize=256
-arduino-esp8266.build.debug_port=
-arduino-esp8266.build.debug_level=
-arduino-esp8266.menu.CpuFrequency.80=80 MHz
-arduino-esp8266.menu.CpuFrequency.80.build.f_cpu=80000000L
-arduino-esp8266.menu.CpuFrequency.160=160 MHz
-arduino-esp8266.menu.CpuFrequency.160.build.f_cpu=160000000L
-arduino-esp8266.upload.resetmethod=ck
-arduino-esp8266.build.flash_mode=qio
-arduino-esp8266.build.flash_freq=40
-arduino-esp8266.menu.FlashSize.4M1M=4M (1M SPIFFS)
-arduino-esp8266.menu.FlashSize.4M1M.build.flash_size=4M
-arduino-esp8266.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-arduino-esp8266.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-arduino-esp8266.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-arduino-esp8266.menu.FlashSize.4M1M.upload.maximum_size=1044464
-arduino-esp8266.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-arduino-esp8266.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-arduino-esp8266.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-arduino-esp8266.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-arduino-esp8266.menu.FlashSize.4M3M=4M (3M SPIFFS)
-arduino-esp8266.menu.FlashSize.4M3M.build.flash_size=4M
-arduino-esp8266.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-arduino-esp8266.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-arduino-esp8266.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-arduino-esp8266.menu.FlashSize.4M3M.upload.maximum_size=1044464
-arduino-esp8266.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-arduino-esp8266.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-arduino-esp8266.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-arduino-esp8266.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-arduino-esp8266.menu.LwIPVariant.v2mss536=v2 Lower Memory
-arduino-esp8266.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-arduino-esp8266.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-arduino-esp8266.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-arduino-esp8266.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-arduino-esp8266.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-arduino-esp8266.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-arduino-esp8266.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-arduino-esp8266.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-arduino-esp8266.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-arduino-esp8266.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-arduino-esp8266.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-arduino-esp8266.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-arduino-esp8266.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-arduino-esp8266.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-arduino-esp8266.menu.Debug.Disabled=Disabled
-arduino-esp8266.menu.Debug.Disabled.build.debug_port=
-arduino-esp8266.menu.Debug.Serial=Serial
-arduino-esp8266.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-arduino-esp8266.menu.Debug.Serial1=Serial1
-arduino-esp8266.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-arduino-esp8266.menu.DebugLevel.None____=None
-arduino-esp8266.menu.DebugLevel.None____.build.debug_level=
-arduino-esp8266.menu.DebugLevel.SSL=SSL
-arduino-esp8266.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-arduino-esp8266.menu.DebugLevel.TLS_MEM=TLS_MEM
-arduino-esp8266.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-arduino-esp8266.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-arduino-esp8266.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.CORE=CORE
-arduino-esp8266.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-arduino-esp8266.menu.DebugLevel.WIFI=WIFI
-arduino-esp8266.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-arduino-esp8266.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-arduino-esp8266.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-arduino-esp8266.menu.DebugLevel.UPDATER=UPDATER
-arduino-esp8266.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-arduino-esp8266.menu.DebugLevel.OTA=OTA
-arduino-esp8266.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-arduino-esp8266.menu.DebugLevel.OOM=OOM
-arduino-esp8266.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-arduino-esp8266.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-arduino-esp8266.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-arduino-esp8266.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-arduino-esp8266.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-arduino-esp8266.menu.FlashErase.none=Only Sketch
-arduino-esp8266.menu.FlashErase.none.upload.erase_cmd=
-arduino-esp8266.menu.FlashErase.sdk=Sketch + WiFi Settings
-arduino-esp8266.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-arduino-esp8266.menu.FlashErase.all=All Flash Contents
-arduino-esp8266.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-arduino-esp8266.menu.UploadSpeed.115200=115200
-arduino-esp8266.menu.UploadSpeed.115200.upload.speed=115200
-arduino-esp8266.menu.UploadSpeed.9600=9600
-arduino-esp8266.menu.UploadSpeed.9600.upload.speed=9600
-arduino-esp8266.menu.UploadSpeed.57600=57600
-arduino-esp8266.menu.UploadSpeed.57600.upload.speed=57600
-arduino-esp8266.menu.UploadSpeed.230400.linux=230400
-arduino-esp8266.menu.UploadSpeed.230400.macosx=230400
-arduino-esp8266.menu.UploadSpeed.230400.upload.speed=230400
-arduino-esp8266.menu.UploadSpeed.256000.windows=256000
-arduino-esp8266.menu.UploadSpeed.256000.upload.speed=256000
-arduino-esp8266.menu.UploadSpeed.460800.linux=460800
-arduino-esp8266.menu.UploadSpeed.460800.macosx=460800
-arduino-esp8266.menu.UploadSpeed.460800.upload.speed=460800
-arduino-esp8266.menu.UploadSpeed.512000.windows=512000
-arduino-esp8266.menu.UploadSpeed.512000.upload.speed=512000
-arduino-esp8266.menu.UploadSpeed.921600=921600
-arduino-esp8266.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-gen4iod.name=4D Systems gen4 IoD Range
-gen4iod.build.board=GEN4_IOD
-gen4iod.build.f_cpu=160000000L
-gen4iod.build.variant=generic
-gen4iod.upload.tool=esptool
-gen4iod.upload.maximum_data_size=81920
-gen4iod.upload.wait_for_upload_port=true
-gen4iod.upload.erase_cmd=
-gen4iod.serial.disableDTR=true
-gen4iod.serial.disableRTS=true
-gen4iod.build.mcu=esp8266
-gen4iod.build.core=esp8266
-gen4iod.build.spiffs_pagesize=256
-gen4iod.build.debug_port=
-gen4iod.build.debug_level=
-gen4iod.menu.CpuFrequency.80=80 MHz
-gen4iod.menu.CpuFrequency.80.build.f_cpu=80000000L
-gen4iod.menu.CpuFrequency.160=160 MHz
-gen4iod.menu.CpuFrequency.160.build.f_cpu=160000000L
-gen4iod.upload.resetmethod=nodemcu
-gen4iod.build.flash_mode=qio
-gen4iod.build.flash_freq=80
-gen4iod.menu.FlashSize.512K0=512K (no SPIFFS)
-gen4iod.menu.FlashSize.512K0.build.flash_size=512K
-gen4iod.menu.FlashSize.512K0.build.flash_size_bytes=0x80000
-gen4iod.menu.FlashSize.512K0.build.flash_ld=eagle.flash.512k0.ld
-gen4iod.menu.FlashSize.512K0.build.spiffs_pagesize=256
-gen4iod.menu.FlashSize.512K0.upload.maximum_size=499696
-gen4iod.menu.FlashSize.512K0.build.rfcal_addr=0x7C000
-gen4iod.menu.FlashSize.512K64=512K (64K SPIFFS)
-gen4iod.menu.FlashSize.512K64.build.flash_size=512K
-gen4iod.menu.FlashSize.512K64.build.flash_size_bytes=0x80000
-gen4iod.menu.FlashSize.512K64.build.flash_ld=eagle.flash.512k64.ld
-gen4iod.menu.FlashSize.512K64.build.spiffs_pagesize=256
-gen4iod.menu.FlashSize.512K64.upload.maximum_size=434160
-gen4iod.menu.FlashSize.512K64.build.rfcal_addr=0x7C000
-gen4iod.menu.FlashSize.512K64.build.spiffs_start=0x6B000
-gen4iod.menu.FlashSize.512K64.build.spiffs_end=0x7B000
-gen4iod.menu.FlashSize.512K64.build.spiffs_blocksize=4096
-gen4iod.menu.FlashSize.512K128=512K (128K SPIFFS)
-gen4iod.menu.FlashSize.512K128.build.flash_size=512K
-gen4iod.menu.FlashSize.512K128.build.flash_size_bytes=0x80000
-gen4iod.menu.FlashSize.512K128.build.flash_ld=eagle.flash.512k128.ld
-gen4iod.menu.FlashSize.512K128.build.spiffs_pagesize=256
-gen4iod.menu.FlashSize.512K128.upload.maximum_size=368624
-gen4iod.menu.FlashSize.512K128.build.rfcal_addr=0x7C000
-gen4iod.menu.FlashSize.512K128.build.spiffs_start=0x5B000
-gen4iod.menu.FlashSize.512K128.build.spiffs_end=0x7B000
-gen4iod.menu.FlashSize.512K128.build.spiffs_blocksize=4096
-gen4iod.menu.LwIPVariant.v2mss536=v2 Lower Memory
-gen4iod.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-gen4iod.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-gen4iod.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-gen4iod.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-gen4iod.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-gen4iod.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-gen4iod.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-gen4iod.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-gen4iod.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-gen4iod.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-gen4iod.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-gen4iod.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-gen4iod.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-gen4iod.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-gen4iod.menu.Debug.Disabled=Disabled
-gen4iod.menu.Debug.Disabled.build.debug_port=
-gen4iod.menu.Debug.Serial=Serial
-gen4iod.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-gen4iod.menu.Debug.Serial1=Serial1
-gen4iod.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-gen4iod.menu.DebugLevel.None____=None
-gen4iod.menu.DebugLevel.None____.build.debug_level=
-gen4iod.menu.DebugLevel.SSL=SSL
-gen4iod.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-gen4iod.menu.DebugLevel.TLS_MEM=TLS_MEM
-gen4iod.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-gen4iod.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-gen4iod.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-gen4iod.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-gen4iod.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-gen4iod.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-gen4iod.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-gen4iod.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-gen4iod.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-gen4iod.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-gen4iod.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-gen4iod.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-gen4iod.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-gen4iod.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.CORE=CORE
-gen4iod.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-gen4iod.menu.DebugLevel.WIFI=WIFI
-gen4iod.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-gen4iod.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-gen4iod.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-gen4iod.menu.DebugLevel.UPDATER=UPDATER
-gen4iod.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-gen4iod.menu.DebugLevel.OTA=OTA
-gen4iod.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-gen4iod.menu.DebugLevel.OOM=OOM
-gen4iod.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-gen4iod.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-gen4iod.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-gen4iod.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-gen4iod.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-gen4iod.menu.FlashErase.none=Only Sketch
-gen4iod.menu.FlashErase.none.upload.erase_cmd=
-gen4iod.menu.FlashErase.sdk=Sketch + WiFi Settings
-gen4iod.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-gen4iod.menu.FlashErase.all=All Flash Contents
-gen4iod.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-gen4iod.menu.UploadSpeed.115200=115200
-gen4iod.menu.UploadSpeed.115200.upload.speed=115200
-gen4iod.menu.UploadSpeed.9600=9600
-gen4iod.menu.UploadSpeed.9600.upload.speed=9600
-gen4iod.menu.UploadSpeed.57600=57600
-gen4iod.menu.UploadSpeed.57600.upload.speed=57600
-gen4iod.menu.UploadSpeed.230400.linux=230400
-gen4iod.menu.UploadSpeed.230400.macosx=230400
-gen4iod.menu.UploadSpeed.230400.upload.speed=230400
-gen4iod.menu.UploadSpeed.256000.windows=256000
-gen4iod.menu.UploadSpeed.256000.upload.speed=256000
-gen4iod.menu.UploadSpeed.460800.linux=460800
-gen4iod.menu.UploadSpeed.460800.macosx=460800
-gen4iod.menu.UploadSpeed.460800.upload.speed=460800
-gen4iod.menu.UploadSpeed.512000.windows=512000
-gen4iod.menu.UploadSpeed.512000.upload.speed=512000
-gen4iod.menu.UploadSpeed.921600=921600
-gen4iod.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-oak.name=Digistump Oak
-oak.build.board=ESP8266_OAK
-oak.build.variant=oak
-oak.upload.maximum_size=1040368
-oak.upload.tool=esptool
-oak.upload.maximum_data_size=81920
-oak.upload.wait_for_upload_port=true
-oak.upload.erase_cmd=
-oak.serial.disableDTR=true
-oak.serial.disableRTS=true
-oak.build.mcu=esp8266
-oak.build.core=esp8266
-oak.build.spiffs_pagesize=256
-oak.build.debug_port=
-oak.build.debug_level=
-oak.menu.CpuFrequency.80=80 MHz
-oak.menu.CpuFrequency.80.build.f_cpu=80000000L
-oak.menu.CpuFrequency.160=160 MHz
-oak.menu.CpuFrequency.160.build.f_cpu=160000000L
-oak.upload.resetmethod=none
-oak.build.flash_mode=dio
-oak.build.flash_freq=40
-oak.menu.FlashSize.4M1M=4M (1M SPIFFS)
-oak.menu.FlashSize.4M1M.build.flash_size=4M
-oak.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-oak.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-oak.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-oak.menu.FlashSize.4M1M.upload.maximum_size=1044464
-oak.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-oak.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-oak.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-oak.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-oak.menu.FlashSize.4M3M=4M (3M SPIFFS)
-oak.menu.FlashSize.4M3M.build.flash_size=4M
-oak.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-oak.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-oak.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-oak.menu.FlashSize.4M3M.upload.maximum_size=1044464
-oak.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-oak.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-oak.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-oak.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-oak.menu.LwIPVariant.v2mss536=v2 Lower Memory
-oak.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-oak.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-oak.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-oak.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-oak.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-oak.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-oak.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-oak.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-oak.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-oak.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-oak.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-oak.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-oak.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-oak.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-oak.menu.Debug.Disabled=Disabled
-oak.menu.Debug.Disabled.build.debug_port=
-oak.menu.Debug.Serial=Serial
-oak.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-oak.menu.Debug.Serial1=Serial1
-oak.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-oak.menu.DebugLevel.None____=None
-oak.menu.DebugLevel.None____.build.debug_level=
-oak.menu.DebugLevel.SSL=SSL
-oak.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-oak.menu.DebugLevel.TLS_MEM=TLS_MEM
-oak.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-oak.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-oak.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-oak.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-oak.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-oak.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-oak.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-oak.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-oak.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-oak.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-oak.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-oak.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-oak.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-oak.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-oak.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-oak.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.CORE=CORE
-oak.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-oak.menu.DebugLevel.WIFI=WIFI
-oak.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-oak.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-oak.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-oak.menu.DebugLevel.UPDATER=UPDATER
-oak.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-oak.menu.DebugLevel.OTA=OTA
-oak.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-oak.menu.DebugLevel.OOM=OOM
-oak.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-oak.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-oak.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -include "umm_malloc/umm_malloc_cfg.h"
-oak.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-oak.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-oak.menu.FlashErase.none=Only Sketch
-oak.menu.FlashErase.none.upload.erase_cmd=
-oak.menu.FlashErase.sdk=Sketch + WiFi Settings
-oak.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-oak.menu.FlashErase.all=All Flash Contents
-oak.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-oak.menu.UploadSpeed.921600=921600
-oak.menu.UploadSpeed.921600.upload.speed=921600
-oak.menu.UploadSpeed.9600=9600
-oak.menu.UploadSpeed.9600.upload.speed=9600
-oak.menu.UploadSpeed.57600=57600
-oak.menu.UploadSpeed.57600.upload.speed=57600
-oak.menu.UploadSpeed.115200=115200
-oak.menu.UploadSpeed.115200.upload.speed=115200
-oak.menu.UploadSpeed.230400.linux=230400
-oak.menu.UploadSpeed.230400.macosx=230400
-oak.menu.UploadSpeed.230400.upload.speed=230400
-oak.menu.UploadSpeed.256000.windows=256000
-oak.menu.UploadSpeed.256000.upload.speed=256000
-oak.menu.UploadSpeed.460800.linux=460800
-oak.menu.UploadSpeed.460800.macosx=460800
-oak.menu.UploadSpeed.460800.upload.speed=460800
-oak.menu.UploadSpeed.512000.windows=512000
-oak.menu.UploadSpeed.512000.upload.speed=512000
-
diff --git a/arduino/version 2.5.0/boards.txt b/arduino/version 2.5.0/boards.txt
new file mode 100644
index 000000000000..2334302b8d4a
--- /dev/null
+++ b/arduino/version 2.5.0/boards.txt
@@ -0,0 +1,6086 @@
+#
+# Do not create pull-requests for this file only, CI will not accept them.
+# You *must* edit/modify/run boards.txt.py to regenerate boards.txt.
+# All modified files after running with option "--allgen" must be included in the pull-request.
+#
+
+menu.BoardModel=Model
+menu.baud=Upload Speed
+menu.UploadTool=Upload Using
+menu.xtal=CPU Frequency
+menu.CrystalFreq=Crystal Frequency
+menu.eesz=Flash Size
+menu.FlashMode=Flash Mode
+menu.FlashFreq=Flash Frequency
+menu.ResetMethod=Reset Method
+menu.ESPModule=Module
+menu.dbg=Debug port
+menu.lvl=Debug Level
+menu.ip=lwIP Variant
+menu.vt=VTables
+menu.exception=Exceptions
+menu.led=Builtin Led
+menu.wipe=Erase Flash
+
+##############################################################
+generic.name=Generic ESP8266 Module
+generic.build.board=ESP8266_GENERIC
+generic.upload.tool=esptool
+generic.upload.maximum_data_size=81920
+generic.upload.wait_for_upload_port=true
+generic.upload.erase_cmd=
+generic.serial.disableDTR=true
+generic.serial.disableRTS=true
+generic.build.mcu=esp8266
+generic.build.core=esp8266
+generic.build.variant=generic
+generic.build.spiffs_pagesize=256
+generic.build.debug_port=
+generic.build.debug_level=
+
+generic.menu.UploadTool.esptool=Serial
+generic.menu.UploadTool.esptool.upload.tool=esptool
+generic.menu.UploadTool.esptool.upload.verbose=-vv
+generic.menu.UploadTool.espupload=OTA_upload
+generic.menu.UploadTool.espupload.upload.tool=espupload
+
+generic.menu.xtal.80=80 MHz
+generic.menu.xtal.80.build.f_cpu=80000000L
+generic.menu.xtal.160=160 MHz
+generic.menu.xtal.160.build.f_cpu=160000000L
+generic.menu.vt.flash=Flash
+generic.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+generic.menu.vt.heap=Heap
+generic.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+generic.menu.vt.iram=IRAM
+generic.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+generic.menu.exception.enabled=Enabled
+generic.menu.exception.enabled.build.exception_flags=-fexceptions
+generic.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+generic.menu.exception.disabled=Disabled
+generic.menu.exception.disabled.build.exception_flags=-fno-exceptions
+generic.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+generic.menu.ResetMethod.ck=ck
+generic.menu.ResetMethod.ck.upload.resetmethod=ck
+generic.menu.ResetMethod.nodemcu=nodemcu
+generic.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
+generic.menu.ResetMethod.none=none
+generic.menu.ResetMethod.none.upload.resetmethod=none
+generic.menu.ResetMethod.dtrset=dtrset
+generic.menu.ResetMethod.dtrset.upload.resetmethod=dtrset
+generic.menu.CrystalFreq.26=26 MHz
+generic.menu.CrystalFreq.40=40 MHz
+generic.menu.CrystalFreq.40.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
+generic.menu.FlashFreq.40=40MHz
+generic.menu.FlashFreq.40.build.flash_freq=40
+generic.menu.FlashFreq.80=80MHz
+generic.menu.FlashFreq.80.build.flash_freq=80
+generic.menu.FlashMode.qio=QIO
+generic.menu.FlashMode.qio.build.flash_mode=qio
+generic.menu.FlashMode.qout=QOUT
+generic.menu.FlashMode.qout.build.flash_mode=qout
+generic.menu.FlashMode.dio=DIO
+generic.menu.FlashMode.dio.build.flash_mode=dio
+generic.menu.FlashMode.dout=DOUT
+generic.menu.FlashMode.dout.build.flash_mode=dout
+generic.menu.eesz.512K=512K (no SPIFFS)
+generic.menu.eesz.512K.build.flash_size=512K
+generic.menu.eesz.512K.build.flash_size_bytes=0x80000
+generic.menu.eesz.512K.build.flash_ld=eagle.flash.512k.ld
+generic.menu.eesz.512K.build.spiffs_pagesize=256
+generic.menu.eesz.512K.upload.maximum_size=499696
+generic.menu.eesz.512K.build.rfcal_addr=0x7C000
+generic.menu.eesz.512K32=512K (32K SPIFFS)
+generic.menu.eesz.512K32.build.flash_size=512K
+generic.menu.eesz.512K32.build.flash_size_bytes=0x80000
+generic.menu.eesz.512K32.build.flash_ld=eagle.flash.512k32.ld
+generic.menu.eesz.512K32.build.spiffs_pagesize=256
+generic.menu.eesz.512K32.upload.maximum_size=466928
+generic.menu.eesz.512K32.build.rfcal_addr=0x7C000
+generic.menu.eesz.512K32.build.spiffs_start=0x73000
+generic.menu.eesz.512K32.build.spiffs_end=0x7B000
+generic.menu.eesz.512K32.build.spiffs_blocksize=4096
+generic.menu.eesz.512K64=512K (64K SPIFFS)
+generic.menu.eesz.512K64.build.flash_size=512K
+generic.menu.eesz.512K64.build.flash_size_bytes=0x80000
+generic.menu.eesz.512K64.build.flash_ld=eagle.flash.512k64.ld
+generic.menu.eesz.512K64.build.spiffs_pagesize=256
+generic.menu.eesz.512K64.upload.maximum_size=434160
+generic.menu.eesz.512K64.build.rfcal_addr=0x7C000
+generic.menu.eesz.512K64.build.spiffs_start=0x6B000
+generic.menu.eesz.512K64.build.spiffs_end=0x7B000
+generic.menu.eesz.512K64.build.spiffs_blocksize=4096
+generic.menu.eesz.512K128=512K (128K SPIFFS)
+generic.menu.eesz.512K128.build.flash_size=512K
+generic.menu.eesz.512K128.build.flash_size_bytes=0x80000
+generic.menu.eesz.512K128.build.flash_ld=eagle.flash.512k128.ld
+generic.menu.eesz.512K128.build.spiffs_pagesize=256
+generic.menu.eesz.512K128.upload.maximum_size=368624
+generic.menu.eesz.512K128.build.rfcal_addr=0x7C000
+generic.menu.eesz.512K128.build.spiffs_start=0x5B000
+generic.menu.eesz.512K128.build.spiffs_end=0x7B000
+generic.menu.eesz.512K128.build.spiffs_blocksize=4096
+generic.menu.eesz.1M=1M (no SPIFFS)
+generic.menu.eesz.1M.build.flash_size=1M
+generic.menu.eesz.1M.build.flash_size_bytes=0x100000
+generic.menu.eesz.1M.build.flash_ld=eagle.flash.1m.ld
+generic.menu.eesz.1M.build.spiffs_pagesize=256
+generic.menu.eesz.1M.upload.maximum_size=1023984
+generic.menu.eesz.1M.build.rfcal_addr=0xFC000
+generic.menu.eesz.1M64=1M (64K SPIFFS)
+generic.menu.eesz.1M64.build.flash_size=1M
+generic.menu.eesz.1M64.build.flash_size_bytes=0x100000
+generic.menu.eesz.1M64.build.flash_ld=eagle.flash.1m64.ld
+generic.menu.eesz.1M64.build.spiffs_pagesize=256
+generic.menu.eesz.1M64.upload.maximum_size=958448
+generic.menu.eesz.1M64.build.rfcal_addr=0xFC000
+generic.menu.eesz.1M64.build.spiffs_start=0xEB000
+generic.menu.eesz.1M64.build.spiffs_end=0xFB000
+generic.menu.eesz.1M64.build.spiffs_blocksize=4096
+generic.menu.eesz.1M128=1M (128K SPIFFS)
+generic.menu.eesz.1M128.build.flash_size=1M
+generic.menu.eesz.1M128.build.flash_size_bytes=0x100000
+generic.menu.eesz.1M128.build.flash_ld=eagle.flash.1m128.ld
+generic.menu.eesz.1M128.build.spiffs_pagesize=256
+generic.menu.eesz.1M128.upload.maximum_size=892912
+generic.menu.eesz.1M128.build.rfcal_addr=0xFC000
+generic.menu.eesz.1M128.build.spiffs_start=0xDB000
+generic.menu.eesz.1M128.build.spiffs_end=0xFB000
+generic.menu.eesz.1M128.build.spiffs_blocksize=4096
+generic.menu.eesz.1M144=1M (144K SPIFFS)
+generic.menu.eesz.1M144.build.flash_size=1M
+generic.menu.eesz.1M144.build.flash_size_bytes=0x100000
+generic.menu.eesz.1M144.build.flash_ld=eagle.flash.1m144.ld
+generic.menu.eesz.1M144.build.spiffs_pagesize=256
+generic.menu.eesz.1M144.upload.maximum_size=876528
+generic.menu.eesz.1M144.build.rfcal_addr=0xFC000
+generic.menu.eesz.1M144.build.spiffs_start=0xD7000
+generic.menu.eesz.1M144.build.spiffs_end=0xFB000
+generic.menu.eesz.1M144.build.spiffs_blocksize=4096
+generic.menu.eesz.1M160=1M (160K SPIFFS)
+generic.menu.eesz.1M160.build.flash_size=1M
+generic.menu.eesz.1M160.build.flash_size_bytes=0x100000
+generic.menu.eesz.1M160.build.flash_ld=eagle.flash.1m160.ld
+generic.menu.eesz.1M160.build.spiffs_pagesize=256
+generic.menu.eesz.1M160.upload.maximum_size=860144
+generic.menu.eesz.1M160.build.rfcal_addr=0xFC000
+generic.menu.eesz.1M160.build.spiffs_start=0xD3000
+generic.menu.eesz.1M160.build.spiffs_end=0xFB000
+generic.menu.eesz.1M160.build.spiffs_blocksize=4096
+generic.menu.eesz.1M192=1M (192K SPIFFS)
+generic.menu.eesz.1M192.build.flash_size=1M
+generic.menu.eesz.1M192.build.flash_size_bytes=0x100000
+generic.menu.eesz.1M192.build.flash_ld=eagle.flash.1m192.ld
+generic.menu.eesz.1M192.build.spiffs_pagesize=256
+generic.menu.eesz.1M192.upload.maximum_size=827376
+generic.menu.eesz.1M192.build.rfcal_addr=0xFC000
+generic.menu.eesz.1M192.build.spiffs_start=0xCB000
+generic.menu.eesz.1M192.build.spiffs_end=0xFB000
+generic.menu.eesz.1M192.build.spiffs_blocksize=4096
+generic.menu.eesz.1M256=1M (256K SPIFFS)
+generic.menu.eesz.1M256.build.flash_size=1M
+generic.menu.eesz.1M256.build.flash_size_bytes=0x100000
+generic.menu.eesz.1M256.build.flash_ld=eagle.flash.1m256.ld
+generic.menu.eesz.1M256.build.spiffs_pagesize=256
+generic.menu.eesz.1M256.upload.maximum_size=761840
+generic.menu.eesz.1M256.build.rfcal_addr=0xFC000
+generic.menu.eesz.1M256.build.spiffs_start=0xBB000
+generic.menu.eesz.1M256.build.spiffs_end=0xFB000
+generic.menu.eesz.1M256.build.spiffs_blocksize=4096
+generic.menu.eesz.1M512=1M (512K SPIFFS)
+generic.menu.eesz.1M512.build.flash_size=1M
+generic.menu.eesz.1M512.build.flash_size_bytes=0x100000
+generic.menu.eesz.1M512.build.flash_ld=eagle.flash.1m512.ld
+generic.menu.eesz.1M512.build.spiffs_pagesize=256
+generic.menu.eesz.1M512.upload.maximum_size=499696
+generic.menu.eesz.1M512.build.rfcal_addr=0xFC000
+generic.menu.eesz.1M512.build.spiffs_start=0x7B000
+generic.menu.eesz.1M512.build.spiffs_end=0xFB000
+generic.menu.eesz.1M512.build.spiffs_blocksize=4096
+generic.menu.eesz.2M=2M (no SPIFFS)
+generic.menu.eesz.2M.build.flash_size=2M
+generic.menu.eesz.2M.build.flash_size_bytes=0x200000
+generic.menu.eesz.2M.build.flash_ld=eagle.flash.2m.ld
+generic.menu.eesz.2M.build.spiffs_pagesize=256
+generic.menu.eesz.2M.upload.maximum_size=1044464
+generic.menu.eesz.2M.build.rfcal_addr=0x1FC000
+generic.menu.eesz.2M128=2M (128K SPIFFS)
+generic.menu.eesz.2M128.build.flash_size=2M
+generic.menu.eesz.2M128.build.flash_size_bytes=0x200000
+generic.menu.eesz.2M128.build.flash_ld=eagle.flash.2m128.ld
+generic.menu.eesz.2M128.build.spiffs_pagesize=256
+generic.menu.eesz.2M128.upload.maximum_size=1044464
+generic.menu.eesz.2M128.build.rfcal_addr=0x1FC000
+generic.menu.eesz.2M128.build.spiffs_start=0x1E0000
+generic.menu.eesz.2M128.build.spiffs_end=0x1FB000
+generic.menu.eesz.2M128.build.spiffs_blocksize=4096
+generic.menu.eesz.2M256=2M (256K SPIFFS)
+generic.menu.eesz.2M256.build.flash_size=2M
+generic.menu.eesz.2M256.build.flash_size_bytes=0x200000
+generic.menu.eesz.2M256.build.flash_ld=eagle.flash.2m256.ld
+generic.menu.eesz.2M256.build.spiffs_pagesize=256
+generic.menu.eesz.2M256.upload.maximum_size=1044464
+generic.menu.eesz.2M256.build.rfcal_addr=0x1FC000
+generic.menu.eesz.2M256.build.spiffs_start=0x1C0000
+generic.menu.eesz.2M256.build.spiffs_end=0x1FB000
+generic.menu.eesz.2M256.build.spiffs_blocksize=4096
+generic.menu.eesz.2M512=2M (512K SPIFFS)
+generic.menu.eesz.2M512.build.flash_size=2M
+generic.menu.eesz.2M512.build.flash_size_bytes=0x200000
+generic.menu.eesz.2M512.build.flash_ld=eagle.flash.2m512.ld
+generic.menu.eesz.2M512.build.spiffs_pagesize=256
+generic.menu.eesz.2M512.upload.maximum_size=1044464
+generic.menu.eesz.2M512.build.rfcal_addr=0x1FC000
+generic.menu.eesz.2M512.build.spiffs_start=0x180000
+generic.menu.eesz.2M512.build.spiffs_end=0x1FB000
+generic.menu.eesz.2M512.build.spiffs_blocksize=8192
+generic.menu.eesz.2M1M=2M (1M SPIFFS)
+generic.menu.eesz.2M1M.build.flash_size=2M
+generic.menu.eesz.2M1M.build.flash_size_bytes=0x200000
+generic.menu.eesz.2M1M.build.flash_ld=eagle.flash.2m1m.ld
+generic.menu.eesz.2M1M.build.spiffs_pagesize=256
+generic.menu.eesz.2M1M.upload.maximum_size=1044464
+generic.menu.eesz.2M1M.build.rfcal_addr=0x1FC000
+generic.menu.eesz.2M1M.build.spiffs_start=0x100000
+generic.menu.eesz.2M1M.build.spiffs_end=0x1FB000
+generic.menu.eesz.2M1M.build.spiffs_blocksize=8192
+generic.menu.eesz.4M=4M (no SPIFFS)
+generic.menu.eesz.4M.build.flash_size=4M
+generic.menu.eesz.4M.build.flash_size_bytes=0x400000
+generic.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+generic.menu.eesz.4M.build.spiffs_pagesize=256
+generic.menu.eesz.4M.upload.maximum_size=1044464
+generic.menu.eesz.4M.build.rfcal_addr=0x3FC000
+generic.menu.eesz.4M1M=4M (1M SPIFFS)
+generic.menu.eesz.4M1M.build.flash_size=4M
+generic.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+generic.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+generic.menu.eesz.4M1M.build.spiffs_pagesize=256
+generic.menu.eesz.4M1M.upload.maximum_size=1044464
+generic.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+generic.menu.eesz.4M1M.build.spiffs_start=0x300000
+generic.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+generic.menu.eesz.4M1M.build.spiffs_blocksize=8192
+generic.menu.eesz.4M2M=4M (2M SPIFFS)
+generic.menu.eesz.4M2M.build.flash_size=4M
+generic.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+generic.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+generic.menu.eesz.4M2M.build.spiffs_pagesize=256
+generic.menu.eesz.4M2M.upload.maximum_size=1044464
+generic.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+generic.menu.eesz.4M2M.build.spiffs_start=0x200000
+generic.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+generic.menu.eesz.4M2M.build.spiffs_blocksize=8192
+generic.menu.eesz.4M3M=4M (3M SPIFFS)
+generic.menu.eesz.4M3M.build.flash_size=4M
+generic.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+generic.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+generic.menu.eesz.4M3M.build.spiffs_pagesize=256
+generic.menu.eesz.4M3M.upload.maximum_size=1044464
+generic.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+generic.menu.eesz.4M3M.build.spiffs_start=0x100000
+generic.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+generic.menu.eesz.4M3M.build.spiffs_blocksize=8192
+generic.menu.eesz.8M6M=8M (6M SPIFFS)
+generic.menu.eesz.8M6M.build.flash_size=8M
+generic.menu.eesz.8M6M.build.flash_size_bytes=0x800000
+generic.menu.eesz.8M6M.build.flash_ld=eagle.flash.8m6m.ld
+generic.menu.eesz.8M6M.build.spiffs_pagesize=256
+generic.menu.eesz.8M6M.upload.maximum_size=1044464
+generic.menu.eesz.8M6M.build.rfcal_addr=0x7FC000
+generic.menu.eesz.8M6M.build.spiffs_start=0x200000
+generic.menu.eesz.8M6M.build.spiffs_end=0x7FB000
+generic.menu.eesz.8M6M.build.spiffs_blocksize=8192
+generic.menu.eesz.8M7M=8M (7M SPIFFS)
+generic.menu.eesz.8M7M.build.flash_size=8M
+generic.menu.eesz.8M7M.build.flash_size_bytes=0x800000
+generic.menu.eesz.8M7M.build.flash_ld=eagle.flash.8m7m.ld
+generic.menu.eesz.8M7M.build.spiffs_pagesize=256
+generic.menu.eesz.8M7M.upload.maximum_size=1044464
+generic.menu.eesz.8M7M.build.rfcal_addr=0x7FC000
+generic.menu.eesz.8M7M.build.spiffs_start=0x100000
+generic.menu.eesz.8M7M.build.spiffs_end=0x7FB000
+generic.menu.eesz.8M7M.build.spiffs_blocksize=8192
+generic.menu.eesz.16M14M=16M (14M SPIFFS)
+generic.menu.eesz.16M14M.build.flash_size=16M
+generic.menu.eesz.16M14M.build.flash_size_bytes=0x1000000
+generic.menu.eesz.16M14M.build.flash_ld=eagle.flash.16m14m.ld
+generic.menu.eesz.16M14M.build.spiffs_pagesize=256
+generic.menu.eesz.16M14M.upload.maximum_size=1044464
+generic.menu.eesz.16M14M.build.rfcal_addr=0xFFC000
+generic.menu.eesz.16M14M.build.spiffs_start=0x200000
+generic.menu.eesz.16M14M.build.spiffs_end=0xFFB000
+generic.menu.eesz.16M14M.build.spiffs_blocksize=8192
+generic.menu.eesz.16M15M=16M (15M SPIFFS)
+generic.menu.eesz.16M15M.build.flash_size=16M
+generic.menu.eesz.16M15M.build.flash_size_bytes=0x1000000
+generic.menu.eesz.16M15M.build.flash_ld=eagle.flash.16m15m.ld
+generic.menu.eesz.16M15M.build.spiffs_pagesize=256
+generic.menu.eesz.16M15M.upload.maximum_size=1044464
+generic.menu.eesz.16M15M.build.rfcal_addr=0xFFC000
+generic.menu.eesz.16M15M.build.spiffs_start=0x100000
+generic.menu.eesz.16M15M.build.spiffs_end=0xFFB000
+generic.menu.eesz.16M15M.build.spiffs_blocksize=8192
+generic.menu.led.2=2
+generic.menu.led.2.build.led=-DLED_BUILTIN=2
+generic.menu.led.0=0
+generic.menu.led.0.build.led=-DLED_BUILTIN=0
+generic.menu.led.1=1
+generic.menu.led.1.build.led=-DLED_BUILTIN=1
+generic.menu.led.3=3
+generic.menu.led.3.build.led=-DLED_BUILTIN=3
+generic.menu.led.4=4
+generic.menu.led.4.build.led=-DLED_BUILTIN=4
+generic.menu.led.5=5
+generic.menu.led.5.build.led=-DLED_BUILTIN=5
+generic.menu.led.6=6
+generic.menu.led.6.build.led=-DLED_BUILTIN=6
+generic.menu.led.7=7
+generic.menu.led.7.build.led=-DLED_BUILTIN=7
+generic.menu.led.8=8
+generic.menu.led.8.build.led=-DLED_BUILTIN=8
+generic.menu.led.9=9
+generic.menu.led.9.build.led=-DLED_BUILTIN=9
+generic.menu.led.10=10
+generic.menu.led.10.build.led=-DLED_BUILTIN=10
+generic.menu.led.11=11
+generic.menu.led.11.build.led=-DLED_BUILTIN=11
+generic.menu.led.12=12
+generic.menu.led.12.build.led=-DLED_BUILTIN=12
+generic.menu.led.13=13
+generic.menu.led.13.build.led=-DLED_BUILTIN=13
+generic.menu.led.14=14
+generic.menu.led.14.build.led=-DLED_BUILTIN=14
+generic.menu.led.15=15
+generic.menu.led.15.build.led=-DLED_BUILTIN=15
+generic.menu.ip.lm2f=v2 Lower Memory
+generic.menu.ip.lm2f.build.lwip_include=lwip2/include
+generic.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+generic.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+generic.menu.ip.hb2f=v2 Higher Bandwidth
+generic.menu.ip.hb2f.build.lwip_include=lwip2/include
+generic.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+generic.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+generic.menu.ip.lm2n=v2 Lower Memory (no features)
+generic.menu.ip.lm2n.build.lwip_include=lwip2/include
+generic.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+generic.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+generic.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+generic.menu.ip.hb2n.build.lwip_include=lwip2/include
+generic.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+generic.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+generic.menu.ip.lm6f=v2 IPv6 Lower Memory
+generic.menu.ip.lm6f.build.lwip_include=lwip2/include
+generic.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+generic.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+generic.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+generic.menu.ip.hb6f.build.lwip_include=lwip2/include
+generic.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+generic.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+generic.menu.ip.hb1=v1.4 Higher Bandwidth
+generic.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+generic.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+generic.menu.ip.src=v1.4 Compile from source
+generic.menu.ip.src.build.lwip_lib=-llwip_src
+generic.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+generic.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+generic.menu.dbg.Disabled=Disabled
+generic.menu.dbg.Disabled.build.debug_port=
+generic.menu.dbg.Serial=Serial
+generic.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+generic.menu.dbg.Serial1=Serial1
+generic.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+generic.menu.lvl.None____=None
+generic.menu.lvl.None____.build.debug_level=
+generic.menu.lvl.SSL=SSL
+generic.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+generic.menu.lvl.TLS_MEM=TLS_MEM
+generic.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+generic.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+generic.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+generic.menu.lvl.HTTP_SERVER=HTTP_SERVER
+generic.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+generic.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+generic.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+generic.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+generic.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+generic.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+generic.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+generic.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+generic.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+generic.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+generic.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+generic.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+generic.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+generic.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+generic.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+generic.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+generic.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+generic.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+generic.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+generic.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+generic.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+generic.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+generic.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+generic.menu.lvl.CORE=CORE
+generic.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+generic.menu.lvl.WIFI=WIFI
+generic.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+generic.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+generic.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+generic.menu.lvl.UPDATER=UPDATER
+generic.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+generic.menu.lvl.OTA=OTA
+generic.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+generic.menu.lvl.OOM=OOM
+generic.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+generic.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+generic.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+generic.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+generic.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+generic.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+generic.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+generic.menu.wipe.none=Only Sketch
+generic.menu.wipe.none.upload.erase_cmd=
+generic.menu.wipe.sdk=Sketch + WiFi Settings
+generic.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+generic.menu.wipe.all=All Flash Contents
+generic.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+generic.menu.baud.115200=115200
+generic.menu.baud.115200.upload.speed=115200
+generic.menu.baud.9600=9600
+generic.menu.baud.9600.upload.speed=9600
+generic.menu.baud.57600=57600
+generic.menu.baud.57600.upload.speed=57600
+generic.menu.baud.230400.linux=230400
+generic.menu.baud.230400.macosx=230400
+generic.menu.baud.230400.upload.speed=230400
+generic.menu.baud.256000.windows=256000
+generic.menu.baud.256000.upload.speed=256000
+generic.menu.baud.460800.linux=460800
+generic.menu.baud.460800.macosx=460800
+generic.menu.baud.460800.upload.speed=460800
+generic.menu.baud.512000.windows=512000
+generic.menu.baud.512000.upload.speed=512000
+generic.menu.baud.921600=921600
+generic.menu.baud.921600.upload.speed=921600
+
+##############################################################
+esp8285.name=Generic ESP8285 Module
+esp8285.build.board=ESP8266_ESP01
+esp8285.build.variant=esp8285
+esp8285.upload.tool=esptool
+esp8285.upload.maximum_data_size=81920
+esp8285.upload.wait_for_upload_port=true
+esp8285.upload.erase_cmd=
+esp8285.serial.disableDTR=true
+esp8285.serial.disableRTS=true
+esp8285.build.mcu=esp8266
+esp8285.build.core=esp8266
+esp8285.build.spiffs_pagesize=256
+esp8285.build.debug_port=
+esp8285.build.debug_level=
+esp8285.menu.xtal.80=80 MHz
+esp8285.menu.xtal.80.build.f_cpu=80000000L
+esp8285.menu.xtal.160=160 MHz
+esp8285.menu.xtal.160.build.f_cpu=160000000L
+esp8285.menu.vt.flash=Flash
+esp8285.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+esp8285.menu.vt.heap=Heap
+esp8285.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+esp8285.menu.vt.iram=IRAM
+esp8285.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+esp8285.menu.exception.enabled=Enabled
+esp8285.menu.exception.enabled.build.exception_flags=-fexceptions
+esp8285.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+esp8285.menu.exception.disabled=Disabled
+esp8285.menu.exception.disabled.build.exception_flags=-fno-exceptions
+esp8285.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+esp8285.menu.ResetMethod.ck=ck
+esp8285.menu.ResetMethod.ck.upload.resetmethod=ck
+esp8285.menu.ResetMethod.nodemcu=nodemcu
+esp8285.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
+esp8285.menu.ResetMethod.none=none
+esp8285.menu.ResetMethod.none.upload.resetmethod=none
+esp8285.menu.ResetMethod.dtrset=dtrset
+esp8285.menu.ResetMethod.dtrset.upload.resetmethod=dtrset
+esp8285.menu.CrystalFreq.26=26 MHz
+esp8285.menu.CrystalFreq.40=40 MHz
+esp8285.menu.CrystalFreq.40.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
+esp8285.build.flash_mode=dout
+esp8285.build.flash_freq=40
+esp8285.menu.eesz.1M=1M (no SPIFFS)
+esp8285.menu.eesz.1M.build.flash_size=1M
+esp8285.menu.eesz.1M.build.flash_size_bytes=0x100000
+esp8285.menu.eesz.1M.build.flash_ld=eagle.flash.1m.ld
+esp8285.menu.eesz.1M.build.spiffs_pagesize=256
+esp8285.menu.eesz.1M.upload.maximum_size=1023984
+esp8285.menu.eesz.1M.build.rfcal_addr=0xFC000
+esp8285.menu.eesz.1M64=1M (64K SPIFFS)
+esp8285.menu.eesz.1M64.build.flash_size=1M
+esp8285.menu.eesz.1M64.build.flash_size_bytes=0x100000
+esp8285.menu.eesz.1M64.build.flash_ld=eagle.flash.1m64.ld
+esp8285.menu.eesz.1M64.build.spiffs_pagesize=256
+esp8285.menu.eesz.1M64.upload.maximum_size=958448
+esp8285.menu.eesz.1M64.build.rfcal_addr=0xFC000
+esp8285.menu.eesz.1M64.build.spiffs_start=0xEB000
+esp8285.menu.eesz.1M64.build.spiffs_end=0xFB000
+esp8285.menu.eesz.1M64.build.spiffs_blocksize=4096
+esp8285.menu.eesz.1M128=1M (128K SPIFFS)
+esp8285.menu.eesz.1M128.build.flash_size=1M
+esp8285.menu.eesz.1M128.build.flash_size_bytes=0x100000
+esp8285.menu.eesz.1M128.build.flash_ld=eagle.flash.1m128.ld
+esp8285.menu.eesz.1M128.build.spiffs_pagesize=256
+esp8285.menu.eesz.1M128.upload.maximum_size=892912
+esp8285.menu.eesz.1M128.build.rfcal_addr=0xFC000
+esp8285.menu.eesz.1M128.build.spiffs_start=0xDB000
+esp8285.menu.eesz.1M128.build.spiffs_end=0xFB000
+esp8285.menu.eesz.1M128.build.spiffs_blocksize=4096
+esp8285.menu.eesz.1M144=1M (144K SPIFFS)
+esp8285.menu.eesz.1M144.build.flash_size=1M
+esp8285.menu.eesz.1M144.build.flash_size_bytes=0x100000
+esp8285.menu.eesz.1M144.build.flash_ld=eagle.flash.1m144.ld
+esp8285.menu.eesz.1M144.build.spiffs_pagesize=256
+esp8285.menu.eesz.1M144.upload.maximum_size=876528
+esp8285.menu.eesz.1M144.build.rfcal_addr=0xFC000
+esp8285.menu.eesz.1M144.build.spiffs_start=0xD7000
+esp8285.menu.eesz.1M144.build.spiffs_end=0xFB000
+esp8285.menu.eesz.1M144.build.spiffs_blocksize=4096
+esp8285.menu.eesz.1M160=1M (160K SPIFFS)
+esp8285.menu.eesz.1M160.build.flash_size=1M
+esp8285.menu.eesz.1M160.build.flash_size_bytes=0x100000
+esp8285.menu.eesz.1M160.build.flash_ld=eagle.flash.1m160.ld
+esp8285.menu.eesz.1M160.build.spiffs_pagesize=256
+esp8285.menu.eesz.1M160.upload.maximum_size=860144
+esp8285.menu.eesz.1M160.build.rfcal_addr=0xFC000
+esp8285.menu.eesz.1M160.build.spiffs_start=0xD3000
+esp8285.menu.eesz.1M160.build.spiffs_end=0xFB000
+esp8285.menu.eesz.1M160.build.spiffs_blocksize=4096
+esp8285.menu.eesz.1M192=1M (192K SPIFFS)
+esp8285.menu.eesz.1M192.build.flash_size=1M
+esp8285.menu.eesz.1M192.build.flash_size_bytes=0x100000
+esp8285.menu.eesz.1M192.build.flash_ld=eagle.flash.1m192.ld
+esp8285.menu.eesz.1M192.build.spiffs_pagesize=256
+esp8285.menu.eesz.1M192.upload.maximum_size=827376
+esp8285.menu.eesz.1M192.build.rfcal_addr=0xFC000
+esp8285.menu.eesz.1M192.build.spiffs_start=0xCB000
+esp8285.menu.eesz.1M192.build.spiffs_end=0xFB000
+esp8285.menu.eesz.1M192.build.spiffs_blocksize=4096
+esp8285.menu.eesz.1M256=1M (256K SPIFFS)
+esp8285.menu.eesz.1M256.build.flash_size=1M
+esp8285.menu.eesz.1M256.build.flash_size_bytes=0x100000
+esp8285.menu.eesz.1M256.build.flash_ld=eagle.flash.1m256.ld
+esp8285.menu.eesz.1M256.build.spiffs_pagesize=256
+esp8285.menu.eesz.1M256.upload.maximum_size=761840
+esp8285.menu.eesz.1M256.build.rfcal_addr=0xFC000
+esp8285.menu.eesz.1M256.build.spiffs_start=0xBB000
+esp8285.menu.eesz.1M256.build.spiffs_end=0xFB000
+esp8285.menu.eesz.1M256.build.spiffs_blocksize=4096
+esp8285.menu.eesz.1M512=1M (512K SPIFFS)
+esp8285.menu.eesz.1M512.build.flash_size=1M
+esp8285.menu.eesz.1M512.build.flash_size_bytes=0x100000
+esp8285.menu.eesz.1M512.build.flash_ld=eagle.flash.1m512.ld
+esp8285.menu.eesz.1M512.build.spiffs_pagesize=256
+esp8285.menu.eesz.1M512.upload.maximum_size=499696
+esp8285.menu.eesz.1M512.build.rfcal_addr=0xFC000
+esp8285.menu.eesz.1M512.build.spiffs_start=0x7B000
+esp8285.menu.eesz.1M512.build.spiffs_end=0xFB000
+esp8285.menu.eesz.1M512.build.spiffs_blocksize=4096
+esp8285.menu.led.2=2
+esp8285.menu.led.2.build.led=-DLED_BUILTIN=2
+esp8285.menu.led.0=0
+esp8285.menu.led.0.build.led=-DLED_BUILTIN=0
+esp8285.menu.led.1=1
+esp8285.menu.led.1.build.led=-DLED_BUILTIN=1
+esp8285.menu.led.3=3
+esp8285.menu.led.3.build.led=-DLED_BUILTIN=3
+esp8285.menu.led.4=4
+esp8285.menu.led.4.build.led=-DLED_BUILTIN=4
+esp8285.menu.led.5=5
+esp8285.menu.led.5.build.led=-DLED_BUILTIN=5
+esp8285.menu.led.6=6
+esp8285.menu.led.6.build.led=-DLED_BUILTIN=6
+esp8285.menu.led.7=7
+esp8285.menu.led.7.build.led=-DLED_BUILTIN=7
+esp8285.menu.led.8=8
+esp8285.menu.led.8.build.led=-DLED_BUILTIN=8
+esp8285.menu.led.9=9
+esp8285.menu.led.9.build.led=-DLED_BUILTIN=9
+esp8285.menu.led.10=10
+esp8285.menu.led.10.build.led=-DLED_BUILTIN=10
+esp8285.menu.led.11=11
+esp8285.menu.led.11.build.led=-DLED_BUILTIN=11
+esp8285.menu.led.12=12
+esp8285.menu.led.12.build.led=-DLED_BUILTIN=12
+esp8285.menu.led.13=13
+esp8285.menu.led.13.build.led=-DLED_BUILTIN=13
+esp8285.menu.led.14=14
+esp8285.menu.led.14.build.led=-DLED_BUILTIN=14
+esp8285.menu.led.15=15
+esp8285.menu.led.15.build.led=-DLED_BUILTIN=15
+esp8285.menu.ip.lm2f=v2 Lower Memory
+esp8285.menu.ip.lm2f.build.lwip_include=lwip2/include
+esp8285.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+esp8285.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+esp8285.menu.ip.hb2f=v2 Higher Bandwidth
+esp8285.menu.ip.hb2f.build.lwip_include=lwip2/include
+esp8285.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+esp8285.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+esp8285.menu.ip.lm2n=v2 Lower Memory (no features)
+esp8285.menu.ip.lm2n.build.lwip_include=lwip2/include
+esp8285.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+esp8285.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+esp8285.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+esp8285.menu.ip.hb2n.build.lwip_include=lwip2/include
+esp8285.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+esp8285.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+esp8285.menu.ip.lm6f=v2 IPv6 Lower Memory
+esp8285.menu.ip.lm6f.build.lwip_include=lwip2/include
+esp8285.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+esp8285.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+esp8285.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+esp8285.menu.ip.hb6f.build.lwip_include=lwip2/include
+esp8285.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+esp8285.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+esp8285.menu.ip.hb1=v1.4 Higher Bandwidth
+esp8285.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+esp8285.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+esp8285.menu.ip.src=v1.4 Compile from source
+esp8285.menu.ip.src.build.lwip_lib=-llwip_src
+esp8285.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+esp8285.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+esp8285.menu.dbg.Disabled=Disabled
+esp8285.menu.dbg.Disabled.build.debug_port=
+esp8285.menu.dbg.Serial=Serial
+esp8285.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+esp8285.menu.dbg.Serial1=Serial1
+esp8285.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+esp8285.menu.lvl.None____=None
+esp8285.menu.lvl.None____.build.debug_level=
+esp8285.menu.lvl.SSL=SSL
+esp8285.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+esp8285.menu.lvl.TLS_MEM=TLS_MEM
+esp8285.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+esp8285.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+esp8285.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+esp8285.menu.lvl.HTTP_SERVER=HTTP_SERVER
+esp8285.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+esp8285.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+esp8285.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+esp8285.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+esp8285.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+esp8285.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+esp8285.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+esp8285.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+esp8285.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+esp8285.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+esp8285.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+esp8285.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+esp8285.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+esp8285.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+esp8285.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+esp8285.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+esp8285.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+esp8285.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+esp8285.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+esp8285.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+esp8285.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+esp8285.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+esp8285.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+esp8285.menu.lvl.CORE=CORE
+esp8285.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+esp8285.menu.lvl.WIFI=WIFI
+esp8285.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+esp8285.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+esp8285.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+esp8285.menu.lvl.UPDATER=UPDATER
+esp8285.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+esp8285.menu.lvl.OTA=OTA
+esp8285.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+esp8285.menu.lvl.OOM=OOM
+esp8285.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+esp8285.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+esp8285.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+esp8285.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+esp8285.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+esp8285.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+esp8285.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+esp8285.menu.wipe.none=Only Sketch
+esp8285.menu.wipe.none.upload.erase_cmd=
+esp8285.menu.wipe.sdk=Sketch + WiFi Settings
+esp8285.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+esp8285.menu.wipe.all=All Flash Contents
+esp8285.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+esp8285.menu.baud.115200=115200
+esp8285.menu.baud.115200.upload.speed=115200
+esp8285.menu.baud.9600=9600
+esp8285.menu.baud.9600.upload.speed=9600
+esp8285.menu.baud.57600=57600
+esp8285.menu.baud.57600.upload.speed=57600
+esp8285.menu.baud.230400.linux=230400
+esp8285.menu.baud.230400.macosx=230400
+esp8285.menu.baud.230400.upload.speed=230400
+esp8285.menu.baud.256000.windows=256000
+esp8285.menu.baud.256000.upload.speed=256000
+esp8285.menu.baud.460800.linux=460800
+esp8285.menu.baud.460800.macosx=460800
+esp8285.menu.baud.460800.upload.speed=460800
+esp8285.menu.baud.512000.windows=512000
+esp8285.menu.baud.512000.upload.speed=512000
+esp8285.menu.baud.921600=921600
+esp8285.menu.baud.921600.upload.speed=921600
+
+##############################################################
+espduino.name=ESPDuino (ESP-13 Module)
+espduino.build.board=ESP8266_ESP13
+espduino.build.variant=ESPDuino
+espduino.menu.ResetMethod.v2=ESPduino-V2
+espduino.menu.ResetMethod.v2.upload.resetmethod=nodemcu
+espduino.menu.ResetMethod.v1=ESPduino-V1
+espduino.menu.ResetMethod.v1.upload.resetmethod=ck
+espduino.menu.UploadTool.esptool=Serial
+espduino.menu.UploadTool.esptool.upload.tool=esptool
+espduino.menu.UploadTool.esptool.upload.verbose=-vv
+espduino.menu.UploadTool.espota=OTA
+espduino.menu.UploadTool.espota.upload.tool=espota
+espduino.upload.tool=esptool
+espduino.upload.maximum_data_size=81920
+espduino.upload.wait_for_upload_port=true
+espduino.upload.erase_cmd=
+espduino.serial.disableDTR=true
+espduino.serial.disableRTS=true
+espduino.build.mcu=esp8266
+espduino.build.core=esp8266
+espduino.build.spiffs_pagesize=256
+espduino.build.debug_port=
+espduino.build.debug_level=
+espduino.menu.xtal.80=80 MHz
+espduino.menu.xtal.80.build.f_cpu=80000000L
+espduino.menu.xtal.160=160 MHz
+espduino.menu.xtal.160.build.f_cpu=160000000L
+espduino.menu.vt.flash=Flash
+espduino.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+espduino.menu.vt.heap=Heap
+espduino.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+espduino.menu.vt.iram=IRAM
+espduino.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+espduino.menu.exception.enabled=Enabled
+espduino.menu.exception.enabled.build.exception_flags=-fexceptions
+espduino.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+espduino.menu.exception.disabled=Disabled
+espduino.menu.exception.disabled.build.exception_flags=-fno-exceptions
+espduino.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+espduino.build.flash_mode=dio
+espduino.build.flash_freq=40
+espduino.menu.eesz.4M=4M (no SPIFFS)
+espduino.menu.eesz.4M.build.flash_size=4M
+espduino.menu.eesz.4M.build.flash_size_bytes=0x400000
+espduino.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+espduino.menu.eesz.4M.build.spiffs_pagesize=256
+espduino.menu.eesz.4M.upload.maximum_size=1044464
+espduino.menu.eesz.4M.build.rfcal_addr=0x3FC000
+espduino.menu.eesz.4M1M=4M (1M SPIFFS)
+espduino.menu.eesz.4M1M.build.flash_size=4M
+espduino.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+espduino.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+espduino.menu.eesz.4M1M.build.spiffs_pagesize=256
+espduino.menu.eesz.4M1M.upload.maximum_size=1044464
+espduino.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+espduino.menu.eesz.4M1M.build.spiffs_start=0x300000
+espduino.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+espduino.menu.eesz.4M1M.build.spiffs_blocksize=8192
+espduino.menu.eesz.4M2M=4M (2M SPIFFS)
+espduino.menu.eesz.4M2M.build.flash_size=4M
+espduino.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+espduino.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+espduino.menu.eesz.4M2M.build.spiffs_pagesize=256
+espduino.menu.eesz.4M2M.upload.maximum_size=1044464
+espduino.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+espduino.menu.eesz.4M2M.build.spiffs_start=0x200000
+espduino.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+espduino.menu.eesz.4M2M.build.spiffs_blocksize=8192
+espduino.menu.eesz.4M3M=4M (3M SPIFFS)
+espduino.menu.eesz.4M3M.build.flash_size=4M
+espduino.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+espduino.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+espduino.menu.eesz.4M3M.build.spiffs_pagesize=256
+espduino.menu.eesz.4M3M.upload.maximum_size=1044464
+espduino.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+espduino.menu.eesz.4M3M.build.spiffs_start=0x100000
+espduino.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+espduino.menu.eesz.4M3M.build.spiffs_blocksize=8192
+espduino.menu.ip.lm2f=v2 Lower Memory
+espduino.menu.ip.lm2f.build.lwip_include=lwip2/include
+espduino.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+espduino.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espduino.menu.ip.hb2f=v2 Higher Bandwidth
+espduino.menu.ip.hb2f.build.lwip_include=lwip2/include
+espduino.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+espduino.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espduino.menu.ip.lm2n=v2 Lower Memory (no features)
+espduino.menu.ip.lm2n.build.lwip_include=lwip2/include
+espduino.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+espduino.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espduino.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+espduino.menu.ip.hb2n.build.lwip_include=lwip2/include
+espduino.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+espduino.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espduino.menu.ip.lm6f=v2 IPv6 Lower Memory
+espduino.menu.ip.lm6f.build.lwip_include=lwip2/include
+espduino.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+espduino.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espduino.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+espduino.menu.ip.hb6f.build.lwip_include=lwip2/include
+espduino.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+espduino.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espduino.menu.ip.hb1=v1.4 Higher Bandwidth
+espduino.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+espduino.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+espduino.menu.ip.src=v1.4 Compile from source
+espduino.menu.ip.src.build.lwip_lib=-llwip_src
+espduino.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+espduino.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+espduino.menu.dbg.Disabled=Disabled
+espduino.menu.dbg.Disabled.build.debug_port=
+espduino.menu.dbg.Serial=Serial
+espduino.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+espduino.menu.dbg.Serial1=Serial1
+espduino.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+espduino.menu.lvl.None____=None
+espduino.menu.lvl.None____.build.debug_level=
+espduino.menu.lvl.SSL=SSL
+espduino.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+espduino.menu.lvl.TLS_MEM=TLS_MEM
+espduino.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+espduino.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+espduino.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+espduino.menu.lvl.HTTP_SERVER=HTTP_SERVER
+espduino.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+espduino.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+espduino.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+espduino.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+espduino.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+espduino.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+espduino.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+espduino.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+espduino.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espduino.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+espduino.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espduino.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+espduino.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espduino.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+espduino.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espduino.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+espduino.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espduino.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+espduino.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espduino.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espduino.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espduino.menu.lvl.CORE=CORE
+espduino.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+espduino.menu.lvl.WIFI=WIFI
+espduino.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+espduino.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+espduino.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+espduino.menu.lvl.UPDATER=UPDATER
+espduino.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+espduino.menu.lvl.OTA=OTA
+espduino.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+espduino.menu.lvl.OOM=OOM
+espduino.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+espduino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+espduino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+espduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+espduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+espduino.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+espduino.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+espduino.menu.wipe.none=Only Sketch
+espduino.menu.wipe.none.upload.erase_cmd=
+espduino.menu.wipe.sdk=Sketch + WiFi Settings
+espduino.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+espduino.menu.wipe.all=All Flash Contents
+espduino.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+espduino.menu.baud.115200=115200
+espduino.menu.baud.115200.upload.speed=115200
+espduino.menu.baud.9600=9600
+espduino.menu.baud.9600.upload.speed=9600
+espduino.menu.baud.57600=57600
+espduino.menu.baud.57600.upload.speed=57600
+espduino.menu.baud.230400.linux=230400
+espduino.menu.baud.230400.macosx=230400
+espduino.menu.baud.230400.upload.speed=230400
+espduino.menu.baud.256000.windows=256000
+espduino.menu.baud.256000.upload.speed=256000
+espduino.menu.baud.460800.linux=460800
+espduino.menu.baud.460800.macosx=460800
+espduino.menu.baud.460800.upload.speed=460800
+espduino.menu.baud.512000.windows=512000
+espduino.menu.baud.512000.upload.speed=512000
+espduino.menu.baud.921600=921600
+espduino.menu.baud.921600.upload.speed=921600
+
+##############################################################
+huzzah.name=Adafruit Feather HUZZAH ESP8266
+huzzah.build.board=ESP8266_ESP12
+huzzah.build.variant=adafruit
+huzzah.upload.tool=esptool
+huzzah.upload.maximum_data_size=81920
+huzzah.upload.wait_for_upload_port=true
+huzzah.upload.erase_cmd=
+huzzah.serial.disableDTR=true
+huzzah.serial.disableRTS=true
+huzzah.build.mcu=esp8266
+huzzah.build.core=esp8266
+huzzah.build.spiffs_pagesize=256
+huzzah.build.debug_port=
+huzzah.build.debug_level=
+huzzah.menu.xtal.80=80 MHz
+huzzah.menu.xtal.80.build.f_cpu=80000000L
+huzzah.menu.xtal.160=160 MHz
+huzzah.menu.xtal.160.build.f_cpu=160000000L
+huzzah.menu.vt.flash=Flash
+huzzah.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+huzzah.menu.vt.heap=Heap
+huzzah.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+huzzah.menu.vt.iram=IRAM
+huzzah.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+huzzah.menu.exception.enabled=Enabled
+huzzah.menu.exception.enabled.build.exception_flags=-fexceptions
+huzzah.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+huzzah.menu.exception.disabled=Disabled
+huzzah.menu.exception.disabled.build.exception_flags=-fno-exceptions
+huzzah.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+huzzah.upload.resetmethod=nodemcu
+huzzah.build.flash_mode=qio
+huzzah.build.flash_freq=40
+huzzah.menu.eesz.4M=4M (no SPIFFS)
+huzzah.menu.eesz.4M.build.flash_size=4M
+huzzah.menu.eesz.4M.build.flash_size_bytes=0x400000
+huzzah.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+huzzah.menu.eesz.4M.build.spiffs_pagesize=256
+huzzah.menu.eesz.4M.upload.maximum_size=1044464
+huzzah.menu.eesz.4M.build.rfcal_addr=0x3FC000
+huzzah.menu.eesz.4M1M=4M (1M SPIFFS)
+huzzah.menu.eesz.4M1M.build.flash_size=4M
+huzzah.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+huzzah.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+huzzah.menu.eesz.4M1M.build.spiffs_pagesize=256
+huzzah.menu.eesz.4M1M.upload.maximum_size=1044464
+huzzah.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+huzzah.menu.eesz.4M1M.build.spiffs_start=0x300000
+huzzah.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+huzzah.menu.eesz.4M1M.build.spiffs_blocksize=8192
+huzzah.menu.eesz.4M2M=4M (2M SPIFFS)
+huzzah.menu.eesz.4M2M.build.flash_size=4M
+huzzah.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+huzzah.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+huzzah.menu.eesz.4M2M.build.spiffs_pagesize=256
+huzzah.menu.eesz.4M2M.upload.maximum_size=1044464
+huzzah.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+huzzah.menu.eesz.4M2M.build.spiffs_start=0x200000
+huzzah.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+huzzah.menu.eesz.4M2M.build.spiffs_blocksize=8192
+huzzah.menu.eesz.4M3M=4M (3M SPIFFS)
+huzzah.menu.eesz.4M3M.build.flash_size=4M
+huzzah.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+huzzah.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+huzzah.menu.eesz.4M3M.build.spiffs_pagesize=256
+huzzah.menu.eesz.4M3M.upload.maximum_size=1044464
+huzzah.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+huzzah.menu.eesz.4M3M.build.spiffs_start=0x100000
+huzzah.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+huzzah.menu.eesz.4M3M.build.spiffs_blocksize=8192
+huzzah.menu.ip.lm2f=v2 Lower Memory
+huzzah.menu.ip.lm2f.build.lwip_include=lwip2/include
+huzzah.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+huzzah.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+huzzah.menu.ip.hb2f=v2 Higher Bandwidth
+huzzah.menu.ip.hb2f.build.lwip_include=lwip2/include
+huzzah.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+huzzah.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+huzzah.menu.ip.lm2n=v2 Lower Memory (no features)
+huzzah.menu.ip.lm2n.build.lwip_include=lwip2/include
+huzzah.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+huzzah.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+huzzah.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+huzzah.menu.ip.hb2n.build.lwip_include=lwip2/include
+huzzah.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+huzzah.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+huzzah.menu.ip.lm6f=v2 IPv6 Lower Memory
+huzzah.menu.ip.lm6f.build.lwip_include=lwip2/include
+huzzah.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+huzzah.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+huzzah.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+huzzah.menu.ip.hb6f.build.lwip_include=lwip2/include
+huzzah.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+huzzah.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+huzzah.menu.ip.hb1=v1.4 Higher Bandwidth
+huzzah.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+huzzah.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+huzzah.menu.ip.src=v1.4 Compile from source
+huzzah.menu.ip.src.build.lwip_lib=-llwip_src
+huzzah.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+huzzah.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+huzzah.menu.dbg.Disabled=Disabled
+huzzah.menu.dbg.Disabled.build.debug_port=
+huzzah.menu.dbg.Serial=Serial
+huzzah.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+huzzah.menu.dbg.Serial1=Serial1
+huzzah.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+huzzah.menu.lvl.None____=None
+huzzah.menu.lvl.None____.build.debug_level=
+huzzah.menu.lvl.SSL=SSL
+huzzah.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+huzzah.menu.lvl.TLS_MEM=TLS_MEM
+huzzah.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+huzzah.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+huzzah.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+huzzah.menu.lvl.HTTP_SERVER=HTTP_SERVER
+huzzah.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+huzzah.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+huzzah.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+huzzah.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+huzzah.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+huzzah.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+huzzah.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+huzzah.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+huzzah.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+huzzah.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+huzzah.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+huzzah.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+huzzah.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+huzzah.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+huzzah.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+huzzah.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+huzzah.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+huzzah.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+huzzah.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+huzzah.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+huzzah.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+huzzah.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+huzzah.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+huzzah.menu.lvl.CORE=CORE
+huzzah.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+huzzah.menu.lvl.WIFI=WIFI
+huzzah.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+huzzah.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+huzzah.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+huzzah.menu.lvl.UPDATER=UPDATER
+huzzah.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+huzzah.menu.lvl.OTA=OTA
+huzzah.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+huzzah.menu.lvl.OOM=OOM
+huzzah.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+huzzah.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+huzzah.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+huzzah.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+huzzah.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+huzzah.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+huzzah.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+huzzah.menu.wipe.none=Only Sketch
+huzzah.menu.wipe.none.upload.erase_cmd=
+huzzah.menu.wipe.sdk=Sketch + WiFi Settings
+huzzah.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+huzzah.menu.wipe.all=All Flash Contents
+huzzah.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+huzzah.menu.baud.115200=115200
+huzzah.menu.baud.115200.upload.speed=115200
+huzzah.menu.baud.9600=9600
+huzzah.menu.baud.9600.upload.speed=9600
+huzzah.menu.baud.57600=57600
+huzzah.menu.baud.57600.upload.speed=57600
+huzzah.menu.baud.230400.linux=230400
+huzzah.menu.baud.230400.macosx=230400
+huzzah.menu.baud.230400.upload.speed=230400
+huzzah.menu.baud.256000.windows=256000
+huzzah.menu.baud.256000.upload.speed=256000
+huzzah.menu.baud.460800.linux=460800
+huzzah.menu.baud.460800.macosx=460800
+huzzah.menu.baud.460800.upload.speed=460800
+huzzah.menu.baud.512000.windows=512000
+huzzah.menu.baud.512000.upload.speed=512000
+huzzah.menu.baud.921600=921600
+huzzah.menu.baud.921600.upload.speed=921600
+
+##############################################################
+inventone.name=Invent One
+inventone.build.board=ESP8266_GENERIC
+inventone.build.variant=inventone
+inventone.upload.tool=esptool
+inventone.upload.maximum_data_size=81920
+inventone.upload.wait_for_upload_port=true
+inventone.upload.erase_cmd=
+inventone.serial.disableDTR=true
+inventone.serial.disableRTS=true
+inventone.build.mcu=esp8266
+inventone.build.core=esp8266
+inventone.build.spiffs_pagesize=256
+inventone.build.debug_port=
+inventone.build.debug_level=
+inventone.menu.xtal.80=80 MHz
+inventone.menu.xtal.80.build.f_cpu=80000000L
+inventone.menu.xtal.160=160 MHz
+inventone.menu.xtal.160.build.f_cpu=160000000L
+inventone.menu.vt.flash=Flash
+inventone.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+inventone.menu.vt.heap=Heap
+inventone.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+inventone.menu.vt.iram=IRAM
+inventone.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+inventone.menu.exception.enabled=Enabled
+inventone.menu.exception.enabled.build.exception_flags=-fexceptions
+inventone.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+inventone.menu.exception.disabled=Disabled
+inventone.menu.exception.disabled.build.exception_flags=-fno-exceptions
+inventone.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+inventone.upload.resetmethod=nodemcu
+inventone.build.flash_mode=dio
+inventone.build.flash_freq=40
+inventone.menu.eesz.4M=4M (no SPIFFS)
+inventone.menu.eesz.4M.build.flash_size=4M
+inventone.menu.eesz.4M.build.flash_size_bytes=0x400000
+inventone.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+inventone.menu.eesz.4M.build.spiffs_pagesize=256
+inventone.menu.eesz.4M.upload.maximum_size=1044464
+inventone.menu.eesz.4M.build.rfcal_addr=0x3FC000
+inventone.menu.eesz.4M1M=4M (1M SPIFFS)
+inventone.menu.eesz.4M1M.build.flash_size=4M
+inventone.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+inventone.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+inventone.menu.eesz.4M1M.build.spiffs_pagesize=256
+inventone.menu.eesz.4M1M.upload.maximum_size=1044464
+inventone.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+inventone.menu.eesz.4M1M.build.spiffs_start=0x300000
+inventone.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+inventone.menu.eesz.4M1M.build.spiffs_blocksize=8192
+inventone.menu.eesz.4M2M=4M (2M SPIFFS)
+inventone.menu.eesz.4M2M.build.flash_size=4M
+inventone.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+inventone.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+inventone.menu.eesz.4M2M.build.spiffs_pagesize=256
+inventone.menu.eesz.4M2M.upload.maximum_size=1044464
+inventone.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+inventone.menu.eesz.4M2M.build.spiffs_start=0x200000
+inventone.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+inventone.menu.eesz.4M2M.build.spiffs_blocksize=8192
+inventone.menu.eesz.4M3M=4M (3M SPIFFS)
+inventone.menu.eesz.4M3M.build.flash_size=4M
+inventone.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+inventone.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+inventone.menu.eesz.4M3M.build.spiffs_pagesize=256
+inventone.menu.eesz.4M3M.upload.maximum_size=1044464
+inventone.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+inventone.menu.eesz.4M3M.build.spiffs_start=0x100000
+inventone.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+inventone.menu.eesz.4M3M.build.spiffs_blocksize=8192
+inventone.menu.ip.lm2f=v2 Lower Memory
+inventone.menu.ip.lm2f.build.lwip_include=lwip2/include
+inventone.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+inventone.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+inventone.menu.ip.hb2f=v2 Higher Bandwidth
+inventone.menu.ip.hb2f.build.lwip_include=lwip2/include
+inventone.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+inventone.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+inventone.menu.ip.lm2n=v2 Lower Memory (no features)
+inventone.menu.ip.lm2n.build.lwip_include=lwip2/include
+inventone.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+inventone.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+inventone.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+inventone.menu.ip.hb2n.build.lwip_include=lwip2/include
+inventone.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+inventone.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+inventone.menu.ip.lm6f=v2 IPv6 Lower Memory
+inventone.menu.ip.lm6f.build.lwip_include=lwip2/include
+inventone.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+inventone.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+inventone.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+inventone.menu.ip.hb6f.build.lwip_include=lwip2/include
+inventone.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+inventone.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+inventone.menu.ip.hb1=v1.4 Higher Bandwidth
+inventone.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+inventone.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+inventone.menu.ip.src=v1.4 Compile from source
+inventone.menu.ip.src.build.lwip_lib=-llwip_src
+inventone.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+inventone.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+inventone.menu.dbg.Disabled=Disabled
+inventone.menu.dbg.Disabled.build.debug_port=
+inventone.menu.dbg.Serial=Serial
+inventone.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+inventone.menu.dbg.Serial1=Serial1
+inventone.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+inventone.menu.lvl.None____=None
+inventone.menu.lvl.None____.build.debug_level=
+inventone.menu.lvl.SSL=SSL
+inventone.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+inventone.menu.lvl.TLS_MEM=TLS_MEM
+inventone.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+inventone.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+inventone.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+inventone.menu.lvl.HTTP_SERVER=HTTP_SERVER
+inventone.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+inventone.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+inventone.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+inventone.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+inventone.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+inventone.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+inventone.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+inventone.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+inventone.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+inventone.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+inventone.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+inventone.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+inventone.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+inventone.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+inventone.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+inventone.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+inventone.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+inventone.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+inventone.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+inventone.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+inventone.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+inventone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+inventone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+inventone.menu.lvl.CORE=CORE
+inventone.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+inventone.menu.lvl.WIFI=WIFI
+inventone.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+inventone.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+inventone.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+inventone.menu.lvl.UPDATER=UPDATER
+inventone.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+inventone.menu.lvl.OTA=OTA
+inventone.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+inventone.menu.lvl.OOM=OOM
+inventone.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+inventone.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+inventone.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+inventone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+inventone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+inventone.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+inventone.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+inventone.menu.wipe.none=Only Sketch
+inventone.menu.wipe.none.upload.erase_cmd=
+inventone.menu.wipe.sdk=Sketch + WiFi Settings
+inventone.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+inventone.menu.wipe.all=All Flash Contents
+inventone.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+inventone.menu.baud.115200=115200
+inventone.menu.baud.115200.upload.speed=115200
+inventone.menu.baud.9600=9600
+inventone.menu.baud.9600.upload.speed=9600
+inventone.menu.baud.57600=57600
+inventone.menu.baud.57600.upload.speed=57600
+inventone.menu.baud.230400.linux=230400
+inventone.menu.baud.230400.macosx=230400
+inventone.menu.baud.230400.upload.speed=230400
+inventone.menu.baud.256000.windows=256000
+inventone.menu.baud.256000.upload.speed=256000
+inventone.menu.baud.460800.linux=460800
+inventone.menu.baud.460800.macosx=460800
+inventone.menu.baud.460800.upload.speed=460800
+inventone.menu.baud.512000.windows=512000
+inventone.menu.baud.512000.upload.speed=512000
+inventone.menu.baud.921600=921600
+inventone.menu.baud.921600.upload.speed=921600
+
+##############################################################
+cw01.name=XinaBox CW01
+cw01.build.board=ESP8266_GENERIC
+cw01.build.variant=xinabox
+cw01.upload.tool=esptool
+cw01.upload.maximum_data_size=81920
+cw01.upload.wait_for_upload_port=true
+cw01.upload.erase_cmd=
+cw01.serial.disableDTR=true
+cw01.serial.disableRTS=true
+cw01.build.mcu=esp8266
+cw01.build.core=esp8266
+cw01.build.spiffs_pagesize=256
+cw01.build.debug_port=
+cw01.build.debug_level=
+cw01.menu.xtal.80=80 MHz
+cw01.menu.xtal.80.build.f_cpu=80000000L
+cw01.menu.xtal.160=160 MHz
+cw01.menu.xtal.160.build.f_cpu=160000000L
+cw01.menu.vt.flash=Flash
+cw01.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+cw01.menu.vt.heap=Heap
+cw01.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+cw01.menu.vt.iram=IRAM
+cw01.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+cw01.menu.exception.enabled=Enabled
+cw01.menu.exception.enabled.build.exception_flags=-fexceptions
+cw01.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+cw01.menu.exception.disabled=Disabled
+cw01.menu.exception.disabled.build.exception_flags=-fno-exceptions
+cw01.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+cw01.upload.resetmethod=nodemcu
+cw01.menu.CrystalFreq.26=26 MHz
+cw01.menu.CrystalFreq.40=40 MHz
+cw01.menu.CrystalFreq.40.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
+cw01.build.flash_mode=qio
+cw01.build.flash_freq=40
+cw01.menu.eesz.4M=4M (no SPIFFS)
+cw01.menu.eesz.4M.build.flash_size=4M
+cw01.menu.eesz.4M.build.flash_size_bytes=0x400000
+cw01.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+cw01.menu.eesz.4M.build.spiffs_pagesize=256
+cw01.menu.eesz.4M.upload.maximum_size=1044464
+cw01.menu.eesz.4M.build.rfcal_addr=0x3FC000
+cw01.menu.eesz.4M1M=4M (1M SPIFFS)
+cw01.menu.eesz.4M1M.build.flash_size=4M
+cw01.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+cw01.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+cw01.menu.eesz.4M1M.build.spiffs_pagesize=256
+cw01.menu.eesz.4M1M.upload.maximum_size=1044464
+cw01.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+cw01.menu.eesz.4M1M.build.spiffs_start=0x300000
+cw01.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+cw01.menu.eesz.4M1M.build.spiffs_blocksize=8192
+cw01.menu.eesz.4M2M=4M (2M SPIFFS)
+cw01.menu.eesz.4M2M.build.flash_size=4M
+cw01.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+cw01.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+cw01.menu.eesz.4M2M.build.spiffs_pagesize=256
+cw01.menu.eesz.4M2M.upload.maximum_size=1044464
+cw01.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+cw01.menu.eesz.4M2M.build.spiffs_start=0x200000
+cw01.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+cw01.menu.eesz.4M2M.build.spiffs_blocksize=8192
+cw01.menu.eesz.4M3M=4M (3M SPIFFS)
+cw01.menu.eesz.4M3M.build.flash_size=4M
+cw01.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+cw01.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+cw01.menu.eesz.4M3M.build.spiffs_pagesize=256
+cw01.menu.eesz.4M3M.upload.maximum_size=1044464
+cw01.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+cw01.menu.eesz.4M3M.build.spiffs_start=0x100000
+cw01.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+cw01.menu.eesz.4M3M.build.spiffs_blocksize=8192
+cw01.menu.ip.lm2f=v2 Lower Memory
+cw01.menu.ip.lm2f.build.lwip_include=lwip2/include
+cw01.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+cw01.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+cw01.menu.ip.hb2f=v2 Higher Bandwidth
+cw01.menu.ip.hb2f.build.lwip_include=lwip2/include
+cw01.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+cw01.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+cw01.menu.ip.lm2n=v2 Lower Memory (no features)
+cw01.menu.ip.lm2n.build.lwip_include=lwip2/include
+cw01.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+cw01.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+cw01.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+cw01.menu.ip.hb2n.build.lwip_include=lwip2/include
+cw01.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+cw01.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+cw01.menu.ip.lm6f=v2 IPv6 Lower Memory
+cw01.menu.ip.lm6f.build.lwip_include=lwip2/include
+cw01.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+cw01.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+cw01.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+cw01.menu.ip.hb6f.build.lwip_include=lwip2/include
+cw01.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+cw01.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+cw01.menu.ip.hb1=v1.4 Higher Bandwidth
+cw01.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+cw01.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+cw01.menu.ip.src=v1.4 Compile from source
+cw01.menu.ip.src.build.lwip_lib=-llwip_src
+cw01.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+cw01.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+cw01.menu.dbg.Disabled=Disabled
+cw01.menu.dbg.Disabled.build.debug_port=
+cw01.menu.dbg.Serial=Serial
+cw01.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+cw01.menu.dbg.Serial1=Serial1
+cw01.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+cw01.menu.lvl.None____=None
+cw01.menu.lvl.None____.build.debug_level=
+cw01.menu.lvl.SSL=SSL
+cw01.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+cw01.menu.lvl.TLS_MEM=TLS_MEM
+cw01.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+cw01.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+cw01.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+cw01.menu.lvl.HTTP_SERVER=HTTP_SERVER
+cw01.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+cw01.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+cw01.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+cw01.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+cw01.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+cw01.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+cw01.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+cw01.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+cw01.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+cw01.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+cw01.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+cw01.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+cw01.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+cw01.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+cw01.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+cw01.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+cw01.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+cw01.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+cw01.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+cw01.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+cw01.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+cw01.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+cw01.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+cw01.menu.lvl.CORE=CORE
+cw01.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+cw01.menu.lvl.WIFI=WIFI
+cw01.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+cw01.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+cw01.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+cw01.menu.lvl.UPDATER=UPDATER
+cw01.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+cw01.menu.lvl.OTA=OTA
+cw01.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+cw01.menu.lvl.OOM=OOM
+cw01.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+cw01.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+cw01.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+cw01.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+cw01.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+cw01.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+cw01.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+cw01.menu.wipe.none=Only Sketch
+cw01.menu.wipe.none.upload.erase_cmd=
+cw01.menu.wipe.sdk=Sketch + WiFi Settings
+cw01.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+cw01.menu.wipe.all=All Flash Contents
+cw01.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+cw01.menu.baud.115200=115200
+cw01.menu.baud.115200.upload.speed=115200
+cw01.menu.baud.9600=9600
+cw01.menu.baud.9600.upload.speed=9600
+cw01.menu.baud.57600=57600
+cw01.menu.baud.57600.upload.speed=57600
+cw01.menu.baud.230400.linux=230400
+cw01.menu.baud.230400.macosx=230400
+cw01.menu.baud.230400.upload.speed=230400
+cw01.menu.baud.256000.windows=256000
+cw01.menu.baud.256000.upload.speed=256000
+cw01.menu.baud.460800.linux=460800
+cw01.menu.baud.460800.macosx=460800
+cw01.menu.baud.460800.upload.speed=460800
+cw01.menu.baud.512000.windows=512000
+cw01.menu.baud.512000.upload.speed=512000
+cw01.menu.baud.921600=921600
+cw01.menu.baud.921600.upload.speed=921600
+
+##############################################################
+espresso_lite_v1.name=ESPresso Lite 1.0
+espresso_lite_v1.build.board=ESP8266_ESPRESSO_LITE_V1
+espresso_lite_v1.build.variant=espresso_lite_v1
+espresso_lite_v1.upload.tool=esptool
+espresso_lite_v1.upload.maximum_data_size=81920
+espresso_lite_v1.upload.wait_for_upload_port=true
+espresso_lite_v1.upload.erase_cmd=
+espresso_lite_v1.serial.disableDTR=true
+espresso_lite_v1.serial.disableRTS=true
+espresso_lite_v1.build.mcu=esp8266
+espresso_lite_v1.build.core=esp8266
+espresso_lite_v1.build.spiffs_pagesize=256
+espresso_lite_v1.build.debug_port=
+espresso_lite_v1.build.debug_level=
+espresso_lite_v1.menu.xtal.80=80 MHz
+espresso_lite_v1.menu.xtal.80.build.f_cpu=80000000L
+espresso_lite_v1.menu.xtal.160=160 MHz
+espresso_lite_v1.menu.xtal.160.build.f_cpu=160000000L
+espresso_lite_v1.menu.vt.flash=Flash
+espresso_lite_v1.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+espresso_lite_v1.menu.vt.heap=Heap
+espresso_lite_v1.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+espresso_lite_v1.menu.vt.iram=IRAM
+espresso_lite_v1.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+espresso_lite_v1.menu.exception.enabled=Enabled
+espresso_lite_v1.menu.exception.enabled.build.exception_flags=-fexceptions
+espresso_lite_v1.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+espresso_lite_v1.menu.exception.disabled=Disabled
+espresso_lite_v1.menu.exception.disabled.build.exception_flags=-fno-exceptions
+espresso_lite_v1.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+espresso_lite_v1.build.flash_mode=dio
+espresso_lite_v1.build.flash_freq=40
+espresso_lite_v1.menu.eesz.4M=4M (no SPIFFS)
+espresso_lite_v1.menu.eesz.4M.build.flash_size=4M
+espresso_lite_v1.menu.eesz.4M.build.flash_size_bytes=0x400000
+espresso_lite_v1.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+espresso_lite_v1.menu.eesz.4M.build.spiffs_pagesize=256
+espresso_lite_v1.menu.eesz.4M.upload.maximum_size=1044464
+espresso_lite_v1.menu.eesz.4M.build.rfcal_addr=0x3FC000
+espresso_lite_v1.menu.eesz.4M1M=4M (1M SPIFFS)
+espresso_lite_v1.menu.eesz.4M1M.build.flash_size=4M
+espresso_lite_v1.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+espresso_lite_v1.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+espresso_lite_v1.menu.eesz.4M1M.build.spiffs_pagesize=256
+espresso_lite_v1.menu.eesz.4M1M.upload.maximum_size=1044464
+espresso_lite_v1.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+espresso_lite_v1.menu.eesz.4M1M.build.spiffs_start=0x300000
+espresso_lite_v1.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+espresso_lite_v1.menu.eesz.4M1M.build.spiffs_blocksize=8192
+espresso_lite_v1.menu.eesz.4M2M=4M (2M SPIFFS)
+espresso_lite_v1.menu.eesz.4M2M.build.flash_size=4M
+espresso_lite_v1.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+espresso_lite_v1.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+espresso_lite_v1.menu.eesz.4M2M.build.spiffs_pagesize=256
+espresso_lite_v1.menu.eesz.4M2M.upload.maximum_size=1044464
+espresso_lite_v1.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+espresso_lite_v1.menu.eesz.4M2M.build.spiffs_start=0x200000
+espresso_lite_v1.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+espresso_lite_v1.menu.eesz.4M2M.build.spiffs_blocksize=8192
+espresso_lite_v1.menu.eesz.4M3M=4M (3M SPIFFS)
+espresso_lite_v1.menu.eesz.4M3M.build.flash_size=4M
+espresso_lite_v1.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+espresso_lite_v1.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+espresso_lite_v1.menu.eesz.4M3M.build.spiffs_pagesize=256
+espresso_lite_v1.menu.eesz.4M3M.upload.maximum_size=1044464
+espresso_lite_v1.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+espresso_lite_v1.menu.eesz.4M3M.build.spiffs_start=0x100000
+espresso_lite_v1.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+espresso_lite_v1.menu.eesz.4M3M.build.spiffs_blocksize=8192
+espresso_lite_v1.menu.ResetMethod.ck=ck
+espresso_lite_v1.menu.ResetMethod.ck.upload.resetmethod=ck
+espresso_lite_v1.menu.ResetMethod.nodemcu=nodemcu
+espresso_lite_v1.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
+espresso_lite_v1.menu.ip.lm2f=v2 Lower Memory
+espresso_lite_v1.menu.ip.lm2f.build.lwip_include=lwip2/include
+espresso_lite_v1.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+espresso_lite_v1.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espresso_lite_v1.menu.ip.hb2f=v2 Higher Bandwidth
+espresso_lite_v1.menu.ip.hb2f.build.lwip_include=lwip2/include
+espresso_lite_v1.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+espresso_lite_v1.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espresso_lite_v1.menu.ip.lm2n=v2 Lower Memory (no features)
+espresso_lite_v1.menu.ip.lm2n.build.lwip_include=lwip2/include
+espresso_lite_v1.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+espresso_lite_v1.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espresso_lite_v1.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+espresso_lite_v1.menu.ip.hb2n.build.lwip_include=lwip2/include
+espresso_lite_v1.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+espresso_lite_v1.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espresso_lite_v1.menu.ip.lm6f=v2 IPv6 Lower Memory
+espresso_lite_v1.menu.ip.lm6f.build.lwip_include=lwip2/include
+espresso_lite_v1.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+espresso_lite_v1.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espresso_lite_v1.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+espresso_lite_v1.menu.ip.hb6f.build.lwip_include=lwip2/include
+espresso_lite_v1.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+espresso_lite_v1.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espresso_lite_v1.menu.ip.hb1=v1.4 Higher Bandwidth
+espresso_lite_v1.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+espresso_lite_v1.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+espresso_lite_v1.menu.ip.src=v1.4 Compile from source
+espresso_lite_v1.menu.ip.src.build.lwip_lib=-llwip_src
+espresso_lite_v1.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+espresso_lite_v1.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+espresso_lite_v1.menu.dbg.Disabled=Disabled
+espresso_lite_v1.menu.dbg.Disabled.build.debug_port=
+espresso_lite_v1.menu.dbg.Serial=Serial
+espresso_lite_v1.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+espresso_lite_v1.menu.dbg.Serial1=Serial1
+espresso_lite_v1.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+espresso_lite_v1.menu.lvl.None____=None
+espresso_lite_v1.menu.lvl.None____.build.debug_level=
+espresso_lite_v1.menu.lvl.SSL=SSL
+espresso_lite_v1.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+espresso_lite_v1.menu.lvl.TLS_MEM=TLS_MEM
+espresso_lite_v1.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+espresso_lite_v1.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+espresso_lite_v1.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+espresso_lite_v1.menu.lvl.HTTP_SERVER=HTTP_SERVER
+espresso_lite_v1.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v1.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+espresso_lite_v1.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+espresso_lite_v1.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+espresso_lite_v1.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+espresso_lite_v1.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+espresso_lite_v1.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v1.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+espresso_lite_v1.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espresso_lite_v1.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+espresso_lite_v1.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v1.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+espresso_lite_v1.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v1.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+espresso_lite_v1.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v1.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espresso_lite_v1.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v1.menu.lvl.CORE=CORE
+espresso_lite_v1.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+espresso_lite_v1.menu.lvl.WIFI=WIFI
+espresso_lite_v1.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+espresso_lite_v1.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+espresso_lite_v1.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+espresso_lite_v1.menu.lvl.UPDATER=UPDATER
+espresso_lite_v1.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+espresso_lite_v1.menu.lvl.OTA=OTA
+espresso_lite_v1.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+espresso_lite_v1.menu.lvl.OOM=OOM
+espresso_lite_v1.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+espresso_lite_v1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+espresso_lite_v1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+espresso_lite_v1.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+espresso_lite_v1.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+espresso_lite_v1.menu.wipe.none=Only Sketch
+espresso_lite_v1.menu.wipe.none.upload.erase_cmd=
+espresso_lite_v1.menu.wipe.sdk=Sketch + WiFi Settings
+espresso_lite_v1.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+espresso_lite_v1.menu.wipe.all=All Flash Contents
+espresso_lite_v1.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+espresso_lite_v1.menu.baud.115200=115200
+espresso_lite_v1.menu.baud.115200.upload.speed=115200
+espresso_lite_v1.menu.baud.9600=9600
+espresso_lite_v1.menu.baud.9600.upload.speed=9600
+espresso_lite_v1.menu.baud.57600=57600
+espresso_lite_v1.menu.baud.57600.upload.speed=57600
+espresso_lite_v1.menu.baud.230400.linux=230400
+espresso_lite_v1.menu.baud.230400.macosx=230400
+espresso_lite_v1.menu.baud.230400.upload.speed=230400
+espresso_lite_v1.menu.baud.256000.windows=256000
+espresso_lite_v1.menu.baud.256000.upload.speed=256000
+espresso_lite_v1.menu.baud.460800.linux=460800
+espresso_lite_v1.menu.baud.460800.macosx=460800
+espresso_lite_v1.menu.baud.460800.upload.speed=460800
+espresso_lite_v1.menu.baud.512000.windows=512000
+espresso_lite_v1.menu.baud.512000.upload.speed=512000
+espresso_lite_v1.menu.baud.921600=921600
+espresso_lite_v1.menu.baud.921600.upload.speed=921600
+
+##############################################################
+espresso_lite_v2.name=ESPresso Lite 2.0
+espresso_lite_v2.build.board=ESP8266_ESPRESSO_LITE_V2
+espresso_lite_v2.build.variant=espresso_lite_v2
+espresso_lite_v2.upload.tool=esptool
+espresso_lite_v2.upload.maximum_data_size=81920
+espresso_lite_v2.upload.wait_for_upload_port=true
+espresso_lite_v2.upload.erase_cmd=
+espresso_lite_v2.serial.disableDTR=true
+espresso_lite_v2.serial.disableRTS=true
+espresso_lite_v2.build.mcu=esp8266
+espresso_lite_v2.build.core=esp8266
+espresso_lite_v2.build.spiffs_pagesize=256
+espresso_lite_v2.build.debug_port=
+espresso_lite_v2.build.debug_level=
+espresso_lite_v2.menu.xtal.80=80 MHz
+espresso_lite_v2.menu.xtal.80.build.f_cpu=80000000L
+espresso_lite_v2.menu.xtal.160=160 MHz
+espresso_lite_v2.menu.xtal.160.build.f_cpu=160000000L
+espresso_lite_v2.menu.vt.flash=Flash
+espresso_lite_v2.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+espresso_lite_v2.menu.vt.heap=Heap
+espresso_lite_v2.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+espresso_lite_v2.menu.vt.iram=IRAM
+espresso_lite_v2.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+espresso_lite_v2.menu.exception.enabled=Enabled
+espresso_lite_v2.menu.exception.enabled.build.exception_flags=-fexceptions
+espresso_lite_v2.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+espresso_lite_v2.menu.exception.disabled=Disabled
+espresso_lite_v2.menu.exception.disabled.build.exception_flags=-fno-exceptions
+espresso_lite_v2.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+espresso_lite_v2.build.flash_mode=dio
+espresso_lite_v2.build.flash_freq=40
+espresso_lite_v2.menu.eesz.4M=4M (no SPIFFS)
+espresso_lite_v2.menu.eesz.4M.build.flash_size=4M
+espresso_lite_v2.menu.eesz.4M.build.flash_size_bytes=0x400000
+espresso_lite_v2.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+espresso_lite_v2.menu.eesz.4M.build.spiffs_pagesize=256
+espresso_lite_v2.menu.eesz.4M.upload.maximum_size=1044464
+espresso_lite_v2.menu.eesz.4M.build.rfcal_addr=0x3FC000
+espresso_lite_v2.menu.eesz.4M1M=4M (1M SPIFFS)
+espresso_lite_v2.menu.eesz.4M1M.build.flash_size=4M
+espresso_lite_v2.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+espresso_lite_v2.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+espresso_lite_v2.menu.eesz.4M1M.build.spiffs_pagesize=256
+espresso_lite_v2.menu.eesz.4M1M.upload.maximum_size=1044464
+espresso_lite_v2.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+espresso_lite_v2.menu.eesz.4M1M.build.spiffs_start=0x300000
+espresso_lite_v2.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+espresso_lite_v2.menu.eesz.4M1M.build.spiffs_blocksize=8192
+espresso_lite_v2.menu.eesz.4M2M=4M (2M SPIFFS)
+espresso_lite_v2.menu.eesz.4M2M.build.flash_size=4M
+espresso_lite_v2.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+espresso_lite_v2.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+espresso_lite_v2.menu.eesz.4M2M.build.spiffs_pagesize=256
+espresso_lite_v2.menu.eesz.4M2M.upload.maximum_size=1044464
+espresso_lite_v2.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+espresso_lite_v2.menu.eesz.4M2M.build.spiffs_start=0x200000
+espresso_lite_v2.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+espresso_lite_v2.menu.eesz.4M2M.build.spiffs_blocksize=8192
+espresso_lite_v2.menu.eesz.4M3M=4M (3M SPIFFS)
+espresso_lite_v2.menu.eesz.4M3M.build.flash_size=4M
+espresso_lite_v2.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+espresso_lite_v2.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+espresso_lite_v2.menu.eesz.4M3M.build.spiffs_pagesize=256
+espresso_lite_v2.menu.eesz.4M3M.upload.maximum_size=1044464
+espresso_lite_v2.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+espresso_lite_v2.menu.eesz.4M3M.build.spiffs_start=0x100000
+espresso_lite_v2.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+espresso_lite_v2.menu.eesz.4M3M.build.spiffs_blocksize=8192
+espresso_lite_v2.menu.ResetMethod.ck=ck
+espresso_lite_v2.menu.ResetMethod.ck.upload.resetmethod=ck
+espresso_lite_v2.menu.ResetMethod.nodemcu=nodemcu
+espresso_lite_v2.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
+espresso_lite_v2.menu.ip.lm2f=v2 Lower Memory
+espresso_lite_v2.menu.ip.lm2f.build.lwip_include=lwip2/include
+espresso_lite_v2.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+espresso_lite_v2.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espresso_lite_v2.menu.ip.hb2f=v2 Higher Bandwidth
+espresso_lite_v2.menu.ip.hb2f.build.lwip_include=lwip2/include
+espresso_lite_v2.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+espresso_lite_v2.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espresso_lite_v2.menu.ip.lm2n=v2 Lower Memory (no features)
+espresso_lite_v2.menu.ip.lm2n.build.lwip_include=lwip2/include
+espresso_lite_v2.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+espresso_lite_v2.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espresso_lite_v2.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+espresso_lite_v2.menu.ip.hb2n.build.lwip_include=lwip2/include
+espresso_lite_v2.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+espresso_lite_v2.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espresso_lite_v2.menu.ip.lm6f=v2 IPv6 Lower Memory
+espresso_lite_v2.menu.ip.lm6f.build.lwip_include=lwip2/include
+espresso_lite_v2.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+espresso_lite_v2.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espresso_lite_v2.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+espresso_lite_v2.menu.ip.hb6f.build.lwip_include=lwip2/include
+espresso_lite_v2.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+espresso_lite_v2.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espresso_lite_v2.menu.ip.hb1=v1.4 Higher Bandwidth
+espresso_lite_v2.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+espresso_lite_v2.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+espresso_lite_v2.menu.ip.src=v1.4 Compile from source
+espresso_lite_v2.menu.ip.src.build.lwip_lib=-llwip_src
+espresso_lite_v2.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+espresso_lite_v2.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+espresso_lite_v2.menu.dbg.Disabled=Disabled
+espresso_lite_v2.menu.dbg.Disabled.build.debug_port=
+espresso_lite_v2.menu.dbg.Serial=Serial
+espresso_lite_v2.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+espresso_lite_v2.menu.dbg.Serial1=Serial1
+espresso_lite_v2.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+espresso_lite_v2.menu.lvl.None____=None
+espresso_lite_v2.menu.lvl.None____.build.debug_level=
+espresso_lite_v2.menu.lvl.SSL=SSL
+espresso_lite_v2.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+espresso_lite_v2.menu.lvl.TLS_MEM=TLS_MEM
+espresso_lite_v2.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+espresso_lite_v2.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+espresso_lite_v2.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+espresso_lite_v2.menu.lvl.HTTP_SERVER=HTTP_SERVER
+espresso_lite_v2.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v2.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+espresso_lite_v2.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+espresso_lite_v2.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+espresso_lite_v2.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+espresso_lite_v2.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+espresso_lite_v2.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v2.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+espresso_lite_v2.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espresso_lite_v2.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+espresso_lite_v2.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v2.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+espresso_lite_v2.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v2.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+espresso_lite_v2.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v2.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espresso_lite_v2.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v2.menu.lvl.CORE=CORE
+espresso_lite_v2.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+espresso_lite_v2.menu.lvl.WIFI=WIFI
+espresso_lite_v2.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+espresso_lite_v2.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+espresso_lite_v2.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+espresso_lite_v2.menu.lvl.UPDATER=UPDATER
+espresso_lite_v2.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+espresso_lite_v2.menu.lvl.OTA=OTA
+espresso_lite_v2.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+espresso_lite_v2.menu.lvl.OOM=OOM
+espresso_lite_v2.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+espresso_lite_v2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+espresso_lite_v2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+espresso_lite_v2.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+espresso_lite_v2.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+espresso_lite_v2.menu.wipe.none=Only Sketch
+espresso_lite_v2.menu.wipe.none.upload.erase_cmd=
+espresso_lite_v2.menu.wipe.sdk=Sketch + WiFi Settings
+espresso_lite_v2.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+espresso_lite_v2.menu.wipe.all=All Flash Contents
+espresso_lite_v2.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+espresso_lite_v2.menu.baud.115200=115200
+espresso_lite_v2.menu.baud.115200.upload.speed=115200
+espresso_lite_v2.menu.baud.9600=9600
+espresso_lite_v2.menu.baud.9600.upload.speed=9600
+espresso_lite_v2.menu.baud.57600=57600
+espresso_lite_v2.menu.baud.57600.upload.speed=57600
+espresso_lite_v2.menu.baud.230400.linux=230400
+espresso_lite_v2.menu.baud.230400.macosx=230400
+espresso_lite_v2.menu.baud.230400.upload.speed=230400
+espresso_lite_v2.menu.baud.256000.windows=256000
+espresso_lite_v2.menu.baud.256000.upload.speed=256000
+espresso_lite_v2.menu.baud.460800.linux=460800
+espresso_lite_v2.menu.baud.460800.macosx=460800
+espresso_lite_v2.menu.baud.460800.upload.speed=460800
+espresso_lite_v2.menu.baud.512000.windows=512000
+espresso_lite_v2.menu.baud.512000.upload.speed=512000
+espresso_lite_v2.menu.baud.921600=921600
+espresso_lite_v2.menu.baud.921600.upload.speed=921600
+
+##############################################################
+phoenix_v1.name=Phoenix 1.0
+phoenix_v1.build.board=ESP8266_PHOENIX_V1
+phoenix_v1.build.variant=phoenix_v1
+phoenix_v1.upload.tool=esptool
+phoenix_v1.upload.maximum_data_size=81920
+phoenix_v1.upload.wait_for_upload_port=true
+phoenix_v1.upload.erase_cmd=
+phoenix_v1.serial.disableDTR=true
+phoenix_v1.serial.disableRTS=true
+phoenix_v1.build.mcu=esp8266
+phoenix_v1.build.core=esp8266
+phoenix_v1.build.spiffs_pagesize=256
+phoenix_v1.build.debug_port=
+phoenix_v1.build.debug_level=
+phoenix_v1.menu.xtal.80=80 MHz
+phoenix_v1.menu.xtal.80.build.f_cpu=80000000L
+phoenix_v1.menu.xtal.160=160 MHz
+phoenix_v1.menu.xtal.160.build.f_cpu=160000000L
+phoenix_v1.menu.vt.flash=Flash
+phoenix_v1.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+phoenix_v1.menu.vt.heap=Heap
+phoenix_v1.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+phoenix_v1.menu.vt.iram=IRAM
+phoenix_v1.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+phoenix_v1.menu.exception.enabled=Enabled
+phoenix_v1.menu.exception.enabled.build.exception_flags=-fexceptions
+phoenix_v1.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+phoenix_v1.menu.exception.disabled=Disabled
+phoenix_v1.menu.exception.disabled.build.exception_flags=-fno-exceptions
+phoenix_v1.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+phoenix_v1.build.flash_mode=dio
+phoenix_v1.build.flash_freq=40
+phoenix_v1.menu.eesz.4M=4M (no SPIFFS)
+phoenix_v1.menu.eesz.4M.build.flash_size=4M
+phoenix_v1.menu.eesz.4M.build.flash_size_bytes=0x400000
+phoenix_v1.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+phoenix_v1.menu.eesz.4M.build.spiffs_pagesize=256
+phoenix_v1.menu.eesz.4M.upload.maximum_size=1044464
+phoenix_v1.menu.eesz.4M.build.rfcal_addr=0x3FC000
+phoenix_v1.menu.eesz.4M1M=4M (1M SPIFFS)
+phoenix_v1.menu.eesz.4M1M.build.flash_size=4M
+phoenix_v1.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+phoenix_v1.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+phoenix_v1.menu.eesz.4M1M.build.spiffs_pagesize=256
+phoenix_v1.menu.eesz.4M1M.upload.maximum_size=1044464
+phoenix_v1.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+phoenix_v1.menu.eesz.4M1M.build.spiffs_start=0x300000
+phoenix_v1.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+phoenix_v1.menu.eesz.4M1M.build.spiffs_blocksize=8192
+phoenix_v1.menu.eesz.4M2M=4M (2M SPIFFS)
+phoenix_v1.menu.eesz.4M2M.build.flash_size=4M
+phoenix_v1.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+phoenix_v1.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+phoenix_v1.menu.eesz.4M2M.build.spiffs_pagesize=256
+phoenix_v1.menu.eesz.4M2M.upload.maximum_size=1044464
+phoenix_v1.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+phoenix_v1.menu.eesz.4M2M.build.spiffs_start=0x200000
+phoenix_v1.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+phoenix_v1.menu.eesz.4M2M.build.spiffs_blocksize=8192
+phoenix_v1.menu.eesz.4M3M=4M (3M SPIFFS)
+phoenix_v1.menu.eesz.4M3M.build.flash_size=4M
+phoenix_v1.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+phoenix_v1.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+phoenix_v1.menu.eesz.4M3M.build.spiffs_pagesize=256
+phoenix_v1.menu.eesz.4M3M.upload.maximum_size=1044464
+phoenix_v1.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+phoenix_v1.menu.eesz.4M3M.build.spiffs_start=0x100000
+phoenix_v1.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+phoenix_v1.menu.eesz.4M3M.build.spiffs_blocksize=8192
+phoenix_v1.menu.ResetMethod.ck=ck
+phoenix_v1.menu.ResetMethod.ck.upload.resetmethod=ck
+phoenix_v1.menu.ResetMethod.nodemcu=nodemcu
+phoenix_v1.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
+phoenix_v1.menu.ip.lm2f=v2 Lower Memory
+phoenix_v1.menu.ip.lm2f.build.lwip_include=lwip2/include
+phoenix_v1.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+phoenix_v1.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+phoenix_v1.menu.ip.hb2f=v2 Higher Bandwidth
+phoenix_v1.menu.ip.hb2f.build.lwip_include=lwip2/include
+phoenix_v1.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+phoenix_v1.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+phoenix_v1.menu.ip.lm2n=v2 Lower Memory (no features)
+phoenix_v1.menu.ip.lm2n.build.lwip_include=lwip2/include
+phoenix_v1.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+phoenix_v1.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+phoenix_v1.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+phoenix_v1.menu.ip.hb2n.build.lwip_include=lwip2/include
+phoenix_v1.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+phoenix_v1.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+phoenix_v1.menu.ip.lm6f=v2 IPv6 Lower Memory
+phoenix_v1.menu.ip.lm6f.build.lwip_include=lwip2/include
+phoenix_v1.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+phoenix_v1.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+phoenix_v1.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+phoenix_v1.menu.ip.hb6f.build.lwip_include=lwip2/include
+phoenix_v1.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+phoenix_v1.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+phoenix_v1.menu.ip.hb1=v1.4 Higher Bandwidth
+phoenix_v1.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+phoenix_v1.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+phoenix_v1.menu.ip.src=v1.4 Compile from source
+phoenix_v1.menu.ip.src.build.lwip_lib=-llwip_src
+phoenix_v1.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+phoenix_v1.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+phoenix_v1.menu.dbg.Disabled=Disabled
+phoenix_v1.menu.dbg.Disabled.build.debug_port=
+phoenix_v1.menu.dbg.Serial=Serial
+phoenix_v1.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+phoenix_v1.menu.dbg.Serial1=Serial1
+phoenix_v1.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+phoenix_v1.menu.lvl.None____=None
+phoenix_v1.menu.lvl.None____.build.debug_level=
+phoenix_v1.menu.lvl.SSL=SSL
+phoenix_v1.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+phoenix_v1.menu.lvl.TLS_MEM=TLS_MEM
+phoenix_v1.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+phoenix_v1.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+phoenix_v1.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+phoenix_v1.menu.lvl.HTTP_SERVER=HTTP_SERVER
+phoenix_v1.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+phoenix_v1.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+phoenix_v1.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+phoenix_v1.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+phoenix_v1.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+phoenix_v1.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+phoenix_v1.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+phoenix_v1.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+phoenix_v1.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+phoenix_v1.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+phoenix_v1.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+phoenix_v1.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+phoenix_v1.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+phoenix_v1.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+phoenix_v1.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+phoenix_v1.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+phoenix_v1.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+phoenix_v1.menu.lvl.CORE=CORE
+phoenix_v1.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+phoenix_v1.menu.lvl.WIFI=WIFI
+phoenix_v1.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+phoenix_v1.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+phoenix_v1.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+phoenix_v1.menu.lvl.UPDATER=UPDATER
+phoenix_v1.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+phoenix_v1.menu.lvl.OTA=OTA
+phoenix_v1.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+phoenix_v1.menu.lvl.OOM=OOM
+phoenix_v1.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+phoenix_v1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+phoenix_v1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+phoenix_v1.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+phoenix_v1.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+phoenix_v1.menu.wipe.none=Only Sketch
+phoenix_v1.menu.wipe.none.upload.erase_cmd=
+phoenix_v1.menu.wipe.sdk=Sketch + WiFi Settings
+phoenix_v1.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+phoenix_v1.menu.wipe.all=All Flash Contents
+phoenix_v1.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+phoenix_v1.menu.baud.115200=115200
+phoenix_v1.menu.baud.115200.upload.speed=115200
+phoenix_v1.menu.baud.9600=9600
+phoenix_v1.menu.baud.9600.upload.speed=9600
+phoenix_v1.menu.baud.57600=57600
+phoenix_v1.menu.baud.57600.upload.speed=57600
+phoenix_v1.menu.baud.230400.linux=230400
+phoenix_v1.menu.baud.230400.macosx=230400
+phoenix_v1.menu.baud.230400.upload.speed=230400
+phoenix_v1.menu.baud.256000.windows=256000
+phoenix_v1.menu.baud.256000.upload.speed=256000
+phoenix_v1.menu.baud.460800.linux=460800
+phoenix_v1.menu.baud.460800.macosx=460800
+phoenix_v1.menu.baud.460800.upload.speed=460800
+phoenix_v1.menu.baud.512000.windows=512000
+phoenix_v1.menu.baud.512000.upload.speed=512000
+phoenix_v1.menu.baud.921600=921600
+phoenix_v1.menu.baud.921600.upload.speed=921600
+
+##############################################################
+phoenix_v2.name=Phoenix 2.0
+phoenix_v2.build.board=ESP8266_PHOENIX_V2
+phoenix_v2.build.variant=phoenix_v2
+phoenix_v2.upload.tool=esptool
+phoenix_v2.upload.maximum_data_size=81920
+phoenix_v2.upload.wait_for_upload_port=true
+phoenix_v2.upload.erase_cmd=
+phoenix_v2.serial.disableDTR=true
+phoenix_v2.serial.disableRTS=true
+phoenix_v2.build.mcu=esp8266
+phoenix_v2.build.core=esp8266
+phoenix_v2.build.spiffs_pagesize=256
+phoenix_v2.build.debug_port=
+phoenix_v2.build.debug_level=
+phoenix_v2.menu.xtal.80=80 MHz
+phoenix_v2.menu.xtal.80.build.f_cpu=80000000L
+phoenix_v2.menu.xtal.160=160 MHz
+phoenix_v2.menu.xtal.160.build.f_cpu=160000000L
+phoenix_v2.menu.vt.flash=Flash
+phoenix_v2.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+phoenix_v2.menu.vt.heap=Heap
+phoenix_v2.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+phoenix_v2.menu.vt.iram=IRAM
+phoenix_v2.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+phoenix_v2.menu.exception.enabled=Enabled
+phoenix_v2.menu.exception.enabled.build.exception_flags=-fexceptions
+phoenix_v2.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+phoenix_v2.menu.exception.disabled=Disabled
+phoenix_v2.menu.exception.disabled.build.exception_flags=-fno-exceptions
+phoenix_v2.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+phoenix_v2.build.flash_mode=dio
+phoenix_v2.build.flash_freq=40
+phoenix_v2.menu.eesz.4M=4M (no SPIFFS)
+phoenix_v2.menu.eesz.4M.build.flash_size=4M
+phoenix_v2.menu.eesz.4M.build.flash_size_bytes=0x400000
+phoenix_v2.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+phoenix_v2.menu.eesz.4M.build.spiffs_pagesize=256
+phoenix_v2.menu.eesz.4M.upload.maximum_size=1044464
+phoenix_v2.menu.eesz.4M.build.rfcal_addr=0x3FC000
+phoenix_v2.menu.eesz.4M1M=4M (1M SPIFFS)
+phoenix_v2.menu.eesz.4M1M.build.flash_size=4M
+phoenix_v2.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+phoenix_v2.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+phoenix_v2.menu.eesz.4M1M.build.spiffs_pagesize=256
+phoenix_v2.menu.eesz.4M1M.upload.maximum_size=1044464
+phoenix_v2.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+phoenix_v2.menu.eesz.4M1M.build.spiffs_start=0x300000
+phoenix_v2.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+phoenix_v2.menu.eesz.4M1M.build.spiffs_blocksize=8192
+phoenix_v2.menu.eesz.4M2M=4M (2M SPIFFS)
+phoenix_v2.menu.eesz.4M2M.build.flash_size=4M
+phoenix_v2.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+phoenix_v2.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+phoenix_v2.menu.eesz.4M2M.build.spiffs_pagesize=256
+phoenix_v2.menu.eesz.4M2M.upload.maximum_size=1044464
+phoenix_v2.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+phoenix_v2.menu.eesz.4M2M.build.spiffs_start=0x200000
+phoenix_v2.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+phoenix_v2.menu.eesz.4M2M.build.spiffs_blocksize=8192
+phoenix_v2.menu.eesz.4M3M=4M (3M SPIFFS)
+phoenix_v2.menu.eesz.4M3M.build.flash_size=4M
+phoenix_v2.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+phoenix_v2.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+phoenix_v2.menu.eesz.4M3M.build.spiffs_pagesize=256
+phoenix_v2.menu.eesz.4M3M.upload.maximum_size=1044464
+phoenix_v2.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+phoenix_v2.menu.eesz.4M3M.build.spiffs_start=0x100000
+phoenix_v2.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+phoenix_v2.menu.eesz.4M3M.build.spiffs_blocksize=8192
+phoenix_v2.menu.ResetMethod.ck=ck
+phoenix_v2.menu.ResetMethod.ck.upload.resetmethod=ck
+phoenix_v2.menu.ResetMethod.nodemcu=nodemcu
+phoenix_v2.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
+phoenix_v2.menu.ip.lm2f=v2 Lower Memory
+phoenix_v2.menu.ip.lm2f.build.lwip_include=lwip2/include
+phoenix_v2.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+phoenix_v2.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+phoenix_v2.menu.ip.hb2f=v2 Higher Bandwidth
+phoenix_v2.menu.ip.hb2f.build.lwip_include=lwip2/include
+phoenix_v2.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+phoenix_v2.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+phoenix_v2.menu.ip.lm2n=v2 Lower Memory (no features)
+phoenix_v2.menu.ip.lm2n.build.lwip_include=lwip2/include
+phoenix_v2.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+phoenix_v2.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+phoenix_v2.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+phoenix_v2.menu.ip.hb2n.build.lwip_include=lwip2/include
+phoenix_v2.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+phoenix_v2.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+phoenix_v2.menu.ip.lm6f=v2 IPv6 Lower Memory
+phoenix_v2.menu.ip.lm6f.build.lwip_include=lwip2/include
+phoenix_v2.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+phoenix_v2.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+phoenix_v2.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+phoenix_v2.menu.ip.hb6f.build.lwip_include=lwip2/include
+phoenix_v2.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+phoenix_v2.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+phoenix_v2.menu.ip.hb1=v1.4 Higher Bandwidth
+phoenix_v2.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+phoenix_v2.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+phoenix_v2.menu.ip.src=v1.4 Compile from source
+phoenix_v2.menu.ip.src.build.lwip_lib=-llwip_src
+phoenix_v2.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+phoenix_v2.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+phoenix_v2.menu.dbg.Disabled=Disabled
+phoenix_v2.menu.dbg.Disabled.build.debug_port=
+phoenix_v2.menu.dbg.Serial=Serial
+phoenix_v2.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+phoenix_v2.menu.dbg.Serial1=Serial1
+phoenix_v2.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+phoenix_v2.menu.lvl.None____=None
+phoenix_v2.menu.lvl.None____.build.debug_level=
+phoenix_v2.menu.lvl.SSL=SSL
+phoenix_v2.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+phoenix_v2.menu.lvl.TLS_MEM=TLS_MEM
+phoenix_v2.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+phoenix_v2.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+phoenix_v2.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+phoenix_v2.menu.lvl.HTTP_SERVER=HTTP_SERVER
+phoenix_v2.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+phoenix_v2.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+phoenix_v2.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+phoenix_v2.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+phoenix_v2.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+phoenix_v2.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+phoenix_v2.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+phoenix_v2.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+phoenix_v2.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+phoenix_v2.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+phoenix_v2.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+phoenix_v2.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+phoenix_v2.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+phoenix_v2.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+phoenix_v2.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+phoenix_v2.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+phoenix_v2.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+phoenix_v2.menu.lvl.CORE=CORE
+phoenix_v2.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+phoenix_v2.menu.lvl.WIFI=WIFI
+phoenix_v2.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+phoenix_v2.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+phoenix_v2.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+phoenix_v2.menu.lvl.UPDATER=UPDATER
+phoenix_v2.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+phoenix_v2.menu.lvl.OTA=OTA
+phoenix_v2.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+phoenix_v2.menu.lvl.OOM=OOM
+phoenix_v2.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+phoenix_v2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+phoenix_v2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+phoenix_v2.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+phoenix_v2.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+phoenix_v2.menu.wipe.none=Only Sketch
+phoenix_v2.menu.wipe.none.upload.erase_cmd=
+phoenix_v2.menu.wipe.sdk=Sketch + WiFi Settings
+phoenix_v2.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+phoenix_v2.menu.wipe.all=All Flash Contents
+phoenix_v2.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+phoenix_v2.menu.baud.115200=115200
+phoenix_v2.menu.baud.115200.upload.speed=115200
+phoenix_v2.menu.baud.9600=9600
+phoenix_v2.menu.baud.9600.upload.speed=9600
+phoenix_v2.menu.baud.57600=57600
+phoenix_v2.menu.baud.57600.upload.speed=57600
+phoenix_v2.menu.baud.230400.linux=230400
+phoenix_v2.menu.baud.230400.macosx=230400
+phoenix_v2.menu.baud.230400.upload.speed=230400
+phoenix_v2.menu.baud.256000.windows=256000
+phoenix_v2.menu.baud.256000.upload.speed=256000
+phoenix_v2.menu.baud.460800.linux=460800
+phoenix_v2.menu.baud.460800.macosx=460800
+phoenix_v2.menu.baud.460800.upload.speed=460800
+phoenix_v2.menu.baud.512000.windows=512000
+phoenix_v2.menu.baud.512000.upload.speed=512000
+phoenix_v2.menu.baud.921600=921600
+phoenix_v2.menu.baud.921600.upload.speed=921600
+
+##############################################################
+nodemcu.name=NodeMCU 0.9 (ESP-12 Module)
+nodemcu.build.board=ESP8266_NODEMCU
+nodemcu.build.variant=nodemcu
+nodemcu.upload.tool=esptool
+nodemcu.upload.maximum_data_size=81920
+nodemcu.upload.wait_for_upload_port=true
+nodemcu.upload.erase_cmd=
+nodemcu.serial.disableDTR=true
+nodemcu.serial.disableRTS=true
+nodemcu.build.mcu=esp8266
+nodemcu.build.core=esp8266
+nodemcu.build.spiffs_pagesize=256
+nodemcu.build.debug_port=
+nodemcu.build.debug_level=
+nodemcu.menu.xtal.80=80 MHz
+nodemcu.menu.xtal.80.build.f_cpu=80000000L
+nodemcu.menu.xtal.160=160 MHz
+nodemcu.menu.xtal.160.build.f_cpu=160000000L
+nodemcu.menu.vt.flash=Flash
+nodemcu.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+nodemcu.menu.vt.heap=Heap
+nodemcu.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+nodemcu.menu.vt.iram=IRAM
+nodemcu.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+nodemcu.menu.exception.enabled=Enabled
+nodemcu.menu.exception.enabled.build.exception_flags=-fexceptions
+nodemcu.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+nodemcu.menu.exception.disabled=Disabled
+nodemcu.menu.exception.disabled.build.exception_flags=-fno-exceptions
+nodemcu.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+nodemcu.upload.resetmethod=nodemcu
+nodemcu.build.flash_mode=qio
+nodemcu.build.flash_freq=40
+nodemcu.menu.eesz.4M=4M (no SPIFFS)
+nodemcu.menu.eesz.4M.build.flash_size=4M
+nodemcu.menu.eesz.4M.build.flash_size_bytes=0x400000
+nodemcu.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+nodemcu.menu.eesz.4M.build.spiffs_pagesize=256
+nodemcu.menu.eesz.4M.upload.maximum_size=1044464
+nodemcu.menu.eesz.4M.build.rfcal_addr=0x3FC000
+nodemcu.menu.eesz.4M1M=4M (1M SPIFFS)
+nodemcu.menu.eesz.4M1M.build.flash_size=4M
+nodemcu.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+nodemcu.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+nodemcu.menu.eesz.4M1M.build.spiffs_pagesize=256
+nodemcu.menu.eesz.4M1M.upload.maximum_size=1044464
+nodemcu.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+nodemcu.menu.eesz.4M1M.build.spiffs_start=0x300000
+nodemcu.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+nodemcu.menu.eesz.4M1M.build.spiffs_blocksize=8192
+nodemcu.menu.eesz.4M2M=4M (2M SPIFFS)
+nodemcu.menu.eesz.4M2M.build.flash_size=4M
+nodemcu.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+nodemcu.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+nodemcu.menu.eesz.4M2M.build.spiffs_pagesize=256
+nodemcu.menu.eesz.4M2M.upload.maximum_size=1044464
+nodemcu.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+nodemcu.menu.eesz.4M2M.build.spiffs_start=0x200000
+nodemcu.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+nodemcu.menu.eesz.4M2M.build.spiffs_blocksize=8192
+nodemcu.menu.eesz.4M3M=4M (3M SPIFFS)
+nodemcu.menu.eesz.4M3M.build.flash_size=4M
+nodemcu.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+nodemcu.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+nodemcu.menu.eesz.4M3M.build.spiffs_pagesize=256
+nodemcu.menu.eesz.4M3M.upload.maximum_size=1044464
+nodemcu.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+nodemcu.menu.eesz.4M3M.build.spiffs_start=0x100000
+nodemcu.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+nodemcu.menu.eesz.4M3M.build.spiffs_blocksize=8192
+nodemcu.menu.ip.lm2f=v2 Lower Memory
+nodemcu.menu.ip.lm2f.build.lwip_include=lwip2/include
+nodemcu.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+nodemcu.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+nodemcu.menu.ip.hb2f=v2 Higher Bandwidth
+nodemcu.menu.ip.hb2f.build.lwip_include=lwip2/include
+nodemcu.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+nodemcu.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+nodemcu.menu.ip.lm2n=v2 Lower Memory (no features)
+nodemcu.menu.ip.lm2n.build.lwip_include=lwip2/include
+nodemcu.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+nodemcu.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+nodemcu.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+nodemcu.menu.ip.hb2n.build.lwip_include=lwip2/include
+nodemcu.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+nodemcu.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+nodemcu.menu.ip.lm6f=v2 IPv6 Lower Memory
+nodemcu.menu.ip.lm6f.build.lwip_include=lwip2/include
+nodemcu.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+nodemcu.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+nodemcu.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+nodemcu.menu.ip.hb6f.build.lwip_include=lwip2/include
+nodemcu.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+nodemcu.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+nodemcu.menu.ip.hb1=v1.4 Higher Bandwidth
+nodemcu.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+nodemcu.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+nodemcu.menu.ip.src=v1.4 Compile from source
+nodemcu.menu.ip.src.build.lwip_lib=-llwip_src
+nodemcu.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+nodemcu.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+nodemcu.menu.dbg.Disabled=Disabled
+nodemcu.menu.dbg.Disabled.build.debug_port=
+nodemcu.menu.dbg.Serial=Serial
+nodemcu.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+nodemcu.menu.dbg.Serial1=Serial1
+nodemcu.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+nodemcu.menu.lvl.None____=None
+nodemcu.menu.lvl.None____.build.debug_level=
+nodemcu.menu.lvl.SSL=SSL
+nodemcu.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+nodemcu.menu.lvl.TLS_MEM=TLS_MEM
+nodemcu.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+nodemcu.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+nodemcu.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+nodemcu.menu.lvl.HTTP_SERVER=HTTP_SERVER
+nodemcu.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+nodemcu.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+nodemcu.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+nodemcu.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+nodemcu.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+nodemcu.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+nodemcu.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+nodemcu.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+nodemcu.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+nodemcu.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+nodemcu.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+nodemcu.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+nodemcu.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+nodemcu.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+nodemcu.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+nodemcu.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+nodemcu.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+nodemcu.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+nodemcu.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+nodemcu.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+nodemcu.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+nodemcu.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+nodemcu.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+nodemcu.menu.lvl.CORE=CORE
+nodemcu.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+nodemcu.menu.lvl.WIFI=WIFI
+nodemcu.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+nodemcu.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+nodemcu.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+nodemcu.menu.lvl.UPDATER=UPDATER
+nodemcu.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+nodemcu.menu.lvl.OTA=OTA
+nodemcu.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+nodemcu.menu.lvl.OOM=OOM
+nodemcu.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+nodemcu.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+nodemcu.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+nodemcu.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+nodemcu.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+nodemcu.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+nodemcu.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+nodemcu.menu.wipe.none=Only Sketch
+nodemcu.menu.wipe.none.upload.erase_cmd=
+nodemcu.menu.wipe.sdk=Sketch + WiFi Settings
+nodemcu.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+nodemcu.menu.wipe.all=All Flash Contents
+nodemcu.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+nodemcu.menu.baud.115200=115200
+nodemcu.menu.baud.115200.upload.speed=115200
+nodemcu.menu.baud.9600=9600
+nodemcu.menu.baud.9600.upload.speed=9600
+nodemcu.menu.baud.57600=57600
+nodemcu.menu.baud.57600.upload.speed=57600
+nodemcu.menu.baud.230400.linux=230400
+nodemcu.menu.baud.230400.macosx=230400
+nodemcu.menu.baud.230400.upload.speed=230400
+nodemcu.menu.baud.256000.windows=256000
+nodemcu.menu.baud.256000.upload.speed=256000
+nodemcu.menu.baud.460800.linux=460800
+nodemcu.menu.baud.460800.macosx=460800
+nodemcu.menu.baud.460800.upload.speed=460800
+nodemcu.menu.baud.512000.windows=512000
+nodemcu.menu.baud.512000.upload.speed=512000
+nodemcu.menu.baud.921600=921600
+nodemcu.menu.baud.921600.upload.speed=921600
+
+##############################################################
+nodemcuv2.name=NodeMCU 1.0 (ESP-12E Module)
+nodemcuv2.build.board=ESP8266_NODEMCU
+nodemcuv2.build.variant=nodemcu
+nodemcuv2.upload.tool=esptool
+nodemcuv2.upload.maximum_data_size=81920
+nodemcuv2.upload.wait_for_upload_port=true
+nodemcuv2.upload.erase_cmd=
+nodemcuv2.serial.disableDTR=true
+nodemcuv2.serial.disableRTS=true
+nodemcuv2.build.mcu=esp8266
+nodemcuv2.build.core=esp8266
+nodemcuv2.build.spiffs_pagesize=256
+nodemcuv2.build.debug_port=
+nodemcuv2.build.debug_level=
+nodemcuv2.menu.xtal.80=80 MHz
+nodemcuv2.menu.xtal.80.build.f_cpu=80000000L
+nodemcuv2.menu.xtal.160=160 MHz
+nodemcuv2.menu.xtal.160.build.f_cpu=160000000L
+nodemcuv2.menu.vt.flash=Flash
+nodemcuv2.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+nodemcuv2.menu.vt.heap=Heap
+nodemcuv2.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+nodemcuv2.menu.vt.iram=IRAM
+nodemcuv2.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+nodemcuv2.menu.exception.enabled=Enabled
+nodemcuv2.menu.exception.enabled.build.exception_flags=-fexceptions
+nodemcuv2.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+nodemcuv2.menu.exception.disabled=Disabled
+nodemcuv2.menu.exception.disabled.build.exception_flags=-fno-exceptions
+nodemcuv2.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+nodemcuv2.upload.resetmethod=nodemcu
+nodemcuv2.build.flash_mode=dio
+nodemcuv2.build.flash_freq=40
+nodemcuv2.menu.eesz.4M=4M (no SPIFFS)
+nodemcuv2.menu.eesz.4M.build.flash_size=4M
+nodemcuv2.menu.eesz.4M.build.flash_size_bytes=0x400000
+nodemcuv2.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+nodemcuv2.menu.eesz.4M.build.spiffs_pagesize=256
+nodemcuv2.menu.eesz.4M.upload.maximum_size=1044464
+nodemcuv2.menu.eesz.4M.build.rfcal_addr=0x3FC000
+nodemcuv2.menu.eesz.4M1M=4M (1M SPIFFS)
+nodemcuv2.menu.eesz.4M1M.build.flash_size=4M
+nodemcuv2.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+nodemcuv2.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+nodemcuv2.menu.eesz.4M1M.build.spiffs_pagesize=256
+nodemcuv2.menu.eesz.4M1M.upload.maximum_size=1044464
+nodemcuv2.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+nodemcuv2.menu.eesz.4M1M.build.spiffs_start=0x300000
+nodemcuv2.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+nodemcuv2.menu.eesz.4M1M.build.spiffs_blocksize=8192
+nodemcuv2.menu.eesz.4M2M=4M (2M SPIFFS)
+nodemcuv2.menu.eesz.4M2M.build.flash_size=4M
+nodemcuv2.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+nodemcuv2.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+nodemcuv2.menu.eesz.4M2M.build.spiffs_pagesize=256
+nodemcuv2.menu.eesz.4M2M.upload.maximum_size=1044464
+nodemcuv2.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+nodemcuv2.menu.eesz.4M2M.build.spiffs_start=0x200000
+nodemcuv2.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+nodemcuv2.menu.eesz.4M2M.build.spiffs_blocksize=8192
+nodemcuv2.menu.eesz.4M3M=4M (3M SPIFFS)
+nodemcuv2.menu.eesz.4M3M.build.flash_size=4M
+nodemcuv2.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+nodemcuv2.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+nodemcuv2.menu.eesz.4M3M.build.spiffs_pagesize=256
+nodemcuv2.menu.eesz.4M3M.upload.maximum_size=1044464
+nodemcuv2.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+nodemcuv2.menu.eesz.4M3M.build.spiffs_start=0x100000
+nodemcuv2.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+nodemcuv2.menu.eesz.4M3M.build.spiffs_blocksize=8192
+nodemcuv2.menu.ip.lm2f=v2 Lower Memory
+nodemcuv2.menu.ip.lm2f.build.lwip_include=lwip2/include
+nodemcuv2.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+nodemcuv2.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+nodemcuv2.menu.ip.hb2f=v2 Higher Bandwidth
+nodemcuv2.menu.ip.hb2f.build.lwip_include=lwip2/include
+nodemcuv2.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+nodemcuv2.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+nodemcuv2.menu.ip.lm2n=v2 Lower Memory (no features)
+nodemcuv2.menu.ip.lm2n.build.lwip_include=lwip2/include
+nodemcuv2.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+nodemcuv2.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+nodemcuv2.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+nodemcuv2.menu.ip.hb2n.build.lwip_include=lwip2/include
+nodemcuv2.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+nodemcuv2.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+nodemcuv2.menu.ip.lm6f=v2 IPv6 Lower Memory
+nodemcuv2.menu.ip.lm6f.build.lwip_include=lwip2/include
+nodemcuv2.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+nodemcuv2.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+nodemcuv2.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+nodemcuv2.menu.ip.hb6f.build.lwip_include=lwip2/include
+nodemcuv2.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+nodemcuv2.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+nodemcuv2.menu.ip.hb1=v1.4 Higher Bandwidth
+nodemcuv2.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+nodemcuv2.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+nodemcuv2.menu.ip.src=v1.4 Compile from source
+nodemcuv2.menu.ip.src.build.lwip_lib=-llwip_src
+nodemcuv2.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+nodemcuv2.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+nodemcuv2.menu.dbg.Disabled=Disabled
+nodemcuv2.menu.dbg.Disabled.build.debug_port=
+nodemcuv2.menu.dbg.Serial=Serial
+nodemcuv2.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+nodemcuv2.menu.dbg.Serial1=Serial1
+nodemcuv2.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+nodemcuv2.menu.lvl.None____=None
+nodemcuv2.menu.lvl.None____.build.debug_level=
+nodemcuv2.menu.lvl.SSL=SSL
+nodemcuv2.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+nodemcuv2.menu.lvl.TLS_MEM=TLS_MEM
+nodemcuv2.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+nodemcuv2.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+nodemcuv2.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+nodemcuv2.menu.lvl.HTTP_SERVER=HTTP_SERVER
+nodemcuv2.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+nodemcuv2.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+nodemcuv2.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+nodemcuv2.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+nodemcuv2.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+nodemcuv2.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+nodemcuv2.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+nodemcuv2.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+nodemcuv2.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+nodemcuv2.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+nodemcuv2.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+nodemcuv2.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+nodemcuv2.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+nodemcuv2.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+nodemcuv2.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+nodemcuv2.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+nodemcuv2.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+nodemcuv2.menu.lvl.CORE=CORE
+nodemcuv2.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+nodemcuv2.menu.lvl.WIFI=WIFI
+nodemcuv2.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+nodemcuv2.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+nodemcuv2.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+nodemcuv2.menu.lvl.UPDATER=UPDATER
+nodemcuv2.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+nodemcuv2.menu.lvl.OTA=OTA
+nodemcuv2.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+nodemcuv2.menu.lvl.OOM=OOM
+nodemcuv2.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+nodemcuv2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+nodemcuv2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+nodemcuv2.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+nodemcuv2.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+nodemcuv2.menu.wipe.none=Only Sketch
+nodemcuv2.menu.wipe.none.upload.erase_cmd=
+nodemcuv2.menu.wipe.sdk=Sketch + WiFi Settings
+nodemcuv2.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+nodemcuv2.menu.wipe.all=All Flash Contents
+nodemcuv2.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+nodemcuv2.menu.baud.115200=115200
+nodemcuv2.menu.baud.115200.upload.speed=115200
+nodemcuv2.menu.baud.9600=9600
+nodemcuv2.menu.baud.9600.upload.speed=9600
+nodemcuv2.menu.baud.57600=57600
+nodemcuv2.menu.baud.57600.upload.speed=57600
+nodemcuv2.menu.baud.230400.linux=230400
+nodemcuv2.menu.baud.230400.macosx=230400
+nodemcuv2.menu.baud.230400.upload.speed=230400
+nodemcuv2.menu.baud.256000.windows=256000
+nodemcuv2.menu.baud.256000.upload.speed=256000
+nodemcuv2.menu.baud.460800.linux=460800
+nodemcuv2.menu.baud.460800.macosx=460800
+nodemcuv2.menu.baud.460800.upload.speed=460800
+nodemcuv2.menu.baud.512000.windows=512000
+nodemcuv2.menu.baud.512000.upload.speed=512000
+nodemcuv2.menu.baud.921600=921600
+nodemcuv2.menu.baud.921600.upload.speed=921600
+
+##############################################################
+modwifi.name=Olimex MOD-WIFI-ESP8266(-DEV)
+modwifi.build.board=MOD_WIFI_ESP8266
+modwifi.build.variant=modwifi
+modwifi.upload.tool=esptool
+modwifi.upload.maximum_data_size=81920
+modwifi.upload.wait_for_upload_port=true
+modwifi.upload.erase_cmd=
+modwifi.serial.disableDTR=true
+modwifi.serial.disableRTS=true
+modwifi.build.mcu=esp8266
+modwifi.build.core=esp8266
+modwifi.build.spiffs_pagesize=256
+modwifi.build.debug_port=
+modwifi.build.debug_level=
+modwifi.menu.xtal.80=80 MHz
+modwifi.menu.xtal.80.build.f_cpu=80000000L
+modwifi.menu.xtal.160=160 MHz
+modwifi.menu.xtal.160.build.f_cpu=160000000L
+modwifi.menu.vt.flash=Flash
+modwifi.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+modwifi.menu.vt.heap=Heap
+modwifi.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+modwifi.menu.vt.iram=IRAM
+modwifi.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+modwifi.menu.exception.enabled=Enabled
+modwifi.menu.exception.enabled.build.exception_flags=-fexceptions
+modwifi.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+modwifi.menu.exception.disabled=Disabled
+modwifi.menu.exception.disabled.build.exception_flags=-fno-exceptions
+modwifi.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+modwifi.upload.resetmethod=ck
+modwifi.build.flash_mode=qio
+modwifi.build.flash_freq=40
+modwifi.menu.eesz.2M=2M (no SPIFFS)
+modwifi.menu.eesz.2M.build.flash_size=2M
+modwifi.menu.eesz.2M.build.flash_size_bytes=0x200000
+modwifi.menu.eesz.2M.build.flash_ld=eagle.flash.2m.ld
+modwifi.menu.eesz.2M.build.spiffs_pagesize=256
+modwifi.menu.eesz.2M.upload.maximum_size=1044464
+modwifi.menu.eesz.2M.build.rfcal_addr=0x1FC000
+modwifi.menu.eesz.2M128=2M (128K SPIFFS)
+modwifi.menu.eesz.2M128.build.flash_size=2M
+modwifi.menu.eesz.2M128.build.flash_size_bytes=0x200000
+modwifi.menu.eesz.2M128.build.flash_ld=eagle.flash.2m128.ld
+modwifi.menu.eesz.2M128.build.spiffs_pagesize=256
+modwifi.menu.eesz.2M128.upload.maximum_size=1044464
+modwifi.menu.eesz.2M128.build.rfcal_addr=0x1FC000
+modwifi.menu.eesz.2M128.build.spiffs_start=0x1E0000
+modwifi.menu.eesz.2M128.build.spiffs_end=0x1FB000
+modwifi.menu.eesz.2M128.build.spiffs_blocksize=4096
+modwifi.menu.eesz.2M256=2M (256K SPIFFS)
+modwifi.menu.eesz.2M256.build.flash_size=2M
+modwifi.menu.eesz.2M256.build.flash_size_bytes=0x200000
+modwifi.menu.eesz.2M256.build.flash_ld=eagle.flash.2m256.ld
+modwifi.menu.eesz.2M256.build.spiffs_pagesize=256
+modwifi.menu.eesz.2M256.upload.maximum_size=1044464
+modwifi.menu.eesz.2M256.build.rfcal_addr=0x1FC000
+modwifi.menu.eesz.2M256.build.spiffs_start=0x1C0000
+modwifi.menu.eesz.2M256.build.spiffs_end=0x1FB000
+modwifi.menu.eesz.2M256.build.spiffs_blocksize=4096
+modwifi.menu.eesz.2M512=2M (512K SPIFFS)
+modwifi.menu.eesz.2M512.build.flash_size=2M
+modwifi.menu.eesz.2M512.build.flash_size_bytes=0x200000
+modwifi.menu.eesz.2M512.build.flash_ld=eagle.flash.2m512.ld
+modwifi.menu.eesz.2M512.build.spiffs_pagesize=256
+modwifi.menu.eesz.2M512.upload.maximum_size=1044464
+modwifi.menu.eesz.2M512.build.rfcal_addr=0x1FC000
+modwifi.menu.eesz.2M512.build.spiffs_start=0x180000
+modwifi.menu.eesz.2M512.build.spiffs_end=0x1FB000
+modwifi.menu.eesz.2M512.build.spiffs_blocksize=8192
+modwifi.menu.eesz.2M1M=2M (1M SPIFFS)
+modwifi.menu.eesz.2M1M.build.flash_size=2M
+modwifi.menu.eesz.2M1M.build.flash_size_bytes=0x200000
+modwifi.menu.eesz.2M1M.build.flash_ld=eagle.flash.2m1m.ld
+modwifi.menu.eesz.2M1M.build.spiffs_pagesize=256
+modwifi.menu.eesz.2M1M.upload.maximum_size=1044464
+modwifi.menu.eesz.2M1M.build.rfcal_addr=0x1FC000
+modwifi.menu.eesz.2M1M.build.spiffs_start=0x100000
+modwifi.menu.eesz.2M1M.build.spiffs_end=0x1FB000
+modwifi.menu.eesz.2M1M.build.spiffs_blocksize=8192
+modwifi.menu.ip.lm2f=v2 Lower Memory
+modwifi.menu.ip.lm2f.build.lwip_include=lwip2/include
+modwifi.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+modwifi.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+modwifi.menu.ip.hb2f=v2 Higher Bandwidth
+modwifi.menu.ip.hb2f.build.lwip_include=lwip2/include
+modwifi.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+modwifi.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+modwifi.menu.ip.lm2n=v2 Lower Memory (no features)
+modwifi.menu.ip.lm2n.build.lwip_include=lwip2/include
+modwifi.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+modwifi.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+modwifi.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+modwifi.menu.ip.hb2n.build.lwip_include=lwip2/include
+modwifi.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+modwifi.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+modwifi.menu.ip.lm6f=v2 IPv6 Lower Memory
+modwifi.menu.ip.lm6f.build.lwip_include=lwip2/include
+modwifi.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+modwifi.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+modwifi.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+modwifi.menu.ip.hb6f.build.lwip_include=lwip2/include
+modwifi.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+modwifi.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+modwifi.menu.ip.hb1=v1.4 Higher Bandwidth
+modwifi.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+modwifi.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+modwifi.menu.ip.src=v1.4 Compile from source
+modwifi.menu.ip.src.build.lwip_lib=-llwip_src
+modwifi.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+modwifi.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+modwifi.menu.dbg.Disabled=Disabled
+modwifi.menu.dbg.Disabled.build.debug_port=
+modwifi.menu.dbg.Serial=Serial
+modwifi.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+modwifi.menu.dbg.Serial1=Serial1
+modwifi.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+modwifi.menu.lvl.None____=None
+modwifi.menu.lvl.None____.build.debug_level=
+modwifi.menu.lvl.SSL=SSL
+modwifi.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+modwifi.menu.lvl.TLS_MEM=TLS_MEM
+modwifi.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+modwifi.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+modwifi.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+modwifi.menu.lvl.HTTP_SERVER=HTTP_SERVER
+modwifi.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+modwifi.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+modwifi.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+modwifi.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+modwifi.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+modwifi.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+modwifi.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+modwifi.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+modwifi.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+modwifi.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+modwifi.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+modwifi.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+modwifi.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+modwifi.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+modwifi.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+modwifi.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+modwifi.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+modwifi.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+modwifi.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+modwifi.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+modwifi.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+modwifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+modwifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+modwifi.menu.lvl.CORE=CORE
+modwifi.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+modwifi.menu.lvl.WIFI=WIFI
+modwifi.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+modwifi.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+modwifi.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+modwifi.menu.lvl.UPDATER=UPDATER
+modwifi.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+modwifi.menu.lvl.OTA=OTA
+modwifi.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+modwifi.menu.lvl.OOM=OOM
+modwifi.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+modwifi.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+modwifi.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+modwifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+modwifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+modwifi.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+modwifi.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+modwifi.menu.wipe.none=Only Sketch
+modwifi.menu.wipe.none.upload.erase_cmd=
+modwifi.menu.wipe.sdk=Sketch + WiFi Settings
+modwifi.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+modwifi.menu.wipe.all=All Flash Contents
+modwifi.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+modwifi.menu.baud.115200=115200
+modwifi.menu.baud.115200.upload.speed=115200
+modwifi.menu.baud.9600=9600
+modwifi.menu.baud.9600.upload.speed=9600
+modwifi.menu.baud.57600=57600
+modwifi.menu.baud.57600.upload.speed=57600
+modwifi.menu.baud.230400.linux=230400
+modwifi.menu.baud.230400.macosx=230400
+modwifi.menu.baud.230400.upload.speed=230400
+modwifi.menu.baud.256000.windows=256000
+modwifi.menu.baud.256000.upload.speed=256000
+modwifi.menu.baud.460800.linux=460800
+modwifi.menu.baud.460800.macosx=460800
+modwifi.menu.baud.460800.upload.speed=460800
+modwifi.menu.baud.512000.windows=512000
+modwifi.menu.baud.512000.upload.speed=512000
+modwifi.menu.baud.921600=921600
+modwifi.menu.baud.921600.upload.speed=921600
+
+##############################################################
+thing.name=SparkFun ESP8266 Thing
+thing.build.board=ESP8266_THING
+thing.build.variant=thing
+thing.upload.tool=esptool
+thing.upload.maximum_data_size=81920
+thing.upload.wait_for_upload_port=true
+thing.upload.erase_cmd=
+thing.serial.disableDTR=true
+thing.serial.disableRTS=true
+thing.build.mcu=esp8266
+thing.build.core=esp8266
+thing.build.spiffs_pagesize=256
+thing.build.debug_port=
+thing.build.debug_level=
+thing.menu.xtal.80=80 MHz
+thing.menu.xtal.80.build.f_cpu=80000000L
+thing.menu.xtal.160=160 MHz
+thing.menu.xtal.160.build.f_cpu=160000000L
+thing.menu.vt.flash=Flash
+thing.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+thing.menu.vt.heap=Heap
+thing.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+thing.menu.vt.iram=IRAM
+thing.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+thing.menu.exception.enabled=Enabled
+thing.menu.exception.enabled.build.exception_flags=-fexceptions
+thing.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+thing.menu.exception.disabled=Disabled
+thing.menu.exception.disabled.build.exception_flags=-fno-exceptions
+thing.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+thing.upload.resetmethod=ck
+thing.build.flash_mode=qio
+thing.build.flash_freq=40
+thing.menu.eesz.512K=512K (no SPIFFS)
+thing.menu.eesz.512K.build.flash_size=512K
+thing.menu.eesz.512K.build.flash_size_bytes=0x80000
+thing.menu.eesz.512K.build.flash_ld=eagle.flash.512k.ld
+thing.menu.eesz.512K.build.spiffs_pagesize=256
+thing.menu.eesz.512K.upload.maximum_size=499696
+thing.menu.eesz.512K.build.rfcal_addr=0x7C000
+thing.menu.eesz.512K32=512K (32K SPIFFS)
+thing.menu.eesz.512K32.build.flash_size=512K
+thing.menu.eesz.512K32.build.flash_size_bytes=0x80000
+thing.menu.eesz.512K32.build.flash_ld=eagle.flash.512k32.ld
+thing.menu.eesz.512K32.build.spiffs_pagesize=256
+thing.menu.eesz.512K32.upload.maximum_size=466928
+thing.menu.eesz.512K32.build.rfcal_addr=0x7C000
+thing.menu.eesz.512K32.build.spiffs_start=0x73000
+thing.menu.eesz.512K32.build.spiffs_end=0x7B000
+thing.menu.eesz.512K32.build.spiffs_blocksize=4096
+thing.menu.eesz.512K64=512K (64K SPIFFS)
+thing.menu.eesz.512K64.build.flash_size=512K
+thing.menu.eesz.512K64.build.flash_size_bytes=0x80000
+thing.menu.eesz.512K64.build.flash_ld=eagle.flash.512k64.ld
+thing.menu.eesz.512K64.build.spiffs_pagesize=256
+thing.menu.eesz.512K64.upload.maximum_size=434160
+thing.menu.eesz.512K64.build.rfcal_addr=0x7C000
+thing.menu.eesz.512K64.build.spiffs_start=0x6B000
+thing.menu.eesz.512K64.build.spiffs_end=0x7B000
+thing.menu.eesz.512K64.build.spiffs_blocksize=4096
+thing.menu.eesz.512K128=512K (128K SPIFFS)
+thing.menu.eesz.512K128.build.flash_size=512K
+thing.menu.eesz.512K128.build.flash_size_bytes=0x80000
+thing.menu.eesz.512K128.build.flash_ld=eagle.flash.512k128.ld
+thing.menu.eesz.512K128.build.spiffs_pagesize=256
+thing.menu.eesz.512K128.upload.maximum_size=368624
+thing.menu.eesz.512K128.build.rfcal_addr=0x7C000
+thing.menu.eesz.512K128.build.spiffs_start=0x5B000
+thing.menu.eesz.512K128.build.spiffs_end=0x7B000
+thing.menu.eesz.512K128.build.spiffs_blocksize=4096
+thing.menu.ip.lm2f=v2 Lower Memory
+thing.menu.ip.lm2f.build.lwip_include=lwip2/include
+thing.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+thing.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+thing.menu.ip.hb2f=v2 Higher Bandwidth
+thing.menu.ip.hb2f.build.lwip_include=lwip2/include
+thing.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+thing.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+thing.menu.ip.lm2n=v2 Lower Memory (no features)
+thing.menu.ip.lm2n.build.lwip_include=lwip2/include
+thing.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+thing.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+thing.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+thing.menu.ip.hb2n.build.lwip_include=lwip2/include
+thing.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+thing.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+thing.menu.ip.lm6f=v2 IPv6 Lower Memory
+thing.menu.ip.lm6f.build.lwip_include=lwip2/include
+thing.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+thing.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+thing.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+thing.menu.ip.hb6f.build.lwip_include=lwip2/include
+thing.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+thing.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+thing.menu.ip.hb1=v1.4 Higher Bandwidth
+thing.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+thing.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+thing.menu.ip.src=v1.4 Compile from source
+thing.menu.ip.src.build.lwip_lib=-llwip_src
+thing.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+thing.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+thing.menu.dbg.Disabled=Disabled
+thing.menu.dbg.Disabled.build.debug_port=
+thing.menu.dbg.Serial=Serial
+thing.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+thing.menu.dbg.Serial1=Serial1
+thing.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+thing.menu.lvl.None____=None
+thing.menu.lvl.None____.build.debug_level=
+thing.menu.lvl.SSL=SSL
+thing.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+thing.menu.lvl.TLS_MEM=TLS_MEM
+thing.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+thing.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+thing.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+thing.menu.lvl.HTTP_SERVER=HTTP_SERVER
+thing.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+thing.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+thing.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+thing.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+thing.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+thing.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+thing.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+thing.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+thing.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+thing.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+thing.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+thing.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+thing.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+thing.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+thing.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+thing.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+thing.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+thing.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+thing.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+thing.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+thing.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+thing.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+thing.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+thing.menu.lvl.CORE=CORE
+thing.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+thing.menu.lvl.WIFI=WIFI
+thing.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+thing.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+thing.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+thing.menu.lvl.UPDATER=UPDATER
+thing.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+thing.menu.lvl.OTA=OTA
+thing.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+thing.menu.lvl.OOM=OOM
+thing.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+thing.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+thing.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+thing.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+thing.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+thing.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+thing.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+thing.menu.wipe.none=Only Sketch
+thing.menu.wipe.none.upload.erase_cmd=
+thing.menu.wipe.sdk=Sketch + WiFi Settings
+thing.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+thing.menu.wipe.all=All Flash Contents
+thing.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+thing.menu.baud.115200=115200
+thing.menu.baud.115200.upload.speed=115200
+thing.menu.baud.9600=9600
+thing.menu.baud.9600.upload.speed=9600
+thing.menu.baud.57600=57600
+thing.menu.baud.57600.upload.speed=57600
+thing.menu.baud.230400.linux=230400
+thing.menu.baud.230400.macosx=230400
+thing.menu.baud.230400.upload.speed=230400
+thing.menu.baud.256000.windows=256000
+thing.menu.baud.256000.upload.speed=256000
+thing.menu.baud.460800.linux=460800
+thing.menu.baud.460800.macosx=460800
+thing.menu.baud.460800.upload.speed=460800
+thing.menu.baud.512000.windows=512000
+thing.menu.baud.512000.upload.speed=512000
+thing.menu.baud.921600=921600
+thing.menu.baud.921600.upload.speed=921600
+
+##############################################################
+thingdev.name=SparkFun ESP8266 Thing Dev
+thingdev.build.board=ESP8266_THING_DEV
+thingdev.build.variant=thing
+thingdev.upload.tool=esptool
+thingdev.upload.maximum_data_size=81920
+thingdev.upload.wait_for_upload_port=true
+thingdev.upload.erase_cmd=
+thingdev.serial.disableDTR=true
+thingdev.serial.disableRTS=true
+thingdev.build.mcu=esp8266
+thingdev.build.core=esp8266
+thingdev.build.spiffs_pagesize=256
+thingdev.build.debug_port=
+thingdev.build.debug_level=
+thingdev.menu.xtal.80=80 MHz
+thingdev.menu.xtal.80.build.f_cpu=80000000L
+thingdev.menu.xtal.160=160 MHz
+thingdev.menu.xtal.160.build.f_cpu=160000000L
+thingdev.menu.vt.flash=Flash
+thingdev.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+thingdev.menu.vt.heap=Heap
+thingdev.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+thingdev.menu.vt.iram=IRAM
+thingdev.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+thingdev.menu.exception.enabled=Enabled
+thingdev.menu.exception.enabled.build.exception_flags=-fexceptions
+thingdev.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+thingdev.menu.exception.disabled=Disabled
+thingdev.menu.exception.disabled.build.exception_flags=-fno-exceptions
+thingdev.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+thingdev.upload.resetmethod=nodemcu
+thingdev.build.flash_mode=dio
+thingdev.build.flash_freq=40
+thingdev.menu.eesz.512K=512K (no SPIFFS)
+thingdev.menu.eesz.512K.build.flash_size=512K
+thingdev.menu.eesz.512K.build.flash_size_bytes=0x80000
+thingdev.menu.eesz.512K.build.flash_ld=eagle.flash.512k.ld
+thingdev.menu.eesz.512K.build.spiffs_pagesize=256
+thingdev.menu.eesz.512K.upload.maximum_size=499696
+thingdev.menu.eesz.512K.build.rfcal_addr=0x7C000
+thingdev.menu.eesz.512K32=512K (32K SPIFFS)
+thingdev.menu.eesz.512K32.build.flash_size=512K
+thingdev.menu.eesz.512K32.build.flash_size_bytes=0x80000
+thingdev.menu.eesz.512K32.build.flash_ld=eagle.flash.512k32.ld
+thingdev.menu.eesz.512K32.build.spiffs_pagesize=256
+thingdev.menu.eesz.512K32.upload.maximum_size=466928
+thingdev.menu.eesz.512K32.build.rfcal_addr=0x7C000
+thingdev.menu.eesz.512K32.build.spiffs_start=0x73000
+thingdev.menu.eesz.512K32.build.spiffs_end=0x7B000
+thingdev.menu.eesz.512K32.build.spiffs_blocksize=4096
+thingdev.menu.eesz.512K64=512K (64K SPIFFS)
+thingdev.menu.eesz.512K64.build.flash_size=512K
+thingdev.menu.eesz.512K64.build.flash_size_bytes=0x80000
+thingdev.menu.eesz.512K64.build.flash_ld=eagle.flash.512k64.ld
+thingdev.menu.eesz.512K64.build.spiffs_pagesize=256
+thingdev.menu.eesz.512K64.upload.maximum_size=434160
+thingdev.menu.eesz.512K64.build.rfcal_addr=0x7C000
+thingdev.menu.eesz.512K64.build.spiffs_start=0x6B000
+thingdev.menu.eesz.512K64.build.spiffs_end=0x7B000
+thingdev.menu.eesz.512K64.build.spiffs_blocksize=4096
+thingdev.menu.eesz.512K128=512K (128K SPIFFS)
+thingdev.menu.eesz.512K128.build.flash_size=512K
+thingdev.menu.eesz.512K128.build.flash_size_bytes=0x80000
+thingdev.menu.eesz.512K128.build.flash_ld=eagle.flash.512k128.ld
+thingdev.menu.eesz.512K128.build.spiffs_pagesize=256
+thingdev.menu.eesz.512K128.upload.maximum_size=368624
+thingdev.menu.eesz.512K128.build.rfcal_addr=0x7C000
+thingdev.menu.eesz.512K128.build.spiffs_start=0x5B000
+thingdev.menu.eesz.512K128.build.spiffs_end=0x7B000
+thingdev.menu.eesz.512K128.build.spiffs_blocksize=4096
+thingdev.menu.ip.lm2f=v2 Lower Memory
+thingdev.menu.ip.lm2f.build.lwip_include=lwip2/include
+thingdev.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+thingdev.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+thingdev.menu.ip.hb2f=v2 Higher Bandwidth
+thingdev.menu.ip.hb2f.build.lwip_include=lwip2/include
+thingdev.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+thingdev.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+thingdev.menu.ip.lm2n=v2 Lower Memory (no features)
+thingdev.menu.ip.lm2n.build.lwip_include=lwip2/include
+thingdev.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+thingdev.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+thingdev.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+thingdev.menu.ip.hb2n.build.lwip_include=lwip2/include
+thingdev.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+thingdev.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+thingdev.menu.ip.lm6f=v2 IPv6 Lower Memory
+thingdev.menu.ip.lm6f.build.lwip_include=lwip2/include
+thingdev.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+thingdev.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+thingdev.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+thingdev.menu.ip.hb6f.build.lwip_include=lwip2/include
+thingdev.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+thingdev.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+thingdev.menu.ip.hb1=v1.4 Higher Bandwidth
+thingdev.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+thingdev.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+thingdev.menu.ip.src=v1.4 Compile from source
+thingdev.menu.ip.src.build.lwip_lib=-llwip_src
+thingdev.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+thingdev.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+thingdev.menu.dbg.Disabled=Disabled
+thingdev.menu.dbg.Disabled.build.debug_port=
+thingdev.menu.dbg.Serial=Serial
+thingdev.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+thingdev.menu.dbg.Serial1=Serial1
+thingdev.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+thingdev.menu.lvl.None____=None
+thingdev.menu.lvl.None____.build.debug_level=
+thingdev.menu.lvl.SSL=SSL
+thingdev.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+thingdev.menu.lvl.TLS_MEM=TLS_MEM
+thingdev.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+thingdev.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+thingdev.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+thingdev.menu.lvl.HTTP_SERVER=HTTP_SERVER
+thingdev.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+thingdev.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+thingdev.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+thingdev.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+thingdev.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+thingdev.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+thingdev.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+thingdev.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+thingdev.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+thingdev.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+thingdev.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+thingdev.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+thingdev.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+thingdev.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+thingdev.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+thingdev.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+thingdev.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+thingdev.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+thingdev.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+thingdev.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+thingdev.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+thingdev.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+thingdev.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+thingdev.menu.lvl.CORE=CORE
+thingdev.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+thingdev.menu.lvl.WIFI=WIFI
+thingdev.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+thingdev.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+thingdev.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+thingdev.menu.lvl.UPDATER=UPDATER
+thingdev.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+thingdev.menu.lvl.OTA=OTA
+thingdev.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+thingdev.menu.lvl.OOM=OOM
+thingdev.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+thingdev.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+thingdev.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+thingdev.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+thingdev.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+thingdev.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+thingdev.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+thingdev.menu.wipe.none=Only Sketch
+thingdev.menu.wipe.none.upload.erase_cmd=
+thingdev.menu.wipe.sdk=Sketch + WiFi Settings
+thingdev.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+thingdev.menu.wipe.all=All Flash Contents
+thingdev.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+thingdev.menu.baud.115200=115200
+thingdev.menu.baud.115200.upload.speed=115200
+thingdev.menu.baud.9600=9600
+thingdev.menu.baud.9600.upload.speed=9600
+thingdev.menu.baud.57600=57600
+thingdev.menu.baud.57600.upload.speed=57600
+thingdev.menu.baud.230400.linux=230400
+thingdev.menu.baud.230400.macosx=230400
+thingdev.menu.baud.230400.upload.speed=230400
+thingdev.menu.baud.256000.windows=256000
+thingdev.menu.baud.256000.upload.speed=256000
+thingdev.menu.baud.460800.linux=460800
+thingdev.menu.baud.460800.macosx=460800
+thingdev.menu.baud.460800.upload.speed=460800
+thingdev.menu.baud.512000.windows=512000
+thingdev.menu.baud.512000.upload.speed=512000
+thingdev.menu.baud.921600=921600
+thingdev.menu.baud.921600.upload.speed=921600
+
+##############################################################
+esp210.name=SweetPea ESP-210
+esp210.build.board=ESP8266_ESP210
+esp210.upload.tool=esptool
+esp210.upload.maximum_data_size=81920
+esp210.upload.wait_for_upload_port=true
+esp210.upload.erase_cmd=
+esp210.serial.disableDTR=true
+esp210.serial.disableRTS=true
+esp210.build.mcu=esp8266
+esp210.build.core=esp8266
+esp210.build.variant=generic
+esp210.build.spiffs_pagesize=256
+esp210.build.debug_port=
+esp210.build.debug_level=
+esp210.menu.xtal.80=80 MHz
+esp210.menu.xtal.80.build.f_cpu=80000000L
+esp210.menu.xtal.160=160 MHz
+esp210.menu.xtal.160.build.f_cpu=160000000L
+esp210.menu.vt.flash=Flash
+esp210.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+esp210.menu.vt.heap=Heap
+esp210.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+esp210.menu.vt.iram=IRAM
+esp210.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+esp210.menu.exception.enabled=Enabled
+esp210.menu.exception.enabled.build.exception_flags=-fexceptions
+esp210.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+esp210.menu.exception.disabled=Disabled
+esp210.menu.exception.disabled.build.exception_flags=-fno-exceptions
+esp210.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+esp210.upload.resetmethod=ck
+esp210.build.flash_mode=qio
+esp210.build.flash_freq=40
+esp210.menu.eesz.4M=4M (no SPIFFS)
+esp210.menu.eesz.4M.build.flash_size=4M
+esp210.menu.eesz.4M.build.flash_size_bytes=0x400000
+esp210.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+esp210.menu.eesz.4M.build.spiffs_pagesize=256
+esp210.menu.eesz.4M.upload.maximum_size=1044464
+esp210.menu.eesz.4M.build.rfcal_addr=0x3FC000
+esp210.menu.eesz.4M1M=4M (1M SPIFFS)
+esp210.menu.eesz.4M1M.build.flash_size=4M
+esp210.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+esp210.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+esp210.menu.eesz.4M1M.build.spiffs_pagesize=256
+esp210.menu.eesz.4M1M.upload.maximum_size=1044464
+esp210.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+esp210.menu.eesz.4M1M.build.spiffs_start=0x300000
+esp210.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+esp210.menu.eesz.4M1M.build.spiffs_blocksize=8192
+esp210.menu.eesz.4M2M=4M (2M SPIFFS)
+esp210.menu.eesz.4M2M.build.flash_size=4M
+esp210.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+esp210.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+esp210.menu.eesz.4M2M.build.spiffs_pagesize=256
+esp210.menu.eesz.4M2M.upload.maximum_size=1044464
+esp210.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+esp210.menu.eesz.4M2M.build.spiffs_start=0x200000
+esp210.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+esp210.menu.eesz.4M2M.build.spiffs_blocksize=8192
+esp210.menu.eesz.4M3M=4M (3M SPIFFS)
+esp210.menu.eesz.4M3M.build.flash_size=4M
+esp210.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+esp210.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+esp210.menu.eesz.4M3M.build.spiffs_pagesize=256
+esp210.menu.eesz.4M3M.upload.maximum_size=1044464
+esp210.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+esp210.menu.eesz.4M3M.build.spiffs_start=0x100000
+esp210.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+esp210.menu.eesz.4M3M.build.spiffs_blocksize=8192
+esp210.menu.ip.lm2f=v2 Lower Memory
+esp210.menu.ip.lm2f.build.lwip_include=lwip2/include
+esp210.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+esp210.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+esp210.menu.ip.hb2f=v2 Higher Bandwidth
+esp210.menu.ip.hb2f.build.lwip_include=lwip2/include
+esp210.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+esp210.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+esp210.menu.ip.lm2n=v2 Lower Memory (no features)
+esp210.menu.ip.lm2n.build.lwip_include=lwip2/include
+esp210.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+esp210.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+esp210.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+esp210.menu.ip.hb2n.build.lwip_include=lwip2/include
+esp210.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+esp210.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+esp210.menu.ip.lm6f=v2 IPv6 Lower Memory
+esp210.menu.ip.lm6f.build.lwip_include=lwip2/include
+esp210.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+esp210.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+esp210.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+esp210.menu.ip.hb6f.build.lwip_include=lwip2/include
+esp210.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+esp210.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+esp210.menu.ip.hb1=v1.4 Higher Bandwidth
+esp210.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+esp210.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+esp210.menu.ip.src=v1.4 Compile from source
+esp210.menu.ip.src.build.lwip_lib=-llwip_src
+esp210.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+esp210.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+esp210.menu.dbg.Disabled=Disabled
+esp210.menu.dbg.Disabled.build.debug_port=
+esp210.menu.dbg.Serial=Serial
+esp210.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+esp210.menu.dbg.Serial1=Serial1
+esp210.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+esp210.menu.lvl.None____=None
+esp210.menu.lvl.None____.build.debug_level=
+esp210.menu.lvl.SSL=SSL
+esp210.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+esp210.menu.lvl.TLS_MEM=TLS_MEM
+esp210.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+esp210.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+esp210.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+esp210.menu.lvl.HTTP_SERVER=HTTP_SERVER
+esp210.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+esp210.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+esp210.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+esp210.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+esp210.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+esp210.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+esp210.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+esp210.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+esp210.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+esp210.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+esp210.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+esp210.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+esp210.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+esp210.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+esp210.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+esp210.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+esp210.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+esp210.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+esp210.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+esp210.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+esp210.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+esp210.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+esp210.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+esp210.menu.lvl.CORE=CORE
+esp210.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+esp210.menu.lvl.WIFI=WIFI
+esp210.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+esp210.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+esp210.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+esp210.menu.lvl.UPDATER=UPDATER
+esp210.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+esp210.menu.lvl.OTA=OTA
+esp210.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+esp210.menu.lvl.OOM=OOM
+esp210.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+esp210.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+esp210.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+esp210.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+esp210.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+esp210.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+esp210.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+esp210.menu.wipe.none=Only Sketch
+esp210.menu.wipe.none.upload.erase_cmd=
+esp210.menu.wipe.sdk=Sketch + WiFi Settings
+esp210.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+esp210.menu.wipe.all=All Flash Contents
+esp210.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+esp210.menu.baud.57600=57600
+esp210.menu.baud.57600.upload.speed=57600
+esp210.menu.baud.9600=9600
+esp210.menu.baud.9600.upload.speed=9600
+esp210.menu.baud.115200=115200
+esp210.menu.baud.115200.upload.speed=115200
+esp210.menu.baud.230400.linux=230400
+esp210.menu.baud.230400.macosx=230400
+esp210.menu.baud.230400.upload.speed=230400
+esp210.menu.baud.256000.windows=256000
+esp210.menu.baud.256000.upload.speed=256000
+esp210.menu.baud.460800.linux=460800
+esp210.menu.baud.460800.macosx=460800
+esp210.menu.baud.460800.upload.speed=460800
+esp210.menu.baud.512000.windows=512000
+esp210.menu.baud.512000.upload.speed=512000
+esp210.menu.baud.921600=921600
+esp210.menu.baud.921600.upload.speed=921600
+
+##############################################################
+d1_mini.name=LOLIN(WEMOS) D1 R2 & mini
+d1_mini.build.board=ESP8266_WEMOS_D1MINI
+d1_mini.build.variant=d1_mini
+d1_mini.upload.tool=esptool
+d1_mini.upload.maximum_data_size=81920
+d1_mini.upload.wait_for_upload_port=true
+d1_mini.upload.erase_cmd=
+d1_mini.serial.disableDTR=true
+d1_mini.serial.disableRTS=true
+d1_mini.build.mcu=esp8266
+d1_mini.build.core=esp8266
+d1_mini.build.spiffs_pagesize=256
+d1_mini.build.debug_port=
+d1_mini.build.debug_level=
+d1_mini.menu.xtal.80=80 MHz
+d1_mini.menu.xtal.80.build.f_cpu=80000000L
+d1_mini.menu.xtal.160=160 MHz
+d1_mini.menu.xtal.160.build.f_cpu=160000000L
+d1_mini.menu.vt.flash=Flash
+d1_mini.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+d1_mini.menu.vt.heap=Heap
+d1_mini.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+d1_mini.menu.vt.iram=IRAM
+d1_mini.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+d1_mini.menu.exception.enabled=Enabled
+d1_mini.menu.exception.enabled.build.exception_flags=-fexceptions
+d1_mini.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+d1_mini.menu.exception.disabled=Disabled
+d1_mini.menu.exception.disabled.build.exception_flags=-fno-exceptions
+d1_mini.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+d1_mini.upload.resetmethod=nodemcu
+d1_mini.build.flash_mode=dio
+d1_mini.build.flash_freq=40
+d1_mini.menu.eesz.4M=4M (no SPIFFS)
+d1_mini.menu.eesz.4M.build.flash_size=4M
+d1_mini.menu.eesz.4M.build.flash_size_bytes=0x400000
+d1_mini.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+d1_mini.menu.eesz.4M.build.spiffs_pagesize=256
+d1_mini.menu.eesz.4M.upload.maximum_size=1044464
+d1_mini.menu.eesz.4M.build.rfcal_addr=0x3FC000
+d1_mini.menu.eesz.4M1M=4M (1M SPIFFS)
+d1_mini.menu.eesz.4M1M.build.flash_size=4M
+d1_mini.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+d1_mini.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+d1_mini.menu.eesz.4M1M.build.spiffs_pagesize=256
+d1_mini.menu.eesz.4M1M.upload.maximum_size=1044464
+d1_mini.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+d1_mini.menu.eesz.4M1M.build.spiffs_start=0x300000
+d1_mini.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+d1_mini.menu.eesz.4M1M.build.spiffs_blocksize=8192
+d1_mini.menu.eesz.4M2M=4M (2M SPIFFS)
+d1_mini.menu.eesz.4M2M.build.flash_size=4M
+d1_mini.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+d1_mini.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+d1_mini.menu.eesz.4M2M.build.spiffs_pagesize=256
+d1_mini.menu.eesz.4M2M.upload.maximum_size=1044464
+d1_mini.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+d1_mini.menu.eesz.4M2M.build.spiffs_start=0x200000
+d1_mini.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+d1_mini.menu.eesz.4M2M.build.spiffs_blocksize=8192
+d1_mini.menu.eesz.4M3M=4M (3M SPIFFS)
+d1_mini.menu.eesz.4M3M.build.flash_size=4M
+d1_mini.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+d1_mini.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+d1_mini.menu.eesz.4M3M.build.spiffs_pagesize=256
+d1_mini.menu.eesz.4M3M.upload.maximum_size=1044464
+d1_mini.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+d1_mini.menu.eesz.4M3M.build.spiffs_start=0x100000
+d1_mini.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+d1_mini.menu.eesz.4M3M.build.spiffs_blocksize=8192
+d1_mini.menu.ip.lm2f=v2 Lower Memory
+d1_mini.menu.ip.lm2f.build.lwip_include=lwip2/include
+d1_mini.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+d1_mini.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+d1_mini.menu.ip.hb2f=v2 Higher Bandwidth
+d1_mini.menu.ip.hb2f.build.lwip_include=lwip2/include
+d1_mini.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+d1_mini.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+d1_mini.menu.ip.lm2n=v2 Lower Memory (no features)
+d1_mini.menu.ip.lm2n.build.lwip_include=lwip2/include
+d1_mini.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+d1_mini.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+d1_mini.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+d1_mini.menu.ip.hb2n.build.lwip_include=lwip2/include
+d1_mini.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+d1_mini.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+d1_mini.menu.ip.lm6f=v2 IPv6 Lower Memory
+d1_mini.menu.ip.lm6f.build.lwip_include=lwip2/include
+d1_mini.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+d1_mini.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+d1_mini.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+d1_mini.menu.ip.hb6f.build.lwip_include=lwip2/include
+d1_mini.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+d1_mini.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+d1_mini.menu.ip.hb1=v1.4 Higher Bandwidth
+d1_mini.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+d1_mini.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+d1_mini.menu.ip.src=v1.4 Compile from source
+d1_mini.menu.ip.src.build.lwip_lib=-llwip_src
+d1_mini.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+d1_mini.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+d1_mini.menu.dbg.Disabled=Disabled
+d1_mini.menu.dbg.Disabled.build.debug_port=
+d1_mini.menu.dbg.Serial=Serial
+d1_mini.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+d1_mini.menu.dbg.Serial1=Serial1
+d1_mini.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+d1_mini.menu.lvl.None____=None
+d1_mini.menu.lvl.None____.build.debug_level=
+d1_mini.menu.lvl.SSL=SSL
+d1_mini.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+d1_mini.menu.lvl.TLS_MEM=TLS_MEM
+d1_mini.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+d1_mini.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+d1_mini.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+d1_mini.menu.lvl.HTTP_SERVER=HTTP_SERVER
+d1_mini.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+d1_mini.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+d1_mini.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+d1_mini.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+d1_mini.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+d1_mini.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+d1_mini.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+d1_mini.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+d1_mini.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+d1_mini.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+d1_mini.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+d1_mini.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+d1_mini.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+d1_mini.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+d1_mini.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+d1_mini.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+d1_mini.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+d1_mini.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+d1_mini.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+d1_mini.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini.menu.lvl.CORE=CORE
+d1_mini.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+d1_mini.menu.lvl.WIFI=WIFI
+d1_mini.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+d1_mini.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+d1_mini.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+d1_mini.menu.lvl.UPDATER=UPDATER
+d1_mini.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+d1_mini.menu.lvl.OTA=OTA
+d1_mini.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+d1_mini.menu.lvl.OOM=OOM
+d1_mini.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+d1_mini.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+d1_mini.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+d1_mini.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+d1_mini.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+d1_mini.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+d1_mini.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+d1_mini.menu.wipe.none=Only Sketch
+d1_mini.menu.wipe.none.upload.erase_cmd=
+d1_mini.menu.wipe.sdk=Sketch + WiFi Settings
+d1_mini.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+d1_mini.menu.wipe.all=All Flash Contents
+d1_mini.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+d1_mini.menu.baud.921600=921600
+d1_mini.menu.baud.921600.upload.speed=921600
+d1_mini.menu.baud.9600=9600
+d1_mini.menu.baud.9600.upload.speed=9600
+d1_mini.menu.baud.57600=57600
+d1_mini.menu.baud.57600.upload.speed=57600
+d1_mini.menu.baud.115200=115200
+d1_mini.menu.baud.115200.upload.speed=115200
+d1_mini.menu.baud.230400.linux=230400
+d1_mini.menu.baud.230400.macosx=230400
+d1_mini.menu.baud.230400.upload.speed=230400
+d1_mini.menu.baud.256000.windows=256000
+d1_mini.menu.baud.256000.upload.speed=256000
+d1_mini.menu.baud.460800.linux=460800
+d1_mini.menu.baud.460800.macosx=460800
+d1_mini.menu.baud.460800.upload.speed=460800
+d1_mini.menu.baud.512000.windows=512000
+d1_mini.menu.baud.512000.upload.speed=512000
+
+##############################################################
+d1_mini_pro.name=LOLIN(WEMOS) D1 mini Pro
+d1_mini_pro.build.board=ESP8266_WEMOS_D1MINIPRO
+d1_mini_pro.build.variant=d1_mini
+d1_mini_pro.upload.tool=esptool
+d1_mini_pro.upload.maximum_data_size=81920
+d1_mini_pro.upload.wait_for_upload_port=true
+d1_mini_pro.upload.erase_cmd=
+d1_mini_pro.serial.disableDTR=true
+d1_mini_pro.serial.disableRTS=true
+d1_mini_pro.build.mcu=esp8266
+d1_mini_pro.build.core=esp8266
+d1_mini_pro.build.spiffs_pagesize=256
+d1_mini_pro.build.debug_port=
+d1_mini_pro.build.debug_level=
+d1_mini_pro.menu.xtal.80=80 MHz
+d1_mini_pro.menu.xtal.80.build.f_cpu=80000000L
+d1_mini_pro.menu.xtal.160=160 MHz
+d1_mini_pro.menu.xtal.160.build.f_cpu=160000000L
+d1_mini_pro.menu.vt.flash=Flash
+d1_mini_pro.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+d1_mini_pro.menu.vt.heap=Heap
+d1_mini_pro.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+d1_mini_pro.menu.vt.iram=IRAM
+d1_mini_pro.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+d1_mini_pro.menu.exception.enabled=Enabled
+d1_mini_pro.menu.exception.enabled.build.exception_flags=-fexceptions
+d1_mini_pro.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+d1_mini_pro.menu.exception.disabled=Disabled
+d1_mini_pro.menu.exception.disabled.build.exception_flags=-fno-exceptions
+d1_mini_pro.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+d1_mini_pro.upload.resetmethod=nodemcu
+d1_mini_pro.build.flash_mode=dio
+d1_mini_pro.build.flash_freq=40
+d1_mini_pro.menu.eesz.16M14M=16M (14M SPIFFS)
+d1_mini_pro.menu.eesz.16M14M.build.flash_size=16M
+d1_mini_pro.menu.eesz.16M14M.build.flash_size_bytes=0x1000000
+d1_mini_pro.menu.eesz.16M14M.build.flash_ld=eagle.flash.16m14m.ld
+d1_mini_pro.menu.eesz.16M14M.build.spiffs_pagesize=256
+d1_mini_pro.menu.eesz.16M14M.upload.maximum_size=1044464
+d1_mini_pro.menu.eesz.16M14M.build.rfcal_addr=0xFFC000
+d1_mini_pro.menu.eesz.16M14M.build.spiffs_start=0x200000
+d1_mini_pro.menu.eesz.16M14M.build.spiffs_end=0xFFB000
+d1_mini_pro.menu.eesz.16M14M.build.spiffs_blocksize=8192
+d1_mini_pro.menu.eesz.16M15M=16M (15M SPIFFS)
+d1_mini_pro.menu.eesz.16M15M.build.flash_size=16M
+d1_mini_pro.menu.eesz.16M15M.build.flash_size_bytes=0x1000000
+d1_mini_pro.menu.eesz.16M15M.build.flash_ld=eagle.flash.16m15m.ld
+d1_mini_pro.menu.eesz.16M15M.build.spiffs_pagesize=256
+d1_mini_pro.menu.eesz.16M15M.upload.maximum_size=1044464
+d1_mini_pro.menu.eesz.16M15M.build.rfcal_addr=0xFFC000
+d1_mini_pro.menu.eesz.16M15M.build.spiffs_start=0x100000
+d1_mini_pro.menu.eesz.16M15M.build.spiffs_end=0xFFB000
+d1_mini_pro.menu.eesz.16M15M.build.spiffs_blocksize=8192
+d1_mini_pro.menu.ip.lm2f=v2 Lower Memory
+d1_mini_pro.menu.ip.lm2f.build.lwip_include=lwip2/include
+d1_mini_pro.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+d1_mini_pro.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+d1_mini_pro.menu.ip.hb2f=v2 Higher Bandwidth
+d1_mini_pro.menu.ip.hb2f.build.lwip_include=lwip2/include
+d1_mini_pro.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+d1_mini_pro.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+d1_mini_pro.menu.ip.lm2n=v2 Lower Memory (no features)
+d1_mini_pro.menu.ip.lm2n.build.lwip_include=lwip2/include
+d1_mini_pro.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+d1_mini_pro.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+d1_mini_pro.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+d1_mini_pro.menu.ip.hb2n.build.lwip_include=lwip2/include
+d1_mini_pro.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+d1_mini_pro.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+d1_mini_pro.menu.ip.lm6f=v2 IPv6 Lower Memory
+d1_mini_pro.menu.ip.lm6f.build.lwip_include=lwip2/include
+d1_mini_pro.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+d1_mini_pro.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+d1_mini_pro.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+d1_mini_pro.menu.ip.hb6f.build.lwip_include=lwip2/include
+d1_mini_pro.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+d1_mini_pro.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+d1_mini_pro.menu.ip.hb1=v1.4 Higher Bandwidth
+d1_mini_pro.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+d1_mini_pro.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+d1_mini_pro.menu.ip.src=v1.4 Compile from source
+d1_mini_pro.menu.ip.src.build.lwip_lib=-llwip_src
+d1_mini_pro.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+d1_mini_pro.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+d1_mini_pro.menu.dbg.Disabled=Disabled
+d1_mini_pro.menu.dbg.Disabled.build.debug_port=
+d1_mini_pro.menu.dbg.Serial=Serial
+d1_mini_pro.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+d1_mini_pro.menu.dbg.Serial1=Serial1
+d1_mini_pro.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+d1_mini_pro.menu.lvl.None____=None
+d1_mini_pro.menu.lvl.None____.build.debug_level=
+d1_mini_pro.menu.lvl.SSL=SSL
+d1_mini_pro.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+d1_mini_pro.menu.lvl.TLS_MEM=TLS_MEM
+d1_mini_pro.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+d1_mini_pro.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+d1_mini_pro.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+d1_mini_pro.menu.lvl.HTTP_SERVER=HTTP_SERVER
+d1_mini_pro.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+d1_mini_pro.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+d1_mini_pro.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+d1_mini_pro.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+d1_mini_pro.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+d1_mini_pro.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+d1_mini_pro.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+d1_mini_pro.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+d1_mini_pro.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+d1_mini_pro.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+d1_mini_pro.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+d1_mini_pro.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+d1_mini_pro.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+d1_mini_pro.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+d1_mini_pro.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini_pro.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+d1_mini_pro.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini_pro.menu.lvl.CORE=CORE
+d1_mini_pro.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+d1_mini_pro.menu.lvl.WIFI=WIFI
+d1_mini_pro.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+d1_mini_pro.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+d1_mini_pro.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+d1_mini_pro.menu.lvl.UPDATER=UPDATER
+d1_mini_pro.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+d1_mini_pro.menu.lvl.OTA=OTA
+d1_mini_pro.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+d1_mini_pro.menu.lvl.OOM=OOM
+d1_mini_pro.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+d1_mini_pro.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+d1_mini_pro.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+d1_mini_pro.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+d1_mini_pro.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+d1_mini_pro.menu.wipe.none=Only Sketch
+d1_mini_pro.menu.wipe.none.upload.erase_cmd=
+d1_mini_pro.menu.wipe.sdk=Sketch + WiFi Settings
+d1_mini_pro.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+d1_mini_pro.menu.wipe.all=All Flash Contents
+d1_mini_pro.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+d1_mini_pro.menu.baud.921600=921600
+d1_mini_pro.menu.baud.921600.upload.speed=921600
+d1_mini_pro.menu.baud.9600=9600
+d1_mini_pro.menu.baud.9600.upload.speed=9600
+d1_mini_pro.menu.baud.57600=57600
+d1_mini_pro.menu.baud.57600.upload.speed=57600
+d1_mini_pro.menu.baud.115200=115200
+d1_mini_pro.menu.baud.115200.upload.speed=115200
+d1_mini_pro.menu.baud.230400.linux=230400
+d1_mini_pro.menu.baud.230400.macosx=230400
+d1_mini_pro.menu.baud.230400.upload.speed=230400
+d1_mini_pro.menu.baud.256000.windows=256000
+d1_mini_pro.menu.baud.256000.upload.speed=256000
+d1_mini_pro.menu.baud.460800.linux=460800
+d1_mini_pro.menu.baud.460800.macosx=460800
+d1_mini_pro.menu.baud.460800.upload.speed=460800
+d1_mini_pro.menu.baud.512000.windows=512000
+d1_mini_pro.menu.baud.512000.upload.speed=512000
+
+##############################################################
+d1_mini_lite.name=LOLIN(WEMOS) D1 mini Lite
+d1_mini_lite.build.board=ESP8266_WEMOS_D1MINILITE
+d1_mini_lite.build.variant=d1_mini
+d1_mini_lite.upload.tool=esptool
+d1_mini_lite.upload.maximum_data_size=81920
+d1_mini_lite.upload.wait_for_upload_port=true
+d1_mini_lite.upload.erase_cmd=
+d1_mini_lite.serial.disableDTR=true
+d1_mini_lite.serial.disableRTS=true
+d1_mini_lite.build.mcu=esp8266
+d1_mini_lite.build.core=esp8266
+d1_mini_lite.build.spiffs_pagesize=256
+d1_mini_lite.build.debug_port=
+d1_mini_lite.build.debug_level=
+d1_mini_lite.menu.xtal.80=80 MHz
+d1_mini_lite.menu.xtal.80.build.f_cpu=80000000L
+d1_mini_lite.menu.xtal.160=160 MHz
+d1_mini_lite.menu.xtal.160.build.f_cpu=160000000L
+d1_mini_lite.menu.vt.flash=Flash
+d1_mini_lite.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+d1_mini_lite.menu.vt.heap=Heap
+d1_mini_lite.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+d1_mini_lite.menu.vt.iram=IRAM
+d1_mini_lite.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+d1_mini_lite.menu.exception.enabled=Enabled
+d1_mini_lite.menu.exception.enabled.build.exception_flags=-fexceptions
+d1_mini_lite.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+d1_mini_lite.menu.exception.disabled=Disabled
+d1_mini_lite.menu.exception.disabled.build.exception_flags=-fno-exceptions
+d1_mini_lite.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+d1_mini_lite.upload.resetmethod=nodemcu
+d1_mini_lite.build.flash_mode=dout
+d1_mini_lite.build.flash_freq=40
+d1_mini_lite.menu.eesz.1M=1M (no SPIFFS)
+d1_mini_lite.menu.eesz.1M.build.flash_size=1M
+d1_mini_lite.menu.eesz.1M.build.flash_size_bytes=0x100000
+d1_mini_lite.menu.eesz.1M.build.flash_ld=eagle.flash.1m.ld
+d1_mini_lite.menu.eesz.1M.build.spiffs_pagesize=256
+d1_mini_lite.menu.eesz.1M.upload.maximum_size=1023984
+d1_mini_lite.menu.eesz.1M.build.rfcal_addr=0xFC000
+d1_mini_lite.menu.eesz.1M64=1M (64K SPIFFS)
+d1_mini_lite.menu.eesz.1M64.build.flash_size=1M
+d1_mini_lite.menu.eesz.1M64.build.flash_size_bytes=0x100000
+d1_mini_lite.menu.eesz.1M64.build.flash_ld=eagle.flash.1m64.ld
+d1_mini_lite.menu.eesz.1M64.build.spiffs_pagesize=256
+d1_mini_lite.menu.eesz.1M64.upload.maximum_size=958448
+d1_mini_lite.menu.eesz.1M64.build.rfcal_addr=0xFC000
+d1_mini_lite.menu.eesz.1M64.build.spiffs_start=0xEB000
+d1_mini_lite.menu.eesz.1M64.build.spiffs_end=0xFB000
+d1_mini_lite.menu.eesz.1M64.build.spiffs_blocksize=4096
+d1_mini_lite.menu.eesz.1M128=1M (128K SPIFFS)
+d1_mini_lite.menu.eesz.1M128.build.flash_size=1M
+d1_mini_lite.menu.eesz.1M128.build.flash_size_bytes=0x100000
+d1_mini_lite.menu.eesz.1M128.build.flash_ld=eagle.flash.1m128.ld
+d1_mini_lite.menu.eesz.1M128.build.spiffs_pagesize=256
+d1_mini_lite.menu.eesz.1M128.upload.maximum_size=892912
+d1_mini_lite.menu.eesz.1M128.build.rfcal_addr=0xFC000
+d1_mini_lite.menu.eesz.1M128.build.spiffs_start=0xDB000
+d1_mini_lite.menu.eesz.1M128.build.spiffs_end=0xFB000
+d1_mini_lite.menu.eesz.1M128.build.spiffs_blocksize=4096
+d1_mini_lite.menu.eesz.1M144=1M (144K SPIFFS)
+d1_mini_lite.menu.eesz.1M144.build.flash_size=1M
+d1_mini_lite.menu.eesz.1M144.build.flash_size_bytes=0x100000
+d1_mini_lite.menu.eesz.1M144.build.flash_ld=eagle.flash.1m144.ld
+d1_mini_lite.menu.eesz.1M144.build.spiffs_pagesize=256
+d1_mini_lite.menu.eesz.1M144.upload.maximum_size=876528
+d1_mini_lite.menu.eesz.1M144.build.rfcal_addr=0xFC000
+d1_mini_lite.menu.eesz.1M144.build.spiffs_start=0xD7000
+d1_mini_lite.menu.eesz.1M144.build.spiffs_end=0xFB000
+d1_mini_lite.menu.eesz.1M144.build.spiffs_blocksize=4096
+d1_mini_lite.menu.eesz.1M160=1M (160K SPIFFS)
+d1_mini_lite.menu.eesz.1M160.build.flash_size=1M
+d1_mini_lite.menu.eesz.1M160.build.flash_size_bytes=0x100000
+d1_mini_lite.menu.eesz.1M160.build.flash_ld=eagle.flash.1m160.ld
+d1_mini_lite.menu.eesz.1M160.build.spiffs_pagesize=256
+d1_mini_lite.menu.eesz.1M160.upload.maximum_size=860144
+d1_mini_lite.menu.eesz.1M160.build.rfcal_addr=0xFC000
+d1_mini_lite.menu.eesz.1M160.build.spiffs_start=0xD3000
+d1_mini_lite.menu.eesz.1M160.build.spiffs_end=0xFB000
+d1_mini_lite.menu.eesz.1M160.build.spiffs_blocksize=4096
+d1_mini_lite.menu.eesz.1M192=1M (192K SPIFFS)
+d1_mini_lite.menu.eesz.1M192.build.flash_size=1M
+d1_mini_lite.menu.eesz.1M192.build.flash_size_bytes=0x100000
+d1_mini_lite.menu.eesz.1M192.build.flash_ld=eagle.flash.1m192.ld
+d1_mini_lite.menu.eesz.1M192.build.spiffs_pagesize=256
+d1_mini_lite.menu.eesz.1M192.upload.maximum_size=827376
+d1_mini_lite.menu.eesz.1M192.build.rfcal_addr=0xFC000
+d1_mini_lite.menu.eesz.1M192.build.spiffs_start=0xCB000
+d1_mini_lite.menu.eesz.1M192.build.spiffs_end=0xFB000
+d1_mini_lite.menu.eesz.1M192.build.spiffs_blocksize=4096
+d1_mini_lite.menu.eesz.1M256=1M (256K SPIFFS)
+d1_mini_lite.menu.eesz.1M256.build.flash_size=1M
+d1_mini_lite.menu.eesz.1M256.build.flash_size_bytes=0x100000
+d1_mini_lite.menu.eesz.1M256.build.flash_ld=eagle.flash.1m256.ld
+d1_mini_lite.menu.eesz.1M256.build.spiffs_pagesize=256
+d1_mini_lite.menu.eesz.1M256.upload.maximum_size=761840
+d1_mini_lite.menu.eesz.1M256.build.rfcal_addr=0xFC000
+d1_mini_lite.menu.eesz.1M256.build.spiffs_start=0xBB000
+d1_mini_lite.menu.eesz.1M256.build.spiffs_end=0xFB000
+d1_mini_lite.menu.eesz.1M256.build.spiffs_blocksize=4096
+d1_mini_lite.menu.eesz.1M512=1M (512K SPIFFS)
+d1_mini_lite.menu.eesz.1M512.build.flash_size=1M
+d1_mini_lite.menu.eesz.1M512.build.flash_size_bytes=0x100000
+d1_mini_lite.menu.eesz.1M512.build.flash_ld=eagle.flash.1m512.ld
+d1_mini_lite.menu.eesz.1M512.build.spiffs_pagesize=256
+d1_mini_lite.menu.eesz.1M512.upload.maximum_size=499696
+d1_mini_lite.menu.eesz.1M512.build.rfcal_addr=0xFC000
+d1_mini_lite.menu.eesz.1M512.build.spiffs_start=0x7B000
+d1_mini_lite.menu.eesz.1M512.build.spiffs_end=0xFB000
+d1_mini_lite.menu.eesz.1M512.build.spiffs_blocksize=4096
+d1_mini_lite.menu.ip.lm2f=v2 Lower Memory
+d1_mini_lite.menu.ip.lm2f.build.lwip_include=lwip2/include
+d1_mini_lite.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+d1_mini_lite.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+d1_mini_lite.menu.ip.hb2f=v2 Higher Bandwidth
+d1_mini_lite.menu.ip.hb2f.build.lwip_include=lwip2/include
+d1_mini_lite.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+d1_mini_lite.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+d1_mini_lite.menu.ip.lm2n=v2 Lower Memory (no features)
+d1_mini_lite.menu.ip.lm2n.build.lwip_include=lwip2/include
+d1_mini_lite.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+d1_mini_lite.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+d1_mini_lite.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+d1_mini_lite.menu.ip.hb2n.build.lwip_include=lwip2/include
+d1_mini_lite.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+d1_mini_lite.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+d1_mini_lite.menu.ip.lm6f=v2 IPv6 Lower Memory
+d1_mini_lite.menu.ip.lm6f.build.lwip_include=lwip2/include
+d1_mini_lite.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+d1_mini_lite.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+d1_mini_lite.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+d1_mini_lite.menu.ip.hb6f.build.lwip_include=lwip2/include
+d1_mini_lite.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+d1_mini_lite.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+d1_mini_lite.menu.ip.hb1=v1.4 Higher Bandwidth
+d1_mini_lite.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+d1_mini_lite.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+d1_mini_lite.menu.ip.src=v1.4 Compile from source
+d1_mini_lite.menu.ip.src.build.lwip_lib=-llwip_src
+d1_mini_lite.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+d1_mini_lite.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+d1_mini_lite.menu.dbg.Disabled=Disabled
+d1_mini_lite.menu.dbg.Disabled.build.debug_port=
+d1_mini_lite.menu.dbg.Serial=Serial
+d1_mini_lite.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+d1_mini_lite.menu.dbg.Serial1=Serial1
+d1_mini_lite.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+d1_mini_lite.menu.lvl.None____=None
+d1_mini_lite.menu.lvl.None____.build.debug_level=
+d1_mini_lite.menu.lvl.SSL=SSL
+d1_mini_lite.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+d1_mini_lite.menu.lvl.TLS_MEM=TLS_MEM
+d1_mini_lite.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+d1_mini_lite.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+d1_mini_lite.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+d1_mini_lite.menu.lvl.HTTP_SERVER=HTTP_SERVER
+d1_mini_lite.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+d1_mini_lite.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+d1_mini_lite.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+d1_mini_lite.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+d1_mini_lite.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+d1_mini_lite.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+d1_mini_lite.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+d1_mini_lite.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+d1_mini_lite.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+d1_mini_lite.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+d1_mini_lite.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+d1_mini_lite.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+d1_mini_lite.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+d1_mini_lite.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+d1_mini_lite.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini_lite.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+d1_mini_lite.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini_lite.menu.lvl.CORE=CORE
+d1_mini_lite.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+d1_mini_lite.menu.lvl.WIFI=WIFI
+d1_mini_lite.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+d1_mini_lite.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+d1_mini_lite.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+d1_mini_lite.menu.lvl.UPDATER=UPDATER
+d1_mini_lite.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+d1_mini_lite.menu.lvl.OTA=OTA
+d1_mini_lite.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+d1_mini_lite.menu.lvl.OOM=OOM
+d1_mini_lite.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+d1_mini_lite.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+d1_mini_lite.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+d1_mini_lite.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+d1_mini_lite.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+d1_mini_lite.menu.wipe.none=Only Sketch
+d1_mini_lite.menu.wipe.none.upload.erase_cmd=
+d1_mini_lite.menu.wipe.sdk=Sketch + WiFi Settings
+d1_mini_lite.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+d1_mini_lite.menu.wipe.all=All Flash Contents
+d1_mini_lite.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+d1_mini_lite.menu.baud.921600=921600
+d1_mini_lite.menu.baud.921600.upload.speed=921600
+d1_mini_lite.menu.baud.9600=9600
+d1_mini_lite.menu.baud.9600.upload.speed=9600
+d1_mini_lite.menu.baud.57600=57600
+d1_mini_lite.menu.baud.57600.upload.speed=57600
+d1_mini_lite.menu.baud.115200=115200
+d1_mini_lite.menu.baud.115200.upload.speed=115200
+d1_mini_lite.menu.baud.230400.linux=230400
+d1_mini_lite.menu.baud.230400.macosx=230400
+d1_mini_lite.menu.baud.230400.upload.speed=230400
+d1_mini_lite.menu.baud.256000.windows=256000
+d1_mini_lite.menu.baud.256000.upload.speed=256000
+d1_mini_lite.menu.baud.460800.linux=460800
+d1_mini_lite.menu.baud.460800.macosx=460800
+d1_mini_lite.menu.baud.460800.upload.speed=460800
+d1_mini_lite.menu.baud.512000.windows=512000
+d1_mini_lite.menu.baud.512000.upload.speed=512000
+
+##############################################################
+d1.name=WeMos D1 R1
+d1.build.board=ESP8266_WEMOS_D1R1
+d1.build.variant=d1
+d1.upload.tool=esptool
+d1.upload.maximum_data_size=81920
+d1.upload.wait_for_upload_port=true
+d1.upload.erase_cmd=
+d1.serial.disableDTR=true
+d1.serial.disableRTS=true
+d1.build.mcu=esp8266
+d1.build.core=esp8266
+d1.build.spiffs_pagesize=256
+d1.build.debug_port=
+d1.build.debug_level=
+d1.menu.xtal.80=80 MHz
+d1.menu.xtal.80.build.f_cpu=80000000L
+d1.menu.xtal.160=160 MHz
+d1.menu.xtal.160.build.f_cpu=160000000L
+d1.menu.vt.flash=Flash
+d1.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+d1.menu.vt.heap=Heap
+d1.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+d1.menu.vt.iram=IRAM
+d1.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+d1.menu.exception.enabled=Enabled
+d1.menu.exception.enabled.build.exception_flags=-fexceptions
+d1.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+d1.menu.exception.disabled=Disabled
+d1.menu.exception.disabled.build.exception_flags=-fno-exceptions
+d1.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+d1.upload.resetmethod=nodemcu
+d1.build.flash_mode=dio
+d1.build.flash_freq=40
+d1.menu.eesz.4M=4M (no SPIFFS)
+d1.menu.eesz.4M.build.flash_size=4M
+d1.menu.eesz.4M.build.flash_size_bytes=0x400000
+d1.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+d1.menu.eesz.4M.build.spiffs_pagesize=256
+d1.menu.eesz.4M.upload.maximum_size=1044464
+d1.menu.eesz.4M.build.rfcal_addr=0x3FC000
+d1.menu.eesz.4M1M=4M (1M SPIFFS)
+d1.menu.eesz.4M1M.build.flash_size=4M
+d1.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+d1.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+d1.menu.eesz.4M1M.build.spiffs_pagesize=256
+d1.menu.eesz.4M1M.upload.maximum_size=1044464
+d1.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+d1.menu.eesz.4M1M.build.spiffs_start=0x300000
+d1.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+d1.menu.eesz.4M1M.build.spiffs_blocksize=8192
+d1.menu.eesz.4M2M=4M (2M SPIFFS)
+d1.menu.eesz.4M2M.build.flash_size=4M
+d1.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+d1.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+d1.menu.eesz.4M2M.build.spiffs_pagesize=256
+d1.menu.eesz.4M2M.upload.maximum_size=1044464
+d1.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+d1.menu.eesz.4M2M.build.spiffs_start=0x200000
+d1.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+d1.menu.eesz.4M2M.build.spiffs_blocksize=8192
+d1.menu.eesz.4M3M=4M (3M SPIFFS)
+d1.menu.eesz.4M3M.build.flash_size=4M
+d1.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+d1.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+d1.menu.eesz.4M3M.build.spiffs_pagesize=256
+d1.menu.eesz.4M3M.upload.maximum_size=1044464
+d1.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+d1.menu.eesz.4M3M.build.spiffs_start=0x100000
+d1.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+d1.menu.eesz.4M3M.build.spiffs_blocksize=8192
+d1.menu.ip.lm2f=v2 Lower Memory
+d1.menu.ip.lm2f.build.lwip_include=lwip2/include
+d1.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+d1.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+d1.menu.ip.hb2f=v2 Higher Bandwidth
+d1.menu.ip.hb2f.build.lwip_include=lwip2/include
+d1.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+d1.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+d1.menu.ip.lm2n=v2 Lower Memory (no features)
+d1.menu.ip.lm2n.build.lwip_include=lwip2/include
+d1.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+d1.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+d1.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+d1.menu.ip.hb2n.build.lwip_include=lwip2/include
+d1.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+d1.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+d1.menu.ip.lm6f=v2 IPv6 Lower Memory
+d1.menu.ip.lm6f.build.lwip_include=lwip2/include
+d1.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+d1.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+d1.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+d1.menu.ip.hb6f.build.lwip_include=lwip2/include
+d1.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+d1.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+d1.menu.ip.hb1=v1.4 Higher Bandwidth
+d1.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+d1.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+d1.menu.ip.src=v1.4 Compile from source
+d1.menu.ip.src.build.lwip_lib=-llwip_src
+d1.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+d1.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+d1.menu.dbg.Disabled=Disabled
+d1.menu.dbg.Disabled.build.debug_port=
+d1.menu.dbg.Serial=Serial
+d1.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+d1.menu.dbg.Serial1=Serial1
+d1.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+d1.menu.lvl.None____=None
+d1.menu.lvl.None____.build.debug_level=
+d1.menu.lvl.SSL=SSL
+d1.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+d1.menu.lvl.TLS_MEM=TLS_MEM
+d1.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+d1.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+d1.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+d1.menu.lvl.HTTP_SERVER=HTTP_SERVER
+d1.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+d1.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+d1.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+d1.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+d1.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+d1.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+d1.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+d1.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+d1.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+d1.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+d1.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+d1.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+d1.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+d1.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+d1.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+d1.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+d1.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+d1.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+d1.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+d1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1.menu.lvl.CORE=CORE
+d1.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+d1.menu.lvl.WIFI=WIFI
+d1.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+d1.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+d1.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+d1.menu.lvl.UPDATER=UPDATER
+d1.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+d1.menu.lvl.OTA=OTA
+d1.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+d1.menu.lvl.OOM=OOM
+d1.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+d1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+d1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+d1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+d1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+d1.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+d1.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+d1.menu.wipe.none=Only Sketch
+d1.menu.wipe.none.upload.erase_cmd=
+d1.menu.wipe.sdk=Sketch + WiFi Settings
+d1.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+d1.menu.wipe.all=All Flash Contents
+d1.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+d1.menu.baud.921600=921600
+d1.menu.baud.921600.upload.speed=921600
+d1.menu.baud.9600=9600
+d1.menu.baud.9600.upload.speed=9600
+d1.menu.baud.57600=57600
+d1.menu.baud.57600.upload.speed=57600
+d1.menu.baud.115200=115200
+d1.menu.baud.115200.upload.speed=115200
+d1.menu.baud.230400.linux=230400
+d1.menu.baud.230400.macosx=230400
+d1.menu.baud.230400.upload.speed=230400
+d1.menu.baud.256000.windows=256000
+d1.menu.baud.256000.upload.speed=256000
+d1.menu.baud.460800.linux=460800
+d1.menu.baud.460800.macosx=460800
+d1.menu.baud.460800.upload.speed=460800
+d1.menu.baud.512000.windows=512000
+d1.menu.baud.512000.upload.speed=512000
+
+##############################################################
+espino.name=ESPino (ESP-12 Module)
+espino.build.board=ESP8266_ESP12
+espino.build.variant=espino
+espino.upload.tool=esptool
+espino.upload.maximum_data_size=81920
+espino.upload.wait_for_upload_port=true
+espino.upload.erase_cmd=
+espino.serial.disableDTR=true
+espino.serial.disableRTS=true
+espino.build.mcu=esp8266
+espino.build.core=esp8266
+espino.build.spiffs_pagesize=256
+espino.build.debug_port=
+espino.build.debug_level=
+espino.menu.xtal.80=80 MHz
+espino.menu.xtal.80.build.f_cpu=80000000L
+espino.menu.xtal.160=160 MHz
+espino.menu.xtal.160.build.f_cpu=160000000L
+espino.menu.vt.flash=Flash
+espino.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+espino.menu.vt.heap=Heap
+espino.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+espino.menu.vt.iram=IRAM
+espino.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+espino.menu.exception.enabled=Enabled
+espino.menu.exception.enabled.build.exception_flags=-fexceptions
+espino.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+espino.menu.exception.disabled=Disabled
+espino.menu.exception.disabled.build.exception_flags=-fno-exceptions
+espino.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+espino.menu.ResetMethod.ck=ck
+espino.menu.ResetMethod.ck.upload.resetmethod=ck
+espino.menu.ResetMethod.nodemcu=nodemcu
+espino.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
+espino.build.flash_mode=qio
+espino.build.flash_freq=40
+espino.menu.eesz.4M=4M (no SPIFFS)
+espino.menu.eesz.4M.build.flash_size=4M
+espino.menu.eesz.4M.build.flash_size_bytes=0x400000
+espino.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+espino.menu.eesz.4M.build.spiffs_pagesize=256
+espino.menu.eesz.4M.upload.maximum_size=1044464
+espino.menu.eesz.4M.build.rfcal_addr=0x3FC000
+espino.menu.eesz.4M1M=4M (1M SPIFFS)
+espino.menu.eesz.4M1M.build.flash_size=4M
+espino.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+espino.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+espino.menu.eesz.4M1M.build.spiffs_pagesize=256
+espino.menu.eesz.4M1M.upload.maximum_size=1044464
+espino.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+espino.menu.eesz.4M1M.build.spiffs_start=0x300000
+espino.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+espino.menu.eesz.4M1M.build.spiffs_blocksize=8192
+espino.menu.eesz.4M2M=4M (2M SPIFFS)
+espino.menu.eesz.4M2M.build.flash_size=4M
+espino.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+espino.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+espino.menu.eesz.4M2M.build.spiffs_pagesize=256
+espino.menu.eesz.4M2M.upload.maximum_size=1044464
+espino.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+espino.menu.eesz.4M2M.build.spiffs_start=0x200000
+espino.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+espino.menu.eesz.4M2M.build.spiffs_blocksize=8192
+espino.menu.eesz.4M3M=4M (3M SPIFFS)
+espino.menu.eesz.4M3M.build.flash_size=4M
+espino.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+espino.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+espino.menu.eesz.4M3M.build.spiffs_pagesize=256
+espino.menu.eesz.4M3M.upload.maximum_size=1044464
+espino.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+espino.menu.eesz.4M3M.build.spiffs_start=0x100000
+espino.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+espino.menu.eesz.4M3M.build.spiffs_blocksize=8192
+espino.menu.ip.lm2f=v2 Lower Memory
+espino.menu.ip.lm2f.build.lwip_include=lwip2/include
+espino.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+espino.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espino.menu.ip.hb2f=v2 Higher Bandwidth
+espino.menu.ip.hb2f.build.lwip_include=lwip2/include
+espino.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+espino.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espino.menu.ip.lm2n=v2 Lower Memory (no features)
+espino.menu.ip.lm2n.build.lwip_include=lwip2/include
+espino.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+espino.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espino.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+espino.menu.ip.hb2n.build.lwip_include=lwip2/include
+espino.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+espino.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espino.menu.ip.lm6f=v2 IPv6 Lower Memory
+espino.menu.ip.lm6f.build.lwip_include=lwip2/include
+espino.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+espino.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espino.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+espino.menu.ip.hb6f.build.lwip_include=lwip2/include
+espino.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+espino.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espino.menu.ip.hb1=v1.4 Higher Bandwidth
+espino.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+espino.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+espino.menu.ip.src=v1.4 Compile from source
+espino.menu.ip.src.build.lwip_lib=-llwip_src
+espino.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+espino.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+espino.menu.dbg.Disabled=Disabled
+espino.menu.dbg.Disabled.build.debug_port=
+espino.menu.dbg.Serial=Serial
+espino.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+espino.menu.dbg.Serial1=Serial1
+espino.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+espino.menu.lvl.None____=None
+espino.menu.lvl.None____.build.debug_level=
+espino.menu.lvl.SSL=SSL
+espino.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+espino.menu.lvl.TLS_MEM=TLS_MEM
+espino.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+espino.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+espino.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+espino.menu.lvl.HTTP_SERVER=HTTP_SERVER
+espino.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+espino.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+espino.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+espino.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+espino.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+espino.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+espino.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+espino.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+espino.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espino.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+espino.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espino.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+espino.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espino.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+espino.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espino.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+espino.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espino.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+espino.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espino.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espino.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espino.menu.lvl.CORE=CORE
+espino.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+espino.menu.lvl.WIFI=WIFI
+espino.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+espino.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+espino.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+espino.menu.lvl.UPDATER=UPDATER
+espino.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+espino.menu.lvl.OTA=OTA
+espino.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+espino.menu.lvl.OOM=OOM
+espino.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+espino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+espino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+espino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+espino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+espino.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+espino.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+espino.menu.wipe.none=Only Sketch
+espino.menu.wipe.none.upload.erase_cmd=
+espino.menu.wipe.sdk=Sketch + WiFi Settings
+espino.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+espino.menu.wipe.all=All Flash Contents
+espino.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+espino.menu.baud.115200=115200
+espino.menu.baud.115200.upload.speed=115200
+espino.menu.baud.9600=9600
+espino.menu.baud.9600.upload.speed=9600
+espino.menu.baud.57600=57600
+espino.menu.baud.57600.upload.speed=57600
+espino.menu.baud.230400.linux=230400
+espino.menu.baud.230400.macosx=230400
+espino.menu.baud.230400.upload.speed=230400
+espino.menu.baud.256000.windows=256000
+espino.menu.baud.256000.upload.speed=256000
+espino.menu.baud.460800.linux=460800
+espino.menu.baud.460800.macosx=460800
+espino.menu.baud.460800.upload.speed=460800
+espino.menu.baud.512000.windows=512000
+espino.menu.baud.512000.upload.speed=512000
+espino.menu.baud.921600=921600
+espino.menu.baud.921600.upload.speed=921600
+
+##############################################################
+espinotee.name=ThaiEasyElec's ESPino
+espinotee.build.board=ESP8266_ESP13
+espinotee.build.variant=espinotee
+espinotee.upload.tool=esptool
+espinotee.upload.maximum_data_size=81920
+espinotee.upload.wait_for_upload_port=true
+espinotee.upload.erase_cmd=
+espinotee.serial.disableDTR=true
+espinotee.serial.disableRTS=true
+espinotee.build.mcu=esp8266
+espinotee.build.core=esp8266
+espinotee.build.spiffs_pagesize=256
+espinotee.build.debug_port=
+espinotee.build.debug_level=
+espinotee.menu.xtal.80=80 MHz
+espinotee.menu.xtal.80.build.f_cpu=80000000L
+espinotee.menu.xtal.160=160 MHz
+espinotee.menu.xtal.160.build.f_cpu=160000000L
+espinotee.menu.vt.flash=Flash
+espinotee.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+espinotee.menu.vt.heap=Heap
+espinotee.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+espinotee.menu.vt.iram=IRAM
+espinotee.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+espinotee.menu.exception.enabled=Enabled
+espinotee.menu.exception.enabled.build.exception_flags=-fexceptions
+espinotee.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+espinotee.menu.exception.disabled=Disabled
+espinotee.menu.exception.disabled.build.exception_flags=-fno-exceptions
+espinotee.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+espinotee.upload.resetmethod=nodemcu
+espinotee.build.flash_mode=qio
+espinotee.build.flash_freq=40
+espinotee.menu.eesz.4M=4M (no SPIFFS)
+espinotee.menu.eesz.4M.build.flash_size=4M
+espinotee.menu.eesz.4M.build.flash_size_bytes=0x400000
+espinotee.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+espinotee.menu.eesz.4M.build.spiffs_pagesize=256
+espinotee.menu.eesz.4M.upload.maximum_size=1044464
+espinotee.menu.eesz.4M.build.rfcal_addr=0x3FC000
+espinotee.menu.eesz.4M1M=4M (1M SPIFFS)
+espinotee.menu.eesz.4M1M.build.flash_size=4M
+espinotee.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+espinotee.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+espinotee.menu.eesz.4M1M.build.spiffs_pagesize=256
+espinotee.menu.eesz.4M1M.upload.maximum_size=1044464
+espinotee.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+espinotee.menu.eesz.4M1M.build.spiffs_start=0x300000
+espinotee.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+espinotee.menu.eesz.4M1M.build.spiffs_blocksize=8192
+espinotee.menu.eesz.4M2M=4M (2M SPIFFS)
+espinotee.menu.eesz.4M2M.build.flash_size=4M
+espinotee.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+espinotee.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+espinotee.menu.eesz.4M2M.build.spiffs_pagesize=256
+espinotee.menu.eesz.4M2M.upload.maximum_size=1044464
+espinotee.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+espinotee.menu.eesz.4M2M.build.spiffs_start=0x200000
+espinotee.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+espinotee.menu.eesz.4M2M.build.spiffs_blocksize=8192
+espinotee.menu.eesz.4M3M=4M (3M SPIFFS)
+espinotee.menu.eesz.4M3M.build.flash_size=4M
+espinotee.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+espinotee.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+espinotee.menu.eesz.4M3M.build.spiffs_pagesize=256
+espinotee.menu.eesz.4M3M.upload.maximum_size=1044464
+espinotee.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+espinotee.menu.eesz.4M3M.build.spiffs_start=0x100000
+espinotee.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+espinotee.menu.eesz.4M3M.build.spiffs_blocksize=8192
+espinotee.menu.ip.lm2f=v2 Lower Memory
+espinotee.menu.ip.lm2f.build.lwip_include=lwip2/include
+espinotee.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+espinotee.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espinotee.menu.ip.hb2f=v2 Higher Bandwidth
+espinotee.menu.ip.hb2f.build.lwip_include=lwip2/include
+espinotee.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+espinotee.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espinotee.menu.ip.lm2n=v2 Lower Memory (no features)
+espinotee.menu.ip.lm2n.build.lwip_include=lwip2/include
+espinotee.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+espinotee.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espinotee.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+espinotee.menu.ip.hb2n.build.lwip_include=lwip2/include
+espinotee.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+espinotee.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espinotee.menu.ip.lm6f=v2 IPv6 Lower Memory
+espinotee.menu.ip.lm6f.build.lwip_include=lwip2/include
+espinotee.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+espinotee.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espinotee.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+espinotee.menu.ip.hb6f.build.lwip_include=lwip2/include
+espinotee.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+espinotee.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espinotee.menu.ip.hb1=v1.4 Higher Bandwidth
+espinotee.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+espinotee.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+espinotee.menu.ip.src=v1.4 Compile from source
+espinotee.menu.ip.src.build.lwip_lib=-llwip_src
+espinotee.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+espinotee.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+espinotee.menu.dbg.Disabled=Disabled
+espinotee.menu.dbg.Disabled.build.debug_port=
+espinotee.menu.dbg.Serial=Serial
+espinotee.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+espinotee.menu.dbg.Serial1=Serial1
+espinotee.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+espinotee.menu.lvl.None____=None
+espinotee.menu.lvl.None____.build.debug_level=
+espinotee.menu.lvl.SSL=SSL
+espinotee.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+espinotee.menu.lvl.TLS_MEM=TLS_MEM
+espinotee.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+espinotee.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+espinotee.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+espinotee.menu.lvl.HTTP_SERVER=HTTP_SERVER
+espinotee.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+espinotee.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+espinotee.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+espinotee.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+espinotee.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+espinotee.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+espinotee.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+espinotee.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+espinotee.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espinotee.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+espinotee.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espinotee.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+espinotee.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espinotee.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+espinotee.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espinotee.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+espinotee.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espinotee.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+espinotee.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espinotee.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espinotee.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espinotee.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espinotee.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espinotee.menu.lvl.CORE=CORE
+espinotee.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+espinotee.menu.lvl.WIFI=WIFI
+espinotee.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+espinotee.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+espinotee.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+espinotee.menu.lvl.UPDATER=UPDATER
+espinotee.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+espinotee.menu.lvl.OTA=OTA
+espinotee.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+espinotee.menu.lvl.OOM=OOM
+espinotee.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+espinotee.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+espinotee.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+espinotee.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+espinotee.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+espinotee.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+espinotee.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+espinotee.menu.wipe.none=Only Sketch
+espinotee.menu.wipe.none.upload.erase_cmd=
+espinotee.menu.wipe.sdk=Sketch + WiFi Settings
+espinotee.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+espinotee.menu.wipe.all=All Flash Contents
+espinotee.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+espinotee.menu.baud.115200=115200
+espinotee.menu.baud.115200.upload.speed=115200
+espinotee.menu.baud.9600=9600
+espinotee.menu.baud.9600.upload.speed=9600
+espinotee.menu.baud.57600=57600
+espinotee.menu.baud.57600.upload.speed=57600
+espinotee.menu.baud.230400.linux=230400
+espinotee.menu.baud.230400.macosx=230400
+espinotee.menu.baud.230400.upload.speed=230400
+espinotee.menu.baud.256000.windows=256000
+espinotee.menu.baud.256000.upload.speed=256000
+espinotee.menu.baud.460800.linux=460800
+espinotee.menu.baud.460800.macosx=460800
+espinotee.menu.baud.460800.upload.speed=460800
+espinotee.menu.baud.512000.windows=512000
+espinotee.menu.baud.512000.upload.speed=512000
+espinotee.menu.baud.921600=921600
+espinotee.menu.baud.921600.upload.speed=921600
+
+##############################################################
+wifinfo.name=WifInfo
+wifinfo.menu.ESPModule.ESP12.build.board=ESP8266_ESP12
+wifinfo.menu.ESPModule.ESP12.upload.maximum_size=1044464
+wifinfo.menu.ESPModule.ESP12.build.spiffs_pagesize=256
+wifinfo.menu.ESPModule.ESP12.build.flash_ld=eagle.flash.4m1m.ld
+wifinfo.menu.ESPModule.ESP07192.build.spiffs_blocksize=4096
+wifinfo.menu.ESPModule.ESP07192.build.spiffs_end=0xFB000
+wifinfo.menu.ESPModule.ESP12=ESP12 (4M/1M SPIFFS)
+wifinfo.menu.ESPModule.ESP12.build.spiffs_start=0x300000
+wifinfo.menu.ESPModule.ESP12.build.spiffs_end=0x3FB000
+wifinfo.menu.ESPModule.ESP07192.build.spiffs_start=0xCB000
+wifinfo.menu.ESPModule.ESP07192.build.board=ESP8266_ESP07
+wifinfo.menu.ESPModule.ESP12.build.spiffs_blocksize=8192
+wifinfo.menu.ESPModule.ESP12.build.flash_size=4M
+wifinfo.build.board=WIFINFO
+wifinfo.build.variant=wifinfo
+wifinfo.menu.ESPModule.ESP07192.build.flash_ld=eagle.flash.1m192.ld
+wifinfo.menu.ESPModule.ESP07192.build.flash_size=1M
+wifinfo.menu.ESPModule.ESP07192=ESP07 (1M/192K SPIFFS)
+wifinfo.menu.ESPModule.ESP07192.upload.maximum_size=827376
+wifinfo.upload.tool=esptool
+wifinfo.upload.maximum_data_size=81920
+wifinfo.upload.wait_for_upload_port=true
+wifinfo.upload.erase_cmd=
+wifinfo.serial.disableDTR=true
+wifinfo.serial.disableRTS=true
+wifinfo.build.mcu=esp8266
+wifinfo.build.core=esp8266
+wifinfo.build.spiffs_pagesize=256
+wifinfo.build.debug_port=
+wifinfo.build.debug_level=
+wifinfo.menu.xtal.80=80 MHz
+wifinfo.menu.xtal.80.build.f_cpu=80000000L
+wifinfo.menu.xtal.160=160 MHz
+wifinfo.menu.xtal.160.build.f_cpu=160000000L
+wifinfo.menu.vt.flash=Flash
+wifinfo.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+wifinfo.menu.vt.heap=Heap
+wifinfo.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+wifinfo.menu.vt.iram=IRAM
+wifinfo.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+wifinfo.menu.exception.enabled=Enabled
+wifinfo.menu.exception.enabled.build.exception_flags=-fexceptions
+wifinfo.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+wifinfo.menu.exception.disabled=Disabled
+wifinfo.menu.exception.disabled.build.exception_flags=-fno-exceptions
+wifinfo.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+wifinfo.upload.resetmethod=nodemcu
+wifinfo.build.flash_mode=qio
+wifinfo.menu.FlashFreq.40=40MHz
+wifinfo.menu.FlashFreq.40.build.flash_freq=40
+wifinfo.menu.FlashFreq.80=80MHz
+wifinfo.menu.FlashFreq.80.build.flash_freq=80
+wifinfo.menu.eesz.1M=1M (no SPIFFS)
+wifinfo.menu.eesz.1M.build.flash_size=1M
+wifinfo.menu.eesz.1M.build.flash_size_bytes=0x100000
+wifinfo.menu.eesz.1M.build.flash_ld=eagle.flash.1m.ld
+wifinfo.menu.eesz.1M.build.spiffs_pagesize=256
+wifinfo.menu.eesz.1M.upload.maximum_size=1023984
+wifinfo.menu.eesz.1M.build.rfcal_addr=0xFC000
+wifinfo.menu.eesz.1M64=1M (64K SPIFFS)
+wifinfo.menu.eesz.1M64.build.flash_size=1M
+wifinfo.menu.eesz.1M64.build.flash_size_bytes=0x100000
+wifinfo.menu.eesz.1M64.build.flash_ld=eagle.flash.1m64.ld
+wifinfo.menu.eesz.1M64.build.spiffs_pagesize=256
+wifinfo.menu.eesz.1M64.upload.maximum_size=958448
+wifinfo.menu.eesz.1M64.build.rfcal_addr=0xFC000
+wifinfo.menu.eesz.1M64.build.spiffs_start=0xEB000
+wifinfo.menu.eesz.1M64.build.spiffs_end=0xFB000
+wifinfo.menu.eesz.1M64.build.spiffs_blocksize=4096
+wifinfo.menu.eesz.1M128=1M (128K SPIFFS)
+wifinfo.menu.eesz.1M128.build.flash_size=1M
+wifinfo.menu.eesz.1M128.build.flash_size_bytes=0x100000
+wifinfo.menu.eesz.1M128.build.flash_ld=eagle.flash.1m128.ld
+wifinfo.menu.eesz.1M128.build.spiffs_pagesize=256
+wifinfo.menu.eesz.1M128.upload.maximum_size=892912
+wifinfo.menu.eesz.1M128.build.rfcal_addr=0xFC000
+wifinfo.menu.eesz.1M128.build.spiffs_start=0xDB000
+wifinfo.menu.eesz.1M128.build.spiffs_end=0xFB000
+wifinfo.menu.eesz.1M128.build.spiffs_blocksize=4096
+wifinfo.menu.eesz.1M144=1M (144K SPIFFS)
+wifinfo.menu.eesz.1M144.build.flash_size=1M
+wifinfo.menu.eesz.1M144.build.flash_size_bytes=0x100000
+wifinfo.menu.eesz.1M144.build.flash_ld=eagle.flash.1m144.ld
+wifinfo.menu.eesz.1M144.build.spiffs_pagesize=256
+wifinfo.menu.eesz.1M144.upload.maximum_size=876528
+wifinfo.menu.eesz.1M144.build.rfcal_addr=0xFC000
+wifinfo.menu.eesz.1M144.build.spiffs_start=0xD7000
+wifinfo.menu.eesz.1M144.build.spiffs_end=0xFB000
+wifinfo.menu.eesz.1M144.build.spiffs_blocksize=4096
+wifinfo.menu.eesz.1M160=1M (160K SPIFFS)
+wifinfo.menu.eesz.1M160.build.flash_size=1M
+wifinfo.menu.eesz.1M160.build.flash_size_bytes=0x100000
+wifinfo.menu.eesz.1M160.build.flash_ld=eagle.flash.1m160.ld
+wifinfo.menu.eesz.1M160.build.spiffs_pagesize=256
+wifinfo.menu.eesz.1M160.upload.maximum_size=860144
+wifinfo.menu.eesz.1M160.build.rfcal_addr=0xFC000
+wifinfo.menu.eesz.1M160.build.spiffs_start=0xD3000
+wifinfo.menu.eesz.1M160.build.spiffs_end=0xFB000
+wifinfo.menu.eesz.1M160.build.spiffs_blocksize=4096
+wifinfo.menu.eesz.1M192=1M (192K SPIFFS)
+wifinfo.menu.eesz.1M192.build.flash_size=1M
+wifinfo.menu.eesz.1M192.build.flash_size_bytes=0x100000
+wifinfo.menu.eesz.1M192.build.flash_ld=eagle.flash.1m192.ld
+wifinfo.menu.eesz.1M192.build.spiffs_pagesize=256
+wifinfo.menu.eesz.1M192.upload.maximum_size=827376
+wifinfo.menu.eesz.1M192.build.rfcal_addr=0xFC000
+wifinfo.menu.eesz.1M192.build.spiffs_start=0xCB000
+wifinfo.menu.eesz.1M192.build.spiffs_end=0xFB000
+wifinfo.menu.eesz.1M192.build.spiffs_blocksize=4096
+wifinfo.menu.eesz.1M256=1M (256K SPIFFS)
+wifinfo.menu.eesz.1M256.build.flash_size=1M
+wifinfo.menu.eesz.1M256.build.flash_size_bytes=0x100000
+wifinfo.menu.eesz.1M256.build.flash_ld=eagle.flash.1m256.ld
+wifinfo.menu.eesz.1M256.build.spiffs_pagesize=256
+wifinfo.menu.eesz.1M256.upload.maximum_size=761840
+wifinfo.menu.eesz.1M256.build.rfcal_addr=0xFC000
+wifinfo.menu.eesz.1M256.build.spiffs_start=0xBB000
+wifinfo.menu.eesz.1M256.build.spiffs_end=0xFB000
+wifinfo.menu.eesz.1M256.build.spiffs_blocksize=4096
+wifinfo.menu.eesz.1M512=1M (512K SPIFFS)
+wifinfo.menu.eesz.1M512.build.flash_size=1M
+wifinfo.menu.eesz.1M512.build.flash_size_bytes=0x100000
+wifinfo.menu.eesz.1M512.build.flash_ld=eagle.flash.1m512.ld
+wifinfo.menu.eesz.1M512.build.spiffs_pagesize=256
+wifinfo.menu.eesz.1M512.upload.maximum_size=499696
+wifinfo.menu.eesz.1M512.build.rfcal_addr=0xFC000
+wifinfo.menu.eesz.1M512.build.spiffs_start=0x7B000
+wifinfo.menu.eesz.1M512.build.spiffs_end=0xFB000
+wifinfo.menu.eesz.1M512.build.spiffs_blocksize=4096
+wifinfo.menu.ip.lm2f=v2 Lower Memory
+wifinfo.menu.ip.lm2f.build.lwip_include=lwip2/include
+wifinfo.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+wifinfo.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+wifinfo.menu.ip.hb2f=v2 Higher Bandwidth
+wifinfo.menu.ip.hb2f.build.lwip_include=lwip2/include
+wifinfo.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+wifinfo.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+wifinfo.menu.ip.lm2n=v2 Lower Memory (no features)
+wifinfo.menu.ip.lm2n.build.lwip_include=lwip2/include
+wifinfo.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+wifinfo.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+wifinfo.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+wifinfo.menu.ip.hb2n.build.lwip_include=lwip2/include
+wifinfo.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+wifinfo.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+wifinfo.menu.ip.lm6f=v2 IPv6 Lower Memory
+wifinfo.menu.ip.lm6f.build.lwip_include=lwip2/include
+wifinfo.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+wifinfo.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+wifinfo.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+wifinfo.menu.ip.hb6f.build.lwip_include=lwip2/include
+wifinfo.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+wifinfo.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+wifinfo.menu.ip.hb1=v1.4 Higher Bandwidth
+wifinfo.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+wifinfo.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+wifinfo.menu.ip.src=v1.4 Compile from source
+wifinfo.menu.ip.src.build.lwip_lib=-llwip_src
+wifinfo.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+wifinfo.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+wifinfo.menu.dbg.Disabled=Disabled
+wifinfo.menu.dbg.Disabled.build.debug_port=
+wifinfo.menu.dbg.Serial=Serial
+wifinfo.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+wifinfo.menu.dbg.Serial1=Serial1
+wifinfo.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+wifinfo.menu.lvl.None____=None
+wifinfo.menu.lvl.None____.build.debug_level=
+wifinfo.menu.lvl.SSL=SSL
+wifinfo.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+wifinfo.menu.lvl.TLS_MEM=TLS_MEM
+wifinfo.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+wifinfo.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+wifinfo.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+wifinfo.menu.lvl.HTTP_SERVER=HTTP_SERVER
+wifinfo.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+wifinfo.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+wifinfo.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+wifinfo.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+wifinfo.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+wifinfo.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+wifinfo.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+wifinfo.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+wifinfo.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+wifinfo.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+wifinfo.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+wifinfo.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+wifinfo.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifinfo.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+wifinfo.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+wifinfo.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+wifinfo.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+wifinfo.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+wifinfo.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifinfo.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+wifinfo.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifinfo.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+wifinfo.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifinfo.menu.lvl.CORE=CORE
+wifinfo.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+wifinfo.menu.lvl.WIFI=WIFI
+wifinfo.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+wifinfo.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+wifinfo.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+wifinfo.menu.lvl.UPDATER=UPDATER
+wifinfo.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+wifinfo.menu.lvl.OTA=OTA
+wifinfo.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+wifinfo.menu.lvl.OOM=OOM
+wifinfo.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+wifinfo.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+wifinfo.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+wifinfo.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+wifinfo.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+wifinfo.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+wifinfo.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+wifinfo.menu.wipe.none=Only Sketch
+wifinfo.menu.wipe.none.upload.erase_cmd=
+wifinfo.menu.wipe.sdk=Sketch + WiFi Settings
+wifinfo.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+wifinfo.menu.wipe.all=All Flash Contents
+wifinfo.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+wifinfo.menu.baud.115200=115200
+wifinfo.menu.baud.115200.upload.speed=115200
+wifinfo.menu.baud.9600=9600
+wifinfo.menu.baud.9600.upload.speed=9600
+wifinfo.menu.baud.57600=57600
+wifinfo.menu.baud.57600.upload.speed=57600
+wifinfo.menu.baud.230400.linux=230400
+wifinfo.menu.baud.230400.macosx=230400
+wifinfo.menu.baud.230400.upload.speed=230400
+wifinfo.menu.baud.256000.windows=256000
+wifinfo.menu.baud.256000.upload.speed=256000
+wifinfo.menu.baud.460800.linux=460800
+wifinfo.menu.baud.460800.macosx=460800
+wifinfo.menu.baud.460800.upload.speed=460800
+wifinfo.menu.baud.512000.windows=512000
+wifinfo.menu.baud.512000.upload.speed=512000
+wifinfo.menu.baud.921600=921600
+wifinfo.menu.baud.921600.upload.speed=921600
+
+##############################################################
+arduino-esp8266.name=Arduino
+arduino-esp8266.menu.BoardModel.starottodeved.build.board=ESP8266_ARDUINO_STAR_OTTO
+arduino-esp8266.menu.BoardModel.primo.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
+arduino-esp8266.menu.BoardModel.starottodeved.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
+arduino-esp8266.menu.BoardModel.starottodeved.build.variant=arduino_uart
+arduino-esp8266.menu.BoardModel.unowifideved.build.board=ESP8266_ARDUINO_UNOWIFI
+arduino-esp8266.menu.BoardModel.unowifideved.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
+arduino-esp8266.menu.BoardModel.primo=Primo
+arduino-esp8266.menu.BoardModel.unowifideved.build.variant=arduino_uart
+arduino-esp8266.menu.BoardModel.primo.build.variant=arduino_spi
+arduino-esp8266.menu.BoardModel.starottodeved=Star OTTO
+arduino-esp8266.build.board=ESP8266_ARDUINO
+arduino-esp8266.menu.BoardModel.primo.build.board=ESP8266_ARDUINO_PRIMO
+arduino-esp8266.menu.BoardModel.unowifideved=Uno WiFi
+arduino-esp8266.upload.tool=esptool
+arduino-esp8266.upload.maximum_data_size=81920
+arduino-esp8266.upload.wait_for_upload_port=true
+arduino-esp8266.upload.erase_cmd=
+arduino-esp8266.serial.disableDTR=true
+arduino-esp8266.serial.disableRTS=true
+arduino-esp8266.build.mcu=esp8266
+arduino-esp8266.build.core=esp8266
+arduino-esp8266.build.variant=generic
+arduino-esp8266.build.spiffs_pagesize=256
+arduino-esp8266.build.debug_port=
+arduino-esp8266.build.debug_level=
+arduino-esp8266.menu.xtal.80=80 MHz
+arduino-esp8266.menu.xtal.80.build.f_cpu=80000000L
+arduino-esp8266.menu.xtal.160=160 MHz
+arduino-esp8266.menu.xtal.160.build.f_cpu=160000000L
+arduino-esp8266.menu.vt.flash=Flash
+arduino-esp8266.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+arduino-esp8266.menu.vt.heap=Heap
+arduino-esp8266.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+arduino-esp8266.menu.vt.iram=IRAM
+arduino-esp8266.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+arduino-esp8266.menu.exception.enabled=Enabled
+arduino-esp8266.menu.exception.enabled.build.exception_flags=-fexceptions
+arduino-esp8266.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+arduino-esp8266.menu.exception.disabled=Disabled
+arduino-esp8266.menu.exception.disabled.build.exception_flags=-fno-exceptions
+arduino-esp8266.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+arduino-esp8266.upload.resetmethod=ck
+arduino-esp8266.build.flash_mode=qio
+arduino-esp8266.build.flash_freq=40
+arduino-esp8266.menu.eesz.4M=4M (no SPIFFS)
+arduino-esp8266.menu.eesz.4M.build.flash_size=4M
+arduino-esp8266.menu.eesz.4M.build.flash_size_bytes=0x400000
+arduino-esp8266.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+arduino-esp8266.menu.eesz.4M.build.spiffs_pagesize=256
+arduino-esp8266.menu.eesz.4M.upload.maximum_size=1044464
+arduino-esp8266.menu.eesz.4M.build.rfcal_addr=0x3FC000
+arduino-esp8266.menu.eesz.4M1M=4M (1M SPIFFS)
+arduino-esp8266.menu.eesz.4M1M.build.flash_size=4M
+arduino-esp8266.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+arduino-esp8266.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+arduino-esp8266.menu.eesz.4M1M.build.spiffs_pagesize=256
+arduino-esp8266.menu.eesz.4M1M.upload.maximum_size=1044464
+arduino-esp8266.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+arduino-esp8266.menu.eesz.4M1M.build.spiffs_start=0x300000
+arduino-esp8266.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+arduino-esp8266.menu.eesz.4M1M.build.spiffs_blocksize=8192
+arduino-esp8266.menu.eesz.4M2M=4M (2M SPIFFS)
+arduino-esp8266.menu.eesz.4M2M.build.flash_size=4M
+arduino-esp8266.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+arduino-esp8266.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+arduino-esp8266.menu.eesz.4M2M.build.spiffs_pagesize=256
+arduino-esp8266.menu.eesz.4M2M.upload.maximum_size=1044464
+arduino-esp8266.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+arduino-esp8266.menu.eesz.4M2M.build.spiffs_start=0x200000
+arduino-esp8266.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+arduino-esp8266.menu.eesz.4M2M.build.spiffs_blocksize=8192
+arduino-esp8266.menu.eesz.4M3M=4M (3M SPIFFS)
+arduino-esp8266.menu.eesz.4M3M.build.flash_size=4M
+arduino-esp8266.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+arduino-esp8266.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+arduino-esp8266.menu.eesz.4M3M.build.spiffs_pagesize=256
+arduino-esp8266.menu.eesz.4M3M.upload.maximum_size=1044464
+arduino-esp8266.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+arduino-esp8266.menu.eesz.4M3M.build.spiffs_start=0x100000
+arduino-esp8266.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+arduino-esp8266.menu.eesz.4M3M.build.spiffs_blocksize=8192
+arduino-esp8266.menu.ip.lm2f=v2 Lower Memory
+arduino-esp8266.menu.ip.lm2f.build.lwip_include=lwip2/include
+arduino-esp8266.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+arduino-esp8266.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+arduino-esp8266.menu.ip.hb2f=v2 Higher Bandwidth
+arduino-esp8266.menu.ip.hb2f.build.lwip_include=lwip2/include
+arduino-esp8266.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+arduino-esp8266.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+arduino-esp8266.menu.ip.lm2n=v2 Lower Memory (no features)
+arduino-esp8266.menu.ip.lm2n.build.lwip_include=lwip2/include
+arduino-esp8266.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+arduino-esp8266.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+arduino-esp8266.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+arduino-esp8266.menu.ip.hb2n.build.lwip_include=lwip2/include
+arduino-esp8266.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+arduino-esp8266.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+arduino-esp8266.menu.ip.lm6f=v2 IPv6 Lower Memory
+arduino-esp8266.menu.ip.lm6f.build.lwip_include=lwip2/include
+arduino-esp8266.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+arduino-esp8266.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+arduino-esp8266.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+arduino-esp8266.menu.ip.hb6f.build.lwip_include=lwip2/include
+arduino-esp8266.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+arduino-esp8266.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+arduino-esp8266.menu.ip.hb1=v1.4 Higher Bandwidth
+arduino-esp8266.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+arduino-esp8266.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+arduino-esp8266.menu.ip.src=v1.4 Compile from source
+arduino-esp8266.menu.ip.src.build.lwip_lib=-llwip_src
+arduino-esp8266.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+arduino-esp8266.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+arduino-esp8266.menu.dbg.Disabled=Disabled
+arduino-esp8266.menu.dbg.Disabled.build.debug_port=
+arduino-esp8266.menu.dbg.Serial=Serial
+arduino-esp8266.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+arduino-esp8266.menu.dbg.Serial1=Serial1
+arduino-esp8266.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+arduino-esp8266.menu.lvl.None____=None
+arduino-esp8266.menu.lvl.None____.build.debug_level=
+arduino-esp8266.menu.lvl.SSL=SSL
+arduino-esp8266.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+arduino-esp8266.menu.lvl.TLS_MEM=TLS_MEM
+arduino-esp8266.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+arduino-esp8266.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+arduino-esp8266.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+arduino-esp8266.menu.lvl.HTTP_SERVER=HTTP_SERVER
+arduino-esp8266.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+arduino-esp8266.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+arduino-esp8266.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+arduino-esp8266.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+arduino-esp8266.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+arduino-esp8266.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+arduino-esp8266.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+arduino-esp8266.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+arduino-esp8266.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+arduino-esp8266.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+arduino-esp8266.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+arduino-esp8266.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+arduino-esp8266.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+arduino-esp8266.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+arduino-esp8266.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+arduino-esp8266.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+arduino-esp8266.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+arduino-esp8266.menu.lvl.CORE=CORE
+arduino-esp8266.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+arduino-esp8266.menu.lvl.WIFI=WIFI
+arduino-esp8266.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+arduino-esp8266.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+arduino-esp8266.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+arduino-esp8266.menu.lvl.UPDATER=UPDATER
+arduino-esp8266.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+arduino-esp8266.menu.lvl.OTA=OTA
+arduino-esp8266.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+arduino-esp8266.menu.lvl.OOM=OOM
+arduino-esp8266.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+arduino-esp8266.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+arduino-esp8266.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+arduino-esp8266.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+arduino-esp8266.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+arduino-esp8266.menu.wipe.none=Only Sketch
+arduino-esp8266.menu.wipe.none.upload.erase_cmd=
+arduino-esp8266.menu.wipe.sdk=Sketch + WiFi Settings
+arduino-esp8266.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+arduino-esp8266.menu.wipe.all=All Flash Contents
+arduino-esp8266.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+arduino-esp8266.menu.baud.115200=115200
+arduino-esp8266.menu.baud.115200.upload.speed=115200
+arduino-esp8266.menu.baud.9600=9600
+arduino-esp8266.menu.baud.9600.upload.speed=9600
+arduino-esp8266.menu.baud.57600=57600
+arduino-esp8266.menu.baud.57600.upload.speed=57600
+arduino-esp8266.menu.baud.230400.linux=230400
+arduino-esp8266.menu.baud.230400.macosx=230400
+arduino-esp8266.menu.baud.230400.upload.speed=230400
+arduino-esp8266.menu.baud.256000.windows=256000
+arduino-esp8266.menu.baud.256000.upload.speed=256000
+arduino-esp8266.menu.baud.460800.linux=460800
+arduino-esp8266.menu.baud.460800.macosx=460800
+arduino-esp8266.menu.baud.460800.upload.speed=460800
+arduino-esp8266.menu.baud.512000.windows=512000
+arduino-esp8266.menu.baud.512000.upload.speed=512000
+arduino-esp8266.menu.baud.921600=921600
+arduino-esp8266.menu.baud.921600.upload.speed=921600
+
+##############################################################
+gen4iod.name=4D Systems gen4 IoD Range
+gen4iod.build.board=GEN4_IOD
+gen4iod.build.f_cpu=160000000L
+gen4iod.build.variant=generic
+gen4iod.upload.tool=esptool
+gen4iod.upload.maximum_data_size=81920
+gen4iod.upload.wait_for_upload_port=true
+gen4iod.upload.erase_cmd=
+gen4iod.serial.disableDTR=true
+gen4iod.serial.disableRTS=true
+gen4iod.build.mcu=esp8266
+gen4iod.build.core=esp8266
+gen4iod.build.spiffs_pagesize=256
+gen4iod.build.debug_port=
+gen4iod.build.debug_level=
+gen4iod.menu.xtal.80=80 MHz
+gen4iod.menu.xtal.80.build.f_cpu=80000000L
+gen4iod.menu.xtal.160=160 MHz
+gen4iod.menu.xtal.160.build.f_cpu=160000000L
+gen4iod.menu.vt.flash=Flash
+gen4iod.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+gen4iod.menu.vt.heap=Heap
+gen4iod.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+gen4iod.menu.vt.iram=IRAM
+gen4iod.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+gen4iod.menu.exception.enabled=Enabled
+gen4iod.menu.exception.enabled.build.exception_flags=-fexceptions
+gen4iod.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+gen4iod.menu.exception.disabled=Disabled
+gen4iod.menu.exception.disabled.build.exception_flags=-fno-exceptions
+gen4iod.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+gen4iod.upload.resetmethod=nodemcu
+gen4iod.build.flash_mode=dio
+gen4iod.build.flash_freq=80
+gen4iod.menu.eesz.512K=512K (no SPIFFS)
+gen4iod.menu.eesz.512K.build.flash_size=512K
+gen4iod.menu.eesz.512K.build.flash_size_bytes=0x80000
+gen4iod.menu.eesz.512K.build.flash_ld=eagle.flash.512k.ld
+gen4iod.menu.eesz.512K.build.spiffs_pagesize=256
+gen4iod.menu.eesz.512K.upload.maximum_size=499696
+gen4iod.menu.eesz.512K.build.rfcal_addr=0x7C000
+gen4iod.menu.eesz.512K32=512K (32K SPIFFS)
+gen4iod.menu.eesz.512K32.build.flash_size=512K
+gen4iod.menu.eesz.512K32.build.flash_size_bytes=0x80000
+gen4iod.menu.eesz.512K32.build.flash_ld=eagle.flash.512k32.ld
+gen4iod.menu.eesz.512K32.build.spiffs_pagesize=256
+gen4iod.menu.eesz.512K32.upload.maximum_size=466928
+gen4iod.menu.eesz.512K32.build.rfcal_addr=0x7C000
+gen4iod.menu.eesz.512K32.build.spiffs_start=0x73000
+gen4iod.menu.eesz.512K32.build.spiffs_end=0x7B000
+gen4iod.menu.eesz.512K32.build.spiffs_blocksize=4096
+gen4iod.menu.eesz.512K64=512K (64K SPIFFS)
+gen4iod.menu.eesz.512K64.build.flash_size=512K
+gen4iod.menu.eesz.512K64.build.flash_size_bytes=0x80000
+gen4iod.menu.eesz.512K64.build.flash_ld=eagle.flash.512k64.ld
+gen4iod.menu.eesz.512K64.build.spiffs_pagesize=256
+gen4iod.menu.eesz.512K64.upload.maximum_size=434160
+gen4iod.menu.eesz.512K64.build.rfcal_addr=0x7C000
+gen4iod.menu.eesz.512K64.build.spiffs_start=0x6B000
+gen4iod.menu.eesz.512K64.build.spiffs_end=0x7B000
+gen4iod.menu.eesz.512K64.build.spiffs_blocksize=4096
+gen4iod.menu.eesz.512K128=512K (128K SPIFFS)
+gen4iod.menu.eesz.512K128.build.flash_size=512K
+gen4iod.menu.eesz.512K128.build.flash_size_bytes=0x80000
+gen4iod.menu.eesz.512K128.build.flash_ld=eagle.flash.512k128.ld
+gen4iod.menu.eesz.512K128.build.spiffs_pagesize=256
+gen4iod.menu.eesz.512K128.upload.maximum_size=368624
+gen4iod.menu.eesz.512K128.build.rfcal_addr=0x7C000
+gen4iod.menu.eesz.512K128.build.spiffs_start=0x5B000
+gen4iod.menu.eesz.512K128.build.spiffs_end=0x7B000
+gen4iod.menu.eesz.512K128.build.spiffs_blocksize=4096
+gen4iod.menu.ip.lm2f=v2 Lower Memory
+gen4iod.menu.ip.lm2f.build.lwip_include=lwip2/include
+gen4iod.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+gen4iod.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+gen4iod.menu.ip.hb2f=v2 Higher Bandwidth
+gen4iod.menu.ip.hb2f.build.lwip_include=lwip2/include
+gen4iod.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+gen4iod.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+gen4iod.menu.ip.lm2n=v2 Lower Memory (no features)
+gen4iod.menu.ip.lm2n.build.lwip_include=lwip2/include
+gen4iod.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+gen4iod.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+gen4iod.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+gen4iod.menu.ip.hb2n.build.lwip_include=lwip2/include
+gen4iod.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+gen4iod.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+gen4iod.menu.ip.lm6f=v2 IPv6 Lower Memory
+gen4iod.menu.ip.lm6f.build.lwip_include=lwip2/include
+gen4iod.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+gen4iod.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+gen4iod.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+gen4iod.menu.ip.hb6f.build.lwip_include=lwip2/include
+gen4iod.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+gen4iod.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+gen4iod.menu.ip.hb1=v1.4 Higher Bandwidth
+gen4iod.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+gen4iod.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+gen4iod.menu.ip.src=v1.4 Compile from source
+gen4iod.menu.ip.src.build.lwip_lib=-llwip_src
+gen4iod.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+gen4iod.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+gen4iod.menu.dbg.Disabled=Disabled
+gen4iod.menu.dbg.Disabled.build.debug_port=
+gen4iod.menu.dbg.Serial=Serial
+gen4iod.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+gen4iod.menu.dbg.Serial1=Serial1
+gen4iod.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+gen4iod.menu.lvl.None____=None
+gen4iod.menu.lvl.None____.build.debug_level=
+gen4iod.menu.lvl.SSL=SSL
+gen4iod.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+gen4iod.menu.lvl.TLS_MEM=TLS_MEM
+gen4iod.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+gen4iod.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+gen4iod.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+gen4iod.menu.lvl.HTTP_SERVER=HTTP_SERVER
+gen4iod.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+gen4iod.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+gen4iod.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+gen4iod.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+gen4iod.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+gen4iod.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+gen4iod.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+gen4iod.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+gen4iod.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+gen4iod.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+gen4iod.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+gen4iod.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+gen4iod.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+gen4iod.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+gen4iod.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+gen4iod.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+gen4iod.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+gen4iod.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+gen4iod.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+gen4iod.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+gen4iod.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+gen4iod.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+gen4iod.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+gen4iod.menu.lvl.CORE=CORE
+gen4iod.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+gen4iod.menu.lvl.WIFI=WIFI
+gen4iod.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+gen4iod.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+gen4iod.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+gen4iod.menu.lvl.UPDATER=UPDATER
+gen4iod.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+gen4iod.menu.lvl.OTA=OTA
+gen4iod.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+gen4iod.menu.lvl.OOM=OOM
+gen4iod.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+gen4iod.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+gen4iod.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+gen4iod.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+gen4iod.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+gen4iod.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+gen4iod.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+gen4iod.menu.wipe.none=Only Sketch
+gen4iod.menu.wipe.none.upload.erase_cmd=
+gen4iod.menu.wipe.sdk=Sketch + WiFi Settings
+gen4iod.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+gen4iod.menu.wipe.all=All Flash Contents
+gen4iod.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+gen4iod.menu.baud.115200=115200
+gen4iod.menu.baud.115200.upload.speed=115200
+gen4iod.menu.baud.9600=9600
+gen4iod.menu.baud.9600.upload.speed=9600
+gen4iod.menu.baud.57600=57600
+gen4iod.menu.baud.57600.upload.speed=57600
+gen4iod.menu.baud.230400.linux=230400
+gen4iod.menu.baud.230400.macosx=230400
+gen4iod.menu.baud.230400.upload.speed=230400
+gen4iod.menu.baud.256000.windows=256000
+gen4iod.menu.baud.256000.upload.speed=256000
+gen4iod.menu.baud.460800.linux=460800
+gen4iod.menu.baud.460800.macosx=460800
+gen4iod.menu.baud.460800.upload.speed=460800
+gen4iod.menu.baud.512000.windows=512000
+gen4iod.menu.baud.512000.upload.speed=512000
+gen4iod.menu.baud.921600=921600
+gen4iod.menu.baud.921600.upload.speed=921600
+
+##############################################################
+oak.name=Digistump Oak
+oak.build.board=ESP8266_OAK
+oak.build.variant=oak
+oak.upload.maximum_size=1040368
+oak.upload.tool=esptool
+oak.upload.maximum_data_size=81920
+oak.upload.wait_for_upload_port=true
+oak.upload.erase_cmd=
+oak.serial.disableDTR=true
+oak.serial.disableRTS=true
+oak.build.mcu=esp8266
+oak.build.core=esp8266
+oak.build.spiffs_pagesize=256
+oak.build.debug_port=
+oak.build.debug_level=
+oak.menu.xtal.80=80 MHz
+oak.menu.xtal.80.build.f_cpu=80000000L
+oak.menu.xtal.160=160 MHz
+oak.menu.xtal.160.build.f_cpu=160000000L
+oak.menu.vt.flash=Flash
+oak.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+oak.menu.vt.heap=Heap
+oak.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+oak.menu.vt.iram=IRAM
+oak.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+oak.menu.exception.enabled=Enabled
+oak.menu.exception.enabled.build.exception_flags=-fexceptions
+oak.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+oak.menu.exception.disabled=Disabled
+oak.menu.exception.disabled.build.exception_flags=-fno-exceptions
+oak.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+oak.upload.resetmethod=none
+oak.build.flash_mode=dio
+oak.build.flash_freq=40
+oak.menu.eesz.4M=4M (no SPIFFS)
+oak.menu.eesz.4M.build.flash_size=4M
+oak.menu.eesz.4M.build.flash_size_bytes=0x400000
+oak.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+oak.menu.eesz.4M.build.spiffs_pagesize=256
+oak.menu.eesz.4M.upload.maximum_size=1044464
+oak.menu.eesz.4M.build.rfcal_addr=0x3FC000
+oak.menu.eesz.4M1M=4M (1M SPIFFS)
+oak.menu.eesz.4M1M.build.flash_size=4M
+oak.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+oak.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+oak.menu.eesz.4M1M.build.spiffs_pagesize=256
+oak.menu.eesz.4M1M.upload.maximum_size=1044464
+oak.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+oak.menu.eesz.4M1M.build.spiffs_start=0x300000
+oak.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+oak.menu.eesz.4M1M.build.spiffs_blocksize=8192
+oak.menu.eesz.4M2M=4M (2M SPIFFS)
+oak.menu.eesz.4M2M.build.flash_size=4M
+oak.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+oak.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+oak.menu.eesz.4M2M.build.spiffs_pagesize=256
+oak.menu.eesz.4M2M.upload.maximum_size=1044464
+oak.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+oak.menu.eesz.4M2M.build.spiffs_start=0x200000
+oak.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+oak.menu.eesz.4M2M.build.spiffs_blocksize=8192
+oak.menu.eesz.4M3M=4M (3M SPIFFS)
+oak.menu.eesz.4M3M.build.flash_size=4M
+oak.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+oak.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+oak.menu.eesz.4M3M.build.spiffs_pagesize=256
+oak.menu.eesz.4M3M.upload.maximum_size=1044464
+oak.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+oak.menu.eesz.4M3M.build.spiffs_start=0x100000
+oak.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+oak.menu.eesz.4M3M.build.spiffs_blocksize=8192
+oak.menu.ip.lm2f=v2 Lower Memory
+oak.menu.ip.lm2f.build.lwip_include=lwip2/include
+oak.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+oak.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+oak.menu.ip.hb2f=v2 Higher Bandwidth
+oak.menu.ip.hb2f.build.lwip_include=lwip2/include
+oak.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+oak.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+oak.menu.ip.lm2n=v2 Lower Memory (no features)
+oak.menu.ip.lm2n.build.lwip_include=lwip2/include
+oak.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+oak.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+oak.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+oak.menu.ip.hb2n.build.lwip_include=lwip2/include
+oak.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+oak.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+oak.menu.ip.lm6f=v2 IPv6 Lower Memory
+oak.menu.ip.lm6f.build.lwip_include=lwip2/include
+oak.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+oak.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+oak.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+oak.menu.ip.hb6f.build.lwip_include=lwip2/include
+oak.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+oak.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+oak.menu.ip.hb1=v1.4 Higher Bandwidth
+oak.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+oak.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+oak.menu.ip.src=v1.4 Compile from source
+oak.menu.ip.src.build.lwip_lib=-llwip_src
+oak.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+oak.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+oak.menu.dbg.Disabled=Disabled
+oak.menu.dbg.Disabled.build.debug_port=
+oak.menu.dbg.Serial=Serial
+oak.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+oak.menu.dbg.Serial1=Serial1
+oak.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+oak.menu.lvl.None____=None
+oak.menu.lvl.None____.build.debug_level=
+oak.menu.lvl.SSL=SSL
+oak.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+oak.menu.lvl.TLS_MEM=TLS_MEM
+oak.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+oak.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+oak.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+oak.menu.lvl.HTTP_SERVER=HTTP_SERVER
+oak.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+oak.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+oak.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+oak.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+oak.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+oak.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+oak.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+oak.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+oak.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+oak.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+oak.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+oak.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+oak.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+oak.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+oak.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+oak.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+oak.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+oak.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+oak.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+oak.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+oak.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+oak.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+oak.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+oak.menu.lvl.CORE=CORE
+oak.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+oak.menu.lvl.WIFI=WIFI
+oak.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+oak.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+oak.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+oak.menu.lvl.UPDATER=UPDATER
+oak.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+oak.menu.lvl.OTA=OTA
+oak.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+oak.menu.lvl.OOM=OOM
+oak.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+oak.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+oak.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+oak.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+oak.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+oak.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+oak.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+oak.menu.wipe.none=Only Sketch
+oak.menu.wipe.none.upload.erase_cmd=
+oak.menu.wipe.sdk=Sketch + WiFi Settings
+oak.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+oak.menu.wipe.all=All Flash Contents
+oak.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+oak.menu.baud.921600=921600
+oak.menu.baud.921600.upload.speed=921600
+oak.menu.baud.9600=9600
+oak.menu.baud.9600.upload.speed=9600
+oak.menu.baud.57600=57600
+oak.menu.baud.57600.upload.speed=57600
+oak.menu.baud.115200=115200
+oak.menu.baud.115200.upload.speed=115200
+oak.menu.baud.230400.linux=230400
+oak.menu.baud.230400.macosx=230400
+oak.menu.baud.230400.upload.speed=230400
+oak.menu.baud.256000.windows=256000
+oak.menu.baud.256000.upload.speed=256000
+oak.menu.baud.460800.linux=460800
+oak.menu.baud.460800.macosx=460800
+oak.menu.baud.460800.upload.speed=460800
+oak.menu.baud.512000.windows=512000
+oak.menu.baud.512000.upload.speed=512000
+
+##############################################################
+wifiduino.name=WiFiduino
+wifiduino.build.board=WIFIDUINO_ESP8266
+wifiduino.build.variant=wifiduino
+wifiduino.upload.tool=esptool
+wifiduino.upload.maximum_data_size=81920
+wifiduino.upload.wait_for_upload_port=true
+wifiduino.upload.erase_cmd=
+wifiduino.serial.disableDTR=true
+wifiduino.serial.disableRTS=true
+wifiduino.build.mcu=esp8266
+wifiduino.build.core=esp8266
+wifiduino.build.spiffs_pagesize=256
+wifiduino.build.debug_port=
+wifiduino.build.debug_level=
+wifiduino.menu.xtal.80=80 MHz
+wifiduino.menu.xtal.80.build.f_cpu=80000000L
+wifiduino.menu.xtal.160=160 MHz
+wifiduino.menu.xtal.160.build.f_cpu=160000000L
+wifiduino.menu.vt.flash=Flash
+wifiduino.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+wifiduino.menu.vt.heap=Heap
+wifiduino.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+wifiduino.menu.vt.iram=IRAM
+wifiduino.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+wifiduino.menu.exception.enabled=Enabled
+wifiduino.menu.exception.enabled.build.exception_flags=-fexceptions
+wifiduino.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+wifiduino.menu.exception.disabled=Disabled
+wifiduino.menu.exception.disabled.build.exception_flags=-fno-exceptions
+wifiduino.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+wifiduino.upload.resetmethod=nodemcu
+wifiduino.build.flash_mode=dio
+wifiduino.build.flash_freq=40
+wifiduino.menu.eesz.4M=4M (no SPIFFS)
+wifiduino.menu.eesz.4M.build.flash_size=4M
+wifiduino.menu.eesz.4M.build.flash_size_bytes=0x400000
+wifiduino.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+wifiduino.menu.eesz.4M.build.spiffs_pagesize=256
+wifiduino.menu.eesz.4M.upload.maximum_size=1044464
+wifiduino.menu.eesz.4M.build.rfcal_addr=0x3FC000
+wifiduino.menu.eesz.4M1M=4M (1M SPIFFS)
+wifiduino.menu.eesz.4M1M.build.flash_size=4M
+wifiduino.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+wifiduino.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+wifiduino.menu.eesz.4M1M.build.spiffs_pagesize=256
+wifiduino.menu.eesz.4M1M.upload.maximum_size=1044464
+wifiduino.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+wifiduino.menu.eesz.4M1M.build.spiffs_start=0x300000
+wifiduino.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+wifiduino.menu.eesz.4M1M.build.spiffs_blocksize=8192
+wifiduino.menu.eesz.4M2M=4M (2M SPIFFS)
+wifiduino.menu.eesz.4M2M.build.flash_size=4M
+wifiduino.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+wifiduino.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+wifiduino.menu.eesz.4M2M.build.spiffs_pagesize=256
+wifiduino.menu.eesz.4M2M.upload.maximum_size=1044464
+wifiduino.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+wifiduino.menu.eesz.4M2M.build.spiffs_start=0x200000
+wifiduino.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+wifiduino.menu.eesz.4M2M.build.spiffs_blocksize=8192
+wifiduino.menu.eesz.4M3M=4M (3M SPIFFS)
+wifiduino.menu.eesz.4M3M.build.flash_size=4M
+wifiduino.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+wifiduino.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+wifiduino.menu.eesz.4M3M.build.spiffs_pagesize=256
+wifiduino.menu.eesz.4M3M.upload.maximum_size=1044464
+wifiduino.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+wifiduino.menu.eesz.4M3M.build.spiffs_start=0x100000
+wifiduino.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+wifiduino.menu.eesz.4M3M.build.spiffs_blocksize=8192
+wifiduino.menu.ip.lm2f=v2 Lower Memory
+wifiduino.menu.ip.lm2f.build.lwip_include=lwip2/include
+wifiduino.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+wifiduino.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+wifiduino.menu.ip.hb2f=v2 Higher Bandwidth
+wifiduino.menu.ip.hb2f.build.lwip_include=lwip2/include
+wifiduino.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+wifiduino.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+wifiduino.menu.ip.lm2n=v2 Lower Memory (no features)
+wifiduino.menu.ip.lm2n.build.lwip_include=lwip2/include
+wifiduino.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+wifiduino.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+wifiduino.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+wifiduino.menu.ip.hb2n.build.lwip_include=lwip2/include
+wifiduino.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+wifiduino.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+wifiduino.menu.ip.lm6f=v2 IPv6 Lower Memory
+wifiduino.menu.ip.lm6f.build.lwip_include=lwip2/include
+wifiduino.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+wifiduino.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+wifiduino.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+wifiduino.menu.ip.hb6f.build.lwip_include=lwip2/include
+wifiduino.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+wifiduino.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+wifiduino.menu.ip.hb1=v1.4 Higher Bandwidth
+wifiduino.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+wifiduino.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+wifiduino.menu.ip.src=v1.4 Compile from source
+wifiduino.menu.ip.src.build.lwip_lib=-llwip_src
+wifiduino.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+wifiduino.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+wifiduino.menu.dbg.Disabled=Disabled
+wifiduino.menu.dbg.Disabled.build.debug_port=
+wifiduino.menu.dbg.Serial=Serial
+wifiduino.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+wifiduino.menu.dbg.Serial1=Serial1
+wifiduino.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+wifiduino.menu.lvl.None____=None
+wifiduino.menu.lvl.None____.build.debug_level=
+wifiduino.menu.lvl.SSL=SSL
+wifiduino.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+wifiduino.menu.lvl.TLS_MEM=TLS_MEM
+wifiduino.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+wifiduino.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+wifiduino.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+wifiduino.menu.lvl.HTTP_SERVER=HTTP_SERVER
+wifiduino.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+wifiduino.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+wifiduino.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+wifiduino.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+wifiduino.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+wifiduino.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+wifiduino.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+wifiduino.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+wifiduino.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+wifiduino.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+wifiduino.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+wifiduino.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+wifiduino.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifiduino.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+wifiduino.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+wifiduino.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+wifiduino.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+wifiduino.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+wifiduino.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifiduino.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+wifiduino.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifiduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+wifiduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifiduino.menu.lvl.CORE=CORE
+wifiduino.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+wifiduino.menu.lvl.WIFI=WIFI
+wifiduino.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+wifiduino.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+wifiduino.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+wifiduino.menu.lvl.UPDATER=UPDATER
+wifiduino.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+wifiduino.menu.lvl.OTA=OTA
+wifiduino.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+wifiduino.menu.lvl.OOM=OOM
+wifiduino.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+wifiduino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+wifiduino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+wifiduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+wifiduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+wifiduino.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+wifiduino.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+wifiduino.menu.wipe.none=Only Sketch
+wifiduino.menu.wipe.none.upload.erase_cmd=
+wifiduino.menu.wipe.sdk=Sketch + WiFi Settings
+wifiduino.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+wifiduino.menu.wipe.all=All Flash Contents
+wifiduino.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+wifiduino.menu.baud.921600=921600
+wifiduino.menu.baud.921600.upload.speed=921600
+wifiduino.menu.baud.9600=9600
+wifiduino.menu.baud.9600.upload.speed=9600
+wifiduino.menu.baud.57600=57600
+wifiduino.menu.baud.57600.upload.speed=57600
+wifiduino.menu.baud.115200=115200
+wifiduino.menu.baud.115200.upload.speed=115200
+wifiduino.menu.baud.230400.linux=230400
+wifiduino.menu.baud.230400.macosx=230400
+wifiduino.menu.baud.230400.upload.speed=230400
+wifiduino.menu.baud.256000.windows=256000
+wifiduino.menu.baud.256000.upload.speed=256000
+wifiduino.menu.baud.460800.linux=460800
+wifiduino.menu.baud.460800.macosx=460800
+wifiduino.menu.baud.460800.upload.speed=460800
+wifiduino.menu.baud.512000.windows=512000
+wifiduino.menu.baud.512000.upload.speed=512000
+
+##############################################################
+wifi_slot.name=Amperka WiFi Slot
+wifi_slot.build.board=AMPERKA_WIFI_SLOT
+wifi_slot.build.variant=wifi_slot
+wifi_slot.upload.tool=esptool
+wifi_slot.upload.maximum_data_size=81920
+wifi_slot.upload.wait_for_upload_port=true
+wifi_slot.upload.erase_cmd=
+wifi_slot.serial.disableDTR=true
+wifi_slot.serial.disableRTS=true
+wifi_slot.build.mcu=esp8266
+wifi_slot.build.core=esp8266
+wifi_slot.build.spiffs_pagesize=256
+wifi_slot.build.debug_port=
+wifi_slot.build.debug_level=
+wifi_slot.menu.xtal.80=80 MHz
+wifi_slot.menu.xtal.80.build.f_cpu=80000000L
+wifi_slot.menu.xtal.160=160 MHz
+wifi_slot.menu.xtal.160.build.f_cpu=160000000L
+wifi_slot.menu.vt.flash=Flash
+wifi_slot.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+wifi_slot.menu.vt.heap=Heap
+wifi_slot.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+wifi_slot.menu.vt.iram=IRAM
+wifi_slot.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+wifi_slot.menu.exception.enabled=Enabled
+wifi_slot.menu.exception.enabled.build.exception_flags=-fexceptions
+wifi_slot.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+wifi_slot.menu.exception.disabled=Disabled
+wifi_slot.menu.exception.disabled.build.exception_flags=-fno-exceptions
+wifi_slot.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+wifi_slot.upload.resetmethod=nodemcu
+wifi_slot.menu.FlashFreq.40=40MHz
+wifi_slot.menu.FlashFreq.40.build.flash_freq=40
+wifi_slot.menu.FlashFreq.80=80MHz
+wifi_slot.menu.FlashFreq.80.build.flash_freq=80
+wifi_slot.menu.FlashMode.qio=QIO
+wifi_slot.menu.FlashMode.qio.build.flash_mode=qio
+wifi_slot.menu.FlashMode.qout=QOUT
+wifi_slot.menu.FlashMode.qout.build.flash_mode=qout
+wifi_slot.menu.FlashMode.dio=DIO
+wifi_slot.menu.FlashMode.dio.build.flash_mode=dio
+wifi_slot.menu.FlashMode.dout=DOUT
+wifi_slot.menu.FlashMode.dout.build.flash_mode=dout
+wifi_slot.menu.eesz.1M=1M (no SPIFFS)
+wifi_slot.menu.eesz.1M.build.flash_size=1M
+wifi_slot.menu.eesz.1M.build.flash_size_bytes=0x100000
+wifi_slot.menu.eesz.1M.build.flash_ld=eagle.flash.1m.ld
+wifi_slot.menu.eesz.1M.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.1M.upload.maximum_size=1023984
+wifi_slot.menu.eesz.1M.build.rfcal_addr=0xFC000
+wifi_slot.menu.eesz.1M64=1M (64K SPIFFS)
+wifi_slot.menu.eesz.1M64.build.flash_size=1M
+wifi_slot.menu.eesz.1M64.build.flash_size_bytes=0x100000
+wifi_slot.menu.eesz.1M64.build.flash_ld=eagle.flash.1m64.ld
+wifi_slot.menu.eesz.1M64.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.1M64.upload.maximum_size=958448
+wifi_slot.menu.eesz.1M64.build.rfcal_addr=0xFC000
+wifi_slot.menu.eesz.1M64.build.spiffs_start=0xEB000
+wifi_slot.menu.eesz.1M64.build.spiffs_end=0xFB000
+wifi_slot.menu.eesz.1M64.build.spiffs_blocksize=4096
+wifi_slot.menu.eesz.1M128=1M (128K SPIFFS)
+wifi_slot.menu.eesz.1M128.build.flash_size=1M
+wifi_slot.menu.eesz.1M128.build.flash_size_bytes=0x100000
+wifi_slot.menu.eesz.1M128.build.flash_ld=eagle.flash.1m128.ld
+wifi_slot.menu.eesz.1M128.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.1M128.upload.maximum_size=892912
+wifi_slot.menu.eesz.1M128.build.rfcal_addr=0xFC000
+wifi_slot.menu.eesz.1M128.build.spiffs_start=0xDB000
+wifi_slot.menu.eesz.1M128.build.spiffs_end=0xFB000
+wifi_slot.menu.eesz.1M128.build.spiffs_blocksize=4096
+wifi_slot.menu.eesz.1M144=1M (144K SPIFFS)
+wifi_slot.menu.eesz.1M144.build.flash_size=1M
+wifi_slot.menu.eesz.1M144.build.flash_size_bytes=0x100000
+wifi_slot.menu.eesz.1M144.build.flash_ld=eagle.flash.1m144.ld
+wifi_slot.menu.eesz.1M144.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.1M144.upload.maximum_size=876528
+wifi_slot.menu.eesz.1M144.build.rfcal_addr=0xFC000
+wifi_slot.menu.eesz.1M144.build.spiffs_start=0xD7000
+wifi_slot.menu.eesz.1M144.build.spiffs_end=0xFB000
+wifi_slot.menu.eesz.1M144.build.spiffs_blocksize=4096
+wifi_slot.menu.eesz.1M160=1M (160K SPIFFS)
+wifi_slot.menu.eesz.1M160.build.flash_size=1M
+wifi_slot.menu.eesz.1M160.build.flash_size_bytes=0x100000
+wifi_slot.menu.eesz.1M160.build.flash_ld=eagle.flash.1m160.ld
+wifi_slot.menu.eesz.1M160.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.1M160.upload.maximum_size=860144
+wifi_slot.menu.eesz.1M160.build.rfcal_addr=0xFC000
+wifi_slot.menu.eesz.1M160.build.spiffs_start=0xD3000
+wifi_slot.menu.eesz.1M160.build.spiffs_end=0xFB000
+wifi_slot.menu.eesz.1M160.build.spiffs_blocksize=4096
+wifi_slot.menu.eesz.1M192=1M (192K SPIFFS)
+wifi_slot.menu.eesz.1M192.build.flash_size=1M
+wifi_slot.menu.eesz.1M192.build.flash_size_bytes=0x100000
+wifi_slot.menu.eesz.1M192.build.flash_ld=eagle.flash.1m192.ld
+wifi_slot.menu.eesz.1M192.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.1M192.upload.maximum_size=827376
+wifi_slot.menu.eesz.1M192.build.rfcal_addr=0xFC000
+wifi_slot.menu.eesz.1M192.build.spiffs_start=0xCB000
+wifi_slot.menu.eesz.1M192.build.spiffs_end=0xFB000
+wifi_slot.menu.eesz.1M192.build.spiffs_blocksize=4096
+wifi_slot.menu.eesz.1M256=1M (256K SPIFFS)
+wifi_slot.menu.eesz.1M256.build.flash_size=1M
+wifi_slot.menu.eesz.1M256.build.flash_size_bytes=0x100000
+wifi_slot.menu.eesz.1M256.build.flash_ld=eagle.flash.1m256.ld
+wifi_slot.menu.eesz.1M256.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.1M256.upload.maximum_size=761840
+wifi_slot.menu.eesz.1M256.build.rfcal_addr=0xFC000
+wifi_slot.menu.eesz.1M256.build.spiffs_start=0xBB000
+wifi_slot.menu.eesz.1M256.build.spiffs_end=0xFB000
+wifi_slot.menu.eesz.1M256.build.spiffs_blocksize=4096
+wifi_slot.menu.eesz.1M512=1M (512K SPIFFS)
+wifi_slot.menu.eesz.1M512.build.flash_size=1M
+wifi_slot.menu.eesz.1M512.build.flash_size_bytes=0x100000
+wifi_slot.menu.eesz.1M512.build.flash_ld=eagle.flash.1m512.ld
+wifi_slot.menu.eesz.1M512.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.1M512.upload.maximum_size=499696
+wifi_slot.menu.eesz.1M512.build.rfcal_addr=0xFC000
+wifi_slot.menu.eesz.1M512.build.spiffs_start=0x7B000
+wifi_slot.menu.eesz.1M512.build.spiffs_end=0xFB000
+wifi_slot.menu.eesz.1M512.build.spiffs_blocksize=4096
+wifi_slot.menu.eesz.2M=2M (no SPIFFS)
+wifi_slot.menu.eesz.2M.build.flash_size=2M
+wifi_slot.menu.eesz.2M.build.flash_size_bytes=0x200000
+wifi_slot.menu.eesz.2M.build.flash_ld=eagle.flash.2m.ld
+wifi_slot.menu.eesz.2M.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.2M.upload.maximum_size=1044464
+wifi_slot.menu.eesz.2M.build.rfcal_addr=0x1FC000
+wifi_slot.menu.eesz.2M128=2M (128K SPIFFS)
+wifi_slot.menu.eesz.2M128.build.flash_size=2M
+wifi_slot.menu.eesz.2M128.build.flash_size_bytes=0x200000
+wifi_slot.menu.eesz.2M128.build.flash_ld=eagle.flash.2m128.ld
+wifi_slot.menu.eesz.2M128.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.2M128.upload.maximum_size=1044464
+wifi_slot.menu.eesz.2M128.build.rfcal_addr=0x1FC000
+wifi_slot.menu.eesz.2M128.build.spiffs_start=0x1E0000
+wifi_slot.menu.eesz.2M128.build.spiffs_end=0x1FB000
+wifi_slot.menu.eesz.2M128.build.spiffs_blocksize=4096
+wifi_slot.menu.eesz.2M256=2M (256K SPIFFS)
+wifi_slot.menu.eesz.2M256.build.flash_size=2M
+wifi_slot.menu.eesz.2M256.build.flash_size_bytes=0x200000
+wifi_slot.menu.eesz.2M256.build.flash_ld=eagle.flash.2m256.ld
+wifi_slot.menu.eesz.2M256.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.2M256.upload.maximum_size=1044464
+wifi_slot.menu.eesz.2M256.build.rfcal_addr=0x1FC000
+wifi_slot.menu.eesz.2M256.build.spiffs_start=0x1C0000
+wifi_slot.menu.eesz.2M256.build.spiffs_end=0x1FB000
+wifi_slot.menu.eesz.2M256.build.spiffs_blocksize=4096
+wifi_slot.menu.eesz.2M512=2M (512K SPIFFS)
+wifi_slot.menu.eesz.2M512.build.flash_size=2M
+wifi_slot.menu.eesz.2M512.build.flash_size_bytes=0x200000
+wifi_slot.menu.eesz.2M512.build.flash_ld=eagle.flash.2m512.ld
+wifi_slot.menu.eesz.2M512.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.2M512.upload.maximum_size=1044464
+wifi_slot.menu.eesz.2M512.build.rfcal_addr=0x1FC000
+wifi_slot.menu.eesz.2M512.build.spiffs_start=0x180000
+wifi_slot.menu.eesz.2M512.build.spiffs_end=0x1FB000
+wifi_slot.menu.eesz.2M512.build.spiffs_blocksize=8192
+wifi_slot.menu.eesz.2M1M=2M (1M SPIFFS)
+wifi_slot.menu.eesz.2M1M.build.flash_size=2M
+wifi_slot.menu.eesz.2M1M.build.flash_size_bytes=0x200000
+wifi_slot.menu.eesz.2M1M.build.flash_ld=eagle.flash.2m1m.ld
+wifi_slot.menu.eesz.2M1M.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.2M1M.upload.maximum_size=1044464
+wifi_slot.menu.eesz.2M1M.build.rfcal_addr=0x1FC000
+wifi_slot.menu.eesz.2M1M.build.spiffs_start=0x100000
+wifi_slot.menu.eesz.2M1M.build.spiffs_end=0x1FB000
+wifi_slot.menu.eesz.2M1M.build.spiffs_blocksize=8192
+wifi_slot.menu.ip.lm2f=v2 Lower Memory
+wifi_slot.menu.ip.lm2f.build.lwip_include=lwip2/include
+wifi_slot.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+wifi_slot.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+wifi_slot.menu.ip.hb2f=v2 Higher Bandwidth
+wifi_slot.menu.ip.hb2f.build.lwip_include=lwip2/include
+wifi_slot.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+wifi_slot.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+wifi_slot.menu.ip.lm2n=v2 Lower Memory (no features)
+wifi_slot.menu.ip.lm2n.build.lwip_include=lwip2/include
+wifi_slot.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+wifi_slot.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+wifi_slot.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+wifi_slot.menu.ip.hb2n.build.lwip_include=lwip2/include
+wifi_slot.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+wifi_slot.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+wifi_slot.menu.ip.lm6f=v2 IPv6 Lower Memory
+wifi_slot.menu.ip.lm6f.build.lwip_include=lwip2/include
+wifi_slot.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+wifi_slot.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+wifi_slot.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+wifi_slot.menu.ip.hb6f.build.lwip_include=lwip2/include
+wifi_slot.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+wifi_slot.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+wifi_slot.menu.ip.hb1=v1.4 Higher Bandwidth
+wifi_slot.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+wifi_slot.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+wifi_slot.menu.ip.src=v1.4 Compile from source
+wifi_slot.menu.ip.src.build.lwip_lib=-llwip_src
+wifi_slot.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+wifi_slot.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+wifi_slot.menu.dbg.Disabled=Disabled
+wifi_slot.menu.dbg.Disabled.build.debug_port=
+wifi_slot.menu.dbg.Serial=Serial
+wifi_slot.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+wifi_slot.menu.dbg.Serial1=Serial1
+wifi_slot.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+wifi_slot.menu.lvl.None____=None
+wifi_slot.menu.lvl.None____.build.debug_level=
+wifi_slot.menu.lvl.SSL=SSL
+wifi_slot.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+wifi_slot.menu.lvl.TLS_MEM=TLS_MEM
+wifi_slot.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+wifi_slot.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+wifi_slot.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+wifi_slot.menu.lvl.HTTP_SERVER=HTTP_SERVER
+wifi_slot.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+wifi_slot.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+wifi_slot.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+wifi_slot.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+wifi_slot.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+wifi_slot.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+wifi_slot.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+wifi_slot.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+wifi_slot.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+wifi_slot.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+wifi_slot.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+wifi_slot.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+wifi_slot.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifi_slot.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+wifi_slot.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+wifi_slot.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+wifi_slot.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+wifi_slot.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+wifi_slot.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifi_slot.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+wifi_slot.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifi_slot.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+wifi_slot.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifi_slot.menu.lvl.CORE=CORE
+wifi_slot.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+wifi_slot.menu.lvl.WIFI=WIFI
+wifi_slot.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+wifi_slot.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+wifi_slot.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+wifi_slot.menu.lvl.UPDATER=UPDATER
+wifi_slot.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+wifi_slot.menu.lvl.OTA=OTA
+wifi_slot.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+wifi_slot.menu.lvl.OOM=OOM
+wifi_slot.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+wifi_slot.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+wifi_slot.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+wifi_slot.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+wifi_slot.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+wifi_slot.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+wifi_slot.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+wifi_slot.menu.wipe.none=Only Sketch
+wifi_slot.menu.wipe.none.upload.erase_cmd=
+wifi_slot.menu.wipe.sdk=Sketch + WiFi Settings
+wifi_slot.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+wifi_slot.menu.wipe.all=All Flash Contents
+wifi_slot.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+wifi_slot.menu.baud.115200=115200
+wifi_slot.menu.baud.115200.upload.speed=115200
+wifi_slot.menu.baud.9600=9600
+wifi_slot.menu.baud.9600.upload.speed=9600
+wifi_slot.menu.baud.57600=57600
+wifi_slot.menu.baud.57600.upload.speed=57600
+wifi_slot.menu.baud.230400.linux=230400
+wifi_slot.menu.baud.230400.macosx=230400
+wifi_slot.menu.baud.230400.upload.speed=230400
+wifi_slot.menu.baud.256000.windows=256000
+wifi_slot.menu.baud.256000.upload.speed=256000
+wifi_slot.menu.baud.460800.linux=460800
+wifi_slot.menu.baud.460800.macosx=460800
+wifi_slot.menu.baud.460800.upload.speed=460800
+wifi_slot.menu.baud.512000.windows=512000
+wifi_slot.menu.baud.512000.upload.speed=512000
+wifi_slot.menu.baud.921600=921600
+wifi_slot.menu.baud.921600.upload.speed=921600
+
+##############################################################
+wiolink.name=Seeed Wio Link
+wiolink.build.board=ESP8266_WIO_LINK
+wiolink.build.variant=wiolink
+wiolink.upload.tool=esptool
+wiolink.upload.maximum_data_size=81920
+wiolink.upload.wait_for_upload_port=true
+wiolink.upload.erase_cmd=
+wiolink.serial.disableDTR=true
+wiolink.serial.disableRTS=true
+wiolink.build.mcu=esp8266
+wiolink.build.core=esp8266
+wiolink.build.spiffs_pagesize=256
+wiolink.build.debug_port=
+wiolink.build.debug_level=
+wiolink.menu.xtal.80=80 MHz
+wiolink.menu.xtal.80.build.f_cpu=80000000L
+wiolink.menu.xtal.160=160 MHz
+wiolink.menu.xtal.160.build.f_cpu=160000000L
+wiolink.menu.vt.flash=Flash
+wiolink.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+wiolink.menu.vt.heap=Heap
+wiolink.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+wiolink.menu.vt.iram=IRAM
+wiolink.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+wiolink.menu.exception.enabled=Enabled
+wiolink.menu.exception.enabled.build.exception_flags=-fexceptions
+wiolink.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+wiolink.menu.exception.disabled=Disabled
+wiolink.menu.exception.disabled.build.exception_flags=-fno-exceptions
+wiolink.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+wiolink.upload.resetmethod=nodemcu
+wiolink.build.flash_mode=qio
+wiolink.build.flash_freq=40
+wiolink.menu.eesz.4M=4M (no SPIFFS)
+wiolink.menu.eesz.4M.build.flash_size=4M
+wiolink.menu.eesz.4M.build.flash_size_bytes=0x400000
+wiolink.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+wiolink.menu.eesz.4M.build.spiffs_pagesize=256
+wiolink.menu.eesz.4M.upload.maximum_size=1044464
+wiolink.menu.eesz.4M.build.rfcal_addr=0x3FC000
+wiolink.menu.eesz.4M1M=4M (1M SPIFFS)
+wiolink.menu.eesz.4M1M.build.flash_size=4M
+wiolink.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+wiolink.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+wiolink.menu.eesz.4M1M.build.spiffs_pagesize=256
+wiolink.menu.eesz.4M1M.upload.maximum_size=1044464
+wiolink.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+wiolink.menu.eesz.4M1M.build.spiffs_start=0x300000
+wiolink.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+wiolink.menu.eesz.4M1M.build.spiffs_blocksize=8192
+wiolink.menu.eesz.4M2M=4M (2M SPIFFS)
+wiolink.menu.eesz.4M2M.build.flash_size=4M
+wiolink.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+wiolink.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+wiolink.menu.eesz.4M2M.build.spiffs_pagesize=256
+wiolink.menu.eesz.4M2M.upload.maximum_size=1044464
+wiolink.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+wiolink.menu.eesz.4M2M.build.spiffs_start=0x200000
+wiolink.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+wiolink.menu.eesz.4M2M.build.spiffs_blocksize=8192
+wiolink.menu.eesz.4M3M=4M (3M SPIFFS)
+wiolink.menu.eesz.4M3M.build.flash_size=4M
+wiolink.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+wiolink.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+wiolink.menu.eesz.4M3M.build.spiffs_pagesize=256
+wiolink.menu.eesz.4M3M.upload.maximum_size=1044464
+wiolink.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+wiolink.menu.eesz.4M3M.build.spiffs_start=0x100000
+wiolink.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+wiolink.menu.eesz.4M3M.build.spiffs_blocksize=8192
+wiolink.menu.ip.lm2f=v2 Lower Memory
+wiolink.menu.ip.lm2f.build.lwip_include=lwip2/include
+wiolink.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+wiolink.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+wiolink.menu.ip.hb2f=v2 Higher Bandwidth
+wiolink.menu.ip.hb2f.build.lwip_include=lwip2/include
+wiolink.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+wiolink.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+wiolink.menu.ip.lm2n=v2 Lower Memory (no features)
+wiolink.menu.ip.lm2n.build.lwip_include=lwip2/include
+wiolink.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+wiolink.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+wiolink.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+wiolink.menu.ip.hb2n.build.lwip_include=lwip2/include
+wiolink.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+wiolink.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+wiolink.menu.ip.lm6f=v2 IPv6 Lower Memory
+wiolink.menu.ip.lm6f.build.lwip_include=lwip2/include
+wiolink.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+wiolink.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+wiolink.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+wiolink.menu.ip.hb6f.build.lwip_include=lwip2/include
+wiolink.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+wiolink.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+wiolink.menu.ip.hb1=v1.4 Higher Bandwidth
+wiolink.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+wiolink.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+wiolink.menu.ip.src=v1.4 Compile from source
+wiolink.menu.ip.src.build.lwip_lib=-llwip_src
+wiolink.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+wiolink.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+wiolink.menu.dbg.Disabled=Disabled
+wiolink.menu.dbg.Disabled.build.debug_port=
+wiolink.menu.dbg.Serial=Serial
+wiolink.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+wiolink.menu.dbg.Serial1=Serial1
+wiolink.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+wiolink.menu.lvl.None____=None
+wiolink.menu.lvl.None____.build.debug_level=
+wiolink.menu.lvl.SSL=SSL
+wiolink.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+wiolink.menu.lvl.TLS_MEM=TLS_MEM
+wiolink.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+wiolink.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+wiolink.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+wiolink.menu.lvl.HTTP_SERVER=HTTP_SERVER
+wiolink.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+wiolink.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+wiolink.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+wiolink.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+wiolink.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+wiolink.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+wiolink.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+wiolink.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+wiolink.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+wiolink.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+wiolink.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+wiolink.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+wiolink.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wiolink.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+wiolink.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+wiolink.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+wiolink.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+wiolink.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+wiolink.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wiolink.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+wiolink.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wiolink.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+wiolink.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wiolink.menu.lvl.CORE=CORE
+wiolink.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+wiolink.menu.lvl.WIFI=WIFI
+wiolink.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+wiolink.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+wiolink.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+wiolink.menu.lvl.UPDATER=UPDATER
+wiolink.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+wiolink.menu.lvl.OTA=OTA
+wiolink.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+wiolink.menu.lvl.OOM=OOM
+wiolink.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+wiolink.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+wiolink.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+wiolink.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+wiolink.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+wiolink.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+wiolink.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+wiolink.menu.wipe.none=Only Sketch
+wiolink.menu.wipe.none.upload.erase_cmd=
+wiolink.menu.wipe.sdk=Sketch + WiFi Settings
+wiolink.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+wiolink.menu.wipe.all=All Flash Contents
+wiolink.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+wiolink.menu.baud.115200=115200
+wiolink.menu.baud.115200.upload.speed=115200
+wiolink.menu.baud.9600=9600
+wiolink.menu.baud.9600.upload.speed=9600
+wiolink.menu.baud.57600=57600
+wiolink.menu.baud.57600.upload.speed=57600
+wiolink.menu.baud.230400.linux=230400
+wiolink.menu.baud.230400.macosx=230400
+wiolink.menu.baud.230400.upload.speed=230400
+wiolink.menu.baud.256000.windows=256000
+wiolink.menu.baud.256000.upload.speed=256000
+wiolink.menu.baud.460800.linux=460800
+wiolink.menu.baud.460800.macosx=460800
+wiolink.menu.baud.460800.upload.speed=460800
+wiolink.menu.baud.512000.windows=512000
+wiolink.menu.baud.512000.upload.speed=512000
+wiolink.menu.baud.921600=921600
+wiolink.menu.baud.921600.upload.speed=921600
+
+##############################################################
+espectro.name=ESPectro Core
+espectro.build.board=ESP8266_ESPECTRO_CORE
+espectro.build.variant=espectro
+espectro.upload.tool=esptool
+espectro.upload.maximum_data_size=81920
+espectro.upload.wait_for_upload_port=true
+espectro.upload.erase_cmd=
+espectro.serial.disableDTR=true
+espectro.serial.disableRTS=true
+espectro.build.mcu=esp8266
+espectro.build.core=esp8266
+espectro.build.spiffs_pagesize=256
+espectro.build.debug_port=
+espectro.build.debug_level=
+espectro.menu.xtal.80=80 MHz
+espectro.menu.xtal.80.build.f_cpu=80000000L
+espectro.menu.xtal.160=160 MHz
+espectro.menu.xtal.160.build.f_cpu=160000000L
+espectro.menu.vt.flash=Flash
+espectro.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+espectro.menu.vt.heap=Heap
+espectro.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+espectro.menu.vt.iram=IRAM
+espectro.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+espectro.menu.exception.enabled=Enabled
+espectro.menu.exception.enabled.build.exception_flags=-fexceptions
+espectro.menu.exception.enabled.build.stdcpp_lib=-lstdc++
+espectro.menu.exception.disabled=Disabled
+espectro.menu.exception.disabled.build.exception_flags=-fno-exceptions
+espectro.menu.exception.disabled.build.stdcpp_lib=-lstdc++-nox
+espectro.upload.resetmethod=nodemcu
+espectro.build.flash_mode=dio
+espectro.build.flash_freq=40
+espectro.menu.eesz.4M=4M (no SPIFFS)
+espectro.menu.eesz.4M.build.flash_size=4M
+espectro.menu.eesz.4M.build.flash_size_bytes=0x400000
+espectro.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+espectro.menu.eesz.4M.build.spiffs_pagesize=256
+espectro.menu.eesz.4M.upload.maximum_size=1044464
+espectro.menu.eesz.4M.build.rfcal_addr=0x3FC000
+espectro.menu.eesz.4M1M=4M (1M SPIFFS)
+espectro.menu.eesz.4M1M.build.flash_size=4M
+espectro.menu.eesz.4M1M.build.flash_size_bytes=0x400000
+espectro.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+espectro.menu.eesz.4M1M.build.spiffs_pagesize=256
+espectro.menu.eesz.4M1M.upload.maximum_size=1044464
+espectro.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+espectro.menu.eesz.4M1M.build.spiffs_start=0x300000
+espectro.menu.eesz.4M1M.build.spiffs_end=0x3FB000
+espectro.menu.eesz.4M1M.build.spiffs_blocksize=8192
+espectro.menu.eesz.4M2M=4M (2M SPIFFS)
+espectro.menu.eesz.4M2M.build.flash_size=4M
+espectro.menu.eesz.4M2M.build.flash_size_bytes=0x400000
+espectro.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+espectro.menu.eesz.4M2M.build.spiffs_pagesize=256
+espectro.menu.eesz.4M2M.upload.maximum_size=1044464
+espectro.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+espectro.menu.eesz.4M2M.build.spiffs_start=0x200000
+espectro.menu.eesz.4M2M.build.spiffs_end=0x3FB000
+espectro.menu.eesz.4M2M.build.spiffs_blocksize=8192
+espectro.menu.eesz.4M3M=4M (3M SPIFFS)
+espectro.menu.eesz.4M3M.build.flash_size=4M
+espectro.menu.eesz.4M3M.build.flash_size_bytes=0x400000
+espectro.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+espectro.menu.eesz.4M3M.build.spiffs_pagesize=256
+espectro.menu.eesz.4M3M.upload.maximum_size=1044464
+espectro.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+espectro.menu.eesz.4M3M.build.spiffs_start=0x100000
+espectro.menu.eesz.4M3M.build.spiffs_end=0x3FB000
+espectro.menu.eesz.4M3M.build.spiffs_blocksize=8192
+espectro.menu.ip.lm2f=v2 Lower Memory
+espectro.menu.ip.lm2f.build.lwip_include=lwip2/include
+espectro.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+espectro.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espectro.menu.ip.hb2f=v2 Higher Bandwidth
+espectro.menu.ip.hb2f.build.lwip_include=lwip2/include
+espectro.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+espectro.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espectro.menu.ip.lm2n=v2 Lower Memory (no features)
+espectro.menu.ip.lm2n.build.lwip_include=lwip2/include
+espectro.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+espectro.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espectro.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+espectro.menu.ip.hb2n.build.lwip_include=lwip2/include
+espectro.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+espectro.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espectro.menu.ip.lm6f=v2 IPv6 Lower Memory
+espectro.menu.ip.lm6f.build.lwip_include=lwip2/include
+espectro.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+espectro.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espectro.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+espectro.menu.ip.hb6f.build.lwip_include=lwip2/include
+espectro.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+espectro.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espectro.menu.ip.hb1=v1.4 Higher Bandwidth
+espectro.menu.ip.hb1.build.lwip_lib=-llwip_gcc
+espectro.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
+espectro.menu.ip.src=v1.4 Compile from source
+espectro.menu.ip.src.build.lwip_lib=-llwip_src
+espectro.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
+espectro.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
+espectro.menu.dbg.Disabled=Disabled
+espectro.menu.dbg.Disabled.build.debug_port=
+espectro.menu.dbg.Serial=Serial
+espectro.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+espectro.menu.dbg.Serial1=Serial1
+espectro.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+espectro.menu.lvl.None____=None
+espectro.menu.lvl.None____.build.debug_level=
+espectro.menu.lvl.SSL=SSL
+espectro.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+espectro.menu.lvl.TLS_MEM=TLS_MEM
+espectro.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+espectro.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+espectro.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+espectro.menu.lvl.HTTP_SERVER=HTTP_SERVER
+espectro.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+espectro.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+espectro.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+espectro.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+espectro.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+espectro.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+espectro.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+espectro.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+espectro.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espectro.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+espectro.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espectro.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+espectro.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espectro.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+espectro.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espectro.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+espectro.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espectro.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+espectro.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espectro.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espectro.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espectro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espectro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espectro.menu.lvl.CORE=CORE
+espectro.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+espectro.menu.lvl.WIFI=WIFI
+espectro.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+espectro.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+espectro.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+espectro.menu.lvl.UPDATER=UPDATER
+espectro.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+espectro.menu.lvl.OTA=OTA
+espectro.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+espectro.menu.lvl.OOM=OOM
+espectro.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+espectro.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+espectro.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+espectro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
+espectro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
+espectro.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+espectro.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+espectro.menu.wipe.none=Only Sketch
+espectro.menu.wipe.none.upload.erase_cmd=
+espectro.menu.wipe.sdk=Sketch + WiFi Settings
+espectro.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+espectro.menu.wipe.all=All Flash Contents
+espectro.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+espectro.menu.baud.115200=115200
+espectro.menu.baud.115200.upload.speed=115200
+espectro.menu.baud.9600=9600
+espectro.menu.baud.9600.upload.speed=9600
+espectro.menu.baud.57600=57600
+espectro.menu.baud.57600.upload.speed=57600
+espectro.menu.baud.230400.linux=230400
+espectro.menu.baud.230400.macosx=230400
+espectro.menu.baud.230400.upload.speed=230400
+espectro.menu.baud.256000.windows=256000
+espectro.menu.baud.256000.upload.speed=256000
+espectro.menu.baud.460800.linux=460800
+espectro.menu.baud.460800.macosx=460800
+espectro.menu.baud.460800.upload.speed=460800
+espectro.menu.baud.512000.windows=512000
+espectro.menu.baud.512000.upload.speed=512000
+espectro.menu.baud.921600=921600
+espectro.menu.baud.921600.upload.speed=921600
+
diff --git a/arduino/version 2.4.1/platform.txt b/arduino/version 2.5.0/platform.txt
similarity index 65%
rename from arduino/version 2.4.1/platform.txt
rename to arduino/version 2.5.0/platform.txt
index 2ddeb0065f70..39988668aa90 100644
--- a/arduino/version 2.4.1/platform.txt
+++ b/arduino/version 2.5.0/platform.txt
@@ -5,11 +5,12 @@
# For more info:
# https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification
-name=ESP8266 Modules
-version=2.4.1
+name=ESP8266 Boards (2.5.0-beta2)
+version=2.5.0-beta2
+runtime.tools.signing={runtime.platform.path}/tools/signing.py
compiler.warning_flags=-w
compiler.warning_flags.none=-w
@@ -21,6 +22,13 @@ build.lwip_lib=-llwip_gcc
build.lwip_include=lwip/include
build.lwip_flags=-DLWIP_OPEN_SRC
+build.vtable_flags=-DVTABLES_IN_FLASH
+
+#build.exception_flags=-fexceptions
+build.exception_flags=-fno-exceptions
+#build.stdcpp_lib=-lstdc++
+build.stdcpp_lib=-lstdc++-nox
+
#build.float=-u _printf_float -u _scanf_float
build.float=
build.led=
@@ -31,18 +39,18 @@ compiler.libc.path={runtime.platform.path}/tools/sdk/libc/xtensa-lx106-elf
compiler.cpreprocessor.flags=-D__ets__ -DICACHE_FLASH -U__STRICT_ANSI__ "-I{compiler.sdk.path}/include" "-I{compiler.sdk.path}/{build.lwip_include}" "-I{compiler.libc.path}/include" "-I{build.path}/core"
compiler.c.cmd=xtensa-lx106-elf-gcc
-compiler.c.flags=-c {compiler.warning_flags} -Os -g -Wpointer-arith -Wno-implicit-function-declaration -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -falign-functions=4 -MMD -std=gnu99 -ffunction-sections -fdata-sections
+compiler.c.flags=-c {compiler.warning_flags} -Os -g -Wpointer-arith -Wno-implicit-function-declaration -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -falign-functions=4 -MMD -std=gnu99 {build.exception_flags} -ffunction-sections -fdata-sections {build.exception_flags}
compiler.S.cmd=xtensa-lx106-elf-gcc
compiler.S.flags=-c -g -x assembler-with-cpp -MMD -mlongcalls
-compiler.c.elf.flags=-g {compiler.warning_flags} -Os -nostdlib -Wl,--no-check-sections -u call_user_start {build.float} -Wl,-static "-L{compiler.sdk.path}/lib" "-L{compiler.sdk.path}/ld" "-L{compiler.libc.path}/lib" "-T{build.flash_ld}" -Wl,--gc-sections -Wl,-wrap,system_restart_local -Wl,-wrap,spi_flash_read
+compiler.c.elf.flags=-g {compiler.warning_flags} -Os -nostdlib -Wl,--no-check-sections -u app_entry {build.float} -Wl,-static "-L{compiler.sdk.path}/lib" "-L{compiler.sdk.path}/ld" "-L{compiler.libc.path}/lib" "-T{build.flash_ld}" -Wl,--gc-sections -Wl,-wrap,system_restart_local -Wl,-wrap,spi_flash_read
compiler.c.elf.cmd=xtensa-lx106-elf-gcc
-compiler.c.elf.libs=-lhal -lphy -lpp -lnet80211 {build.lwip_lib} -lwpa -lcrypto -lmain -lwps -laxtls -lespnow -lsmartconfig -lairkiss -lwpa2 -lstdc++ -lm -lc -lgcc
+compiler.c.elf.libs=-lhal -lphy -lpp -lnet80211 {build.lwip_lib} -lwpa -lcrypto -lmain -lwps -lbearssl -laxtls -lespnow -lsmartconfig -lairkiss -lwpa2 {build.stdcpp_lib} -lm -lc -lgcc
compiler.cpp.cmd=xtensa-lx106-elf-g++
-compiler.cpp.flags=-c {compiler.warning_flags} -Os -g -mlongcalls -mtext-section-literals -fno-exceptions -fno-rtti -falign-functions=4 -std=c++11 -MMD -ffunction-sections -fdata-sections
+compiler.cpp.flags=-c {compiler.warning_flags} -Os -g -mlongcalls -mtext-section-literals -fno-rtti -falign-functions=4 -std=c++11 -MMD -ffunction-sections -fdata-sections {build.exception_flags}
compiler.as.cmd=xtensa-lx106-elf-as
@@ -71,12 +79,18 @@ compiler.elf2hex.extra_flags=
## generate file with git version number
## needs bash, git, and echo
+recipe.hooks.core.prebuild.1.pattern=python "{runtime.tools.signing}" --mode header --publickey "{build.source.path}/public.key" --out "{build.path}/core/Updater_Signing.h"
+
## windows-compatible version without git
+recipe.hooks.core.prebuild.1.pattern.windows=cmd.exe /c rem cannot sign on windows
+## Build the app.ld linker file
+recipe.hooks.linking.prelink.1.pattern="{compiler.path}{compiler.c.cmd}" -CC -E -P {build.vtable_flags} "{runtime.platform.path}/tools/sdk/ld/eagle.app.v6.common.ld.h" -o "{build.path}/local.eagle.app.v6.common.ld"
+
## Compile c files
recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.c.flags} -DF_CPU={build.f_cpu} {build.lwip_flags} {build.debug_port} {build.debug_level} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" {build.led} {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"
@@ -87,10 +101,10 @@ recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpreprocessor
recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.S.flags} -DF_CPU={build.f_cpu} {build.lwip_flags} {build.debug_port} {build.debug_level} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" {build.led} {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"
## Create archives
-recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{build.path}/arduino.ar" "{object_file}"
+recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{archive_file_path}" "{object_file}"
## Combine gc-sections, archives, and objects
-recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" -Wl,--start-group {object_files} "{build.path}/arduino.ar" {compiler.c.elf.libs} -Wl,--end-group "-L{build.path}"
+recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" -Wl,-Map "-Wl,{build.path}/{build.project_name}.map" {compiler.c.elf.flags} {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" -Wl,--start-group {object_files} "{archive_file_path}" {compiler.c.elf.libs} -Wl,--end-group "-L{build.path}"
## Create eeprom
recipe.objcopy.eep.pattern=
@@ -98,7 +112,12 @@ recipe.objcopy.eep.pattern=
## Create hex
#recipe.objcopy.hex.pattern="{compiler.path}{compiler.elf2hex.cmd}" {compiler.elf2hex.flags} {compiler.elf2hex.extra_flags} "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.hex"
-recipe.objcopy.hex.pattern="{runtime.tools.esptool.path}/{compiler.esptool.cmd}" -eo "{runtime.platform.path}/bootloaders/eboot/eboot.elf" -bo "{build.path}/{build.project_name}.bin" -bm {build.flash_mode} -bf {build.flash_freq} -bz {build.flash_size} -bs .text -bp 4096 -ec -eo "{build.path}/{build.project_name}.elf" -bs .irom0.text -bs .text -bs .data -bs .rodata -bc -ec
+recipe.objcopy.hex.1.pattern="{runtime.tools.esptool.path}/{compiler.esptool.cmd}" -eo "{runtime.platform.path}/bootloaders/eboot/eboot.elf" -bo "{build.path}/{build.project_name}.bin" -bm {build.flash_mode} -bf {build.flash_freq} -bz {build.flash_size} -bs .text -bp 4096 -ec -eo "{build.path}/{build.project_name}.elf" -bs .irom0.text -bs .text -bs .data -bs .rodata -bc -ec
+recipe.objcopy.hex.2.pattern=python "{runtime.tools.signing}" --mode sign --privatekey "{build.source.path}/private.key" --bin "{build.path}/{build.project_name}.bin" --out "{build.path}/{build.project_name}.bin.signed"
+
+# No signing on Windows
+recipe.objcopy.hex.1.pattern.windows="{runtime.tools.esptool.path}/{compiler.esptool.cmd}" -eo "{runtime.platform.path}/bootloaders/eboot/eboot.elf" -bo "{build.path}/{build.project_name}.bin" -bm {build.flash_mode} -bf {build.flash_freq} -bz {build.flash_size} -bs .text -bp 4096 -ec -eo "{build.path}/{build.project_name}.elf" -bs .irom0.text -bs .text -bs .data -bs .rodata -bc -ec
+recipe.objcopy.hex.2.pattern.windows=
## Save hex
recipe.output.tmp_file={build.project_name}.bin
@@ -121,7 +140,7 @@ tools.esptool.network_cmd.windows=python.exe
tools.esptool.upload.protocol=esp
tools.esptool.upload.params.verbose=-vv
tools.esptool.upload.params.quiet=
-tools.esptool.upload.pattern="{path}/{cmd}" {upload.verbose} -cd {upload.resetmethod} -cb {upload.speed} -cp "{serial.port}" {upload.erase_cmd} -ca 0x00000 -cf "{build.path}/{build.project_name}.bin"
+tools.esptool.upload.pattern="{path}/{cmd}" {upload.verbose} -cd {upload.resetmethod} -cb {upload.speed} -cp "{serial.port}" {upload.erase_cmd} -ca 0x00000 -cf "{build.path}/{build.project_name}.bin"
tools.esptool.upload.network_pattern="{network_cmd}" "{runtime.platform.path}/tools/espota.py" -i "{serial.port}" -p "{network.port}" "--auth={network.password}" -f "{build.path}/{build.project_name}.bin"
tools.mkspiffs.cmd=mkspiffs
diff --git a/lib/Adafruit-GFX-Library-1.2.9/.gitignore b/lib/Adafruit-GFX-Library-1.2.9/.gitignore
new file mode 100644
index 000000000000..469bb73707fd
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/.gitignore
@@ -0,0 +1,6 @@
+default.vim
+fontconvert/fontconvert
+# Our handy .gitignore for automation ease
+Doxyfile*
+doxygen_sqlite3.db
+html
\ No newline at end of file
diff --git a/lib/Adafruit-GFX-Library-1.2.9/.travis.yml b/lib/Adafruit-GFX-Library-1.2.9/.travis.yml
new file mode 100644
index 000000000000..a856c6db677e
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/.travis.yml
@@ -0,0 +1,27 @@
+language: c
+sudo: false
+cache:
+ directories:
+ - ~/arduino_ide
+ - ~/.arduino15/packages/
+git:
+ depth: false
+ quiet: true
+env:
+ global:
+ - ARDUINO_IDE_VERSION="1.8.5"
+ - PRETTYNAME="Adafruit GFX Library"
+
+before_install:
+ - source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/install.sh)
+
+install:
+ - arduino --install-library "Adafruit ILI9341"
+
+script:
+ - build_main_platforms
+
+# Generate and deploy documentation
+after_success:
+ - source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/library_check.sh)
+ - source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/doxy_gen_and_deploy.sh)
\ No newline at end of file
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Adafruit_GFX.cpp b/lib/Adafruit-GFX-Library-1.2.9/Adafruit_GFX.cpp
new file mode 100644
index 000000000000..c431a17c8606
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Adafruit_GFX.cpp
@@ -0,0 +1,1962 @@
+/*
+This is the core graphics library for all our displays, providing a common
+set of graphics primitives (points, lines, circles, etc.). It needs to be
+paired with a hardware-specific library for each display device we carry
+(to handle the lower-level functions).
+
+Adafruit invests time and resources providing this open source code, please
+support Adafruit & open-source hardware by purchasing products from Adafruit!
+
+Copyright (c) 2013 Adafruit Industries. 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 "Adafruit_GFX.h"
+#include "glcdfont.c"
+#ifdef __AVR__
+ #include
+#elif defined(ESP8266) || defined(ESP32)
+ #include
+#endif
+
+// Many (but maybe not all) non-AVR board installs define macros
+// for compatibility with existing PROGMEM-reading AVR code.
+// Do our own checks and defines here for good measure...
+
+#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
+
+// Pointers are a peculiar case...typically 16-bit on AVR boards,
+// 32 bits elsewhere. Try to accommodate both...
+
+#if !defined(__INT_MAX__) || (__INT_MAX__ > 0xFFFF)
+ #define pgm_read_pointer(addr) ((void *)pgm_read_dword(addr))
+#else
+ #define pgm_read_pointer(addr) ((void *)pgm_read_word(addr))
+#endif
+
+#ifndef min
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+
+#ifndef _swap_int16_t
+#define _swap_int16_t(a, b) { int16_t t = a; a = b; b = t; }
+#endif
+
+/**************************************************************************/
+/*!
+ @brief Instatiate a GFX context for graphics! Can only be done by a superclass
+ @param w Display width, in pixels
+ @param h Display height, in pixels
+*/
+/**************************************************************************/
+Adafruit_GFX::Adafruit_GFX(int16_t w, int16_t h):
+WIDTH(w), HEIGHT(h)
+{
+ _width = WIDTH;
+ _height = HEIGHT;
+ rotation = 0;
+ cursor_y = cursor_x = 0;
+ textsize = 1;
+ textcolor = textbgcolor = 0xFFFF;
+ wrap = true;
+ _cp437 = false;
+ gfxFont = NULL;
+}
+
+/**************************************************************************/
+/*!
+ @brief Write a line. Bresenham's algorithm - thx wikpedia
+ @param x0 Start point x coordinate
+ @param y0 Start point y coordinate
+ @param x1 End point x coordinate
+ @param y1 End point y coordinate
+ @param color 16-bit 5-6-5 Color to draw with
+*/
+/**************************************************************************/
+void Adafruit_GFX::writeLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
+ uint16_t color) {
+ int16_t steep = abs(y1 - y0) > abs(x1 - x0);
+ if (steep) {
+ _swap_int16_t(x0, y0);
+ _swap_int16_t(x1, y1);
+ }
+
+ if (x0 > x1) {
+ _swap_int16_t(x0, x1);
+ _swap_int16_t(y0, y1);
+ }
+
+ int16_t dx, dy;
+ dx = x1 - x0;
+ dy = abs(y1 - y0);
+
+ int16_t err = dx / 2;
+ int16_t ystep;
+
+ if (y0 < y1) {
+ ystep = 1;
+ } else {
+ ystep = -1;
+ }
+
+ for (; x0<=x1; x0++) {
+ if (steep) {
+ writePixel(y0, x0, color);
+ } else {
+ writePixel(x0, y0, color);
+ }
+ err -= dy;
+ if (err < 0) {
+ y0 += ystep;
+ err += dx;
+ }
+ }
+}
+
+/**************************************************************************/
+/*!
+ @brief Start a display-writing routine, overwrite in subclasses.
+*/
+/**************************************************************************/
+void Adafruit_GFX::startWrite(){
+}
+
+/**************************************************************************/
+/*!
+ @brief Write a pixel, overwrite in subclasses if startWrite is defined!
+ @param x x coordinate
+ @param y y coordinate
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void Adafruit_GFX::writePixel(int16_t x, int16_t y, uint16_t color){
+ drawPixel(x, y, color);
+}
+
+/**************************************************************************/
+/*!
+ @brief Write a perfectly vertical line, overwrite in subclasses if startWrite is defined!
+ @param x Top-most x coordinate
+ @param y Top-most y coordinate
+ @param h Height in pixels
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void Adafruit_GFX::writeFastVLine(int16_t x, int16_t y,
+ int16_t h, uint16_t color) {
+ // Overwrite in subclasses if startWrite is defined!
+ // Can be just writeLine(x, y, x, y+h-1, color);
+ // or writeFillRect(x, y, 1, h, color);
+ drawFastVLine(x, y, h, color);
+}
+
+/**************************************************************************/
+/*!
+ @brief Write a perfectly horizontal line, overwrite in subclasses if startWrite is defined!
+ @param x Left-most x coordinate
+ @param y Left-most y coordinate
+ @param w Width in pixels
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void Adafruit_GFX::writeFastHLine(int16_t x, int16_t y,
+ int16_t w, uint16_t color) {
+ // Overwrite in subclasses if startWrite is defined!
+ // Example: writeLine(x, y, x+w-1, y, color);
+ // or writeFillRect(x, y, w, 1, color);
+ drawFastHLine(x, y, w, color);
+}
+
+/**************************************************************************/
+/*!
+ @brief Write a rectangle completely with one color, overwrite in subclasses if startWrite is defined!
+ @param x Top left corner x coordinate
+ @param y Top left corner y coordinate
+ @param w Width in pixels
+ @param h Height in pixels
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void Adafruit_GFX::writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h,
+ uint16_t color) {
+ // Overwrite in subclasses if desired!
+ fillRect(x,y,w,h,color);
+}
+
+/**************************************************************************/
+/*!
+ @brief End a display-writing routine, overwrite in subclasses if startWrite is defined!
+*/
+/**************************************************************************/
+void Adafruit_GFX::endWrite(){
+}
+
+/**************************************************************************/
+/*!
+ @brief Draw a perfectly vertical line (this is often optimized in a subclass!)
+ @param x Top-most x coordinate
+ @param y Top-most y coordinate
+ @param h Height in pixels
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void Adafruit_GFX::drawFastVLine(int16_t x, int16_t y,
+ int16_t h, uint16_t color) {
+ startWrite();
+ writeLine(x, y, x, y+h-1, color);
+ endWrite();
+}
+
+/**************************************************************************/
+/*!
+ @brief Draw a perfectly horizontal line (this is often optimized in a subclass!)
+ @param x Left-most x coordinate
+ @param y Left-most y coordinate
+ @param w Width in pixels
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void Adafruit_GFX::drawFastHLine(int16_t x, int16_t y,
+ int16_t w, uint16_t color) {
+ startWrite();
+ writeLine(x, y, x+w-1, y, color);
+ endWrite();
+}
+
+/**************************************************************************/
+/*!
+ @brief Fill a rectangle completely with one color. Update in subclasses if desired!
+ @param x Top left corner x coordinate
+ @param y Top left corner y coordinate
+ @param w Width in pixels
+ @param h Height in pixels
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void Adafruit_GFX::fillRect(int16_t x, int16_t y, int16_t w, int16_t h,
+ uint16_t color) {
+ startWrite();
+ for (int16_t i=x; i y1) _swap_int16_t(y0, y1);
+ drawFastVLine(x0, y0, y1 - y0 + 1, color);
+ } else if(y0 == y1){
+ if(x0 > x1) _swap_int16_t(x0, x1);
+ drawFastHLine(x0, y0, x1 - x0 + 1, color);
+ } else {
+ startWrite();
+ writeLine(x0, y0, x1, y1, color);
+ endWrite();
+ }
+}
+
+/**************************************************************************/
+/*!
+ @brief Draw a circle outline
+ @param x0 Center-point x coordinate
+ @param y0 Center-point y coordinate
+ @param r Radius of circle
+ @param color 16-bit 5-6-5 Color to draw with
+*/
+/**************************************************************************/
+void Adafruit_GFX::drawCircle(int16_t x0, int16_t y0, int16_t r,
+ uint16_t color) {
+ int16_t f = 1 - r;
+ int16_t ddF_x = 1;
+ int16_t ddF_y = -2 * r;
+ int16_t x = 0;
+ int16_t y = r;
+
+ startWrite();
+ writePixel(x0 , y0+r, color);
+ writePixel(x0 , y0-r, color);
+ writePixel(x0+r, y0 , color);
+ writePixel(x0-r, y0 , color);
+
+ while (x= 0) {
+ y--;
+ ddF_y += 2;
+ f += ddF_y;
+ }
+ x++;
+ ddF_x += 2;
+ f += ddF_x;
+
+ writePixel(x0 + x, y0 + y, color);
+ writePixel(x0 - x, y0 + y, color);
+ writePixel(x0 + x, y0 - y, color);
+ writePixel(x0 - x, y0 - y, color);
+ writePixel(x0 + y, y0 + x, color);
+ writePixel(x0 - y, y0 + x, color);
+ writePixel(x0 + y, y0 - x, color);
+ writePixel(x0 - y, y0 - x, color);
+ }
+ endWrite();
+}
+
+/**************************************************************************/
+/*!
+ @brief Quarter-circle drawer, used to do circles and roundrects
+ @param x0 Center-point x coordinate
+ @param y0 Center-point y coordinate
+ @param r Radius of circle
+ @param cornername Mask bit #1 or bit #2 to indicate which quarters of the circle we're doing
+ @param color 16-bit 5-6-5 Color to draw with
+*/
+/**************************************************************************/
+void Adafruit_GFX::drawCircleHelper( int16_t x0, int16_t y0,
+ int16_t r, uint8_t cornername, uint16_t color) {
+ int16_t f = 1 - r;
+ int16_t ddF_x = 1;
+ int16_t ddF_y = -2 * r;
+ int16_t x = 0;
+ int16_t y = r;
+
+ while (x= 0) {
+ y--;
+ ddF_y += 2;
+ f += ddF_y;
+ }
+ x++;
+ ddF_x += 2;
+ f += ddF_x;
+ if (cornername & 0x4) {
+ writePixel(x0 + x, y0 + y, color);
+ writePixel(x0 + y, y0 + x, color);
+ }
+ if (cornername & 0x2) {
+ writePixel(x0 + x, y0 - y, color);
+ writePixel(x0 + y, y0 - x, color);
+ }
+ if (cornername & 0x8) {
+ writePixel(x0 - y, y0 + x, color);
+ writePixel(x0 - x, y0 + y, color);
+ }
+ if (cornername & 0x1) {
+ writePixel(x0 - y, y0 - x, color);
+ writePixel(x0 - x, y0 - y, color);
+ }
+ }
+}
+
+/**************************************************************************/
+/*!
+ @brief Draw a circle with filled color
+ @param x0 Center-point x coordinate
+ @param y0 Center-point y coordinate
+ @param r Radius of circle
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void Adafruit_GFX::fillCircle(int16_t x0, int16_t y0, int16_t r,
+ uint16_t color) {
+ startWrite();
+ writeFastVLine(x0, y0-r, 2*r+1, color);
+ fillCircleHelper(x0, y0, r, 3, 0, color);
+ endWrite();
+}
+
+
+/**************************************************************************/
+/*!
+ @brief Quarter-circle drawer with fill, used to do circles and roundrects
+ @param x0 Center-point x coordinate
+ @param y0 Center-point y coordinate
+ @param r Radius of circle
+ @param cornername Mask bit #1 or bit #2 to indicate which quarters of the circle we're doing
+ @param delta Offset from center-point, used for round-rects
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void Adafruit_GFX::fillCircleHelper(int16_t x0, int16_t y0, int16_t r,
+ uint8_t cornername, int16_t delta, uint16_t color) {
+
+ int16_t f = 1 - r;
+ int16_t ddF_x = 1;
+ int16_t ddF_y = -2 * r;
+ int16_t x = 0;
+ int16_t y = r;
+
+ while (x= 0) {
+ y--;
+ ddF_y += 2;
+ f += ddF_y;
+ }
+ x++;
+ ddF_x += 2;
+ f += ddF_x;
+
+ if (cornername & 0x1) {
+ writeFastVLine(x0+x, y0-y, 2*y+1+delta, color);
+ writeFastVLine(x0+y, y0-x, 2*x+1+delta, color);
+ }
+ if (cornername & 0x2) {
+ writeFastVLine(x0-x, y0-y, 2*y+1+delta, color);
+ writeFastVLine(x0-y, y0-x, 2*x+1+delta, color);
+ }
+ }
+}
+
+/**************************************************************************/
+/*!
+ @brief Draw a rectangle with no fill color
+ @param x Top left corner x coordinate
+ @param y Top left corner y coordinate
+ @param w Width in pixels
+ @param h Height in pixels
+ @param color 16-bit 5-6-5 Color to draw with
+*/
+/**************************************************************************/
+void Adafruit_GFX::drawRect(int16_t x, int16_t y, int16_t w, int16_t h,
+ uint16_t color) {
+ startWrite();
+ writeFastHLine(x, y, w, color);
+ writeFastHLine(x, y+h-1, w, color);
+ writeFastVLine(x, y, h, color);
+ writeFastVLine(x+w-1, y, h, color);
+ endWrite();
+}
+
+/**************************************************************************/
+/*!
+ @brief Draw a rounded rectangle with no fill color
+ @param x Top left corner x coordinate
+ @param y Top left corner y coordinate
+ @param w Width in pixels
+ @param h Height in pixels
+ @param r Radius of corner rounding
+ @param color 16-bit 5-6-5 Color to draw with
+*/
+/**************************************************************************/
+void Adafruit_GFX::drawRoundRect(int16_t x, int16_t y, int16_t w,
+ int16_t h, int16_t r, uint16_t color) {
+ // smarter version
+ startWrite();
+ writeFastHLine(x+r , y , w-2*r, color); // Top
+ writeFastHLine(x+r , y+h-1, w-2*r, color); // Bottom
+ writeFastVLine(x , y+r , h-2*r, color); // Left
+ writeFastVLine(x+w-1, y+r , h-2*r, color); // Right
+ // draw four corners
+ drawCircleHelper(x+r , y+r , r, 1, color);
+ drawCircleHelper(x+w-r-1, y+r , r, 2, color);
+ drawCircleHelper(x+w-r-1, y+h-r-1, r, 4, color);
+ drawCircleHelper(x+r , y+h-r-1, r, 8, color);
+ endWrite();
+}
+
+/**************************************************************************/
+/*!
+ @brief Draw a rounded rectangle with fill color
+ @param x Top left corner x coordinate
+ @param y Top left corner y coordinate
+ @param w Width in pixels
+ @param h Height in pixels
+ @param r Radius of corner rounding
+ @param color 16-bit 5-6-5 Color to draw/fill with
+*/
+/**************************************************************************/
+void Adafruit_GFX::fillRoundRect(int16_t x, int16_t y, int16_t w,
+ int16_t h, int16_t r, uint16_t color) {
+ // smarter version
+ startWrite();
+ writeFillRect(x+r, y, w-2*r, h, color);
+
+ // draw four corners
+ fillCircleHelper(x+w-r-1, y+r, r, 1, h-2*r-1, color);
+ fillCircleHelper(x+r , y+r, r, 2, h-2*r-1, color);
+ endWrite();
+}
+
+/**************************************************************************/
+/*!
+ @brief Draw a triangle with no fill color
+ @param x0 Vertex #0 x coordinate
+ @param y0 Vertex #0 y coordinate
+ @param x1 Vertex #1 x coordinate
+ @param y1 Vertex #1 y coordinate
+ @param x2 Vertex #2 x coordinate
+ @param y2 Vertex #2 y coordinate
+ @param color 16-bit 5-6-5 Color to draw with
+*/
+/**************************************************************************/
+void Adafruit_GFX::drawTriangle(int16_t x0, int16_t y0,
+ int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color) {
+ drawLine(x0, y0, x1, y1, color);
+ drawLine(x1, y1, x2, y2, color);
+ drawLine(x2, y2, x0, y0, color);
+}
+
+/**************************************************************************/
+/*!
+ @brief Draw a triangle with color-fill
+ @param x0 Vertex #0 x coordinate
+ @param y0 Vertex #0 y coordinate
+ @param x1 Vertex #1 x coordinate
+ @param y1 Vertex #1 y coordinate
+ @param x2 Vertex #2 x coordinate
+ @param y2 Vertex #2 y coordinate
+ @param color 16-bit 5-6-5 Color to fill/draw with
+*/
+/**************************************************************************/
+void Adafruit_GFX::fillTriangle(int16_t x0, int16_t y0,
+ int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color) {
+
+ int16_t a, b, y, last;
+
+ // Sort coordinates by Y order (y2 >= y1 >= y0)
+ if (y0 > y1) {
+ _swap_int16_t(y0, y1); _swap_int16_t(x0, x1);
+ }
+ if (y1 > y2) {
+ _swap_int16_t(y2, y1); _swap_int16_t(x2, x1);
+ }
+ if (y0 > y1) {
+ _swap_int16_t(y0, y1); _swap_int16_t(x0, x1);
+ }
+
+ startWrite();
+ if(y0 == y2) { // Handle awkward all-on-same-line case as its own thing
+ a = b = x0;
+ if(x1 < a) a = x1;
+ else if(x1 > b) b = x1;
+ if(x2 < a) a = x2;
+ else if(x2 > b) b = x2;
+ writeFastHLine(a, y0, b-a+1, color);
+ endWrite();
+ return;
+ }
+
+ int16_t
+ dx01 = x1 - x0,
+ dy01 = y1 - y0,
+ dx02 = x2 - x0,
+ dy02 = y2 - y0,
+ dx12 = x2 - x1,
+ dy12 = y2 - y1;
+ int32_t
+ sa = 0,
+ sb = 0;
+
+ // For upper part of triangle, find scanline crossings for segments
+ // 0-1 and 0-2. If y1=y2 (flat-bottomed triangle), the scanline y1
+ // is included here (and second loop will be skipped, avoiding a /0
+ // error there), otherwise scanline y1 is skipped here and handled
+ // in the second loop...which also avoids a /0 error here if y0=y1
+ // (flat-topped triangle).
+ if(y1 == y2) last = y1; // Include y1 scanline
+ else last = y1-1; // Skip it
+
+ for(y=y0; y<=last; y++) {
+ a = x0 + sa / dy01;
+ b = x0 + sb / dy02;
+ sa += dx01;
+ sb += dx02;
+ /* longhand:
+ a = x0 + (x1 - x0) * (y - y0) / (y1 - y0);
+ b = x0 + (x2 - x0) * (y - y0) / (y2 - y0);
+ */
+ if(a > b) _swap_int16_t(a,b);
+ writeFastHLine(a, y, b-a+1, color);
+ }
+
+ // For lower part of triangle, find scanline crossings for segments
+ // 0-2 and 1-2. This loop is skipped if y1=y2.
+ sa = dx12 * (y - y1);
+ sb = dx02 * (y - y0);
+ for(; y<=y2; y++) {
+ a = x1 + sa / dy12;
+ b = x0 + sb / dy02;
+ sa += dx12;
+ sb += dx02;
+ /* longhand:
+ a = x1 + (x2 - x1) * (y - y1) / (y2 - y1);
+ b = x0 + (x2 - x0) * (y - y0) / (y2 - y0);
+ */
+ if(a > b) _swap_int16_t(a,b);
+ writeFastHLine(a, y, b-a+1, color);
+ }
+ endWrite();
+}
+
+// BITMAP / XBITMAP / GRAYSCALE / RGB BITMAP FUNCTIONS ---------------------
+
+/**************************************************************************/
+/*!
+ @brief Draw a PROGMEM-resident 1-bit image at the specified (x,y) position, using the specified foreground color (unset bits are transparent).
+ @param x Top left corner x coordinate
+ @param y Top left corner y coordinate
+ @param bitmap byte array with monochrome bitmap
+ @param w Width of bitmap in pixels
+ @param h Hieght of bitmap in pixels
+ @param color 16-bit 5-6-5 Color to draw with
+*/
+/**************************************************************************/
+void Adafruit_GFX::drawBitmap(int16_t x, int16_t y,
+ const uint8_t bitmap[], int16_t w, int16_t h, uint16_t color) {
+
+ int16_t byteWidth = (w + 7) / 8; // Bitmap scanline pad = whole byte
+ uint8_t byte = 0;
+
+ startWrite();
+ for(int16_t j=0; j>= 1;
+ else byte = pgm_read_byte(&bitmap[j * byteWidth + i / 8]);
+ // Nearly identical to drawBitmap(), only the bit order
+ // is reversed here (left-to-right = LSB to MSB):
+ if(byte & 0x01) writePixel(x+i, y, color);
+ }
+ }
+ endWrite();
+}
+
+
+/**************************************************************************/
+/*!
+ @brief Draw a PROGMEM-resident 8-bit image (grayscale) at the specified (x,y) pos.
+ Specifically for 8-bit display devices such as IS31FL3731; no color reduction/expansion is performed.
+ @param x Top left corner x coordinate
+ @param y Top left corner y coordinate
+ @param bitmap byte array with grayscale bitmap
+ @param w Width of bitmap in pixels
+ @param h Hieght of bitmap in pixels
+*/
+/**************************************************************************/
+void Adafruit_GFX::drawGrayscaleBitmap(int16_t x, int16_t y,
+ const uint8_t bitmap[], int16_t w, int16_t h) {
+ startWrite();
+ for(int16_t j=0; j= _width) || // Clip right
+ (y >= _height) || // Clip bottom
+ ((x + 6 * size - 1) < 0) || // Clip left
+ ((y + 8 * size - 1) < 0)) // Clip top
+ return;
+
+ if(!_cp437 && (c >= 176)) c++; // Handle 'classic' charset behavior
+
+ startWrite();
+ for(int8_t i=0; i<5; i++ ) { // Char bitmap = 5 columns
+ uint8_t line = pgm_read_byte(&font[c * 5 + i]);
+ for(int8_t j=0; j<8; j++, line >>= 1) {
+ if(line & 1) {
+ if(size == 1)
+ writePixel(x+i, y+j, color);
+ else
+ writeFillRect(x+i*size, y+j*size, size, size, color);
+ } else if(bg != color) {
+ if(size == 1)
+ writePixel(x+i, y+j, bg);
+ else
+ writeFillRect(x+i*size, y+j*size, size, size, bg);
+ }
+ }
+ }
+ if(bg != color) { // If opaque, draw vertical line for last column
+ if(size == 1) writeFastVLine(x+5, y, 8, bg);
+ else writeFillRect(x+5*size, y, size, 8*size, bg);
+ }
+ endWrite();
+
+ } else { // Custom font
+
+ // Character is assumed previously filtered by write() to eliminate
+ // newlines, returns, non-printable characters, etc. Calling
+ // drawChar() directly with 'bad' characters of font may cause mayhem!
+
+ c -= (uint8_t)pgm_read_byte(&gfxFont->first);
+ GFXglyph *glyph = &(((GFXglyph *)pgm_read_pointer(&gfxFont->glyph))[c]);
+ uint8_t *bitmap = (uint8_t *)pgm_read_pointer(&gfxFont->bitmap);
+
+ uint16_t bo = pgm_read_word(&glyph->bitmapOffset);
+ uint8_t w = pgm_read_byte(&glyph->width),
+ h = pgm_read_byte(&glyph->height);
+ int8_t xo = pgm_read_byte(&glyph->xOffset),
+ yo = pgm_read_byte(&glyph->yOffset);
+ uint8_t xx, yy, bits = 0, bit = 0;
+ int16_t xo16 = 0, yo16 = 0;
+
+ if(size > 1) {
+ xo16 = xo;
+ yo16 = yo;
+ }
+
+ // Todo: Add character clipping here
+
+ // NOTE: THERE IS NO 'BACKGROUND' COLOR OPTION ON CUSTOM FONTS.
+ // THIS IS ON PURPOSE AND BY DESIGN. The background color feature
+ // has typically been used with the 'classic' font to overwrite old
+ // screen contents with new data. This ONLY works because the
+ // characters are a uniform size; it's not a sensible thing to do with
+ // proportionally-spaced fonts with glyphs of varying sizes (and that
+ // may overlap). To replace previously-drawn text when using a custom
+ // font, use the getTextBounds() function to determine the smallest
+ // rectangle encompassing a string, erase the area with fillRect(),
+ // then draw new text. This WILL infortunately 'blink' the text, but
+ // is unavoidable. Drawing 'background' pixels will NOT fix this,
+ // only creates a new set of problems. Have an idea to work around
+ // this (a canvas object type for MCUs that can afford the RAM and
+ // displays supporting setAddrWindow() and pushColors()), but haven't
+ // implemented this yet.
+
+ startWrite();
+ for(yy=0; yy _width)) { // Off right?
+ cursor_x = 0; // Reset x to zero,
+ cursor_y += textsize * 8; // advance y one line
+ }
+ drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize);
+ cursor_x += textsize * 6; // Advance x one char
+ }
+
+ } else { // Custom font
+
+ if(c == '\n') {
+ cursor_x = 0;
+ cursor_y += (int16_t)textsize *
+ (uint8_t)pgm_read_byte(&gfxFont->yAdvance);
+ } else if(c != '\r') {
+ uint8_t first = pgm_read_byte(&gfxFont->first);
+ if((c >= first) && (c <= (uint8_t)pgm_read_byte(&gfxFont->last))) {
+ GFXglyph *glyph = &(((GFXglyph *)pgm_read_pointer(
+ &gfxFont->glyph))[c - first]);
+ uint8_t w = pgm_read_byte(&glyph->width),
+ h = pgm_read_byte(&glyph->height);
+ if((w > 0) && (h > 0)) { // Is there an associated bitmap?
+ int16_t xo = (int8_t)pgm_read_byte(&glyph->xOffset); // sic
+ if(wrap && ((cursor_x + textsize * (xo + w)) > _width)) {
+ cursor_x = 0;
+ cursor_y += (int16_t)textsize *
+ (uint8_t)pgm_read_byte(&gfxFont->yAdvance);
+ }
+ drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize);
+ }
+ cursor_x += (uint8_t)pgm_read_byte(&glyph->xAdvance) * (int16_t)textsize;
+ }
+ }
+
+ }
+ return 1;
+}
+
+/**************************************************************************/
+/*!
+ @brief Set text cursor location
+ @param x X coordinate in pixels
+ @param y Y coordinate in pixels
+*/
+/**************************************************************************/
+void Adafruit_GFX::setCursor(int16_t x, int16_t y) {
+ cursor_x = x;
+ cursor_y = y;
+}
+
+/**************************************************************************/
+/*!
+ @brief Get text cursor X location
+ @returns X coordinate in pixels
+*/
+/**************************************************************************/
+int16_t Adafruit_GFX::getCursorX(void) const {
+ return cursor_x;
+}
+
+/**************************************************************************/
+/*!
+ @brief Get text cursor Y location
+ @returns Y coordinate in pixels
+*/
+/**************************************************************************/
+int16_t Adafruit_GFX::getCursorY(void) const {
+ return cursor_y;
+}
+
+/**************************************************************************/
+/*!
+ @brief Set text 'magnification' size. Each increase in s makes 1 pixel that much bigger.
+ @param s Desired text size. 1 is default 6x8, 2 is 12x16, 3 is 18x24, etc
+*/
+/**************************************************************************/
+void Adafruit_GFX::setTextSize(uint8_t s) {
+ textsize = (s > 0) ? s : 1;
+}
+
+/**************************************************************************/
+/*!
+ @brief Set text font color with transparant background
+ @param c 16-bit 5-6-5 Color to draw text with
+*/
+/**************************************************************************/
+void Adafruit_GFX::setTextColor(uint16_t c) {
+ // For 'transparent' background, we'll set the bg
+ // to the same as fg instead of using a flag
+ textcolor = textbgcolor = c;
+}
+
+/**************************************************************************/
+/*!
+ @brief Set text font color with custom background color
+ @param c 16-bit 5-6-5 Color to draw text with
+ @param b 16-bit 5-6-5 Color to draw background/fill with
+*/
+/**************************************************************************/
+void Adafruit_GFX::setTextColor(uint16_t c, uint16_t b) {
+ textcolor = c;
+ textbgcolor = b;
+}
+
+/**************************************************************************/
+/*!
+ @brief Whether text that is too long should 'wrap' around to the next line.
+ @param w Set true for wrapping, false for clipping
+*/
+/**************************************************************************/
+void Adafruit_GFX::setTextWrap(boolean w) {
+ wrap = w;
+}
+
+/**************************************************************************/
+/*!
+ @brief Get rotation setting for display
+ @returns 0 thru 3 corresponding to 4 cardinal rotations
+*/
+/**************************************************************************/
+uint8_t Adafruit_GFX::getRotation(void) const {
+ return rotation;
+}
+
+/**************************************************************************/
+/*!
+ @brief Set rotation setting for display
+ @param x 0 thru 3 corresponding to 4 cardinal rotations
+*/
+/**************************************************************************/
+void Adafruit_GFX::setRotation(uint8_t x) {
+ rotation = (x & 3);
+ switch(rotation) {
+ case 0:
+ case 2:
+ _width = WIDTH;
+ _height = HEIGHT;
+ break;
+ case 1:
+ case 3:
+ _width = HEIGHT;
+ _height = WIDTH;
+ break;
+ }
+}
+
+/**************************************************************************/
+/*!
+ @brief Enable (or disable) Code Page 437-compatible charset.
+ There was an error in glcdfont.c for the longest time -- one character
+ (#176, the 'light shade' block) was missing -- this threw off the index
+ of every character that followed it. But a TON of code has been written
+ with the erroneous character indices. By default, the library uses the
+ original 'wrong' behavior and old sketches will still work. Pass 'true'
+ to this function to use correct CP437 character values in your code.
+ @param x Whether to enable (True) or not (False)
+*/
+/**************************************************************************/
+void Adafruit_GFX::cp437(boolean x) {
+ _cp437 = x;
+}
+
+/**************************************************************************/
+/*!
+ @brief Set the font to display when print()ing, either custom or default
+ @param f The GFXfont object, if NULL use built in 6x8 font
+*/
+/**************************************************************************/
+void Adafruit_GFX::setFont(const GFXfont *f) {
+ if(f) { // Font struct pointer passed in?
+ if(!gfxFont) { // And no current font struct?
+ // Switching from classic to new font behavior.
+ // Move cursor pos down 6 pixels so it's on baseline.
+ cursor_y += 6;
+ }
+ } else if(gfxFont) { // NULL passed. Current font struct defined?
+ // Switching from new to classic font behavior.
+ // Move cursor pos up 6 pixels so it's at top-left of char.
+ cursor_y -= 6;
+ }
+ gfxFont = (GFXfont *)f;
+}
+
+
+/**************************************************************************/
+/*!
+ @brief Helper to determine size of a character with current font/size.
+ Broke this out as it's used by both the PROGMEM- and RAM-resident getTextBounds() functions.
+ @param c The ascii character in question
+ @param x Pointer to x location of character
+ @param y Pointer to y location of character
+ @param minx Minimum clipping value for X
+ @param miny Minimum clipping value for Y
+ @param maxx Maximum clipping value for X
+ @param maxy Maximum clipping value for Y
+*/
+/**************************************************************************/
+void Adafruit_GFX::charBounds(char c, int16_t *x, int16_t *y,
+ int16_t *minx, int16_t *miny, int16_t *maxx, int16_t *maxy) {
+
+ if(gfxFont) {
+
+ if(c == '\n') { // Newline?
+ *x = 0; // Reset x to zero, advance y by one line
+ *y += textsize * (uint8_t)pgm_read_byte(&gfxFont->yAdvance);
+ } else if(c != '\r') { // Not a carriage return; is normal char
+ uint8_t first = pgm_read_byte(&gfxFont->first),
+ last = pgm_read_byte(&gfxFont->last);
+ if((c >= first) && (c <= last)) { // Char present in this font?
+ GFXglyph *glyph = &(((GFXglyph *)pgm_read_pointer(
+ &gfxFont->glyph))[c - first]);
+ uint8_t gw = pgm_read_byte(&glyph->width),
+ gh = pgm_read_byte(&glyph->height),
+ xa = pgm_read_byte(&glyph->xAdvance);
+ int8_t xo = pgm_read_byte(&glyph->xOffset),
+ yo = pgm_read_byte(&glyph->yOffset);
+ if(wrap && ((*x+(((int16_t)xo+gw)*textsize)) > _width)) {
+ *x = 0; // Reset x to zero, advance y by one line
+ *y += textsize * (uint8_t)pgm_read_byte(&gfxFont->yAdvance);
+ }
+ int16_t ts = (int16_t)textsize,
+ x1 = *x + xo * ts,
+ y1 = *y + yo * ts,
+ x2 = x1 + gw * ts - 1,
+ y2 = y1 + gh * ts - 1;
+ if(x1 < *minx) *minx = x1;
+ if(y1 < *miny) *miny = y1;
+ if(x2 > *maxx) *maxx = x2;
+ if(y2 > *maxy) *maxy = y2;
+ *x += xa * ts;
+ }
+ }
+
+ } else { // Default font
+
+ if(c == '\n') { // Newline?
+ *x = 0; // Reset x to zero,
+ *y += textsize * 8; // advance y one line
+ // min/max x/y unchaged -- that waits for next 'normal' character
+ } else if(c != '\r') { // Normal char; ignore carriage returns
+ if(wrap && ((*x + textsize * 6) > _width)) { // Off right?
+ *x = 0; // Reset x to zero,
+ *y += textsize * 8; // advance y one line
+ }
+ int x2 = *x + textsize * 6 - 1, // Lower-right pixel of char
+ y2 = *y + textsize * 8 - 1;
+ if(x2 > *maxx) *maxx = x2; // Track max x, y
+ if(y2 > *maxy) *maxy = y2;
+ if(*x < *minx) *minx = *x; // Track min x, y
+ if(*y < *miny) *miny = *y;
+ *x += textsize * 6; // Advance x one char
+ }
+ }
+}
+
+/**************************************************************************/
+/*!
+ @brief Helper to determine size of a string with current font/size. Pass string and a cursor position, returns UL corner and W,H.
+ @param str The ascii string to measure
+ @param x The current cursor X
+ @param y The current cursor Y
+ @param x1 The boundary X coordinate, set by function
+ @param y1 The boundary Y coordinate, set by function
+ @param w The boundary width, set by function
+ @param h The boundary height, set by function
+*/
+/**************************************************************************/
+void Adafruit_GFX::getTextBounds(const char *str, int16_t x, int16_t y,
+ int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h) {
+ uint8_t c; // Current character
+
+ *x1 = x;
+ *y1 = y;
+ *w = *h = 0;
+
+ int16_t minx = _width, miny = _height, maxx = -1, maxy = -1;
+
+ while((c = *str++))
+ charBounds(c, &x, &y, &minx, &miny, &maxx, &maxy);
+
+ if(maxx >= minx) {
+ *x1 = minx;
+ *w = maxx - minx + 1;
+ }
+ if(maxy >= miny) {
+ *y1 = miny;
+ *h = maxy - miny + 1;
+ }
+}
+
+/**************************************************************************/
+/*!
+ @brief Helper to determine size of a string with current font/size. Pass string and a cursor position, returns UL corner and W,H.
+ @param str The ascii string to measure (as an arduino String() class)
+ @param x The current cursor X
+ @param y The current cursor Y
+ @param x1 The boundary X coordinate, set by function
+ @param y1 The boundary Y coordinate, set by function
+ @param w The boundary width, set by function
+ @param h The boundary height, set by function
+*/
+/**************************************************************************/
+void Adafruit_GFX::getTextBounds(const String &str, int16_t x, int16_t y,
+ int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h) {
+ if (str.length() != 0) {
+ getTextBounds(const_cast(str.c_str()), x, y, x1, y1, w, h);
+ }
+}
+
+
+/**************************************************************************/
+/*!
+ @brief Helper to determine size of a PROGMEM string with current font/size. Pass string and a cursor position, returns UL corner and W,H.
+ @param str The flash-memory ascii string to measure
+ @param x The current cursor X
+ @param y The current cursor Y
+ @param x1 The boundary X coordinate, set by function
+ @param y1 The boundary Y coordinate, set by function
+ @param w The boundary width, set by function
+ @param h The boundary height, set by function
+*/
+/**************************************************************************/
+void Adafruit_GFX::getTextBounds(const __FlashStringHelper *str,
+ int16_t x, int16_t y, int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h) {
+ uint8_t *s = (uint8_t *)str, c;
+
+ *x1 = x;
+ *y1 = y;
+ *w = *h = 0;
+
+ int16_t minx = _width, miny = _height, maxx = -1, maxy = -1;
+
+ while((c = pgm_read_byte(s++)))
+ charBounds(c, &x, &y, &minx, &miny, &maxx, &maxy);
+
+ if(maxx >= minx) {
+ *x1 = minx;
+ *w = maxx - minx + 1;
+ }
+ if(maxy >= miny) {
+ *y1 = miny;
+ *h = maxy - miny + 1;
+ }
+}
+
+/**************************************************************************/
+/*!
+ @brief Get width of the display, accounting for the current rotation
+ @returns Width in pixels
+*/
+/**************************************************************************/
+int16_t Adafruit_GFX::width(void) const {
+ return _width;
+}
+
+/**************************************************************************/
+/*!
+ @brief Get height of the display, accounting for the current rotation
+ @returns Height in pixels
+*/
+/**************************************************************************/
+int16_t Adafruit_GFX::height(void) const {
+ return _height;
+}
+
+/**************************************************************************/
+/*!
+ @brief Invert the display (ideally using built-in hardware command)
+ @param i True if you want to invert, false to make 'normal'
+*/
+/**************************************************************************/
+void Adafruit_GFX::invertDisplay(boolean i) {
+ // Do nothing, must be subclassed if supported by hardware
+}
+
+/***************************************************************************/
+
+/**************************************************************************/
+/*!
+ @brief Create a simple drawn button UI element
+*/
+/**************************************************************************/
+Adafruit_GFX_Button::Adafruit_GFX_Button(void) {
+ _gfx = 0;
+}
+
+/**************************************************************************/
+/*!
+ @brief Initialize button with our desired color/size/settings
+ @param gfx Pointer to our display so we can draw to it!
+ @param x The X coordinate of the center of the button
+ @param y The Y coordinate of the center of the button
+ @param w Width of the buttton
+ @param h Height of the buttton
+ @param outline Color of the outline (16-bit 5-6-5 standard)
+ @param fill Color of the button fill (16-bit 5-6-5 standard)
+ @param textcolor Color of the button label (16-bit 5-6-5 standard)
+ @param label Ascii string of the text inside the button
+ @param textsize The font magnification of the label text
+*/
+/**************************************************************************/
+// Classic initButton() function: pass center & size
+void Adafruit_GFX_Button::initButton(
+ Adafruit_GFX *gfx, int16_t x, int16_t y, uint16_t w, uint16_t h,
+ uint16_t outline, uint16_t fill, uint16_t textcolor,
+ char *label, uint8_t textsize)
+{
+ // Tweak arguments and pass to the newer initButtonUL() function...
+ initButtonUL(gfx, x - (w / 2), y - (h / 2), w, h, outline, fill,
+ textcolor, label, textsize);
+}
+
+/**************************************************************************/
+/*!
+ @brief Initialize button with our desired color/size/settings, with upper-left coordinates
+ @param gfx Pointer to our display so we can draw to it!
+ @param x1 The X coordinate of the Upper-Left corner of the button
+ @param y1 The Y coordinate of the Upper-Left corner of the button
+ @param w Width of the buttton
+ @param h Height of the buttton
+ @param outline Color of the outline (16-bit 5-6-5 standard)
+ @param fill Color of the button fill (16-bit 5-6-5 standard)
+ @param textcolor Color of the button label (16-bit 5-6-5 standard)
+ @param label Ascii string of the text inside the button
+ @param textsize The font magnification of the label text
+*/
+/**************************************************************************/
+void Adafruit_GFX_Button::initButtonUL(
+ Adafruit_GFX *gfx, int16_t x1, int16_t y1, uint16_t w, uint16_t h,
+ uint16_t outline, uint16_t fill, uint16_t textcolor,
+ char *label, uint8_t textsize)
+{
+ _x1 = x1;
+ _y1 = y1;
+ _w = w;
+ _h = h;
+ _outlinecolor = outline;
+ _fillcolor = fill;
+ _textcolor = textcolor;
+ _textsize = textsize;
+ _gfx = gfx;
+ strncpy(_label, label, 9);
+}
+
+/**************************************************************************/
+/*!
+ @brief Draw the button on the screen
+ @param inverted Whether to draw with fill/text swapped to indicate 'pressed'
+*/
+/**************************************************************************/
+void Adafruit_GFX_Button::drawButton(boolean inverted) {
+ uint16_t fill, outline, text;
+
+ if(!inverted) {
+ fill = _fillcolor;
+ outline = _outlinecolor;
+ text = _textcolor;
+ } else {
+ fill = _textcolor;
+ outline = _outlinecolor;
+ text = _fillcolor;
+ }
+
+ uint8_t r = min(_w, _h) / 4; // Corner radius
+ _gfx->fillRoundRect(_x1, _y1, _w, _h, r, fill);
+ _gfx->drawRoundRect(_x1, _y1, _w, _h, r, outline);
+
+ _gfx->setCursor(_x1 + (_w/2) - (strlen(_label) * 3 * _textsize),
+ _y1 + (_h/2) - (4 * _textsize));
+ _gfx->setTextColor(text);
+ _gfx->setTextSize(_textsize);
+ _gfx->print(_label);
+}
+
+/**************************************************************************/
+/*!
+ @brief Helper to let us know if a coordinate is within the bounds of the button
+ @param x The X coordinate to check
+ @param y The Y coordinate to check
+ @returns True if within button graphics outline
+*/
+/**************************************************************************/
+boolean Adafruit_GFX_Button::contains(int16_t x, int16_t y) {
+ return ((x >= _x1) && (x < (int16_t) (_x1 + _w)) &&
+ (y >= _y1) && (y < (int16_t) (_y1 + _h)));
+}
+
+/**************************************************************************/
+/*!
+ @brief Sets the state of the button, should be done by some touch function
+ @param p True for pressed, false for not.
+*/
+/**************************************************************************/
+void Adafruit_GFX_Button::press(boolean p) {
+ laststate = currstate;
+ currstate = p;
+}
+
+/**************************************************************************/
+/*!
+ @brief Query whether the button is currently pressed
+ @returns True if pressed
+*/
+/**************************************************************************/
+boolean Adafruit_GFX_Button::isPressed() { return currstate; }
+
+/**************************************************************************/
+/*!
+ @brief Query whether the button was pressed since we last checked state
+ @returns True if was not-pressed before, now is.
+*/
+/**************************************************************************/
+boolean Adafruit_GFX_Button::justPressed() { return (currstate && !laststate); }
+
+/**************************************************************************/
+/*!
+ @brief Query whether the button was released since we last checked state
+ @returns True if was pressed before, now is not.
+*/
+/**************************************************************************/
+boolean Adafruit_GFX_Button::justReleased() { return (!currstate && laststate); }
+
+// -------------------------------------------------------------------------
+
+// GFXcanvas1, GFXcanvas8 and GFXcanvas16 (currently a WIP, don't get too
+// comfy with the implementation) provide 1-, 8- and 16-bit offscreen
+// canvases, the address of which can be passed to drawBitmap() or
+// pushColors() (the latter appears only in a couple of GFX-subclassed TFT
+// libraries at this time). This is here mostly to help with the recently-
+// added proportionally-spaced fonts; adds a way to refresh a section of the
+// screen without a massive flickering clear-and-redraw...but maybe you'll
+// find other uses too. VERY RAM-intensive, since the buffer is in MCU
+// memory and not the display driver...GXFcanvas1 might be minimally useful
+// on an Uno-class board, but this and the others are much more likely to
+// require at least a Mega or various recent ARM-type boards (recommended,
+// as the text+bitmap draw can be pokey). GFXcanvas1 requires 1 bit per
+// pixel (rounded up to nearest byte per scanline), GFXcanvas8 is 1 byte
+// per pixel (no scanline pad), and GFXcanvas16 uses 2 bytes per pixel (no
+// scanline pad).
+// NOT EXTENSIVELY TESTED YET. MAY CONTAIN WORST BUGS KNOWN TO HUMANKIND.
+
+/**************************************************************************/
+/*!
+ @brief Instatiate a GFX 1-bit canvas context for graphics
+ @param w Display width, in pixels
+ @param h Display height, in pixels
+*/
+/**************************************************************************/
+GFXcanvas1::GFXcanvas1(uint16_t w, uint16_t h) : Adafruit_GFX(w, h) {
+ uint16_t bytes = ((w + 7) / 8) * h;
+ if((buffer = (uint8_t *)malloc(bytes))) {
+ memset(buffer, 0, bytes);
+ }
+}
+
+/**************************************************************************/
+/*!
+ @brief Delete the canvas, free memory
+*/
+/**************************************************************************/
+GFXcanvas1::~GFXcanvas1(void) {
+ if(buffer) free(buffer);
+}
+
+/**************************************************************************/
+/*!
+ @brief Get a pointer to the internal buffer memory
+ @returns A pointer to the allocated buffer
+*/
+/**************************************************************************/
+uint8_t* GFXcanvas1::getBuffer(void) {
+ return buffer;
+}
+
+/**************************************************************************/
+/*!
+ @brief Draw a pixel to the canvas framebuffer
+ @param x x coordinate
+ @param y y coordinate
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void GFXcanvas1::drawPixel(int16_t x, int16_t y, uint16_t color) {
+#ifdef __AVR__
+ // Bitmask tables of 0x80>>X and ~(0x80>>X), because X>>Y is slow on AVR
+ static const uint8_t PROGMEM
+ GFXsetBit[] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 },
+ GFXclrBit[] = { 0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE };
+#endif
+
+ if(buffer) {
+ if((x < 0) || (y < 0) || (x >= _width) || (y >= _height)) return;
+
+ int16_t t;
+ switch(rotation) {
+ case 1:
+ t = x;
+ x = WIDTH - 1 - y;
+ y = t;
+ break;
+ case 2:
+ x = WIDTH - 1 - x;
+ y = HEIGHT - 1 - y;
+ break;
+ case 3:
+ t = x;
+ x = y;
+ y = HEIGHT - 1 - t;
+ break;
+ }
+
+ uint8_t *ptr = &buffer[(x / 8) + y * ((WIDTH + 7) / 8)];
+#ifdef __AVR__
+ if(color) *ptr |= pgm_read_byte(&GFXsetBit[x & 7]);
+ else *ptr &= pgm_read_byte(&GFXclrBit[x & 7]);
+#else
+ if(color) *ptr |= 0x80 >> (x & 7);
+ else *ptr &= ~(0x80 >> (x & 7));
+#endif
+ }
+}
+
+/**************************************************************************/
+/*!
+ @brief Fill the framebuffer completely with one color
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void GFXcanvas1::fillScreen(uint16_t color) {
+ if(buffer) {
+ uint16_t bytes = ((WIDTH + 7) / 8) * HEIGHT;
+ memset(buffer, color ? 0xFF : 0x00, bytes);
+ }
+}
+
+/**************************************************************************/
+/*!
+ @brief Instatiate a GFX 8-bit canvas context for graphics
+ @param w Display width, in pixels
+ @param h Display height, in pixels
+*/
+/**************************************************************************/
+GFXcanvas8::GFXcanvas8(uint16_t w, uint16_t h) : Adafruit_GFX(w, h) {
+ uint32_t bytes = w * h;
+ if((buffer = (uint8_t *)malloc(bytes))) {
+ memset(buffer, 0, bytes);
+ }
+}
+
+/**************************************************************************/
+/*!
+ @brief Delete the canvas, free memory
+*/
+/**************************************************************************/
+GFXcanvas8::~GFXcanvas8(void) {
+ if(buffer) free(buffer);
+}
+
+
+/**************************************************************************/
+/*!
+ @brief Get a pointer to the internal buffer memory
+ @returns A pointer to the allocated buffer
+*/
+/**************************************************************************/
+uint8_t* GFXcanvas8::getBuffer(void) {
+ return buffer;
+}
+
+/**************************************************************************/
+/*!
+ @brief Draw a pixel to the canvas framebuffer
+ @param x x coordinate
+ @param y y coordinate
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void GFXcanvas8::drawPixel(int16_t x, int16_t y, uint16_t color) {
+ if(buffer) {
+ if((x < 0) || (y < 0) || (x >= _width) || (y >= _height)) return;
+
+ int16_t t;
+ switch(rotation) {
+ case 1:
+ t = x;
+ x = WIDTH - 1 - y;
+ y = t;
+ break;
+ case 2:
+ x = WIDTH - 1 - x;
+ y = HEIGHT - 1 - y;
+ break;
+ case 3:
+ t = x;
+ x = y;
+ y = HEIGHT - 1 - t;
+ break;
+ }
+
+ buffer[x + y * WIDTH] = color;
+ }
+}
+
+/**************************************************************************/
+/*!
+ @brief Fill the framebuffer completely with one color
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void GFXcanvas8::fillScreen(uint16_t color) {
+ if(buffer) {
+ memset(buffer, color, WIDTH * HEIGHT);
+ }
+}
+
+void GFXcanvas8::writeFastHLine(int16_t x, int16_t y,
+ int16_t w, uint16_t color) {
+
+ if((x >= _width) || (y < 0) || (y >= _height)) return;
+ int16_t x2 = x + w - 1;
+ if(x2 < 0) return;
+
+ // Clip left/right
+ if(x < 0) {
+ x = 0;
+ w = x2 + 1;
+ }
+ if(x2 >= _width) w = _width - x;
+
+ int16_t t;
+ switch(rotation) {
+ case 1:
+ t = x;
+ x = WIDTH - 1 - y;
+ y = t;
+ break;
+ case 2:
+ x = WIDTH - 1 - x;
+ y = HEIGHT - 1 - y;
+ break;
+ case 3:
+ t = x;
+ x = y;
+ y = HEIGHT - 1 - t;
+ break;
+ }
+
+ memset(buffer + y * WIDTH + x, color, w);
+}
+
+/**************************************************************************/
+/*!
+ @brief Instatiate a GFX 16-bit canvas context for graphics
+ @param w Display width, in pixels
+ @param h Display height, in pixels
+*/
+/**************************************************************************/
+GFXcanvas16::GFXcanvas16(uint16_t w, uint16_t h) : Adafruit_GFX(w, h) {
+ uint32_t bytes = w * h * 2;
+ if((buffer = (uint16_t *)malloc(bytes))) {
+ memset(buffer, 0, bytes);
+ }
+}
+
+/**************************************************************************/
+/*!
+ @brief Delete the canvas, free memory
+*/
+/**************************************************************************/
+GFXcanvas16::~GFXcanvas16(void) {
+ if(buffer) free(buffer);
+}
+
+/**************************************************************************/
+/*!
+ @brief Get a pointer to the internal buffer memory
+ @returns A pointer to the allocated buffer
+*/
+/**************************************************************************/
+uint16_t* GFXcanvas16::getBuffer(void) {
+ return buffer;
+}
+
+/**************************************************************************/
+/*!
+ @brief Draw a pixel to the canvas framebuffer
+ @param x x coordinate
+ @param y y coordinate
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void GFXcanvas16::drawPixel(int16_t x, int16_t y, uint16_t color) {
+ if(buffer) {
+ if((x < 0) || (y < 0) || (x >= _width) || (y >= _height)) return;
+
+ int16_t t;
+ switch(rotation) {
+ case 1:
+ t = x;
+ x = WIDTH - 1 - y;
+ y = t;
+ break;
+ case 2:
+ x = WIDTH - 1 - x;
+ y = HEIGHT - 1 - y;
+ break;
+ case 3:
+ t = x;
+ x = y;
+ y = HEIGHT - 1 - t;
+ break;
+ }
+
+ buffer[x + y * WIDTH] = color;
+ }
+}
+
+/**************************************************************************/
+/*!
+ @brief Fill the framebuffer completely with one color
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void GFXcanvas16::fillScreen(uint16_t color) {
+ if(buffer) {
+ uint8_t hi = color >> 8, lo = color & 0xFF;
+ if(hi == lo) {
+ memset(buffer, lo, WIDTH * HEIGHT * 2);
+ } else {
+ uint32_t i, pixels = WIDTH * HEIGHT;
+ for(i=0; i= 100
+ #include "Arduino.h"
+ #include "Print.h"
+#else
+ #include "WProgram.h"
+#endif
+#include "gfxfont.h"
+
+/// A generic graphics superclass that can handle all sorts of drawing. At a minimum you can subclass and provide drawPixel(). At a maximum you can do a ton of overriding to optimize. Used for any/all Adafruit displays!
+class Adafruit_GFX : public Print {
+
+ public:
+
+ Adafruit_GFX(int16_t w, int16_t h); // Constructor
+
+ // This MUST be defined by the subclass:
+ virtual void drawPixel(int16_t x, int16_t y, uint16_t color) = 0; ///< Virtual drawPixel() function to draw to the screen/framebuffer/etc, must be overridden in subclass. @param x X coordinate. @param y Y coordinate. @param color 16-bit pixel color.
+
+ // TRANSACTION API / CORE DRAW API
+ // These MAY be overridden by the subclass to provide device-specific
+ // optimized code. Otherwise 'generic' versions are used.
+ virtual void startWrite(void);
+ virtual void writePixel(int16_t x, int16_t y, uint16_t color);
+ virtual void writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
+ virtual void writeFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
+ virtual void writeFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
+ virtual void writeLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);
+ virtual void endWrite(void);
+
+ // CONTROL API
+ // These MAY be overridden by the subclass to provide device-specific
+ // optimized code. Otherwise 'generic' versions are used.
+ virtual void setRotation(uint8_t r);
+ virtual void invertDisplay(boolean i);
+
+ // BASIC DRAW API
+ // These MAY be overridden by the subclass to provide device-specific
+ // optimized code. Otherwise 'generic' versions are used.
+ virtual void
+ // It's good to implement those, even if using transaction API
+ drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color),
+ drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color),
+ fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color),
+ fillScreen(uint16_t color),
+ // Optional and probably not necessary to change
+ drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color),
+ drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
+
+ // These exist only with Adafruit_GFX (no subclass overrides)
+ void
+ drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color),
+ drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
+ uint16_t color),
+ fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color),
+ fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
+ int16_t delta, uint16_t color),
+ drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
+ int16_t x2, int16_t y2, uint16_t color),
+ fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
+ int16_t x2, int16_t y2, uint16_t color),
+ drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,
+ int16_t radius, uint16_t color),
+ fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,
+ int16_t radius, uint16_t color),
+ drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[],
+ int16_t w, int16_t h, uint16_t color),
+ drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[],
+ int16_t w, int16_t h, uint16_t color, uint16_t bg),
+ drawBitmap(int16_t x, int16_t y, uint8_t *bitmap,
+ int16_t w, int16_t h, uint16_t color),
+ drawBitmap(int16_t x, int16_t y, uint8_t *bitmap,
+ int16_t w, int16_t h, uint16_t color, uint16_t bg),
+ drawXBitmap(int16_t x, int16_t y, const uint8_t bitmap[],
+ int16_t w, int16_t h, uint16_t color),
+ drawGrayscaleBitmap(int16_t x, int16_t y, const uint8_t bitmap[],
+ int16_t w, int16_t h),
+ drawGrayscaleBitmap(int16_t x, int16_t y, uint8_t *bitmap,
+ int16_t w, int16_t h),
+ drawGrayscaleBitmap(int16_t x, int16_t y,
+ const uint8_t bitmap[], const uint8_t mask[],
+ int16_t w, int16_t h),
+ drawGrayscaleBitmap(int16_t x, int16_t y,
+ uint8_t *bitmap, uint8_t *mask, int16_t w, int16_t h),
+ drawRGBBitmap(int16_t x, int16_t y, const uint16_t bitmap[],
+ int16_t w, int16_t h),
+ drawRGBBitmap(int16_t x, int16_t y, uint16_t *bitmap,
+ int16_t w, int16_t h),
+ drawRGBBitmap(int16_t x, int16_t y,
+ const uint16_t bitmap[], const uint8_t mask[],
+ int16_t w, int16_t h),
+ drawRGBBitmap(int16_t x, int16_t y,
+ uint16_t *bitmap, uint8_t *mask, int16_t w, int16_t h),
+ drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color,
+ uint16_t bg, uint8_t size),
+ setCursor(int16_t x, int16_t y),
+ setTextColor(uint16_t c),
+ setTextColor(uint16_t c, uint16_t bg),
+ setTextSize(uint8_t s),
+ setTextWrap(boolean w),
+ cp437(boolean x=true),
+ setFont(const GFXfont *f = NULL),
+ getTextBounds(const char *string, int16_t x, int16_t y,
+ int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h),
+ getTextBounds(const __FlashStringHelper *s, int16_t x, int16_t y,
+ int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h),
+ getTextBounds(const String &str, int16_t x, int16_t y,
+ int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h);
+
+
+#if ARDUINO >= 100
+ virtual size_t write(uint8_t);
+#else
+ virtual void write(uint8_t);
+#endif
+
+ int16_t height(void) const;
+ int16_t width(void) const;
+
+ uint8_t getRotation(void) const;
+
+ // get current cursor position (get rotation safe maximum values, using: width() for x, height() for y)
+ int16_t getCursorX(void) const;
+ int16_t getCursorY(void) const;
+
+ protected:
+ void
+ charBounds(char c, int16_t *x, int16_t *y,
+ int16_t *minx, int16_t *miny, int16_t *maxx, int16_t *maxy);
+ const int16_t
+ WIDTH, ///< This is the 'raw' display width - never changes
+ HEIGHT; ///< This is the 'raw' display height - never changes
+ int16_t
+ _width, ///< Display width as modified by current rotation
+ _height, ///< Display height as modified by current rotation
+ cursor_x, ///< x location to start print()ing text
+ cursor_y; ///< y location to start print()ing text
+ uint16_t
+ textcolor, ///< 16-bit background color for print()
+ textbgcolor; ///< 16-bit text color for print()
+ uint8_t
+ textsize, ///< Desired magnification of text to print()
+ rotation; ///< Display rotation (0 thru 3)
+ boolean
+ wrap, ///< If set, 'wrap' text at right edge of display
+ _cp437; ///< If set, use correct CP437 charset (default is off)
+ GFXfont
+ *gfxFont; ///< Pointer to special font
+};
+
+
+/// A simple drawn button UI element
+class Adafruit_GFX_Button {
+
+ public:
+ Adafruit_GFX_Button(void);
+ // "Classic" initButton() uses center & size
+ void initButton(Adafruit_GFX *gfx, int16_t x, int16_t y,
+ uint16_t w, uint16_t h, uint16_t outline, uint16_t fill,
+ uint16_t textcolor, char *label, uint8_t textsize);
+ // New/alt initButton() uses upper-left corner & size
+ void initButtonUL(Adafruit_GFX *gfx, int16_t x1, int16_t y1,
+ uint16_t w, uint16_t h, uint16_t outline, uint16_t fill,
+ uint16_t textcolor, char *label, uint8_t textsize);
+ void drawButton(boolean inverted = false);
+ boolean contains(int16_t x, int16_t y);
+
+ void press(boolean p);
+ boolean isPressed();
+ boolean justPressed();
+ boolean justReleased();
+
+ private:
+ Adafruit_GFX *_gfx;
+ int16_t _x1, _y1; // Coordinates of top-left corner
+ uint16_t _w, _h;
+ uint8_t _textsize;
+ uint16_t _outlinecolor, _fillcolor, _textcolor;
+ char _label[10];
+
+ boolean currstate, laststate;
+};
+
+
+/// A GFX 1-bit canvas context for graphics
+class GFXcanvas1 : public Adafruit_GFX {
+ public:
+ GFXcanvas1(uint16_t w, uint16_t h);
+ ~GFXcanvas1(void);
+ void drawPixel(int16_t x, int16_t y, uint16_t color),
+ fillScreen(uint16_t color);
+ uint8_t *getBuffer(void);
+ private:
+ uint8_t *buffer;
+};
+
+
+/// A GFX 8-bit canvas context for graphics
+class GFXcanvas8 : public Adafruit_GFX {
+ public:
+ GFXcanvas8(uint16_t w, uint16_t h);
+ ~GFXcanvas8(void);
+ void drawPixel(int16_t x, int16_t y, uint16_t color),
+ fillScreen(uint16_t color),
+ writeFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
+
+ uint8_t *getBuffer(void);
+ private:
+ uint8_t *buffer;
+};
+
+
+/// A GFX 16-bit canvas context for graphics
+class GFXcanvas16 : public Adafruit_GFX {
+ public:
+ GFXcanvas16(uint16_t w, uint16_t h);
+ ~GFXcanvas16(void);
+ void drawPixel(int16_t x, int16_t y, uint16_t color),
+ fillScreen(uint16_t color);
+ uint16_t *getBuffer(void);
+ private:
+ uint16_t *buffer;
+};
+
+#endif // _ADAFRUIT_GFX_H
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Adafruit_SPITFT.cpp b/lib/Adafruit-GFX-Library-1.2.9/Adafruit_SPITFT.cpp
new file mode 100644
index 000000000000..51b53cc3bc22
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Adafruit_SPITFT.cpp
@@ -0,0 +1,555 @@
+/*!
+* @file Adafruit_SPITFT.cpp
+*
+* @mainpage Adafruit SPI TFT Displays
+*
+* @section intro_sec Introduction
+ This is our library for generic SPI TFT Displays with
+ address windows and 16 bit color (e.g. ILI9341, HX8357D, ST7735...)
+
+ Check out the links above for our tutorials and wiring diagrams
+ These displays use SPI to communicate, 4 or 5 pins are required to
+ interface (RST is optional)
+ Adafruit invests time and resources providing this open source code,
+ please support Adafruit and open-source hardware by purchasing
+ products from Adafruit!
+
+ Written by Limor Fried/Ladyada for Adafruit Industries.
+ MIT license, all text above must be included in any redistribution
+* @section dependencies Dependencies
+*
+* This library depends on
+* Adafruit_GFX being present on your system. Please make sure you have
+* installed the latest version before using this library.
+*
+* @section author Author
+*
+* Written by Limor "ladyada" Fried for Adafruit Industries.
+*
+* @section license License
+*
+* BSD license, all text here must be included in any redistribution.
+*
+*/
+
+#ifndef __AVR_ATtiny85__ // NOT A CHANCE of this stuff working on ATtiny!
+
+#include "Adafruit_SPITFT.h"
+#ifndef ARDUINO_STM32_FEATHER
+ #include "pins_arduino.h"
+#ifndef RASPI
+ #include "wiring_private.h"
+#endif
+#endif
+#include
+
+#include "Adafruit_SPITFT_Macros.h"
+
+
+
+/**************************************************************************/
+/*!
+ @brief Pass 8-bit (each) R,G,B, get back 16-bit packed color
+ This function converts 8-8-8 RGB data to 16-bit 5-6-5
+ @param red Red 8 bit color
+ @param green Green 8 bit color
+ @param blue Blue 8 bit color
+ @return Unsigned 16-bit down-sampled color in 5-6-5 format
+*/
+/**************************************************************************/
+uint16_t Adafruit_SPITFT::color565(uint8_t red, uint8_t green, uint8_t blue) {
+ return ((red & 0xF8) << 8) | ((green & 0xFC) << 3) | ((blue & 0xF8) >> 3);
+}
+
+
+/**************************************************************************/
+/*!
+ @brief Instantiate Adafruit SPI display driver with software SPI
+ @param w Display width in pixels
+ @param h Display height in pixels
+ @param cs Chip select pin #
+ @param dc Data/Command pin #
+ @param mosi SPI MOSI pin #
+ @param sclk SPI Clock pin #
+ @param rst Reset pin # (optional, pass -1 if unused)
+ @param miso SPI MISO pin # (optional, pass -1 if unused)
+*/
+/**************************************************************************/
+Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h,
+ int8_t cs, int8_t dc, int8_t mosi,
+ int8_t sclk, int8_t rst, int8_t miso)
+ : Adafruit_GFX(w, h) {
+ _cs = cs;
+ _dc = dc;
+ _rst = rst;
+ _sclk = sclk;
+ _mosi = mosi;
+ _miso = miso;
+ _freq = 0;
+#ifdef USE_FAST_PINIO
+ dcport = (RwReg *)portOutputRegister(digitalPinToPort(dc));
+ dcpinmask = digitalPinToBitMask(dc);
+ clkport = (RwReg *)portOutputRegister(digitalPinToPort(sclk));
+ clkpinmask = digitalPinToBitMask(sclk);
+ mosiport = (RwReg *)portOutputRegister(digitalPinToPort(mosi));
+ mosipinmask = digitalPinToBitMask(mosi);
+ if(miso >= 0){
+ misoport = (RwReg *)portInputRegister(digitalPinToPort(miso));
+ misopinmask = digitalPinToBitMask(miso);
+ } else {
+ misoport = 0;
+ misopinmask = 0;
+ }
+ if(cs >= 0) {
+ csport = (RwReg *)portOutputRegister(digitalPinToPort(cs));
+ cspinmask = digitalPinToBitMask(cs);
+ } else {
+ // No chip-select line defined; might be permanently tied to GND.
+ // Assign a valid GPIO register (though not used for CS), and an
+ // empty pin bitmask...the nonsense bit-twiddling might be faster
+ // than checking _cs and possibly branching.
+ csport = dcport;
+ cspinmask = 0;
+ }
+#endif
+}
+
+/**************************************************************************/
+/*!
+ @brief Instantiate Adafruit SPI display driver with hardware SPI
+ @param w Display width in pixels
+ @param h Display height in pixels
+ @param cs Chip select pin #
+ @param dc Data/Command pin #
+ @param rst Reset pin # (optional, pass -1 if unused)
+*/
+/**************************************************************************/
+Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h,
+ int8_t cs, int8_t dc, int8_t rst)
+ : Adafruit_GFX(w, h) {
+ _cs = cs;
+ _dc = dc;
+ _rst = rst;
+ _sclk = -1;
+ _mosi = -1;
+ _miso = -1;
+ _freq = 0;
+#ifdef USE_FAST_PINIO
+ clkport = 0;
+ clkpinmask = 0;
+ mosiport = 0;
+ mosipinmask = 0;
+ misoport = 0;
+ misopinmask = 0;
+ dcport = (RwReg *)portOutputRegister(digitalPinToPort(dc));
+ dcpinmask = digitalPinToBitMask(dc);
+ if(cs >= 0) {
+ csport = (RwReg *)portOutputRegister(digitalPinToPort(cs));
+ cspinmask = digitalPinToBitMask(cs);
+ } else {
+ // See notes in prior constructor.
+ csport = dcport;
+ cspinmask = 0;
+ }
+#endif
+}
+
+/**************************************************************************/
+/*!
+ @brief Initialiaze the SPI interface (hardware or software)
+ @param freq The desired maximum SPI hardware clock frequency
+*/
+/**************************************************************************/
+void Adafruit_SPITFT::initSPI(uint32_t freq) {
+ _freq = freq;
+
+ // Control Pins
+ if(_cs >= 0) {
+ pinMode(_cs, OUTPUT);
+ digitalWrite(_cs, HIGH); // Deselect
+ }
+ pinMode(_dc, OUTPUT);
+ digitalWrite(_dc, LOW);
+
+ // Software SPI
+ if(_sclk >= 0){
+ pinMode(_mosi, OUTPUT);
+ digitalWrite(_mosi, LOW);
+ pinMode(_sclk, OUTPUT);
+ digitalWrite(_sclk, HIGH);
+ if(_miso >= 0){
+ pinMode(_miso, INPUT);
+ }
+ }
+
+ // Hardware SPI
+ SPI_BEGIN();
+
+ // toggle RST low to reset
+ if (_rst >= 0) {
+ pinMode(_rst, OUTPUT);
+ digitalWrite(_rst, HIGH);
+ delay(100);
+ digitalWrite(_rst, LOW);
+ delay(100);
+ digitalWrite(_rst, HIGH);
+ delay(200);
+ }
+}
+
+/**************************************************************************/
+/*!
+ @brief Read one byte from SPI interface (hardware or software
+ @returns One byte, MSB order
+*/
+/**************************************************************************/
+uint8_t Adafruit_SPITFT::spiRead() {
+ if(_sclk < 0){
+ return HSPI_READ();
+ }
+ if(_miso < 0){
+ return 0;
+ }
+ uint8_t r = 0;
+ for (uint8_t i=0; i<8; i++) {
+ SSPI_SCK_LOW();
+ SSPI_SCK_HIGH();
+ r <<= 1;
+ if (SSPI_MISO_READ()){
+ r |= 0x1;
+ }
+ }
+ return r;
+}
+
+/**************************************************************************/
+/*!
+ @brief Write one byte to SPI interface (hardware or software
+ @param b One byte to send, MSB order
+*/
+/**************************************************************************/
+void Adafruit_SPITFT::spiWrite(uint8_t b) {
+ if(_sclk < 0){
+ HSPI_WRITE(b);
+ return;
+ }
+ for(uint8_t bit = 0x80; bit; bit >>= 1){
+ if((b) & bit){
+ SSPI_MOSI_HIGH();
+ } else {
+ SSPI_MOSI_LOW();
+ }
+ SSPI_SCK_LOW();
+ SSPI_SCK_HIGH();
+ }
+}
+
+
+/*
+ * Transaction API
+ * */
+
+/**************************************************************************/
+/*!
+ @brief Begin an SPI transaction & set CS low.
+*/
+/**************************************************************************/
+void inline Adafruit_SPITFT::startWrite(void){
+ SPI_BEGIN_TRANSACTION();
+ SPI_CS_LOW();
+}
+
+/**************************************************************************/
+/*!
+ @brief Begin an SPI transaction & set CS high.
+*/
+/**************************************************************************/
+void inline Adafruit_SPITFT::endWrite(void){
+ SPI_CS_HIGH();
+ SPI_END_TRANSACTION();
+}
+
+/**************************************************************************/
+/*!
+ @brief Write a command byte (must have a transaction in progress)
+ @param cmd The 8-bit command to send
+*/
+/**************************************************************************/
+void Adafruit_SPITFT::writeCommand(uint8_t cmd){
+ SPI_DC_LOW();
+ spiWrite(cmd);
+ SPI_DC_HIGH();
+}
+
+/**************************************************************************/
+/*!
+ @brief Push a 2-byte color to the framebuffer RAM, will start transaction
+ @param color 16-bit 5-6-5 Color to draw
+*/
+/**************************************************************************/
+void Adafruit_SPITFT::pushColor(uint16_t color) {
+ startWrite();
+ SPI_WRITE16(color);
+ endWrite();
+}
+
+
+
+/**************************************************************************/
+/*!
+ @brief Blit multiple 2-byte colors (must have a transaction in progress)
+ @param colors Array of 16-bit 5-6-5 Colors to draw
+ @param len How many pixels to draw - 2 bytes per pixel!
+*/
+/**************************************************************************/
+void Adafruit_SPITFT::writePixels(uint16_t * colors, uint32_t len){
+ SPI_WRITE_PIXELS((uint8_t*)colors , len * 2);
+}
+
+/**************************************************************************/
+/*!
+ @brief Blit a 2-byte color many times (must have a transaction in progress)
+ @param color The 16-bit 5-6-5 Color to draw
+ @param len How many pixels to draw
+*/
+/**************************************************************************/
+void Adafruit_SPITFT::writeColor(uint16_t color, uint32_t len){
+#ifdef SPI_HAS_WRITE_PIXELS
+ if(_sclk >= 0){
+ for (uint32_t t=0; t SPI_MAX_PIXELS_AT_ONCE)?SPI_MAX_PIXELS_AT_ONCE:len;
+ uint16_t tlen = 0;
+
+ for (uint32_t t=0; tblen)?blen:len;
+ writePixels(temp, tlen);
+ len -= tlen;
+ }
+#else
+ uint8_t hi = color >> 8, lo = color;
+ if(_sclk < 0){ //AVR Optimization
+ for (uint32_t t=len; t; t--){
+ HSPI_WRITE(hi);
+ HSPI_WRITE(lo);
+ }
+ return;
+ }
+ for (uint32_t t=len; t; t--){
+ spiWrite(hi);
+ spiWrite(lo);
+ }
+#endif
+}
+
+/**************************************************************************/
+/*!
+ @brief Write a pixel (must have a transaction in progress)
+ @param x x coordinate
+ @param y y coordinate
+ @param color 16-bit 5-6-5 Color to draw with
+*/
+/**************************************************************************/
+void Adafruit_SPITFT::writePixel(int16_t x, int16_t y, uint16_t color) {
+ if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return;
+ setAddrWindow(x,y,1,1);
+ writePixel(color);
+}
+
+/**************************************************************************/
+/*!
+ @brief Write a filled rectangle (must have a transaction in progress)
+ @param x Top left corner x coordinate
+ @param y Top left corner y coordinate
+ @param w Width in pixels
+ @param h Height in pixels
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void Adafruit_SPITFT::writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color){
+ if((x >= _width) || (y >= _height)) return;
+ int16_t x2 = x + w - 1, y2 = y + h - 1;
+ if((x2 < 0) || (y2 < 0)) return;
+
+ // Clip left/top
+ if(x < 0) {
+ x = 0;
+ w = x2 + 1;
+ }
+ if(y < 0) {
+ y = 0;
+ h = y2 + 1;
+ }
+
+ // Clip right/bottom
+ if(x2 >= _width) w = _width - x;
+ if(y2 >= _height) h = _height - y;
+
+ int32_t len = (int32_t)w * h;
+ setAddrWindow(x, y, w, h);
+ writeColor(color, len);
+}
+
+/**************************************************************************/
+/*!
+ @brief Write a perfectly vertical line (must have a transaction in progress)
+ @param x Top-most x coordinate
+ @param y Top-most y coordinate
+ @param h Height in pixels
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void inline Adafruit_SPITFT::writeFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color){
+ writeFillRect(x, y, 1, h, color);
+}
+
+/**************************************************************************/
+/*!
+ @brief Write a perfectly horizontal line (must have a transaction in progress)
+ @param x Left-most x coordinate
+ @param y Left-most y coordinate
+ @param w Width in pixels
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void inline Adafruit_SPITFT::writeFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color){
+ writeFillRect(x, y, w, 1, color);
+}
+
+/**************************************************************************/
+/*!
+ @brief Draw a pixel - sets up transaction
+ @param x x coordinate
+ @param y y coordinate
+ @param color 16-bit 5-6-5 Color to draw with
+*/
+/**************************************************************************/
+void Adafruit_SPITFT::drawPixel(int16_t x, int16_t y, uint16_t color){
+ startWrite();
+ writePixel(x, y, color);
+ endWrite();
+}
+
+/**************************************************************************/
+/*!
+ @brief Write a perfectly vertical line - sets up transaction
+ @param x Top-most x coordinate
+ @param y Top-most y coordinate
+ @param h Height in pixels
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void Adafruit_SPITFT::drawFastVLine(int16_t x, int16_t y,
+ int16_t h, uint16_t color) {
+ startWrite();
+ writeFastVLine(x, y, h, color);
+ endWrite();
+}
+
+/**************************************************************************/
+/*!
+ @brief Write a perfectly horizontal line - sets up transaction
+ @param x Left-most x coordinate
+ @param y Left-most y coordinate
+ @param w Width in pixels
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void Adafruit_SPITFT::drawFastHLine(int16_t x, int16_t y,
+ int16_t w, uint16_t color) {
+ startWrite();
+ writeFastHLine(x, y, w, color);
+ endWrite();
+}
+
+/**************************************************************************/
+/*!
+ @brief Fill a rectangle completely with one color.
+ @param x Top left corner x coordinate
+ @param y Top left corner y coordinate
+ @param w Width in pixels
+ @param h Height in pixels
+ @param color 16-bit 5-6-5 Color to fill with
+*/
+/**************************************************************************/
+void Adafruit_SPITFT::fillRect(int16_t x, int16_t y, int16_t w, int16_t h,
+ uint16_t color) {
+ startWrite();
+ writeFillRect(x,y,w,h,color);
+ endWrite();
+}
+
+
+/**************************************************************************/
+/*!
+ @brief Invert the display using built-in hardware command
+ @param i True if you want to invert, false to make 'normal'
+*/
+/**************************************************************************/
+void Adafruit_SPITFT::invertDisplay(boolean i) {
+ startWrite();
+ writeCommand(i ? invertOnCommand : invertOffCommand);
+ endWrite();
+}
+
+
+/**************************************************************************/
+/*!
+ @brief Draw a 16-bit image (RGB 5/6/5) at the specified (x,y) position.
+ For 16-bit display devices; no color reduction performed.
+ Adapted from https://github.com/PaulStoffregen/ILI9341_t3
+ by Marc MERLIN. See examples/pictureEmbed to use this.
+ 5/6/2017: function name and arguments have changed for compatibility
+ with current GFX library and to avoid naming problems in prior
+ implementation. Formerly drawBitmap() with arguments in different order.
+
+ @param x Top left corner x coordinate
+ @param y Top left corner y coordinate
+ @param pcolors 16-bit array with 16-bit color bitmap
+ @param w Width of bitmap in pixels
+ @param h Height of bitmap in pixels
+*/
+/**************************************************************************/
+void Adafruit_SPITFT::drawRGBBitmap(int16_t x, int16_t y,
+ uint16_t *pcolors, int16_t w, int16_t h) {
+
+ int16_t x2, y2; // Lower-right coord
+ if(( x >= _width ) || // Off-edge right
+ ( y >= _height) || // " top
+ ((x2 = (x+w-1)) < 0 ) || // " left
+ ((y2 = (y+h-1)) < 0) ) return; // " bottom
+
+ int16_t bx1=0, by1=0, // Clipped top-left within bitmap
+ saveW=w; // Save original bitmap width value
+ if(x < 0) { // Clip left
+ w += x;
+ bx1 = -x;
+ x = 0;
+ }
+ if(y < 0) { // Clip top
+ h += y;
+ by1 = -y;
+ y = 0;
+ }
+ if(x2 >= _width ) w = _width - x; // Clip right
+ if(y2 >= _height) h = _height - y; // Clip bottom
+
+ pcolors += by1 * saveW + bx1; // Offset bitmap ptr to clipped top-left
+ startWrite();
+ setAddrWindow(x, y, w, h); // Clipped area
+ while(h--) { // For each (clipped) scanline...
+ writePixels(pcolors, w); // Push one (clipped) row
+ pcolors += saveW; // Advance pointer by one full (unclipped) line
+ }
+ endWrite();
+}
+
+#endif // !__AVR_ATtiny85__
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Adafruit_SPITFT.h b/lib/Adafruit-GFX-Library-1.2.9/Adafruit_SPITFT.h
new file mode 100644
index 000000000000..53cdd985d0b8
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Adafruit_SPITFT.h
@@ -0,0 +1,125 @@
+#ifndef _ADAFRUIT_SPITFT_
+#define _ADAFRUIT_SPITFT_
+
+#if ARDUINO >= 100
+ #include "Arduino.h"
+ #include "Print.h"
+#else
+ #include "WProgram.h"
+#endif
+#include
+#include "Adafruit_GFX.h"
+
+#define USE_FAST_PINIO
+
+#if defined(__AVR__)
+ typedef volatile uint8_t RwReg;
+#elif defined(ARDUINO_STM32_FEATHER)
+ typedef volatile uint32 RwReg;
+ #undef USE_FAST_PINIO
+#elif defined(__OPENCR__) || defined (__OPENCM904__)
+ #undef USE_FAST_PINIO
+#elif defined(ARDUINO_FEATHER52) || defined(__arm__)
+ typedef volatile uint32_t RwReg;
+#elif defined(ESP32) || defined(ESP8266)
+ typedef volatile uint32_t RwReg;
+ #undef USE_FAST_PINIO
+#else
+ #undef USE_FAST_PINIO
+#endif
+
+#include "Adafruit_SPITFT_Macros.h"
+
+/// A heavily optimized SPI display subclass of GFX. Manages SPI bitbanging, transactions, DMA, etc! Despite being called SPITFT, the classic SPI data/command interface is also used by OLEDs.
+class Adafruit_SPITFT : public Adafruit_GFX {
+ protected:
+
+ public:
+ Adafruit_SPITFT(uint16_t w, uint16_t h, int8_t _CS, int8_t _DC, int8_t _MOSI, int8_t _SCLK, int8_t _RST = -1, int8_t _MISO = -1);
+ Adafruit_SPITFT(uint16_t w, uint16_t h, int8_t _CS, int8_t _DC, int8_t _RST = -1);
+
+ virtual void begin(uint32_t freq) = 0; ///< Virtual begin() function to set SPI frequency, must be overridden in subclass. @param freq Maximum SPI hardware clock speed
+
+ void initSPI(uint32_t freq);
+
+ // Required Non-Transaction
+ void drawPixel(int16_t x, int16_t y, uint16_t color);
+
+ // Transaction API
+ void startWrite(void);
+ void endWrite(void);
+
+ void writePixel(int16_t x, int16_t y, uint16_t color);
+ void writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
+ void writeFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
+ void writeFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
+
+ // Transaction API not used by GFX
+
+ /*!
+ @brief SPI displays set an address window rectangle for blitting pixels
+ @param x Top left corner x coordinate
+ @param y Top left corner x coordinate
+ @param w Width of window
+ @param h Height of window
+ */
+ virtual void setAddrWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h) = 0;
+
+ /*!
+ @brief Write a 2-byte color (must have a transaction in progress)
+ @param color 16-bit 5-6-5 Color to draw
+ */
+ void inline writePixel(uint16_t color) { SPI_WRITE16(color); }
+ void writePixels(uint16_t * colors, uint32_t len);
+ void writeColor(uint16_t color, uint32_t len);
+ void pushColor(uint16_t color);
+
+ // Recommended Non-Transaction
+ void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
+ void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
+ void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
+
+ using Adafruit_GFX::drawRGBBitmap; // Check base class first
+ void drawRGBBitmap(int16_t x, int16_t y,
+ uint16_t *pcolors, int16_t w, int16_t h);
+ void invertDisplay(boolean i);
+
+ uint16_t color565(uint8_t r, uint8_t g, uint8_t b);
+
+ protected:
+ uint32_t _freq; ///< SPI clock frequency (for hardware SPI)
+#if defined (__AVR__) || defined(TEENSYDUINO) || defined (ESP8266) || defined (ESP32)
+ int8_t _cs, _dc, _rst, _sclk, _mosi, _miso;
+#else
+ int32_t _cs, ///< Arduino pin # for chip-select pin
+ _dc, ///< Arduino pin # for data-command pin
+ _rst, ///< Arduino pin # for reset pin
+ _sclk, ///< Arduino pin # for SPI clock pin
+ _mosi, ///< Arduino pin # for SPI MOSI pin
+ _miso; ///< Arduino pin # for SPI MISO pin
+#endif
+
+#ifdef USE_FAST_PINIO
+ volatile RwReg *mosiport, ///< Direct chip register for toggling MOSI with fast bitbang IO
+ *misoport, ///< Direct chip register for toggling MISO with fast bitbang IO
+ *clkport, ///< Direct chip register for toggling CLK with fast bitbang IO
+ *dcport, ///< Direct chip register for toggling DC with fast bitbang IO
+ *csport; ///< Direct chip register for toggling CS with fast bitbang IO
+ RwReg mosipinmask, ///< bitmask for turning on/off MOSI with fast register bitbang IO
+ misopinmask, ///< bitmask for turning on/off MISO with fast register bitbang IO
+ clkpinmask, ///< bitmask for turning on/off CLK with fast register bitbang IO
+ cspinmask, ///< bitmask for turning on/off CS with fast register bitbang IO
+ dcpinmask; ///< bitmask for turning on/off DC with fast register bitbang IO
+#endif
+
+ void writeCommand(uint8_t cmd);
+ void spiWrite(uint8_t v);
+ uint8_t spiRead(void);
+
+ uint8_t invertOnCommand = 0, ///< SPI command byte to turn on invert
+ invertOffCommand = 0; ///< SPI command byte to turn off invert
+ int16_t _xstart = 0; ///< Many displays don't have pixels starting at (0,0) of the internal framebuffer, this is the x offset from 0 to align
+ int16_t _ystart = 0; ///< Many displays don't have pixels starting at (0,0) of the internal framebuffer, this is the y offset from 0 to align
+};
+
+#endif
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Adafruit_SPITFT_Macros.h b/lib/Adafruit-GFX-Library-1.2.9/Adafruit_SPITFT_Macros.h
new file mode 100644
index 000000000000..f0466ef5fec3
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Adafruit_SPITFT_Macros.h
@@ -0,0 +1,118 @@
+#ifndef _ADAFRUIT_SPITFT_MACROS
+#define _ADAFRUIT_SPITFT_MACROS
+
+/*
+ * Control Pins
+ * */
+
+#ifdef USE_FAST_PINIO
+#define SPI_DC_HIGH() *dcport |= dcpinmask
+#define SPI_DC_LOW() *dcport &= ~dcpinmask
+#define SPI_CS_HIGH() *csport |= cspinmask
+#define SPI_CS_LOW() *csport &= ~cspinmask
+#else
+#define SPI_DC_HIGH() digitalWrite(_dc, HIGH)
+#define SPI_DC_LOW() digitalWrite(_dc, LOW)
+#define SPI_CS_HIGH() { if(_cs >= 0) digitalWrite(_cs, HIGH); }
+#define SPI_CS_LOW() { if(_cs >= 0) digitalWrite(_cs, LOW); }
+#endif
+
+/*
+ * Software SPI Macros
+ * */
+
+#ifdef USE_FAST_PINIO
+#define SSPI_MOSI_HIGH() *mosiport |= mosipinmask
+#define SSPI_MOSI_LOW() *mosiport &= ~mosipinmask
+#define SSPI_SCK_HIGH() *clkport |= clkpinmask
+#define SSPI_SCK_LOW() *clkport &= ~clkpinmask
+#define SSPI_MISO_READ() ((*misoport & misopinmask) != 0)
+#else
+#define SSPI_MOSI_HIGH() digitalWrite(_mosi, HIGH)
+#define SSPI_MOSI_LOW() digitalWrite(_mosi, LOW)
+#define SSPI_SCK_HIGH() digitalWrite(_sclk, HIGH)
+#define SSPI_SCK_LOW() digitalWrite(_sclk, LOW)
+#define SSPI_MISO_READ() digitalRead(_miso)
+#endif
+
+#define SSPI_BEGIN_TRANSACTION()
+#define SSPI_END_TRANSACTION()
+#define SSPI_WRITE(v) spiWrite(v)
+#define SSPI_WRITE16(s) SSPI_WRITE((s) >> 8); SSPI_WRITE(s)
+#define SSPI_WRITE32(l) SSPI_WRITE((l) >> 24); SSPI_WRITE((l) >> 16); SSPI_WRITE((l) >> 8); SSPI_WRITE(l)
+#define SSPI_WRITE_PIXELS(c,l) for(uint32_t i=0; i<(l); i+=2){ SSPI_WRITE(((uint8_t*)(c))[i+1]); SSPI_WRITE(((uint8_t*)(c))[i]); }
+
+/*
+ * Hardware SPI Macros
+ * */
+
+#define SPI_OBJECT SPI
+
+#if defined (__AVR__) || defined(TEENSYDUINO) || defined(ARDUINO_ARCH_STM32F1)
+ #define HSPI_SET_CLOCK() SPI_OBJECT.setClockDivider(SPI_CLOCK_DIV2);
+#elif defined (__arm__)
+ #define HSPI_SET_CLOCK() SPI_OBJECT.setClockDivider(11);
+#elif defined(ESP8266) || defined(ESP32)
+ #define HSPI_SET_CLOCK() SPI_OBJECT.setFrequency(_freq);
+#elif defined(RASPI)
+ #define HSPI_SET_CLOCK() SPI_OBJECT.setClock(_freq);
+#elif defined(ARDUINO_ARCH_STM32F1)
+ #define HSPI_SET_CLOCK() SPI_OBJECT.setClock(_freq);
+#else
+ #define HSPI_SET_CLOCK()
+#endif
+
+#ifdef SPI_HAS_TRANSACTION
+ #define HSPI_BEGIN_TRANSACTION() SPI_OBJECT.beginTransaction(SPISettings(_freq, MSBFIRST, SPI_MODE0))
+ #define HSPI_END_TRANSACTION() SPI_OBJECT.endTransaction()
+#else
+ #define HSPI_BEGIN_TRANSACTION() HSPI_SET_CLOCK(); SPI_OBJECT.setBitOrder(MSBFIRST); SPI_OBJECT.setDataMode(SPI_MODE0)
+ #define HSPI_END_TRANSACTION()
+#endif
+
+#ifdef ESP32
+ #define SPI_HAS_WRITE_PIXELS
+#endif
+#if defined(ESP8266) || defined(ESP32)
+ // Optimized SPI (ESP8266 and ESP32)
+ #define HSPI_READ() SPI_OBJECT.transfer(0)
+ #define HSPI_WRITE(b) SPI_OBJECT.write(b)
+ #define HSPI_WRITE16(s) SPI_OBJECT.write16(s)
+ #define HSPI_WRITE32(l) SPI_OBJECT.write32(l)
+ #ifdef SPI_HAS_WRITE_PIXELS
+ #define SPI_MAX_PIXELS_AT_ONCE 32
+ #define HSPI_WRITE_PIXELS(c,l) SPI_OBJECT.writePixels(c,l)
+ #else
+ #define HSPI_WRITE_PIXELS(c,l) for(uint32_t i=0; i<((l)/2); i++){ SPI_WRITE16(((uint16_t*)(c))[i]); }
+ #endif
+#else
+ // Standard Byte-by-Byte SPI
+
+ #if defined (__AVR__) || defined(TEENSYDUINO)
+static inline uint8_t _avr_spi_read(void) __attribute__((always_inline));
+static inline uint8_t _avr_spi_read(void) {
+ uint8_t r = 0;
+ SPDR = r;
+ while(!(SPSR & _BV(SPIF)));
+ r = SPDR;
+ return r;
+}
+ #define HSPI_WRITE(b) {SPDR = (b); while(!(SPSR & _BV(SPIF)));}
+ #define HSPI_READ() _avr_spi_read()
+ #else
+ #define HSPI_WRITE(b) SPI_OBJECT.transfer((uint8_t)(b))
+ #define HSPI_READ() HSPI_WRITE(0)
+ #endif
+ #define HSPI_WRITE16(s) HSPI_WRITE((s) >> 8); HSPI_WRITE(s)
+ #define HSPI_WRITE32(l) HSPI_WRITE((l) >> 24); HSPI_WRITE((l) >> 16); HSPI_WRITE((l) >> 8); HSPI_WRITE(l)
+ #define HSPI_WRITE_PIXELS(c,l) for(uint32_t i=0; i<(l); i+=2){ HSPI_WRITE(((uint8_t*)(c))[i+1]); HSPI_WRITE(((uint8_t*)(c))[i]); }
+#endif
+
+#define SPI_BEGIN() if(_sclk < 0){SPI_OBJECT.begin();}
+#define SPI_BEGIN_TRANSACTION() if(_sclk < 0){HSPI_BEGIN_TRANSACTION();}
+#define SPI_END_TRANSACTION() if(_sclk < 0){HSPI_END_TRANSACTION();}
+#define SPI_WRITE16(s) if(_sclk < 0){HSPI_WRITE16(s);}else{SSPI_WRITE16(s);}
+#define SPI_WRITE32(l) if(_sclk < 0){HSPI_WRITE32(l);}else{SSPI_WRITE32(l);}
+#define SPI_WRITE_PIXELS(c,l) if(_sclk < 0){HSPI_WRITE_PIXELS(c,l);}else{SSPI_WRITE_PIXELS(c,l);}
+
+#endif // _ADAFRUIT_SPITFT_MACROS
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMono12pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMono12pt7b.h
new file mode 100644
index 000000000000..94ecb883a817
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMono12pt7b.h
@@ -0,0 +1,227 @@
+const uint8_t FreeMono12pt7bBitmaps[] PROGMEM = {
+ 0x49, 0x24, 0x92, 0x48, 0x01, 0xF8, 0xE7, 0xE7, 0x67, 0x42, 0x42, 0x42,
+ 0x42, 0x09, 0x02, 0x41, 0x10, 0x44, 0x11, 0x1F, 0xF1, 0x10, 0x4C, 0x12,
+ 0x3F, 0xE1, 0x20, 0x48, 0x12, 0x04, 0x81, 0x20, 0x48, 0x04, 0x07, 0xA2,
+ 0x19, 0x02, 0x40, 0x10, 0x03, 0x00, 0x3C, 0x00, 0x80, 0x10, 0x06, 0x01,
+ 0xE0, 0xA7, 0xC0, 0x40, 0x10, 0x04, 0x00, 0x3C, 0x19, 0x84, 0x21, 0x08,
+ 0x66, 0x0F, 0x00, 0x0C, 0x1C, 0x78, 0x01, 0xE0, 0xCC, 0x21, 0x08, 0x43,
+ 0x30, 0x78, 0x3E, 0x30, 0x10, 0x08, 0x02, 0x03, 0x03, 0x47, 0x14, 0x8A,
+ 0x43, 0x11, 0x8F, 0x60, 0xFD, 0xA4, 0x90, 0x05, 0x25, 0x24, 0x92, 0x48,
+ 0x92, 0x24, 0x11, 0x24, 0x89, 0x24, 0x92, 0x92, 0x90, 0x00, 0x04, 0x02,
+ 0x11, 0x07, 0xF0, 0xC0, 0x50, 0x48, 0x42, 0x00, 0x08, 0x04, 0x02, 0x01,
+ 0x00, 0x87, 0xFC, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x3B, 0x9C, 0xCE,
+ 0x62, 0x00, 0xFF, 0xE0, 0xFF, 0x80, 0x00, 0x80, 0xC0, 0x40, 0x20, 0x20,
+ 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x00, 0x80,
+ 0x80, 0x40, 0x00, 0x1C, 0x31, 0x90, 0x58, 0x38, 0x0C, 0x06, 0x03, 0x01,
+ 0x80, 0xC0, 0x60, 0x30, 0x34, 0x13, 0x18, 0x70, 0x30, 0xE1, 0x44, 0x81,
+ 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x1F, 0xC0, 0x1E, 0x10, 0x90,
+ 0x68, 0x10, 0x08, 0x0C, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x0E,
+ 0x07, 0xFE, 0x3E, 0x10, 0x40, 0x08, 0x02, 0x00, 0x80, 0x40, 0xE0, 0x04,
+ 0x00, 0x80, 0x10, 0x04, 0x01, 0x00, 0xD8, 0x63, 0xE0, 0x06, 0x0A, 0x0A,
+ 0x12, 0x22, 0x22, 0x42, 0x42, 0x82, 0x82, 0xFF, 0x02, 0x02, 0x02, 0x0F,
+ 0x7F, 0x20, 0x10, 0x08, 0x04, 0x02, 0xF1, 0x8C, 0x03, 0x00, 0x80, 0x40,
+ 0x20, 0x18, 0x16, 0x18, 0xF0, 0x0F, 0x8C, 0x08, 0x08, 0x04, 0x04, 0x02,
+ 0x79, 0x46, 0xC1, 0xE0, 0x60, 0x28, 0x14, 0x19, 0x08, 0x78, 0xFF, 0x81,
+ 0x81, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08,
+ 0x08, 0x3E, 0x31, 0xB0, 0x70, 0x18, 0x0C, 0x05, 0x8C, 0x38, 0x63, 0x40,
+ 0x60, 0x30, 0x18, 0x1B, 0x18, 0xF8, 0x3C, 0x31, 0x30, 0x50, 0x28, 0x0C,
+ 0x0F, 0x06, 0x85, 0x3C, 0x80, 0x40, 0x40, 0x20, 0x20, 0x63, 0xE0, 0xFF,
+ 0x80, 0x07, 0xFC, 0x39, 0xCE, 0x00, 0x00, 0x06, 0x33, 0x98, 0xC4, 0x00,
+ 0x00, 0xC0, 0x60, 0x18, 0x0C, 0x06, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03,
+ 0x00, 0x30, 0x01, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0xFF, 0xC0, 0x06,
+ 0x00, 0x30, 0x01, 0x80, 0x18, 0x01, 0x80, 0xC0, 0x30, 0x18, 0x0C, 0x02,
+ 0x00, 0x00, 0x3E, 0x60, 0xA0, 0x20, 0x10, 0x08, 0x08, 0x18, 0x10, 0x08,
+ 0x00, 0x00, 0x00, 0x01, 0xC0, 0xE0, 0x1C, 0x31, 0x10, 0x50, 0x28, 0x14,
+ 0x3A, 0x25, 0x22, 0x91, 0x4C, 0xA3, 0xF0, 0x08, 0x02, 0x01, 0x80, 0x7C,
+ 0x3F, 0x00, 0x0C, 0x00, 0x48, 0x01, 0x20, 0x04, 0x40, 0x21, 0x00, 0x84,
+ 0x04, 0x08, 0x1F, 0xE0, 0x40, 0x82, 0x01, 0x08, 0x04, 0x20, 0x13, 0xE1,
+ 0xF0, 0xFF, 0x08, 0x11, 0x01, 0x20, 0x24, 0x04, 0x81, 0x1F, 0xC2, 0x06,
+ 0x40, 0x68, 0x05, 0x00, 0xA0, 0x14, 0x05, 0xFF, 0x00, 0x1E, 0x48, 0x74,
+ 0x05, 0x01, 0x80, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, 0x04, 0x01, 0x01,
+ 0x30, 0x87, 0xC0, 0xFE, 0x10, 0x44, 0x09, 0x02, 0x40, 0x50, 0x14, 0x05,
+ 0x01, 0x40, 0x50, 0x14, 0x0D, 0x02, 0x41, 0x3F, 0x80, 0xFF, 0xC8, 0x09,
+ 0x01, 0x20, 0x04, 0x00, 0x88, 0x1F, 0x02, 0x20, 0x40, 0x08, 0x01, 0x00,
+ 0xA0, 0x14, 0x03, 0xFF, 0xC0, 0xFF, 0xE8, 0x05, 0x00, 0xA0, 0x04, 0x00,
+ 0x88, 0x1F, 0x02, 0x20, 0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x01, 0xF0,
+ 0x00, 0x1F, 0x46, 0x19, 0x01, 0x60, 0x28, 0x01, 0x00, 0x20, 0x04, 0x00,
+ 0x83, 0xF0, 0x0B, 0x01, 0x20, 0x23, 0x0C, 0x3E, 0x00, 0xE1, 0xD0, 0x24,
+ 0x09, 0x02, 0x40, 0x90, 0x27, 0xF9, 0x02, 0x40, 0x90, 0x24, 0x09, 0x02,
+ 0x40, 0xB8, 0x70, 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x20,
+ 0x40, 0x81, 0x1F, 0xC0, 0x0F, 0xE0, 0x10, 0x02, 0x00, 0x40, 0x08, 0x01,
+ 0x00, 0x20, 0x04, 0x80, 0x90, 0x12, 0x02, 0x40, 0xC6, 0x30, 0x7C, 0x00,
+ 0xF1, 0xE4, 0x0C, 0x41, 0x04, 0x20, 0x44, 0x04, 0x80, 0x5C, 0x06, 0x60,
+ 0x43, 0x04, 0x10, 0x40, 0x84, 0x08, 0x40, 0xCF, 0x07, 0xF8, 0x04, 0x00,
+ 0x80, 0x10, 0x02, 0x00, 0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x04, 0x80,
+ 0x90, 0x12, 0x03, 0xFF, 0xC0, 0xE0, 0x3B, 0x01, 0x94, 0x14, 0xA0, 0xA4,
+ 0x89, 0x24, 0x49, 0x14, 0x48, 0xA2, 0x45, 0x12, 0x10, 0x90, 0x04, 0x80,
+ 0x24, 0x01, 0x78, 0x3C, 0xE0, 0xF6, 0x02, 0x50, 0x25, 0x02, 0x48, 0x24,
+ 0xC2, 0x44, 0x24, 0x22, 0x43, 0x24, 0x12, 0x40, 0xA4, 0x0A, 0x40, 0x6F,
+ 0x06, 0x0F, 0x03, 0x0C, 0x60, 0x64, 0x02, 0x80, 0x18, 0x01, 0x80, 0x18,
+ 0x01, 0x80, 0x18, 0x01, 0x40, 0x26, 0x06, 0x30, 0xC0, 0xF0, 0xFF, 0x10,
+ 0x64, 0x05, 0x01, 0x40, 0x50, 0x34, 0x19, 0xFC, 0x40, 0x10, 0x04, 0x01,
+ 0x00, 0x40, 0x3E, 0x00, 0x0F, 0x03, 0x0C, 0x60, 0x64, 0x02, 0x80, 0x18,
+ 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x40, 0x26, 0x06, 0x30, 0xC1,
+ 0xF0, 0x0C, 0x01, 0xF1, 0x30, 0xE0, 0xFF, 0x04, 0x18, 0x40, 0xC4, 0x04,
+ 0x40, 0x44, 0x0C, 0x41, 0x87, 0xE0, 0x43, 0x04, 0x10, 0x40, 0x84, 0x04,
+ 0x40, 0x4F, 0x03, 0x1F, 0x48, 0x34, 0x05, 0x01, 0x40, 0x08, 0x01, 0xC0,
+ 0x0E, 0x00, 0x40, 0x18, 0x06, 0x01, 0xE1, 0xA7, 0xC0, 0xFF, 0xF0, 0x86,
+ 0x10, 0x82, 0x00, 0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10,
+ 0x02, 0x00, 0x40, 0x7F, 0x00, 0xF0, 0xF4, 0x02, 0x40, 0x24, 0x02, 0x40,
+ 0x24, 0x02, 0x40, 0x24, 0x02, 0x40, 0x24, 0x02, 0x40, 0x22, 0x04, 0x30,
+ 0xC0, 0xF0, 0xF8, 0x7C, 0x80, 0x22, 0x01, 0x04, 0x04, 0x10, 0x20, 0x40,
+ 0x80, 0x82, 0x02, 0x10, 0x08, 0x40, 0x11, 0x00, 0x48, 0x01, 0xA0, 0x03,
+ 0x00, 0x0C, 0x00, 0xF8, 0x7C, 0x80, 0x22, 0x00, 0x88, 0xC2, 0x23, 0x10,
+ 0x8E, 0x42, 0x29, 0x09, 0x24, 0x24, 0x90, 0x91, 0x41, 0x85, 0x06, 0x14,
+ 0x18, 0x70, 0x60, 0x80, 0xF0, 0xF2, 0x06, 0x30, 0x41, 0x08, 0x09, 0x80,
+ 0x50, 0x06, 0x00, 0x60, 0x0D, 0x00, 0x88, 0x10, 0xC2, 0x04, 0x60, 0x2F,
+ 0x0F, 0xF0, 0xF2, 0x02, 0x10, 0x41, 0x04, 0x08, 0x80, 0x50, 0x05, 0x00,
+ 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x01, 0xFC, 0xFF, 0x40,
+ 0xA0, 0x90, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x50, 0x30, 0x18,
+ 0x0F, 0xFC, 0xF2, 0x49, 0x24, 0x92, 0x49, 0x24, 0x9C, 0x80, 0x60, 0x10,
+ 0x08, 0x02, 0x01, 0x00, 0x40, 0x20, 0x08, 0x04, 0x01, 0x00, 0x80, 0x20,
+ 0x10, 0x04, 0x02, 0x00, 0x80, 0x40, 0xE4, 0x92, 0x49, 0x24, 0x92, 0x49,
+ 0x3C, 0x08, 0x0C, 0x09, 0x0C, 0x4C, 0x14, 0x04, 0xFF, 0xFC, 0x84, 0x21,
+ 0x3E, 0x00, 0x60, 0x08, 0x02, 0x3F, 0x98, 0x28, 0x0A, 0x02, 0xC3, 0x9F,
+ 0x30, 0xE0, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, 0x13, 0xE0, 0xA0,
+ 0x86, 0x02, 0x20, 0x09, 0x00, 0x48, 0x02, 0x40, 0x13, 0x01, 0x14, 0x1B,
+ 0x9F, 0x00, 0x1F, 0x4C, 0x19, 0x01, 0x40, 0x28, 0x01, 0x00, 0x20, 0x02,
+ 0x00, 0x60, 0x43, 0xF0, 0x00, 0xC0, 0x08, 0x01, 0x00, 0x20, 0x04, 0x3C,
+ 0x98, 0x52, 0x06, 0x80, 0x50, 0x0A, 0x01, 0x40, 0x24, 0x0C, 0xC2, 0x87,
+ 0x98, 0x3F, 0x18, 0x68, 0x06, 0x01, 0xFF, 0xE0, 0x08, 0x03, 0x00, 0x60,
+ 0xC7, 0xC0, 0x0F, 0x98, 0x08, 0x04, 0x02, 0x07, 0xF8, 0x80, 0x40, 0x20,
+ 0x10, 0x08, 0x04, 0x02, 0x01, 0x03, 0xF8, 0x1E, 0x6C, 0x39, 0x03, 0x40,
+ 0x28, 0x05, 0x00, 0xA0, 0x12, 0x06, 0x61, 0x43, 0xC8, 0x01, 0x00, 0x20,
+ 0x08, 0x3E, 0x00, 0xC0, 0x10, 0x04, 0x01, 0x00, 0x40, 0x13, 0x87, 0x11,
+ 0x82, 0x40, 0x90, 0x24, 0x09, 0x02, 0x40, 0x90, 0x2E, 0x1C, 0x08, 0x04,
+ 0x02, 0x00, 0x00, 0x03, 0xC0, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00,
+ 0x80, 0x43, 0xFE, 0x04, 0x08, 0x10, 0x00, 0x1F, 0xC0, 0x81, 0x02, 0x04,
+ 0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x0B, 0xE0, 0xE0, 0x02, 0x00, 0x20,
+ 0x02, 0x00, 0x20, 0x02, 0x3C, 0x21, 0x02, 0x60, 0x2C, 0x03, 0x80, 0x24,
+ 0x02, 0x20, 0x21, 0x02, 0x08, 0xE1, 0xF0, 0x78, 0x04, 0x02, 0x01, 0x00,
+ 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x43, 0xFE,
+ 0xDC, 0xE3, 0x19, 0x90, 0x84, 0x84, 0x24, 0x21, 0x21, 0x09, 0x08, 0x48,
+ 0x42, 0x42, 0x17, 0x18, 0xC0, 0x67, 0x83, 0x84, 0x20, 0x22, 0x02, 0x20,
+ 0x22, 0x02, 0x20, 0x22, 0x02, 0x20, 0x2F, 0x07, 0x1F, 0x04, 0x11, 0x01,
+ 0x40, 0x18, 0x03, 0x00, 0x60, 0x0A, 0x02, 0x20, 0x83, 0xE0, 0xCF, 0x85,
+ 0x06, 0x60, 0x24, 0x01, 0x40, 0x14, 0x01, 0x40, 0x16, 0x02, 0x50, 0x44,
+ 0xF8, 0x40, 0x04, 0x00, 0x40, 0x0F, 0x00, 0x1E, 0x6C, 0x3B, 0x03, 0x40,
+ 0x28, 0x05, 0x00, 0xA0, 0x12, 0x06, 0x61, 0x43, 0xC8, 0x01, 0x00, 0x20,
+ 0x04, 0x03, 0xC0, 0xE3, 0x8B, 0x13, 0x80, 0x80, 0x20, 0x08, 0x02, 0x00,
+ 0x80, 0x20, 0x3F, 0x80, 0x1F, 0x58, 0x34, 0x05, 0x80, 0x1E, 0x00, 0x60,
+ 0x06, 0x01, 0xC0, 0xAF, 0xC0, 0x20, 0x04, 0x00, 0x80, 0x10, 0x0F, 0xF0,
+ 0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, 0x03, 0x04, 0x3F,
+ 0x00, 0xC1, 0xC8, 0x09, 0x01, 0x20, 0x24, 0x04, 0x80, 0x90, 0x12, 0x02,
+ 0x61, 0xC7, 0xCC, 0xF8, 0xF9, 0x01, 0x08, 0x10, 0x60, 0x81, 0x08, 0x08,
+ 0x40, 0x22, 0x01, 0x20, 0x05, 0x00, 0x30, 0x00, 0xF0, 0x7A, 0x01, 0x10,
+ 0x08, 0x8C, 0x42, 0x62, 0x12, 0x90, 0xA5, 0x05, 0x18, 0x28, 0xC0, 0x86,
+ 0x00, 0x78, 0xF3, 0x04, 0x18, 0x80, 0xD0, 0x06, 0x00, 0x70, 0x09, 0x81,
+ 0x0C, 0x20, 0x6F, 0x8F, 0xF0, 0xF2, 0x02, 0x20, 0x41, 0x04, 0x10, 0x80,
+ 0x88, 0x09, 0x00, 0x50, 0x06, 0x00, 0x20, 0x04, 0x00, 0x40, 0x08, 0x0F,
+ 0xE0, 0xFF, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0xBF,
+ 0xC0, 0x19, 0x08, 0x42, 0x10, 0x84, 0x64, 0x18, 0x42, 0x10, 0x84, 0x20,
+ 0xC0, 0xFF, 0xFF, 0xC0, 0xC1, 0x08, 0x42, 0x10, 0x84, 0x10, 0x4C, 0x42,
+ 0x10, 0x84, 0x26, 0x00, 0x38, 0x13, 0x38, 0x38 };
+
+const GFXglyph FreeMono12pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 14, 0, 1 }, // 0x20 ' '
+ { 0, 3, 15, 14, 6, -14 }, // 0x21 '!'
+ { 6, 8, 7, 14, 3, -14 }, // 0x22 '"'
+ { 13, 10, 16, 14, 2, -14 }, // 0x23 '#'
+ { 33, 10, 17, 14, 2, -14 }, // 0x24 '$'
+ { 55, 10, 15, 14, 2, -14 }, // 0x25 '%'
+ { 74, 9, 12, 14, 3, -11 }, // 0x26 '&'
+ { 88, 3, 7, 14, 5, -14 }, // 0x27 '''
+ { 91, 3, 18, 14, 7, -14 }, // 0x28 '('
+ { 98, 3, 18, 14, 4, -14 }, // 0x29 ')'
+ { 105, 9, 9, 14, 3, -14 }, // 0x2A '*'
+ { 116, 9, 11, 14, 3, -11 }, // 0x2B '+'
+ { 129, 5, 7, 14, 3, -3 }, // 0x2C ','
+ { 134, 11, 1, 14, 2, -6 }, // 0x2D '-'
+ { 136, 3, 3, 14, 5, -2 }, // 0x2E '.'
+ { 138, 9, 18, 14, 3, -15 }, // 0x2F '/'
+ { 159, 9, 15, 14, 3, -14 }, // 0x30 '0'
+ { 176, 7, 14, 14, 4, -13 }, // 0x31 '1'
+ { 189, 9, 15, 14, 2, -14 }, // 0x32 '2'
+ { 206, 10, 15, 14, 2, -14 }, // 0x33 '3'
+ { 225, 8, 15, 14, 3, -14 }, // 0x34 '4'
+ { 240, 9, 15, 14, 3, -14 }, // 0x35 '5'
+ { 257, 9, 15, 14, 3, -14 }, // 0x36 '6'
+ { 274, 8, 15, 14, 3, -14 }, // 0x37 '7'
+ { 289, 9, 15, 14, 3, -14 }, // 0x38 '8'
+ { 306, 9, 15, 14, 3, -14 }, // 0x39 '9'
+ { 323, 3, 10, 14, 5, -9 }, // 0x3A ':'
+ { 327, 5, 13, 14, 3, -9 }, // 0x3B ';'
+ { 336, 11, 11, 14, 2, -11 }, // 0x3C '<'
+ { 352, 12, 4, 14, 1, -8 }, // 0x3D '='
+ { 358, 11, 11, 14, 2, -11 }, // 0x3E '>'
+ { 374, 9, 14, 14, 3, -13 }, // 0x3F '?'
+ { 390, 9, 16, 14, 3, -14 }, // 0x40 '@'
+ { 408, 14, 14, 14, 0, -13 }, // 0x41 'A'
+ { 433, 11, 14, 14, 2, -13 }, // 0x42 'B'
+ { 453, 10, 14, 14, 2, -13 }, // 0x43 'C'
+ { 471, 10, 14, 14, 2, -13 }, // 0x44 'D'
+ { 489, 11, 14, 14, 2, -13 }, // 0x45 'E'
+ { 509, 11, 14, 14, 2, -13 }, // 0x46 'F'
+ { 529, 11, 14, 14, 2, -13 }, // 0x47 'G'
+ { 549, 10, 14, 14, 2, -13 }, // 0x48 'H'
+ { 567, 7, 14, 14, 4, -13 }, // 0x49 'I'
+ { 580, 11, 14, 14, 2, -13 }, // 0x4A 'J'
+ { 600, 12, 14, 14, 2, -13 }, // 0x4B 'K'
+ { 621, 11, 14, 14, 2, -13 }, // 0x4C 'L'
+ { 641, 13, 14, 14, 1, -13 }, // 0x4D 'M'
+ { 664, 12, 14, 14, 1, -13 }, // 0x4E 'N'
+ { 685, 12, 14, 14, 1, -13 }, // 0x4F 'O'
+ { 706, 10, 14, 14, 2, -13 }, // 0x50 'P'
+ { 724, 12, 17, 14, 1, -13 }, // 0x51 'Q'
+ { 750, 12, 14, 14, 2, -13 }, // 0x52 'R'
+ { 771, 10, 14, 14, 2, -13 }, // 0x53 'S'
+ { 789, 11, 14, 14, 2, -13 }, // 0x54 'T'
+ { 809, 12, 14, 14, 1, -13 }, // 0x55 'U'
+ { 830, 14, 14, 14, 0, -13 }, // 0x56 'V'
+ { 855, 14, 14, 14, 0, -13 }, // 0x57 'W'
+ { 880, 12, 14, 14, 1, -13 }, // 0x58 'X'
+ { 901, 12, 14, 14, 1, -13 }, // 0x59 'Y'
+ { 922, 9, 14, 14, 3, -13 }, // 0x5A 'Z'
+ { 938, 3, 18, 14, 7, -14 }, // 0x5B '['
+ { 945, 9, 18, 14, 3, -15 }, // 0x5C '\'
+ { 966, 3, 18, 14, 5, -14 }, // 0x5D ']'
+ { 973, 9, 6, 14, 3, -14 }, // 0x5E '^'
+ { 980, 14, 1, 14, 0, 3 }, // 0x5F '_'
+ { 982, 4, 4, 14, 4, -15 }, // 0x60 '`'
+ { 984, 10, 10, 14, 2, -9 }, // 0x61 'a'
+ { 997, 13, 15, 14, 0, -14 }, // 0x62 'b'
+ { 1022, 11, 10, 14, 2, -9 }, // 0x63 'c'
+ { 1036, 11, 15, 14, 2, -14 }, // 0x64 'd'
+ { 1057, 10, 10, 14, 2, -9 }, // 0x65 'e'
+ { 1070, 9, 15, 14, 4, -14 }, // 0x66 'f'
+ { 1087, 11, 14, 14, 2, -9 }, // 0x67 'g'
+ { 1107, 10, 15, 14, 2, -14 }, // 0x68 'h'
+ { 1126, 9, 15, 14, 3, -14 }, // 0x69 'i'
+ { 1143, 7, 19, 14, 3, -14 }, // 0x6A 'j'
+ { 1160, 12, 15, 14, 1, -14 }, // 0x6B 'k'
+ { 1183, 9, 15, 14, 3, -14 }, // 0x6C 'l'
+ { 1200, 13, 10, 14, 1, -9 }, // 0x6D 'm'
+ { 1217, 12, 10, 14, 1, -9 }, // 0x6E 'n'
+ { 1232, 11, 10, 14, 2, -9 }, // 0x6F 'o'
+ { 1246, 12, 14, 14, 1, -9 }, // 0x70 'p'
+ { 1267, 11, 14, 14, 2, -9 }, // 0x71 'q'
+ { 1287, 10, 10, 14, 3, -9 }, // 0x72 'r'
+ { 1300, 10, 10, 14, 2, -9 }, // 0x73 's'
+ { 1313, 11, 14, 14, 1, -13 }, // 0x74 't'
+ { 1333, 11, 10, 14, 2, -9 }, // 0x75 'u'
+ { 1347, 13, 10, 14, 1, -9 }, // 0x76 'v'
+ { 1364, 13, 10, 14, 1, -9 }, // 0x77 'w'
+ { 1381, 12, 10, 14, 1, -9 }, // 0x78 'x'
+ { 1396, 12, 14, 14, 1, -9 }, // 0x79 'y'
+ { 1417, 9, 10, 14, 3, -9 }, // 0x7A 'z'
+ { 1429, 5, 18, 14, 5, -14 }, // 0x7B '{'
+ { 1441, 1, 18, 14, 7, -14 }, // 0x7C '|'
+ { 1444, 5, 18, 14, 5, -14 }, // 0x7D '}'
+ { 1456, 10, 3, 14, 2, -7 } }; // 0x7E '~'
+
+const GFXfont FreeMono12pt7b PROGMEM = {
+ (uint8_t *)FreeMono12pt7bBitmaps,
+ (GFXglyph *)FreeMono12pt7bGlyphs,
+ 0x20, 0x7E, 24 };
+
+// Approx. 2132 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMono18pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMono18pt7b.h
new file mode 100644
index 000000000000..c605d296b83c
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMono18pt7b.h
@@ -0,0 +1,363 @@
+const uint8_t FreeMono18pt7bBitmaps[] PROGMEM = {
+ 0x27, 0x77, 0x77, 0x77, 0x77, 0x22, 0x22, 0x20, 0x00, 0x6F, 0xF6, 0xF1,
+ 0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1E, 0xC3, 0x98, 0x33, 0x06, 0x60, 0xCC,
+ 0x18, 0x04, 0x20, 0x10, 0x80, 0x42, 0x01, 0x08, 0x04, 0x20, 0x10, 0x80,
+ 0x42, 0x01, 0x10, 0x04, 0x41, 0xFF, 0xF0, 0x44, 0x02, 0x10, 0x08, 0x40,
+ 0x21, 0x0F, 0xFF, 0xC2, 0x10, 0x08, 0x40, 0x21, 0x00, 0x84, 0x02, 0x10,
+ 0x08, 0x40, 0x23, 0x00, 0x88, 0x02, 0x20, 0x02, 0x00, 0x10, 0x00, 0x80,
+ 0x1F, 0xA3, 0x07, 0x10, 0x09, 0x00, 0x48, 0x00, 0x40, 0x03, 0x00, 0x0C,
+ 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x18, 0x00, 0x20, 0x01, 0x80, 0x0C, 0x00,
+ 0x70, 0x05, 0xE0, 0xC9, 0xF8, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00,
+ 0x10, 0x00, 0x1E, 0x00, 0x42, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08,
+ 0x10, 0x08, 0x40, 0x0F, 0x00, 0x00, 0x1E, 0x01, 0xF0, 0x1F, 0x01, 0xE0,
+ 0x0E, 0x00, 0x00, 0x3C, 0x00, 0x86, 0x02, 0x06, 0x04, 0x04, 0x08, 0x08,
+ 0x10, 0x30, 0x10, 0xC0, 0x1E, 0x00, 0x0F, 0xC1, 0x00, 0x20, 0x02, 0x00,
+ 0x20, 0x02, 0x00, 0x10, 0x01, 0x00, 0x08, 0x03, 0xC0, 0x6C, 0x3C, 0x62,
+ 0x82, 0x68, 0x34, 0x81, 0xCC, 0x08, 0x61, 0xC3, 0xE7, 0xFF, 0xFF, 0xF6,
+ 0x66, 0x66, 0x08, 0xC4, 0x62, 0x31, 0x8C, 0xC6, 0x31, 0x8C, 0x63, 0x18,
+ 0xC3, 0x18, 0xC2, 0x18, 0xC3, 0x18, 0x86, 0x10, 0xC2, 0x18, 0xC6, 0x10,
+ 0xC6, 0x31, 0x8C, 0x63, 0x18, 0x8C, 0x62, 0x31, 0x98, 0x80, 0x02, 0x00,
+ 0x10, 0x00, 0x80, 0x04, 0x0C, 0x21, 0x9D, 0x70, 0x1C, 0x00, 0xA0, 0x0D,
+ 0x80, 0xC6, 0x04, 0x10, 0x40, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00,
+ 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0xFF, 0xFE, 0x02,
+ 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,
+ 0x01, 0x00, 0x3E, 0x78, 0xF3, 0xC7, 0x8E, 0x18, 0x70, 0xC1, 0x80, 0xFF,
+ 0xFE, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x08, 0x00, 0xC0, 0x04, 0x00, 0x60,
+ 0x02, 0x00, 0x30, 0x01, 0x00, 0x18, 0x00, 0x80, 0x0C, 0x00, 0x40, 0x02,
+ 0x00, 0x20, 0x01, 0x00, 0x10, 0x00, 0x80, 0x08, 0x00, 0x40, 0x04, 0x00,
+ 0x20, 0x02, 0x00, 0x10, 0x01, 0x00, 0x08, 0x00, 0x80, 0x04, 0x00, 0x00,
+ 0x0F, 0x81, 0x82, 0x08, 0x08, 0x80, 0x24, 0x01, 0x60, 0x0E, 0x00, 0x30,
+ 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00,
+ 0x30, 0x03, 0x40, 0x12, 0x00, 0x88, 0x08, 0x60, 0xC0, 0xF8, 0x00, 0x06,
+ 0x00, 0x70, 0x06, 0x80, 0x64, 0x06, 0x20, 0x31, 0x00, 0x08, 0x00, 0x40,
+ 0x02, 0x00, 0x10, 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00,
+ 0x40, 0x02, 0x00, 0x10, 0x00, 0x80, 0x04, 0x0F, 0xFF, 0x80, 0x0F, 0x80,
+ 0xC3, 0x08, 0x04, 0x80, 0x24, 0x00, 0x80, 0x04, 0x00, 0x20, 0x02, 0x00,
+ 0x10, 0x01, 0x00, 0x10, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80,
+ 0x18, 0x01, 0x80, 0x58, 0x03, 0x80, 0x1F, 0xFF, 0x80, 0x0F, 0xC0, 0xC0,
+ 0x86, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x04, 0x00,
+ 0x20, 0x0F, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x40,
+ 0x01, 0x00, 0x04, 0x00, 0x2C, 0x01, 0x9C, 0x0C, 0x0F, 0xC0, 0x01, 0xC0,
+ 0x14, 0x02, 0x40, 0x64, 0x04, 0x40, 0xC4, 0x08, 0x41, 0x84, 0x10, 0x42,
+ 0x04, 0x20, 0x44, 0x04, 0x40, 0x48, 0x04, 0xFF, 0xF0, 0x04, 0x00, 0x40,
+ 0x04, 0x00, 0x40, 0x04, 0x07, 0xF0, 0x3F, 0xF0, 0x80, 0x02, 0x00, 0x08,
+ 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x0B, 0xF0, 0x30, 0x30, 0x00, 0x60,
+ 0x00, 0x80, 0x01, 0x00, 0x04, 0x00, 0x10, 0x00, 0x40, 0x01, 0x00, 0x0E,
+ 0x00, 0x2C, 0x01, 0x0C, 0x18, 0x0F, 0xC0, 0x01, 0xF0, 0x60, 0x18, 0x03,
+ 0x00, 0x20, 0x04, 0x00, 0x40, 0x0C, 0x00, 0x80, 0x08, 0xF8, 0x98, 0x4A,
+ 0x02, 0xE0, 0x3C, 0x01, 0x80, 0x14, 0x01, 0x40, 0x14, 0x03, 0x20, 0x21,
+ 0x0C, 0x0F, 0x80, 0xFF, 0xF8, 0x01, 0x80, 0x18, 0x03, 0x00, 0x20, 0x02,
+ 0x00, 0x20, 0x04, 0x00, 0x40, 0x04, 0x00, 0xC0, 0x08, 0x00, 0x80, 0x18,
+ 0x01, 0x00, 0x10, 0x01, 0x00, 0x30, 0x02, 0x00, 0x20, 0x02, 0x00, 0x0F,
+ 0x81, 0x83, 0x10, 0x05, 0x80, 0x38, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x03,
+ 0x40, 0x11, 0x83, 0x07, 0xF0, 0x60, 0xC4, 0x01, 0x60, 0x0E, 0x00, 0x30,
+ 0x01, 0x80, 0x0E, 0x00, 0xD0, 0x04, 0x60, 0xC1, 0xFC, 0x00, 0x1F, 0x03,
+ 0x08, 0x40, 0x4C, 0x02, 0x80, 0x28, 0x02, 0x80, 0x18, 0x03, 0xC0, 0x74,
+ 0x05, 0x21, 0x91, 0xF1, 0x00, 0x10, 0x03, 0x00, 0x20, 0x02, 0x00, 0x40,
+ 0x0C, 0x01, 0x80, 0x60, 0xF8, 0x00, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x00,
+ 0x1D, 0xFF, 0xFD, 0xC0, 0x1C, 0x7C, 0xF9, 0xF1, 0xC0, 0x00, 0x00, 0x00,
+ 0x00, 0xF1, 0xE3, 0x8F, 0x1C, 0x38, 0xE1, 0xC3, 0x06, 0x00, 0x00, 0x06,
+ 0x00, 0x18, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x06, 0x00, 0x38,
+ 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x18, 0x00, 0x1C, 0x00, 0x0E,
+ 0x00, 0x07, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x07, 0xFF, 0xFC, 0xC0, 0x00, 0xC0, 0x00, 0xE0, 0x00, 0x70,
+ 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x70,
+ 0x03, 0x80, 0x0C, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0x60, 0x00, 0x3F,
+ 0x8E, 0x0C, 0x80, 0x28, 0x01, 0x80, 0x10, 0x01, 0x00, 0x10, 0x02, 0x00,
+ 0xC0, 0x38, 0x06, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E,
+ 0x01, 0xF0, 0x1F, 0x00, 0xE0, 0x0F, 0x01, 0x86, 0x08, 0x08, 0x80, 0x24,
+ 0x01, 0x40, 0x0A, 0x00, 0x50, 0x1E, 0x83, 0x14, 0x20, 0xA2, 0x05, 0x10,
+ 0x28, 0x81, 0x46, 0x0A, 0x18, 0x50, 0x3F, 0x80, 0x04, 0x00, 0x10, 0x00,
+ 0x80, 0x02, 0x00, 0x18, 0x18, 0x3F, 0x00, 0x1F, 0xF0, 0x00, 0x06, 0x80,
+ 0x00, 0x34, 0x00, 0x01, 0x30, 0x00, 0x18, 0x80, 0x00, 0x86, 0x00, 0x04,
+ 0x30, 0x00, 0x60, 0x80, 0x02, 0x06, 0x00, 0x10, 0x10, 0x01, 0x80, 0x80,
+ 0x08, 0x06, 0x00, 0x7F, 0xF0, 0x06, 0x00, 0x80, 0x20, 0x06, 0x01, 0x00,
+ 0x10, 0x18, 0x00, 0xC0, 0x80, 0x06, 0x04, 0x00, 0x11, 0xFC, 0x0F, 0xF0,
+ 0xFF, 0xF8, 0x04, 0x01, 0x01, 0x00, 0x20, 0x40, 0x04, 0x10, 0x01, 0x04,
+ 0x00, 0x41, 0x00, 0x10, 0x40, 0x08, 0x10, 0x0C, 0x07, 0xFF, 0x01, 0x00,
+ 0x70, 0x40, 0x06, 0x10, 0x00, 0x84, 0x00, 0x11, 0x00, 0x04, 0x40, 0x01,
+ 0x10, 0x00, 0x44, 0x00, 0x21, 0x00, 0x33, 0xFF, 0xF8, 0x03, 0xF1, 0x06,
+ 0x0E, 0x8C, 0x01, 0xC4, 0x00, 0x64, 0x00, 0x12, 0x00, 0x0A, 0x00, 0x01,
+ 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00,
+ 0x04, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x20, 0x01, 0x88, 0x01, 0x83,
+ 0x03, 0x80, 0x7E, 0x00, 0xFF, 0xE0, 0x20, 0x18, 0x20, 0x0C, 0x20, 0x04,
+ 0x20, 0x02, 0x20, 0x02, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01,
+ 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x02, 0x20, 0x02,
+ 0x20, 0x04, 0x20, 0x0C, 0x20, 0x18, 0xFF, 0xE0, 0xFF, 0xFF, 0x08, 0x00,
+ 0x84, 0x00, 0x42, 0x00, 0x21, 0x00, 0x10, 0x80, 0x00, 0x40, 0x00, 0x20,
+ 0x40, 0x10, 0x20, 0x0F, 0xF0, 0x04, 0x08, 0x02, 0x04, 0x01, 0x00, 0x00,
+ 0x80, 0x00, 0x40, 0x02, 0x20, 0x01, 0x10, 0x00, 0x88, 0x00, 0x44, 0x00,
+ 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0x88, 0x00, 0x44, 0x00, 0x22, 0x00, 0x11,
+ 0x00, 0x08, 0x80, 0x00, 0x40, 0x00, 0x20, 0x40, 0x10, 0x20, 0x0F, 0xF0,
+ 0x04, 0x08, 0x02, 0x04, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20,
+ 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xF9,
+ 0x06, 0x07, 0x84, 0x00, 0xC4, 0x00, 0x24, 0x00, 0x12, 0x00, 0x02, 0x00,
+ 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x0F, 0xF8,
+ 0x00, 0x14, 0x00, 0x09, 0x00, 0x04, 0x80, 0x02, 0x20, 0x01, 0x18, 0x00,
+ 0x83, 0x01, 0xC0, 0x7F, 0x00, 0xFC, 0x3F, 0x20, 0x04, 0x20, 0x04, 0x20,
+ 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x3F,
+ 0xFC, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20,
+ 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0xFC, 0x3F, 0xFF, 0xF8, 0x10,
+ 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00,
+ 0x10, 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02,
+ 0x00, 0x10, 0x00, 0x81, 0xFF, 0xF0, 0x03, 0xFF, 0x80, 0x04, 0x00, 0x02,
+ 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00,
+ 0x08, 0x00, 0x04, 0x00, 0x02, 0x10, 0x01, 0x08, 0x00, 0x84, 0x00, 0x42,
+ 0x00, 0x21, 0x00, 0x10, 0x80, 0x10, 0x20, 0x18, 0x0C, 0x18, 0x01, 0xF0,
+ 0x00, 0xFF, 0x1F, 0x84, 0x01, 0x81, 0x00, 0xC0, 0x40, 0x60, 0x10, 0x30,
+ 0x04, 0x18, 0x01, 0x0C, 0x00, 0x46, 0x00, 0x13, 0x00, 0x05, 0xF0, 0x01,
+ 0xC6, 0x00, 0x60, 0xC0, 0x10, 0x18, 0x04, 0x06, 0x01, 0x00, 0xC0, 0x40,
+ 0x30, 0x10, 0x04, 0x04, 0x01, 0x81, 0x00, 0x23, 0xFC, 0x0F, 0xFF, 0x80,
+ 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04,
+ 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00,
+ 0x42, 0x00, 0x84, 0x01, 0x08, 0x02, 0x10, 0x04, 0x20, 0x0F, 0xFF, 0xF0,
+ 0xF0, 0x01, 0xE7, 0x00, 0x70, 0xA0, 0x0A, 0x16, 0x03, 0x42, 0x40, 0x48,
+ 0x4C, 0x19, 0x08, 0x82, 0x21, 0x10, 0x44, 0x23, 0x18, 0x84, 0x22, 0x10,
+ 0x86, 0xC2, 0x10, 0x50, 0x42, 0x0E, 0x08, 0x41, 0xC1, 0x08, 0x00, 0x21,
+ 0x00, 0x04, 0x20, 0x00, 0x84, 0x00, 0x10, 0x80, 0x02, 0x7F, 0x03, 0xF0,
+ 0xF8, 0x1F, 0xC6, 0x00, 0x41, 0xC0, 0x10, 0x50, 0x04, 0x12, 0x01, 0x04,
+ 0xC0, 0x41, 0x10, 0x10, 0x46, 0x04, 0x10, 0x81, 0x04, 0x10, 0x41, 0x04,
+ 0x10, 0x40, 0x84, 0x10, 0x31, 0x04, 0x04, 0x41, 0x01, 0x90, 0x40, 0x24,
+ 0x10, 0x05, 0x04, 0x01, 0xC1, 0x00, 0x31, 0xFC, 0x0C, 0x03, 0xE0, 0x06,
+ 0x0C, 0x04, 0x01, 0x04, 0x00, 0x46, 0x00, 0x32, 0x00, 0x0B, 0x00, 0x05,
+ 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00,
+ 0x0E, 0x00, 0x0D, 0x00, 0x04, 0xC0, 0x06, 0x20, 0x02, 0x08, 0x02, 0x03,
+ 0x06, 0x00, 0x7C, 0x00, 0xFF, 0xF0, 0x10, 0x0C, 0x10, 0x02, 0x10, 0x03,
+ 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x03, 0x10, 0x06, 0x10, 0x0C,
+ 0x1F, 0xF0, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00,
+ 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xFF, 0xC0, 0x03, 0xE0, 0x06, 0x0C,
+ 0x04, 0x01, 0x04, 0x00, 0x46, 0x00, 0x32, 0x00, 0x0B, 0x00, 0x07, 0x00,
+ 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0E,
+ 0x00, 0x0D, 0x00, 0x04, 0xC0, 0x06, 0x20, 0x02, 0x08, 0x02, 0x03, 0x06,
+ 0x00, 0xFC, 0x00, 0x30, 0x00, 0x30, 0x00, 0x7F, 0xC6, 0x38, 0x1E, 0xFF,
+ 0xF0, 0x02, 0x01, 0x80, 0x40, 0x08, 0x08, 0x01, 0x81, 0x00, 0x10, 0x20,
+ 0x02, 0x04, 0x00, 0x40, 0x80, 0x18, 0x10, 0x06, 0x02, 0x03, 0x80, 0x7F,
+ 0xC0, 0x08, 0x18, 0x01, 0x01, 0x80, 0x20, 0x18, 0x04, 0x01, 0x80, 0x80,
+ 0x10, 0x10, 0x03, 0x02, 0x00, 0x20, 0x40, 0x06, 0x7F, 0x80, 0x70, 0x0F,
+ 0xC8, 0x61, 0xE2, 0x01, 0x90, 0x02, 0x40, 0x09, 0x00, 0x04, 0x00, 0x08,
+ 0x00, 0x38, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18,
+ 0x00, 0x60, 0x01, 0x80, 0x0F, 0x00, 0x2B, 0x03, 0x23, 0xF0, 0xFF, 0xFF,
+ 0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x10, 0x20, 0x20, 0x00, 0x40, 0x00,
+ 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20,
+ 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x01, 0xFF, 0xC0,
+ 0xFC, 0x1F, 0x90, 0x01, 0x08, 0x00, 0x84, 0x00, 0x42, 0x00, 0x21, 0x00,
+ 0x10, 0x80, 0x08, 0x40, 0x04, 0x20, 0x02, 0x10, 0x01, 0x08, 0x00, 0x84,
+ 0x00, 0x42, 0x00, 0x21, 0x00, 0x10, 0x80, 0x08, 0x40, 0x04, 0x10, 0x04,
+ 0x0C, 0x06, 0x03, 0x06, 0x00, 0x7C, 0x00, 0xFE, 0x03, 0xF8, 0x80, 0x02,
+ 0x04, 0x00, 0x10, 0x30, 0x01, 0x80, 0x80, 0x08, 0x06, 0x00, 0xC0, 0x30,
+ 0x06, 0x00, 0x80, 0x20, 0x06, 0x03, 0x00, 0x30, 0x10, 0x00, 0x80, 0x80,
+ 0x06, 0x0C, 0x00, 0x10, 0x40, 0x00, 0x86, 0x00, 0x06, 0x20, 0x00, 0x11,
+ 0x00, 0x00, 0xD8, 0x00, 0x06, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00,
+ 0xFC, 0x0F, 0xE8, 0x00, 0x19, 0x00, 0x03, 0x10, 0x00, 0x62, 0x00, 0x08,
+ 0x41, 0x81, 0x08, 0x28, 0x21, 0x05, 0x04, 0x21, 0xA0, 0x84, 0x36, 0x30,
+ 0x84, 0x46, 0x08, 0x88, 0xC1, 0x31, 0x18, 0x24, 0x12, 0x04, 0x82, 0x40,
+ 0xB0, 0x48, 0x14, 0x09, 0x02, 0x80, 0xA0, 0x30, 0x1C, 0x06, 0x03, 0x80,
+ 0x7E, 0x0F, 0xC2, 0x00, 0x60, 0x60, 0x0C, 0x06, 0x03, 0x00, 0x60, 0xC0,
+ 0x0C, 0x10, 0x00, 0xC6, 0x00, 0x0D, 0x80, 0x00, 0xA0, 0x00, 0x1C, 0x00,
+ 0x03, 0x80, 0x00, 0xD8, 0x00, 0x11, 0x00, 0x06, 0x30, 0x01, 0x83, 0x00,
+ 0x60, 0x30, 0x08, 0x06, 0x03, 0x00, 0x60, 0xC0, 0x06, 0x7F, 0x07, 0xF0,
+ 0xFC, 0x1F, 0x98, 0x03, 0x04, 0x01, 0x03, 0x01, 0x80, 0xC1, 0x80, 0x20,
+ 0x80, 0x18, 0xC0, 0x04, 0x40, 0x03, 0x60, 0x00, 0xE0, 0x00, 0x20, 0x00,
+ 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x80,
+ 0x00, 0x40, 0x00, 0x20, 0x03, 0xFF, 0x80, 0xFF, 0xF4, 0x00, 0xA0, 0x09,
+ 0x00, 0x48, 0x04, 0x40, 0x40, 0x02, 0x00, 0x20, 0x02, 0x00, 0x10, 0x01,
+ 0x00, 0x10, 0x00, 0x80, 0x08, 0x04, 0x80, 0x24, 0x01, 0x40, 0x0C, 0x00,
+ 0x60, 0x03, 0xFF, 0xF0, 0xFC, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08,
+ 0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, 0xF8, 0x80, 0x02, 0x00, 0x10,
+ 0x00, 0xC0, 0x02, 0x00, 0x18, 0x00, 0x40, 0x03, 0x00, 0x08, 0x00, 0x40,
+ 0x01, 0x00, 0x08, 0x00, 0x20, 0x01, 0x00, 0x04, 0x00, 0x20, 0x00, 0x80,
+ 0x04, 0x00, 0x10, 0x00, 0x80, 0x02, 0x00, 0x10, 0x00, 0x40, 0x02, 0x00,
+ 0x08, 0x00, 0x40, 0xF8, 0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, 0x84,
+ 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0xF8, 0x02, 0x00, 0x38, 0x03, 0x60,
+ 0x11, 0x01, 0x8C, 0x18, 0x31, 0x80, 0xD8, 0x03, 0x80, 0x08, 0xFF, 0xFF,
+ 0xF8, 0xC1, 0x83, 0x06, 0x0C, 0x0F, 0xC0, 0x70, 0x30, 0x00, 0x10, 0x00,
+ 0x08, 0x00, 0x08, 0x00, 0x08, 0x0F, 0xF8, 0x30, 0x08, 0x40, 0x08, 0x80,
+ 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x38, 0x60, 0xE8, 0x3F, 0x8F, 0xF0,
+ 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x04, 0x00,
+ 0x01, 0x0F, 0x80, 0x4C, 0x18, 0x14, 0x01, 0x06, 0x00, 0x21, 0x80, 0x08,
+ 0x40, 0x01, 0x10, 0x00, 0x44, 0x00, 0x11, 0x00, 0x04, 0x40, 0x01, 0x18,
+ 0x00, 0x86, 0x00, 0x21, 0xC0, 0x10, 0x5C, 0x18, 0xF1, 0xF8, 0x00, 0x07,
+ 0xE4, 0x30, 0x78, 0x80, 0x32, 0x00, 0x24, 0x00, 0x50, 0x00, 0x20, 0x00,
+ 0x40, 0x00, 0x80, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x12, 0x00, 0xC3,
+ 0x07, 0x01, 0xF8, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00,
+ 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x7C, 0x20, 0x60, 0xC8, 0x20, 0x0A,
+ 0x10, 0x01, 0x84, 0x00, 0x62, 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x88,
+ 0x00, 0x22, 0x00, 0x08, 0xC0, 0x06, 0x10, 0x01, 0x82, 0x00, 0xE0, 0x60,
+ 0xE8, 0x0F, 0xE3, 0xC0, 0x07, 0xE0, 0x1C, 0x18, 0x30, 0x0C, 0x60, 0x06,
+ 0x40, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0xFF, 0xFF, 0xC0, 0x00, 0xC0, 0x00,
+ 0x40, 0x00, 0x60, 0x00, 0x30, 0x03, 0x0C, 0x0E, 0x03, 0xF0, 0x03, 0xFC,
+ 0x18, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x0F, 0xFF, 0x82, 0x00,
+ 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80,
+ 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0xFF, 0xF0, 0x0F,
+ 0xC7, 0x9C, 0x3A, 0x18, 0x07, 0x08, 0x01, 0x8C, 0x00, 0xC4, 0x00, 0x22,
+ 0x00, 0x11, 0x00, 0x08, 0x80, 0x04, 0x40, 0x02, 0x10, 0x03, 0x08, 0x01,
+ 0x82, 0x01, 0x40, 0xC3, 0x20, 0x3F, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00,
+ 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0xF0, 0x00,
+ 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x47,
+ 0xC0, 0x2C, 0x18, 0x1C, 0x04, 0x0C, 0x01, 0x04, 0x00, 0x82, 0x00, 0x41,
+ 0x00, 0x20, 0x80, 0x10, 0x40, 0x08, 0x20, 0x04, 0x10, 0x02, 0x08, 0x01,
+ 0x04, 0x00, 0x82, 0x00, 0x47, 0xC0, 0xF8, 0x06, 0x00, 0x18, 0x00, 0x60,
+ 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x02, 0x00, 0x08,
+ 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02,
+ 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x03, 0xFF, 0xF0, 0x03, 0x00,
+ 0xC0, 0x30, 0x0C, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x40, 0x10, 0x04,
+ 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00,
+ 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x08, 0x06, 0xFE, 0x00, 0xF0,
+ 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10,
+ 0xFE, 0x10, 0x30, 0x10, 0xE0, 0x11, 0xC0, 0x13, 0x00, 0x16, 0x00, 0x1E,
+ 0x00, 0x1B, 0x00, 0x11, 0x80, 0x10, 0xC0, 0x10, 0x60, 0x10, 0x30, 0x10,
+ 0x18, 0x10, 0x1C, 0xF0, 0x3F, 0x7E, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80,
+ 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20,
+ 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08,
+ 0x00, 0x20, 0x00, 0x80, 0xFF, 0xFC, 0xEF, 0x9E, 0x07, 0x1E, 0x20, 0xC1,
+ 0x82, 0x10, 0x20, 0x42, 0x04, 0x08, 0x40, 0x81, 0x08, 0x10, 0x21, 0x02,
+ 0x04, 0x20, 0x40, 0x84, 0x08, 0x10, 0x81, 0x02, 0x10, 0x20, 0x42, 0x04,
+ 0x08, 0x40, 0x81, 0x3E, 0x1C, 0x38, 0x71, 0xF0, 0x0B, 0x06, 0x07, 0x01,
+ 0x03, 0x00, 0x41, 0x00, 0x20, 0x80, 0x10, 0x40, 0x08, 0x20, 0x04, 0x10,
+ 0x02, 0x08, 0x01, 0x04, 0x00, 0x82, 0x00, 0x41, 0x00, 0x20, 0x80, 0x13,
+ 0xF0, 0x3E, 0x07, 0xC0, 0x30, 0x60, 0x80, 0x22, 0x00, 0x24, 0x00, 0x50,
+ 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x05, 0x00, 0x12, 0x00,
+ 0x22, 0x00, 0x83, 0x06, 0x01, 0xF0, 0x00, 0xF1, 0xFC, 0x05, 0xC1, 0x81,
+ 0xC0, 0x10, 0x60, 0x02, 0x18, 0x00, 0xC4, 0x00, 0x11, 0x00, 0x04, 0x40,
+ 0x01, 0x10, 0x00, 0x44, 0x00, 0x11, 0x80, 0x08, 0x60, 0x02, 0x14, 0x01,
+ 0x04, 0xC1, 0x81, 0x0F, 0x80, 0x40, 0x00, 0x10, 0x00, 0x04, 0x00, 0x01,
+ 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xE3, 0xC6,
+ 0x0E, 0x86, 0x00, 0xE1, 0x00, 0x18, 0xC0, 0x06, 0x20, 0x00, 0x88, 0x00,
+ 0x22, 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x84, 0x00, 0x61, 0x00, 0x18,
+ 0x20, 0x0A, 0x06, 0x0C, 0x80, 0x7C, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00,
+ 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x0F, 0xF0, 0xF8,
+ 0x7C, 0x11, 0x8C, 0x2C, 0x00, 0x70, 0x00, 0xC0, 0x01, 0x00, 0x02, 0x00,
+ 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01,
+ 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xD1, 0x83, 0x98, 0x04, 0x80, 0x24, 0x00,
+ 0x30, 0x00, 0xF0, 0x00, 0xFC, 0x00, 0x30, 0x00, 0xE0, 0x03, 0x00, 0x1C,
+ 0x01, 0xF0, 0x1A, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
+ 0x00, 0x08, 0x00, 0xFF, 0xFC, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
+ 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
+ 0x00, 0x08, 0x00, 0x08, 0x01, 0x06, 0x0F, 0x03, 0xF8, 0xF0, 0x3E, 0x08,
+ 0x01, 0x04, 0x00, 0x82, 0x00, 0x41, 0x00, 0x20, 0x80, 0x10, 0x40, 0x08,
+ 0x20, 0x04, 0x10, 0x02, 0x08, 0x01, 0x04, 0x00, 0x82, 0x00, 0x41, 0x00,
+ 0xE0, 0x41, 0xD0, 0x1F, 0x8E, 0xFE, 0x0F, 0xE2, 0x00, 0x20, 0x60, 0x0C,
+ 0x0C, 0x01, 0x80, 0x80, 0x20, 0x18, 0x0C, 0x01, 0x01, 0x00, 0x30, 0x60,
+ 0x02, 0x08, 0x00, 0x41, 0x00, 0x0C, 0x60, 0x00, 0x88, 0x00, 0x19, 0x00,
+ 0x01, 0x40, 0x00, 0x38, 0x00, 0xFC, 0x07, 0xE4, 0x00, 0x10, 0x80, 0x02,
+ 0x18, 0x20, 0xC3, 0x0E, 0x18, 0x21, 0x42, 0x04, 0x28, 0x40, 0x8D, 0x88,
+ 0x19, 0x93, 0x03, 0x22, 0x60, 0x2C, 0x68, 0x05, 0x85, 0x00, 0xA0, 0xA0,
+ 0x1C, 0x1C, 0x01, 0x81, 0x80, 0x7C, 0x1F, 0x18, 0x03, 0x06, 0x03, 0x01,
+ 0x83, 0x00, 0x63, 0x00, 0x1B, 0x00, 0x07, 0x00, 0x03, 0x80, 0x03, 0x60,
+ 0x03, 0x18, 0x03, 0x06, 0x03, 0x01, 0x83, 0x00, 0x61, 0x00, 0x33, 0xF0,
+ 0x7E, 0xFC, 0x1F, 0x90, 0x01, 0x8C, 0x00, 0x86, 0x00, 0xC1, 0x80, 0x40,
+ 0xC0, 0x60, 0x20, 0x20, 0x18, 0x30, 0x04, 0x10, 0x03, 0x08, 0x00, 0x8C,
+ 0x00, 0x64, 0x00, 0x16, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x01, 0x00, 0x01,
+ 0x80, 0x00, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x20, 0x07, 0xFE, 0x00,
+ 0xFF, 0xF4, 0x01, 0x20, 0x09, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00,
+ 0xC0, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x14, 0x00, 0xA0, 0x07, 0xFF,
+ 0xE0, 0x07, 0x0C, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x30, 0xC0, 0x30, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x0C, 0x07, 0xFF, 0xFF, 0xFF, 0x80, 0xE0, 0x30, 0x10, 0x10, 0x10, 0x10,
+ 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x07, 0x0C, 0x10, 0x10, 0x10, 0x10,
+ 0x10, 0x10, 0x10, 0x10, 0x10, 0x30, 0xE0, 0x1C, 0x00, 0x44, 0x0D, 0x84,
+ 0x36, 0x04, 0x40, 0x07, 0x00 };
+
+const GFXglyph FreeMono18pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 21, 0, 1 }, // 0x20 ' '
+ { 0, 4, 22, 21, 8, -21 }, // 0x21 '!'
+ { 11, 11, 10, 21, 5, -20 }, // 0x22 '"'
+ { 25, 14, 24, 21, 3, -21 }, // 0x23 '#'
+ { 67, 13, 26, 21, 4, -22 }, // 0x24 '$'
+ { 110, 15, 21, 21, 3, -20 }, // 0x25 '%'
+ { 150, 12, 18, 21, 4, -17 }, // 0x26 '&'
+ { 177, 4, 10, 21, 8, -20 }, // 0x27 '''
+ { 182, 5, 25, 21, 10, -20 }, // 0x28 '('
+ { 198, 5, 25, 21, 6, -20 }, // 0x29 ')'
+ { 214, 13, 12, 21, 4, -20 }, // 0x2A '*'
+ { 234, 15, 17, 21, 3, -17 }, // 0x2B '+'
+ { 266, 7, 10, 21, 5, -4 }, // 0x2C ','
+ { 275, 15, 1, 21, 3, -9 }, // 0x2D '-'
+ { 277, 5, 5, 21, 8, -4 }, // 0x2E '.'
+ { 281, 13, 26, 21, 4, -22 }, // 0x2F '/'
+ { 324, 13, 21, 21, 4, -20 }, // 0x30 '0'
+ { 359, 13, 21, 21, 4, -20 }, // 0x31 '1'
+ { 394, 13, 21, 21, 3, -20 }, // 0x32 '2'
+ { 429, 14, 21, 21, 3, -20 }, // 0x33 '3'
+ { 466, 12, 21, 21, 4, -20 }, // 0x34 '4'
+ { 498, 14, 21, 21, 3, -20 }, // 0x35 '5'
+ { 535, 12, 21, 21, 5, -20 }, // 0x36 '6'
+ { 567, 12, 21, 21, 4, -20 }, // 0x37 '7'
+ { 599, 13, 21, 21, 4, -20 }, // 0x38 '8'
+ { 634, 12, 21, 21, 5, -20 }, // 0x39 '9'
+ { 666, 5, 15, 21, 8, -14 }, // 0x3A ':'
+ { 676, 7, 20, 21, 5, -14 }, // 0x3B ';'
+ { 694, 15, 16, 21, 3, -17 }, // 0x3C '<'
+ { 724, 17, 6, 21, 2, -12 }, // 0x3D '='
+ { 737, 15, 16, 21, 3, -17 }, // 0x3E '>'
+ { 767, 12, 20, 21, 5, -19 }, // 0x3F '?'
+ { 797, 13, 23, 21, 4, -20 }, // 0x40 '@'
+ { 835, 21, 20, 21, 0, -19 }, // 0x41 'A'
+ { 888, 18, 20, 21, 1, -19 }, // 0x42 'B'
+ { 933, 17, 20, 21, 2, -19 }, // 0x43 'C'
+ { 976, 16, 20, 21, 2, -19 }, // 0x44 'D'
+ { 1016, 17, 20, 21, 1, -19 }, // 0x45 'E'
+ { 1059, 17, 20, 21, 1, -19 }, // 0x46 'F'
+ { 1102, 17, 20, 21, 2, -19 }, // 0x47 'G'
+ { 1145, 16, 20, 21, 2, -19 }, // 0x48 'H'
+ { 1185, 13, 20, 21, 4, -19 }, // 0x49 'I'
+ { 1218, 17, 20, 21, 3, -19 }, // 0x4A 'J'
+ { 1261, 18, 20, 21, 1, -19 }, // 0x4B 'K'
+ { 1306, 15, 20, 21, 3, -19 }, // 0x4C 'L'
+ { 1344, 19, 20, 21, 1, -19 }, // 0x4D 'M'
+ { 1392, 18, 20, 21, 1, -19 }, // 0x4E 'N'
+ { 1437, 17, 20, 21, 2, -19 }, // 0x4F 'O'
+ { 1480, 16, 20, 21, 1, -19 }, // 0x50 'P'
+ { 1520, 17, 24, 21, 2, -19 }, // 0x51 'Q'
+ { 1571, 19, 20, 21, 1, -19 }, // 0x52 'R'
+ { 1619, 14, 20, 21, 3, -19 }, // 0x53 'S'
+ { 1654, 15, 20, 21, 3, -19 }, // 0x54 'T'
+ { 1692, 17, 20, 21, 2, -19 }, // 0x55 'U'
+ { 1735, 21, 20, 21, 0, -19 }, // 0x56 'V'
+ { 1788, 19, 20, 21, 1, -19 }, // 0x57 'W'
+ { 1836, 19, 20, 21, 1, -19 }, // 0x58 'X'
+ { 1884, 17, 20, 21, 2, -19 }, // 0x59 'Y'
+ { 1927, 13, 20, 21, 4, -19 }, // 0x5A 'Z'
+ { 1960, 5, 25, 21, 10, -20 }, // 0x5B '['
+ { 1976, 13, 26, 21, 4, -22 }, // 0x5C '\'
+ { 2019, 5, 25, 21, 6, -20 }, // 0x5D ']'
+ { 2035, 13, 9, 21, 4, -20 }, // 0x5E '^'
+ { 2050, 21, 1, 21, 0, 4 }, // 0x5F '_'
+ { 2053, 6, 5, 21, 5, -21 }, // 0x60 '`'
+ { 2057, 16, 15, 21, 3, -14 }, // 0x61 'a'
+ { 2087, 18, 21, 21, 1, -20 }, // 0x62 'b'
+ { 2135, 15, 15, 21, 3, -14 }, // 0x63 'c'
+ { 2164, 18, 21, 21, 2, -20 }, // 0x64 'd'
+ { 2212, 16, 15, 21, 2, -14 }, // 0x65 'e'
+ { 2242, 14, 21, 21, 4, -20 }, // 0x66 'f'
+ { 2279, 17, 22, 21, 2, -14 }, // 0x67 'g'
+ { 2326, 17, 21, 21, 1, -20 }, // 0x68 'h'
+ { 2371, 14, 22, 21, 4, -21 }, // 0x69 'i'
+ { 2410, 10, 29, 21, 5, -21 }, // 0x6A 'j'
+ { 2447, 16, 21, 21, 2, -20 }, // 0x6B 'k'
+ { 2489, 14, 21, 21, 4, -20 }, // 0x6C 'l'
+ { 2526, 19, 15, 21, 1, -14 }, // 0x6D 'm'
+ { 2562, 17, 15, 21, 1, -14 }, // 0x6E 'n'
+ { 2594, 15, 15, 21, 3, -14 }, // 0x6F 'o'
+ { 2623, 18, 22, 21, 1, -14 }, // 0x70 'p'
+ { 2673, 18, 22, 21, 2, -14 }, // 0x71 'q'
+ { 2723, 15, 15, 21, 3, -14 }, // 0x72 'r'
+ { 2752, 13, 15, 21, 4, -14 }, // 0x73 's'
+ { 2777, 16, 20, 21, 1, -19 }, // 0x74 't'
+ { 2817, 17, 15, 21, 1, -14 }, // 0x75 'u'
+ { 2849, 19, 15, 21, 1, -14 }, // 0x76 'v'
+ { 2885, 19, 15, 21, 1, -14 }, // 0x77 'w'
+ { 2921, 17, 15, 21, 2, -14 }, // 0x78 'x'
+ { 2953, 17, 22, 21, 2, -14 }, // 0x79 'y'
+ { 3000, 13, 15, 21, 4, -14 }, // 0x7A 'z'
+ { 3025, 8, 25, 21, 6, -20 }, // 0x7B '{'
+ { 3050, 1, 25, 21, 10, -20 }, // 0x7C '|'
+ { 3054, 8, 25, 21, 7, -20 }, // 0x7D '}'
+ { 3079, 15, 5, 21, 3, -11 } }; // 0x7E '~'
+
+const GFXfont FreeMono18pt7b PROGMEM = {
+ (uint8_t *)FreeMono18pt7bBitmaps,
+ (GFXglyph *)FreeMono18pt7bGlyphs,
+ 0x20, 0x7E, 35 };
+
+// Approx. 3761 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMono24pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMono24pt7b.h
new file mode 100644
index 000000000000..4c8bd151d6a0
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMono24pt7b.h
@@ -0,0 +1,577 @@
+const uint8_t FreeMono24pt7bBitmaps[] PROGMEM = {
+ 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x10, 0x84, 0x21, 0x08,
+ 0x00, 0x00, 0x00, 0x03, 0xBF, 0xFF, 0xB8, 0xFE, 0x7F, 0x7C, 0x3E, 0x7C,
+ 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x3C,
+ 0x3E, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x01,
+ 0x86, 0x00, 0x30, 0xC0, 0x06, 0x18, 0x00, 0xC3, 0x00, 0x18, 0x60, 0x03,
+ 0x0C, 0x00, 0x61, 0x80, 0x0C, 0x70, 0x01, 0x8C, 0x00, 0x61, 0x80, 0x0C,
+ 0x30, 0x3F, 0xFF, 0xF7, 0xFF, 0xFE, 0x06, 0x18, 0x00, 0xC3, 0x00, 0x18,
+ 0x60, 0x03, 0x0C, 0x00, 0x61, 0x80, 0x0C, 0x30, 0x7F, 0xFF, 0xEF, 0xFF,
+ 0xFC, 0x06, 0x18, 0x00, 0xC7, 0x00, 0x38, 0xC0, 0x06, 0x18, 0x00, 0xC3,
+ 0x00, 0x18, 0x60, 0x03, 0x0C, 0x00, 0x61, 0x80, 0x0C, 0x30, 0x01, 0x86,
+ 0x00, 0x30, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x0F, 0xC0,
+ 0x0F, 0xFD, 0x87, 0x03, 0xE3, 0x80, 0x39, 0xC0, 0x06, 0x60, 0x01, 0x98,
+ 0x00, 0x06, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0xC0, 0x00, 0x7F,
+ 0x80, 0x03, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03,
+ 0x80, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x80, 0x0E, 0xFC, 0x0F, 0x37,
+ 0xFF, 0x80, 0x7F, 0x80, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C,
+ 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x07, 0x80, 0x01, 0xFE, 0x00, 0x38,
+ 0x70, 0x03, 0x03, 0x00, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06,
+ 0x01, 0x80, 0x30, 0x30, 0x03, 0x87, 0x00, 0x1F, 0xE0, 0x30, 0x78, 0x1F,
+ 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x00, 0xF8, 0x00,
+ 0x0C, 0x01, 0xE0, 0x00, 0x7F, 0x80, 0x0E, 0x1C, 0x00, 0xC0, 0xC0, 0x18,
+ 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x0C, 0x0E, 0x00,
+ 0xE1, 0xC0, 0x07, 0xF8, 0x00, 0x1E, 0x00, 0x03, 0xEC, 0x01, 0xFF, 0x00,
+ 0xE1, 0x00, 0x70, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x30,
+ 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x7C, 0x00, 0x3B, 0x83,
+ 0xD8, 0x60, 0xFE, 0x0C, 0x33, 0x03, 0x98, 0xC0, 0x66, 0x30, 0x0D, 0x8C,
+ 0x03, 0xC3, 0x00, 0x70, 0x60, 0x1C, 0x1C, 0x0F, 0x03, 0x87, 0x7C, 0x7F,
+ 0x9F, 0x07, 0x80, 0x00, 0xFE, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x3C,
+ 0x70, 0xE1, 0xC3, 0x87, 0x00, 0x06, 0x1C, 0x30, 0xE1, 0x87, 0x0E, 0x18,
+ 0x70, 0xE1, 0xC3, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x0C,
+ 0x1C, 0x38, 0x70, 0x60, 0xE1, 0xC1, 0x83, 0x83, 0x06, 0x06, 0x04, 0xC1,
+ 0xC1, 0x83, 0x83, 0x07, 0x0E, 0x0C, 0x1C, 0x38, 0x70, 0xE0, 0xE1, 0xC3,
+ 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0x87, 0x0E, 0x1C, 0x30, 0x61, 0xC3,
+ 0x0E, 0x18, 0x70, 0xC1, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00,
+ 0x03, 0x00, 0x00, 0xC0, 0x10, 0x30, 0x3F, 0x8C, 0x7C, 0xFF, 0xFC, 0x07,
+ 0xF8, 0x00, 0x78, 0x00, 0x1F, 0x00, 0x0C, 0xC0, 0x06, 0x18, 0x03, 0x87,
+ 0x00, 0xC0, 0xC0, 0x60, 0x18, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60,
+ 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06,
+ 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
+ 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00,
+ 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00,
+ 0x1F, 0x8F, 0x87, 0xC7, 0xC3, 0xE1, 0xE1, 0xF0, 0xF0, 0x78, 0x38, 0x3C,
+ 0x1C, 0x0E, 0x06, 0x00, 0x7F, 0xFF, 0xFD, 0xFF, 0xFF, 0xF0, 0x7D, 0xFF,
+ 0xFF, 0xFF, 0xEF, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x18, 0x00,
+ 0x06, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x18, 0x00, 0x0C,
+ 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, 0x0C, 0x00,
+ 0x06, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x18, 0x00, 0x06,
+ 0x00, 0x03, 0x80, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x18, 0x00, 0x0E, 0x00,
+ 0x03, 0x00, 0x01, 0xC0, 0x00, 0x60, 0x00, 0x38, 0x00, 0x0C, 0x00, 0x07,
+ 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x03,
+ 0xF0, 0x03, 0xFF, 0x01, 0xE1, 0xE0, 0xE0, 0x18, 0x30, 0x03, 0x1C, 0x00,
+ 0xE6, 0x00, 0x19, 0x80, 0x06, 0xE0, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x0F,
+ 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0,
+ 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF8, 0x00,
+ 0x76, 0x00, 0x19, 0x80, 0x06, 0x70, 0x03, 0x8C, 0x00, 0xC3, 0x80, 0x60,
+ 0x78, 0x78, 0x0F, 0xFC, 0x00, 0xFC, 0x00, 0x03, 0x80, 0x07, 0x80, 0x0F,
+ 0x80, 0x1D, 0x80, 0x39, 0x80, 0x71, 0x80, 0xE1, 0x80, 0xC1, 0x80, 0x01,
+ 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
+ 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
+ 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
+ 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xF0, 0x03, 0xFF, 0x01, 0xC0, 0xE0,
+ 0xC0, 0x1C, 0x60, 0x03, 0xB8, 0x00, 0x6C, 0x00, 0x0F, 0x00, 0x03, 0x00,
+ 0x00, 0xC0, 0x00, 0x30, 0x00, 0x18, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01,
+ 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00,
+ 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30,
+ 0x00, 0xD0, 0x00, 0x38, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x03,
+ 0xF8, 0x01, 0xFF, 0xC0, 0x70, 0x3C, 0x18, 0x01, 0xC6, 0x00, 0x18, 0x00,
+ 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00,
+ 0x06, 0x00, 0x01, 0xC0, 0x00, 0x70, 0x01, 0xFC, 0x00, 0x3F, 0x00, 0x00,
+ 0x78, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00,
+ 0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0xD8, 0x00,
+ 0x3B, 0x80, 0x0E, 0x3E, 0x07, 0x81, 0xFF, 0xE0, 0x07, 0xE0, 0x00, 0x00,
+ 0x3C, 0x00, 0x7C, 0x00, 0x6C, 0x00, 0xCC, 0x00, 0x8C, 0x01, 0x8C, 0x03,
+ 0x0C, 0x03, 0x0C, 0x06, 0x0C, 0x04, 0x0C, 0x0C, 0x0C, 0x08, 0x0C, 0x10,
+ 0x0C, 0x30, 0x0C, 0x20, 0x0C, 0x60, 0x0C, 0x40, 0x0C, 0x80, 0x0C, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00,
+ 0x0C, 0x00, 0x0C, 0x00, 0xFF, 0x00, 0xFF, 0x3F, 0xFF, 0x07, 0xFF, 0xE0,
+ 0xC0, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0C, 0x00, 0x01,
+ 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xC7, 0xE0, 0x1F, 0xFF, 0x03,
+ 0x80, 0x70, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x60,
+ 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xC0,
+ 0x00, 0x30, 0x00, 0x06, 0xC0, 0x01, 0xDC, 0x00, 0x71, 0xF0, 0x3C, 0x0F,
+ 0xFF, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x80, 0x3F, 0xF0, 0x3E, 0x00, 0x1E,
+ 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x00, 0xC0, 0x00, 0x70, 0x00,
+ 0x18, 0x00, 0x06, 0x00, 0x03, 0x80, 0x00, 0xC1, 0xF8, 0x31, 0xFF, 0x0C,
+ 0xF0, 0xF3, 0x70, 0x0C, 0xD8, 0x01, 0xBC, 0x00, 0x6E, 0x00, 0x0F, 0x80,
+ 0x03, 0xC0, 0x00, 0xD8, 0x00, 0x36, 0x00, 0x0D, 0x80, 0x03, 0x30, 0x01,
+ 0x8E, 0x00, 0x61, 0xC0, 0x30, 0x38, 0x38, 0x07, 0xFC, 0x00, 0x7C, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x01, 0xC0,
+ 0x00, 0x60, 0x00, 0x18, 0x00, 0x0E, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00,
+ 0x30, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x30,
+ 0x00, 0x0C, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00,
+ 0x0C, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, 0x0C,
+ 0x00, 0x03, 0x00, 0x03, 0xF0, 0x03, 0xFF, 0x03, 0xC0, 0xF1, 0xC0, 0x0E,
+ 0x60, 0x01, 0xB8, 0x00, 0x7C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0,
+ 0x00, 0x36, 0x00, 0x18, 0xC0, 0x0C, 0x1C, 0x0E, 0x03, 0xFF, 0x00, 0xFF,
+ 0xC0, 0x70, 0x38, 0x30, 0x03, 0x18, 0x00, 0x66, 0x00, 0x1B, 0x00, 0x03,
+ 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0x60, 0x01, 0x98,
+ 0x00, 0xE3, 0x00, 0x70, 0x70, 0x38, 0x0F, 0xFC, 0x00, 0xFC, 0x00, 0x07,
+ 0xE0, 0x03, 0xFE, 0x01, 0xC1, 0xC0, 0xC0, 0x38, 0x60, 0x07, 0x18, 0x00,
+ 0xCC, 0x00, 0x1B, 0x00, 0x06, 0xC0, 0x01, 0xB0, 0x00, 0x3C, 0x00, 0x1F,
+ 0x00, 0x07, 0x60, 0x03, 0xD8, 0x01, 0xB3, 0x00, 0xCC, 0xF0, 0xF3, 0x0F,
+ 0xF8, 0xC1, 0xF8, 0x30, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00,
+ 0xE0, 0x00, 0x30, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x07, 0x80,
+ 0x07, 0xC0, 0xFF, 0xC0, 0x1F, 0xC0, 0x00, 0x7D, 0xFF, 0xFF, 0xFF, 0xEF,
+ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xFF, 0xFF,
+ 0xF7, 0xC0, 0x0F, 0x87, 0xF1, 0xFC, 0x7F, 0x1F, 0xC3, 0xE0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF1, 0xF8, 0x7C, 0x3F, 0x0F,
+ 0x83, 0xE0, 0xF0, 0x7C, 0x1E, 0x07, 0x81, 0xC0, 0xF0, 0x38, 0x04, 0x00,
+ 0x00, 0x00, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00,
+ 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x00,
+ 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00,
+ 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00,
+ 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x38, 0x00, 0x00,
+ 0x20, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF,
+ 0xFF, 0x7F, 0xFF, 0xFF, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00,
+ 0x1E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x03,
+ 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x3C, 0x00, 0x01, 0xE0,
+ 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x01, 0xE0,
+ 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x0E, 0x00, 0x00, 0x60,
+ 0x00, 0x00, 0x07, 0xF0, 0x1F, 0xFE, 0x3E, 0x07, 0x98, 0x00, 0xEC, 0x00,
+ 0x36, 0x00, 0x0F, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x01, 0xC0,
+ 0x00, 0xC0, 0x01, 0xC0, 0x03, 0xC0, 0x07, 0xC0, 0x07, 0x00, 0x03, 0x00,
+ 0x01, 0x80, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0x80, 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00,
+ 0x78, 0x00, 0x03, 0xF0, 0x03, 0xFF, 0x01, 0xE0, 0xE0, 0xE0, 0x1C, 0x30,
+ 0x03, 0x1C, 0x00, 0x66, 0x00, 0x19, 0x80, 0x06, 0xC0, 0x01, 0xB0, 0x07,
+ 0xEC, 0x07, 0xFB, 0x03, 0xC6, 0xC1, 0xC1, 0xB0, 0xE0, 0x6C, 0x30, 0x1B,
+ 0x0C, 0x06, 0xC3, 0x01, 0xB0, 0xC0, 0x6C, 0x18, 0x1B, 0x07, 0x86, 0xC0,
+ 0xFF, 0xF0, 0x0F, 0xFC, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00,
+ 0x07, 0x00, 0x00, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x80, 0xC0, 0xFF, 0xF0,
+ 0x0F, 0xE0, 0x07, 0xFF, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x1B, 0x00,
+ 0x00, 0x01, 0x98, 0x00, 0x00, 0x11, 0x80, 0x00, 0x03, 0x0C, 0x00, 0x00,
+ 0x30, 0xC0, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x60, 0x60, 0x00, 0x06, 0x06,
+ 0x00, 0x00, 0xC0, 0x30, 0x00, 0x0C, 0x03, 0x00, 0x00, 0x80, 0x30, 0x00,
+ 0x18, 0x01, 0x80, 0x01, 0x80, 0x18, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0xFF,
+ 0xFC, 0x00, 0x20, 0x00, 0xC0, 0x06, 0x00, 0x06, 0x00, 0x60, 0x00, 0x60,
+ 0x0C, 0x00, 0x06, 0x00, 0xC0, 0x00, 0x30, 0x0C, 0x00, 0x03, 0x01, 0x80,
+ 0x00, 0x18, 0x7F, 0xC0, 0x3F, 0xF7, 0xFC, 0x03, 0xFF, 0xFF, 0xFF, 0x03,
+ 0xFF, 0xFF, 0x01, 0x80, 0x0E, 0x06, 0x00, 0x1C, 0x18, 0x00, 0x38, 0x60,
+ 0x00, 0x61, 0x80, 0x01, 0x86, 0x00, 0x06, 0x18, 0x00, 0x38, 0x60, 0x01,
+ 0xC1, 0x80, 0x1E, 0x07, 0xFF, 0xE0, 0x1F, 0xFF, 0xC0, 0x60, 0x03, 0xC1,
+ 0x80, 0x03, 0x86, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x60, 0x00, 0x31, 0x80,
+ 0x00, 0xC6, 0x00, 0x03, 0x18, 0x00, 0x0C, 0x60, 0x00, 0x61, 0x80, 0x03,
+ 0x86, 0x00, 0x1C, 0xFF, 0xFF, 0xE3, 0xFF, 0xFE, 0x00, 0x00, 0xFC, 0x00,
+ 0x0F, 0xFE, 0x60, 0xF0, 0x3D, 0x87, 0x00, 0x3E, 0x38, 0x00, 0x38, 0xC0,
+ 0x00, 0xE7, 0x00, 0x01, 0x98, 0x00, 0x06, 0x60, 0x00, 0x03, 0x00, 0x00,
+ 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C,
+ 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00,
+ 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00,
+ 0xC7, 0x00, 0x06, 0x0E, 0x00, 0x70, 0x1E, 0x07, 0x80, 0x3F, 0xFC, 0x00,
+ 0x1F, 0x80, 0xFF, 0xFE, 0x03, 0xFF, 0xFE, 0x03, 0x00, 0x3C, 0x0C, 0x00,
+ 0x38, 0x30, 0x00, 0x70, 0xC0, 0x00, 0xC3, 0x00, 0x03, 0x8C, 0x00, 0x06,
+ 0x30, 0x00, 0x1C, 0xC0, 0x00, 0x33, 0x00, 0x00, 0xCC, 0x00, 0x03, 0x30,
+ 0x00, 0x0C, 0xC0, 0x00, 0x33, 0x00, 0x00, 0xCC, 0x00, 0x03, 0x30, 0x00,
+ 0x0C, 0xC0, 0x00, 0x33, 0x00, 0x01, 0x8C, 0x00, 0x06, 0x30, 0x00, 0x30,
+ 0xC0, 0x01, 0xC3, 0x00, 0x0E, 0x0C, 0x00, 0xF0, 0xFF, 0xFF, 0x83, 0xFF,
+ 0xF8, 0x00, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xE1, 0x80, 0x01, 0x86, 0x00,
+ 0x06, 0x18, 0x00, 0x18, 0x60, 0x00, 0x61, 0x80, 0x01, 0x86, 0x00, 0x00,
+ 0x18, 0x0C, 0x00, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x07, 0xFF, 0x00, 0x1F,
+ 0xFC, 0x00, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x06, 0x03, 0x00, 0x18, 0x00,
+ 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0xC6, 0x00, 0x03, 0x18, 0x00, 0x0C,
+ 0x60, 0x00, 0x31, 0x80, 0x00, 0xC6, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x80, 0x00, 0xC6, 0x00,
+ 0x03, 0x18, 0x00, 0x0C, 0x60, 0x00, 0x31, 0x80, 0x00, 0xC6, 0x00, 0x00,
+ 0x18, 0x0C, 0x00, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x07, 0xFF, 0x00, 0x1F,
+ 0xFC, 0x00, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x06, 0x03, 0x00, 0x18, 0x00,
+ 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00,
+ 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0xFF, 0xF0, 0x03, 0xFF,
+ 0xC0, 0x00, 0x00, 0xFF, 0x00, 0x07, 0xFF, 0x98, 0x1E, 0x03, 0xF0, 0x70,
+ 0x01, 0xE1, 0x80, 0x01, 0xC6, 0x00, 0x01, 0x9C, 0x00, 0x03, 0x30, 0x00,
+ 0x00, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00,
+ 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x03, 0xFF,
+ 0xC0, 0x07, 0xFF, 0x80, 0x00, 0x1B, 0x00, 0x00, 0x37, 0x00, 0x00, 0x66,
+ 0x00, 0x00, 0xCC, 0x00, 0x01, 0x8C, 0x00, 0x03, 0x1C, 0x00, 0x06, 0x1E,
+ 0x00, 0x0C, 0x0F, 0x00, 0xF8, 0x0F, 0xFF, 0xC0, 0x03, 0xFC, 0x00, 0x7F,
+ 0x01, 0xFC, 0xFE, 0x03, 0xF8, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80,
+ 0x03, 0x03, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00,
+ 0x30, 0x30, 0x00, 0x60, 0x60, 0x00, 0xC0, 0xFF, 0xFF, 0x81, 0xFF, 0xFF,
+ 0x03, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30,
+ 0x30, 0x00, 0x60, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03, 0x03,
+ 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0xFF, 0x01, 0xFF, 0xFE,
+ 0x03, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
+ 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
+ 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
+ 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
+ 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFE, 0x01, 0xFF, 0xFC,
+ 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00,
+ 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00,
+ 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00,
+ 0x30, 0x60, 0x00, 0x60, 0xC0, 0x00, 0xC1, 0x80, 0x01, 0x83, 0x00, 0x03,
+ 0x06, 0x00, 0x06, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x30, 0x38, 0x00, 0x60,
+ 0x38, 0x01, 0x80, 0x3C, 0x0E, 0x00, 0x3F, 0xF8, 0x00, 0x0F, 0xC0, 0x00,
+ 0xFF, 0x81, 0xFE, 0xFF, 0x81, 0xFE, 0x18, 0x00, 0x30, 0x18, 0x00, 0xE0,
+ 0x18, 0x01, 0xC0, 0x18, 0x03, 0x80, 0x18, 0x07, 0x00, 0x18, 0x0E, 0x00,
+ 0x18, 0x18, 0x00, 0x18, 0x70, 0x00, 0x18, 0xE0, 0x00, 0x19, 0xE0, 0x00,
+ 0x1B, 0xF8, 0x00, 0x1F, 0x1C, 0x00, 0x1C, 0x06, 0x00, 0x18, 0x03, 0x00,
+ 0x18, 0x03, 0x80, 0x18, 0x01, 0x80, 0x18, 0x00, 0xC0, 0x18, 0x00, 0xC0,
+ 0x18, 0x00, 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, 0x70, 0x18, 0x00, 0x30,
+ 0xFF, 0x80, 0x3F, 0xFF, 0x80, 0x1F, 0xFF, 0xF0, 0x07, 0xFF, 0x80, 0x01,
+ 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00,
+ 0x00, 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C,
+ 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00,
+ 0x06, 0x00, 0x18, 0x30, 0x00, 0xC1, 0x80, 0x06, 0x0C, 0x00, 0x30, 0x60,
+ 0x01, 0x83, 0x00, 0x0C, 0x18, 0x00, 0x60, 0xC0, 0x03, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xC0, 0xFC, 0x00, 0x0F, 0xFF, 0x00, 0x03, 0xF3, 0x60, 0x01,
+ 0xB0, 0xD8, 0x00, 0x6C, 0x33, 0x00, 0x33, 0x0C, 0xC0, 0x0C, 0xC3, 0x38,
+ 0x07, 0x30, 0xC6, 0x01, 0x8C, 0x31, 0xC0, 0xE3, 0x0C, 0x30, 0x30, 0xC3,
+ 0x0C, 0x0C, 0x30, 0xC1, 0x86, 0x0C, 0x30, 0x61, 0x83, 0x0C, 0x0C, 0xC0,
+ 0xC3, 0x03, 0x30, 0x30, 0xC0, 0x78, 0x0C, 0x30, 0x1E, 0x03, 0x0C, 0x03,
+ 0x00, 0xC3, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x0C, 0x30, 0x00, 0x03, 0x0C,
+ 0x00, 0x00, 0xC3, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x0C, 0xFF, 0x00, 0x3F,
+ 0xFF, 0xC0, 0x0F, 0xF0, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0x1E, 0x00,
+ 0x0C, 0x1F, 0x00, 0x0C, 0x1B, 0x00, 0x0C, 0x19, 0x80, 0x0C, 0x19, 0xC0,
+ 0x0C, 0x18, 0xC0, 0x0C, 0x18, 0x60, 0x0C, 0x18, 0x60, 0x0C, 0x18, 0x30,
+ 0x0C, 0x18, 0x38, 0x0C, 0x18, 0x18, 0x0C, 0x18, 0x0C, 0x0C, 0x18, 0x0E,
+ 0x0C, 0x18, 0x06, 0x0C, 0x18, 0x03, 0x0C, 0x18, 0x03, 0x0C, 0x18, 0x01,
+ 0x8C, 0x18, 0x01, 0xCC, 0x18, 0x00, 0xCC, 0x18, 0x00, 0x6C, 0x18, 0x00,
+ 0x7C, 0x18, 0x00, 0x3C, 0x7F, 0x80, 0x1C, 0x7F, 0x80, 0x1C, 0x00, 0x7E,
+ 0x00, 0x01, 0xFF, 0xC0, 0x07, 0x81, 0xE0, 0x0E, 0x00, 0x70, 0x1C, 0x00,
+ 0x38, 0x38, 0x00, 0x1C, 0x30, 0x00, 0x0C, 0x70, 0x00, 0x0E, 0x60, 0x00,
+ 0x06, 0x60, 0x00, 0x06, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00,
+ 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00,
+ 0x03, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x06, 0x60, 0x00, 0x06, 0x70, 0x00,
+ 0x0E, 0x30, 0x00, 0x0C, 0x38, 0x00, 0x1C, 0x1C, 0x00, 0x38, 0x0E, 0x00,
+ 0x70, 0x07, 0x81, 0xE0, 0x03, 0xFF, 0xC0, 0x00, 0x7E, 0x00, 0xFF, 0xFF,
+ 0x07, 0xFF, 0xFE, 0x06, 0x00, 0x78, 0x30, 0x00, 0xE1, 0x80, 0x03, 0x0C,
+ 0x00, 0x0C, 0x60, 0x00, 0x63, 0x00, 0x03, 0x18, 0x00, 0x18, 0xC0, 0x01,
+ 0xC6, 0x00, 0x0C, 0x30, 0x00, 0xC1, 0x80, 0x1E, 0x0F, 0xFF, 0xC0, 0x7F,
+ 0xF8, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x06, 0x00, 0x00,
+ 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00,
+ 0x00, 0xFF, 0xF0, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x7E, 0x00, 0x01, 0xFF,
+ 0x80, 0x07, 0x81, 0xE0, 0x0E, 0x00, 0x70, 0x1C, 0x00, 0x38, 0x38, 0x00,
+ 0x1C, 0x30, 0x00, 0x0C, 0x70, 0x00, 0x0E, 0x60, 0x00, 0x06, 0x60, 0x00,
+ 0x06, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00,
+ 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00,
+ 0x03, 0x60, 0x00, 0x06, 0x60, 0x00, 0x06, 0x70, 0x00, 0x0E, 0x30, 0x00,
+ 0x0C, 0x18, 0x00, 0x1C, 0x0C, 0x00, 0x38, 0x06, 0x00, 0x70, 0x03, 0x81,
+ 0xE0, 0x00, 0xFF, 0xC0, 0x00, 0x7E, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xFF,
+ 0x87, 0x07, 0xFF, 0xFE, 0x07, 0x00, 0xF8, 0xFF, 0xFE, 0x00, 0xFF, 0xFF,
+ 0x80, 0x18, 0x03, 0xC0, 0x18, 0x00, 0xE0, 0x18, 0x00, 0x60, 0x18, 0x00,
+ 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00,
+ 0x70, 0x18, 0x00, 0x60, 0x18, 0x01, 0xC0, 0x18, 0x07, 0x80, 0x1F, 0xFF,
+ 0x00, 0x1F, 0xFC, 0x00, 0x18, 0x0E, 0x00, 0x18, 0x07, 0x00, 0x18, 0x03,
+ 0x80, 0x18, 0x01, 0xC0, 0x18, 0x00, 0xE0, 0x18, 0x00, 0x60, 0x18, 0x00,
+ 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x18, 0xFF, 0x80, 0x1F, 0xFF, 0x80,
+ 0x0F, 0x03, 0xF8, 0x00, 0xFF, 0xE6, 0x1E, 0x07, 0xE3, 0x80, 0x1E, 0x30,
+ 0x00, 0xE6, 0x00, 0x06, 0x60, 0x00, 0x66, 0x00, 0x06, 0x60, 0x00, 0x07,
+ 0x00, 0x00, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0xC0,
+ 0x00, 0x3F, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00,
+ 0x30, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0xE0, 0x00, 0x7E, 0x00,
+ 0x06, 0xF8, 0x01, 0xED, 0xE0, 0x7C, 0xCF, 0xFF, 0x00, 0x3F, 0xC0, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x03, 0x00, 0xF0, 0x0C, 0x03, 0xC0, 0x30,
+ 0x0F, 0x00, 0xC0, 0x3C, 0x03, 0x00, 0xC0, 0x0C, 0x00, 0x00, 0x30, 0x00,
+ 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00,
+ 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0,
+ 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00,
+ 0x03, 0x00, 0x00, 0x0C, 0x00, 0x0F, 0xFF, 0xC0, 0x3F, 0xFF, 0x00, 0xFF,
+ 0x01, 0xFF, 0xFE, 0x03, 0xFC, 0xC0, 0x00, 0x61, 0x80, 0x00, 0xC3, 0x00,
+ 0x01, 0x86, 0x00, 0x03, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x30, 0x00,
+ 0x18, 0x60, 0x00, 0x30, 0xC0, 0x00, 0x61, 0x80, 0x00, 0xC3, 0x00, 0x01,
+ 0x86, 0x00, 0x03, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x30, 0x00, 0x18,
+ 0x60, 0x00, 0x30, 0xC0, 0x00, 0x61, 0x80, 0x00, 0xC3, 0x80, 0x03, 0x83,
+ 0x00, 0x06, 0x07, 0x00, 0x1C, 0x07, 0x00, 0x70, 0x07, 0x83, 0xC0, 0x07,
+ 0xFF, 0x00, 0x03, 0xF8, 0x00, 0x7F, 0xC0, 0x3F, 0xF7, 0xFC, 0x03, 0xFF,
+ 0x18, 0x00, 0x01, 0x80, 0xC0, 0x00, 0x30, 0x0C, 0x00, 0x03, 0x00, 0x60,
+ 0x00, 0x30, 0x06, 0x00, 0x06, 0x00, 0x60, 0x00, 0x60, 0x03, 0x00, 0x0C,
+ 0x00, 0x30, 0x00, 0xC0, 0x03, 0x80, 0x0C, 0x00, 0x18, 0x01, 0x80, 0x01,
+ 0x80, 0x18, 0x00, 0x0C, 0x03, 0x00, 0x00, 0xC0, 0x30, 0x00, 0x0E, 0x03,
+ 0x00, 0x00, 0x60, 0x60, 0x00, 0x06, 0x06, 0x00, 0x00, 0x30, 0xC0, 0x00,
+ 0x03, 0x0C, 0x00, 0x00, 0x30, 0x80, 0x00, 0x01, 0x98, 0x00, 0x00, 0x19,
+ 0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xE0, 0x00,
+ 0xFF, 0x80, 0x7F, 0xFF, 0xE0, 0x1F, 0xF3, 0x00, 0x00, 0x30, 0xC0, 0x00,
+ 0x0C, 0x30, 0x00, 0x03, 0x0C, 0x03, 0x80, 0xC3, 0x01, 0xE0, 0x30, 0x60,
+ 0x78, 0x0C, 0x18, 0x1F, 0x02, 0x06, 0x04, 0xC0, 0x81, 0x83, 0x30, 0x60,
+ 0x60, 0xCC, 0x18, 0x18, 0x31, 0x86, 0x06, 0x18, 0x61, 0x81, 0x86, 0x18,
+ 0x60, 0x71, 0x87, 0x18, 0x0C, 0x40, 0xC6, 0x03, 0x30, 0x31, 0x00, 0xCC,
+ 0x0C, 0xC0, 0x33, 0x01, 0xB0, 0x0D, 0x80, 0x6C, 0x03, 0x60, 0x1B, 0x00,
+ 0xD8, 0x06, 0xC0, 0x34, 0x00, 0xF0, 0x07, 0x00, 0x3C, 0x01, 0xC0, 0x0E,
+ 0x00, 0x7F, 0x00, 0xFF, 0x7F, 0x00, 0xFF, 0x18, 0x00, 0x18, 0x0C, 0x00,
+ 0x38, 0x0E, 0x00, 0x70, 0x07, 0x00, 0x60, 0x03, 0x00, 0xC0, 0x01, 0x81,
+ 0x80, 0x01, 0xC3, 0x80, 0x00, 0xE7, 0x00, 0x00, 0x76, 0x00, 0x00, 0x3C,
+ 0x00, 0x00, 0x18, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x66,
+ 0x00, 0x00, 0xC3, 0x00, 0x01, 0x81, 0x80, 0x03, 0x81, 0xC0, 0x07, 0x00,
+ 0xE0, 0x06, 0x00, 0x60, 0x0C, 0x00, 0x30, 0x18, 0x00, 0x18, 0x38, 0x00,
+ 0x1C, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00,
+ 0xFF, 0x18, 0x00, 0x18, 0x0C, 0x00, 0x30, 0x0E, 0x00, 0x70, 0x06, 0x00,
+ 0x60, 0x03, 0x00, 0xC0, 0x03, 0x81, 0xC0, 0x01, 0x81, 0x80, 0x00, 0xC3,
+ 0x00, 0x00, 0xE7, 0x00, 0x00, 0x66, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C,
+ 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18,
+ 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18,
+ 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x07, 0xFF, 0xE0, 0x07, 0xFF,
+ 0xE0, 0x7F, 0xFF, 0x9F, 0xFF, 0xE6, 0x00, 0x19, 0x80, 0x0C, 0x60, 0x07,
+ 0x18, 0x03, 0x86, 0x00, 0xC1, 0x80, 0x70, 0x00, 0x38, 0x00, 0x0C, 0x00,
+ 0x07, 0x00, 0x03, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x38, 0x00, 0x1C,
+ 0x00, 0x06, 0x00, 0x03, 0x80, 0x31, 0xC0, 0x0C, 0x60, 0x03, 0x30, 0x00,
+ 0xDC, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0,
+ 0xFF, 0xFF, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18,
+ 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06,
+ 0x0C, 0x18, 0x30, 0x60, 0xFF, 0xFC, 0xC0, 0x00, 0x30, 0x00, 0x06, 0x00,
+ 0x01, 0x80, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00,
+ 0x0C, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00,
+ 0xC0, 0x00, 0x18, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x06,
+ 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x80, 0x00, 0x60,
+ 0x00, 0x1C, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x18, 0x00, 0x07, 0x00,
+ 0x00, 0xC0, 0x00, 0x30, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00,
+ 0x0C, 0xFF, 0xFC, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30,
+ 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C,
+ 0x18, 0x30, 0x60, 0xC1, 0x83, 0xFF, 0xFC, 0x00, 0x40, 0x00, 0x30, 0x00,
+ 0x1E, 0x00, 0x0E, 0xC0, 0x07, 0x38, 0x01, 0x87, 0x00, 0xC0, 0xC0, 0x60,
+ 0x18, 0x38, 0x03, 0x1C, 0x00, 0xE6, 0x00, 0x1F, 0x00, 0x03, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xE0, 0x70, 0x3C, 0x0E, 0x07, 0x03,
+ 0x01, 0xFC, 0x00, 0x7F, 0xFC, 0x01, 0xC0, 0x3C, 0x00, 0x00, 0x30, 0x00,
+ 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00,
+ 0x60, 0x0F, 0xF9, 0x81, 0xFF, 0xFE, 0x0F, 0x80, 0x38, 0x70, 0x00, 0x63,
+ 0x80, 0x01, 0x8C, 0x00, 0x06, 0x30, 0x00, 0x18, 0xC0, 0x00, 0xE3, 0x00,
+ 0x07, 0x86, 0x00, 0x76, 0x1E, 0x07, 0x9F, 0x3F, 0xF8, 0x7C, 0x3F, 0x80,
+ 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00,
+ 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x1F, 0x80,
+ 0x18, 0xFF, 0xC0, 0x33, 0x81, 0xC0, 0x6E, 0x01, 0xC0, 0xF0, 0x00, 0xC1,
+ 0xE0, 0x01, 0xC3, 0x80, 0x01, 0x87, 0x00, 0x03, 0x8C, 0x00, 0x03, 0x18,
+ 0x00, 0x06, 0x30, 0x00, 0x0C, 0x60, 0x00, 0x18, 0xC0, 0x00, 0x31, 0x80,
+ 0x00, 0x63, 0x80, 0x01, 0x87, 0x00, 0x03, 0x0F, 0x00, 0x0E, 0x1F, 0x00,
+ 0x38, 0x37, 0x00, 0xE3, 0xE7, 0x03, 0x87, 0xC7, 0xFE, 0x00, 0x03, 0xF0,
+ 0x00, 0x01, 0xFC, 0x00, 0x3F, 0xF9, 0x83, 0xC0, 0xFC, 0x38, 0x01, 0xE3,
+ 0x00, 0x07, 0x38, 0x00, 0x19, 0x80, 0x00, 0xDC, 0x00, 0x06, 0xC0, 0x00,
+ 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60,
+ 0x00, 0x03, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x00, 0x01, 0x80, 0x00,
+ 0xC7, 0x00, 0x1E, 0x1E, 0x03, 0xC0, 0x7F, 0xFC, 0x00, 0xFF, 0x00, 0x00,
+ 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00,
+ 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x01, 0xF8, 0x18, 0x07,
+ 0xFE, 0x18, 0x0F, 0x07, 0x98, 0x1C, 0x01, 0xD8, 0x38, 0x00, 0xF8, 0x70,
+ 0x00, 0x78, 0x60, 0x00, 0x38, 0xE0, 0x00, 0x38, 0xC0, 0x00, 0x18, 0xC0,
+ 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0,
+ 0x00, 0x18, 0x60, 0x00, 0x38, 0x60, 0x00, 0x38, 0x70, 0x00, 0x78, 0x38,
+ 0x00, 0xD8, 0x1C, 0x01, 0xD8, 0x0F, 0x07, 0x9F, 0x07, 0xFE, 0x1F, 0x01,
+ 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x3F, 0xF8, 0x07, 0x80, 0xF0, 0x70, 0x01,
+ 0xC3, 0x00, 0x07, 0x30, 0x00, 0x19, 0x80, 0x00, 0x78, 0x00, 0x03, 0xC0,
+ 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x0C, 0x00, 0x00,
+ 0x60, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x01, 0xC0,
+ 0x00, 0xC7, 0x00, 0x0E, 0x1E, 0x03, 0xE0, 0x3F, 0xFC, 0x00, 0x7F, 0x00,
+ 0x00, 0x7F, 0xC0, 0x3F, 0xFC, 0x0E, 0x00, 0x03, 0x80, 0x00, 0x60, 0x00,
+ 0x0C, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0xFF, 0xFF, 0x9F, 0xFF, 0xF0,
+ 0x18, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00,
+ 0x30, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00,
+ 0x60, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00,
+ 0xC0, 0x03, 0xFF, 0xFC, 0x7F, 0xFF, 0x80, 0x01, 0xF8, 0x00, 0x0F, 0xFC,
+ 0x7C, 0x38, 0x1C, 0xF8, 0xE0, 0x0D, 0x83, 0x00, 0x0F, 0x0E, 0x00, 0x1E,
+ 0x18, 0x00, 0x1C, 0x70, 0x00, 0x38, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x63,
+ 0x00, 0x00, 0xC6, 0x00, 0x01, 0x8C, 0x00, 0x03, 0x18, 0x00, 0x06, 0x18,
+ 0x00, 0x1C, 0x30, 0x00, 0x38, 0x30, 0x00, 0xF0, 0x70, 0x03, 0x60, 0x78,
+ 0x1C, 0xC0, 0x3F, 0xF1, 0x80, 0x1F, 0x83, 0x00, 0x00, 0x06, 0x00, 0x00,
+ 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03,
+ 0x80, 0x00, 0x0E, 0x00, 0x3F, 0xF8, 0x00, 0x7F, 0xC0, 0x00, 0xF8, 0x00,
+ 0x01, 0xF0, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00,
+ 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x3F, 0x00, 0x18, 0xFF, 0x80,
+ 0x37, 0x03, 0x80, 0x7C, 0x03, 0x80, 0xF0, 0x03, 0x81, 0xC0, 0x03, 0x03,
+ 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, 0x30,
+ 0x00, 0x60, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03, 0x03, 0x00,
+ 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, 0x30, 0x00,
+ 0x63, 0xFC, 0x07, 0xFF, 0xF8, 0x0F, 0xF0, 0x01, 0xC0, 0x00, 0x70, 0x00,
+ 0x1C, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x03, 0xFC, 0x00, 0x03, 0x00, 0x00, 0xC0,
+ 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00,
+ 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03,
+ 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x03, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xC0, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0x00, 0x0C,
+ 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03,
+ 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00,
+ 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00,
+ 0x70, 0x03, 0x80, 0x1C, 0xFF, 0xE3, 0xFF, 0x00, 0xF8, 0x00, 0x03, 0xE0,
+ 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00,
+ 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x1F, 0xE0, 0x60, 0x7F, 0x81,
+ 0x80, 0x60, 0x06, 0x07, 0x00, 0x18, 0x38, 0x00, 0x61, 0xC0, 0x01, 0x8E,
+ 0x00, 0x06, 0x70, 0x00, 0x1B, 0x80, 0x00, 0x7F, 0x00, 0x01, 0xCE, 0x00,
+ 0x06, 0x1C, 0x00, 0x18, 0x38, 0x00, 0x60, 0x70, 0x01, 0x80, 0xE0, 0x06,
+ 0x01, 0xC0, 0x18, 0x03, 0x80, 0x60, 0x07, 0x0F, 0x80, 0x7F, 0xFE, 0x01,
+ 0xFF, 0x3F, 0xC0, 0x0F, 0xF0, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0,
+ 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00,
+ 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03,
+ 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0,
+ 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x0F,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xF0, 0x3C, 0x0F, 0x9F, 0x87, 0xE0, 0xFB,
+ 0x1C, 0xC7, 0x01, 0xE0, 0xD8, 0x38, 0x1C, 0x07, 0x01, 0x81, 0x80, 0x60,
+ 0x18, 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x81,
+ 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06,
+ 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18,
+ 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x8F, 0xE0,
+ 0x7C, 0x1F, 0xFE, 0x07, 0xC1, 0xF0, 0x00, 0x1F, 0x00, 0xF8, 0xFF, 0x81,
+ 0xF3, 0x83, 0x80, 0x6C, 0x03, 0x80, 0xF0, 0x03, 0x81, 0xC0, 0x03, 0x03,
+ 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, 0x30,
+ 0x00, 0x60, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03, 0x03, 0x00,
+ 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, 0x30, 0x00,
+ 0x67, 0xFC, 0x03, 0xFF, 0xF8, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0xFE,
+ 0x00, 0xF0, 0x3C, 0x07, 0x00, 0x38, 0x38, 0x00, 0x71, 0xC0, 0x00, 0xE6,
+ 0x00, 0x01, 0x98, 0x00, 0x06, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00,
+ 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x36, 0x00, 0x01,
+ 0x98, 0x00, 0x06, 0x70, 0x00, 0x38, 0xE0, 0x01, 0xC1, 0xC0, 0x0E, 0x03,
+ 0xC0, 0xF0, 0x07, 0xFF, 0x80, 0x03, 0xF0, 0x00, 0x00, 0x3F, 0x01, 0xF1,
+ 0xFF, 0x83, 0xE7, 0x03, 0x80, 0xD8, 0x01, 0x81, 0xE0, 0x01, 0x83, 0xC0,
+ 0x03, 0x87, 0x00, 0x03, 0x0E, 0x00, 0x07, 0x18, 0x00, 0x06, 0x30, 0x00,
+ 0x0C, 0x60, 0x00, 0x18, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x63, 0x00, 0x00,
+ 0xC7, 0x00, 0x03, 0x0E, 0x00, 0x06, 0x1E, 0x00, 0x18, 0x36, 0x00, 0x70,
+ 0x67, 0x03, 0xC0, 0xC7, 0xFE, 0x01, 0x83, 0xF0, 0x03, 0x00, 0x00, 0x06,
+ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60,
+ 0x00, 0x00, 0xC0, 0x00, 0x0F, 0xFC, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x01,
+ 0xF8, 0x00, 0x07, 0xFF, 0x1F, 0x0F, 0x07, 0x9F, 0x1C, 0x01, 0xD8, 0x38,
+ 0x00, 0x78, 0x70, 0x00, 0x78, 0x60, 0x00, 0x38, 0xE0, 0x00, 0x38, 0xC0,
+ 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0,
+ 0x00, 0x18, 0xC0, 0x00, 0x18, 0x60, 0x00, 0x38, 0x70, 0x00, 0x78, 0x30,
+ 0x00, 0x78, 0x1C, 0x01, 0xD8, 0x0F, 0x07, 0x98, 0x07, 0xFF, 0x18, 0x01,
+ 0xFC, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00,
+ 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00,
+ 0x03, 0xFF, 0x00, 0x03, 0xFF, 0x7E, 0x03, 0xC3, 0xF0, 0x7F, 0x81, 0x8F,
+ 0x0E, 0x0C, 0xE0, 0x00, 0x7E, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x00,
+ 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00,
+ 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x06,
+ 0x00, 0x00, 0x30, 0x00, 0x3F, 0xFF, 0xC1, 0xFF, 0xFE, 0x00, 0x07, 0xF0,
+ 0x07, 0xFF, 0x63, 0xC0, 0xF9, 0xC0, 0x0E, 0x60, 0x01, 0x98, 0x00, 0x66,
+ 0x00, 0x19, 0xC0, 0x00, 0x38, 0x00, 0x07, 0xC0, 0x00, 0x7F, 0xC0, 0x00,
+ 0x7C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00,
+ 0xF8, 0x00, 0x7F, 0x00, 0x3B, 0xF0, 0x3C, 0xDF, 0xFE, 0x00, 0xFE, 0x00,
+ 0x0C, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0,
+ 0x00, 0x06, 0x00, 0x03, 0xFF, 0xFE, 0x1F, 0xFF, 0xF0, 0x0C, 0x00, 0x00,
+ 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x06, 0x00,
+ 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x03,
+ 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00,
+ 0x00, 0xC0, 0x07, 0x07, 0x01, 0xF0, 0x1F, 0xFF, 0x00, 0x3F, 0x80, 0xF8,
+ 0x03, 0xF1, 0xF0, 0x07, 0xE0, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80,
+ 0x03, 0x03, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00,
+ 0x30, 0x30, 0x00, 0x60, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03,
+ 0x03, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x38, 0x18, 0x00, 0xF0,
+ 0x18, 0x03, 0x60, 0x38, 0x3C, 0xF8, 0x3F, 0xF1, 0xF0, 0x1F, 0x00, 0x00,
+ 0x7F, 0xC0, 0xFF, 0xDF, 0xF0, 0x3F, 0xF0, 0xC0, 0x00, 0xC0, 0x30, 0x00,
+ 0x30, 0x06, 0x00, 0x1C, 0x01, 0x80, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C,
+ 0x00, 0xC0, 0x03, 0x80, 0x30, 0x00, 0x60, 0x18, 0x00, 0x18, 0x06, 0x00,
+ 0x03, 0x03, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x18, 0x30, 0x00, 0x06, 0x18,
+ 0x00, 0x00, 0xC6, 0x00, 0x00, 0x33, 0x00, 0x00, 0x0E, 0xC0, 0x00, 0x01,
+ 0xE0, 0x00, 0x00, 0x78, 0x00, 0x7F, 0x00, 0x3F, 0xDF, 0xC0, 0x0F, 0xF1,
+ 0x80, 0x00, 0x20, 0x60, 0x00, 0x18, 0x18, 0x00, 0x06, 0x06, 0x03, 0x01,
+ 0x80, 0x81, 0xE0, 0x60, 0x30, 0x78, 0x10, 0x0C, 0x1E, 0x0C, 0x03, 0x0C,
+ 0xC3, 0x00, 0xC3, 0x30, 0xC0, 0x10, 0xCC, 0x30, 0x06, 0x61, 0x98, 0x01,
+ 0x98, 0x66, 0x00, 0x66, 0x19, 0x80, 0x0B, 0x03, 0x60, 0x03, 0xC0, 0xD0,
+ 0x00, 0xF0, 0x1C, 0x00, 0x38, 0x07, 0x00, 0x0E, 0x01, 0xC0, 0x3F, 0x81,
+ 0xFE, 0x3F, 0x81, 0xFE, 0x0C, 0x00, 0x38, 0x06, 0x00, 0x70, 0x03, 0x00,
+ 0xE0, 0x01, 0x81, 0xC0, 0x00, 0xC3, 0x80, 0x00, 0x67, 0x00, 0x00, 0x3C,
+ 0x00, 0x00, 0x18, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x67, 0x00, 0x00, 0xC3,
+ 0x80, 0x01, 0x81, 0xC0, 0x03, 0x00, 0xE0, 0x06, 0x00, 0x70, 0x0C, 0x00,
+ 0x38, 0x18, 0x00, 0x1C, 0x7F, 0x81, 0xFF, 0x7F, 0x81, 0xFF, 0x7F, 0x00,
+ 0xFF, 0x7F, 0x00, 0xFF, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x0C, 0x00,
+ 0x18, 0x0C, 0x00, 0x30, 0x06, 0x00, 0x30, 0x06, 0x00, 0x60, 0x03, 0x00,
+ 0x60, 0x03, 0x00, 0xC0, 0x01, 0x80, 0xC0, 0x01, 0x81, 0x80, 0x00, 0xC1,
+ 0x80, 0x00, 0xC3, 0x00, 0x00, 0x63, 0x00, 0x00, 0x66, 0x00, 0x00, 0x36,
+ 0x00, 0x00, 0x34, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18,
+ 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60,
+ 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFC,
+ 0x00, 0xFF, 0xFF, 0x7F, 0xFF, 0xB0, 0x01, 0x98, 0x01, 0xCC, 0x01, 0xC0,
+ 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xE0,
+ 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x03, 0x70,
+ 0x01, 0xB0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xE0, 0x7C, 0x0C,
+ 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03,
+ 0x00, 0x60, 0x0C, 0x03, 0x00, 0xE0, 0xF0, 0x1E, 0x00, 0x70, 0x06, 0x00,
+ 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60,
+ 0x0C, 0x01, 0x80, 0x18, 0x03, 0xE0, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xF0, 0xE0, 0x1F, 0x00, 0x60, 0x06, 0x00, 0xC0, 0x18,
+ 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x01,
+ 0x80, 0x38, 0x01, 0xE0, 0x3C, 0x1C, 0x03, 0x00, 0xC0, 0x18, 0x03, 0x00,
+ 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0xC0,
+ 0xF8, 0x1C, 0x00, 0x0F, 0x00, 0x03, 0xFC, 0x03, 0x70, 0xE0, 0x76, 0x07,
+ 0x8E, 0xC0, 0x1F, 0xC0, 0x00, 0xF0 };
+
+const GFXglyph FreeMono24pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 28, 0, 1 }, // 0x20 ' '
+ { 0, 5, 30, 28, 11, -28 }, // 0x21 '!'
+ { 19, 16, 14, 28, 6, -28 }, // 0x22 '"'
+ { 47, 19, 32, 28, 4, -29 }, // 0x23 '#'
+ { 123, 18, 33, 28, 5, -29 }, // 0x24 '$'
+ { 198, 20, 29, 28, 4, -27 }, // 0x25 '%'
+ { 271, 18, 25, 28, 5, -23 }, // 0x26 '&'
+ { 328, 7, 14, 28, 11, -28 }, // 0x27 '''
+ { 341, 7, 34, 28, 14, -27 }, // 0x28 '('
+ { 371, 7, 34, 28, 8, -27 }, // 0x29 ')'
+ { 401, 18, 16, 28, 5, -27 }, // 0x2A '*'
+ { 437, 20, 22, 28, 4, -23 }, // 0x2B '+'
+ { 492, 9, 14, 28, 6, -6 }, // 0x2C ','
+ { 508, 22, 2, 28, 3, -13 }, // 0x2D '-'
+ { 514, 7, 6, 28, 11, -4 }, // 0x2E '.'
+ { 520, 18, 35, 28, 5, -30 }, // 0x2F '/'
+ { 599, 18, 30, 28, 5, -28 }, // 0x30 '0'
+ { 667, 16, 29, 28, 6, -28 }, // 0x31 '1'
+ { 725, 18, 29, 28, 5, -28 }, // 0x32 '2'
+ { 791, 19, 30, 28, 5, -28 }, // 0x33 '3'
+ { 863, 16, 28, 28, 6, -27 }, // 0x34 '4'
+ { 919, 19, 29, 28, 5, -27 }, // 0x35 '5'
+ { 988, 18, 30, 28, 6, -28 }, // 0x36 '6'
+ { 1056, 18, 28, 28, 5, -27 }, // 0x37 '7'
+ { 1119, 18, 30, 28, 5, -28 }, // 0x38 '8'
+ { 1187, 18, 30, 28, 6, -28 }, // 0x39 '9'
+ { 1255, 7, 21, 28, 11, -19 }, // 0x3A ':'
+ { 1274, 10, 27, 28, 7, -19 }, // 0x3B ';'
+ { 1308, 22, 22, 28, 3, -23 }, // 0x3C '<'
+ { 1369, 24, 9, 28, 2, -17 }, // 0x3D '='
+ { 1396, 21, 22, 28, 4, -23 }, // 0x3E '>'
+ { 1454, 17, 28, 28, 6, -26 }, // 0x3F '?'
+ { 1514, 18, 32, 28, 5, -28 }, // 0x40 '@'
+ { 1586, 28, 26, 28, 0, -25 }, // 0x41 'A'
+ { 1677, 22, 26, 28, 3, -25 }, // 0x42 'B'
+ { 1749, 22, 28, 28, 3, -26 }, // 0x43 'C'
+ { 1826, 22, 26, 28, 3, -25 }, // 0x44 'D'
+ { 1898, 22, 26, 28, 3, -25 }, // 0x45 'E'
+ { 1970, 22, 26, 28, 3, -25 }, // 0x46 'F'
+ { 2042, 23, 28, 28, 3, -26 }, // 0x47 'G'
+ { 2123, 23, 26, 28, 3, -25 }, // 0x48 'H'
+ { 2198, 16, 26, 28, 6, -25 }, // 0x49 'I'
+ { 2250, 23, 27, 28, 4, -25 }, // 0x4A 'J'
+ { 2328, 24, 26, 28, 3, -25 }, // 0x4B 'K'
+ { 2406, 21, 26, 28, 4, -25 }, // 0x4C 'L'
+ { 2475, 26, 26, 28, 1, -25 }, // 0x4D 'M'
+ { 2560, 24, 26, 28, 2, -25 }, // 0x4E 'N'
+ { 2638, 24, 28, 28, 2, -26 }, // 0x4F 'O'
+ { 2722, 21, 26, 28, 3, -25 }, // 0x50 'P'
+ { 2791, 24, 32, 28, 2, -26 }, // 0x51 'Q'
+ { 2887, 24, 26, 28, 3, -25 }, // 0x52 'R'
+ { 2965, 20, 28, 28, 4, -26 }, // 0x53 'S'
+ { 3035, 22, 26, 28, 3, -25 }, // 0x54 'T'
+ { 3107, 23, 27, 28, 3, -25 }, // 0x55 'U'
+ { 3185, 28, 26, 28, 0, -25 }, // 0x56 'V'
+ { 3276, 26, 26, 28, 1, -25 }, // 0x57 'W'
+ { 3361, 24, 26, 28, 2, -25 }, // 0x58 'X'
+ { 3439, 24, 26, 28, 2, -25 }, // 0x59 'Y'
+ { 3517, 18, 26, 28, 5, -25 }, // 0x5A 'Z'
+ { 3576, 7, 34, 28, 13, -27 }, // 0x5B '['
+ { 3606, 18, 35, 28, 5, -30 }, // 0x5C '\'
+ { 3685, 7, 34, 28, 8, -27 }, // 0x5D ']'
+ { 3715, 18, 12, 28, 5, -28 }, // 0x5E '^'
+ { 3742, 28, 2, 28, 0, 5 }, // 0x5F '_'
+ { 3749, 8, 7, 28, 7, -29 }, // 0x60 '`'
+ { 3756, 22, 22, 28, 3, -20 }, // 0x61 'a'
+ { 3817, 23, 29, 28, 2, -27 }, // 0x62 'b'
+ { 3901, 21, 22, 28, 4, -20 }, // 0x63 'c'
+ { 3959, 24, 29, 28, 3, -27 }, // 0x64 'd'
+ { 4046, 21, 22, 28, 3, -20 }, // 0x65 'e'
+ { 4104, 19, 28, 28, 6, -27 }, // 0x66 'f'
+ { 4171, 23, 30, 28, 3, -20 }, // 0x67 'g'
+ { 4258, 23, 28, 28, 3, -27 }, // 0x68 'h'
+ { 4339, 18, 29, 28, 5, -28 }, // 0x69 'i'
+ { 4405, 14, 38, 28, 6, -28 }, // 0x6A 'j'
+ { 4472, 22, 28, 28, 4, -27 }, // 0x6B 'k'
+ { 4549, 18, 28, 28, 5, -27 }, // 0x6C 'l'
+ { 4612, 28, 21, 28, 0, -20 }, // 0x6D 'm'
+ { 4686, 23, 21, 28, 2, -20 }, // 0x6E 'n'
+ { 4747, 22, 22, 28, 3, -20 }, // 0x6F 'o'
+ { 4808, 23, 30, 28, 2, -20 }, // 0x70 'p'
+ { 4895, 24, 30, 28, 3, -20 }, // 0x71 'q'
+ { 4985, 21, 20, 28, 5, -19 }, // 0x72 'r'
+ { 5038, 18, 22, 28, 5, -20 }, // 0x73 's'
+ { 5088, 21, 27, 28, 3, -25 }, // 0x74 't'
+ { 5159, 23, 21, 28, 3, -19 }, // 0x75 'u'
+ { 5220, 26, 20, 28, 1, -19 }, // 0x76 'v'
+ { 5285, 26, 20, 28, 1, -19 }, // 0x77 'w'
+ { 5350, 24, 20, 28, 2, -19 }, // 0x78 'x'
+ { 5410, 24, 29, 28, 2, -19 }, // 0x79 'y'
+ { 5497, 17, 20, 28, 6, -19 }, // 0x7A 'z'
+ { 5540, 11, 34, 28, 8, -27 }, // 0x7B '{'
+ { 5587, 2, 34, 28, 13, -27 }, // 0x7C '|'
+ { 5596, 11, 34, 28, 9, -27 }, // 0x7D '}'
+ { 5643, 20, 6, 28, 4, -15 } }; // 0x7E '~'
+
+const GFXfont FreeMono24pt7b PROGMEM = {
+ (uint8_t *)FreeMono24pt7bBitmaps,
+ (GFXglyph *)FreeMono24pt7bGlyphs,
+ 0x20, 0x7E, 47 };
+
+// Approx. 6330 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMono9pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMono9pt7b.h
new file mode 100644
index 000000000000..c82d7869c5a2
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMono9pt7b.h
@@ -0,0 +1,176 @@
+const uint8_t FreeMono9pt7bBitmaps[] PROGMEM = {
+ 0xAA, 0xA8, 0x0C, 0xED, 0x24, 0x92, 0x48, 0x24, 0x48, 0x91, 0x2F, 0xE4,
+ 0x89, 0x7F, 0x28, 0x51, 0x22, 0x40, 0x08, 0x3E, 0x62, 0x40, 0x30, 0x0E,
+ 0x01, 0x81, 0xC3, 0xBE, 0x08, 0x08, 0x71, 0x12, 0x23, 0x80, 0x23, 0xB8,
+ 0x0E, 0x22, 0x44, 0x70, 0x38, 0x81, 0x02, 0x06, 0x1A, 0x65, 0x46, 0xC8,
+ 0xEC, 0xE9, 0x24, 0x5A, 0xAA, 0xA9, 0x40, 0xA9, 0x55, 0x5A, 0x80, 0x10,
+ 0x22, 0x4B, 0xE3, 0x05, 0x11, 0x00, 0x10, 0x20, 0x47, 0xF1, 0x02, 0x04,
+ 0x00, 0x6B, 0x48, 0xFF, 0x00, 0xF0, 0x02, 0x08, 0x10, 0x60, 0x81, 0x04,
+ 0x08, 0x20, 0x41, 0x02, 0x08, 0x00, 0x38, 0x8A, 0x0C, 0x18, 0x30, 0x60,
+ 0xC1, 0x82, 0x88, 0xE0, 0x27, 0x28, 0x42, 0x10, 0x84, 0x21, 0x3E, 0x38,
+ 0x8A, 0x08, 0x10, 0x20, 0x82, 0x08, 0x61, 0x03, 0xF8, 0x7C, 0x06, 0x02,
+ 0x02, 0x1C, 0x06, 0x01, 0x01, 0x01, 0x42, 0x3C, 0x18, 0xA2, 0x92, 0x8A,
+ 0x28, 0xBF, 0x08, 0x21, 0xC0, 0x7C, 0x81, 0x03, 0xE4, 0x40, 0x40, 0x81,
+ 0x03, 0x88, 0xE0, 0x1E, 0x41, 0x04, 0x0B, 0x98, 0xB0, 0xC1, 0xC2, 0x88,
+ 0xE0, 0xFE, 0x04, 0x08, 0x20, 0x40, 0x82, 0x04, 0x08, 0x20, 0x40, 0x38,
+ 0x8A, 0x0C, 0x14, 0x47, 0x11, 0x41, 0x83, 0x8C, 0xE0, 0x38, 0x8A, 0x1C,
+ 0x18, 0x68, 0xCE, 0x81, 0x04, 0x13, 0xC0, 0xF0, 0x0F, 0x6C, 0x00, 0xD2,
+ 0xD2, 0x00, 0x03, 0x04, 0x18, 0x60, 0x60, 0x18, 0x04, 0x03, 0xFF, 0x80,
+ 0x00, 0x1F, 0xF0, 0x40, 0x18, 0x03, 0x00, 0x60, 0x20, 0x60, 0xC0, 0x80,
+ 0x3D, 0x84, 0x08, 0x30, 0xC2, 0x00, 0x00, 0x00, 0x30, 0x3C, 0x46, 0x82,
+ 0x8E, 0xB2, 0xA2, 0xA2, 0x9F, 0x80, 0x80, 0x40, 0x3C, 0x3C, 0x01, 0x40,
+ 0x28, 0x09, 0x01, 0x10, 0x42, 0x0F, 0xC1, 0x04, 0x40, 0x9E, 0x3C, 0xFE,
+ 0x21, 0x90, 0x48, 0x67, 0xE2, 0x09, 0x02, 0x81, 0x41, 0xFF, 0x80, 0x3E,
+ 0xB0, 0xF0, 0x30, 0x08, 0x04, 0x02, 0x00, 0x80, 0x60, 0x8F, 0x80, 0xFE,
+ 0x21, 0x90, 0x68, 0x14, 0x0A, 0x05, 0x02, 0x83, 0x43, 0x7F, 0x00, 0xFF,
+ 0x20, 0x90, 0x08, 0x87, 0xC2, 0x21, 0x00, 0x81, 0x40, 0xFF, 0xC0, 0xFF,
+ 0xA0, 0x50, 0x08, 0x87, 0xC2, 0x21, 0x00, 0x80, 0x40, 0x78, 0x00, 0x1E,
+ 0x98, 0x6C, 0x0A, 0x00, 0x80, 0x20, 0xF8, 0x0B, 0x02, 0x60, 0x87, 0xC0,
+ 0xE3, 0xA0, 0x90, 0x48, 0x27, 0xF2, 0x09, 0x04, 0x82, 0x41, 0x71, 0xC0,
+ 0xF9, 0x08, 0x42, 0x10, 0x84, 0x27, 0xC0, 0x1F, 0x02, 0x02, 0x02, 0x02,
+ 0x02, 0x82, 0x82, 0xC6, 0x78, 0xE3, 0xA1, 0x11, 0x09, 0x05, 0x83, 0x21,
+ 0x08, 0x84, 0x41, 0x70, 0xC0, 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41,
+ 0x41, 0x41, 0xFF, 0xE0, 0xEC, 0x19, 0x45, 0x28, 0xA4, 0xA4, 0x94, 0x91,
+ 0x12, 0x02, 0x40, 0x5C, 0x1C, 0xC3, 0xB0, 0x94, 0x4A, 0x24, 0x92, 0x49,
+ 0x14, 0x8A, 0x43, 0x70, 0x80, 0x1E, 0x31, 0x90, 0x50, 0x18, 0x0C, 0x06,
+ 0x02, 0x82, 0x63, 0x0F, 0x00, 0xFE, 0x43, 0x41, 0x41, 0x42, 0x7C, 0x40,
+ 0x40, 0x40, 0xF0, 0x1C, 0x31, 0x90, 0x50, 0x18, 0x0C, 0x06, 0x02, 0x82,
+ 0x63, 0x1F, 0x04, 0x07, 0x92, 0x30, 0xFE, 0x21, 0x90, 0x48, 0x24, 0x23,
+ 0xE1, 0x10, 0x84, 0x41, 0x70, 0xC0, 0x3A, 0xCD, 0x0A, 0x03, 0x01, 0x80,
+ 0xC1, 0xC7, 0x78, 0xFF, 0xC4, 0x62, 0x21, 0x00, 0x80, 0x40, 0x20, 0x10,
+ 0x08, 0x1F, 0x00, 0xE3, 0xA0, 0x90, 0x48, 0x24, 0x12, 0x09, 0x04, 0x82,
+ 0x22, 0x0E, 0x00, 0xF1, 0xE8, 0x10, 0x82, 0x10, 0x42, 0x10, 0x22, 0x04,
+ 0x80, 0x50, 0x0C, 0x00, 0x80, 0xF1, 0xE8, 0x09, 0x11, 0x25, 0x44, 0xA8,
+ 0x55, 0x0C, 0xA1, 0x8C, 0x31, 0x84, 0x30, 0xE3, 0xA0, 0x88, 0x82, 0x80,
+ 0x80, 0xC0, 0x90, 0x44, 0x41, 0x71, 0xC0, 0xE3, 0xA0, 0x88, 0x82, 0x81,
+ 0x40, 0x40, 0x20, 0x10, 0x08, 0x1F, 0x00, 0xFD, 0x0A, 0x20, 0x81, 0x04,
+ 0x10, 0x21, 0x83, 0xFC, 0xEA, 0xAA, 0xAA, 0xC0, 0x80, 0x81, 0x03, 0x02,
+ 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0xD5, 0x55, 0x55, 0xC0,
+ 0x10, 0x51, 0x22, 0x28, 0x20, 0xFF, 0xE0, 0x88, 0x80, 0x7E, 0x00, 0x80,
+ 0x47, 0xEC, 0x14, 0x0A, 0x0C, 0xFB, 0xC0, 0x20, 0x10, 0x0B, 0xC6, 0x12,
+ 0x05, 0x02, 0x81, 0x40, 0xB0, 0xB7, 0x80, 0x3A, 0x8E, 0x0C, 0x08, 0x10,
+ 0x10, 0x9E, 0x03, 0x00, 0x80, 0x47, 0xA4, 0x34, 0x0A, 0x05, 0x02, 0x81,
+ 0x21, 0x8F, 0x60, 0x3C, 0x43, 0x81, 0xFF, 0x80, 0x80, 0x61, 0x3E, 0x3D,
+ 0x04, 0x3E, 0x41, 0x04, 0x10, 0x41, 0x0F, 0x80, 0x3D, 0xA1, 0xA0, 0x50,
+ 0x28, 0x14, 0x09, 0x0C, 0x7A, 0x01, 0x01, 0x87, 0x80, 0xC0, 0x20, 0x10,
+ 0x0B, 0xC6, 0x32, 0x09, 0x04, 0x82, 0x41, 0x20, 0xB8, 0xE0, 0x10, 0x01,
+ 0xC0, 0x81, 0x02, 0x04, 0x08, 0x11, 0xFC, 0x10, 0x3E, 0x10, 0x84, 0x21,
+ 0x08, 0x42, 0x3F, 0x00, 0xC0, 0x40, 0x40, 0x4F, 0x44, 0x58, 0x70, 0x48,
+ 0x44, 0x42, 0xC7, 0x70, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x23,
+ 0xF8, 0xB7, 0x64, 0x62, 0x31, 0x18, 0x8C, 0x46, 0x23, 0x91, 0x5E, 0x31,
+ 0x90, 0x48, 0x24, 0x12, 0x09, 0x05, 0xC7, 0x3E, 0x31, 0xA0, 0x30, 0x18,
+ 0x0C, 0x05, 0x8C, 0x7C, 0xDE, 0x30, 0x90, 0x28, 0x14, 0x0A, 0x05, 0x84,
+ 0xBC, 0x40, 0x20, 0x38, 0x00, 0x3D, 0xA1, 0xA0, 0x50, 0x28, 0x14, 0x09,
+ 0x0C, 0x7A, 0x01, 0x00, 0x80, 0xE0, 0xCE, 0xA1, 0x82, 0x04, 0x08, 0x10,
+ 0x7C, 0x3A, 0x8D, 0x0B, 0x80, 0xF0, 0x70, 0xDE, 0x40, 0x40, 0xFC, 0x40,
+ 0x40, 0x40, 0x40, 0x40, 0x41, 0x3E, 0xC3, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x43, 0x3D, 0xE3, 0xA0, 0x90, 0x84, 0x42, 0x20, 0xA0, 0x50, 0x10, 0xE3,
+ 0xC0, 0x92, 0x4B, 0x25, 0x92, 0xA9, 0x98, 0x44, 0xE3, 0x31, 0x05, 0x01,
+ 0x01, 0x41, 0x11, 0x05, 0xC7, 0xE3, 0xA0, 0x90, 0x84, 0x42, 0x40, 0xA0,
+ 0x60, 0x10, 0x10, 0x08, 0x3E, 0x00, 0xFD, 0x08, 0x20, 0x82, 0x08, 0x10,
+ 0xBF, 0x29, 0x24, 0xA2, 0x49, 0x26, 0xFF, 0xF8, 0x89, 0x24, 0x8A, 0x49,
+ 0x2C, 0x61, 0x24, 0x30 };
+
+const GFXglyph FreeMono9pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 11, 0, 1 }, // 0x20 ' '
+ { 0, 2, 11, 11, 4, -10 }, // 0x21 '!'
+ { 3, 6, 5, 11, 2, -10 }, // 0x22 '"'
+ { 7, 7, 12, 11, 2, -10 }, // 0x23 '#'
+ { 18, 8, 12, 11, 1, -10 }, // 0x24 '$'
+ { 30, 7, 11, 11, 2, -10 }, // 0x25 '%'
+ { 40, 7, 10, 11, 2, -9 }, // 0x26 '&'
+ { 49, 3, 5, 11, 4, -10 }, // 0x27 '''
+ { 51, 2, 13, 11, 5, -10 }, // 0x28 '('
+ { 55, 2, 13, 11, 4, -10 }, // 0x29 ')'
+ { 59, 7, 7, 11, 2, -10 }, // 0x2A '*'
+ { 66, 7, 7, 11, 2, -8 }, // 0x2B '+'
+ { 73, 3, 5, 11, 2, -1 }, // 0x2C ','
+ { 75, 9, 1, 11, 1, -5 }, // 0x2D '-'
+ { 77, 2, 2, 11, 4, -1 }, // 0x2E '.'
+ { 78, 7, 13, 11, 2, -11 }, // 0x2F '/'
+ { 90, 7, 11, 11, 2, -10 }, // 0x30 '0'
+ { 100, 5, 11, 11, 3, -10 }, // 0x31 '1'
+ { 107, 7, 11, 11, 2, -10 }, // 0x32 '2'
+ { 117, 8, 11, 11, 1, -10 }, // 0x33 '3'
+ { 128, 6, 11, 11, 3, -10 }, // 0x34 '4'
+ { 137, 7, 11, 11, 2, -10 }, // 0x35 '5'
+ { 147, 7, 11, 11, 2, -10 }, // 0x36 '6'
+ { 157, 7, 11, 11, 2, -10 }, // 0x37 '7'
+ { 167, 7, 11, 11, 2, -10 }, // 0x38 '8'
+ { 177, 7, 11, 11, 2, -10 }, // 0x39 '9'
+ { 187, 2, 8, 11, 4, -7 }, // 0x3A ':'
+ { 189, 3, 11, 11, 3, -7 }, // 0x3B ';'
+ { 194, 8, 8, 11, 1, -8 }, // 0x3C '<'
+ { 202, 9, 4, 11, 1, -6 }, // 0x3D '='
+ { 207, 9, 8, 11, 1, -8 }, // 0x3E '>'
+ { 216, 7, 10, 11, 2, -9 }, // 0x3F '?'
+ { 225, 8, 12, 11, 2, -10 }, // 0x40 '@'
+ { 237, 11, 10, 11, 0, -9 }, // 0x41 'A'
+ { 251, 9, 10, 11, 1, -9 }, // 0x42 'B'
+ { 263, 9, 10, 11, 1, -9 }, // 0x43 'C'
+ { 275, 9, 10, 11, 1, -9 }, // 0x44 'D'
+ { 287, 9, 10, 11, 1, -9 }, // 0x45 'E'
+ { 299, 9, 10, 11, 1, -9 }, // 0x46 'F'
+ { 311, 10, 10, 11, 1, -9 }, // 0x47 'G'
+ { 324, 9, 10, 11, 1, -9 }, // 0x48 'H'
+ { 336, 5, 10, 11, 3, -9 }, // 0x49 'I'
+ { 343, 8, 10, 11, 2, -9 }, // 0x4A 'J'
+ { 353, 9, 10, 11, 1, -9 }, // 0x4B 'K'
+ { 365, 8, 10, 11, 2, -9 }, // 0x4C 'L'
+ { 375, 11, 10, 11, 0, -9 }, // 0x4D 'M'
+ { 389, 9, 10, 11, 1, -9 }, // 0x4E 'N'
+ { 401, 9, 10, 11, 1, -9 }, // 0x4F 'O'
+ { 413, 8, 10, 11, 1, -9 }, // 0x50 'P'
+ { 423, 9, 13, 11, 1, -9 }, // 0x51 'Q'
+ { 438, 9, 10, 11, 1, -9 }, // 0x52 'R'
+ { 450, 7, 10, 11, 2, -9 }, // 0x53 'S'
+ { 459, 9, 10, 11, 1, -9 }, // 0x54 'T'
+ { 471, 9, 10, 11, 1, -9 }, // 0x55 'U'
+ { 483, 11, 10, 11, 0, -9 }, // 0x56 'V'
+ { 497, 11, 10, 11, 0, -9 }, // 0x57 'W'
+ { 511, 9, 10, 11, 1, -9 }, // 0x58 'X'
+ { 523, 9, 10, 11, 1, -9 }, // 0x59 'Y'
+ { 535, 7, 10, 11, 2, -9 }, // 0x5A 'Z'
+ { 544, 2, 13, 11, 5, -10 }, // 0x5B '['
+ { 548, 7, 13, 11, 2, -11 }, // 0x5C '\'
+ { 560, 2, 13, 11, 4, -10 }, // 0x5D ']'
+ { 564, 7, 5, 11, 2, -10 }, // 0x5E '^'
+ { 569, 11, 1, 11, 0, 2 }, // 0x5F '_'
+ { 571, 3, 3, 11, 3, -11 }, // 0x60 '`'
+ { 573, 9, 8, 11, 1, -7 }, // 0x61 'a'
+ { 582, 9, 11, 11, 1, -10 }, // 0x62 'b'
+ { 595, 7, 8, 11, 2, -7 }, // 0x63 'c'
+ { 602, 9, 11, 11, 1, -10 }, // 0x64 'd'
+ { 615, 8, 8, 11, 1, -7 }, // 0x65 'e'
+ { 623, 6, 11, 11, 3, -10 }, // 0x66 'f'
+ { 632, 9, 11, 11, 1, -7 }, // 0x67 'g'
+ { 645, 9, 11, 11, 1, -10 }, // 0x68 'h'
+ { 658, 7, 10, 11, 2, -9 }, // 0x69 'i'
+ { 667, 5, 13, 11, 3, -9 }, // 0x6A 'j'
+ { 676, 8, 11, 11, 2, -10 }, // 0x6B 'k'
+ { 687, 7, 11, 11, 2, -10 }, // 0x6C 'l'
+ { 697, 9, 8, 11, 1, -7 }, // 0x6D 'm'
+ { 706, 9, 8, 11, 1, -7 }, // 0x6E 'n'
+ { 715, 9, 8, 11, 1, -7 }, // 0x6F 'o'
+ { 724, 9, 11, 11, 1, -7 }, // 0x70 'p'
+ { 737, 9, 11, 11, 1, -7 }, // 0x71 'q'
+ { 750, 7, 8, 11, 3, -7 }, // 0x72 'r'
+ { 757, 7, 8, 11, 2, -7 }, // 0x73 's'
+ { 764, 8, 10, 11, 2, -9 }, // 0x74 't'
+ { 774, 8, 8, 11, 1, -7 }, // 0x75 'u'
+ { 782, 9, 8, 11, 1, -7 }, // 0x76 'v'
+ { 791, 9, 8, 11, 1, -7 }, // 0x77 'w'
+ { 800, 9, 8, 11, 1, -7 }, // 0x78 'x'
+ { 809, 9, 11, 11, 1, -7 }, // 0x79 'y'
+ { 822, 7, 8, 11, 2, -7 }, // 0x7A 'z'
+ { 829, 3, 13, 11, 4, -10 }, // 0x7B '{'
+ { 834, 1, 13, 11, 5, -10 }, // 0x7C '|'
+ { 836, 3, 13, 11, 4, -10 }, // 0x7D '}'
+ { 841, 7, 3, 11, 2, -6 } }; // 0x7E '~'
+
+const GFXfont FreeMono9pt7b PROGMEM = {
+ (uint8_t *)FreeMono9pt7bBitmaps,
+ (GFXglyph *)FreeMono9pt7bGlyphs,
+ 0x20, 0x7E, 18 };
+
+// Approx. 1516 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBold12pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBold12pt7b.h
new file mode 100644
index 000000000000..4ad9d1a4f46c
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBold12pt7b.h
@@ -0,0 +1,250 @@
+const uint8_t FreeMonoBold12pt7bBitmaps[] PROGMEM = {
+ 0xFF, 0xFF, 0xFF, 0xF6, 0x66, 0x60, 0x6F, 0x60, 0xE7, 0xE7, 0x62, 0x42,
+ 0x42, 0x42, 0x42, 0x11, 0x87, 0x30, 0xC6, 0x18, 0xC3, 0x31, 0xFF, 0xFF,
+ 0xF9, 0x98, 0x33, 0x06, 0x60, 0xCC, 0x7F, 0xEF, 0xFC, 0x66, 0x0C, 0xC3,
+ 0x98, 0x63, 0x04, 0x40, 0x0C, 0x03, 0x00, 0xC0, 0xFE, 0x7F, 0x9C, 0x66,
+ 0x09, 0x80, 0x78, 0x0F, 0xE0, 0x7F, 0x03, 0xE0, 0xF8, 0x7F, 0xFB, 0xFC,
+ 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x38, 0x1F, 0x0C, 0x42, 0x10, 0xC4, 0x1F,
+ 0x03, 0x9C, 0x3C, 0x7F, 0x33, 0xE0, 0x8C, 0x21, 0x08, 0xC3, 0xE0, 0x70,
+ 0x3E, 0x1F, 0xC6, 0x61, 0x80, 0x70, 0x0C, 0x07, 0x83, 0xEE, 0xDF, 0xB3,
+ 0xCC, 0x73, 0xFE, 0x7F, 0x80, 0xFD, 0x24, 0x90, 0x39, 0xDC, 0xE6, 0x73,
+ 0x18, 0xC6, 0x31, 0x8C, 0x31, 0x8E, 0x31, 0xC4, 0xE7, 0x1C, 0xE3, 0x1C,
+ 0x63, 0x18, 0xC6, 0x31, 0x98, 0xCE, 0x67, 0x10, 0x0C, 0x03, 0x00, 0xC3,
+ 0xB7, 0xFF, 0xDF, 0xE1, 0xE0, 0xFC, 0x33, 0x0C, 0xC0, 0x06, 0x00, 0x60,
+ 0x06, 0x00, 0x60, 0x06, 0x0F, 0xFF, 0xFF, 0xF0, 0x60, 0x06, 0x00, 0x60,
+ 0x06, 0x00, 0x60, 0x06, 0x00, 0x3B, 0x9C, 0xCE, 0x62, 0x00, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x80, 0x00, 0x40, 0x30, 0x1C, 0x07, 0x03, 0x80, 0xE0, 0x30,
+ 0x1C, 0x06, 0x03, 0x80, 0xC0, 0x70, 0x18, 0x0E, 0x03, 0x01, 0xC0, 0x60,
+ 0x38, 0x0E, 0x01, 0x00, 0x1E, 0x0F, 0xC6, 0x1B, 0x87, 0xC0, 0xF0, 0x3C,
+ 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x87, 0x61, 0x8F, 0xC1, 0xE0, 0x1C,
+ 0x0F, 0x0F, 0xC3, 0xB0, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00,
+ 0xC0, 0x30, 0x0C, 0x3F, 0xFF, 0xFC, 0x1F, 0x1F, 0xEE, 0x1F, 0x83, 0xC0,
+ 0xC0, 0x70, 0x38, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE3, 0xF0, 0xFF, 0xFF,
+ 0xFC, 0x3F, 0x0F, 0xF1, 0x87, 0x00, 0x60, 0x0C, 0x03, 0x83, 0xE0, 0x7C,
+ 0x01, 0xC0, 0x0C, 0x01, 0x80, 0x3C, 0x0F, 0xFF, 0x9F, 0xC0, 0x07, 0x07,
+ 0x83, 0xC3, 0xE1, 0xB1, 0xD8, 0xCC, 0xC6, 0xE3, 0x7F, 0xFF, 0xE0, 0x61,
+ 0xF8, 0xFC, 0x7F, 0x9F, 0xE6, 0x01, 0x80, 0x60, 0x1F, 0x87, 0xF9, 0x86,
+ 0x00, 0xC0, 0x30, 0x0C, 0x03, 0xC1, 0xBF, 0xE7, 0xE0, 0x07, 0xC7, 0xF3,
+ 0xC1, 0xC0, 0x60, 0x38, 0x0E, 0xF3, 0xFE, 0xF1, 0xF8, 0x3E, 0x0F, 0x83,
+ 0x71, 0xCF, 0xE1, 0xF0, 0xFF, 0xFF, 0xFC, 0x1F, 0x07, 0x01, 0x80, 0x60,
+ 0x38, 0x0C, 0x03, 0x01, 0xC0, 0x60, 0x18, 0x0E, 0x03, 0x00, 0xC0, 0x1E,
+ 0x1F, 0xEE, 0x1F, 0x03, 0xC0, 0xF0, 0x36, 0x19, 0xFE, 0x7F, 0xB8, 0x7C,
+ 0x0F, 0x03, 0xE1, 0xDF, 0xE3, 0xF0, 0x3E, 0x1F, 0xCE, 0x3B, 0x07, 0xC1,
+ 0xF0, 0x7E, 0x3D, 0xFF, 0x3D, 0xC0, 0x70, 0x18, 0x0E, 0x0F, 0x3F, 0x8F,
+ 0x80, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x77, 0x70, 0x00, 0x00, 0x76, 0x6C,
+ 0xC8, 0x80, 0x00, 0x30, 0x0F, 0x03, 0xE0, 0xF8, 0x3E, 0x0F, 0x80, 0x3E,
+ 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x60, 0x0F, 0x80, 0x3E, 0x00, 0xF8,
+ 0x03, 0xE0, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x0F, 0x00, 0x40, 0x00, 0x7C,
+ 0x7F, 0xB0, 0xF8, 0x30, 0x18, 0x1C, 0x3C, 0x3C, 0x18, 0x08, 0x00, 0x07,
+ 0x03, 0x81, 0xC0, 0x1E, 0x07, 0xF1, 0xC7, 0x30, 0x6C, 0x0D, 0x87, 0xB3,
+ 0xF6, 0xE6, 0xD8, 0xDB, 0x1B, 0x73, 0x67, 0xFC, 0x7F, 0x80, 0x30, 0x03,
+ 0x00, 0x71, 0xC7, 0xF8, 0x7C, 0x00, 0x3F, 0x80, 0x7F, 0x80, 0x1F, 0x00,
+ 0x76, 0x00, 0xEE, 0x01, 0x8C, 0x07, 0x18, 0x0E, 0x38, 0x1F, 0xF0, 0x7F,
+ 0xF0, 0xC0, 0x61, 0x80, 0xCF, 0xC7, 0xFF, 0x8F, 0xC0, 0xFF, 0xC7, 0xFF,
+ 0x0C, 0x1C, 0x60, 0x63, 0x03, 0x18, 0x38, 0xFF, 0x87, 0xFE, 0x30, 0x39,
+ 0x80, 0xCC, 0x06, 0x60, 0x7F, 0xFF, 0x7F, 0xF0, 0x0F, 0xF3, 0xFF, 0x70,
+ 0x76, 0x03, 0xC0, 0x3C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0x60,
+ 0x37, 0x07, 0x3F, 0xF0, 0xFC, 0xFF, 0x0F, 0xFC, 0x60, 0xE6, 0x06, 0x60,
+ 0x36, 0x03, 0x60, 0x36, 0x03, 0x60, 0x36, 0x03, 0x60, 0x76, 0x0E, 0xFF,
+ 0xCF, 0xF8, 0xFF, 0xF7, 0xFF, 0x8C, 0x0C, 0x60, 0x63, 0x1B, 0x18, 0xC0,
+ 0xFE, 0x07, 0xF0, 0x31, 0x81, 0x8C, 0xCC, 0x06, 0x60, 0x3F, 0xFF, 0xFF,
+ 0xFC, 0xFF, 0xFF, 0xFF, 0xCC, 0x06, 0x60, 0x33, 0x19, 0x98, 0xC0, 0xFE,
+ 0x07, 0xF0, 0x31, 0x81, 0x8C, 0x0C, 0x00, 0x60, 0x0F, 0xF0, 0x7F, 0x80,
+ 0x0F, 0xF1, 0xFF, 0x9C, 0x1C, 0xC0, 0x6C, 0x03, 0x60, 0x03, 0x00, 0x18,
+ 0x7F, 0xC3, 0xFE, 0x01, 0xB8, 0x0C, 0xE0, 0xE3, 0xFF, 0x07, 0xE0, 0x7C,
+ 0xF9, 0xF3, 0xE3, 0x03, 0x0C, 0x0C, 0x30, 0x30, 0xC0, 0xC3, 0xFF, 0x0F,
+ 0xFC, 0x30, 0x30, 0xC0, 0xC3, 0x03, 0x0C, 0x0C, 0xFC, 0xFF, 0xF3, 0xF0,
+ 0xFF, 0xFF, 0xF0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03,
+ 0x00, 0xC0, 0x30, 0xFF, 0xFF, 0xF0, 0x0F, 0xF8, 0x7F, 0xC0, 0x30, 0x01,
+ 0x80, 0x0C, 0x00, 0x60, 0x03, 0x18, 0x18, 0xC0, 0xC6, 0x06, 0x30, 0x31,
+ 0xC3, 0x0F, 0xF8, 0x1F, 0x00, 0xFC, 0xFB, 0xF3, 0xE3, 0x0E, 0x0C, 0x70,
+ 0x33, 0x80, 0xFC, 0x03, 0xF0, 0x0F, 0xE0, 0x39, 0xC0, 0xC3, 0x03, 0x0E,
+ 0x0C, 0x18, 0xFC, 0x7F, 0xF0, 0xF0, 0xFF, 0x0F, 0xF0, 0x18, 0x01, 0x80,
+ 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
+ 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0xC0, 0xF7, 0x87, 0x9E, 0x1E, 0x7C, 0xF9,
+ 0xB3, 0xE6, 0xFD, 0x99, 0xF6, 0x67, 0x99, 0x8E, 0x66, 0x31, 0x98, 0x06,
+ 0xFC, 0xFF, 0xF3, 0xF0, 0xF1, 0xFF, 0xCF, 0xCF, 0x0C, 0x78, 0x63, 0xE3,
+ 0x1B, 0x18, 0xDC, 0xC6, 0x76, 0x31, 0xB1, 0x8F, 0x8C, 0x3C, 0x61, 0xE7,
+ 0xE7, 0x3F, 0x18, 0x0F, 0x03, 0xFC, 0x70, 0xE6, 0x06, 0xE0, 0x7C, 0x03,
+ 0xC0, 0x3C, 0x03, 0xC0, 0x3E, 0x07, 0x60, 0x67, 0x0E, 0x3F, 0xC0, 0xF0,
+ 0xFF, 0x8F, 0xFE, 0x30, 0x73, 0x03, 0x30, 0x33, 0x03, 0x30, 0x73, 0xFE,
+ 0x3F, 0x83, 0x00, 0x30, 0x03, 0x00, 0xFF, 0x0F, 0xF0, 0x0F, 0x03, 0xFC,
+ 0x70, 0xE6, 0x06, 0xE0, 0x7C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3E, 0x07,
+ 0x60, 0x67, 0x0E, 0x3F, 0xC1, 0xF0, 0x18, 0x33, 0xFF, 0x3F, 0xE0, 0xFF,
+ 0x83, 0xFF, 0x83, 0x07, 0x0C, 0x0C, 0x30, 0x30, 0xC1, 0xC3, 0xFE, 0x0F,
+ 0xF0, 0x31, 0xE0, 0xC3, 0x83, 0x07, 0x0C, 0x0C, 0xFE, 0x3F, 0xF8, 0x70,
+ 0x3F, 0xDF, 0xFE, 0x1F, 0x03, 0xC0, 0xF8, 0x07, 0xE0, 0x7E, 0x01, 0xF0,
+ 0x3C, 0x0F, 0x87, 0xFF, 0xBF, 0xC0, 0xFF, 0xFF, 0xFF, 0xC6, 0x3C, 0x63,
+ 0xC6, 0x3C, 0x63, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60,
+ 0x3F, 0xC3, 0xFC, 0xFF, 0xFF, 0xFF, 0x60, 0x66, 0x06, 0x60, 0x66, 0x06,
+ 0x60, 0x66, 0x06, 0x60, 0x66, 0x06, 0x60, 0x63, 0x9C, 0x1F, 0xC0, 0xF0,
+ 0xFC, 0x3F, 0xFC, 0x3F, 0x30, 0x0C, 0x38, 0x1C, 0x18, 0x18, 0x1C, 0x38,
+ 0x1C, 0x38, 0x0E, 0x70, 0x0E, 0x70, 0x0F, 0x60, 0x07, 0xE0, 0x07, 0xE0,
+ 0x03, 0xC0, 0x03, 0xC0, 0xFC, 0xFF, 0xF3, 0xF6, 0x01, 0xDC, 0xC6, 0x77,
+ 0x99, 0xDE, 0x67, 0x79, 0x8D, 0xFE, 0x3F, 0xF8, 0xF3, 0xE3, 0xCF, 0x8F,
+ 0x3C, 0x38, 0x70, 0xE1, 0xC0, 0xF8, 0xFB, 0xE3, 0xE3, 0x86, 0x0F, 0x38,
+ 0x1F, 0xC0, 0x3E, 0x00, 0x70, 0x03, 0xE0, 0x0F, 0x80, 0x77, 0x03, 0x8E,
+ 0x1E, 0x1C, 0xFC, 0xFF, 0xF3, 0xF0, 0xF9, 0xFF, 0x9F, 0x30, 0xC3, 0x9C,
+ 0x19, 0x81, 0xF8, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60,
+ 0x3F, 0xC3, 0xFC, 0xFF, 0xBF, 0xEC, 0x3B, 0x0C, 0xC6, 0x33, 0x80, 0xC0,
+ 0x60, 0x38, 0xCC, 0x36, 0x0F, 0x03, 0xFF, 0xFF, 0xF0, 0xFF, 0xF1, 0x8C,
+ 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC7, 0xFE, 0x40, 0x30, 0x0E,
+ 0x01, 0x80, 0x70, 0x0C, 0x03, 0x80, 0x60, 0x1C, 0x03, 0x00, 0xE0, 0x18,
+ 0x07, 0x00, 0xC0, 0x38, 0x0E, 0x01, 0xC0, 0x70, 0x0C, 0x01, 0xFF, 0xC6,
+ 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x1F, 0xFE, 0x04, 0x03,
+ 0x01, 0xE0, 0xFC, 0x7B, 0x9C, 0x7E, 0x1F, 0x03, 0xFF, 0xFF, 0xFF, 0xF0,
+ 0xCE, 0x73, 0x3F, 0x07, 0xF8, 0x00, 0xC0, 0x0C, 0x1F, 0xC7, 0xFC, 0x60,
+ 0xCC, 0x0C, 0xC1, 0xCF, 0xFF, 0x3F, 0xF0, 0xF0, 0x07, 0x80, 0x0C, 0x00,
+ 0x60, 0x03, 0x7C, 0x1F, 0xF8, 0xF1, 0xC7, 0x07, 0x30, 0x19, 0x80, 0xCC,
+ 0x06, 0x60, 0x73, 0xC7, 0x7F, 0xFB, 0xDF, 0x00, 0x1F, 0xB3, 0xFF, 0x70,
+ 0xFE, 0x07, 0xC0, 0x3C, 0x00, 0xC0, 0x0C, 0x00, 0x70, 0x77, 0xFF, 0x1F,
+ 0xC0, 0x01, 0xE0, 0x0F, 0x00, 0x18, 0x00, 0xC1, 0xF6, 0x3F, 0xF1, 0xC7,
+ 0x9C, 0x1C, 0xC0, 0x66, 0x03, 0x30, 0x19, 0x81, 0xC7, 0x1E, 0x3F, 0xFC,
+ 0x7D, 0xE0, 0x1F, 0x83, 0xFC, 0x70, 0xEE, 0x07, 0xFF, 0xFF, 0xFF, 0xE0,
+ 0x0E, 0x00, 0x70, 0x73, 0xFF, 0x1F, 0xC0, 0x07, 0xC3, 0xFC, 0x60, 0x0C,
+ 0x0F, 0xFD, 0xFF, 0x86, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01,
+ 0x81, 0xFF, 0xBF, 0xF0, 0x1F, 0x79, 0xFF, 0xDC, 0x79, 0x81, 0xCC, 0x06,
+ 0x60, 0x33, 0x01, 0x9C, 0x1C, 0x71, 0xE1, 0xFF, 0x07, 0xD8, 0x00, 0xC0,
+ 0x06, 0x00, 0x70, 0x7F, 0x03, 0xF0, 0xF0, 0x03, 0xC0, 0x03, 0x00, 0x0C,
+ 0x00, 0x37, 0xC0, 0xFF, 0x83, 0xC7, 0x0C, 0x0C, 0x30, 0x30, 0xC0, 0xC3,
+ 0x03, 0x0C, 0x0C, 0x30, 0x33, 0xF3, 0xFF, 0xCF, 0xC0, 0x06, 0x00, 0xC0,
+ 0x00, 0x3F, 0x07, 0xE0, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18,
+ 0x03, 0x0F, 0xFF, 0xFF, 0xC0, 0x06, 0x06, 0x00, 0xFF, 0xFF, 0x03, 0x03,
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0xFE, 0xFC,
+ 0xF0, 0x07, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x3F, 0x19, 0xF8, 0xDE, 0x07,
+ 0xE0, 0x3E, 0x01, 0xF0, 0x0F, 0xC0, 0x6F, 0x03, 0x1C, 0x78, 0xFF, 0xC7,
+ 0xE0, 0x7E, 0x0F, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30,
+ 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x61, 0xFF, 0xFF, 0xF8, 0xFE, 0xF1,
+ 0xFF, 0xF1, 0xCE, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31,
+ 0x8C, 0x63, 0x19, 0xF7, 0xBF, 0xEF, 0x78, 0x77, 0xC1, 0xFF, 0x83, 0xC7,
+ 0x0C, 0x0C, 0x30, 0x30, 0xC0, 0xC3, 0x03, 0x0C, 0x0C, 0x30, 0x33, 0xF1,
+ 0xFF, 0xC7, 0xC0, 0x1F, 0x83, 0xFC, 0x70, 0xEE, 0x07, 0xC0, 0x3C, 0x03,
+ 0xC0, 0x3E, 0x07, 0x70, 0xE3, 0xFC, 0x1F, 0x80, 0xF7, 0xE3, 0xFF, 0xC3,
+ 0xC3, 0x8E, 0x07, 0x30, 0x0C, 0xC0, 0x33, 0x00, 0xCE, 0x07, 0x3C, 0x38,
+ 0xFF, 0xC3, 0x7E, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x0F, 0xE0, 0x3F, 0x80,
+ 0x1F, 0xBC, 0xFF, 0xF7, 0x0F, 0x38, 0x1C, 0xC0, 0x33, 0x00, 0xCC, 0x03,
+ 0x38, 0x1C, 0x70, 0xF0, 0xFF, 0xC1, 0xFB, 0x00, 0x0C, 0x00, 0x30, 0x00,
+ 0xC0, 0x1F, 0xC0, 0x7F, 0x79, 0xE7, 0xFF, 0x1F, 0x31, 0xC0, 0x18, 0x01,
+ 0x80, 0x18, 0x01, 0x80, 0x18, 0x0F, 0xFC, 0xFF, 0xC0, 0x3F, 0x9F, 0xFE,
+ 0x1F, 0x82, 0xFE, 0x1F, 0xE0, 0xFF, 0x03, 0xE0, 0xFF, 0xFF, 0xF0, 0x30,
+ 0x06, 0x00, 0xC0, 0x7F, 0xEF, 0xFC, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06,
+ 0x00, 0xC0, 0x18, 0x71, 0xFE, 0x1F, 0x00, 0xF1, 0xF7, 0x8F, 0x8C, 0x0C,
+ 0x60, 0x63, 0x03, 0x18, 0x18, 0xC0, 0xC6, 0x06, 0x38, 0xF0, 0xFF, 0xC3,
+ 0xEE, 0xFC, 0xFF, 0xF3, 0xF3, 0x87, 0x0E, 0x1C, 0x1C, 0x60, 0x73, 0x80,
+ 0xEC, 0x03, 0xF0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x00, 0xF8, 0x7F, 0xE1,
+ 0xF7, 0x39, 0x8C, 0xE6, 0x37, 0xB0, 0xFF, 0xC3, 0xFF, 0x07, 0xBC, 0x1C,
+ 0xF0, 0x73, 0x81, 0x86, 0x00, 0x7C, 0xF9, 0xF3, 0xE3, 0xCF, 0x07, 0xF8,
+ 0x0F, 0xC0, 0x1E, 0x00, 0xFC, 0x07, 0x38, 0x38, 0x73, 0xF3, 0xFF, 0xCF,
+ 0xC0, 0xF9, 0xFF, 0x9F, 0x70, 0xE3, 0x0C, 0x39, 0xC1, 0x98, 0x19, 0x81,
+ 0xF8, 0x0F, 0x00, 0xF0, 0x06, 0x00, 0x60, 0x0E, 0x00, 0xC0, 0xFF, 0x0F,
+ 0xF0, 0x7F, 0xCF, 0xF9, 0x8E, 0x33, 0x80, 0x70, 0x1C, 0x07, 0x01, 0xC6,
+ 0x70, 0xFF, 0xFF, 0xFF, 0x80, 0x0E, 0x3C, 0x60, 0xC1, 0x83, 0x06, 0x0C,
+ 0x39, 0xE3, 0xC0, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x3C, 0x38, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xF0, 0xE1, 0xC0, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x3C,
+ 0x79, 0x83, 0x06, 0x0C, 0x18, 0x31, 0xE3, 0x80, 0x3C, 0x37, 0xE7, 0x67,
+ 0xE6, 0x1C };
+
+const GFXglyph FreeMonoBold12pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 14, 0, 1 }, // 0x20 ' '
+ { 0, 4, 15, 14, 5, -14 }, // 0x21 '!'
+ { 8, 8, 7, 14, 3, -13 }, // 0x22 '"'
+ { 15, 11, 18, 14, 2, -15 }, // 0x23 '#'
+ { 40, 10, 20, 14, 2, -16 }, // 0x24 '$'
+ { 65, 10, 15, 14, 2, -14 }, // 0x25 '%'
+ { 84, 10, 13, 14, 2, -12 }, // 0x26 '&'
+ { 101, 3, 7, 14, 5, -13 }, // 0x27 '''
+ { 104, 5, 19, 14, 6, -14 }, // 0x28 '('
+ { 116, 5, 19, 14, 3, -14 }, // 0x29 ')'
+ { 128, 10, 10, 14, 2, -14 }, // 0x2A '*'
+ { 141, 12, 13, 14, 1, -12 }, // 0x2B '+'
+ { 161, 5, 7, 14, 4, -2 }, // 0x2C ','
+ { 166, 12, 2, 14, 1, -7 }, // 0x2D '-'
+ { 169, 3, 3, 14, 5, -2 }, // 0x2E '.'
+ { 171, 10, 20, 14, 2, -16 }, // 0x2F '/'
+ { 196, 10, 15, 14, 2, -14 }, // 0x30 '0'
+ { 215, 10, 15, 14, 2, -14 }, // 0x31 '1'
+ { 234, 10, 15, 14, 2, -14 }, // 0x32 '2'
+ { 253, 11, 15, 14, 1, -14 }, // 0x33 '3'
+ { 274, 9, 14, 14, 2, -13 }, // 0x34 '4'
+ { 290, 10, 15, 14, 2, -14 }, // 0x35 '5'
+ { 309, 10, 15, 14, 2, -14 }, // 0x36 '6'
+ { 328, 10, 15, 14, 2, -14 }, // 0x37 '7'
+ { 347, 10, 15, 14, 2, -14 }, // 0x38 '8'
+ { 366, 10, 15, 14, 3, -14 }, // 0x39 '9'
+ { 385, 3, 11, 14, 5, -10 }, // 0x3A ':'
+ { 390, 4, 15, 14, 4, -10 }, // 0x3B ';'
+ { 398, 12, 11, 14, 1, -11 }, // 0x3C '<'
+ { 415, 12, 7, 14, 1, -9 }, // 0x3D '='
+ { 426, 12, 11, 14, 1, -11 }, // 0x3E '>'
+ { 443, 9, 14, 14, 3, -13 }, // 0x3F '?'
+ { 459, 11, 19, 14, 2, -14 }, // 0x40 '@'
+ { 486, 15, 14, 14, -1, -13 }, // 0x41 'A'
+ { 513, 13, 14, 14, 0, -13 }, // 0x42 'B'
+ { 536, 12, 14, 14, 1, -13 }, // 0x43 'C'
+ { 557, 12, 14, 14, 1, -13 }, // 0x44 'D'
+ { 578, 13, 14, 14, 0, -13 }, // 0x45 'E'
+ { 601, 13, 14, 14, 0, -13 }, // 0x46 'F'
+ { 624, 13, 14, 14, 1, -13 }, // 0x47 'G'
+ { 647, 14, 14, 14, 0, -13 }, // 0x48 'H'
+ { 672, 10, 14, 14, 2, -13 }, // 0x49 'I'
+ { 690, 13, 14, 14, 1, -13 }, // 0x4A 'J'
+ { 713, 14, 14, 14, 0, -13 }, // 0x4B 'K'
+ { 738, 12, 14, 14, 1, -13 }, // 0x4C 'L'
+ { 759, 14, 14, 14, 0, -13 }, // 0x4D 'M'
+ { 784, 13, 14, 14, 0, -13 }, // 0x4E 'N'
+ { 807, 12, 14, 14, 1, -13 }, // 0x4F 'O'
+ { 828, 12, 14, 14, 0, -13 }, // 0x50 'P'
+ { 849, 12, 17, 14, 1, -13 }, // 0x51 'Q'
+ { 875, 14, 14, 14, 0, -13 }, // 0x52 'R'
+ { 900, 10, 14, 14, 2, -13 }, // 0x53 'S'
+ { 918, 12, 14, 14, 1, -13 }, // 0x54 'T'
+ { 939, 12, 14, 14, 1, -13 }, // 0x55 'U'
+ { 960, 16, 14, 14, -1, -13 }, // 0x56 'V'
+ { 988, 14, 14, 14, 0, -13 }, // 0x57 'W'
+ { 1013, 14, 14, 14, 0, -13 }, // 0x58 'X'
+ { 1038, 12, 14, 14, 1, -13 }, // 0x59 'Y'
+ { 1059, 10, 14, 14, 2, -13 }, // 0x5A 'Z'
+ { 1077, 5, 19, 14, 6, -14 }, // 0x5B '['
+ { 1089, 10, 20, 14, 2, -16 }, // 0x5C '\'
+ { 1114, 5, 19, 14, 3, -14 }, // 0x5D ']'
+ { 1126, 10, 8, 14, 2, -15 }, // 0x5E '^'
+ { 1136, 14, 2, 14, 0, 4 }, // 0x5F '_'
+ { 1140, 4, 4, 14, 4, -15 }, // 0x60 '`'
+ { 1142, 12, 11, 14, 1, -10 }, // 0x61 'a'
+ { 1159, 13, 15, 14, 0, -14 }, // 0x62 'b'
+ { 1184, 12, 11, 14, 1, -10 }, // 0x63 'c'
+ { 1201, 13, 15, 14, 1, -14 }, // 0x64 'd'
+ { 1226, 12, 11, 14, 1, -10 }, // 0x65 'e'
+ { 1243, 11, 15, 14, 2, -14 }, // 0x66 'f'
+ { 1264, 13, 16, 14, 1, -10 }, // 0x67 'g'
+ { 1290, 14, 15, 14, 0, -14 }, // 0x68 'h'
+ { 1317, 11, 14, 14, 1, -13 }, // 0x69 'i'
+ { 1337, 8, 19, 15, 3, -13 }, // 0x6A 'j'
+ { 1356, 13, 15, 14, 1, -14 }, // 0x6B 'k'
+ { 1381, 11, 15, 14, 1, -14 }, // 0x6C 'l'
+ { 1402, 15, 11, 14, 0, -10 }, // 0x6D 'm'
+ { 1423, 14, 11, 14, 0, -10 }, // 0x6E 'n'
+ { 1443, 12, 11, 14, 1, -10 }, // 0x6F 'o'
+ { 1460, 14, 16, 14, 0, -10 }, // 0x70 'p'
+ { 1488, 14, 16, 14, 0, -10 }, // 0x71 'q'
+ { 1516, 12, 11, 14, 1, -10 }, // 0x72 'r'
+ { 1533, 10, 11, 14, 2, -10 }, // 0x73 's'
+ { 1547, 11, 14, 14, 1, -13 }, // 0x74 't'
+ { 1567, 13, 11, 14, 0, -10 }, // 0x75 'u'
+ { 1585, 14, 11, 14, 0, -10 }, // 0x76 'v'
+ { 1605, 14, 11, 14, 0, -10 }, // 0x77 'w'
+ { 1625, 14, 11, 14, 0, -10 }, // 0x78 'x'
+ { 1645, 12, 16, 14, 1, -10 }, // 0x79 'y'
+ { 1669, 11, 11, 14, 1, -10 }, // 0x7A 'z'
+ { 1685, 7, 19, 14, 3, -14 }, // 0x7B '{'
+ { 1702, 2, 19, 14, 6, -14 }, // 0x7C '|'
+ { 1707, 7, 19, 14, 4, -14 }, // 0x7D '}'
+ { 1724, 12, 4, 14, 1, -7 } }; // 0x7E '~'
+
+const GFXfont FreeMonoBold12pt7b PROGMEM = {
+ (uint8_t *)FreeMonoBold12pt7bBitmaps,
+ (GFXglyph *)FreeMonoBold12pt7bGlyphs,
+ 0x20, 0x7E, 24 };
+
+// Approx. 2402 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBold18pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBold18pt7b.h
new file mode 100644
index 000000000000..36e0be05d7b4
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBold18pt7b.h
@@ -0,0 +1,423 @@
+const uint8_t FreeMonoBold18pt7bBitmaps[] PROGMEM = {
+ 0x77, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x9C, 0xE7, 0x39, 0xC4, 0x03, 0xBF,
+ 0xFF, 0xB8, 0xF1, 0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1E, 0xC1, 0x98, 0x33,
+ 0x06, 0x60, 0xCC, 0x18, 0x0E, 0x1C, 0x0F, 0x3C, 0x1F, 0x3C, 0x1E, 0x3C,
+ 0x1E, 0x3C, 0x1E, 0x78, 0x1E, 0x78, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFE, 0x1E, 0x78, 0x1E, 0x78, 0x1E, 0x78, 0x7F, 0xFE, 0x7F, 0xFE,
+ 0x7F, 0xFE, 0x7F, 0xFE, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0xF0,
+ 0x3C, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x03, 0x00, 0x1E, 0x00, 0x78, 0x01,
+ 0xE0, 0x1F, 0xF1, 0xFF, 0xE7, 0xFF, 0xBE, 0x1E, 0xF0, 0x3B, 0xC0, 0xCF,
+ 0xE0, 0x3F, 0xF8, 0x7F, 0xF0, 0x7F, 0xE0, 0x1F, 0xF0, 0x0F, 0xE0, 0x3F,
+ 0x80, 0xFF, 0x87, 0xFF, 0xFE, 0xFF, 0xF3, 0x7F, 0x80, 0x78, 0x01, 0xE0,
+ 0x07, 0x80, 0x1E, 0x00, 0x78, 0x00, 0xC0, 0x1E, 0x00, 0xFF, 0x03, 0x86,
+ 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18, 0x38, 0x70, 0x3F, 0xC2, 0x1E, 0x3E,
+ 0x03, 0xF8, 0x3F, 0x83, 0xF8, 0x0F, 0x8F, 0x18, 0x7F, 0x01, 0xC7, 0x03,
+ 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x1C, 0x70, 0x1F, 0xC0, 0x0F, 0x00, 0x03,
+ 0xD0, 0x1F, 0xF0, 0x7F, 0xE1, 0xFF, 0xC3, 0xE6, 0x07, 0x80, 0x0F, 0x00,
+ 0x0F, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0xFE, 0x03, 0xFE, 0xFF, 0xBD, 0xFE,
+ 0x3F, 0xFC, 0x3F, 0x7C, 0x7C, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xF8, 0x7E,
+ 0xF0, 0xFF, 0xFF, 0xF6, 0x66, 0x66, 0x07, 0x0F, 0x1F, 0x1E, 0x3E, 0x3C,
+ 0x78, 0x78, 0x78, 0x70, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
+ 0x78, 0x78, 0x78, 0x3C, 0x3C, 0x1E, 0x1F, 0x0F, 0x07, 0xE0, 0xF0, 0xF8,
+ 0x78, 0x7C, 0x3C, 0x3E, 0x1E, 0x1E, 0x1E, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
+ 0x0F, 0x0F, 0x0E, 0x1E, 0x1E, 0x1E, 0x3C, 0x3C, 0x78, 0xF8, 0xF0, 0xE0,
+ 0x01, 0x80, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x7F, 0xFE, 0x1F, 0xF8, 0x07, 0xE0, 0x0F, 0xF0, 0x1F, 0xF8,
+ 0x1E, 0x78, 0x1C, 0x38, 0x18, 0x18, 0x01, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
+ 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
+ 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0x80, 0x3E, 0x78, 0xF3, 0xC7,
+ 0x8E, 0x1C, 0x70, 0xE1, 0x80, 0x7F, 0xFF, 0xDF, 0xFF, 0xF9, 0xFF, 0xFF,
+ 0x3F, 0xFF, 0xE0, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x0E, 0x00, 0x3C, 0x00,
+ 0x78, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x1E, 0x00, 0x38, 0x00, 0xF0,
+ 0x01, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x3C, 0x00, 0x78, 0x01, 0xE0, 0x03,
+ 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x78, 0x00, 0xF0, 0x03, 0xC0, 0x07, 0x80,
+ 0x1E, 0x00, 0x3C, 0x00, 0x70, 0x01, 0xE0, 0x03, 0x80, 0x03, 0x00, 0x00,
+ 0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x3F, 0xFC, 0x7C, 0x3E, 0x78, 0x1E,
+ 0xF8, 0x1F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F,
+ 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF8, 0x1F, 0x78, 0x1E,
+ 0x7C, 0x3E, 0x3F, 0xFC, 0x3F, 0xFC, 0x1F, 0xF8, 0x07, 0xE0, 0x07, 0xC0,
+ 0x1F, 0x80, 0xFF, 0x03, 0xFE, 0x0F, 0xBC, 0x0C, 0x78, 0x00, 0xF0, 0x01,
+ 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78,
+ 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x81, 0xFF, 0xFB, 0xFF, 0xF7,
+ 0xFF, 0xE7, 0xFF, 0x80, 0x0F, 0xC0, 0x7F, 0xE1, 0xFF, 0xE3, 0xFF, 0xEF,
+ 0x87, 0xDE, 0x07, 0xF8, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x7C, 0x01,
+ 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00,
+ 0x78, 0x03, 0xE0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80,
+ 0x0F, 0xC0, 0x7F, 0xF0, 0xFF, 0xF8, 0xFF, 0xFC, 0x70, 0x3E, 0x00, 0x1E,
+ 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x3C, 0x03, 0xFC, 0x03, 0xF0, 0x03, 0xF0,
+ 0x03, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F,
+ 0xE0, 0x3F, 0xFF, 0xFE, 0xFF, 0xFC, 0x7F, 0xF8, 0x1F, 0xE0, 0x00, 0xF8,
+ 0x03, 0xF0, 0x07, 0xE0, 0x1F, 0xC0, 0x77, 0x80, 0xEF, 0x03, 0x9E, 0x0F,
+ 0x3C, 0x1C, 0x78, 0x70, 0xF1, 0xE1, 0xE3, 0x83, 0xCF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x78, 0x07, 0xFC, 0x0F, 0xF8, 0x1F, 0xF0,
+ 0x1F, 0xC0, 0x3F, 0xFC, 0x1F, 0xFE, 0x0F, 0xFF, 0x07, 0xFF, 0x83, 0xC0,
+ 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x7B, 0xE0, 0x3F, 0xFC, 0x1F, 0xFF, 0x0F,
+ 0xFF, 0xC3, 0x83, 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F,
+ 0x00, 0x0F, 0xB8, 0x0F, 0xBF, 0xFF, 0xCF, 0xFF, 0xC3, 0xFF, 0xC0, 0x7F,
+ 0x80, 0x00, 0xFC, 0x07, 0xFC, 0x3F, 0xF8, 0xFF, 0xF1, 0xF8, 0x07, 0xC0,
+ 0x1F, 0x00, 0x3C, 0x00, 0xF0, 0x01, 0xE7, 0xC3, 0xDF, 0xC7, 0x7F, 0xCF,
+ 0xFF, 0xDF, 0x8F, 0xFC, 0x07, 0xF0, 0x0F, 0xF0, 0x1F, 0xE0, 0x3D, 0xE0,
+ 0xFB, 0xFF, 0xE3, 0xFF, 0xC3, 0xFF, 0x01, 0xF8, 0x00, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x01, 0xE0, 0x03, 0x80, 0x0F, 0x00, 0x1E,
+ 0x00, 0x38, 0x00, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00,
+ 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x38,
+ 0x00, 0x70, 0x00, 0x07, 0xC0, 0x3F, 0xE0, 0xFF, 0xE3, 0xFF, 0xEF, 0x83,
+ 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1E, 0xF0, 0x78, 0xFF, 0xE0,
+ 0xFF, 0x81, 0xFF, 0x0F, 0xFF, 0x9E, 0x0F, 0x78, 0x0F, 0xF0, 0x1F, 0xE0,
+ 0x3F, 0xE0, 0xFB, 0xFF, 0xE7, 0xFF, 0xC7, 0xFF, 0x03, 0xF8, 0x00, 0x0F,
+ 0xC0, 0x3F, 0xE0, 0xFF, 0xE3, 0xFF, 0xEF, 0xC3, 0xDF, 0x03, 0xBC, 0x07,
+ 0xF8, 0x0F, 0xF0, 0x1F, 0xF0, 0x3D, 0xF1, 0xFB, 0xFF, 0xF3, 0xFE, 0xE3,
+ 0xFB, 0xC3, 0xE7, 0x80, 0x1E, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xE7, 0xFF,
+ 0x8F, 0xFE, 0x1F, 0xF0, 0x1F, 0x80, 0x00, 0x77, 0xFF, 0xF7, 0x00, 0x00,
+ 0x00, 0x00, 0xEF, 0xFF, 0xEE, 0x1C, 0x7C, 0xF9, 0xF1, 0xC0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xF3, 0xC7, 0x8E, 0x3C, 0x70, 0xE1, 0x87, 0x0C, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0x00, 0xF0, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0xFE,
+ 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00,
+ 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7C, 0x00,
+ 0x07, 0x7F, 0xFF, 0xDF, 0xFF, 0xF9, 0xFF, 0xFF, 0x3F, 0xFF, 0xE0, 0x00,
+ 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xF7, 0xFF, 0xFE, 0x7F, 0xFF, 0xCF, 0xFF,
+ 0xF8, 0x00, 0x00, 0x3C, 0x00, 0x0F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0xC0,
+ 0x01, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x3F, 0x80,
+ 0x3F, 0x80, 0x3F, 0x80, 0x3F, 0x80, 0x3F, 0x80, 0x0F, 0x80, 0x03, 0x80,
+ 0x00, 0x1F, 0xC0, 0xFF, 0xE3, 0xFF, 0xF7, 0xFF, 0xEF, 0x07, 0xFE, 0x03,
+ 0xDC, 0x07, 0x80, 0x0F, 0x00, 0x7C, 0x03, 0xF8, 0x1F, 0xC0, 0x1E, 0x00,
+ 0x30, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x3E,
+ 0x00, 0x7C, 0x00, 0x70, 0x00, 0x07, 0xE0, 0x1F, 0xE0, 0x7F, 0xE1, 0xE1,
+ 0xC7, 0x83, 0xCE, 0x03, 0xBC, 0x07, 0x70, 0x0E, 0xE0, 0x7D, 0xC3, 0xFB,
+ 0x8F, 0xF7, 0x3C, 0xEE, 0x71, 0xDC, 0xE3, 0xB9, 0xC7, 0x73, 0xCE, 0xE3,
+ 0xFF, 0xC3, 0xFF, 0x83, 0xFF, 0x00, 0x07, 0x00, 0x0E, 0x00, 0x1E, 0x02,
+ 0x1E, 0x1E, 0x3F, 0xFC, 0x1F, 0xF0, 0x1F, 0x80, 0x0F, 0xF8, 0x00, 0x7F,
+ 0xF0, 0x01, 0xFF, 0xC0, 0x03, 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x07, 0xF8,
+ 0x00, 0x1C, 0xF0, 0x00, 0xF3, 0xC0, 0x03, 0xCF, 0x00, 0x1E, 0x1E, 0x00,
+ 0x78, 0x78, 0x03, 0xC0, 0xF0, 0x0F, 0xFF, 0xC0, 0x3F, 0xFF, 0x01, 0xFF,
+ 0xFE, 0x07, 0xFF, 0xF8, 0x3C, 0x00, 0xF3, 0xFC, 0x1F, 0xEF, 0xF8, 0x7F,
+ 0xFF, 0xE1, 0xFF, 0x7F, 0x03, 0xF8, 0x7F, 0xFC, 0x0F, 0xFF, 0xF0, 0xFF,
+ 0xFF, 0x8F, 0xFF, 0xF8, 0x3C, 0x07, 0xC3, 0xC0, 0x3C, 0x3C, 0x03, 0xC3,
+ 0xC0, 0x7C, 0x3F, 0xFF, 0x83, 0xFF, 0xF0, 0x3F, 0xFF, 0x83, 0xFF, 0xFE,
+ 0x3C, 0x03, 0xE3, 0xC0, 0x1F, 0x3C, 0x00, 0xF3, 0xC0, 0x0F, 0x3C, 0x01,
+ 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFC, 0x7F, 0xFF, 0x00, 0x01,
+ 0xF8, 0xC1, 0xFF, 0xFC, 0x7F, 0xFF, 0x9F, 0xFF, 0xF7, 0xE0, 0x7E, 0xF8,
+ 0x07, 0xFE, 0x00, 0x7F, 0x80, 0x0E, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0,
+ 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0,
+ 0x07, 0x7F, 0x03, 0xE7, 0xFF, 0xFC, 0x7F, 0xFF, 0x03, 0xFF, 0xC0, 0x1F,
+ 0xE0, 0xFF, 0xF0, 0x3F, 0xFF, 0x0F, 0xFF, 0xE3, 0xFF, 0xFC, 0x78, 0x1F,
+ 0x9E, 0x03, 0xE7, 0x80, 0x79, 0xE0, 0x0F, 0x78, 0x03, 0xDE, 0x00, 0xF7,
+ 0x80, 0x3D, 0xE0, 0x0F, 0x78, 0x03, 0xDE, 0x00, 0xF7, 0x80, 0x7D, 0xE0,
+ 0x1E, 0x78, 0x1F, 0xBF, 0xFF, 0xCF, 0xFF, 0xF3, 0xFF, 0xF0, 0x7F, 0xF0,
+ 0x00, 0x7F, 0xFF, 0xDF, 0xFF, 0xFB, 0xFF, 0xFF, 0x7F, 0xFF, 0xE3, 0xC0,
+ 0x3C, 0x78, 0x07, 0x8F, 0x1C, 0xF1, 0xE3, 0xCC, 0x3F, 0xF8, 0x07, 0xFF,
+ 0x00, 0xFF, 0xE0, 0x1F, 0xFC, 0x03, 0xC7, 0x80, 0x78, 0xF1, 0x8F, 0x0C,
+ 0x79, 0xE0, 0x0F, 0x3C, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xF7, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xF3, 0xC0, 0x1E, 0x78, 0x63, 0xCF, 0x1E, 0x79, 0xE3, 0xC6, 0x3F, 0xF8,
+ 0x07, 0xFF, 0x00, 0xFF, 0xE0, 0x1F, 0xFC, 0x03, 0xC7, 0x80, 0x78, 0xE0,
+ 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x1F, 0xFC, 0x03, 0xFF, 0x80,
+ 0x7F, 0xF0, 0x07, 0xFC, 0x00, 0x01, 0xFC, 0xE0, 0x7F, 0xFE, 0x1F, 0xFF,
+ 0xE3, 0xFF, 0xFE, 0x7F, 0x03, 0xE7, 0xC0, 0x1E, 0xF8, 0x00, 0xEF, 0x00,
+ 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x03, 0xFE, 0xF0,
+ 0x3F, 0xFF, 0x03, 0xFF, 0xF8, 0x3F, 0xF7, 0x80, 0x1E, 0x7E, 0x01, 0xE3,
+ 0xFF, 0xFE, 0x1F, 0xFF, 0xE0, 0xFF, 0xF8, 0x01, 0xFE, 0x00, 0x7F, 0x0F,
+ 0xE3, 0xFC, 0x7F, 0x9F, 0xE3, 0xFC, 0x7F, 0x1F, 0xC1, 0xE0, 0x3C, 0x0F,
+ 0x01, 0xE0, 0x78, 0x0F, 0x03, 0xC0, 0x78, 0x1E, 0x03, 0xC0, 0xFF, 0xFE,
+ 0x07, 0xFF, 0xF0, 0x3F, 0xFF, 0x81, 0xFF, 0xFC, 0x0F, 0x01, 0xE0, 0x78,
+ 0x0F, 0x03, 0xC0, 0x78, 0x1E, 0x03, 0xC3, 0xFC, 0x7F, 0xBF, 0xE3, 0xFF,
+ 0xFF, 0x1F, 0xF7, 0xF0, 0x7F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00,
+ 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x83,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF8, 0x01, 0xFF, 0xE0, 0x3F, 0xFC,
+ 0x07, 0xFF, 0x80, 0xFF, 0xF0, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0,
+ 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x38, 0x07, 0x8F,
+ 0x00, 0xF1, 0xE0, 0x1E, 0x3C, 0x03, 0xC7, 0x80, 0xF8, 0xF8, 0x3F, 0x1F,
+ 0xFF, 0xC3, 0xFF, 0xF0, 0x1F, 0xFC, 0x00, 0x7E, 0x00, 0xFF, 0x0F, 0xCF,
+ 0xF9, 0xFE, 0xFF, 0x9F, 0xEF, 0xF8, 0xFC, 0x3C, 0x1F, 0x03, 0xC3, 0xE0,
+ 0x3C, 0x7C, 0x03, 0xCF, 0x80, 0x3D, 0xF0, 0x03, 0xFE, 0x00, 0x3F, 0xF8,
+ 0x03, 0xFF, 0x80, 0x3E, 0x7C, 0x03, 0xC3, 0xE0, 0x3C, 0x1E, 0x03, 0xC0,
+ 0xF0, 0x3C, 0x0F, 0x0F, 0xF8, 0x7E, 0xFF, 0x87, 0xFF, 0xF8, 0x7F, 0x7F,
+ 0x03, 0xE0, 0xFF, 0xC0, 0x3F, 0xF0, 0x0F, 0xFC, 0x03, 0xFF, 0x00, 0x1E,
+ 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80,
+ 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x01, 0x87, 0x80, 0xF1, 0xE0, 0x3C,
+ 0x78, 0x0F, 0x1E, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F,
+ 0xFF, 0xC0, 0x3E, 0x00, 0xF8, 0xFC, 0x01, 0xF9, 0xFC, 0x07, 0xF3, 0xF8,
+ 0x0F, 0xE3, 0xF8, 0x3F, 0x87, 0xF0, 0x7F, 0x0F, 0xF1, 0xFE, 0x1F, 0xE3,
+ 0xFC, 0x3D, 0xE7, 0x78, 0x7B, 0xDE, 0xF0, 0xF7, 0xBD, 0xE1, 0xE7, 0xF3,
+ 0xC3, 0xCF, 0xE7, 0x87, 0x8F, 0x8F, 0x0F, 0x1F, 0x1E, 0x1E, 0x1E, 0x3C,
+ 0x3C, 0x00, 0x79, 0xFF, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xFC, 0x1F, 0xF7,
+ 0xF0, 0x1F, 0xC0, 0xFC, 0x1F, 0xEF, 0xE1, 0xFF, 0xFE, 0x1F, 0xFF, 0xF1,
+ 0xFF, 0x3F, 0x83, 0xC3, 0xF8, 0x3C, 0x3F, 0xC3, 0xC3, 0xFC, 0x3C, 0x3D,
+ 0xE3, 0xC3, 0xDE, 0x3C, 0x3C, 0xF3, 0xC3, 0xC7, 0xBC, 0x3C, 0x7B, 0xC3,
+ 0xC3, 0xFC, 0x3C, 0x3F, 0xC3, 0xC1, 0xFC, 0x3C, 0x1F, 0xCF, 0xF8, 0xFC,
+ 0xFF, 0x87, 0xCF, 0xF8, 0x7C, 0x7F, 0x03, 0xC0, 0x01, 0xF8, 0x00, 0x7F,
+ 0xE0, 0x0F, 0xFF, 0x81, 0xFF, 0xFC, 0x3F, 0x0F, 0xC7, 0xC0, 0x3E, 0x78,
+ 0x01, 0xEF, 0x80, 0x1F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF,
+ 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x80, 0x1F, 0x78, 0x01, 0xE7, 0xC0, 0x3E,
+ 0x3F, 0x0F, 0xC1, 0xFF, 0xF8, 0x1F, 0xFF, 0x00, 0x7F, 0xE0, 0x01, 0xF8,
+ 0x00, 0x7F, 0xF8, 0x3F, 0xFF, 0x8F, 0xFF, 0xF3, 0xFF, 0xFE, 0x3C, 0x0F,
+ 0xCF, 0x00, 0xF3, 0xC0, 0x3C, 0xF0, 0x0F, 0x3C, 0x03, 0xCF, 0x03, 0xF3,
+ 0xFF, 0xF8, 0xFF, 0xFC, 0x3F, 0xFE, 0x0F, 0xFE, 0x03, 0xC0, 0x00, 0xF0,
+ 0x00, 0x3C, 0x00, 0x3F, 0xF8, 0x0F, 0xFE, 0x03, 0xFF, 0x80, 0x7F, 0xC0,
+ 0x00, 0x01, 0xF8, 0x00, 0x7F, 0xE0, 0x0F, 0xFF, 0x01, 0xFF, 0xF8, 0x3F,
+ 0x0F, 0xC7, 0xC0, 0x3E, 0x78, 0x01, 0xEF, 0x80, 0x1F, 0xF0, 0x00, 0xFF,
+ 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x80, 0x1F,
+ 0x78, 0x01, 0xE7, 0xC0, 0x3E, 0x3F, 0x0F, 0xC1, 0xFF, 0xF8, 0x0F, 0xFF,
+ 0x00, 0x7F, 0xE0, 0x03, 0xF8, 0x00, 0x3F, 0x8E, 0x07, 0xFF, 0xF0, 0xFF,
+ 0xFF, 0x0F, 0xFF, 0xE0, 0x60, 0x78, 0x7F, 0xF8, 0x07, 0xFF, 0xF0, 0x3F,
+ 0xFF, 0xE0, 0xFF, 0xFF, 0x01, 0xE0, 0x7C, 0x0F, 0x01, 0xE0, 0x78, 0x0F,
+ 0x03, 0xC0, 0x78, 0x1E, 0x0F, 0xC0, 0xFF, 0xFC, 0x07, 0xFF, 0xC0, 0x3F,
+ 0xF8, 0x01, 0xFF, 0xE0, 0x0F, 0x0F, 0x80, 0x78, 0x3C, 0x03, 0xC0, 0xF0,
+ 0x1E, 0x07, 0xC3, 0xFE, 0x1F, 0xBF, 0xF0, 0x7F, 0xFF, 0x83, 0xF7, 0xF8,
+ 0x0F, 0x00, 0x07, 0xE7, 0x07, 0xFF, 0x8F, 0xFF, 0xC7, 0xFF, 0xE7, 0xC1,
+ 0xF3, 0xC0, 0x79, 0xE0, 0x3C, 0xF8, 0x00, 0x7F, 0x80, 0x1F, 0xFC, 0x07,
+ 0xFF, 0x81, 0xFF, 0xE0, 0x0F, 0xFB, 0x00, 0x7F, 0xC0, 0x1F, 0xE0, 0x0F,
+ 0xFC, 0x1F, 0xFF, 0xFF, 0xBF, 0xFF, 0x8D, 0xFF, 0x80, 0x3F, 0x00, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x1F, 0xE1,
+ 0xE3, 0xFC, 0x3C, 0x7F, 0x87, 0x8F, 0x60, 0xF0, 0xC0, 0x1E, 0x00, 0x03,
+ 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07,
+ 0x80, 0x00, 0xF0, 0x01, 0xFF, 0xE0, 0x3F, 0xFC, 0x07, 0xFF, 0x80, 0x7F,
+ 0xE0, 0xFF, 0x0F, 0xF7, 0xFC, 0x7F, 0xFF, 0xE3, 0xFE, 0xFF, 0x1F, 0xF3,
+ 0xC0, 0x1E, 0x1E, 0x00, 0xF0, 0xF0, 0x07, 0x87, 0x80, 0x3C, 0x3C, 0x01,
+ 0xE1, 0xE0, 0x0F, 0x0F, 0x00, 0x78, 0x78, 0x03, 0xC3, 0xC0, 0x1E, 0x1E,
+ 0x00, 0xF0, 0xF0, 0x07, 0x87, 0xC0, 0x7C, 0x1F, 0x07, 0xC0, 0xFF, 0xFE,
+ 0x03, 0xFF, 0xE0, 0x0F, 0xFE, 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0x03, 0xFD,
+ 0xFF, 0x07, 0xFF, 0xFE, 0x0F, 0xFB, 0xF8, 0x1F, 0xE1, 0xC0, 0x07, 0x03,
+ 0xC0, 0x1E, 0x07, 0x80, 0x3C, 0x07, 0x80, 0xF0, 0x0F, 0x01, 0xE0, 0x0F,
+ 0x03, 0x80, 0x1E, 0x0F, 0x00, 0x3E, 0x1E, 0x00, 0x3C, 0x78, 0x00, 0x78,
+ 0xF0, 0x00, 0x7B, 0xC0, 0x00, 0xF7, 0x80, 0x01, 0xFF, 0x00, 0x01, 0xFC,
+ 0x00, 0x03, 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0xFF, 0x0F,
+ 0xF7, 0xFC, 0x7F, 0xFF, 0xE3, 0xFF, 0xFE, 0x0F, 0xF7, 0x80, 0x0F, 0x3C,
+ 0x38, 0x78, 0xE3, 0xE3, 0x87, 0x1F, 0x1C, 0x38, 0xF8, 0xE1, 0xEF, 0xE7,
+ 0x0F, 0x7F, 0x78, 0x7B, 0xBB, 0xC3, 0xFD, 0xFE, 0x0F, 0xEF, 0xF0, 0x7E,
+ 0x3F, 0x03, 0xF1, 0xF8, 0x1F, 0x8F, 0xC0, 0xFC, 0x3E, 0x07, 0xC1, 0xF0,
+ 0x3E, 0x0F, 0x81, 0xF0, 0x7C, 0x00, 0x7E, 0x0F, 0xDF, 0xE3, 0xFF, 0xFC,
+ 0x7F, 0xBF, 0x07, 0xE1, 0xE0, 0xF8, 0x3E, 0x3E, 0x03, 0xEF, 0x80, 0x3D,
+ 0xE0, 0x03, 0xF8, 0x00, 0x3E, 0x00, 0x03, 0xC0, 0x00, 0xF8, 0x00, 0x3F,
+ 0x80, 0x0F, 0x78, 0x03, 0xC7, 0x80, 0xF8, 0x78, 0x3E, 0x0F, 0x8F, 0xE3,
+ 0xFF, 0xFC, 0x7F, 0xFF, 0x8F, 0xF7, 0xE0, 0xFC, 0x7E, 0x07, 0xEF, 0xF0,
+ 0xFF, 0xFF, 0x0F, 0xF7, 0xE0, 0x7E, 0x1E, 0x07, 0x81, 0xF0, 0xF8, 0x0F,
+ 0x0F, 0x00, 0x79, 0xE0, 0x07, 0xFE, 0x00, 0x3F, 0xC0, 0x01, 0xF8, 0x00,
+ 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00,
+ 0x00, 0xF0, 0x00, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0xFF, 0xF0, 0x07, 0xFE,
+ 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xF0, 0x3C, 0xF0,
+ 0x78, 0xF0, 0xF0, 0x70, 0xE0, 0x01, 0xE0, 0x03, 0xC0, 0x03, 0x80, 0x07,
+ 0x00, 0x0F, 0x00, 0x1E, 0x0E, 0x1C, 0x0F, 0x38, 0x0F, 0x78, 0x0F, 0x7F,
+ 0xFF, 0x7F, 0xFF, 0x7F, 0xFF, 0x7F, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xF0,
+ 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
+ 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFE, 0xFF, 0xFF, 0xFE, 0xE0, 0x01,
+ 0xE0, 0x03, 0xC0, 0x03, 0xC0, 0x07, 0x80, 0x07, 0x00, 0x0F, 0x00, 0x0E,
+ 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x78, 0x00, 0x78, 0x00, 0xF0,
+ 0x00, 0xF0, 0x01, 0xE0, 0x01, 0xE0, 0x03, 0xC0, 0x03, 0xC0, 0x07, 0x80,
+ 0x07, 0x80, 0x0F, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x3C, 0x00,
+ 0x38, 0x00, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
+ 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
+ 0x0F, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x07, 0x00, 0x1F, 0x00,
+ 0x7F, 0x00, 0xFE, 0x03, 0xDE, 0x0F, 0x1E, 0x3E, 0x3E, 0xF8, 0x3F, 0xE0,
+ 0x3F, 0x80, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xF0, 0xC3, 0x87, 0x0E, 0x1C, 0x30, 0x01, 0xFC, 0x01, 0xFF, 0xC0,
+ 0x3F, 0xFC, 0x07, 0xFF, 0xC0, 0x00, 0x78, 0x0F, 0xFF, 0x07, 0xFF, 0xE1,
+ 0xFF, 0xFC, 0x7F, 0xFF, 0x9F, 0x80, 0xF3, 0xC0, 0x1E, 0x78, 0x0F, 0xCF,
+ 0xFF, 0xFE, 0xFF, 0xFF, 0xCF, 0xFF, 0xF8, 0x7F, 0x3E, 0x7C, 0x00, 0x1F,
+ 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F,
+ 0x3F, 0x01, 0xFF, 0xF8, 0x3F, 0xFF, 0x87, 0xFF, 0xF0, 0xFC, 0x1F, 0x1F,
+ 0x01, 0xF3, 0xC0, 0x1E, 0x78, 0x03, 0xCF, 0x00, 0x79, 0xE0, 0x0F, 0x3E,
+ 0x03, 0xE7, 0xE0, 0xFB, 0xFF, 0xFF, 0x7F, 0xFF, 0xCF, 0xFF, 0xF0, 0xF9,
+ 0xF8, 0x00, 0x03, 0xF3, 0x87, 0xFF, 0xCF, 0xFF, 0xEF, 0xFF, 0xF7, 0xE0,
+ 0xFF, 0xC0, 0x3F, 0xC0, 0x0F, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3E,
+ 0x00, 0x4F, 0x80, 0xF7, 0xFF, 0xF9, 0xFF, 0xF8, 0x7F, 0xF8, 0x0F, 0xF0,
+ 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x03,
+ 0xC0, 0x00, 0x3C, 0x03, 0xF3, 0xC0, 0xFF, 0xBC, 0x1F, 0xFF, 0xC3, 0xFF,
+ 0xFC, 0x7E, 0x0F, 0xC7, 0x80, 0x7C, 0xF0, 0x03, 0xCF, 0x00, 0x3C, 0xF0,
+ 0x03, 0xCF, 0x00, 0x3C, 0xF8, 0x07, 0xC7, 0xE0, 0xFC, 0x7F, 0xFF, 0xF3,
+ 0xFF, 0xFF, 0x0F, 0xFF, 0xF0, 0x3F, 0x3E, 0x03, 0xF0, 0x03, 0xFF, 0x01,
+ 0xFF, 0xE0, 0xFF, 0xFC, 0x7E, 0x0F, 0x9E, 0x01, 0xEF, 0x00, 0x3F, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xE0, 0x00, 0x7F, 0xFF,
+ 0xCF, 0xFF, 0xF1, 0xFF, 0xF8, 0x0F, 0xF0, 0x03, 0xFC, 0x07, 0xFF, 0x0F,
+ 0xFF, 0x1F, 0xFF, 0x1E, 0x00, 0x1E, 0x00, 0xFF, 0xF8, 0xFF, 0xFC, 0xFF,
+ 0xFC, 0xFF, 0xF8, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E,
+ 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0xFF, 0xF8, 0xFF, 0xF8, 0xFF,
+ 0xF8, 0xFF, 0xF8, 0x07, 0xE7, 0xC3, 0xFF, 0xFC, 0xFF, 0xFF, 0xBF, 0xFF,
+ 0xF7, 0xC1, 0xF9, 0xF0, 0x1F, 0x3C, 0x01, 0xE7, 0x80, 0x3C, 0xF0, 0x07,
+ 0x9E, 0x00, 0xF3, 0xE0, 0x3E, 0x3E, 0x0F, 0xC7, 0xFF, 0xF8, 0x7F, 0xFF,
+ 0x07, 0xFD, 0xE0, 0x3F, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x3E,
+ 0x03, 0xFF, 0x80, 0x7F, 0xF0, 0x0F, 0xFC, 0x00, 0xFE, 0x00, 0x3E, 0x00,
+ 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x01, 0xE0, 0x00, 0x0F,
+ 0x00, 0x00, 0x78, 0xF8, 0x03, 0xDF, 0xE0, 0x1F, 0xFF, 0x80, 0xFF, 0xFE,
+ 0x07, 0xE1, 0xF0, 0x3E, 0x07, 0x81, 0xE0, 0x3C, 0x0F, 0x01, 0xE0, 0x78,
+ 0x0F, 0x03, 0xC0, 0x78, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x1F, 0xC1, 0xFD,
+ 0xFE, 0x0F, 0xFF, 0xF0, 0x7F, 0xBF, 0x01, 0xF8, 0x03, 0xC0, 0x03, 0xC0,
+ 0x03, 0xC0, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x3F, 0xC0,
+ 0x3F, 0xC0, 0x3F, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
+ 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFE, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x7F, 0xFE, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x00, 0x00,
+ 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0x00, 0xF0, 0x0F, 0x00, 0xF0,
+ 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0,
+ 0x0F, 0x00, 0xF0, 0x0F, 0x01, 0xFF, 0xFE, 0xFF, 0xEF, 0xFC, 0x7F, 0x00,
+ 0x7C, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0x3C, 0x00, 0x0F,
+ 0x00, 0x03, 0xC7, 0xF0, 0xF3, 0xFC, 0x3C, 0xFF, 0x0F, 0x3F, 0x83, 0xDF,
+ 0x00, 0xFF, 0x80, 0x3F, 0xC0, 0x0F, 0xE0, 0x03, 0xFC, 0x00, 0xF7, 0x80,
+ 0x3C, 0xF0, 0x0F, 0x1F, 0x0F, 0xC3, 0xFB, 0xF1, 0xFF, 0xFC, 0x7F, 0xDF,
+ 0x0F, 0xE0, 0x3F, 0xC0, 0x3F, 0xC0, 0x3F, 0xC0, 0x3F, 0xC0, 0x03, 0xC0,
+ 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
+ 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
+ 0x03, 0xC0, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFE, 0x3D, 0xE3,
+ 0xC1, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0x1F, 0xFF, 0xFE, 0x3E, 0x3C, 0x78,
+ 0xF0, 0xF1, 0xE3, 0xC3, 0xC7, 0x8F, 0x0F, 0x1E, 0x3C, 0x3C, 0x78, 0xF0,
+ 0xF1, 0xE3, 0xC3, 0xC7, 0x8F, 0x0F, 0x1E, 0xFE, 0x3E, 0x7F, 0xF8, 0xF9,
+ 0xFF, 0xE3, 0xE7, 0xDF, 0x0F, 0x1E, 0x1E, 0x7C, 0x03, 0xEF, 0xF0, 0x3F,
+ 0xFF, 0x83, 0xFF, 0xFC, 0x1F, 0x87, 0xC1, 0xE0, 0x3C, 0x1E, 0x03, 0xC1,
+ 0xE0, 0x3C, 0x1E, 0x03, 0xC1, 0xE0, 0x3C, 0x1E, 0x03, 0xC1, 0xE0, 0x3C,
+ 0x7F, 0x0F, 0xFF, 0xF0, 0xFF, 0xFF, 0x0F, 0xF7, 0xE0, 0x7E, 0x03, 0xF8,
+ 0x01, 0xFF, 0xC0, 0x7F, 0xFC, 0x1F, 0xFF, 0xC7, 0xE0, 0xFD, 0xF0, 0x07,
+ 0xFC, 0x00, 0x7F, 0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xE0, 0x0F,
+ 0xBF, 0x07, 0xE3, 0xFF, 0xF8, 0x3F, 0xFE, 0x03, 0xFF, 0x80, 0x1F, 0xC0,
+ 0x3E, 0x7E, 0x03, 0xF7, 0xFC, 0x1F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC1, 0xF8,
+ 0x3F, 0x0F, 0x80, 0x7C, 0x78, 0x01, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x78,
+ 0xF0, 0x03, 0xC7, 0xC0, 0x3E, 0x3F, 0x07, 0xE1, 0xFF, 0xFE, 0x0F, 0xFF,
+ 0xE0, 0x7B, 0xFE, 0x03, 0xCF, 0xC0, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07,
+ 0x80, 0x00, 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0xE0, 0x01, 0xFE, 0x00,
+ 0x00, 0x03, 0xF3, 0xE0, 0x7F, 0xDF, 0x87, 0xFF, 0xFC, 0x7F, 0xFF, 0xE7,
+ 0xE0, 0xFC, 0x7C, 0x03, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x78, 0xF0, 0x03,
+ 0xC7, 0x80, 0x1E, 0x3E, 0x01, 0xF0, 0xFC, 0x1F, 0x83, 0xFF, 0xFC, 0x1F,
+ 0xFF, 0xE0, 0x3F, 0xEF, 0x00, 0x7E, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E,
+ 0x00, 0x00, 0xF0, 0x00, 0x3F, 0xE0, 0x01, 0xFF, 0x80, 0x0F, 0xFC, 0x00,
+ 0x3F, 0xC0, 0x7E, 0x1E, 0x7F, 0x3F, 0xFF, 0xBF, 0xFF, 0xFF, 0xF1, 0xFE,
+ 0x00, 0xFC, 0x00, 0x7C, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07,
+ 0x80, 0x03, 0xC0, 0x0F, 0xFF, 0x87, 0xFF, 0xC3, 0xFF, 0xE1, 0xFF, 0xE0,
+ 0x07, 0xE6, 0x1F, 0xFE, 0x7F, 0xFE, 0x7F, 0xFE, 0x78, 0x1E, 0x78, 0x0E,
+ 0x7F, 0xE0, 0x3F, 0xFC, 0x03, 0xFE, 0x60, 0x1F, 0xE0, 0x0F, 0xF8, 0x1F,
+ 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xFC, 0x07, 0xE0, 0x0C, 0x00, 0x0F, 0x00,
+ 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x07, 0xFF, 0xF3, 0xFF, 0xF9, 0xFF,
+ 0xFC, 0xFF, 0xFC, 0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00,
+ 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x07, 0x8F, 0xFF, 0xC3, 0xFF,
+ 0xC1, 0xFF, 0xC0, 0x3F, 0x80, 0xFC, 0x1F, 0xBF, 0x0F, 0xEF, 0xC3, 0xFB,
+ 0xF0, 0xFE, 0x3C, 0x07, 0x8F, 0x01, 0xE3, 0xC0, 0x78, 0xF0, 0x1E, 0x3C,
+ 0x07, 0x8F, 0x01, 0xE3, 0xC0, 0x78, 0xF8, 0x7E, 0x3F, 0xFF, 0xC7, 0xFF,
+ 0xF0, 0xFF, 0x7C, 0x0F, 0x9E, 0x7F, 0x07, 0xF7, 0xFC, 0x7F, 0xFF, 0xE3,
+ 0xFE, 0xFE, 0x0F, 0xE1, 0xE0, 0x3C, 0x0F, 0x01, 0xE0, 0x3C, 0x1E, 0x01,
+ 0xE0, 0xF0, 0x07, 0x8F, 0x00, 0x3E, 0x78, 0x00, 0xF7, 0x80, 0x07, 0xFC,
+ 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x7E,
+ 0x03, 0xF7, 0xF8, 0x3F, 0xFF, 0xC1, 0xFE, 0xFC, 0x07, 0xF3, 0xC7, 0x0F,
+ 0x1E, 0x7C, 0xF0, 0x73, 0xE7, 0x83, 0x9F, 0x7C, 0x1F, 0xFF, 0xC0, 0xFF,
+ 0xFE, 0x03, 0xF7, 0xF0, 0x1F, 0xBF, 0x80, 0xFC, 0xF8, 0x07, 0xC7, 0xC0,
+ 0x1E, 0x3E, 0x00, 0xE0, 0xE0, 0x7E, 0x0F, 0xDF, 0xE3, 0xFF, 0xFC, 0x7F,
+ 0xBF, 0x07, 0xE1, 0xF1, 0xF0, 0x1F, 0xFC, 0x01, 0xFF, 0x00, 0x1F, 0xC0,
+ 0x07, 0xF8, 0x01, 0xFF, 0xC0, 0x7E, 0xFC, 0x1F, 0x8F, 0xC7, 0xE0, 0xFD,
+ 0xFE, 0x3F, 0xFF, 0xC7, 0xFF, 0xF0, 0x7F, 0x7E, 0x0F, 0xDF, 0xE3, 0xFF,
+ 0xFC, 0x7F, 0xBF, 0x07, 0xE3, 0xC0, 0x78, 0x3C, 0x0E, 0x07, 0x83, 0xC0,
+ 0x78, 0x70, 0x0F, 0x1E, 0x00, 0xE3, 0x80, 0x1E, 0xF0, 0x01, 0xDC, 0x00,
+ 0x3F, 0x80, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0x00, 0x01, 0xE0, 0x00,
+ 0x38, 0x00, 0x0F, 0x00, 0x3F, 0xF0, 0x0F, 0xFF, 0x01, 0xFF, 0xE0, 0x1F,
+ 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF9, 0xC7,
+ 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x78, 0x03, 0xC0, 0x1E, 0x07, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x81, 0xF0, 0xFC, 0x7E, 0x1F,
+ 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0xF8, 0xFC, 0x3E, 0x0F,
+ 0x83, 0xF0, 0x3E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xF0, 0x7E,
+ 0x0F, 0xC3, 0xF0, 0x38, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x70, 0x3E, 0x0F, 0xC1, 0xF8, 0x3E,
+ 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x7C, 0x0F, 0xC1, 0xF0,
+ 0x7C, 0x3F, 0x1F, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x83, 0xE1, 0xF8,
+ 0xFC, 0x3F, 0x07, 0x00, 0x1E, 0x00, 0x1F, 0xC0, 0x1F, 0xF0, 0xDF, 0xFC,
+ 0xFF, 0x3F, 0xFB, 0x0F, 0xF8, 0x03, 0xF8, 0x00, 0x78 };
+
+const GFXglyph FreeMonoBold18pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 21, 0, 1 }, // 0x20 ' '
+ { 0, 5, 22, 21, 8, -21 }, // 0x21 '!'
+ { 14, 11, 10, 21, 5, -20 }, // 0x22 '"'
+ { 28, 16, 25, 21, 3, -22 }, // 0x23 '#'
+ { 78, 14, 28, 21, 4, -23 }, // 0x24 '$'
+ { 127, 15, 21, 21, 3, -20 }, // 0x25 '%'
+ { 167, 15, 20, 21, 3, -19 }, // 0x26 '&'
+ { 205, 4, 10, 21, 8, -20 }, // 0x27 '''
+ { 210, 8, 27, 21, 9, -21 }, // 0x28 '('
+ { 237, 8, 27, 21, 4, -21 }, // 0x29 ')'
+ { 264, 16, 15, 21, 3, -21 }, // 0x2A '*'
+ { 294, 16, 19, 21, 3, -18 }, // 0x2B '+'
+ { 332, 7, 10, 21, 5, -3 }, // 0x2C ','
+ { 341, 19, 4, 21, 1, -11 }, // 0x2D '-'
+ { 351, 5, 5, 21, 8, -4 }, // 0x2E '.'
+ { 355, 15, 28, 21, 3, -23 }, // 0x2F '/'
+ { 408, 16, 23, 21, 3, -22 }, // 0x30 '0'
+ { 454, 15, 22, 21, 3, -21 }, // 0x31 '1'
+ { 496, 15, 23, 21, 3, -22 }, // 0x32 '2'
+ { 540, 16, 23, 21, 3, -22 }, // 0x33 '3'
+ { 586, 15, 21, 21, 3, -20 }, // 0x34 '4'
+ { 626, 17, 22, 21, 2, -21 }, // 0x35 '5'
+ { 673, 15, 23, 21, 4, -22 }, // 0x36 '6'
+ { 717, 15, 22, 21, 3, -21 }, // 0x37 '7'
+ { 759, 15, 23, 21, 3, -22 }, // 0x38 '8'
+ { 803, 15, 23, 21, 4, -22 }, // 0x39 '9'
+ { 847, 5, 16, 21, 8, -15 }, // 0x3A ':'
+ { 857, 7, 22, 21, 5, -15 }, // 0x3B ';'
+ { 877, 18, 16, 21, 1, -17 }, // 0x3C '<'
+ { 913, 19, 10, 21, 1, -14 }, // 0x3D '='
+ { 937, 18, 16, 21, 2, -17 }, // 0x3E '>'
+ { 973, 15, 21, 21, 4, -20 }, // 0x3F '?'
+ { 1013, 15, 27, 21, 3, -21 }, // 0x40 '@'
+ { 1064, 22, 21, 21, -1, -20 }, // 0x41 'A'
+ { 1122, 20, 21, 21, 1, -20 }, // 0x42 'B'
+ { 1175, 19, 21, 21, 1, -20 }, // 0x43 'C'
+ { 1225, 18, 21, 21, 2, -20 }, // 0x44 'D'
+ { 1273, 19, 21, 21, 1, -20 }, // 0x45 'E'
+ { 1323, 19, 21, 21, 1, -20 }, // 0x46 'F'
+ { 1373, 20, 21, 21, 1, -20 }, // 0x47 'G'
+ { 1426, 21, 21, 21, 0, -20 }, // 0x48 'H'
+ { 1482, 14, 21, 21, 4, -20 }, // 0x49 'I'
+ { 1519, 19, 21, 21, 2, -20 }, // 0x4A 'J'
+ { 1569, 20, 21, 21, 1, -20 }, // 0x4B 'K'
+ { 1622, 18, 21, 21, 2, -20 }, // 0x4C 'L'
+ { 1670, 23, 21, 21, -1, -20 }, // 0x4D 'M'
+ { 1731, 20, 21, 21, 1, -20 }, // 0x4E 'N'
+ { 1784, 20, 21, 21, 1, -20 }, // 0x4F 'O'
+ { 1837, 18, 21, 21, 1, -20 }, // 0x50 'P'
+ { 1885, 20, 26, 21, 1, -20 }, // 0x51 'Q'
+ { 1950, 21, 21, 21, 0, -20 }, // 0x52 'R'
+ { 2006, 17, 21, 21, 2, -20 }, // 0x53 'S'
+ { 2051, 19, 21, 21, 1, -20 }, // 0x54 'T'
+ { 2101, 21, 21, 21, 0, -20 }, // 0x55 'U'
+ { 2157, 23, 21, 21, -1, -20 }, // 0x56 'V'
+ { 2218, 21, 21, 21, 0, -20 }, // 0x57 'W'
+ { 2274, 19, 21, 21, 1, -20 }, // 0x58 'X'
+ { 2324, 20, 21, 21, 1, -20 }, // 0x59 'Y'
+ { 2377, 16, 21, 21, 3, -20 }, // 0x5A 'Z'
+ { 2419, 8, 27, 21, 9, -21 }, // 0x5B '['
+ { 2446, 15, 28, 21, 3, -23 }, // 0x5C '\'
+ { 2499, 8, 27, 21, 4, -21 }, // 0x5D ']'
+ { 2526, 15, 11, 21, 3, -21 }, // 0x5E '^'
+ { 2547, 21, 4, 21, 0, 4 }, // 0x5F '_'
+ { 2558, 6, 6, 21, 6, -22 }, // 0x60 '`'
+ { 2563, 19, 16, 21, 1, -15 }, // 0x61 'a'
+ { 2601, 19, 22, 21, 1, -21 }, // 0x62 'b'
+ { 2654, 17, 16, 21, 2, -15 }, // 0x63 'c'
+ { 2688, 20, 22, 21, 1, -21 }, // 0x64 'd'
+ { 2743, 18, 16, 21, 1, -15 }, // 0x65 'e'
+ { 2779, 16, 22, 21, 4, -21 }, // 0x66 'f'
+ { 2823, 19, 23, 21, 1, -15 }, // 0x67 'g'
+ { 2878, 21, 22, 21, 0, -21 }, // 0x68 'h'
+ { 2936, 16, 22, 21, 3, -21 }, // 0x69 'i'
+ { 2980, 12, 29, 21, 5, -21 }, // 0x6A 'j'
+ { 3024, 18, 22, 21, 2, -21 }, // 0x6B 'k'
+ { 3074, 16, 22, 21, 3, -21 }, // 0x6C 'l'
+ { 3118, 22, 16, 21, -1, -15 }, // 0x6D 'm'
+ { 3162, 20, 16, 21, 0, -15 }, // 0x6E 'n'
+ { 3202, 19, 16, 21, 1, -15 }, // 0x6F 'o'
+ { 3240, 21, 23, 21, 0, -15 }, // 0x70 'p'
+ { 3301, 21, 23, 22, 1, -15 }, // 0x71 'q'
+ { 3362, 17, 16, 21, 3, -15 }, // 0x72 'r'
+ { 3396, 16, 16, 21, 3, -15 }, // 0x73 's'
+ { 3428, 17, 21, 21, 1, -20 }, // 0x74 't'
+ { 3473, 18, 16, 21, 1, -15 }, // 0x75 'u'
+ { 3509, 21, 16, 21, 0, -15 }, // 0x76 'v'
+ { 3551, 21, 16, 21, 0, -15 }, // 0x77 'w'
+ { 3593, 19, 16, 21, 1, -15 }, // 0x78 'x'
+ { 3631, 19, 23, 21, 1, -15 }, // 0x79 'y'
+ { 3686, 14, 16, 21, 3, -15 }, // 0x7A 'z'
+ { 3714, 10, 27, 21, 6, -21 }, // 0x7B '{'
+ { 3748, 4, 27, 21, 9, -21 }, // 0x7C '|'
+ { 3762, 10, 27, 21, 6, -21 }, // 0x7D '}'
+ { 3796, 17, 8, 21, 2, -13 } }; // 0x7E '~'
+
+const GFXfont FreeMonoBold18pt7b PROGMEM = {
+ (uint8_t *)FreeMonoBold18pt7bBitmaps,
+ (GFXglyph *)FreeMonoBold18pt7bGlyphs,
+ 0x20, 0x7E, 35 };
+
+// Approx. 4485 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBold24pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBold24pt7b.h
new file mode 100644
index 000000000000..aa0dcd045178
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBold24pt7b.h
@@ -0,0 +1,672 @@
+const uint8_t FreeMonoBold24pt7bBitmaps[] PROGMEM = {
+ 0x38, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xF3, 0xE7, 0xCF,
+ 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE3, 0x82, 0x00, 0x00, 0x00, 0x71, 0xF7,
+ 0xFF, 0xEF, 0x9E, 0x00, 0xFC, 0x7E, 0xF8, 0x7D, 0xF0, 0xFB, 0xE1, 0xF7,
+ 0xC3, 0xEF, 0x87, 0xDF, 0x0F, 0xBE, 0x1F, 0x38, 0x1C, 0x70, 0x38, 0xE0,
+ 0x71, 0xC0, 0xE3, 0x81, 0xC7, 0x03, 0x80, 0x01, 0xC1, 0xC0, 0x0F, 0x8F,
+ 0x80, 0x3E, 0x3E, 0x00, 0xF8, 0xF8, 0x03, 0xE3, 0xE0, 0x0F, 0x8F, 0x80,
+ 0x7E, 0x3E, 0x01, 0xF0, 0xF8, 0x07, 0xC7, 0xC0, 0x1F, 0x1F, 0x03, 0xFF,
+ 0xFF, 0x9F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFD, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF,
+ 0x81, 0xF1, 0xF0, 0x07, 0xC7, 0xC0, 0x1F, 0x1F, 0x00, 0x7C, 0x7C, 0x1F,
+ 0xFF, 0xFC, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0x9F, 0xFF,
+ 0xFC, 0x0F, 0x8F, 0x80, 0x3E, 0x3E, 0x00, 0xF8, 0xF8, 0x03, 0xE3, 0xE0,
+ 0x0F, 0x8F, 0x80, 0x3E, 0x3E, 0x00, 0xF8, 0xF8, 0x03, 0xE3, 0xE0, 0x0F,
+ 0x8F, 0x80, 0x3C, 0x3C, 0x00, 0x00, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0,
+ 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x1F, 0xFF, 0x07, 0xFF, 0xF1, 0xFF, 0xFE,
+ 0x7F, 0xFF, 0xDF, 0xC1, 0xFB, 0xF0, 0x1F, 0x7C, 0x01, 0xEF, 0x80, 0x39,
+ 0xF8, 0x00, 0x3F, 0xF8, 0x03, 0xFF, 0xE0, 0x3F, 0xFF, 0x03, 0xFF, 0xF0,
+ 0x0F, 0xFF, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0xC0, 0x07, 0xF8, 0x00, 0xFF,
+ 0x80, 0x1F, 0xF8, 0x07, 0xFF, 0x81, 0xFB, 0xFF, 0xFF, 0x7F, 0xFF, 0xCF,
+ 0xFF, 0xF1, 0xDF, 0xFC, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00,
+ 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x01, 0xC0, 0x00,
+ 0x0F, 0x80, 0x00, 0xFF, 0x00, 0x1F, 0xFC, 0x00, 0xF0, 0xE0, 0x0F, 0x07,
+ 0x80, 0x70, 0x1C, 0x03, 0x80, 0xE0, 0x1C, 0x07, 0x00, 0xF0, 0x78, 0x03,
+ 0xC3, 0x80, 0x1F, 0xFC, 0x00, 0x7F, 0xC1, 0xF0, 0xF8, 0x7F, 0x00, 0x3F,
+ 0xF0, 0x0F, 0xFC, 0x03, 0xFF, 0x00, 0xFF, 0xC0, 0x07, 0xE0, 0xF8, 0x38,
+ 0x1F, 0xE0, 0x01, 0xFF, 0x80, 0x0F, 0x1E, 0x00, 0xF0, 0x78, 0x07, 0x01,
+ 0xC0, 0x38, 0x0E, 0x01, 0xC0, 0x70, 0x0F, 0x07, 0x80, 0x38, 0x78, 0x01,
+ 0xFF, 0xC0, 0x07, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x1F, 0xFC,
+ 0x01, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x0F, 0xC7, 0x00, 0x7C,
+ 0x10, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00,
+ 0x1F, 0x80, 0x00, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0xFF, 0xC7, 0xCF, 0xFF,
+ 0x3F, 0x7E, 0xFF, 0xFF, 0xE7, 0xFF, 0xBE, 0x1F, 0xF9, 0xF0, 0x7F, 0x8F,
+ 0x83, 0xFC, 0x7C, 0x0F, 0xE3, 0xF0, 0x7F, 0xCF, 0xFF, 0xFF, 0x7F, 0xFF,
+ 0xF9, 0xFF, 0xFF, 0xC7, 0xFF, 0xFC, 0x0F, 0xE0, 0x00, 0xFD, 0xF7, 0xDF,
+ 0x7D, 0xF7, 0xDF, 0x38, 0xE3, 0x8E, 0x38, 0xE0, 0x01, 0x80, 0xF0, 0x7C,
+ 0x3F, 0x0F, 0xC7, 0xE1, 0xF8, 0xFC, 0x3E, 0x0F, 0x87, 0xC1, 0xF0, 0x7C,
+ 0x1F, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F,
+ 0x81, 0xF0, 0x7C, 0x1F, 0x07, 0xC0, 0xF8, 0x3E, 0x0F, 0xC1, 0xF0, 0x7E,
+ 0x0F, 0x83, 0xF0, 0x7C, 0x1F, 0x03, 0xC0, 0x60, 0x3C, 0x0F, 0x83, 0xF0,
+ 0xFC, 0x1F, 0x83, 0xE0, 0xFC, 0x1F, 0x07, 0xC1, 0xF8, 0x3E, 0x0F, 0x83,
+ 0xE0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C,
+ 0x1E, 0x0F, 0x83, 0xE0, 0xF8, 0x7C, 0x1F, 0x0F, 0xC3, 0xE1, 0xF8, 0x7C,
+ 0x3F, 0x0F, 0x83, 0xE0, 0xF0, 0x00, 0x00, 0x70, 0x00, 0x07, 0xC0, 0x00,
+ 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x10, 0x7C, 0x11, 0xF3, 0xE7,
+ 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0x87, 0xFF, 0xF0, 0x07,
+ 0xFC, 0x00, 0x3F, 0xE0, 0x03, 0xFF, 0x80, 0x3F, 0x7E, 0x01, 0xFB, 0xF0,
+ 0x1F, 0x8F, 0xC0, 0xF8, 0x3E, 0x03, 0x80, 0xE0, 0x00, 0x38, 0x00, 0x00,
+ 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F,
+ 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8,
+ 0x01, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xDF, 0xFF, 0xFF, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00,
+ 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00,
+ 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x70, 0x00, 0x1F,
+ 0x8F, 0x87, 0xC7, 0xC3, 0xE1, 0xE1, 0xF0, 0xF0, 0x78, 0x38, 0x3C, 0x1C,
+ 0x0E, 0x06, 0x00, 0x7F, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFE, 0x7D, 0xFF, 0xFF, 0xFF, 0xEF, 0x80,
+ 0x00, 0x00, 0x60, 0x00, 0x0F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01,
+ 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00,
+ 0xF8, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00,
+ 0x3E, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x0F, 0xC0, 0x00, 0xF8, 0x00,
+ 0x1F, 0x80, 0x01, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00,
+ 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x1F, 0x00,
+ 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0,
+ 0x00, 0xFC, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x00, 0x00, 0x01,
+ 0xFC, 0x00, 0x3F, 0xF8, 0x03, 0xFF, 0xE0, 0x3F, 0xFF, 0x83, 0xFF, 0xFE,
+ 0x1F, 0x83, 0xF1, 0xF8, 0x0F, 0xCF, 0x80, 0x3E, 0x7C, 0x01, 0xF7, 0xC0,
+ 0x07, 0xFE, 0x00, 0x3F, 0xF0, 0x01, 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7F,
+ 0xE0, 0x03, 0xFF, 0x00, 0x1F, 0xF8, 0x00, 0xFF, 0xC0, 0x07, 0xFE, 0x00,
+ 0x3F, 0xF0, 0x01, 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7D, 0xF0, 0x07, 0xCF,
+ 0x80, 0x3E, 0x7E, 0x03, 0xF1, 0xF8, 0x3F, 0x0F, 0xFF, 0xF8, 0x3F, 0xFF,
+ 0x80, 0xFF, 0xF8, 0x03, 0xFF, 0x80, 0x07, 0xF0, 0x00, 0x01, 0xF8, 0x00,
+ 0x3F, 0x80, 0x0F, 0xF8, 0x01, 0xFF, 0x80, 0x7F, 0xF8, 0x0F, 0xEF, 0x80,
+ 0xFC, 0xF8, 0x07, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8,
+ 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F,
+ 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00,
+ 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x3F, 0xFF, 0xE7,
+ 0xFF, 0xFF, 0x7F, 0xFF, 0xF7, 0xFF, 0xFF, 0x3F, 0xFF, 0xE0, 0x01, 0xFC,
+ 0x00, 0x3F, 0xF8, 0x07, 0xFF, 0xF0, 0x7F, 0xFF, 0xC7, 0xFF, 0xFF, 0x3F,
+ 0x03, 0xFB, 0xF0, 0x07, 0xFF, 0x00, 0x1F, 0xF8, 0x00, 0xFB, 0x80, 0x07,
+ 0xC0, 0x00, 0x3E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF8, 0x00,
+ 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x00,
+ 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xE0,
+ 0x0E, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x03, 0xF8, 0x00, 0xFF, 0xF8, 0x0F, 0xFF,
+ 0xE0, 0xFF, 0xFF, 0x8F, 0xFF, 0xFE, 0x7E, 0x03, 0xF1, 0xC0, 0x0F, 0xC0,
+ 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x0F,
+ 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x07, 0xFC, 0x00, 0x3F, 0xF0, 0x00,
+ 0xFF, 0xC0, 0x00, 0x7F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F,
+ 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x01, 0xFF, 0xC0,
+ 0x3F, 0xBF, 0xFF, 0xFD, 0xFF, 0xFF, 0xC7, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0,
+ 0x1F, 0xF0, 0x00, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x7F, 0x80, 0x07,
+ 0xF8, 0x00, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xEF, 0x80, 0x3E, 0xF8, 0x03,
+ 0xCF, 0x80, 0x7C, 0xF8, 0x0F, 0x8F, 0x80, 0xF0, 0xF8, 0x1F, 0x0F, 0x81,
+ 0xE0, 0xF8, 0x3E, 0x0F, 0x87, 0xC0, 0xF8, 0x78, 0x0F, 0x8F, 0xFF, 0xFE,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x0F,
+ 0x80, 0x07, 0xFE, 0x00, 0xFF, 0xF0, 0x0F, 0xFF, 0x00, 0xFF, 0xF0, 0x07,
+ 0xFE, 0x3F, 0xFF, 0xC1, 0xFF, 0xFF, 0x0F, 0xFF, 0xF8, 0x7F, 0xFF, 0xC3,
+ 0xFF, 0xFC, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00,
+ 0x01, 0xF0, 0x00, 0x0F, 0xBF, 0x00, 0x7F, 0xFF, 0x03, 0xFF, 0xFC, 0x1F,
+ 0xFF, 0xF0, 0xFF, 0xFF, 0x83, 0xC0, 0xFE, 0x00, 0x01, 0xF0, 0x00, 0x0F,
+ 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00,
+ 0x03, 0xE0, 0x00, 0x3F, 0xF0, 0x03, 0xF7, 0xE0, 0x3F, 0xBF, 0xFF, 0xF9,
+ 0xFF, 0xFF, 0xC7, 0xFF, 0xFC, 0x1F, 0xFF, 0x80, 0x1F, 0xF0, 0x00, 0x00,
+ 0x1F, 0xC0, 0x0F, 0xFF, 0x01, 0xFF, 0xF0, 0x7F, 0xFF, 0x0F, 0xFF, 0xE1,
+ 0xFF, 0x00, 0x1F, 0xC0, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00,
+ 0x7C, 0x00, 0x0F, 0x8F, 0xC0, 0xF9, 0xFF, 0x0F, 0xFF, 0xF8, 0xFF, 0xFF,
+ 0xCF, 0xFF, 0xFC, 0xFF, 0x0F, 0xEF, 0xE0, 0x3E, 0xFC, 0x03, 0xFF, 0x80,
+ 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xF7, 0xC0, 0x3F, 0x7E,
+ 0x03, 0xF3, 0xF0, 0x7E, 0x3F, 0xFF, 0xE1, 0xFF, 0xFC, 0x0F, 0xFF, 0x80,
+ 0x7F, 0xF0, 0x01, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xF0, 0x03, 0xE0, 0x00,
+ 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00,
+ 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x1F, 0x00,
+ 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0,
+ 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8,
+ 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x06, 0x00, 0x01, 0xF8, 0x00, 0xFF,
+ 0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x7F, 0xFF, 0xE7, 0xE0, 0x7E, 0xFC,
+ 0x03, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xF7,
+ 0xC0, 0x3E, 0x7E, 0x07, 0xE3, 0xFF, 0xFC, 0x0F, 0xFF, 0x00, 0xFF, 0xF0,
+ 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x7F, 0x0F, 0xE7, 0xC0, 0x3E, 0xF8, 0x01,
+ 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xFC, 0x03, 0xF7, 0xE0,
+ 0x7E, 0x7F, 0xFF, 0xE3, 0xFF, 0xFC, 0x1F, 0xFF, 0x80, 0xFF, 0xF0, 0x03,
+ 0xFC, 0x00, 0x03, 0xF8, 0x00, 0xFF, 0xE0, 0x1F, 0xFF, 0x83, 0xFF, 0xF8,
+ 0x7F, 0xFF, 0xC7, 0xE0, 0xFE, 0xFC, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x01,
+ 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x3F, 0xFC, 0x07, 0xF7, 0xE0,
+ 0xFF, 0x7F, 0xFF, 0xF3, 0xFF, 0xFF, 0x1F, 0xFF, 0xF0, 0xFF, 0x9F, 0x03,
+ 0xF1, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xE0, 0x00, 0x7E, 0x00, 0x0F, 0xC0,
+ 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x0F, 0xF0, 0x7F, 0xFE, 0x0F, 0xFF, 0xC0,
+ 0xFF, 0xF8, 0x0F, 0xFF, 0x00, 0x3F, 0x80, 0x00, 0x7D, 0xFF, 0xFF, 0xFF,
+ 0xEF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF,
+ 0xFF, 0xFF, 0xEF, 0x80, 0x0F, 0x87, 0xF1, 0xFC, 0x7F, 0x1F, 0xC3, 0xE0,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F,
+ 0x1F, 0x87, 0xE1, 0xF0, 0xFC, 0x3E, 0x0F, 0x03, 0xC1, 0xE0, 0x78, 0x1C,
+ 0x07, 0x01, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x7F,
+ 0x00, 0x01, 0xFE, 0x00, 0x07, 0xFC, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0xC0,
+ 0x01, 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x1F, 0xF8, 0x00, 0x7F, 0xE0, 0x00,
+ 0xFF, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x07, 0xFE, 0x00, 0x01, 0xFF, 0x80,
+ 0x00, 0x7F, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x07, 0xFC, 0x00, 0x01, 0xFE,
+ 0x00, 0x00, 0x7F, 0x00, 0x00, 0x1E, 0x7F, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFE, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFE,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFE,
+ 0x00, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x07,
+ 0xFC, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0x00,
+ 0x7F, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xF0, 0x00, 0x3F, 0xF0, 0x01,
+ 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00, 0x1F, 0xF0,
+ 0x00, 0xFF, 0x80, 0x03, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x01, 0xFF, 0xF0, 0xFF, 0xFF, 0x8F,
+ 0xFF, 0xFC, 0xFF, 0xFF, 0xEF, 0xC0, 0x7E, 0xF8, 0x03, 0xFF, 0x80, 0x1F,
+ 0x70, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x3F,
+ 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0x00, 0x0F, 0xC0, 0x00, 0xF0, 0x00, 0x0F,
+ 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1F, 0x00, 0x03, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00,
+ 0x3F, 0x80, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0xFF, 0x80, 0x3F, 0xF8,
+ 0x0F, 0xFF, 0x83, 0xE0, 0xF8, 0x78, 0x07, 0x1E, 0x00, 0xF3, 0x80, 0x0E,
+ 0x70, 0x01, 0xDE, 0x00, 0x3B, 0x80, 0x3F, 0x70, 0x1F, 0xEE, 0x07, 0xFD,
+ 0xC1, 0xFF, 0xB8, 0x7E, 0x77, 0x0F, 0x0E, 0xE3, 0xC1, 0xDC, 0x70, 0x3B,
+ 0x8E, 0x07, 0x71, 0xC0, 0xEE, 0x3C, 0x1D, 0xC3, 0xC3, 0xB8, 0x7F, 0xF7,
+ 0x07, 0xFF, 0xE0, 0x7F, 0xFC, 0x03, 0xFB, 0xC0, 0x00, 0x38, 0x00, 0x07,
+ 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x61, 0xF0, 0x3E, 0x1F, 0xFF, 0xC3,
+ 0xFF, 0xF0, 0x1F, 0xFC, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x7F,
+ 0xFE, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x7F, 0xFE,
+ 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x01, 0xF7, 0xC0, 0x00, 0x0F, 0xBE, 0x00,
+ 0x00, 0x7D, 0xF8, 0x00, 0x07, 0xC7, 0xC0, 0x00, 0x3E, 0x3E, 0x00, 0x03,
+ 0xE0, 0xF8, 0x00, 0x1F, 0x07, 0xC0, 0x00, 0xF0, 0x3F, 0x00, 0x0F, 0x80,
+ 0xF8, 0x00, 0x7F, 0xFF, 0xC0, 0x07, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0xF8,
+ 0x03, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0x00, 0xF8, 0x00, 0xF8, 0x0F,
+ 0x80, 0x03, 0xE1, 0xFF, 0x80, 0xFF, 0xDF, 0xFE, 0x0F, 0xFF, 0xFF, 0xF0,
+ 0x7F, 0xFF, 0xFF, 0x83, 0xFF, 0xDF, 0xF8, 0x0F, 0xFC, 0x7F, 0xFF, 0xC0,
+ 0x3F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF,
+ 0xFE, 0x07, 0xC0, 0x1F, 0xC1, 0xF0, 0x01, 0xF0, 0x7C, 0x00, 0x7C, 0x1F,
+ 0x00, 0x1F, 0x07, 0xC0, 0x0F, 0xC1, 0xF0, 0x07, 0xE0, 0x7F, 0xFF, 0xF0,
+ 0x1F, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF,
+ 0xFC, 0x1F, 0x00, 0x3F, 0x87, 0xC0, 0x03, 0xF1, 0xF0, 0x00, 0x7C, 0x7C,
+ 0x00, 0x1F, 0x1F, 0x00, 0x07, 0xC7, 0xC0, 0x03, 0xF7, 0xFF, 0xFF, 0xFB,
+ 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x87, 0xFF, 0xFF,
+ 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0xE7, 0x01, 0xFF, 0xFF, 0xC1, 0xFF,
+ 0xFF, 0xE1, 0xFF, 0xFF, 0xF1, 0xFE, 0x07, 0xF8, 0xFC, 0x01, 0xFC, 0xFC,
+ 0x00, 0x7E, 0x7C, 0x00, 0x1F, 0x7E, 0x00, 0x0F, 0xBE, 0x00, 0x03, 0x9F,
+ 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01,
+ 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00,
+ 0x1F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x39, 0xFC, 0x00,
+ 0x7C, 0x7F, 0x80, 0xFF, 0x1F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0x81, 0xFF,
+ 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x7F,
+ 0xFF, 0xF0, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC1,
+ 0xF0, 0x0F, 0xF0, 0xF8, 0x01, 0xF8, 0x7C, 0x00, 0x7E, 0x3E, 0x00, 0x1F,
+ 0x1F, 0x00, 0x0F, 0xCF, 0x80, 0x03, 0xE7, 0xC0, 0x01, 0xF3, 0xE0, 0x00,
+ 0xF9, 0xF0, 0x00, 0x7C, 0xF8, 0x00, 0x3E, 0x7C, 0x00, 0x1F, 0x3E, 0x00,
+ 0x0F, 0x9F, 0x00, 0x07, 0xCF, 0x80, 0x07, 0xE7, 0xC0, 0x03, 0xE3, 0xE0,
+ 0x03, 0xF1, 0xF0, 0x07, 0xF1, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF8, 0xFF,
+ 0xFF, 0xF8, 0x7F, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xFF,
+ 0x7F, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF,
+ 0xF0, 0xF8, 0x00, 0xF8, 0x7C, 0x00, 0x7C, 0x3E, 0x0E, 0x3E, 0x1F, 0x0F,
+ 0x9F, 0x0F, 0x87, 0xC7, 0x07, 0xC3, 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF,
+ 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x3F, 0xFF, 0x00, 0x1F,
+ 0x0F, 0x80, 0x0F, 0x87, 0xC3, 0x87, 0xC1, 0xC3, 0xE3, 0xE0, 0x01, 0xF1,
+ 0xF0, 0x00, 0xF8, 0xF8, 0x00, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF,
+ 0xFF, 0xF8, 0xF8, 0x00, 0x7C, 0x7C, 0x00, 0x3E, 0x3E, 0x00, 0x1F, 0x1F,
+ 0x07, 0x0F, 0x8F, 0x87, 0xC3, 0x87, 0xC3, 0xE0, 0x03, 0xFF, 0xF0, 0x01,
+ 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x3F, 0xFF, 0x00,
+ 0x1F, 0x0F, 0x80, 0x0F, 0x87, 0xC0, 0x07, 0xC3, 0xE0, 0x03, 0xE0, 0xE0,
+ 0x01, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xFF, 0xF0, 0x01, 0xFF, 0xFC,
+ 0x00, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00,
+ 0x7F, 0x8E, 0x00, 0xFF, 0xF7, 0x81, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xE1,
+ 0xFF, 0xFF, 0xF1, 0xFE, 0x03, 0xF8, 0xFC, 0x00, 0xFC, 0xFC, 0x00, 0x3E,
+ 0x7C, 0x00, 0x1F, 0x7E, 0x00, 0x07, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00,
+ 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0, 0x0F,
+ 0xFE, 0xF8, 0x0F, 0xFF, 0xFC, 0x07, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0x00,
+ 0xFF, 0xFF, 0xC0, 0x01, 0xF3, 0xF0, 0x00, 0xF9, 0xFC, 0x00, 0x7C, 0x7F,
+ 0x80, 0xFE, 0x3F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x80,
+ 0x7F, 0xFF, 0x00, 0x07, 0xFC, 0x00, 0x3F, 0xE1, 0xFF, 0x1F, 0xFC, 0xFF,
+ 0xE7, 0xFF, 0x3F, 0xF9, 0xFF, 0xCF, 0xFE, 0x3F, 0xE1, 0xFF, 0x07, 0xC0,
+ 0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8, 0x1F, 0x00, 0x3E, 0x07,
+ 0xC0, 0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x7F, 0xFF, 0xF8, 0x1F, 0xFF, 0xFE,
+ 0x07, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xF8, 0x1F, 0x00,
+ 0x3E, 0x07, 0xC0, 0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8, 0x1F,
+ 0x00, 0x3E, 0x07, 0xC0, 0x0F, 0x87, 0xFE, 0x1F, 0xFB, 0xFF, 0xCF, 0xFF,
+ 0xFF, 0xF3, 0xFF, 0xFF, 0xFC, 0xFF, 0xF7, 0xFE, 0x1F, 0xF8, 0x7F, 0xFF,
+ 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFC, 0x03, 0xE0,
+ 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0,
+ 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80,
+ 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00,
+ 0x03, 0xE0, 0x1F, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF,
+ 0xE0, 0x3F, 0xFF, 0xF0, 0x0F, 0xFF, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x07,
+ 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00,
+ 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0x80, 0x00,
+ 0x07, 0xC0, 0xE0, 0x03, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x00, 0xF8, 0x3E,
+ 0x00, 0x7C, 0x1F, 0x00, 0x3E, 0x0F, 0x80, 0x1F, 0x07, 0xC0, 0x1F, 0x83,
+ 0xF8, 0x3F, 0x81, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xC0,
+ 0x07, 0xFF, 0xC0, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0xE0, 0xFF, 0x9F, 0xFE,
+ 0x3F, 0xFB, 0xFF, 0xC7, 0xFF, 0x7F, 0xF8, 0xFF, 0xE7, 0xFE, 0x0F, 0xF8,
+ 0x3E, 0x01, 0xF8, 0x07, 0xC0, 0xFE, 0x00, 0xF8, 0x3F, 0x80, 0x1F, 0x0F,
+ 0xE0, 0x03, 0xE3, 0xF8, 0x00, 0x7D, 0xFC, 0x00, 0x0F, 0xFF, 0x00, 0x01,
+ 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0xFE, 0x7F,
+ 0x00, 0x1F, 0x87, 0xF0, 0x03, 0xE0, 0x7E, 0x00, 0x7C, 0x07, 0xE0, 0x0F,
+ 0x80, 0x7E, 0x01, 0xF0, 0x0F, 0xC0, 0x3E, 0x00, 0xF8, 0x1F, 0xF8, 0x1F,
+ 0xF7, 0xFF, 0x81, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFE, 0x07, 0xFD, 0xFF,
+ 0x80, 0x7F, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x3F, 0xFF, 0x80,
+ 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xC0, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00,
+ 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0,
+ 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F,
+ 0x00, 0x00, 0x0F, 0x80, 0x0E, 0x07, 0xC0, 0x0F, 0x83, 0xE0, 0x07, 0xC1,
+ 0xF0, 0x03, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x00, 0xF8, 0x3E, 0x00, 0x7D,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xDF, 0xFF, 0xFF, 0xE0, 0x3F, 0x80, 0x03, 0xF8, 0xFF, 0x80, 0x0F, 0xF9,
+ 0xFF, 0x00, 0x1F, 0xF3, 0xFF, 0x00, 0x7F, 0xE3, 0xFE, 0x00, 0xFF, 0x83,
+ 0xFE, 0x03, 0xFE, 0x07, 0xFC, 0x07, 0xFC, 0x0F, 0xFC, 0x1F, 0xF8, 0x1F,
+ 0xF8, 0x3F, 0xF0, 0x3F, 0xF0, 0x7F, 0xE0, 0x7D, 0xF1, 0xF7, 0xC0, 0xFB,
+ 0xE3, 0xEF, 0x81, 0xF7, 0xEF, 0xDF, 0x03, 0xE7, 0xDF, 0x3E, 0x07, 0xCF,
+ 0xFE, 0x7C, 0x0F, 0x8F, 0xF8, 0xF8, 0x1F, 0x1F, 0xF1, 0xF0, 0x3E, 0x1F,
+ 0xE3, 0xE0, 0x7C, 0x3F, 0x87, 0xC0, 0xF8, 0x3F, 0x0F, 0x81, 0xF0, 0x00,
+ 0x1F, 0x03, 0xE0, 0x00, 0x3E, 0x1F, 0xF8, 0x03, 0xFF, 0x7F, 0xF8, 0x0F,
+ 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFD, 0xFF, 0x80, 0x3F,
+ 0xF0, 0x7F, 0x00, 0x7F, 0xEF, 0xF8, 0x0F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF,
+ 0xFC, 0x0F, 0xFF, 0x7F, 0xE0, 0x7F, 0xE1, 0xFF, 0x00, 0xF8, 0x1F, 0xF0,
+ 0x0F, 0x81, 0xFF, 0x80, 0xF8, 0x1F, 0xFC, 0x0F, 0x81, 0xFF, 0xC0, 0xF8,
+ 0x1F, 0x7E, 0x0F, 0x81, 0xF3, 0xF0, 0xF8, 0x1F, 0x3F, 0x0F, 0x81, 0xF1,
+ 0xF8, 0xF8, 0x1F, 0x0F, 0xCF, 0x81, 0xF0, 0xFC, 0xF8, 0x1F, 0x07, 0xEF,
+ 0x81, 0xF0, 0x3F, 0xF8, 0x1F, 0x03, 0xFF, 0x81, 0xF0, 0x1F, 0xF8, 0x1F,
+ 0x00, 0xFF, 0x81, 0xF0, 0x0F, 0xF8, 0x7F, 0xE0, 0x7F, 0x8F, 0xFF, 0x03,
+ 0xF8, 0xFF, 0xF0, 0x3F, 0x8F, 0xFF, 0x01, 0xF8, 0x7F, 0xE0, 0x0F, 0x80,
+ 0x00, 0x3F, 0x80, 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xFF, 0xE0, 0x03, 0xFF,
+ 0xFE, 0x00, 0xFF, 0xFF, 0xE0, 0x3F, 0xC1, 0xFE, 0x0F, 0xE0, 0x0F, 0xE1,
+ 0xF8, 0x00, 0xFC, 0x7E, 0x00, 0x0F, 0xCF, 0x80, 0x00, 0xFB, 0xF0, 0x00,
+ 0x1F, 0xFC, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x3F, 0xF0, 0x00, 0x07, 0xFE,
+ 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xFF, 0x00, 0x00,
+ 0x7F, 0xF0, 0x00, 0x1F, 0xBE, 0x00, 0x03, 0xE7, 0xE0, 0x00, 0xFC, 0x7E,
+ 0x00, 0x3F, 0x0F, 0xE0, 0x0F, 0xE0, 0xFF, 0x07, 0xF8, 0x0F, 0xFF, 0xFE,
+ 0x00, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xF8, 0x00, 0x03,
+ 0xF8, 0x00, 0x7F, 0xFF, 0x80, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF,
+ 0xFF, 0xFC, 0x7F, 0xFF, 0xFE, 0x1F, 0x00, 0xFE, 0x1F, 0x00, 0x3F, 0x1F,
+ 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x1F,
+ 0x00, 0x3F, 0x1F, 0x00, 0x7E, 0x1F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFC, 0x1F,
+ 0xFF, 0xF8, 0x1F, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0x1F, 0x00, 0x00, 0x1F,
+ 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x7F, 0xFC, 0x00, 0xFF,
+ 0xFE, 0x00, 0xFF, 0xFE, 0x00, 0xFF, 0xFE, 0x00, 0x7F, 0xFC, 0x00, 0x00,
+ 0x3F, 0x80, 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xFF, 0xE0, 0x03, 0xFF, 0xFE,
+ 0x00, 0xFF, 0xFF, 0xE0, 0x3F, 0xC1, 0xFE, 0x0F, 0xE0, 0x0F, 0xE1, 0xF8,
+ 0x00, 0xFC, 0x7E, 0x00, 0x0F, 0xCF, 0x80, 0x00, 0xFB, 0xF0, 0x00, 0x1F,
+ 0xFC, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x3F, 0xF0, 0x00, 0x07, 0xFE, 0x00,
+ 0x00, 0xFF, 0xC0, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xFF, 0x80, 0x00, 0xFD,
+ 0xF0, 0x00, 0x1F, 0x3F, 0x00, 0x07, 0xE7, 0xF0, 0x01, 0xF8, 0x7F, 0x00,
+ 0x7F, 0x07, 0xF8, 0x3F, 0xC0, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFC, 0x00,
+ 0x7F, 0xFF, 0x00, 0x07, 0xFF, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x0F, 0x00,
+ 0x00, 0x03, 0xFF, 0x87, 0x80, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0x07,
+ 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF0, 0x0F, 0x01, 0xF8, 0x00, 0x7F, 0xFF,
+ 0x80, 0x0F, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xC0,
+ 0x7F, 0xFF, 0xFE, 0x00, 0xF8, 0x07, 0xE0, 0x0F, 0x80, 0x3F, 0x00, 0xF8,
+ 0x01, 0xF0, 0x0F, 0x80, 0x1F, 0x00, 0xF8, 0x01, 0xF0, 0x0F, 0x80, 0x3F,
+ 0x00, 0xF8, 0x0F, 0xE0, 0x0F, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xC0, 0x0F,
+ 0xFF, 0xF0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xF8, 0x3F,
+ 0x80, 0x0F, 0x81, 0xFC, 0x00, 0xF8, 0x0F, 0xE0, 0x0F, 0x80, 0x7E, 0x00,
+ 0xF8, 0x03, 0xF0, 0x7F, 0xF0, 0x1F, 0xEF, 0xFF, 0x81, 0xFF, 0xFF, 0xF8,
+ 0x0F, 0xFF, 0xFF, 0x80, 0x7F, 0x7F, 0xF0, 0x07, 0xE0, 0x01, 0xFC, 0x70,
+ 0x1F, 0xFD, 0xE0, 0xFF, 0xFF, 0x87, 0xFF, 0xFE, 0x3F, 0xFF, 0xF8, 0xFC,
+ 0x0F, 0xE7, 0xE0, 0x1F, 0x9F, 0x00, 0x3E, 0x7C, 0x00, 0xF9, 0xF0, 0x01,
+ 0xC7, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x3F, 0xFF, 0x00, 0x7F, 0xFF, 0x00,
+ 0xFF, 0xFF, 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xF8, 0x00, 0x07, 0xE0, 0x00,
+ 0x0F, 0xDC, 0x00, 0x1F, 0xF8, 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0xC0, 0x0F,
+ 0xFF, 0xC0, 0xFE, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0x1C,
+ 0xFF, 0xF0, 0x00, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xF0, 0x7F,
+ 0xE0, 0xF8, 0x3F, 0xF0, 0x7C, 0x1F, 0xF8, 0x3E, 0x0F, 0xFC, 0x1F, 0x07,
+ 0xFE, 0x0F, 0x83, 0xEE, 0x07, 0xC0, 0xE0, 0x03, 0xE0, 0x00, 0x01, 0xF0,
+ 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F,
+ 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01,
+ 0xF0, 0x00, 0x0F, 0xFF, 0x80, 0x0F, 0xFF, 0xE0, 0x07, 0xFF, 0xF0, 0x03,
+ 0xFF, 0xF8, 0x00, 0xFF, 0xF8, 0x00, 0x7F, 0xE0, 0x7F, 0xEF, 0xFF, 0x0F,
+ 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0x7F, 0xE0, 0x7F, 0xE1,
+ 0xF0, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0xF8, 0x1F, 0x00,
+ 0x0F, 0x81, 0xF0, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0xF8,
+ 0x1F, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x81, 0xF0,
+ 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0xF8, 0x1F, 0x00, 0x0F,
+ 0x81, 0xF0, 0x00, 0xF8, 0x1F, 0x80, 0x1F, 0x80, 0xF8, 0x01, 0xF0, 0x0F,
+ 0xE0, 0x7F, 0x00, 0x7F, 0xFF, 0xE0, 0x03, 0xFF, 0xFE, 0x00, 0x1F, 0xFF,
+ 0x80, 0x00, 0xFF, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x7F, 0xE0, 0x1F, 0xFB,
+ 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0x7F,
+ 0xE0, 0x1F, 0xF8, 0x7C, 0x00, 0x0F, 0x80, 0xF8, 0x00, 0x7C, 0x03, 0xE0,
+ 0x01, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7E, 0x00,
+ 0xF8, 0x00, 0xF8, 0x07, 0xC0, 0x03, 0xF0, 0x1F, 0x00, 0x07, 0xC0, 0xF8,
+ 0x00, 0x1F, 0x03, 0xE0, 0x00, 0x7E, 0x1F, 0x00, 0x00, 0xF8, 0x7C, 0x00,
+ 0x03, 0xF3, 0xF0, 0x00, 0x07, 0xCF, 0x80, 0x00, 0x1F, 0xBE, 0x00, 0x00,
+ 0x3F, 0xF0, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x07,
+ 0xF8, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xFC,
+ 0x00, 0x00, 0x7F, 0xE0, 0x7F, 0xEF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF0, 0xFF,
+ 0xFF, 0xFF, 0x0F, 0xFF, 0x7F, 0xE0, 0x7F, 0xE3, 0xE0, 0x00, 0x3C, 0x3E,
+ 0x0F, 0x83, 0xC3, 0xE1, 0xF8, 0x3C, 0x3E, 0x1F, 0x87, 0xC3, 0xE1, 0xFC,
+ 0x7C, 0x3E, 0x3F, 0xC7, 0xC1, 0xE3, 0xFC, 0x7C, 0x1F, 0x3F, 0xE7, 0xC1,
+ 0xF7, 0xFE, 0x78, 0x1F, 0x7F, 0xE7, 0x81, 0xF7, 0x9F, 0xF8, 0x1F, 0xF9,
+ 0xFF, 0x81, 0xFF, 0x9F, 0xF8, 0x0F, 0xF9, 0xFF, 0x80, 0xFF, 0x0F, 0xF8,
+ 0x0F, 0xF0, 0xFF, 0x80, 0xFF, 0x0F, 0xF0, 0x0F, 0xE0, 0x7F, 0x00, 0xFE,
+ 0x07, 0xF0, 0x0F, 0xE0, 0x7F, 0x00, 0xFC, 0x03, 0xF0, 0x07, 0xC0, 0x3F,
+ 0x00, 0x7F, 0x80, 0xFF, 0x3F, 0xF0, 0x7F, 0xEF, 0xFC, 0x1F, 0xFB, 0xFF,
+ 0x07, 0xFE, 0x7F, 0x80, 0xFF, 0x07, 0xE0, 0x3F, 0x00, 0xFC, 0x0F, 0x80,
+ 0x1F, 0x87, 0xC0, 0x03, 0xF3, 0xE0, 0x00, 0xFF, 0xF8, 0x00, 0x1F, 0xFC,
+ 0x00, 0x03, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07,
+ 0xF0, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0xFC, 0xF8, 0x00,
+ 0x7E, 0x3F, 0x00, 0x3F, 0x07, 0xE0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x1F,
+ 0x07, 0xFC, 0x0F, 0xFB, 0xFF, 0x87, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xF8,
+ 0x7F, 0xF7, 0xFC, 0x0F, 0xF8, 0x7F, 0x80, 0x7F, 0xBF, 0xF0, 0x3F, 0xFF,
+ 0xFC, 0x0F, 0xFF, 0xFF, 0x03, 0xFF, 0x7F, 0x80, 0x7F, 0x87, 0xE0, 0x1F,
+ 0x80, 0xFC, 0x07, 0xC0, 0x1F, 0x03, 0xE0, 0x03, 0xE1, 0xF8, 0x00, 0xFC,
+ 0x7C, 0x00, 0x1F, 0xBE, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x7F, 0xC0, 0x00,
+ 0x1F, 0xE0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x00,
+ 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F,
+ 0x00, 0x00, 0x07, 0xC0, 0x00, 0x1F, 0xFF, 0x00, 0x0F, 0xFF, 0xE0, 0x03,
+ 0xFF, 0xF8, 0x00, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x7F, 0xFF, 0xF3,
+ 0xFF, 0xFF, 0x9F, 0xFF, 0xFC, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0x3E, 0x03,
+ 0xF1, 0xF0, 0x1F, 0x8F, 0x81, 0xF8, 0x7C, 0x1F, 0x83, 0xE1, 0xF8, 0x0E,
+ 0x1F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0,
+ 0x00, 0xFC, 0x00, 0x0F, 0xE0, 0x70, 0x7E, 0x07, 0xC7, 0xE0, 0x3E, 0x7E,
+ 0x01, 0xF7, 0xE0, 0x0F, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xBF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xBE, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8,
+ 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F,
+ 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0,
+ 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x60, 0x00, 0x0F, 0x00, 0x00,
+ 0xF8, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7E, 0x00,
+ 0x03, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0xF8,
+ 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x03,
+ 0xE0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00,
+ 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xF0,
+ 0x00, 0x1F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x07,
+ 0xC0, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00,
+ 0x1F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F,
+ 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0,
+ 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F,
+ 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x7F, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0x7F, 0xC0, 0x00, 0x40, 0x00, 0x06, 0x00, 0x00, 0xF0,
+ 0x00, 0x1F, 0x80, 0x03, 0xFC, 0x00, 0x7F, 0xE0, 0x0F, 0xFF, 0x00, 0xFF,
+ 0xF8, 0x1F, 0x9F, 0x83, 0xF0, 0xFC, 0x7E, 0x07, 0xEF, 0xC0, 0x3F, 0xF8,
+ 0x01, 0xFF, 0x80, 0x0F, 0x70, 0x00, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xF0, 0xE0, 0x78, 0x3E, 0x0F, 0xC3, 0xF0, 0x7C, 0x1E, 0x06, 0x01, 0xFF,
+ 0x00, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF0, 0x0F, 0xFF,
+ 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x01, 0xFF,
+ 0xF8, 0x07, 0xFF, 0xF8, 0x1F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x7F, 0xFF,
+ 0xF8, 0x7F, 0x00, 0xF8, 0xFC, 0x00, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x03,
+ 0xF8, 0xFC, 0x0F, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x3F, 0xFF,
+ 0xFF, 0x1F, 0xFE, 0xFE, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x00, 0x1F, 0xE0,
+ 0x00, 0x03, 0xFC, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00,
+ 0x3E, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x0F,
+ 0xE0, 0x03, 0xEF, 0xFF, 0x00, 0x7F, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0x81,
+ 0xFF, 0xFF, 0xF8, 0x3F, 0xE0, 0x7F, 0x07, 0xF0, 0x03, 0xF0, 0xFC, 0x00,
+ 0x3E, 0x1F, 0x80, 0x07, 0xE3, 0xE0, 0x00, 0x7C, 0x7C, 0x00, 0x0F, 0x8F,
+ 0x80, 0x01, 0xF1, 0xF0, 0x00, 0x3E, 0x3E, 0x00, 0x07, 0xC7, 0xE0, 0x01,
+ 0xF8, 0xFC, 0x00, 0x3E, 0x1F, 0xC0, 0x0F, 0xCF, 0xFE, 0x07, 0xF3, 0xFF,
+ 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xE0, 0xFE, 0x7F, 0xF0,
+ 0x00, 0x03, 0xF8, 0x00, 0x00, 0xFF, 0x18, 0x03, 0xFF, 0xFC, 0x0F, 0xFF,
+ 0xFC, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x3F, 0x81, 0xFC, 0x7E, 0x00,
+ 0x7C, 0x7C, 0x00, 0x7C, 0xFC, 0x00, 0x3C, 0xF8, 0x00, 0x38, 0xF8, 0x00,
+ 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFC, 0x00,
+ 0x00, 0x7C, 0x00, 0x06, 0x7E, 0x00, 0x1F, 0x7F, 0x80, 0x7F, 0x3F, 0xFF,
+ 0xFF, 0x1F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFC, 0x07, 0xFF, 0xF8, 0x00, 0xFF,
+ 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00,
+ 0x07, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xE0,
+ 0x00, 0x00, 0xF8, 0x00, 0xFE, 0x3E, 0x00, 0xFF, 0xEF, 0x80, 0xFF, 0xFF,
+ 0xE0, 0x7F, 0xFF, 0xF8, 0x3F, 0xFF, 0xFE, 0x1F, 0xE0, 0xFF, 0x87, 0xE0,
+ 0x0F, 0xE1, 0xF0, 0x01, 0xF8, 0xFC, 0x00, 0x7E, 0x3E, 0x00, 0x0F, 0x8F,
+ 0x80, 0x03, 0xE3, 0xE0, 0x00, 0xF8, 0xF8, 0x00, 0x3E, 0x3E, 0x00, 0x0F,
+ 0x8F, 0xC0, 0x07, 0xE1, 0xF0, 0x01, 0xF8, 0x7E, 0x00, 0xFE, 0x0F, 0xE0,
+ 0x7F, 0xE3, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xC0,
+ 0xFF, 0xEF, 0xE0, 0x0F, 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x03, 0xFF, 0xC0,
+ 0x0F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x7F, 0x81, 0xFC,
+ 0x7E, 0x00, 0x7E, 0xFC, 0x00, 0x3E, 0xF8, 0x00, 0x3E, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7F, 0x80, 0x7E,
+ 0x3F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFE, 0x07, 0xFF, 0xF8,
+ 0x00, 0xFF, 0x80, 0x00, 0x3F, 0xE0, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0xC0,
+ 0xFF, 0xFF, 0x07, 0xFF, 0xF8, 0x1F, 0x80, 0x00, 0x7C, 0x00, 0x01, 0xF0,
+ 0x00, 0x07, 0xC0, 0x01, 0xFF, 0xFF, 0x0F, 0xFF, 0xFE, 0x3F, 0xFF, 0xF8,
+ 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x07,
+ 0xC0, 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0,
+ 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x01,
+ 0xFF, 0xFF, 0x0F, 0xFF, 0xFE, 0x3F, 0xFF, 0xF8, 0xFF, 0xFF, 0xE1, 0xFF,
+ 0xFF, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xFF, 0xBF, 0x83, 0xFF, 0xFF, 0xE3,
+ 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFB, 0xFC, 0x3F, 0xF9, 0xF8, 0x07, 0xF0,
+ 0xF8, 0x01, 0xF8, 0xFC, 0x00, 0xFC, 0x7C, 0x00, 0x3E, 0x3E, 0x00, 0x1F,
+ 0x1F, 0x00, 0x0F, 0x8F, 0x80, 0x07, 0xC7, 0xC0, 0x03, 0xE3, 0xF0, 0x03,
+ 0xF0, 0xF8, 0x01, 0xF8, 0x7E, 0x01, 0xFC, 0x3F, 0xC3, 0xFE, 0x0F, 0xFF,
+ 0xFF, 0x03, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xC0, 0x3F, 0xFB, 0xE0, 0x07,
+ 0xF1, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFE, 0x00,
+ 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x3F, 0xFE, 0x00,
+ 0x0F, 0xFC, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00,
+ 0x03, 0xFC, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0,
+ 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x0F, 0xC0, 0x07, 0xCF, 0xFC, 0x01,
+ 0xF7, 0xFF, 0x80, 0x7F, 0xFF, 0xF0, 0x1F, 0xFF, 0xFC, 0x07, 0xFC, 0x1F,
+ 0x81, 0xFC, 0x03, 0xE0, 0x7E, 0x00, 0xF8, 0x1F, 0x00, 0x3E, 0x07, 0xC0,
+ 0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8, 0x1F, 0x00, 0x3E, 0x07,
+ 0xC0, 0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8, 0x1F, 0x00, 0x3E,
+ 0x1F, 0xF0, 0x3F, 0xEF, 0xFE, 0x1F, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xE1,
+ 0xFF, 0xDF, 0xF0, 0x3F, 0xE0, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C,
+ 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1F, 0xF8, 0x01, 0xFF, 0xC0, 0x0F, 0xFE, 0x00, 0x7F, 0xF0,
+ 0x01, 0xFF, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00,
+ 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80,
+ 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x7F, 0xFF, 0xF7, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0x00, 0x00, 0x7C,
+ 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7,
+ 0xFF, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07,
+ 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00,
+ 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8,
+ 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x3F, 0x00, 0x3F, 0xBF, 0xFF, 0xBF, 0xFF,
+ 0x9F, 0xFF, 0xCF, 0xFF, 0x83, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x80,
+ 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xF8,
+ 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F,
+ 0x87, 0xFC, 0x07, 0xC7, 0xFF, 0x03, 0xE3, 0xFF, 0x81, 0xF1, 0xFF, 0xC0,
+ 0xF8, 0x7F, 0xC0, 0x7C, 0xFE, 0x00, 0x3E, 0xFE, 0x00, 0x1F, 0xFE, 0x00,
+ 0x0F, 0xFE, 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x80, 0x01, 0xFF, 0xE0,
+ 0x00, 0xFF, 0xF8, 0x00, 0x7C, 0xFE, 0x00, 0x3E, 0x3F, 0x80, 0x1F, 0x0F,
+ 0xE0, 0x3F, 0x81, 0xFF, 0xBF, 0xC1, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF0,
+ 0x7F, 0xFB, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x01, 0xFF, 0xC0, 0x0F, 0xFE,
+ 0x00, 0x7F, 0xF0, 0x01, 0xFF, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00,
+ 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0,
+ 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00,
+ 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80,
+ 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x03, 0xFF,
+ 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xF8,
+ 0x00, 0x3C, 0x1F, 0x00, 0xFD, 0xFC, 0xFF, 0x07, 0xFF, 0xFF, 0xFE, 0x1F,
+ 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFF, 0xF0, 0xFF, 0x1F, 0x87, 0xC1, 0xF8,
+ 0x7E, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F,
+ 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1,
+ 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C,
+ 0x1F, 0x07, 0xC1, 0xF1, 0xFE, 0x1F, 0x87, 0xEF, 0xFC, 0x7F, 0x1F, 0xFF,
+ 0xF1, 0xFC, 0x7F, 0xFF, 0xC7, 0xF1, 0xFD, 0xFE, 0x1F, 0x87, 0xE0, 0x00,
+ 0x1F, 0x80, 0x1F, 0x9F, 0xF8, 0x1F, 0xDF, 0xFE, 0x0F, 0xFF, 0xFF, 0x87,
+ 0xFF, 0xFF, 0xC1, 0xFF, 0x07, 0xF0, 0x7F, 0x01, 0xF8, 0x3F, 0x00, 0x7C,
+ 0x1F, 0x00, 0x3E, 0x0F, 0x80, 0x1F, 0x07, 0xC0, 0x0F, 0x83, 0xE0, 0x07,
+ 0xC1, 0xF0, 0x03, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x00, 0xF8, 0x3E, 0x00,
+ 0x7C, 0x1F, 0x00, 0x3E, 0x3F, 0xE0, 0x7F, 0xBF, 0xF8, 0x7F, 0xFF, 0xFC,
+ 0x3F, 0xFF, 0xFE, 0x1F, 0xFB, 0xFE, 0x07, 0xF8, 0x00, 0x7F, 0x00, 0x01,
+ 0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xC1,
+ 0xFE, 0x0F, 0xF1, 0xFC, 0x01, 0xFC, 0xFC, 0x00, 0x7E, 0xFC, 0x00, 0x1F,
+ 0xFC, 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x00,
+ 0xFF, 0xC0, 0x00, 0x7F, 0xF0, 0x00, 0x7E, 0xF8, 0x00, 0x7E, 0x7F, 0x00,
+ 0x7F, 0x1F, 0xC0, 0xFF, 0x07, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0x80, 0x7F,
+ 0xFF, 0x00, 0x1F, 0xFF, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x07, 0xE0, 0x03,
+ 0xF9, 0xFF, 0xC0, 0x7F, 0xBF, 0xFE, 0x07, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF,
+ 0xFF, 0xC3, 0xFF, 0x83, 0xFC, 0x0F, 0xE0, 0x0F, 0xE0, 0xFC, 0x00, 0x7E,
+ 0x0F, 0xC0, 0x03, 0xF0, 0xF8, 0x00, 0x1F, 0x0F, 0x80, 0x01, 0xF0, 0xF8,
+ 0x00, 0x1F, 0x0F, 0x80, 0x01, 0xF0, 0xF8, 0x00, 0x3F, 0x0F, 0xC0, 0x03,
+ 0xF0, 0xFE, 0x00, 0x7E, 0x0F, 0xF8, 0x1F, 0xE0, 0xFF, 0xFF, 0xFC, 0x0F,
+ 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xF0, 0x0F, 0x9F, 0xFC, 0x00, 0xF8, 0x7F,
+ 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00,
+ 0xF8, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0xFF, 0xFC,
+ 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x7E, 0x00,
+ 0x00, 0x3F, 0xF9, 0xFC, 0x0F, 0xFF, 0xDF, 0xE1, 0xFF, 0xFF, 0xFE, 0x3F,
+ 0xFF, 0xFF, 0xE3, 0xF8, 0x1F, 0xFC, 0x7F, 0x00, 0x7F, 0x07, 0xC0, 0x03,
+ 0xF0, 0xFC, 0x00, 0x3F, 0x0F, 0x80, 0x01, 0xF0, 0xF8, 0x00, 0x1F, 0x0F,
+ 0x80, 0x01, 0xF0, 0xF8, 0x00, 0x1F, 0x0F, 0xC0, 0x01, 0xF0, 0xFC, 0x00,
+ 0x3F, 0x07, 0xE0, 0x07, 0xF0, 0x7F, 0x81, 0xFF, 0x03, 0xFF, 0xFF, 0xF0,
+ 0x1F, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0x9F, 0x00, 0x0F,
+ 0xE1, 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1F,
+ 0x00, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0x00,
+ 0x03, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x01,
+ 0xF0, 0x3F, 0xC7, 0xFC, 0x7F, 0xCF, 0xFE, 0x7F, 0xDF, 0xFF, 0x7F, 0xFF,
+ 0xFF, 0x3F, 0xFF, 0x0E, 0x07, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xF0,
+ 0x00, 0x07, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0,
+ 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0,
+ 0x00, 0x7F, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF,
+ 0xE0, 0x7F, 0xFF, 0xC0, 0x03, 0xFC, 0x60, 0x7F, 0xFF, 0x87, 0xFF, 0xFC,
+ 0x7F, 0xFF, 0xE7, 0xFF, 0xFF, 0x3F, 0x01, 0xF9, 0xF0, 0x07, 0xCF, 0xC0,
+ 0x1C, 0x7F, 0xF0, 0x03, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x3F, 0xFF, 0xC0,
+ 0x3F, 0xFF, 0x00, 0x0F, 0xFD, 0xC0, 0x07, 0xFE, 0x00, 0x1F, 0xF8, 0x00,
+ 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xEF, 0xFF, 0xFE, 0x3F,
+ 0xFF, 0xC0, 0x07, 0xF8, 0x00, 0x07, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x3E,
+ 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0xFF,
+ 0xF8, 0x7F, 0xFF, 0xF8, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF,
+ 0x80, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00,
+ 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00,
+ 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x03, 0x83, 0xF0, 0x1F, 0x87,
+ 0xFF, 0xFF, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x03,
+ 0xFC, 0x00, 0x7F, 0x01, 0xFE, 0x7F, 0x81, 0xFF, 0x3F, 0xC0, 0xFF, 0x9F,
+ 0xE0, 0x7F, 0xC7, 0xF0, 0x1F, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x00, 0xF8,
+ 0x3E, 0x00, 0x7C, 0x1F, 0x00, 0x3E, 0x0F, 0x80, 0x1F, 0x07, 0xC0, 0x0F,
+ 0x83, 0xE0, 0x07, 0xC1, 0xF0, 0x03, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x01,
+ 0xF8, 0x3F, 0x01, 0xFC, 0x1F, 0xC1, 0xFF, 0x07, 0xFF, 0xFF, 0xC3, 0xFF,
+ 0xFF, 0xE0, 0xFF, 0xF7, 0xF0, 0x3F, 0xF3, 0xF0, 0x03, 0xF0, 0x00, 0x7F,
+ 0xE0, 0x7F, 0xEF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x0F,
+ 0xFF, 0x7F, 0xE0, 0x7F, 0xE0, 0xF8, 0x01, 0xF0, 0x0F, 0xC0, 0x1F, 0x00,
+ 0x7C, 0x03, 0xE0, 0x07, 0xE0, 0x3E, 0x00, 0x3E, 0x07, 0xC0, 0x03, 0xF0,
+ 0x7C, 0x00, 0x1F, 0x0F, 0x80, 0x01, 0xF8, 0xF8, 0x00, 0x0F, 0x9F, 0x00,
+ 0x00, 0xFD, 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x03,
+ 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x1F, 0x80,
+ 0x00, 0x7F, 0x80, 0x1F, 0xEF, 0xFC, 0x03, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF,
+ 0xFC, 0x03, 0xFF, 0x7F, 0x80, 0x1F, 0xE1, 0xF0, 0xF8, 0x7C, 0x1F, 0x1F,
+ 0x87, 0xC1, 0xF1, 0xF8, 0xFC, 0x1F, 0x1F, 0xCF, 0x80, 0xFB, 0xFC, 0xF8,
+ 0x0F, 0xBF, 0xDF, 0x80, 0xFB, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x00, 0x7F,
+ 0xDF, 0xF0, 0x07, 0xF9, 0xFF, 0x00, 0x7F, 0x9F, 0xE0, 0x07, 0xF0, 0xFE,
+ 0x00, 0x3F, 0x0F, 0xE0, 0x03, 0xF0, 0x7E, 0x00, 0x3E, 0x07, 0xC0, 0x03,
+ 0xE0, 0x3C, 0x00, 0x3F, 0xC0, 0xFF, 0x1F, 0xF8, 0x7F, 0xE7, 0xFE, 0x1F,
+ 0xF9, 0xFF, 0x87, 0xFE, 0x3F, 0xC0, 0xFF, 0x03, 0xF8, 0x7F, 0x00, 0x7F,
+ 0x3F, 0x80, 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xE0, 0x00,
+ 0x07, 0xF8, 0x00, 0x07, 0xFF, 0x00, 0x03, 0xFF, 0xE0, 0x01, 0xFF, 0xFE,
+ 0x00, 0xFE, 0x1F, 0xC0, 0x7F, 0x03, 0xF8, 0x7F, 0xC0, 0xFF, 0xBF, 0xF8,
+ 0x7F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0x87, 0xFF, 0x7F, 0xC0, 0xFF, 0x80,
+ 0x7F, 0x80, 0x7F, 0xBF, 0xF0, 0x3F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0x03,
+ 0xFF, 0x7F, 0x80, 0x7F, 0x8F, 0xC0, 0x07, 0x81, 0xF0, 0x03, 0xE0, 0x7E,
+ 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xF0, 0x3E, 0x00, 0x7C, 0x0F, 0x80,
+ 0x0F, 0x87, 0xC0, 0x03, 0xE1, 0xF0, 0x00, 0x7C, 0xF8, 0x00, 0x1F, 0xFE,
+ 0x00, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x07,
+ 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x80, 0x00,
+ 0x07, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0xFF, 0x80,
+ 0x0F, 0xFF, 0xF0, 0x03, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0x00, 0x1F, 0xFF,
+ 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xF0, 0x3F, 0xBE, 0x0F, 0xC3, 0x83, 0xF0, 0x00, 0xFC, 0x00,
+ 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F,
+ 0xC0, 0x3B, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x78, 0x03, 0xF0, 0x1F, 0xC0, 0xFF, 0x07,
+ 0xF8, 0x1F, 0x80, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01,
+ 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x0F, 0x81, 0xFE, 0x0F,
+ 0xF0, 0x3F, 0x80, 0xFF, 0x01, 0xFE, 0x00, 0xFC, 0x01, 0xF0, 0x07, 0xC0,
+ 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF8,
+ 0x07, 0xF8, 0x0F, 0xF0, 0x3F, 0xC0, 0x7F, 0x00, 0x78, 0x77, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE0, 0x78, 0x03, 0xF0, 0x0F,
+ 0xE0, 0x3F, 0xC0, 0x7F, 0x00, 0x7E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80,
+ 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0,
+ 0x07, 0xC0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x03, 0xFC, 0x1F, 0xE0, 0xFC,
+ 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E,
+ 0x00, 0xF8, 0x07, 0xE0, 0x7F, 0x83, 0xFC, 0x0F, 0xF0, 0x3F, 0x80, 0x78,
+ 0x00, 0x07, 0x80, 0x00, 0x7F, 0x80, 0x03, 0xFF, 0x03, 0x9F, 0xFE, 0x1F,
+ 0xFF, 0xFC, 0xFF, 0xF3, 0xFF, 0xFF, 0x87, 0xFF, 0x9C, 0x0F, 0xFC, 0x00,
+ 0x0F, 0xE0, 0x00, 0x1F, 0x00 };
+
+const GFXglyph FreeMonoBold24pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 28, 0, 1 }, // 0x20 ' '
+ { 0, 7, 31, 28, 10, -29 }, // 0x21 '!'
+ { 28, 15, 14, 28, 6, -28 }, // 0x22 '"'
+ { 55, 22, 34, 28, 3, -30 }, // 0x23 '#'
+ { 149, 19, 38, 28, 5, -31 }, // 0x24 '$'
+ { 240, 21, 30, 28, 4, -28 }, // 0x25 '%'
+ { 319, 21, 28, 28, 4, -26 }, // 0x26 '&'
+ { 393, 6, 14, 28, 11, -28 }, // 0x27 '''
+ { 404, 10, 37, 28, 12, -29 }, // 0x28 '('
+ { 451, 10, 37, 28, 6, -29 }, // 0x29 ')'
+ { 498, 21, 19, 28, 4, -28 }, // 0x2A '*'
+ { 548, 23, 26, 28, 3, -25 }, // 0x2B '+'
+ { 623, 9, 14, 28, 7, -6 }, // 0x2C ','
+ { 639, 24, 5, 28, 2, -15 }, // 0x2D '-'
+ { 654, 7, 6, 28, 11, -4 }, // 0x2E '.'
+ { 660, 20, 38, 28, 4, -32 }, // 0x2F '/'
+ { 755, 21, 31, 28, 4, -29 }, // 0x30 '0'
+ { 837, 20, 29, 28, 4, -28 }, // 0x31 '1'
+ { 910, 21, 30, 28, 3, -29 }, // 0x32 '2'
+ { 989, 21, 31, 28, 4, -29 }, // 0x33 '3'
+ { 1071, 20, 28, 28, 4, -27 }, // 0x34 '4'
+ { 1141, 21, 31, 28, 4, -29 }, // 0x35 '5'
+ { 1223, 20, 31, 28, 5, -29 }, // 0x36 '6'
+ { 1301, 20, 30, 28, 4, -29 }, // 0x37 '7'
+ { 1376, 20, 31, 28, 4, -29 }, // 0x38 '8'
+ { 1454, 20, 31, 28, 5, -29 }, // 0x39 '9'
+ { 1532, 7, 22, 28, 11, -20 }, // 0x3A ':'
+ { 1552, 10, 28, 28, 6, -20 }, // 0x3B ';'
+ { 1587, 24, 21, 28, 2, -23 }, // 0x3C '<'
+ { 1650, 24, 14, 28, 2, -19 }, // 0x3D '='
+ { 1692, 23, 22, 28, 3, -23 }, // 0x3E '>'
+ { 1756, 20, 29, 28, 5, -27 }, // 0x3F '?'
+ { 1829, 19, 36, 28, 4, -28 }, // 0x40 '@'
+ { 1915, 29, 27, 28, -1, -26 }, // 0x41 'A'
+ { 2013, 26, 27, 28, 1, -26 }, // 0x42 'B'
+ { 2101, 25, 29, 28, 2, -27 }, // 0x43 'C'
+ { 2192, 25, 27, 28, 1, -26 }, // 0x44 'D'
+ { 2277, 25, 27, 28, 1, -26 }, // 0x45 'E'
+ { 2362, 25, 27, 28, 1, -26 }, // 0x46 'F'
+ { 2447, 25, 29, 28, 2, -27 }, // 0x47 'G'
+ { 2538, 26, 27, 28, 1, -26 }, // 0x48 'H'
+ { 2626, 19, 27, 28, 5, -26 }, // 0x49 'I'
+ { 2691, 25, 28, 28, 3, -26 }, // 0x4A 'J'
+ { 2779, 27, 27, 28, 1, -26 }, // 0x4B 'K'
+ { 2871, 25, 27, 28, 2, -26 }, // 0x4C 'L'
+ { 2956, 31, 27, 28, -1, -26 }, // 0x4D 'M'
+ { 3061, 28, 27, 28, 0, -26 }, // 0x4E 'N'
+ { 3156, 27, 29, 28, 1, -27 }, // 0x4F 'O'
+ { 3254, 24, 27, 28, 1, -26 }, // 0x50 'P'
+ { 3335, 27, 35, 28, 1, -27 }, // 0x51 'Q'
+ { 3454, 28, 27, 28, 0, -26 }, // 0x52 'R'
+ { 3549, 22, 29, 28, 3, -27 }, // 0x53 'S'
+ { 3629, 25, 27, 28, 2, -26 }, // 0x54 'T'
+ { 3714, 28, 28, 28, 0, -26 }, // 0x55 'U'
+ { 3812, 30, 27, 28, -1, -26 }, // 0x56 'V'
+ { 3914, 28, 27, 28, 0, -26 }, // 0x57 'W'
+ { 4009, 26, 27, 28, 1, -26 }, // 0x58 'X'
+ { 4097, 26, 27, 28, 1, -26 }, // 0x59 'Y'
+ { 4185, 21, 27, 28, 4, -26 }, // 0x5A 'Z'
+ { 4256, 10, 37, 28, 12, -29 }, // 0x5B '['
+ { 4303, 20, 38, 28, 4, -32 }, // 0x5C '\'
+ { 4398, 10, 37, 28, 6, -29 }, // 0x5D ']'
+ { 4445, 20, 15, 28, 4, -29 }, // 0x5E '^'
+ { 4483, 28, 5, 28, 0, 5 }, // 0x5F '_'
+ { 4501, 9, 8, 28, 8, -30 }, // 0x60 '`'
+ { 4510, 24, 23, 28, 2, -21 }, // 0x61 'a'
+ { 4579, 27, 31, 28, 0, -29 }, // 0x62 'b'
+ { 4684, 24, 23, 28, 3, -21 }, // 0x63 'c'
+ { 4753, 26, 31, 28, 2, -29 }, // 0x64 'd'
+ { 4854, 24, 23, 28, 2, -21 }, // 0x65 'e'
+ { 4923, 22, 30, 28, 4, -29 }, // 0x66 'f'
+ { 5006, 25, 31, 28, 2, -21 }, // 0x67 'g'
+ { 5103, 26, 30, 28, 1, -29 }, // 0x68 'h'
+ { 5201, 21, 29, 28, 4, -28 }, // 0x69 'i'
+ { 5278, 17, 38, 28, 5, -28 }, // 0x6A 'j'
+ { 5359, 25, 30, 28, 2, -29 }, // 0x6B 'k'
+ { 5453, 21, 30, 28, 4, -29 }, // 0x6C 'l'
+ { 5532, 30, 22, 28, -1, -21 }, // 0x6D 'm'
+ { 5615, 25, 22, 28, 1, -21 }, // 0x6E 'n'
+ { 5684, 25, 23, 28, 2, -21 }, // 0x6F 'o'
+ { 5756, 28, 31, 28, 0, -21 }, // 0x70 'p'
+ { 5865, 28, 31, 28, 1, -21 }, // 0x71 'q'
+ { 5974, 24, 22, 28, 3, -21 }, // 0x72 'r'
+ { 6040, 21, 23, 28, 4, -21 }, // 0x73 's'
+ { 6101, 23, 28, 28, 1, -26 }, // 0x74 't'
+ { 6182, 25, 22, 28, 1, -20 }, // 0x75 'u'
+ { 6251, 28, 21, 28, 0, -20 }, // 0x76 'v'
+ { 6325, 28, 21, 28, 0, -20 }, // 0x77 'w'
+ { 6399, 26, 21, 28, 1, -20 }, // 0x78 'x'
+ { 6468, 26, 30, 28, 1, -20 }, // 0x79 'y'
+ { 6566, 19, 21, 28, 5, -20 }, // 0x7A 'z'
+ { 6616, 14, 37, 28, 7, -29 }, // 0x7B '{'
+ { 6681, 5, 36, 28, 12, -28 }, // 0x7C '|'
+ { 6704, 14, 37, 28, 8, -29 }, // 0x7D '}'
+ { 6769, 22, 10, 28, 3, -17 } }; // 0x7E '~'
+
+const GFXfont FreeMonoBold24pt7b PROGMEM = {
+ (uint8_t *)FreeMonoBold24pt7bBitmaps,
+ (GFXglyph *)FreeMonoBold24pt7bGlyphs,
+ 0x20, 0x7E, 47 };
+
+// Approx. 7469 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBold9pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBold9pt7b.h
new file mode 100644
index 000000000000..75b1766b2c80
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBold9pt7b.h
@@ -0,0 +1,189 @@
+const uint8_t FreeMonoBold9pt7bBitmaps[] PROGMEM = {
+ 0xFF, 0xFF, 0xD2, 0x1F, 0x80, 0xEC, 0x89, 0x12, 0x24, 0x40, 0x36, 0x36,
+ 0x36, 0x7F, 0x7F, 0x36, 0xFF, 0xFF, 0x3C, 0x3C, 0x3C, 0x00, 0x18, 0xFF,
+ 0xFE, 0x3C, 0x1F, 0x1F, 0x83, 0x46, 0x8D, 0xF0, 0xC1, 0x83, 0x00, 0x61,
+ 0x22, 0x44, 0x86, 0x67, 0x37, 0x11, 0x22, 0x4C, 0x70, 0x3C, 0x7E, 0x60,
+ 0x60, 0x30, 0x7B, 0xDF, 0xCE, 0xFF, 0x7F, 0xC9, 0x24, 0x37, 0x66, 0xCC,
+ 0xCC, 0xCC, 0x66, 0x31, 0xCE, 0x66, 0x33, 0x33, 0x33, 0x66, 0xC8, 0x18,
+ 0x18, 0xFF, 0xFF, 0x3C, 0x3C, 0x66, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18,
+ 0x18, 0x18, 0x18, 0x6B, 0x48, 0xFF, 0xFF, 0xC0, 0xF0, 0x02, 0x0C, 0x18,
+ 0x60, 0xC3, 0x06, 0x0C, 0x30, 0x61, 0x83, 0x0C, 0x18, 0x20, 0x00, 0x38,
+ 0xFB, 0xBE, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0xDD, 0xF1, 0xC0, 0x38, 0xF3,
+ 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0xFD, 0xF8, 0x3C, 0xFE, 0xC7, 0x03,
+ 0x03, 0x06, 0x0C, 0x18, 0x70, 0xE3, 0xFF, 0xFF, 0x7C, 0xFE, 0x03, 0x03,
+ 0x03, 0x1E, 0x1E, 0x07, 0x03, 0x03, 0xFE, 0x7C, 0x1C, 0x38, 0xB1, 0x64,
+ 0xD9, 0xBF, 0xFF, 0x3E, 0x7C, 0x7E, 0x3F, 0x18, 0x0F, 0xC7, 0xF3, 0x1C,
+ 0x06, 0x03, 0xC3, 0xFF, 0x9F, 0x80, 0x0F, 0x3F, 0x30, 0x60, 0x60, 0xDC,
+ 0xFE, 0xE3, 0xC3, 0x63, 0x7E, 0x3C, 0xFF, 0xFF, 0xC3, 0x03, 0x06, 0x06,
+ 0x06, 0x0C, 0x0C, 0x0C, 0x18, 0x38, 0xFB, 0x1E, 0x3C, 0x6F, 0x9F, 0x63,
+ 0xC7, 0x8F, 0xF1, 0xC0, 0x3C, 0x7E, 0xE6, 0xC3, 0xC3, 0xE7, 0x7F, 0x3B,
+ 0x06, 0x0E, 0xFC, 0xF0, 0xF0, 0x0F, 0x6C, 0x00, 0x1A, 0xD2, 0x00, 0x01,
+ 0x83, 0x87, 0x0E, 0x0F, 0x80, 0xE0, 0x1C, 0x03, 0xFF, 0xFF, 0xC0, 0x00,
+ 0x0F, 0xFF, 0xFC, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0xF9, 0xE3, 0xC1, 0x80,
+ 0x7C, 0xFE, 0xC7, 0x03, 0x0E, 0x1C, 0x00, 0x00, 0x00, 0x30, 0x30, 0x1E,
+ 0x1F, 0x1C, 0xDC, 0x6C, 0x76, 0x7B, 0x6D, 0xB6, 0xDB, 0x6F, 0xF3, 0xFC,
+ 0x06, 0x33, 0xF8, 0x78, 0x3C, 0x07, 0xC0, 0x38, 0x05, 0x81, 0xB0, 0x36,
+ 0x0F, 0xE1, 0xFC, 0x71, 0xDF, 0x7F, 0xEF, 0x80, 0xFF, 0x3F, 0xE6, 0x19,
+ 0x86, 0x7F, 0x1F, 0xE6, 0x1D, 0x83, 0x60, 0xFF, 0xFF, 0xF0, 0x1F, 0xBF,
+ 0xD8, 0xF8, 0x3C, 0x06, 0x03, 0x01, 0x80, 0x61, 0xBF, 0xC7, 0xC0, 0xFE,
+ 0x3F, 0xE6, 0x19, 0x83, 0x60, 0xD8, 0x36, 0x0D, 0x83, 0x61, 0xBF, 0xEF,
+ 0xE0, 0xFF, 0xFF, 0xD8, 0x6D, 0xB7, 0xC3, 0xE1, 0xB0, 0xC3, 0x61, 0xFF,
+ 0xFF, 0xE0, 0xFF, 0xFF, 0xD8, 0x6D, 0xB7, 0xC3, 0xE1, 0xB0, 0xC0, 0x60,
+ 0x7C, 0x3E, 0x00, 0x1F, 0x9F, 0xE6, 0x1B, 0x06, 0xC0, 0x30, 0x0C, 0x7F,
+ 0x1F, 0xE1, 0x9F, 0xE3, 0xF0, 0xF7, 0xFB, 0xD8, 0xCC, 0x66, 0x33, 0xF9,
+ 0xFC, 0xC6, 0x63, 0x7B, 0xFD, 0xE0, 0xFF, 0xF3, 0x0C, 0x30, 0xC3, 0x0C,
+ 0x33, 0xFF, 0xC0, 0x1F, 0xC7, 0xF0, 0x30, 0x0C, 0x03, 0x00, 0xCC, 0x33,
+ 0x0C, 0xC7, 0x3F, 0x87, 0xC0, 0xF7, 0xBD, 0xE6, 0x61, 0xB0, 0x78, 0x1F,
+ 0x06, 0xE1, 0x98, 0x63, 0x3C, 0xFF, 0x3C, 0xFC, 0x7E, 0x0C, 0x06, 0x03,
+ 0x01, 0x80, 0xC6, 0x63, 0x31, 0xFF, 0xFF, 0xE0, 0xE0, 0xFE, 0x3D, 0xC7,
+ 0x3D, 0xE7, 0xBC, 0xD7, 0x9B, 0xB3, 0x76, 0x60, 0xDE, 0x3F, 0xC7, 0x80,
+ 0xE1, 0xFE, 0x3D, 0xE3, 0x3C, 0x66, 0xCC, 0xDD, 0x99, 0xB3, 0x1E, 0x63,
+ 0xDE, 0x3B, 0xC3, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x7C, 0x07, 0x80,
+ 0xF0, 0x1F, 0x07, 0x71, 0xC7, 0xF0, 0x7C, 0x00, 0xFE, 0x7F, 0x98, 0x6C,
+ 0x36, 0x1B, 0xF9, 0xF8, 0xC0, 0x60, 0x7C, 0x3E, 0x00, 0x1F, 0x07, 0xF1,
+ 0xC7, 0x70, 0x7C, 0x07, 0x80, 0xF0, 0x1F, 0x07, 0x71, 0xC7, 0xF0, 0x7C,
+ 0x0C, 0x33, 0xFE, 0x7F, 0x80, 0xFC, 0x7F, 0x18, 0xCC, 0x66, 0x73, 0xF1,
+ 0xF0, 0xCC, 0x63, 0x7D, 0xFE, 0x60, 0x3F, 0xBF, 0xF0, 0x78, 0x0F, 0x03,
+ 0xF8, 0x3F, 0x83, 0xC3, 0xFF, 0xBF, 0x80, 0xFF, 0xFF, 0xF6, 0x7B, 0x3D,
+ 0x98, 0xC0, 0x60, 0x30, 0x18, 0x3F, 0x1F, 0x80, 0xF1, 0xFE, 0x3D, 0x83,
+ 0x30, 0x66, 0x0C, 0xC1, 0x98, 0x33, 0x06, 0x60, 0xC7, 0xF0, 0x7C, 0x00,
+ 0xFB, 0xFF, 0x7D, 0xC3, 0x18, 0xC3, 0x18, 0x36, 0x06, 0xC0, 0x50, 0x0E,
+ 0x01, 0xC0, 0x10, 0x00, 0xFB, 0xFE, 0xF6, 0x0D, 0x93, 0x6E, 0xDB, 0xB7,
+ 0xAD, 0xEE, 0x7B, 0x8E, 0xE3, 0x18, 0xF3, 0xFC, 0xF7, 0x38, 0xFC, 0x1E,
+ 0x03, 0x01, 0xE0, 0xCC, 0x73, 0xBC, 0xFF, 0x3C, 0xF3, 0xFC, 0xF7, 0x38,
+ 0xCC, 0x1E, 0x07, 0x80, 0xC0, 0x30, 0x0C, 0x0F, 0xC3, 0xF0, 0xFE, 0xFE,
+ 0xC6, 0xCC, 0x18, 0x18, 0x30, 0x63, 0xC3, 0xFF, 0xFF, 0xFF, 0xCC, 0xCC,
+ 0xCC, 0xCC, 0xCC, 0xFF, 0x01, 0x03, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18,
+ 0x30, 0x30, 0x60, 0x60, 0xC0, 0x80, 0xFF, 0x33, 0x33, 0x33, 0x33, 0x33,
+ 0xFF, 0x10, 0x71, 0xE3, 0x6C, 0x70, 0x40, 0xFF, 0xFF, 0xFC, 0x88, 0x80,
+ 0x7E, 0x3F, 0x8F, 0xCF, 0xEE, 0x36, 0x1B, 0xFE, 0xFF, 0xE0, 0x38, 0x06,
+ 0x01, 0xBC, 0x7F, 0x9C, 0x76, 0x0D, 0x83, 0x71, 0xFF, 0xEE, 0xF0, 0x3F,
+ 0xBF, 0xF8, 0x78, 0x3C, 0x07, 0x05, 0xFE, 0x7E, 0x03, 0x80, 0xE0, 0x18,
+ 0xF6, 0x7F, 0xB8, 0xEC, 0x1B, 0x06, 0xE3, 0x9F, 0xF3, 0xFC, 0x3E, 0x3F,
+ 0xB0, 0xFF, 0xFF, 0xFE, 0x01, 0xFE, 0x7E, 0x1F, 0x3F, 0x30, 0x7E, 0x7E,
+ 0x30, 0x30, 0x30, 0x30, 0xFE, 0xFE, 0x3F, 0xBF, 0xF9, 0xD8, 0x6C, 0x37,
+ 0x39, 0xFC, 0x76, 0x03, 0x01, 0x8F, 0xC7, 0xC0, 0xE0, 0x70, 0x18, 0x0D,
+ 0xC7, 0xF3, 0x99, 0x8C, 0xC6, 0x63, 0x7B, 0xFD, 0xE0, 0x18, 0x18, 0x00,
+ 0x78, 0x78, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x60, 0x3F, 0xFC,
+ 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0F, 0xFF, 0x80, 0xE0, 0x70, 0x18, 0x0D,
+ 0xE6, 0xF3, 0xE1, 0xE0, 0xF8, 0x6E, 0x73, 0xF9, 0xE0, 0x78, 0x78, 0x18,
+ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0xFD, 0x9F, 0xF9, 0x9B,
+ 0x33, 0x66, 0x6C, 0xCD, 0xBD, 0xFF, 0xBF, 0xEE, 0x7F, 0x98, 0xCC, 0x66,
+ 0x33, 0x1B, 0xDF, 0xEF, 0x3E, 0x3F, 0xB8, 0xF8, 0x3C, 0x1F, 0x1D, 0xFC,
+ 0x7C, 0xEF, 0x1F, 0xF9, 0xC3, 0xB0, 0x36, 0x06, 0xE1, 0xDF, 0xF3, 0x78,
+ 0x60, 0x0C, 0x03, 0xE0, 0x7C, 0x00, 0x1E, 0xEF, 0xFF, 0x87, 0x60, 0x6C,
+ 0x0D, 0xC3, 0x9F, 0xF0, 0xF6, 0x00, 0xC0, 0x18, 0x0F, 0x81, 0xF0, 0x77,
+ 0xBF, 0xCF, 0x06, 0x03, 0x01, 0x83, 0xF9, 0xFC, 0x3F, 0xFF, 0xC3, 0xFC,
+ 0x3F, 0xC3, 0xFF, 0xFC, 0x60, 0x60, 0x60, 0xFE, 0xFE, 0x60, 0x60, 0x60,
+ 0x61, 0x7F, 0x3E, 0xE7, 0x73, 0x98, 0xCC, 0x66, 0x33, 0x19, 0xFE, 0x7F,
+ 0xFB, 0xFF, 0x7C, 0xC6, 0x18, 0xC1, 0xB0, 0x36, 0x03, 0x80, 0x70, 0xF1,
+ 0xFE, 0x3D, 0xBB, 0x37, 0x63, 0xF8, 0x77, 0x0E, 0xE1, 0x8C, 0xF7, 0xFB,
+ 0xCD, 0x83, 0x83, 0xC3, 0xBB, 0xDF, 0xEF, 0xF3, 0xFC, 0xF6, 0x18, 0xCC,
+ 0x33, 0x07, 0x81, 0xE0, 0x30, 0x0C, 0x06, 0x0F, 0xC3, 0xF0, 0xFF, 0xFF,
+ 0x30, 0xC3, 0x0C, 0x7F, 0xFF, 0x37, 0x66, 0x66, 0xCC, 0x66, 0x66, 0x73,
+ 0xFF, 0xFF, 0xFF, 0xF0, 0xCE, 0x66, 0x66, 0x33, 0x66, 0x66, 0xEC, 0x70,
+ 0x7C, 0xF3, 0xC0, 0xC0 };
+
+const GFXglyph FreeMonoBold9pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 11, 0, 1 }, // 0x20 ' '
+ { 0, 3, 11, 11, 4, -10 }, // 0x21 '!'
+ { 5, 7, 5, 11, 2, -10 }, // 0x22 '"'
+ { 10, 8, 12, 11, 1, -10 }, // 0x23 '#'
+ { 22, 7, 14, 11, 2, -11 }, // 0x24 '$'
+ { 35, 7, 11, 11, 2, -10 }, // 0x25 '%'
+ { 45, 8, 10, 11, 1, -9 }, // 0x26 '&'
+ { 55, 3, 5, 11, 4, -10 }, // 0x27 '''
+ { 57, 4, 14, 11, 5, -10 }, // 0x28 '('
+ { 64, 4, 14, 11, 2, -10 }, // 0x29 ')'
+ { 71, 8, 7, 11, 2, -10 }, // 0x2A '*'
+ { 78, 8, 9, 11, 2, -8 }, // 0x2B '+'
+ { 87, 3, 5, 11, 3, -1 }, // 0x2C ','
+ { 89, 9, 2, 11, 1, -5 }, // 0x2D '-'
+ { 92, 2, 2, 11, 4, -1 }, // 0x2E '.'
+ { 93, 7, 15, 11, 2, -12 }, // 0x2F '/'
+ { 107, 7, 12, 11, 2, -11 }, // 0x30 '0'
+ { 118, 7, 11, 11, 2, -10 }, // 0x31 '1'
+ { 128, 8, 12, 11, 1, -11 }, // 0x32 '2'
+ { 140, 8, 12, 11, 2, -11 }, // 0x33 '3'
+ { 152, 7, 10, 11, 2, -9 }, // 0x34 '4'
+ { 161, 9, 11, 11, 1, -10 }, // 0x35 '5'
+ { 174, 8, 12, 11, 2, -11 }, // 0x36 '6'
+ { 186, 8, 11, 11, 1, -10 }, // 0x37 '7'
+ { 197, 7, 12, 11, 2, -11 }, // 0x38 '8'
+ { 208, 8, 12, 11, 2, -11 }, // 0x39 '9'
+ { 220, 2, 8, 11, 4, -7 }, // 0x3A ':'
+ { 222, 3, 11, 11, 3, -7 }, // 0x3B ';'
+ { 227, 9, 8, 11, 1, -8 }, // 0x3C '<'
+ { 236, 9, 6, 11, 1, -7 }, // 0x3D '='
+ { 243, 9, 8, 11, 1, -8 }, // 0x3E '>'
+ { 252, 8, 11, 11, 2, -10 }, // 0x3F '?'
+ { 263, 9, 15, 11, 1, -11 }, // 0x40 '@'
+ { 280, 11, 11, 11, 0, -10 }, // 0x41 'A'
+ { 296, 10, 11, 11, 1, -10 }, // 0x42 'B'
+ { 310, 9, 11, 11, 1, -10 }, // 0x43 'C'
+ { 323, 10, 11, 11, 0, -10 }, // 0x44 'D'
+ { 337, 9, 11, 11, 1, -10 }, // 0x45 'E'
+ { 350, 9, 11, 11, 1, -10 }, // 0x46 'F'
+ { 363, 10, 11, 11, 1, -10 }, // 0x47 'G'
+ { 377, 9, 11, 11, 1, -10 }, // 0x48 'H'
+ { 390, 6, 11, 11, 3, -10 }, // 0x49 'I'
+ { 399, 10, 11, 11, 1, -10 }, // 0x4A 'J'
+ { 413, 10, 11, 11, 1, -10 }, // 0x4B 'K'
+ { 427, 9, 11, 11, 1, -10 }, // 0x4C 'L'
+ { 440, 11, 11, 11, 0, -10 }, // 0x4D 'M'
+ { 456, 11, 11, 11, 0, -10 }, // 0x4E 'N'
+ { 472, 11, 11, 11, 0, -10 }, // 0x4F 'O'
+ { 488, 9, 11, 11, 1, -10 }, // 0x50 'P'
+ { 501, 11, 14, 11, 0, -10 }, // 0x51 'Q'
+ { 521, 9, 11, 11, 1, -10 }, // 0x52 'R'
+ { 534, 9, 11, 11, 1, -10 }, // 0x53 'S'
+ { 547, 9, 11, 11, 1, -10 }, // 0x54 'T'
+ { 560, 11, 11, 11, 0, -10 }, // 0x55 'U'
+ { 576, 11, 11, 11, 0, -10 }, // 0x56 'V'
+ { 592, 10, 11, 11, 0, -10 }, // 0x57 'W'
+ { 606, 10, 11, 11, 0, -10 }, // 0x58 'X'
+ { 620, 10, 11, 11, 0, -10 }, // 0x59 'Y'
+ { 634, 8, 11, 11, 2, -10 }, // 0x5A 'Z'
+ { 645, 4, 14, 11, 5, -10 }, // 0x5B '['
+ { 652, 7, 15, 11, 2, -12 }, // 0x5C '\'
+ { 666, 4, 14, 11, 2, -10 }, // 0x5D ']'
+ { 673, 7, 6, 11, 2, -11 }, // 0x5E '^'
+ { 679, 11, 2, 11, 0, 3 }, // 0x5F '_'
+ { 682, 3, 3, 11, 3, -11 }, // 0x60 '`'
+ { 684, 9, 8, 11, 1, -7 }, // 0x61 'a'
+ { 693, 10, 11, 11, 0, -10 }, // 0x62 'b'
+ { 707, 9, 8, 11, 1, -7 }, // 0x63 'c'
+ { 716, 10, 11, 11, 1, -10 }, // 0x64 'd'
+ { 730, 9, 8, 11, 1, -7 }, // 0x65 'e'
+ { 739, 8, 11, 11, 2, -10 }, // 0x66 'f'
+ { 750, 9, 12, 11, 1, -7 }, // 0x67 'g'
+ { 764, 9, 11, 11, 1, -10 }, // 0x68 'h'
+ { 777, 8, 11, 11, 2, -10 }, // 0x69 'i'
+ { 788, 6, 15, 11, 2, -10 }, // 0x6A 'j'
+ { 800, 9, 11, 11, 1, -10 }, // 0x6B 'k'
+ { 813, 8, 11, 11, 2, -10 }, // 0x6C 'l'
+ { 824, 11, 8, 11, 0, -7 }, // 0x6D 'm'
+ { 835, 9, 8, 11, 1, -7 }, // 0x6E 'n'
+ { 844, 9, 8, 11, 1, -7 }, // 0x6F 'o'
+ { 853, 11, 12, 11, 0, -7 }, // 0x70 'p'
+ { 870, 11, 12, 11, 0, -7 }, // 0x71 'q'
+ { 887, 9, 8, 11, 1, -7 }, // 0x72 'r'
+ { 896, 8, 8, 11, 2, -7 }, // 0x73 's'
+ { 904, 8, 11, 11, 1, -10 }, // 0x74 't'
+ { 915, 9, 8, 11, 1, -7 }, // 0x75 'u'
+ { 924, 11, 8, 11, 0, -7 }, // 0x76 'v'
+ { 935, 11, 8, 11, 0, -7 }, // 0x77 'w'
+ { 946, 9, 8, 11, 1, -7 }, // 0x78 'x'
+ { 955, 10, 12, 11, 0, -7 }, // 0x79 'y'
+ { 970, 7, 8, 11, 2, -7 }, // 0x7A 'z'
+ { 977, 4, 14, 11, 3, -10 }, // 0x7B '{'
+ { 984, 2, 14, 11, 5, -10 }, // 0x7C '|'
+ { 988, 4, 14, 11, 4, -10 }, // 0x7D '}'
+ { 995, 9, 4, 11, 1, -6 } }; // 0x7E '~'
+
+const GFXfont FreeMonoBold9pt7b PROGMEM = {
+ (uint8_t *)FreeMonoBold9pt7bBitmaps,
+ (GFXglyph *)FreeMonoBold9pt7bGlyphs,
+ 0x20, 0x7E, 18 };
+
+// Approx. 1672 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBoldOblique12pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBoldOblique12pt7b.h
new file mode 100644
index 000000000000..cc3ecb2716aa
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBoldOblique12pt7b.h
@@ -0,0 +1,269 @@
+const uint8_t FreeMonoBoldOblique12pt7bBitmaps[] PROGMEM = {
+ 0x1C, 0xF3, 0xCE, 0x38, 0xE7, 0x1C, 0x61, 0x86, 0x00, 0x63, 0x8C, 0x00,
+ 0xE7, 0xE7, 0xE6, 0xC6, 0xC6, 0xC4, 0x84, 0x03, 0x30, 0x19, 0x81, 0xDC,
+ 0x0C, 0xE0, 0x66, 0x1F, 0xFC, 0xFF, 0xE1, 0x98, 0x0C, 0xC0, 0xEE, 0x06,
+ 0x70, 0xFF, 0xCF, 0xFE, 0x1D, 0xC0, 0xCC, 0x06, 0x60, 0x77, 0x03, 0x30,
+ 0x00, 0x01, 0x00, 0x70, 0x0C, 0x07, 0xF1, 0xFE, 0x71, 0xCC, 0x11, 0x80,
+ 0x3F, 0x03, 0xF0, 0x0F, 0x20, 0x6E, 0x0D, 0xC3, 0x3F, 0xE7, 0xF8, 0x1C,
+ 0x03, 0x00, 0x60, 0x0C, 0x00, 0x0E, 0x03, 0xE0, 0xC4, 0x10, 0x82, 0x30,
+ 0x7C, 0x07, 0x78, 0x7C, 0x7F, 0x19, 0xF0, 0x62, 0x08, 0x41, 0x18, 0x3E,
+ 0x03, 0x80, 0x07, 0xC1, 0xF8, 0x62, 0x0C, 0x01, 0x80, 0x38, 0x0F, 0x03,
+ 0xF7, 0x6F, 0xD8, 0xF3, 0x1E, 0x7F, 0xE7, 0xF8, 0xFF, 0x6D, 0x20, 0x06,
+ 0x1C, 0x70, 0xC3, 0x06, 0x18, 0x30, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30,
+ 0x70, 0x60, 0xC1, 0x00, 0x0C, 0x18, 0x38, 0x30, 0x60, 0xC1, 0x83, 0x06,
+ 0x0C, 0x30, 0x61, 0xC3, 0x0E, 0x38, 0x61, 0xC2, 0x00, 0x06, 0x00, 0xC0,
+ 0x18, 0x3F, 0x7F, 0xFE, 0xFF, 0x07, 0x81, 0xF8, 0x77, 0x0C, 0x60, 0x03,
+ 0x00, 0x70, 0x07, 0x00, 0x60, 0x06, 0x0F, 0xFF, 0xFF, 0xF0, 0xE0, 0x0C,
+ 0x00, 0xC0, 0x0C, 0x01, 0xC0, 0x18, 0x00, 0x1C, 0xE3, 0x1C, 0x63, 0x08,
+ 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x70, 0x01,
+ 0x80, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x0C, 0x00, 0x70, 0x03, 0x80, 0x0C,
+ 0x00, 0x70, 0x03, 0x80, 0x0C, 0x00, 0x70, 0x03, 0x80, 0x0C, 0x00, 0x70,
+ 0x03, 0x80, 0x0C, 0x00, 0x20, 0x00, 0x07, 0x83, 0xF8, 0xE3, 0x98, 0x37,
+ 0x06, 0xC0, 0xD8, 0x1B, 0x03, 0xE0, 0xF8, 0x1B, 0x03, 0x60, 0xEE, 0x38,
+ 0xFE, 0x0F, 0x00, 0x03, 0xC1, 0xF0, 0x7E, 0x0C, 0xC0, 0x38, 0x07, 0x00,
+ 0xC0, 0x18, 0x07, 0x00, 0xE0, 0x18, 0x03, 0x00, 0x61, 0xFF, 0xFF, 0xF0,
+ 0x03, 0xE0, 0x3F, 0x83, 0x8E, 0x38, 0x31, 0x81, 0x80, 0x18, 0x01, 0xC0,
+ 0x1C, 0x01, 0xC0, 0x38, 0x03, 0x80, 0x38, 0x47, 0x87, 0x3F, 0xF3, 0xFF,
+ 0x80, 0x07, 0xC1, 0xFF, 0x18, 0x70, 0x03, 0x00, 0x30, 0x06, 0x07, 0xC0,
+ 0x7C, 0x00, 0xE0, 0x06, 0x00, 0x60, 0x06, 0xC1, 0xCF, 0xF8, 0x7E, 0x00,
+ 0x01, 0xE0, 0x3C, 0x0F, 0x03, 0x60, 0xCC, 0x3B, 0x8E, 0x63, 0x8C, 0x61,
+ 0x9F, 0xFB, 0xFF, 0x01, 0x81, 0xF8, 0x3F, 0x00, 0x0F, 0xF1, 0xFE, 0x18,
+ 0x01, 0x80, 0x18, 0x03, 0xF8, 0x3F, 0xC3, 0x8E, 0x00, 0x60, 0x06, 0x00,
+ 0x60, 0x0C, 0xC1, 0xCF, 0xF8, 0x7E, 0x00, 0x03, 0xE1, 0xFC, 0x70, 0x1C,
+ 0x03, 0x00, 0xC0, 0x1B, 0xC7, 0xFC, 0xF3, 0x98, 0x33, 0x06, 0x60, 0xCE,
+ 0x30, 0xFC, 0x0F, 0x00, 0xFF, 0xFF, 0xFB, 0x07, 0x60, 0xC0, 0x38, 0x06,
+ 0x01, 0xC0, 0x30, 0x0E, 0x01, 0x80, 0x70, 0x1C, 0x03, 0x80, 0x60, 0x08,
+ 0x00, 0x07, 0x83, 0xF8, 0xE3, 0xB0, 0x36, 0x06, 0xC0, 0xDC, 0x31, 0xFC,
+ 0x3F, 0x8C, 0x3B, 0x03, 0x60, 0x6C, 0x39, 0xFE, 0x1F, 0x00, 0x07, 0x81,
+ 0xF8, 0x63, 0x98, 0x33, 0x06, 0x60, 0xCE, 0x79, 0xFF, 0x1E, 0xC0, 0x18,
+ 0x06, 0x01, 0xC0, 0x71, 0xFC, 0x3E, 0x00, 0x19, 0xCC, 0x00, 0x00, 0x00,
+ 0x67, 0x30, 0x06, 0x1C, 0x30, 0x00, 0x00, 0x00, 0x00, 0x38, 0x71, 0xC3,
+ 0x0E, 0x18, 0x20, 0x00, 0x00, 0x18, 0x03, 0xC0, 0x7C, 0x1F, 0x03, 0xE0,
+ 0x3E, 0x00, 0x7C, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0x80, 0x08, 0x7F, 0xFB,
+ 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFB, 0xFF, 0xC0, 0x30, 0x01,
+ 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0x7C, 0x1F, 0x03, 0xE0, 0x7C,
+ 0x07, 0x80, 0x20, 0x00, 0x3E, 0x7F, 0xB0, 0xF8, 0x30, 0x18, 0x1C, 0x1C,
+ 0x3C, 0x38, 0x18, 0x00, 0x06, 0x07, 0x03, 0x00, 0x03, 0xC0, 0x7E, 0x0C,
+ 0x71, 0x83, 0x30, 0x33, 0x0F, 0x33, 0xE6, 0x76, 0x6C, 0x66, 0xC6, 0x6C,
+ 0x6C, 0xFC, 0xC7, 0xEC, 0x00, 0xC0, 0x0C, 0x00, 0xE3, 0x07, 0xF0, 0x3C,
+ 0x00, 0x07, 0xF0, 0x1F, 0xE0, 0x07, 0xC0, 0x1F, 0x80, 0x3B, 0x00, 0xE7,
+ 0x01, 0x8E, 0x07, 0x1C, 0x1F, 0xF8, 0x3F, 0xF0, 0xE0, 0x71, 0x80, 0xEF,
+ 0xC7, 0xFF, 0x8F, 0xC0, 0x3F, 0xF1, 0xFF, 0xC3, 0x06, 0x38, 0x31, 0xC1,
+ 0x8C, 0x18, 0x7F, 0xC3, 0xFE, 0x38, 0x39, 0xC0, 0xCC, 0x06, 0x60, 0x6F,
+ 0xFF, 0x7F, 0xE0, 0x03, 0xEC, 0x3F, 0xF1, 0xC3, 0x8C, 0x06, 0x60, 0x19,
+ 0x80, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x03, 0x3C, 0x1C,
+ 0x7F, 0xE0, 0x7E, 0x00, 0x3F, 0xE1, 0xFF, 0x87, 0x0C, 0x30, 0x31, 0x81,
+ 0x8C, 0x0C, 0xE0, 0x67, 0x03, 0x30, 0x31, 0x81, 0x8C, 0x0C, 0xE1, 0xCF,
+ 0xFC, 0x7F, 0x80, 0x1F, 0xFE, 0x3F, 0xFC, 0x38, 0x38, 0x70, 0x70, 0xCC,
+ 0xC1, 0x98, 0x03, 0xF0, 0x0F, 0xE0, 0x1D, 0x80, 0x31, 0x18, 0x60, 0x70,
+ 0xC0, 0xE7, 0xFF, 0x9F, 0xFF, 0x00, 0x1F, 0xFF, 0x1F, 0xFE, 0x0E, 0x06,
+ 0x0C, 0x0E, 0x0C, 0xC4, 0x0C, 0xC0, 0x1F, 0xC0, 0x1F, 0xC0, 0x19, 0xC0,
+ 0x19, 0x80, 0x18, 0x00, 0x38, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x07, 0xEC,
+ 0x7F, 0xF3, 0x83, 0x9C, 0x06, 0x60, 0x19, 0x80, 0x0C, 0x00, 0x30, 0xFE,
+ 0xC3, 0xFB, 0x01, 0xCC, 0x07, 0x3C, 0x38, 0x7F, 0xE0, 0x7E, 0x00, 0x0F,
+ 0xBF, 0x1F, 0xBE, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x1C, 0x0C, 0x1C, 0x1F,
+ 0xF8, 0x1F, 0xF8, 0x18, 0x18, 0x18, 0x38, 0x18, 0x38, 0x38, 0x30, 0x7C,
+ 0xFC, 0xFC, 0xF8, 0x3F, 0xF3, 0xFF, 0x03, 0x00, 0x70, 0x07, 0x00, 0x60,
+ 0x06, 0x00, 0x60, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xC0, 0xFF, 0xCF, 0xFC,
+ 0x03, 0xFF, 0x03, 0xFF, 0x00, 0x38, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30,
+ 0x00, 0x70, 0x20, 0x70, 0x60, 0x60, 0x60, 0x60, 0x60, 0xE0, 0xE1, 0xC0,
+ 0xFF, 0x80, 0x3F, 0x00, 0x1F, 0x9F, 0x1F, 0x9E, 0x0E, 0x38, 0x0C, 0x70,
+ 0x0C, 0xE0, 0x0F, 0xC0, 0x1F, 0xC0, 0x1F, 0xE0, 0x1C, 0xE0, 0x18, 0x60,
+ 0x18, 0x70, 0x38, 0x70, 0xFE, 0x3C, 0xFC, 0x3C, 0x3F, 0xC1, 0xFE, 0x01,
+ 0x80, 0x1C, 0x00, 0xE0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x1C, 0x18, 0xE0,
+ 0xC6, 0x06, 0x30, 0x7F, 0xFF, 0xFF, 0xF8, 0x1E, 0x07, 0x87, 0x81, 0xE0,
+ 0xF0, 0xF0, 0x7C, 0x7C, 0x1F, 0x1F, 0x06, 0xCF, 0x81, 0xBF, 0x60, 0xEF,
+ 0x98, 0x3B, 0xEE, 0x0C, 0x73, 0x83, 0x1C, 0xC0, 0xC0, 0x30, 0xFC, 0x7E,
+ 0x3F, 0x1F, 0x80, 0x3C, 0x3F, 0x3E, 0x3F, 0x1E, 0x0C, 0x1F, 0x1C, 0x1F,
+ 0x1C, 0x1B, 0x98, 0x3B, 0x98, 0x3B, 0x98, 0x31, 0xF8, 0x31, 0xF8, 0x30,
+ 0xF0, 0x70, 0xF0, 0xFC, 0x70, 0xF8, 0x70, 0x03, 0xE0, 0x3F, 0xE1, 0xC3,
+ 0x8C, 0x07, 0x60, 0x0D, 0x80, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x1B, 0x00,
+ 0x6E, 0x03, 0x1C, 0x38, 0x7F, 0xC0, 0x7C, 0x00, 0x3F, 0xE1, 0xFF, 0x83,
+ 0x0E, 0x38, 0x31, 0xC1, 0x8C, 0x0C, 0x60, 0xC3, 0xFC, 0x3F, 0xC1, 0xC0,
+ 0x0C, 0x00, 0x60, 0x0F, 0xF0, 0x7F, 0x80, 0x03, 0xE0, 0x3F, 0xE1, 0xC3,
+ 0x8C, 0x07, 0x60, 0x0D, 0x80, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x1B, 0x00,
+ 0x6E, 0x03, 0x1C, 0x38, 0x7F, 0xC0, 0xFC, 0x03, 0x02, 0x1F, 0xFC, 0xFF,
+ 0xE0, 0x1F, 0xF0, 0x3F, 0xF0, 0x38, 0x70, 0x60, 0x60, 0xC0, 0xC1, 0x87,
+ 0x07, 0xFC, 0x0F, 0xF0, 0x18, 0xF0, 0x30, 0xE0, 0x60, 0xC1, 0xC1, 0xCF,
+ 0xE1, 0xFF, 0xC3, 0xC0, 0x0F, 0xB1, 0xFF, 0x30, 0xE6, 0x06, 0x60, 0x67,
+ 0x80, 0x7F, 0x01, 0xFC, 0x01, 0xC4, 0x0C, 0xC0, 0xCE, 0x18, 0xFF, 0x8B,
+ 0xE0, 0x7F, 0xFB, 0xFF, 0xD9, 0xCF, 0xCE, 0x7C, 0x63, 0x63, 0x18, 0x18,
+ 0x01, 0xC0, 0x0E, 0x00, 0x60, 0x03, 0x00, 0x18, 0x0F, 0xF8, 0x7F, 0xC0,
+ 0x7E, 0xFF, 0xF3, 0xF3, 0x03, 0x1C, 0x0C, 0x60, 0x31, 0x81, 0xC6, 0x06,
+ 0x38, 0x18, 0xE0, 0x63, 0x03, 0x8C, 0x0C, 0x30, 0x70, 0x7F, 0x80, 0xF8,
+ 0x00, 0xFC, 0x7F, 0xF8, 0xFD, 0xC0, 0x61, 0x81, 0xC3, 0x87, 0x07, 0x0C,
+ 0x0E, 0x38, 0x0C, 0x60, 0x19, 0xC0, 0x3F, 0x00, 0x7C, 0x00, 0xF8, 0x00,
+ 0xE0, 0x01, 0x80, 0x00, 0x7E, 0x7E, 0xFC, 0xFD, 0xC0, 0x73, 0x9C, 0xE7,
+ 0x79, 0x8E, 0xF7, 0x1B, 0xEE, 0x36, 0xD8, 0x7D, 0xF0, 0xF3, 0xE1, 0xE7,
+ 0x83, 0x8F, 0x07, 0x1E, 0x1C, 0x38, 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x0E,
+ 0x1C, 0x07, 0x38, 0x07, 0x70, 0x03, 0xE0, 0x03, 0xC0, 0x03, 0xC0, 0x07,
+ 0xE0, 0x0E, 0xE0, 0x1C, 0x70, 0x38, 0x70, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8,
+ 0xFF, 0xC7, 0xCC, 0x38, 0x73, 0x83, 0x9C, 0x0F, 0xC0, 0x7C, 0x01, 0xC0,
+ 0x0C, 0x00, 0x60, 0x03, 0x00, 0x38, 0x0F, 0xF8, 0x7F, 0x80, 0x0F, 0xF8,
+ 0x7F, 0xE1, 0xC7, 0x86, 0x1C, 0x18, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0,
+ 0x0E, 0x00, 0x70, 0xC3, 0x83, 0x1C, 0x1C, 0x7F, 0xF3, 0xFF, 0x80, 0x0F,
+ 0x87, 0xC3, 0x03, 0x81, 0xC0, 0xC0, 0x60, 0x30, 0x38, 0x1C, 0x0C, 0x06,
+ 0x03, 0x03, 0x81, 0xC0, 0xC0, 0x60, 0x3E, 0x3F, 0x00, 0x41, 0xC3, 0x83,
+ 0x07, 0x0E, 0x1C, 0x18, 0x38, 0x70, 0xE0, 0xC1, 0xC3, 0x83, 0x06, 0x0E,
+ 0x1C, 0x18, 0x20, 0x1F, 0x0F, 0x80, 0xC0, 0xE0, 0x70, 0x30, 0x18, 0x0C,
+ 0x0E, 0x07, 0x03, 0x01, 0x80, 0xC0, 0xE0, 0x70, 0x30, 0x18, 0x7C, 0x3E,
+ 0x00, 0x02, 0x01, 0x80, 0xF0, 0x7E, 0x3B, 0x9C, 0x7E, 0x1F, 0x03, 0xFF,
+ 0xFF, 0xFF, 0xFC, 0xCE, 0x73, 0x1F, 0xC3, 0xFE, 0x00, 0x60, 0x06, 0x0F,
+ 0xE3, 0xFE, 0x70, 0xCC, 0x0C, 0xC3, 0xCF, 0xFF, 0x7F, 0xF0, 0x1E, 0x00,
+ 0x3C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xDF, 0x81, 0xFF, 0x83, 0xC3, 0x8F,
+ 0x03, 0x1C, 0x06, 0x38, 0x0C, 0x70, 0x18, 0xE0, 0x63, 0xE1, 0x9F, 0xFE,
+ 0x3D, 0xF8, 0x00, 0x0F, 0xF3, 0xFF, 0x30, 0x76, 0x07, 0xE0, 0x6C, 0x00,
+ 0xC0, 0x0C, 0x00, 0xE0, 0x67, 0xFE, 0x3F, 0x80, 0x00, 0x3C, 0x00, 0xF0,
+ 0x01, 0xC0, 0x06, 0x07, 0xD8, 0x7F, 0xE3, 0x0F, 0x98, 0x1E, 0x60, 0x73,
+ 0x01, 0xCC, 0x07, 0x30, 0x3C, 0xE1, 0xF1, 0xFF, 0xE3, 0xF7, 0x80, 0x0F,
+ 0xC1, 0xFE, 0x78, 0x76, 0x03, 0xFF, 0xFF, 0xFF, 0xC0, 0x0C, 0x00, 0xE0,
+ 0xE7, 0xFE, 0x1F, 0x80, 0x00, 0xFC, 0x07, 0xF8, 0x0C, 0x00, 0x38, 0x01,
+ 0xFF, 0x07, 0xFE, 0x01, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x30,
+ 0x00, 0x60, 0x01, 0xC0, 0x1F, 0xF8, 0x3F, 0xF0, 0x00, 0x0F, 0xBC, 0x7F,
+ 0xF3, 0x0F, 0x18, 0x1C, 0xC0, 0x73, 0x01, 0x8C, 0x0E, 0x30, 0x38, 0xE3,
+ 0xE1, 0xFF, 0x83, 0xEC, 0x00, 0x30, 0x01, 0xC0, 0x06, 0x07, 0xF0, 0x1F,
+ 0x80, 0x1E, 0x01, 0xF0, 0x03, 0x00, 0x18, 0x00, 0xDE, 0x0F, 0xF8, 0x78,
+ 0xC3, 0x86, 0x18, 0x30, 0xC1, 0x8E, 0x1C, 0x70, 0xE3, 0x06, 0x7E, 0xFF,
+ 0xE7, 0xE0, 0x03, 0x80, 0x70, 0x00, 0x0F, 0xC1, 0xF0, 0x06, 0x00, 0xC0,
+ 0x38, 0x07, 0x00, 0xC0, 0x18, 0x03, 0x0F, 0xFF, 0xFF, 0xC0, 0x00, 0x70,
+ 0x07, 0x00, 0x00, 0xFF, 0x1F, 0xF0, 0x07, 0x00, 0x70, 0x06, 0x00, 0x60,
+ 0x06, 0x00, 0xE0, 0x0E, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x1C, 0x03, 0x87,
+ 0xF0, 0xFE, 0x00, 0x1E, 0x00, 0x78, 0x00, 0xE0, 0x03, 0x80, 0x0C, 0xFC,
+ 0x33, 0xE0, 0xDE, 0x07, 0xE0, 0x1F, 0x00, 0x7C, 0x01, 0xF8, 0x06, 0xF0,
+ 0x39, 0xC3, 0xE7, 0xEF, 0x1F, 0x80, 0x0F, 0x81, 0xF0, 0x06, 0x01, 0xC0,
+ 0x38, 0x06, 0x00, 0xC0, 0x18, 0x07, 0x00, 0xE0, 0x18, 0x03, 0x00, 0x61,
+ 0xFF, 0xFF, 0xF8, 0x3F, 0xBC, 0x7F, 0xFC, 0xF3, 0x98, 0xC6, 0x33, 0x9C,
+ 0xE7, 0x39, 0xCC, 0x63, 0x18, 0xC6, 0x31, 0x8D, 0xF7, 0xBF, 0xEF, 0x78,
+ 0x3D, 0xE1, 0xFF, 0x8F, 0x8C, 0x38, 0x61, 0x83, 0x0C, 0x18, 0xE1, 0xC7,
+ 0x0E, 0x30, 0x67, 0xEF, 0xFE, 0x7E, 0x07, 0xC1, 0xFE, 0x38, 0x76, 0x03,
+ 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x06, 0xE1, 0xC7, 0xF8, 0x3E, 0x00, 0x1E,
+ 0xFC, 0x1F, 0xFE, 0x0F, 0x87, 0x0F, 0x03, 0x0E, 0x03, 0x0E, 0x03, 0x0E,
+ 0x07, 0x0E, 0x06, 0x1F, 0x0C, 0x1F, 0xF8, 0x19, 0xF0, 0x18, 0x00, 0x18,
+ 0x00, 0x38, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x0F, 0xDE, 0x3F, 0xFC, 0xC3,
+ 0xE3, 0x03, 0x84, 0x07, 0x18, 0x0E, 0x30, 0x1C, 0x60, 0x78, 0xE1, 0xE0,
+ 0xFF, 0xC0, 0xF9, 0x80, 0x03, 0x00, 0x0E, 0x00, 0x1C, 0x01, 0xFC, 0x03,
+ 0xF8, 0x1E, 0x78, 0x7F, 0xF0, 0x7C, 0xC3, 0xC0, 0x0E, 0x00, 0x30, 0x00,
+ 0xC0, 0x03, 0x00, 0x1C, 0x03, 0xFF, 0x0F, 0xFC, 0x00, 0x07, 0xF1, 0xFF,
+ 0x30, 0x73, 0x86, 0x3F, 0x81, 0xFE, 0x03, 0xE6, 0x06, 0xE0, 0xEF, 0xFC,
+ 0xFF, 0x00, 0x0C, 0x07, 0x01, 0x83, 0xFF, 0xFF, 0xCE, 0x03, 0x00, 0xC0,
+ 0x30, 0x1C, 0x07, 0x01, 0x83, 0x7F, 0xCF, 0xC0, 0xF0, 0xFF, 0x1F, 0x60,
+ 0x76, 0x07, 0x60, 0x76, 0x06, 0x60, 0x66, 0x0E, 0x61, 0xE7, 0xFF, 0x3E,
+ 0xF0, 0x7E, 0x7E, 0xFC, 0xFC, 0xE0, 0xC0, 0xC3, 0x81, 0x86, 0x03, 0x98,
+ 0x07, 0x70, 0x06, 0xC0, 0x0F, 0x80, 0x1E, 0x00, 0x38, 0x00, 0xF8, 0x7F,
+ 0xE3, 0xE6, 0x63, 0x1B, 0xDC, 0x6F, 0x61, 0xFF, 0x87, 0xFC, 0x1E, 0xF0,
+ 0x73, 0x81, 0xCE, 0x06, 0x38, 0x00, 0x3E, 0x7C, 0xF9, 0xF1, 0xE7, 0x03,
+ 0xF8, 0x07, 0xC0, 0x1F, 0x01, 0xFC, 0x0F, 0x38, 0x78, 0xFB, 0xF7, 0xEF,
+ 0x9F, 0x80, 0x1F, 0x1F, 0x3E, 0x1F, 0x1C, 0x1C, 0x0C, 0x18, 0x0E, 0x38,
+ 0x0E, 0x70, 0x06, 0x60, 0x07, 0xE0, 0x07, 0xC0, 0x07, 0xC0, 0x03, 0x80,
+ 0x07, 0x00, 0x07, 0x00, 0x0E, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x1F, 0xF1,
+ 0xFF, 0x38, 0xE3, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC6, 0x38, 0x67,
+ 0xFE, 0x7F, 0xE0, 0x01, 0xC0, 0xF0, 0x70, 0x18, 0x06, 0x03, 0x80, 0xE0,
+ 0x30, 0x1C, 0x3E, 0x0F, 0x00, 0x60, 0x18, 0x06, 0x03, 0x80, 0xC0, 0x30,
+ 0x0F, 0x01, 0xC0, 0x0C, 0x71, 0xC7, 0x18, 0x63, 0x8E, 0x30, 0xC3, 0x1C,
+ 0x71, 0x86, 0x38, 0xE3, 0x04, 0x00, 0x0E, 0x07, 0x80, 0xC0, 0x60, 0x70,
+ 0x30, 0x18, 0x0C, 0x06, 0x01, 0xC1, 0xE1, 0xC0, 0xC0, 0xE0, 0x70, 0x30,
+ 0x38, 0x78, 0x38, 0x00, 0x3C, 0x27, 0xE6, 0xEF, 0xCC, 0x38 };
+
+const GFXglyph FreeMonoBoldOblique12pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 14, 0, 1 }, // 0x20 ' '
+ { 0, 6, 15, 14, 6, -14 }, // 0x21 '!'
+ { 12, 8, 7, 14, 6, -13 }, // 0x22 '"'
+ { 19, 13, 18, 14, 2, -15 }, // 0x23 '#'
+ { 49, 11, 20, 14, 3, -16 }, // 0x24 '$'
+ { 77, 11, 15, 14, 3, -14 }, // 0x25 '%'
+ { 98, 11, 13, 14, 2, -12 }, // 0x26 '&'
+ { 116, 3, 7, 14, 8, -13 }, // 0x27 '''
+ { 119, 7, 19, 14, 7, -14 }, // 0x28 '('
+ { 136, 7, 19, 14, 2, -14 }, // 0x29 ')'
+ { 153, 11, 10, 14, 4, -14 }, // 0x2A '*'
+ { 167, 12, 13, 14, 3, -12 }, // 0x2B '+'
+ { 187, 6, 7, 14, 3, -2 }, // 0x2C ','
+ { 193, 13, 2, 14, 2, -7 }, // 0x2D '-'
+ { 197, 3, 3, 14, 6, -2 }, // 0x2E '.'
+ { 199, 14, 20, 14, 2, -16 }, // 0x2F '/'
+ { 234, 11, 15, 14, 3, -14 }, // 0x30 '0'
+ { 255, 11, 15, 14, 2, -14 }, // 0x31 '1'
+ { 276, 13, 15, 14, 1, -14 }, // 0x32 '2'
+ { 301, 12, 15, 14, 2, -14 }, // 0x33 '3'
+ { 324, 11, 14, 14, 3, -13 }, // 0x34 '4'
+ { 344, 12, 15, 14, 2, -14 }, // 0x35 '5'
+ { 367, 11, 15, 14, 4, -14 }, // 0x36 '6'
+ { 388, 11, 15, 14, 4, -14 }, // 0x37 '7'
+ { 409, 11, 15, 14, 3, -14 }, // 0x38 '8'
+ { 430, 11, 15, 14, 3, -14 }, // 0x39 '9'
+ { 451, 5, 11, 14, 5, -10 }, // 0x3A ':'
+ { 458, 7, 15, 14, 3, -10 }, // 0x3B ';'
+ { 472, 13, 11, 14, 2, -11 }, // 0x3C '<'
+ { 490, 13, 7, 14, 2, -9 }, // 0x3D '='
+ { 502, 13, 11, 14, 2, -11 }, // 0x3E '>'
+ { 520, 9, 14, 14, 5, -13 }, // 0x3F '?'
+ { 536, 12, 19, 14, 2, -14 }, // 0x40 '@'
+ { 565, 15, 14, 14, 0, -13 }, // 0x41 'A'
+ { 592, 13, 14, 14, 1, -13 }, // 0x42 'B'
+ { 615, 14, 14, 14, 2, -13 }, // 0x43 'C'
+ { 640, 13, 14, 14, 1, -13 }, // 0x44 'D'
+ { 663, 15, 14, 14, 0, -13 }, // 0x45 'E'
+ { 690, 16, 14, 14, 0, -13 }, // 0x46 'F'
+ { 718, 14, 14, 14, 1, -13 }, // 0x47 'G'
+ { 743, 16, 14, 14, 0, -13 }, // 0x48 'H'
+ { 771, 12, 14, 14, 2, -13 }, // 0x49 'I'
+ { 792, 16, 14, 14, 0, -13 }, // 0x4A 'J'
+ { 820, 16, 14, 14, 0, -13 }, // 0x4B 'K'
+ { 848, 13, 14, 14, 1, -13 }, // 0x4C 'L'
+ { 871, 18, 14, 14, 0, -13 }, // 0x4D 'M'
+ { 903, 16, 14, 14, 1, -13 }, // 0x4E 'N'
+ { 931, 14, 14, 14, 1, -13 }, // 0x4F 'O'
+ { 956, 13, 14, 14, 1, -13 }, // 0x50 'P'
+ { 979, 14, 17, 14, 1, -13 }, // 0x51 'Q'
+ { 1009, 15, 14, 14, 0, -13 }, // 0x52 'R'
+ { 1036, 12, 14, 14, 3, -13 }, // 0x53 'S'
+ { 1057, 13, 14, 14, 2, -13 }, // 0x54 'T'
+ { 1080, 14, 14, 14, 2, -13 }, // 0x55 'U'
+ { 1105, 15, 14, 14, 1, -13 }, // 0x56 'V'
+ { 1132, 15, 14, 14, 1, -13 }, // 0x57 'W'
+ { 1159, 16, 14, 14, 0, -13 }, // 0x58 'X'
+ { 1187, 13, 14, 14, 2, -13 }, // 0x59 'Y'
+ { 1210, 14, 14, 14, 1, -13 }, // 0x5A 'Z'
+ { 1235, 9, 19, 14, 5, -14 }, // 0x5B '['
+ { 1257, 7, 20, 14, 5, -16 }, // 0x5C '\'
+ { 1275, 9, 19, 14, 3, -14 }, // 0x5D ']'
+ { 1297, 10, 8, 14, 4, -15 }, // 0x5E '^'
+ { 1307, 15, 2, 14, -1, 4 }, // 0x5F '_'
+ { 1311, 4, 4, 14, 7, -15 }, // 0x60 '`'
+ { 1313, 12, 11, 14, 2, -10 }, // 0x61 'a'
+ { 1330, 15, 15, 14, -1, -14 }, // 0x62 'b'
+ { 1359, 12, 11, 14, 2, -10 }, // 0x63 'c'
+ { 1376, 14, 15, 14, 2, -14 }, // 0x64 'd'
+ { 1403, 12, 11, 14, 2, -10 }, // 0x65 'e'
+ { 1420, 15, 15, 14, 2, -14 }, // 0x66 'f'
+ { 1449, 14, 16, 14, 2, -10 }, // 0x67 'g'
+ { 1477, 13, 15, 14, 1, -14 }, // 0x68 'h'
+ { 1502, 11, 14, 14, 2, -13 }, // 0x69 'i'
+ { 1522, 12, 19, 14, 1, -13 }, // 0x6A 'j'
+ { 1551, 14, 15, 14, 1, -14 }, // 0x6B 'k'
+ { 1578, 11, 15, 14, 2, -14 }, // 0x6C 'l'
+ { 1599, 15, 11, 14, 0, -10 }, // 0x6D 'm'
+ { 1620, 13, 11, 14, 1, -10 }, // 0x6E 'n'
+ { 1638, 12, 11, 14, 2, -10 }, // 0x6F 'o'
+ { 1655, 16, 16, 14, -1, -10 }, // 0x70 'p'
+ { 1687, 15, 16, 14, 1, -10 }, // 0x71 'q'
+ { 1717, 14, 11, 14, 1, -10 }, // 0x72 'r'
+ { 1737, 12, 11, 14, 2, -10 }, // 0x73 's'
+ { 1754, 10, 14, 14, 2, -13 }, // 0x74 't'
+ { 1772, 12, 11, 14, 2, -10 }, // 0x75 'u'
+ { 1789, 15, 11, 14, 1, -10 }, // 0x76 'v'
+ { 1810, 14, 11, 14, 2, -10 }, // 0x77 'w'
+ { 1830, 14, 11, 14, 1, -10 }, // 0x78 'x'
+ { 1850, 16, 16, 14, 0, -10 }, // 0x79 'y'
+ { 1882, 12, 11, 14, 2, -10 }, // 0x7A 'z'
+ { 1899, 10, 19, 14, 4, -14 }, // 0x7B '{'
+ { 1923, 6, 19, 14, 5, -14 }, // 0x7C '|'
+ { 1938, 9, 19, 14, 3, -14 }, // 0x7D '}'
+ { 1960, 12, 4, 14, 3, -7 } }; // 0x7E '~'
+
+const GFXfont FreeMonoBoldOblique12pt7b PROGMEM = {
+ (uint8_t *)FreeMonoBoldOblique12pt7bBitmaps,
+ (GFXglyph *)FreeMonoBoldOblique12pt7bGlyphs,
+ 0x20, 0x7E, 24 };
+
+// Approx. 2638 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBoldOblique18pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBoldOblique18pt7b.h
new file mode 100644
index 000000000000..bc4f20ea5988
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBoldOblique18pt7b.h
@@ -0,0 +1,460 @@
+const uint8_t FreeMonoBoldOblique18pt7bBitmaps[] PROGMEM = {
+ 0x0F, 0x07, 0xC7, 0xE3, 0xF1, 0xF0, 0xF8, 0xFC, 0x7C, 0x3E, 0x1F, 0x0F,
+ 0x07, 0x87, 0xC3, 0xC1, 0xE0, 0x60, 0x00, 0x38, 0x3E, 0x1F, 0x0F, 0x83,
+ 0x80, 0xF8, 0xFF, 0x0E, 0xF1, 0xEF, 0x1E, 0xE1, 0xCE, 0x1C, 0xC1, 0xCC,
+ 0x18, 0xC1, 0x88, 0x18, 0x00, 0xE3, 0x80, 0x79, 0xE0, 0x1C, 0x70, 0x07,
+ 0x1C, 0x03, 0xCF, 0x00, 0xF3, 0xC0, 0x38, 0xE0, 0x7F, 0xFF, 0x3F, 0xFF,
+ 0xCF, 0xFF, 0xF3, 0xFF, 0xF8, 0x3C, 0xF0, 0x0F, 0x3C, 0x03, 0x8E, 0x0F,
+ 0xFF, 0xE3, 0xFF, 0xFC, 0xFF, 0xFF, 0x3F, 0xFF, 0x83, 0xCF, 0x00, 0xF3,
+ 0xC0, 0x38, 0xE0, 0x1E, 0x78, 0x07, 0x9E, 0x01, 0xC7, 0x00, 0x71, 0xC0,
+ 0x00, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x07, 0x80, 0x03, 0xF0, 0x03, 0xFF,
+ 0x81, 0xFF, 0xF0, 0xFF, 0xF8, 0x3C, 0x1E, 0x1E, 0x07, 0x87, 0x80, 0x01,
+ 0xF0, 0x00, 0x7F, 0xC0, 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x07, 0xF0, 0x00,
+ 0x3C, 0x70, 0x0F, 0x3C, 0x03, 0xCF, 0x83, 0xE3, 0xFF, 0xF8, 0xFF, 0xFC,
+ 0x3F, 0xFE, 0x0C, 0xFE, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x03, 0xC0, 0x00,
+ 0xF0, 0x00, 0x18, 0x00, 0x03, 0xC0, 0x0F, 0xE0, 0x1C, 0x70, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x70, 0x38, 0xE0, 0x1F, 0xC3, 0x0F, 0x1F, 0x01, 0xFC,
+ 0x0F, 0xE0, 0x7F, 0x00, 0xF8, 0xF0, 0x83, 0xF8, 0x07, 0x1C, 0x0E, 0x0C,
+ 0x0C, 0x0C, 0x0C, 0x1C, 0x0E, 0x38, 0x07, 0xF0, 0x03, 0xC0, 0x00, 0x7A,
+ 0x01, 0xFF, 0x03, 0xFF, 0x07, 0xFE, 0x0F, 0x9C, 0x0F, 0x00, 0x0F, 0x00,
+ 0x0F, 0x00, 0x07, 0x80, 0x1F, 0x80, 0x3F, 0xC0, 0x7F, 0xCF, 0x79, 0xFF,
+ 0xF1, 0xFE, 0xF1, 0xFC, 0xF0, 0xF8, 0xFF, 0xFE, 0xFF, 0xFE, 0x7F, 0xFE,
+ 0x1F, 0xBC, 0x7B, 0xFD, 0xEF, 0x73, 0x9C, 0xC6, 0x00, 0x01, 0xC0, 0xF0,
+ 0x3C, 0x1E, 0x0F, 0x03, 0xC1, 0xE0, 0x70, 0x3C, 0x0F, 0x07, 0x81, 0xE0,
+ 0x78, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3E,
+ 0x07, 0x81, 0xE0, 0x7C, 0x1F, 0x03, 0x80, 0x07, 0x03, 0xC0, 0xF8, 0x3E,
+ 0x07, 0x81, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0,
+ 0xF0, 0x78, 0x1E, 0x07, 0x81, 0xC0, 0xF0, 0x3C, 0x1E, 0x07, 0x83, 0xC1,
+ 0xE0, 0x78, 0x3C, 0x0E, 0x00, 0x00, 0xC0, 0x03, 0xC0, 0x07, 0x00, 0x0E,
+ 0x02, 0x3C, 0x0F, 0xFF, 0xFF, 0xFF, 0xBF, 0xFE, 0x1F, 0xF0, 0x1F, 0x80,
+ 0x7F, 0x81, 0xEF, 0x07, 0x8F, 0x0F, 0x1E, 0x08, 0x10, 0x00, 0x00, 0x70,
+ 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xE0, 0x00, 0x38, 0x00,
+ 0x1E, 0x03, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x0F,
+ 0x00, 0x03, 0xC0, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x07, 0x80,
+ 0x01, 0xC0, 0x00, 0x70, 0x00, 0x0F, 0x87, 0x87, 0x83, 0x83, 0xC1, 0xC1,
+ 0xC0, 0xC0, 0xE0, 0x60, 0x00, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFE, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x38, 0x00, 0x03, 0xC0,
+ 0x00, 0x1C, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x0F,
+ 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00,
+ 0x78, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00,
+ 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0xF0,
+ 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x03,
+ 0xC0, 0x00, 0x3C, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xFC, 0x01, 0xFF,
+ 0x01, 0xFF, 0xC1, 0xFF, 0xE1, 0xF1, 0xF9, 0xE0, 0x7C, 0xF0, 0x1E, 0xF0,
+ 0x0F, 0x78, 0x07, 0xB8, 0x03, 0x9C, 0x03, 0xDE, 0x01, 0xCF, 0x00, 0xE7,
+ 0x00, 0x73, 0xC0, 0x79, 0xE0, 0x3C, 0xF0, 0x1C, 0x78, 0x1E, 0x3E, 0x1E,
+ 0x0F, 0xFF, 0x07, 0xFF, 0x01, 0xFF, 0x00, 0x7E, 0x00, 0x00, 0x7C, 0x03,
+ 0xF8, 0x0F, 0xE0, 0x7F, 0xC0, 0xF7, 0x81, 0x8F, 0x00, 0x1C, 0x00, 0x38,
+ 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x0E, 0x00, 0x3C, 0x00,
+ 0x78, 0x00, 0xF0, 0x01, 0xC0, 0x03, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xEF, 0xFF, 0xC0, 0x00, 0x1F, 0x00, 0x07, 0xFC, 0x00, 0xFF, 0xE0, 0x1F,
+ 0xFF, 0x03, 0xC1, 0xF0, 0x78, 0x0F, 0x07, 0x80, 0xF0, 0x70, 0x0F, 0x00,
+ 0x01, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x3F, 0x00,
+ 0x07, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00,
+ 0x3F, 0x03, 0x87, 0xFF, 0xF8, 0x7F, 0xFF, 0x87, 0xFF, 0xF8, 0xFF, 0xFF,
+ 0x00, 0x00, 0xFE, 0x00, 0xFF, 0xC0, 0x7F, 0xF8, 0x3F, 0xFF, 0x0E, 0x07,
+ 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x1F, 0xC0,
+ 0x0F, 0xE0, 0x03, 0xF0, 0x00, 0xFF, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00,
+ 0x1E, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x03, 0xF1, 0xFF, 0xF8, 0xFF, 0xFC,
+ 0x3F, 0xFE, 0x03, 0xFE, 0x00, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x7F, 0x00,
+ 0xFE, 0x00, 0xFE, 0x01, 0xEE, 0x03, 0xDE, 0x07, 0x9E, 0x0F, 0x1C, 0x1E,
+ 0x1C, 0x3C, 0x3C, 0x78, 0x3C, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF,
+ 0xFC, 0x00, 0x70, 0x03, 0xFC, 0x07, 0xFC, 0x07, 0xFC, 0x07, 0xF8, 0x07,
+ 0xFF, 0xC1, 0xFF, 0xF0, 0x7F, 0xFC, 0x3F, 0xFE, 0x0F, 0x00, 0x03, 0xC0,
+ 0x00, 0xE0, 0x00, 0x3B, 0xE0, 0x1F, 0xFE, 0x07, 0xFF, 0xC1, 0xFF, 0xF8,
+ 0x78, 0x3E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00,
+ 0x0F, 0x18, 0x0F, 0xCF, 0xFF, 0xE3, 0xFF, 0xF0, 0x7F, 0xF8, 0x07, 0xF0,
+ 0x00, 0x00, 0x0F, 0xC0, 0x0F, 0xFC, 0x03, 0xFF, 0x81, 0xFF, 0xE0, 0x7F,
+ 0x00, 0x1F, 0x80, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x9F,
+ 0x01, 0xEF, 0xF0, 0x3F, 0xFF, 0x0F, 0xFF, 0xF1, 0xFC, 0x3E, 0x3E, 0x03,
+ 0xC7, 0x80, 0x78, 0xF0, 0x0F, 0x1E, 0x03, 0xC3, 0xE0, 0xF8, 0x7F, 0xFE,
+ 0x07, 0xFF, 0x80, 0x7F, 0xE0, 0x07, 0xF0, 0x00, 0x7F, 0xFF, 0x7F, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x0E, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x3C,
+ 0x00, 0x78, 0x00, 0x70, 0x00, 0xF0, 0x00, 0xE0, 0x01, 0xE0, 0x01, 0xC0,
+ 0x03, 0xC0, 0x07, 0x80, 0x07, 0x80, 0x0F, 0x00, 0x0E, 0x00, 0x1E, 0x00,
+ 0x1C, 0x00, 0x1C, 0x00, 0x00, 0x7E, 0x00, 0x3F, 0xF0, 0x0F, 0xFF, 0x03,
+ 0xFF, 0xF0, 0xF8, 0x3E, 0x3E, 0x03, 0xC7, 0x80, 0x78, 0xF0, 0x0F, 0x1E,
+ 0x03, 0xC3, 0xE0, 0xF0, 0x3F, 0xFC, 0x03, 0xFF, 0x00, 0xFF, 0xE0, 0x7F,
+ 0xFE, 0x1F, 0x83, 0xE3, 0xC0, 0x3C, 0xF0, 0x07, 0x9E, 0x01, 0xF3, 0xE0,
+ 0x7C, 0x7F, 0xFF, 0x87, 0xFF, 0xE0, 0x7F, 0xF0, 0x03, 0xF8, 0x00, 0x00,
+ 0x7E, 0x00, 0x7F, 0xC0, 0x3F, 0xF8, 0x1F, 0xFE, 0x0F, 0x87, 0xC3, 0xC0,
+ 0xF1, 0xE0, 0x3C, 0x78, 0x0F, 0x1E, 0x03, 0xC7, 0x81, 0xF1, 0xF1, 0xFC,
+ 0x7F, 0xFE, 0x0F, 0xFF, 0x81, 0xFD, 0xE0, 0x3E, 0xF0, 0x00, 0x7C, 0x00,
+ 0x3E, 0x00, 0x1F, 0x00, 0x1F, 0x81, 0xFF, 0xC0, 0xFF, 0xE0, 0x3F, 0xE0,
+ 0x07, 0xE0, 0x00, 0x1C, 0x7C, 0xF9, 0xF1, 0xC0, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x8F, 0x9F, 0x3E, 0x38, 0x01, 0xC0, 0x7C, 0x0F, 0x81, 0xF0, 0x3C,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0xF0, 0x1E,
+ 0x07, 0x80, 0xE0, 0x38, 0x07, 0x01, 0xC0, 0x30, 0x0E, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0xFE, 0x00,
+ 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE,
+ 0x00, 0x1F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xF0, 0x00, 0x38,
+ 0x3F, 0xFF, 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0x9F, 0xFF, 0xE0, 0x00, 0x00,
+ 0x00, 0x00, 0x1F, 0xFF, 0xF7, 0xFF, 0xFE, 0xFF, 0xFF, 0xDF, 0xFF, 0xF0,
+ 0x00, 0x00, 0x03, 0x80, 0x00, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00,
+ 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x1F, 0xC0, 0x0F, 0xE0,
+ 0x07, 0xF0, 0x07, 0xF8, 0x03, 0xF8, 0x01, 0xFC, 0x00, 0x3E, 0x00, 0x07,
+ 0x00, 0x00, 0x07, 0xE0, 0xFF, 0xC7, 0xFF, 0xBF, 0xFF, 0xF0, 0x7F, 0x80,
+ 0xFE, 0x03, 0xC0, 0x0F, 0x00, 0x78, 0x0F, 0xE1, 0xFE, 0x0F, 0xF0, 0x7E,
+ 0x01, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x70, 0x03, 0xE0, 0x0F, 0x80, 0x3E,
+ 0x00, 0x70, 0x00, 0x00, 0x3E, 0x00, 0x3F, 0xE0, 0x1F, 0xF8, 0x0F, 0x0F,
+ 0x07, 0x01, 0xC3, 0x80, 0x71, 0xE0, 0x1C, 0x70, 0x0E, 0x18, 0x0F, 0x8E,
+ 0x1F, 0xE3, 0x8F, 0xF0, 0xE7, 0x9C, 0x33, 0xC7, 0x1C, 0xE1, 0xC7, 0x38,
+ 0x71, 0xCF, 0x18, 0x73, 0xFE, 0x38, 0x7F, 0xCE, 0x0F, 0xF3, 0x80, 0x00,
+ 0xE0, 0x00, 0x38, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0xC0, 0x7F, 0xF0, 0x0F,
+ 0xF8, 0x01, 0xF8, 0x00, 0x01, 0xFF, 0x80, 0x07, 0xFE, 0x00, 0x1F, 0xF8,
+ 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x07, 0xBC, 0x00,
+ 0x1C, 0xF0, 0x00, 0xF3, 0xC0, 0x07, 0x87, 0x80, 0x1E, 0x1E, 0x00, 0xF0,
+ 0x78, 0x07, 0xFF, 0xE0, 0x1F, 0xFF, 0x80, 0xFF, 0xFF, 0x07, 0xFF, 0xFC,
+ 0x1E, 0x00, 0xF1, 0xFE, 0x1F, 0xFF, 0xF8, 0x7F, 0xFF, 0xE1, 0xFF, 0xFF,
+ 0x07, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFF, 0x87, 0xFF, 0xFC, 0x1F, 0xFF,
+ 0xF0, 0x38, 0x0F, 0x81, 0xC0, 0x3C, 0x1E, 0x01, 0xE0, 0xF0, 0x3E, 0x07,
+ 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xF8, 0x1F, 0xFF, 0xE0, 0xE0, 0x1F,
+ 0x87, 0x00, 0x3C, 0x38, 0x01, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0xF3, 0xFF,
+ 0xFF, 0xBF, 0xFF, 0xF9, 0xFF, 0xFF, 0x8F, 0xFF, 0xF0, 0x00, 0x00, 0x7F,
+ 0x30, 0x0F, 0xFF, 0xC1, 0xFF, 0xFE, 0x1F, 0xFF, 0xF1, 0xF8, 0x3F, 0x1F,
+ 0x00, 0x78, 0xF0, 0x03, 0xCF, 0x80, 0x1C, 0x78, 0x00, 0x03, 0xC0, 0x00,
+ 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0,
+ 0x00, 0x1F, 0x00, 0x38, 0x7E, 0x07, 0xC3, 0xFF, 0xFC, 0x0F, 0xFF, 0xC0,
+ 0x3F, 0xFC, 0x00, 0x7F, 0x80, 0x00, 0x0F, 0xFF, 0x80, 0x7F, 0xFE, 0x07,
+ 0xFF, 0xF8, 0x1F, 0xFF, 0xE0, 0x78, 0x1F, 0x03, 0x80, 0x7C, 0x1C, 0x01,
+ 0xE1, 0xE0, 0x0F, 0x0F, 0x00, 0x78, 0x70, 0x03, 0xC3, 0x80, 0x1E, 0x1C,
+ 0x00, 0xF1, 0xE0, 0x0F, 0x0F, 0x00, 0x78, 0x70, 0x07, 0xC3, 0x80, 0x7C,
+ 0x3C, 0x07, 0xC3, 0xFF, 0xFC, 0x3F, 0xFF, 0xC1, 0xFF, 0xFC, 0x0F, 0xFF,
+ 0x80, 0x00, 0x07, 0xFF, 0xFC, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC3, 0xFF,
+ 0xFF, 0x03, 0xC0, 0x3C, 0x0F, 0x00, 0xE0, 0x3C, 0x73, 0x80, 0xE3, 0xCC,
+ 0x03, 0xFF, 0x00, 0x1F, 0xFC, 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0x80, 0x07,
+ 0x1E, 0x00, 0x3C, 0x70, 0x00, 0xF0, 0x07, 0x03, 0xC0, 0x1C, 0x0E, 0x00,
+ 0xF1, 0xFF, 0xFF, 0xC7, 0xFF, 0xFE, 0x3F, 0xFF, 0xF8, 0x7F, 0xFF, 0xE0,
+ 0x07, 0xFF, 0xFE, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xF0, 0x7F, 0xFF, 0xE0,
+ 0x3C, 0x01, 0xC0, 0x70, 0x07, 0x80, 0xE1, 0x8E, 0x03, 0xC7, 0x1C, 0x07,
+ 0xFE, 0x00, 0x0F, 0xFC, 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0xF1,
+ 0xC0, 0x01, 0xE3, 0x80, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, 0x1E, 0x00,
+ 0x00, 0xFF, 0xE0, 0x03, 0xFF, 0xC0, 0x07, 0xFF, 0x80, 0x0F, 0xFE, 0x00,
+ 0x00, 0x00, 0x3F, 0x18, 0x0F, 0xFF, 0xC0, 0xFF, 0xFE, 0x0F, 0xFF, 0xF0,
+ 0xFC, 0x0F, 0x0F, 0x80, 0x38, 0xF8, 0x01, 0x87, 0x80, 0x00, 0x78, 0x00,
+ 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x7F, 0xEF, 0x07, 0xFF, 0x78,
+ 0x3F, 0xFB, 0xC0, 0xFF, 0x9E, 0x00, 0x38, 0xFC, 0x03, 0xC3, 0xFF, 0xFE,
+ 0x1F, 0xFF, 0xE0, 0x3F, 0xFC, 0x00, 0x7F, 0x80, 0x00, 0x03, 0xF8, 0xFE,
+ 0x0F, 0xF3, 0xFC, 0x1F, 0xE7, 0xF8, 0x3F, 0x8F, 0xE0, 0x3C, 0x07, 0x80,
+ 0x70, 0x0E, 0x00, 0xE0, 0x1C, 0x03, 0xC0, 0x78, 0x07, 0x80, 0xF0, 0x0F,
+ 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0xFF, 0xFE, 0x01, 0xE0,
+ 0x3C, 0x03, 0x80, 0x70, 0x07, 0x00, 0xE0, 0x1E, 0x03, 0xC0, 0xFF, 0x1F,
+ 0xE1, 0xFE, 0x7F, 0xC7, 0xFC, 0xFF, 0x87, 0xF1, 0xFE, 0x00, 0x07, 0xFF,
+ 0xE1, 0xFF, 0xFC, 0x3F, 0xFF, 0x87, 0xFF, 0xE0, 0x07, 0x80, 0x00, 0xE0,
+ 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0x80,
+ 0x00, 0x70, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0E, 0x00,
+ 0x01, 0xC0, 0x0F, 0xFF, 0xC3, 0xFF, 0xF8, 0x7F, 0xFF, 0x07, 0xFF, 0xE0,
+ 0x00, 0x3F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xE0,
+ 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x01, 0xE0, 0x00,
+ 0x03, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x80, 0x1C, 0x03, 0x80,
+ 0x78, 0x0F, 0x00, 0xF0, 0x1E, 0x01, 0xC0, 0x38, 0x07, 0x80, 0x70, 0x1F,
+ 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xF0, 0x03, 0xFF, 0xC0, 0x00, 0xFC, 0x00,
+ 0x00, 0x07, 0xF8, 0xFC, 0x1F, 0xFB, 0xFC, 0x3F, 0xE7, 0xF0, 0x7F, 0xCF,
+ 0xE0, 0x3C, 0x1E, 0x00, 0x70, 0xF8, 0x00, 0xE3, 0xE0, 0x03, 0xCF, 0x00,
+ 0x07, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xF0, 0x00,
+ 0xF9, 0xF0, 0x01, 0xE1, 0xE0, 0x03, 0x83, 0xE0, 0x07, 0x03, 0xC0, 0x1E,
+ 0x07, 0x80, 0xFF, 0x8F, 0xE3, 0xFF, 0x0F, 0xC7, 0xFE, 0x1F, 0x8F, 0xF8,
+ 0x3E, 0x00, 0x0F, 0xFE, 0x00, 0xFF, 0xF0, 0x1F, 0xFE, 0x00, 0xFF, 0xE0,
+ 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x03, 0xC0,
+ 0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x07, 0x80, 0x60, 0x78,
+ 0x0F, 0x07, 0x80, 0xF0, 0x70, 0x0E, 0x07, 0x00, 0xE7, 0xFF, 0xFE, 0xFF,
+ 0xFF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xC0, 0x0F, 0xC0, 0x1F, 0x87, 0xE0,
+ 0x0F, 0xC7, 0xF8, 0x0F, 0xE1, 0xFC, 0x0F, 0xE0, 0x7E, 0x07, 0xE0, 0x3F,
+ 0x07, 0xF0, 0x3F, 0xC7, 0xF8, 0x1F, 0xE3, 0xF8, 0x0E, 0xF3, 0xDC, 0x07,
+ 0x7B, 0xDE, 0x03, 0x9F, 0xEF, 0x03, 0xCF, 0xE7, 0x81, 0xE7, 0xE3, 0x80,
+ 0xE3, 0xF1, 0xC0, 0x70, 0xF1, 0xE0, 0x38, 0x70, 0xF0, 0x3C, 0x00, 0x70,
+ 0x3F, 0xC1, 0xFE, 0x3F, 0xE1, 0xFF, 0x1F, 0xF0, 0xFF, 0x8F, 0xF0, 0x7F,
+ 0x80, 0x0F, 0xC1, 0xFE, 0x1F, 0xC1, 0xFF, 0x1F, 0xC3, 0xFE, 0x1F, 0xE1,
+ 0xFE, 0x07, 0xE0, 0x38, 0x07, 0xF0, 0x78, 0x07, 0xF0, 0x78, 0x0F, 0xF8,
+ 0x70, 0x0F, 0x78, 0x70, 0x0E, 0x78, 0xF0, 0x0E, 0x7C, 0xF0, 0x1E, 0x3C,
+ 0xF0, 0x1E, 0x3E, 0xE0, 0x1E, 0x1E, 0xE0, 0x1C, 0x1F, 0xE0, 0x1C, 0x0F,
+ 0xE0, 0x3C, 0x0F, 0xE0, 0x7F, 0x87, 0xC0, 0xFF, 0x87, 0xC0, 0xFF, 0x87,
+ 0xC0, 0xFF, 0x03, 0xC0, 0x00, 0x7E, 0x00, 0x1F, 0xF8, 0x07, 0xFF, 0xC0,
+ 0xFF, 0xFE, 0x1F, 0x87, 0xE3, 0xE0, 0x1F, 0x3C, 0x01, 0xF7, 0xC0, 0x0F,
+ 0x78, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x01,
+ 0xEF, 0x00, 0x3E, 0xF8, 0x03, 0xCF, 0x80, 0x7C, 0x7C, 0x1F, 0x87, 0xFF,
+ 0xF0, 0x3F, 0xFE, 0x01, 0xFF, 0x80, 0x07, 0xE0, 0x00, 0x0F, 0xFF, 0x80,
+ 0x7F, 0xFF, 0x07, 0xFF, 0xFC, 0x1F, 0xFF, 0xF0, 0x38, 0x0F, 0x81, 0xC0,
+ 0x3C, 0x1E, 0x01, 0xE0, 0xF0, 0x0F, 0x07, 0x00, 0xF0, 0x38, 0x0F, 0x83,
+ 0xFF, 0xF8, 0x1F, 0xFF, 0x80, 0xFF, 0xF8, 0x07, 0xFF, 0x00, 0x38, 0x00,
+ 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x03, 0xFF, 0x80, 0x3F, 0xFC, 0x01, 0xFF,
+ 0xE0, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x1F, 0xF8, 0x07, 0xFF,
+ 0xC0, 0xFF, 0xFE, 0x1F, 0x87, 0xE3, 0xE0, 0x1F, 0x3C, 0x01, 0xF7, 0xC0,
+ 0x0F, 0x78, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0,
+ 0x01, 0xEF, 0x00, 0x3E, 0xF8, 0x03, 0xCF, 0x80, 0x7C, 0x7C, 0x1F, 0x87,
+ 0xFF, 0xF0, 0x3F, 0xFE, 0x01, 0xFF, 0x80, 0x07, 0xE0, 0x01, 0xFE, 0x30,
+ 0x3F, 0xFF, 0x87, 0xFF, 0xF0, 0x7F, 0xFF, 0x07, 0x83, 0xC0, 0x07, 0xFF,
+ 0x80, 0x3F, 0xFF, 0x80, 0xFF, 0xFF, 0x03, 0xFF, 0xFE, 0x03, 0xC0, 0xF8,
+ 0x0E, 0x01, 0xE0, 0x38, 0x07, 0x81, 0xE0, 0x3E, 0x07, 0x83, 0xF0, 0x1F,
+ 0xFF, 0x80, 0x7F, 0xFC, 0x01, 0xFF, 0xC0, 0x0F, 0xFF, 0x80, 0x3C, 0x3E,
+ 0x00, 0xE0, 0x7C, 0x03, 0x80, 0xF0, 0x1E, 0x03, 0xE1, 0xFF, 0x07, 0xFF,
+ 0xFC, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0x80, 0xF8, 0x00, 0x7C, 0xE0, 0x7F,
+ 0xFC, 0x1F, 0xFF, 0x87, 0xFF, 0xE0, 0xF8, 0x7C, 0x3C, 0x07, 0x87, 0x80,
+ 0xE0, 0xF0, 0x00, 0x1F, 0x00, 0x03, 0xFE, 0x00, 0x3F, 0xF8, 0x03, 0xFF,
+ 0x80, 0x07, 0xF8, 0x40, 0x1F, 0x3C, 0x01, 0xE7, 0x80, 0x3C, 0xFC, 0x1F,
+ 0x1F, 0xFF, 0xE3, 0xFF, 0xF8, 0x7F, 0xFE, 0x00, 0x7E, 0x00, 0x7F, 0xFF,
+ 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0x0E, 0x1F, 0xE1, 0xC3,
+ 0xBC, 0x78, 0x77, 0x0F, 0x1E, 0xE1, 0xC1, 0x80, 0x38, 0x00, 0x0F, 0x00,
+ 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x3C, 0x00,
+ 0x07, 0x80, 0x0F, 0xFE, 0x03, 0xFF, 0xE0, 0x7F, 0xFC, 0x0F, 0xFF, 0x00,
+ 0x7F, 0x8F, 0xF3, 0xFE, 0x7F, 0xDF, 0xF7, 0xFC, 0xFF, 0x1F, 0xE3, 0xC0,
+ 0x3C, 0x1C, 0x01, 0xE0, 0xE0, 0x0F, 0x0F, 0x00, 0x70, 0x78, 0x03, 0x83,
+ 0xC0, 0x3C, 0x1C, 0x01, 0xE0, 0xE0, 0x0E, 0x0F, 0x00, 0x70, 0x78, 0x03,
+ 0x83, 0xC0, 0x3C, 0x1F, 0x01, 0xC0, 0xFC, 0x3E, 0x03, 0xFF, 0xE0, 0x1F,
+ 0xFE, 0x00, 0x7F, 0xE0, 0x00, 0xFC, 0x00, 0x00, 0x7F, 0x81, 0xFE, 0xFF,
+ 0x87, 0xFF, 0xFF, 0x0F, 0xFB, 0xFC, 0x1F, 0xE1, 0xC0, 0x0F, 0x03, 0xC0,
+ 0x1C, 0x07, 0x80, 0x78, 0x0F, 0x01, 0xE0, 0x1E, 0x03, 0x80, 0x1E, 0x0F,
+ 0x00, 0x3C, 0x3C, 0x00, 0x78, 0x70, 0x00, 0xF1, 0xE0, 0x01, 0xE7, 0x80,
+ 0x01, 0xEF, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00,
+ 0x0F, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x7F, 0x87, 0xFF,
+ 0xFF, 0x1F, 0xFF, 0xF8, 0x7F, 0xFF, 0xE1, 0xFE, 0x78, 0x00, 0xF1, 0xE3,
+ 0xC3, 0x87, 0x8F, 0x0E, 0x1E, 0x7C, 0x78, 0x79, 0xF9, 0xC1, 0xEF, 0xEF,
+ 0x07, 0xBF, 0xBC, 0x1D, 0xFE, 0xE0, 0x77, 0x7F, 0x81, 0xFD, 0xFE, 0x07,
+ 0xE3, 0xF0, 0x3F, 0x8F, 0xC0, 0xFC, 0x3F, 0x03, 0xF0, 0xF8, 0x0F, 0x83,
+ 0xE0, 0x3E, 0x0F, 0x80, 0xF0, 0x3C, 0x00, 0x07, 0xE0, 0x7E, 0x0F, 0xF0,
+ 0xFF, 0x0F, 0xF0, 0xFE, 0x0F, 0xE0, 0xFE, 0x03, 0xC0, 0xF8, 0x01, 0xE1,
+ 0xE0, 0x01, 0xF3, 0xC0, 0x00, 0xF7, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x7E,
+ 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFF, 0x00, 0x03, 0xEF,
+ 0x00, 0x07, 0xCF, 0x80, 0x0F, 0x87, 0xC0, 0x1F, 0x03, 0xC0, 0x7F, 0x07,
+ 0xF0, 0xFF, 0x8F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xE0, 0x7E, 0x0F,
+ 0xEF, 0xF0, 0xFF, 0xFF, 0x0F, 0xEF, 0xE0, 0xFE, 0x3C, 0x0F, 0x01, 0xE1,
+ 0xE0, 0x1E, 0x3E, 0x00, 0xF7, 0xC0, 0x0F, 0xF8, 0x00, 0x7F, 0x00, 0x07,
+ 0xE0, 0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00,
+ 0x78, 0x00, 0x07, 0x00, 0x07, 0xFF, 0x00, 0xFF, 0xF8, 0x0F, 0xFF, 0x00,
+ 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xE0, 0xFF, 0xFC, 0x3F, 0xFF, 0x87, 0xFF,
+ 0xF0, 0xF0, 0x7C, 0x1C, 0x1F, 0x03, 0x87, 0xC0, 0x61, 0xF0, 0x00, 0x7C,
+ 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x07,
+ 0x07, 0xC0, 0xE1, 0xF0, 0x3C, 0x7C, 0x07, 0x9F, 0xFF, 0xF3, 0xFF, 0xFC,
+ 0x7F, 0xFF, 0x8F, 0xFF, 0xF0, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xE0,
+ 0x70, 0x07, 0x80, 0x3C, 0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x07, 0x80, 0x3C,
+ 0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x07, 0x80, 0x38, 0x01, 0xC0, 0x0E, 0x00,
+ 0xF0, 0x07, 0x80, 0x38, 0x01, 0xC0, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F,
+ 0x80, 0xE0, 0x38, 0x0F, 0x03, 0xC0, 0xF0, 0x1C, 0x07, 0x81, 0xE0, 0x78,
+ 0x0E, 0x03, 0xC0, 0xF0, 0x3C, 0x07, 0x01, 0xE0, 0x78, 0x1E, 0x03, 0x80,
+ 0xF0, 0x3C, 0x0F, 0x01, 0xE0, 0x78, 0x1E, 0x03, 0x80, 0xF0, 0x3C, 0x06,
+ 0x07, 0xF8, 0x3F, 0xC1, 0xFC, 0x0F, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0,
+ 0x1C, 0x00, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0x80, 0x1C, 0x01, 0xE0, 0x0F,
+ 0x00, 0x78, 0x03, 0x80, 0x1C, 0x01, 0xE0, 0x0F, 0x00, 0x70, 0x03, 0x80,
+ 0x1C, 0x0F, 0xE0, 0xFF, 0x07, 0xF0, 0x3F, 0x80, 0x00, 0x40, 0x01, 0x80,
+ 0x07, 0x80, 0x3F, 0x80, 0xFF, 0x03, 0xFF, 0x0F, 0x9F, 0x3E, 0x1E, 0xF8,
+ 0x3F, 0xE0, 0x3F, 0x00, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xF0, 0xC3, 0xC7, 0x0E, 0x3C, 0x30, 0x00, 0xFE, 0x00,
+ 0x7F, 0xF0, 0x1F, 0xFF, 0x03, 0xFF, 0xE0, 0x00, 0x3C, 0x07, 0xFF, 0x83,
+ 0xFF, 0xF0, 0xFF, 0xFC, 0x3F, 0xFF, 0x8F, 0x80, 0xF3, 0xE0, 0x1E, 0x78,
+ 0x1F, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xF8, 0xFE, 0x7E, 0x07,
+ 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x01, 0xC0,
+ 0x00, 0x0F, 0x00, 0x00, 0x3C, 0xFC, 0x00, 0xEF, 0xFC, 0x03, 0xFF, 0xF8,
+ 0x1F, 0xFF, 0xE0, 0x7E, 0x0F, 0xC1, 0xE0, 0x1F, 0x07, 0x00, 0x3C, 0x1C,
+ 0x00, 0xF0, 0xE0, 0x03, 0xC3, 0x80, 0x1E, 0x0F, 0x00, 0xF8, 0x3E, 0x07,
+ 0xC7, 0xFF, 0xFF, 0x3F, 0xFF, 0xF8, 0xFF, 0xFF, 0x81, 0xF1, 0xF8, 0x00,
+ 0x00, 0xFE, 0x60, 0xFF, 0xFC, 0x3F, 0xFF, 0x8F, 0xFF, 0xF3, 0xF0, 0x3C,
+ 0xF8, 0x03, 0x9E, 0x00, 0x67, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03,
+ 0xC0, 0x00, 0x7E, 0x01, 0xC7, 0xFF, 0xF8, 0xFF, 0xFE, 0x0F, 0xFF, 0x80,
+ 0x7F, 0x80, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07,
+ 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x70, 0x07, 0xE3, 0x80, 0xFF, 0xDC, 0x0F,
+ 0xFF, 0xE0, 0xFF, 0xFF, 0x0F, 0xC1, 0xF0, 0xF8, 0x07, 0x87, 0x80, 0x1C,
+ 0x78, 0x00, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x70, 0xF0, 0x07, 0x87, 0xE0,
+ 0xFC, 0x1F, 0xFF, 0xF8, 0xFF, 0xFF, 0xC3, 0xFF, 0xFE, 0x07, 0xE3, 0xE0,
+ 0x00, 0xFC, 0x01, 0xFF, 0xC0, 0xFF, 0xF8, 0x7F, 0xFE, 0x3E, 0x0F, 0xCE,
+ 0x00, 0xF7, 0x00, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xE0, 0x1E, 0xFF, 0xFF, 0x9F, 0xFF, 0xE3, 0xFF, 0xF0, 0x3F, 0xF0,
+ 0x00, 0x0F, 0xF0, 0x01, 0xFF, 0xC0, 0x1F, 0xFE, 0x01, 0xFF, 0xE0, 0x0F,
+ 0x00, 0x00, 0xF0, 0x00, 0x3F, 0xFF, 0x03, 0xFF, 0xF8, 0x1F, 0xFF, 0xC0,
+ 0xFF, 0xFC, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x38, 0x00, 0x01, 0xC0,
+ 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x1F,
+ 0xFF, 0x81, 0xFF, 0xFC, 0x0F, 0xFF, 0xE0, 0x7F, 0xFE, 0x00, 0x01, 0xF9,
+ 0xF8, 0x3F, 0xFF, 0xC3, 0xFF, 0xFE, 0x7F, 0xFF, 0xE3, 0xE0, 0xFC, 0x3E,
+ 0x03, 0xE1, 0xE0, 0x0E, 0x1E, 0x00, 0x70, 0xF0, 0x03, 0x87, 0x80, 0x3C,
+ 0x3E, 0x03, 0xE1, 0xF8, 0x7E, 0x07, 0xFF, 0xF0, 0x3F, 0xFF, 0x80, 0xFF,
+ 0xFC, 0x01, 0xF9, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x80,
+ 0x7F, 0xF8, 0x07, 0xFF, 0x80, 0x3F, 0xF8, 0x00, 0xFF, 0x00, 0x00, 0x0F,
+ 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x03, 0xC0, 0x00,
+ 0x38, 0x00, 0x03, 0x9F, 0x00, 0x7F, 0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xFE,
+ 0x07, 0xC3, 0xE0, 0x70, 0x1E, 0x0F, 0x01, 0xC0, 0xF0, 0x1C, 0x0E, 0x03,
+ 0xC0, 0xE0, 0x3C, 0x1E, 0x03, 0x81, 0xE0, 0x38, 0x7F, 0x0F, 0xFF, 0xF8,
+ 0xFF, 0xFF, 0x8F, 0xF7, 0xF0, 0xFE, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78,
+ 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x0F, 0xF0, 0x1F, 0xF0,
+ 0x0F, 0xF0, 0x00, 0xF0, 0x00, 0xE0, 0x00, 0xE0, 0x01, 0xE0, 0x01, 0xE0,
+ 0x01, 0xE0, 0x01, 0xC0, 0x01, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFE, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFC, 0x3F, 0xFE, 0x0F, 0xFF, 0x81, 0xFF,
+ 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0xF0,
+ 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x78, 0x00,
+ 0x1E, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0xF0, 0x00, 0x7C, 0x1F, 0xFE,
+ 0x0F, 0xFF, 0x03, 0xFF, 0x80, 0x7F, 0x80, 0x00, 0x07, 0xE0, 0x00, 0xFE,
+ 0x00, 0x0F, 0xE0, 0x00, 0x7C, 0x00, 0x01, 0xC0, 0x00, 0x3C, 0x00, 0x03,
+ 0xCF, 0xF0, 0x3C, 0xFF, 0x03, 0x9F, 0xF0, 0x38, 0xFE, 0x07, 0xBF, 0x00,
+ 0x7F, 0xC0, 0x07, 0xF8, 0x00, 0x7F, 0x00, 0x07, 0xF8, 0x00, 0xFF, 0xC0,
+ 0x0F, 0x7E, 0x00, 0xE3, 0xF0, 0x7E, 0x1F, 0xE7, 0xE1, 0xFE, 0xFE, 0x3F,
+ 0xE7, 0xE1, 0xFC, 0x03, 0xFC, 0x07, 0xFC, 0x07, 0xF8, 0x07, 0xF8, 0x00,
+ 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x70, 0x00, 0x70, 0x00, 0xF0, 0x00,
+ 0xF0, 0x00, 0xE0, 0x00, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01,
+ 0xC0, 0x01, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1F,
+ 0x7C, 0x78, 0x7F, 0xFF, 0xF8, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF0, 0xF1,
+ 0xF1, 0xE1, 0xC3, 0x83, 0xC7, 0x87, 0x07, 0x8F, 0x0E, 0x0E, 0x1C, 0x3C,
+ 0x1C, 0x38, 0x78, 0x78, 0x70, 0xE0, 0xF1, 0xE1, 0xC1, 0xC7, 0xE3, 0xC3,
+ 0xFF, 0xCF, 0xC7, 0xFF, 0x9F, 0x9F, 0xFF, 0x3E, 0x3E, 0x0F, 0x8F, 0x80,
+ 0xFD, 0xFF, 0x07, 0xFF, 0xF8, 0x3F, 0xFF, 0xE0, 0x7E, 0x1F, 0x07, 0xC0,
+ 0x78, 0x3C, 0x03, 0x81, 0xE0, 0x1C, 0x0E, 0x01, 0xE0, 0x70, 0x0F, 0x07,
+ 0x80, 0x70, 0x3C, 0x03, 0x87, 0xF0, 0x3F, 0x7F, 0xC3, 0xFF, 0xFE, 0x1F,
+ 0xEF, 0xE0, 0xFE, 0x01, 0xFC, 0x01, 0xFF, 0x80, 0xFF, 0xF8, 0x7F, 0xFE,
+ 0x3E, 0x0F, 0xDF, 0x01, 0xF7, 0x80, 0x3F, 0xC0, 0x0F, 0xF0, 0x03, 0xFC,
+ 0x01, 0xEF, 0x80, 0xFB, 0xF0, 0x7C, 0x7F, 0xFF, 0x1F, 0xFF, 0x03, 0xFF,
+ 0x80, 0x3F, 0x80, 0x07, 0xC7, 0xE0, 0x1F, 0xBF, 0xF0, 0x3F, 0xFF, 0xF0,
+ 0x7F, 0xFF, 0xE0, 0x3F, 0x07, 0xE0, 0x78, 0x03, 0xC0, 0xE0, 0x07, 0x81,
+ 0xC0, 0x0F, 0x07, 0x00, 0x1E, 0x0F, 0x00, 0x78, 0x1E, 0x01, 0xF0, 0x3E,
+ 0x07, 0xC0, 0xFF, 0xFF, 0x81, 0xFF, 0xFE, 0x03, 0xDF, 0xF0, 0x07, 0x1F,
+ 0x80, 0x0E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x03, 0xFE, 0x00,
+ 0x0F, 0xFE, 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x01, 0xF8,
+ 0xF8, 0x1F, 0xFF, 0xF1, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0x3E, 0x07, 0xC1,
+ 0xF0, 0x0F, 0x07, 0x80, 0x1C, 0x3C, 0x00, 0x70, 0xF0, 0x03, 0x83, 0xC0,
+ 0x0E, 0x0F, 0x80, 0x78, 0x3F, 0x07, 0xE0, 0x7F, 0xFF, 0x81, 0xFF, 0xFC,
+ 0x03, 0xFF, 0x70, 0x03, 0xF3, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00,
+ 0x00, 0xE0, 0x00, 0x3F, 0xE0, 0x01, 0xFF, 0xC0, 0x07, 0xFF, 0x00, 0x1F,
+ 0xF8, 0x00, 0x0F, 0xC3, 0xC1, 0xFC, 0xFF, 0x1F, 0xFF, 0xF1, 0xFF, 0xFE,
+ 0x03, 0xFC, 0x00, 0x3F, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x07, 0x80,
+ 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, 0xFF, 0xFC, 0x0F, 0xFF,
+ 0xE0, 0xFF, 0xFC, 0x0F, 0xFF, 0xC0, 0x03, 0xF3, 0x0F, 0xFF, 0x3F, 0xFF,
+ 0x3F, 0xFF, 0x7C, 0x0E, 0x78, 0x00, 0x7F, 0xE0, 0x3F, 0xFC, 0x1F, 0xFF,
+ 0x00, 0x3F, 0x70, 0x0F, 0xF8, 0x1F, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xF8,
+ 0x0F, 0xE0, 0x06, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x0E, 0x00,
+ 0x7F, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFC, 0x1C, 0x00, 0x3C, 0x00,
+ 0x3C, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x78, 0x00, 0x7C, 0x0E,
+ 0x7F, 0xFF, 0x7F, 0xFE, 0x3F, 0xFC, 0x0F, 0xE0, 0x7C, 0x0F, 0xFF, 0x07,
+ 0xFF, 0x81, 0xFF, 0xE0, 0x7E, 0x78, 0x03, 0x9E, 0x00, 0xE7, 0x80, 0x79,
+ 0xE0, 0x1E, 0x78, 0x07, 0x1E, 0x01, 0xC7, 0x80, 0xF1, 0xE0, 0xFC, 0x7F,
+ 0xFF, 0x9F, 0xFF, 0xE3, 0xFF, 0xF8, 0x3E, 0x7C, 0x7F, 0x87, 0xFF, 0xFC,
+ 0x7F, 0xFF, 0xE3, 0xFF, 0xFF, 0x1F, 0xE1, 0xE0, 0x3C, 0x0F, 0x03, 0xC0,
+ 0x78, 0x3C, 0x01, 0xE1, 0xC0, 0x0F, 0x1E, 0x00, 0x79, 0xE0, 0x03, 0xCE,
+ 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0x80, 0x00,
+ 0x78, 0x00, 0x7E, 0x03, 0xF7, 0xF0, 0x3F, 0xFF, 0x81, 0xFD, 0xF8, 0x0F,
+ 0xE7, 0x8E, 0x1C, 0x3C, 0xF9, 0xE1, 0xE7, 0xCE, 0x0F, 0x7E, 0xF0, 0x7B,
+ 0xF7, 0x03, 0xFF, 0xF8, 0x1F, 0xDF, 0x80, 0xFC, 0xFC, 0x07, 0xE7, 0xE0,
+ 0x3E, 0x3E, 0x01, 0xF1, 0xF0, 0x0F, 0x07, 0x00, 0x0F, 0xE3, 0xF8, 0xFF,
+ 0x1F, 0xC7, 0xF9, 0xFE, 0x1F, 0x87, 0xF0, 0x7E, 0x7C, 0x01, 0xFF, 0xC0,
+ 0x07, 0xFC, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x1F, 0xF0, 0x01, 0xF7,
+ 0xC0, 0x1F, 0x1F, 0x03, 0xF0, 0x7C, 0x7F, 0xCF, 0xFB, 0xFE, 0x7F, 0xDF,
+ 0xE3, 0xFC, 0x07, 0xF0, 0x7F, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x07,
+ 0xE0, 0xFE, 0x03, 0xC0, 0x78, 0x03, 0xC0, 0x78, 0x03, 0xC0, 0xF0, 0x01,
+ 0xE1, 0xE0, 0x01, 0xE1, 0xC0, 0x01, 0xE3, 0xC0, 0x00, 0xF7, 0x80, 0x00,
+ 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7C, 0x00, 0x00,
+ 0x78, 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x7F,
+ 0xF0, 0x00, 0xFF, 0xF8, 0x00, 0xFF, 0xF0, 0x00, 0x7F, 0xF0, 0x00, 0x1F,
+ 0xFF, 0xC7, 0xFF, 0xF1, 0xFF, 0xF8, 0xFF, 0xFE, 0x3C, 0x1F, 0x0E, 0x1F,
+ 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00,
+ 0xF8, 0x3C, 0xFF, 0xFF, 0x3F, 0xFF, 0xCF, 0xFF, 0xE3, 0xFF, 0xF8, 0x00,
+ 0xF0, 0x1F, 0x03, 0xF0, 0x7E, 0x07, 0x80, 0x70, 0x0F, 0x00, 0xF0, 0x0E,
+ 0x00, 0xE0, 0x1E, 0x01, 0xC0, 0xFC, 0x0F, 0x80, 0xF8, 0x0F, 0xC0, 0x3C,
+ 0x03, 0xC0, 0x38, 0x03, 0x80, 0x78, 0x07, 0x80, 0x78, 0x07, 0xE0, 0x7E,
+ 0x03, 0xE0, 0x1C, 0x00, 0x02, 0x07, 0x07, 0x0F, 0x0F, 0x0E, 0x0E, 0x0E,
+ 0x1E, 0x1E, 0x1C, 0x1C, 0x1C, 0x3C, 0x3C, 0x38, 0x38, 0x38, 0x78, 0x78,
+ 0x70, 0x70, 0x70, 0xF0, 0xF0, 0xE0, 0xE0, 0x01, 0xC0, 0x1F, 0x00, 0xFC,
+ 0x07, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1C, 0x00, 0xE0, 0x0F, 0x00,
+ 0x78, 0x03, 0xC0, 0x1F, 0x80, 0x7C, 0x03, 0xE0, 0x3F, 0x03, 0xC0, 0x1C,
+ 0x00, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0x80, 0x3C, 0x0F, 0xE0, 0x7E, 0x07,
+ 0xE0, 0x1E, 0x00, 0x0F, 0x00, 0x1F, 0xC0, 0x1F, 0xF0, 0xFF, 0xFC, 0xFF,
+ 0x3F, 0xFF, 0x0F, 0xF8, 0x03, 0xF8, 0x00, 0xF0 };
+
+const GFXglyph FreeMonoBoldOblique18pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 21, 0, 1 }, // 0x20 ' '
+ { 0, 9, 22, 21, 9, -21 }, // 0x21 '!'
+ { 25, 12, 10, 21, 9, -20 }, // 0x22 '"'
+ { 40, 18, 25, 21, 4, -22 }, // 0x23 '#'
+ { 97, 18, 28, 21, 4, -23 }, // 0x24 '$'
+ { 160, 16, 21, 21, 5, -20 }, // 0x25 '%'
+ { 202, 16, 20, 21, 4, -19 }, // 0x26 '&'
+ { 242, 5, 10, 21, 12, -20 }, // 0x27 '''
+ { 249, 10, 27, 21, 11, -21 }, // 0x28 '('
+ { 283, 10, 27, 21, 4, -21 }, // 0x29 ')'
+ { 317, 15, 15, 21, 6, -21 }, // 0x2A '*'
+ { 346, 18, 19, 21, 4, -18 }, // 0x2B '+'
+ { 389, 9, 10, 21, 4, -3 }, // 0x2C ','
+ { 401, 18, 4, 21, 4, -11 }, // 0x2D '-'
+ { 410, 5, 5, 21, 8, -4 }, // 0x2E '.'
+ { 414, 21, 28, 21, 2, -23 }, // 0x2F '/'
+ { 488, 17, 23, 21, 5, -22 }, // 0x30 '0'
+ { 537, 15, 22, 21, 3, -21 }, // 0x31 '1'
+ { 579, 20, 23, 21, 2, -22 }, // 0x32 '2'
+ { 637, 18, 23, 21, 3, -22 }, // 0x33 '3'
+ { 689, 16, 21, 21, 4, -20 }, // 0x34 '4'
+ { 731, 18, 22, 21, 4, -21 }, // 0x35 '5'
+ { 781, 19, 23, 21, 5, -22 }, // 0x36 '6'
+ { 836, 16, 22, 21, 6, -21 }, // 0x37 '7'
+ { 880, 19, 23, 21, 3, -22 }, // 0x38 '8'
+ { 935, 18, 23, 21, 4, -22 }, // 0x39 '9'
+ { 987, 7, 16, 21, 9, -15 }, // 0x3A ':'
+ { 1001, 11, 22, 21, 4, -15 }, // 0x3B ';'
+ { 1032, 18, 16, 21, 4, -17 }, // 0x3C '<'
+ { 1068, 19, 10, 21, 3, -14 }, // 0x3D '='
+ { 1092, 19, 16, 21, 3, -17 }, // 0x3E '>'
+ { 1130, 14, 21, 21, 8, -20 }, // 0x3F '?'
+ { 1167, 18, 27, 21, 3, -21 }, // 0x40 '@'
+ { 1228, 22, 21, 21, 0, -20 }, // 0x41 'A'
+ { 1286, 21, 21, 21, 1, -20 }, // 0x42 'B'
+ { 1342, 21, 21, 21, 2, -20 }, // 0x43 'C'
+ { 1398, 21, 21, 21, 1, -20 }, // 0x44 'D'
+ { 1454, 22, 21, 21, 0, -20 }, // 0x45 'E'
+ { 1512, 23, 21, 21, 0, -20 }, // 0x46 'F'
+ { 1573, 21, 21, 21, 2, -20 }, // 0x47 'G'
+ { 1629, 23, 21, 21, 0, -20 }, // 0x48 'H'
+ { 1690, 19, 21, 21, 2, -20 }, // 0x49 'I'
+ { 1740, 23, 21, 21, 0, -20 }, // 0x4A 'J'
+ { 1801, 23, 21, 21, 0, -20 }, // 0x4B 'K'
+ { 1862, 20, 21, 21, 1, -20 }, // 0x4C 'L'
+ { 1915, 25, 21, 21, 0, -20 }, // 0x4D 'M'
+ { 1981, 24, 21, 21, 1, -20 }, // 0x4E 'N'
+ { 2044, 20, 21, 21, 2, -20 }, // 0x4F 'O'
+ { 2097, 21, 21, 21, 1, -20 }, // 0x50 'P'
+ { 2153, 20, 26, 21, 2, -20 }, // 0x51 'Q'
+ { 2218, 22, 21, 21, 0, -20 }, // 0x52 'R'
+ { 2276, 19, 21, 21, 3, -20 }, // 0x53 'S'
+ { 2326, 19, 21, 21, 3, -20 }, // 0x54 'T'
+ { 2376, 21, 21, 21, 3, -20 }, // 0x55 'U'
+ { 2432, 23, 21, 21, 1, -20 }, // 0x56 'V'
+ { 2493, 22, 21, 21, 2, -20 }, // 0x57 'W'
+ { 2551, 24, 21, 21, 0, -20 }, // 0x58 'X'
+ { 2614, 20, 21, 21, 3, -20 }, // 0x59 'Y'
+ { 2667, 19, 21, 21, 2, -20 }, // 0x5A 'Z'
+ { 2717, 13, 27, 21, 8, -21 }, // 0x5B '['
+ { 2761, 10, 28, 21, 8, -23 }, // 0x5C '\'
+ { 2796, 13, 27, 21, 4, -21 }, // 0x5D ']'
+ { 2840, 15, 11, 21, 6, -21 }, // 0x5E '^'
+ { 2861, 21, 4, 21, -1, 4 }, // 0x5F '_'
+ { 2872, 6, 6, 21, 10, -22 }, // 0x60 '`'
+ { 2877, 19, 16, 21, 2, -15 }, // 0x61 'a'
+ { 2915, 22, 22, 21, 0, -21 }, // 0x62 'b'
+ { 2976, 19, 16, 21, 3, -15 }, // 0x63 'c'
+ { 3014, 21, 22, 21, 3, -21 }, // 0x64 'd'
+ { 3072, 18, 16, 21, 3, -15 }, // 0x65 'e'
+ { 3108, 21, 22, 21, 3, -21 }, // 0x66 'f'
+ { 3166, 21, 23, 21, 2, -15 }, // 0x67 'g'
+ { 3227, 20, 22, 21, 1, -21 }, // 0x68 'h'
+ { 3282, 16, 22, 21, 3, -21 }, // 0x69 'i'
+ { 3326, 18, 29, 21, 2, -21 }, // 0x6A 'j'
+ { 3392, 20, 22, 21, 1, -21 }, // 0x6B 'k'
+ { 3447, 16, 22, 21, 3, -21 }, // 0x6C 'l'
+ { 3491, 23, 16, 21, 0, -15 }, // 0x6D 'm'
+ { 3537, 21, 16, 21, 1, -15 }, // 0x6E 'n'
+ { 3579, 18, 16, 21, 3, -15 }, // 0x6F 'o'
+ { 3615, 23, 23, 21, -1, -15 }, // 0x70 'p'
+ { 3682, 22, 23, 21, 2, -15 }, // 0x71 'q'
+ { 3746, 20, 16, 21, 2, -15 }, // 0x72 'r'
+ { 3786, 16, 16, 21, 4, -15 }, // 0x73 's'
+ { 3818, 16, 21, 21, 4, -20 }, // 0x74 't'
+ { 3860, 18, 16, 21, 3, -15 }, // 0x75 'u'
+ { 3896, 21, 16, 21, 2, -15 }, // 0x76 'v'
+ { 3938, 21, 16, 21, 3, -15 }, // 0x77 'w'
+ { 3980, 21, 16, 21, 1, -15 }, // 0x78 'x'
+ { 4022, 24, 23, 21, -1, -15 }, // 0x79 'y'
+ { 4091, 18, 16, 21, 3, -15 }, // 0x7A 'z'
+ { 4127, 12, 27, 21, 8, -21 }, // 0x7B '{'
+ { 4168, 8, 27, 21, 8, -21 }, // 0x7C '|'
+ { 4195, 13, 27, 21, 4, -21 }, // 0x7D '}'
+ { 4239, 17, 8, 21, 4, -13 } }; // 0x7E '~'
+
+const GFXfont FreeMonoBoldOblique18pt7b PROGMEM = {
+ (uint8_t *)FreeMonoBoldOblique18pt7bBitmaps,
+ (GFXglyph *)FreeMonoBoldOblique18pt7bGlyphs,
+ 0x20, 0x7E, 35 };
+
+// Approx. 4928 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBoldOblique24pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBoldOblique24pt7b.h
new file mode 100644
index 000000000000..a2bbbdf36f49
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBoldOblique24pt7b.h
@@ -0,0 +1,742 @@
+const uint8_t FreeMonoBoldOblique24pt7bBitmaps[] PROGMEM = {
+ 0x01, 0xE0, 0x3F, 0x07, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xE0, 0xFE,
+ 0x0F, 0xE0, 0xFE, 0x0F, 0xC0, 0xFC, 0x1F, 0xC1, 0xF8, 0x1F, 0x81, 0xF8,
+ 0x1F, 0x81, 0xF0, 0x1F, 0x01, 0xF0, 0x1E, 0x00, 0x80, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0xC0, 0x7E, 0x0F, 0xE0, 0xFE, 0x0F, 0xC0, 0x78, 0x00, 0x7E,
+ 0x1F, 0xBF, 0x0F, 0xDF, 0x87, 0xCF, 0x83, 0xE7, 0xC1, 0xF3, 0xE0, 0xF1,
+ 0xE0, 0xF8, 0xF0, 0x7C, 0x78, 0x3C, 0x38, 0x1E, 0x1C, 0x0F, 0x0E, 0x07,
+ 0x0E, 0x03, 0x83, 0x01, 0x80, 0x00, 0x1C, 0x1C, 0x00, 0x3E, 0x3E, 0x00,
+ 0x3E, 0x3E, 0x00, 0x3C, 0x3C, 0x00, 0x7C, 0x7C, 0x00, 0x7C, 0x7C, 0x00,
+ 0x7C, 0x7C, 0x00, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x0F,
+ 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x1F,
+ 0xFF, 0xFE, 0x03, 0xE3, 0xE0, 0x03, 0xE3, 0xE0, 0x03, 0xC3, 0xC0, 0x07,
+ 0xC7, 0xC0, 0x7F, 0xFF, 0xF8, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFC, 0xFF,
+ 0xFF, 0xF8, 0xFF, 0xFF, 0xF0, 0x0F, 0x0F, 0x00, 0x1F, 0x1F, 0x00, 0x1F,
+ 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x3E, 0x1E, 0x00, 0x3E, 0x3E, 0x00, 0x3E,
+ 0x3E, 0x00, 0x3C, 0x3C, 0x00, 0x7C, 0x7C, 0x00, 0x38, 0x38, 0x00, 0x00,
+ 0x00, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7C, 0x00,
+ 0x00, 0xFF, 0x00, 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xFE, 0x03, 0xFF, 0xFF,
+ 0x01, 0xFF, 0xFF, 0x81, 0xFC, 0x1F, 0xC1, 0xF8, 0x03, 0xC0, 0xF8, 0x01,
+ 0xE0, 0x7C, 0x00, 0x40, 0x3F, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x0F, 0xFF,
+ 0x80, 0x03, 0xFF, 0xF8, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0x00, 0x00,
+ 0x7F, 0xC0, 0x00, 0x07, 0xE0, 0xE0, 0x01, 0xF0, 0xF0, 0x00, 0xF8, 0xF8,
+ 0x00, 0xFC, 0x7E, 0x00, 0xFC, 0x3F, 0x81, 0xFE, 0x1F, 0xFF, 0xFE, 0x0F,
+ 0xFF, 0xFE, 0x0F, 0xFF, 0xFE, 0x03, 0xFF, 0xFC, 0x00, 0x07, 0xF0, 0x00,
+ 0x01, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x7C, 0x00,
+ 0x00, 0x3E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0xF8,
+ 0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xE0, 0x03, 0xC3, 0xC0, 0x0E, 0x07, 0x00,
+ 0x70, 0x1C, 0x01, 0xC0, 0x70, 0x07, 0x01, 0xC0, 0x1C, 0x0E, 0x00, 0x78,
+ 0x78, 0x00, 0xFF, 0xC0, 0x03, 0xFE, 0x1F, 0x03, 0xE3, 0xFC, 0x00, 0x7F,
+ 0xC0, 0x0F, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xC0, 0x03, 0xF8, 0x7C, 0x0F,
+ 0x07, 0xFC, 0x00, 0x3F, 0xF0, 0x01, 0xE1, 0xE0, 0x07, 0x03, 0x80, 0x38,
+ 0x0E, 0x00, 0xE0, 0x38, 0x03, 0x80, 0xE0, 0x0E, 0x07, 0x00, 0x3C, 0x3C,
+ 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1F, 0x00,
+ 0x01, 0xFF, 0x80, 0x3F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xFE, 0x01, 0xF1,
+ 0xE0, 0x1F, 0x04, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01,
+ 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x07, 0xF8, 0x00, 0x7F, 0xE3,
+ 0xE7, 0xFF, 0x3F, 0x7E, 0xFF, 0xFB, 0xE7, 0xFF, 0x9E, 0x1F, 0xF1, 0xF0,
+ 0xFF, 0x8F, 0x83, 0xF8, 0x7C, 0x1F, 0xC3, 0xF0, 0xFF, 0x9F, 0xFF, 0xFC,
+ 0x7F, 0xFF, 0xE3, 0xFF, 0xFF, 0x0F, 0xFD, 0xF0, 0x1F, 0x80, 0x00, 0x7E,
+ 0xFD, 0xF3, 0xE7, 0xCF, 0x3E, 0x7C, 0xF1, 0xE3, 0xC7, 0x0E, 0x18, 0x00,
+ 0x00, 0x18, 0x00, 0xF0, 0x07, 0xC0, 0x3F, 0x01, 0xF8, 0x07, 0xC0, 0x3E,
+ 0x01, 0xF8, 0x07, 0xC0, 0x3E, 0x00, 0xF8, 0x07, 0xC0, 0x1F, 0x00, 0xF8,
+ 0x03, 0xE0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x3E, 0x00, 0xF8,
+ 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E,
+ 0x00, 0xFC, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x80, 0x7E, 0x00, 0xFC, 0x03,
+ 0xF0, 0x07, 0xC0, 0x1E, 0x00, 0x00, 0xC0, 0x07, 0x80, 0x3F, 0x00, 0xFC,
+ 0x03, 0xF0, 0x07, 0xE0, 0x1F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xF0, 0x07,
+ 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01,
+ 0xF0, 0x07, 0xC0, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x1F, 0x00, 0x7C, 0x01,
+ 0xF0, 0x0F, 0x80, 0x3E, 0x01, 0xF0, 0x0F, 0xC0, 0x3E, 0x01, 0xF0, 0x0F,
+ 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x3E, 0x00, 0xF0, 0x00, 0x00, 0x3C,
+ 0x00, 0x01, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x08,
+ 0x3C, 0x09, 0xF9, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF,
+ 0x87, 0xFF, 0xE0, 0x07, 0xF8, 0x00, 0x7F, 0xC0, 0x07, 0xFF, 0x00, 0x7F,
+ 0xF8, 0x07, 0xE7, 0xE0, 0x3E, 0x3F, 0x01, 0xE0, 0xF8, 0x0E, 0x07, 0x80,
+ 0x00, 0x07, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x0F, 0x00,
+ 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1E, 0x00,
+ 0x00, 0x3E, 0x00, 0x00, 0x3E, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x7C, 0x00,
+ 0x00, 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00,
+ 0x00, 0xF8, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xF0, 0x00,
+ 0x01, 0xF0, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xF0, 0x7E, 0x07, 0xC0, 0xFC,
+ 0x0F, 0x81, 0xF0, 0x1E, 0x03, 0xE0, 0x3C, 0x07, 0x80, 0x78, 0x0F, 0x00,
+ 0xE0, 0x0C, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3C, 0xFF, 0xFF, 0xFF, 0xCF, 0x00,
+ 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x01, 0xF0, 0x00,
+ 0x00, 0x3E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F,
+ 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00,
+ 0x00, 0x3E, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1F,
+ 0x80, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x07, 0xE0, 0x00,
+ 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x1F,
+ 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0, 0x00,
+ 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x3E,
+ 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0F, 0x80, 0x00,
+ 0x01, 0xF0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C,
+ 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x07, 0x00, 0x00,
+ 0x00, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0xE0, 0x03, 0xFF, 0xE0, 0x1F, 0xFF,
+ 0xE0, 0x7F, 0xFF, 0xC0, 0xFC, 0x1F, 0x83, 0xF0, 0x1F, 0x8F, 0xC0, 0x1F,
+ 0x1F, 0x00, 0x3E, 0x7C, 0x00, 0x7C, 0xF8, 0x00, 0xF9, 0xF0, 0x01, 0xF3,
+ 0xC0, 0x07, 0xCF, 0x80, 0x0F, 0x9F, 0x00, 0x1E, 0x3E, 0x00, 0x3C, 0x78,
+ 0x00, 0xF8, 0xF0, 0x01, 0xF3, 0xE0, 0x03, 0xE7, 0xC0, 0x07, 0x8F, 0x80,
+ 0x1F, 0x1F, 0x00, 0x3E, 0x3E, 0x00, 0xF8, 0x7C, 0x01, 0xF0, 0xFC, 0x07,
+ 0xC1, 0xFC, 0x3F, 0x81, 0xFF, 0xFE, 0x03, 0xFF, 0xF8, 0x03, 0xFF, 0xE0,
+ 0x03, 0xFF, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x7E,
+ 0x00, 0x0F, 0xF0, 0x01, 0xFF, 0x80, 0x1F, 0xFC, 0x03, 0xFB, 0xE0, 0x1F,
+ 0x9E, 0x00, 0xF1, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0,
+ 0x00, 0x1E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x03,
+ 0xC0, 0x00, 0x1E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00,
+ 0x03, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C,
+ 0x01, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
+ 0xFF, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x03, 0xFF, 0x80, 0x03, 0xFF, 0xF0,
+ 0x01, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0x80, 0x7F, 0x07, 0xF0, 0x1F, 0x00,
+ 0xFC, 0x0F, 0x80, 0x1F, 0x03, 0xE0, 0x07, 0xC0, 0xF0, 0x01, 0xF0, 0x00,
+ 0x00, 0xF8, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0xC0,
+ 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xF8,
+ 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF,
+ 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x70, 0x3F, 0x80, 0x3E, 0x1F,
+ 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFC,
+ 0x3F, 0xFF, 0xFF, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x0F, 0xFE, 0x00, 0x1F,
+ 0xFF, 0x80, 0x1F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF8, 0x0F, 0x81, 0xFC, 0x07,
+ 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x0F, 0xC0,
+ 0x00, 0x07, 0xC0, 0x00, 0x0F, 0xC0, 0x01, 0xFF, 0xC0, 0x01, 0xFF, 0xC0,
+ 0x00, 0xFF, 0x80, 0x00, 0x7F, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0xFE,
+ 0x00, 0x00, 0x1F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01,
+ 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFC, 0x3C, 0x01,
+ 0xFC, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFC, 0x03, 0xFF,
+ 0xFC, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x07, 0xF0, 0x00,
+ 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xE0, 0x03, 0xFF,
+ 0x80, 0x1F, 0xBE, 0x00, 0x7C, 0xF0, 0x03, 0xE7, 0xC0, 0x1F, 0x1F, 0x00,
+ 0xF8, 0x7C, 0x07, 0xE1, 0xE0, 0x3F, 0x07, 0x81, 0xF8, 0x3E, 0x07, 0xC0,
+ 0xF8, 0x3E, 0x03, 0xC1, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFE,
+ 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0x80, 0x00, 0xF8, 0x00, 0x3F, 0xF8, 0x01,
+ 0xFF, 0xE0, 0x07, 0xFF, 0x80, 0x1F, 0xFE, 0x00, 0x7F, 0xF0, 0x01, 0xFF,
+ 0xFF, 0x00, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xC0, 0x3F, 0xFF, 0xE0, 0x3F,
+ 0xFF, 0xE0, 0x1F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03,
+ 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF7, 0xF0, 0x00, 0xFF, 0xFE, 0x00,
+ 0x7F, 0xFF, 0x80, 0x3F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF0, 0x0F, 0x01, 0xFC,
+ 0x00, 0x00, 0x7E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07,
+ 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x00,
+ 0xF8, 0x00, 0x00, 0xF8, 0x3C, 0x03, 0xFC, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF,
+ 0xFC, 0x0F, 0xFF, 0xFC, 0x03, 0xFF, 0xF8, 0x00, 0x3F, 0xE0, 0x00, 0x00,
+ 0x01, 0xFC, 0x00, 0x07, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x7F, 0xFF, 0x00,
+ 0xFF, 0xFE, 0x01, 0xFE, 0x1C, 0x03, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x0F,
+ 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x3E,
+ 0xFF, 0x80, 0x7D, 0xFF, 0xC0, 0x7F, 0xFF, 0xE0, 0x7F, 0xFF, 0xE0, 0x7F,
+ 0x87, 0xF0, 0xFF, 0x03, 0xF0, 0xFC, 0x01, 0xF0, 0xF8, 0x01, 0xF0, 0xF8,
+ 0x01, 0xF0, 0xF8, 0x01, 0xF0, 0xF8, 0x03, 0xE0, 0xF8, 0x03, 0xE0, 0xFC,
+ 0x07, 0xC0, 0xFE, 0x0F, 0xC0, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x00, 0x3F,
+ 0xFE, 0x00, 0x1F, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0xFF, 0xFD, 0xFF,
+ 0xFF, 0xE7, 0xFF, 0xFF, 0xBF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFB, 0xE0, 0x07,
+ 0xCF, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00,
+ 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x01,
+ 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80,
+ 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x00,
+ 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0,
+ 0x00, 0x1F, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0xFF,
+ 0xE0, 0x07, 0xFF, 0xE0, 0x1F, 0xFF, 0xE0, 0x7F, 0xFF, 0xC0, 0xFC, 0x1F,
+ 0xC3, 0xF0, 0x1F, 0x8F, 0xC0, 0x1F, 0x1F, 0x00, 0x3E, 0x3E, 0x00, 0x7C,
+ 0x7C, 0x01, 0xF0, 0xFC, 0x07, 0xE0, 0xFC, 0x1F, 0x81, 0xFF, 0xFE, 0x01,
+ 0xFF, 0xF0, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0xE0, 0x3F, 0xFF, 0xE0, 0xFE,
+ 0x0F, 0xC3, 0xF0, 0x0F, 0xC7, 0xC0, 0x0F, 0x9F, 0x00, 0x1F, 0x3E, 0x00,
+ 0x3E, 0x7C, 0x00, 0xFC, 0xFC, 0x03, 0xF1, 0xFC, 0x1F, 0xE3, 0xFF, 0xFF,
+ 0x83, 0xFF, 0xFE, 0x03, 0xFF, 0xF8, 0x03, 0xFF, 0xC0, 0x01, 0xFC, 0x00,
+ 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0xF8, 0x00, 0xFF, 0xFC, 0x01, 0xFF,
+ 0xFE, 0x03, 0xFF, 0xFE, 0x03, 0xF0, 0x7F, 0x07, 0xE0, 0x3F, 0x07, 0xC0,
+ 0x1F, 0x0F, 0xC0, 0x1F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, 0x1F, 0x0F, 0x80,
+ 0x3F, 0x0F, 0xC0, 0x7F, 0x0F, 0xE1, 0xFF, 0x07, 0xFF, 0xFE, 0x07, 0xFF,
+ 0xFE, 0x03, 0xFF, 0xBE, 0x01, 0xFF, 0x7C, 0x00, 0xFC, 0x7C, 0x00, 0x00,
+ 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xF0, 0x00, 0x0F,
+ 0xE0, 0x00, 0x1F, 0xC0, 0x38, 0x7F, 0x80, 0x7F, 0xFF, 0x00, 0xFF, 0xFE,
+ 0x00, 0xFF, 0xF8, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0x07, 0x83,
+ 0xF1, 0xFC, 0x7F, 0x1F, 0x83, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x1F, 0x8F, 0xE3, 0xF8, 0xFC,
+ 0x1E, 0x00, 0x00, 0x3C, 0x00, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xC0,
+ 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x03, 0xE0, 0x0F, 0xC0,
+ 0x1F, 0x00, 0x7C, 0x00, 0xF0, 0x03, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x38,
+ 0x00, 0xF0, 0x01, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x03, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xE0, 0x00,
+ 0x7F, 0xC0, 0x00, 0xFF, 0x80, 0x03, 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x0F,
+ 0xFC, 0x00, 0x1F, 0xF0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00,
+ 0x3F, 0xE0, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x3F, 0xE0,
+ 0x00, 0x07, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07,
+ 0x80, 0x1F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFC, 0xFF,
+ 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF,
+ 0xF3, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x80, 0x00,
+ 0x00, 0x00, 0x07, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00,
+ 0xFF, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0xFF, 0xC0,
+ 0x00, 0x1F, 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x7F,
+ 0xE0, 0x00, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x07, 0xFC,
+ 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0x80,
+ 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x01, 0xFF,
+ 0xE1, 0xFF, 0xFE, 0x3F, 0xFF, 0xE7, 0xFF, 0xFF, 0xF8, 0x1F, 0xFE, 0x00,
+ 0xFF, 0x80, 0x1F, 0xF0, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x0F,
+ 0xE0, 0x07, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xC0, 0x0F, 0xE0,
+ 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xF0, 0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00,
+ 0x3F, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0xF0, 0x01,
+ 0xFF, 0xF0, 0x0F, 0xFF, 0xE0, 0x3F, 0x07, 0xE0, 0x7C, 0x07, 0xC1, 0xE0,
+ 0x07, 0x87, 0xC0, 0x0F, 0x0F, 0x00, 0x1C, 0x3C, 0x00, 0x78, 0x78, 0x07,
+ 0xF1, 0xE0, 0x3F, 0xE3, 0xC1, 0xFF, 0x87, 0x87, 0xFF, 0x0E, 0x1F, 0x9E,
+ 0x3C, 0x7C, 0x3C, 0x78, 0xF0, 0x78, 0xF3, 0xC0, 0xE1, 0xC7, 0x83, 0xC3,
+ 0x8F, 0x07, 0x8F, 0x1E, 0x0F, 0x1E, 0x3E, 0x1C, 0x3C, 0x7F, 0xFC, 0x78,
+ 0x7F, 0xFC, 0xF0, 0x7F, 0xF1, 0xE0, 0x3F, 0xE3, 0xC0, 0x00, 0x07, 0x80,
+ 0x00, 0x0F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3F, 0x01,
+ 0xC0, 0x7F, 0xFF, 0x80, 0x7F, 0xFE, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0x80,
+ 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xE0,
+ 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x0F, 0xFC, 0x00,
+ 0x00, 0x7F, 0xF0, 0x00, 0x01, 0xE7, 0xC0, 0x00, 0x0F, 0x9F, 0x00, 0x00,
+ 0x7C, 0x7C, 0x00, 0x01, 0xE1, 0xF8, 0x00, 0x0F, 0x87, 0xE0, 0x00, 0x7C,
+ 0x0F, 0x80, 0x01, 0xF0, 0x3E, 0x00, 0x0F, 0x80, 0xF8, 0x00, 0x3F, 0xFF,
+ 0xF0, 0x01, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0xFC,
+ 0x01, 0xFF, 0xFF, 0xF8, 0x0F, 0xC0, 0x07, 0xE0, 0x3E, 0x00, 0x0F, 0x87,
+ 0xFF, 0x03, 0xFF, 0xBF, 0xFC, 0x1F, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFF,
+ 0xC1, 0xFF, 0xEF, 0xFE, 0x07, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x3F,
+ 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF,
+ 0xFF, 0x80, 0x7C, 0x00, 0xFC, 0x03, 0xE0, 0x03, 0xE0, 0x1E, 0x00, 0x1F,
+ 0x01, 0xF0, 0x00, 0xF8, 0x0F, 0x80, 0x0F, 0x80, 0x7C, 0x01, 0xF8, 0x03,
+ 0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF,
+ 0xFF, 0x80, 0x7F, 0xFF, 0xFC, 0x03, 0xC0, 0x0F, 0xF0, 0x3E, 0x00, 0x1F,
+ 0x81, 0xF0, 0x00, 0x7C, 0x0F, 0x80, 0x03, 0xE0, 0x78, 0x00, 0x1F, 0x03,
+ 0xC0, 0x03, 0xF1, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF,
+ 0xFF, 0x87, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFE, 0x00, 0x00, 0x07, 0xF0,
+ 0x00, 0x03, 0xFF, 0xE6, 0x00, 0x7F, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0x03,
+ 0xFF, 0xFF, 0xF0, 0x7F, 0x81, 0xFF, 0x0F, 0xE0, 0x07, 0xE1, 0xF8, 0x00,
+ 0x3E, 0x1F, 0x00, 0x03, 0xE3, 0xF0, 0x00, 0x3C, 0x3E, 0x00, 0x03, 0xC7,
+ 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x7C, 0x00,
+ 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00,
+ 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0F, 0xC0,
+ 0x00, 0x70, 0x7E, 0x00, 0x1F, 0x07, 0xF8, 0x07, 0xF0, 0x3F, 0xFF, 0xFF,
+ 0x03, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00, 0x00,
+ 0xFF, 0x00, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xF0, 0x07, 0xFF,
+ 0xFF, 0x80, 0x7F, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0xE0, 0x1F, 0x00, 0xFE,
+ 0x01, 0xF0, 0x07, 0xE0, 0x1E, 0x00, 0x3F, 0x01, 0xE0, 0x01, 0xF0, 0x3E,
+ 0x00, 0x1F, 0x03, 0xE0, 0x01, 0xF0, 0x3E, 0x00, 0x1F, 0x03, 0xC0, 0x01,
+ 0xF0, 0x7C, 0x00, 0x1F, 0x07, 0xC0, 0x03, 0xF0, 0x7C, 0x00, 0x3E, 0x07,
+ 0x80, 0x03, 0xE0, 0x78, 0x00, 0x7E, 0x0F, 0x80, 0x07, 0xC0, 0xF8, 0x00,
+ 0xFC, 0x0F, 0x80, 0x1F, 0x80, 0xF0, 0x07, 0xF0, 0x7F, 0xFF, 0xFE, 0x07,
+ 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFE, 0x00, 0x7F, 0xFF,
+ 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF,
+ 0xFE, 0x1F, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xFF, 0x00, 0x78, 0x00, 0xF8,
+ 0x07, 0xC0, 0x07, 0xC0, 0x3E, 0x00, 0x3E, 0x01, 0xF0, 0xF1, 0xE0, 0x0F,
+ 0x0F, 0x8E, 0x00, 0x78, 0x7C, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x3F, 0xFE,
+ 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0xFF, 0xFC, 0x00,
+ 0x07, 0xC3, 0xC0, 0x00, 0x3E, 0x1E, 0x1E, 0x01, 0xE0, 0xE0, 0xF0, 0x0F,
+ 0x00, 0x0F, 0x80, 0xF8, 0x00, 0x7C, 0x07, 0xC0, 0x03, 0xE1, 0xFF, 0xFF,
+ 0xFE, 0x1F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xFC,
+ 0x3F, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xF8,
+ 0x1F, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0xC0,
+ 0x1F, 0x00, 0x0F, 0x80, 0x3E, 0x00, 0x1E, 0x00, 0x78, 0x00, 0x7C, 0x00,
+ 0xF0, 0x70, 0xF8, 0x03, 0xE1, 0xF0, 0xE0, 0x07, 0xC3, 0xC0, 0x00, 0x0F,
+ 0xFF, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0xFF,
+ 0xFC, 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x03, 0xC3, 0xE0, 0x00, 0x07, 0x87,
+ 0xC0, 0x00, 0x1F, 0x07, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x00,
+ 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0x80,
+ 0x00, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xF8, 0x00,
+ 0x00, 0x00, 0x07, 0xF8, 0x60, 0x03, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xF0,
+ 0x1F, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xE0, 0x7F, 0x80, 0xFE, 0x0F, 0xE0,
+ 0x03, 0xE0, 0xF8, 0x00, 0x3C, 0x1F, 0x00, 0x03, 0xC3, 0xF0, 0x00, 0x00,
+ 0x3E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0,
+ 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0, 0x7F, 0xFC, 0xF8, 0x0F, 0xFF,
+ 0xEF, 0x80, 0xFF, 0xFE, 0xF8, 0x0F, 0xFF, 0xCF, 0x80, 0x7F, 0xF8, 0xF8,
+ 0x00, 0x1F, 0x0F, 0xC0, 0x01, 0xF0, 0xFE, 0x00, 0x1F, 0x07, 0xF8, 0x07,
+ 0xE0, 0x7F, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFC, 0x00,
+ 0x7F, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x01, 0xFF, 0x0F, 0xF8, 0x0F,
+ 0xFC, 0x7F, 0xF0, 0x7F, 0xF1, 0xFF, 0xC1, 0xFF, 0xC7, 0xFE, 0x03, 0xFE,
+ 0x1F, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3C, 0x00, 0x78, 0x00,
+ 0xF0, 0x01, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7C,
+ 0x00, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xFE, 0x00,
+ 0x7F, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xC0, 0x07, 0x80, 0x1F, 0x00, 0x1E,
+ 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80,
+ 0x1E, 0x00, 0x3C, 0x00, 0xF8, 0x07, 0xFE, 0x1F, 0xF8, 0x3F, 0xF8, 0xFF,
+ 0xF0, 0xFF, 0xE3, 0xFF, 0xC3, 0xFF, 0x8F, 0xFE, 0x0F, 0xFC, 0x3F, 0xF8,
+ 0x00, 0x03, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xE0, 0xFF,
+ 0xFF, 0xF0, 0x7F, 0xFF, 0xF0, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00,
+ 0x1E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00,
+ 0x03, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0xF8, 0x00,
+ 0x00, 0x7C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00,
+ 0x00, 0x0F, 0x80, 0x00, 0x07, 0x80, 0x00, 0x07, 0xC0, 0x01, 0xFF, 0xFF,
+ 0xC1, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xF8, 0x1F, 0xFF,
+ 0xF8, 0x00, 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0xFC, 0x00, 0x3F,
+ 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x01,
+ 0xF0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x0F,
+ 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xF8,
+ 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07, 0xC0, 0x07, 0x00, 0x0F, 0x80,
+ 0x1F, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x78, 0x00, 0x78, 0x01,
+ 0xF0, 0x01, 0xF0, 0x03, 0xE0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x0F,
+ 0x80, 0x3F, 0x00, 0x1F, 0xC0, 0xFC, 0x00, 0x7F, 0xFF, 0xF8, 0x00, 0xFF,
+ 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x1F,
+ 0xC0, 0x00, 0x00, 0x03, 0xFF, 0xC3, 0xFE, 0x0F, 0xFF, 0x8F, 0xFC, 0x1F,
+ 0xFF, 0x3F, 0xF8, 0x3F, 0xFE, 0x7F, 0xF0, 0x7F, 0xF8, 0x7F, 0xC0, 0x1F,
+ 0x01, 0xFC, 0x00, 0x3E, 0x07, 0xF0, 0x00, 0x78, 0x3F, 0x80, 0x01, 0xF0,
+ 0xFE, 0x00, 0x03, 0xE3, 0xF0, 0x00, 0x07, 0xDF, 0xC0, 0x00, 0x0F, 0xFE,
+ 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0xFF, 0xFE,
+ 0x00, 0x01, 0xFC, 0xFC, 0x00, 0x03, 0xE0, 0xFC, 0x00, 0x0F, 0x81, 0xF8,
+ 0x00, 0x1F, 0x01, 0xF8, 0x00, 0x3E, 0x03, 0xF0, 0x00, 0x78, 0x03, 0xE0,
+ 0x00, 0xF0, 0x07, 0xE0, 0x1F, 0xFE, 0x0F, 0xF8, 0x7F, 0xFC, 0x1F, 0xF8,
+ 0xFF, 0xF8, 0x1F, 0xF1, 0xFF, 0xF0, 0x3F, 0xE1, 0xFF, 0xC0, 0x7F, 0x80,
+ 0x03, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xE0, 0x03, 0xFF,
+ 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80, 0x00,
+ 0x01, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF0,
+ 0x00, 0x00, 0x3C, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x00,
+ 0x3E, 0x00, 0x00, 0x07, 0xC0, 0x0E, 0x00, 0xF0, 0x01, 0xE0, 0x3E, 0x00,
+ 0x7C, 0x07, 0xC0, 0x0F, 0x80, 0xF8, 0x01, 0xF0, 0x1E, 0x00, 0x7C, 0x07,
+ 0xC0, 0x0F, 0x9F, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
+ 0x9F, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x3F,
+ 0xC1, 0xFF, 0x00, 0x1F, 0xF0, 0x7F, 0xC0, 0x07, 0xFC, 0x1F, 0xF0, 0x03,
+ 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x3F, 0xE0,
+ 0x3F, 0xE0, 0x0F, 0xF8, 0x1F, 0xF0, 0x03, 0xFF, 0x0F, 0xFC, 0x00, 0xF7,
+ 0xC3, 0xFF, 0x00, 0x7D, 0xF1, 0xF7, 0xC0, 0x1F, 0x7C, 0xFD, 0xF0, 0x07,
+ 0xDF, 0xBE, 0x78, 0x01, 0xE3, 0xFF, 0x3E, 0x00, 0x78, 0xFF, 0xCF, 0x80,
+ 0x3E, 0x3F, 0xE3, 0xE0, 0x0F, 0x87, 0xF0, 0xF8, 0x03, 0xE1, 0xFC, 0x3C,
+ 0x00, 0xF0, 0x7E, 0x1F, 0x00, 0x7C, 0x1F, 0x07, 0xC0, 0x1F, 0x00, 0x01,
+ 0xF0, 0x07, 0xC0, 0x00, 0x78, 0x07, 0xFE, 0x01, 0xFF, 0x83, 0xFF, 0xC0,
+ 0xFF, 0xF0, 0xFF, 0xF0, 0x7F, 0xFC, 0x3F, 0xF8, 0x1F, 0xFE, 0x0F, 0xFC,
+ 0x03, 0xFF, 0x00, 0x07, 0xF8, 0x07, 0xFF, 0x0F, 0xFC, 0x0F, 0xFF, 0x0F,
+ 0xFC, 0x0F, 0xFF, 0x0F, 0xFC, 0x0F, 0xFF, 0x0F, 0xFE, 0x0F, 0xFE, 0x01,
+ 0xFE, 0x00, 0xF8, 0x01, 0xFF, 0x00, 0xF0, 0x01, 0xFF, 0x01, 0xF0, 0x03,
+ 0xFF, 0x81, 0xF0, 0x03, 0xFF, 0x81, 0xF0, 0x03, 0xEF, 0xC1, 0xF0, 0x03,
+ 0xCF, 0xC1, 0xE0, 0x07, 0xC7, 0xE3, 0xE0, 0x07, 0xC7, 0xE3, 0xE0, 0x07,
+ 0xC3, 0xF3, 0xE0, 0x07, 0xC3, 0xF3, 0xC0, 0x07, 0x81, 0xF7, 0xC0, 0x0F,
+ 0x81, 0xFF, 0xC0, 0x0F, 0x80, 0xFF, 0xC0, 0x0F, 0x80, 0xFF, 0xC0, 0x0F,
+ 0x00, 0xFF, 0x80, 0x0F, 0x00, 0x7F, 0x80, 0x7F, 0xF0, 0x7F, 0x80, 0xFF,
+ 0xF0, 0x3F, 0x80, 0xFF, 0xF0, 0x3F, 0x00, 0xFF, 0xF0, 0x1F, 0x00, 0x7F,
+ 0xE0, 0x1F, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xFF, 0x80, 0x01, 0xFF,
+ 0xF8, 0x00, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF8, 0x0F, 0xF0, 0x7F, 0x83,
+ 0xF8, 0x03, 0xF0, 0xFC, 0x00, 0x7E, 0x1F, 0x00, 0x07, 0xE7, 0xE0, 0x00,
+ 0x7C, 0xF8, 0x00, 0x0F, 0xBE, 0x00, 0x01, 0xF7, 0xC0, 0x00, 0x3E, 0xF0,
+ 0x00, 0x07, 0xFE, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x3E, 0xF8, 0x00, 0x07,
+ 0xDF, 0x00, 0x00, 0xFB, 0xE0, 0x00, 0x3E, 0x7C, 0x00, 0x0F, 0xCF, 0xC0,
+ 0x01, 0xF0, 0xF8, 0x00, 0x7E, 0x1F, 0x80, 0x3F, 0x83, 0xFC, 0x1F, 0xE0,
+ 0x3F, 0xFF, 0xF8, 0x03, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0x00, 0x03, 0xFF,
+ 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xF8,
+ 0x07, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xF0, 0x0F,
+ 0x80, 0x7F, 0x00, 0xF8, 0x01, 0xF0, 0x0F, 0x00, 0x1F, 0x01, 0xF0, 0x01,
+ 0xF0, 0x1F, 0x00, 0x1F, 0x01, 0xF0, 0x03, 0xE0, 0x1E, 0x00, 0x7E, 0x01,
+ 0xE0, 0x0F, 0xC0, 0x3F, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x80, 0x3F, 0xFF,
+ 0xE0, 0x03, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xC0, 0x00, 0x00,
+ 0x7C, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x78, 0x00, 0x00, 0x7F, 0xFF,
+ 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00,
+ 0x7F, 0xFE, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xFF, 0x80, 0x03,
+ 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF8, 0x0F, 0xF0, 0x7F,
+ 0x83, 0xF8, 0x03, 0xF0, 0xFC, 0x00, 0x3F, 0x1F, 0x00, 0x07, 0xE7, 0xC0,
+ 0x00, 0x7D, 0xF8, 0x00, 0x0F, 0xBE, 0x00, 0x01, 0xF7, 0xC0, 0x00, 0x3F,
+ 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x3E, 0xF8, 0x00,
+ 0x07, 0xDF, 0x00, 0x01, 0xFB, 0xE0, 0x00, 0x3E, 0x7E, 0x00, 0x0F, 0x8F,
+ 0xC0, 0x03, 0xF0, 0xFC, 0x01, 0xFC, 0x1F, 0xE0, 0xFF, 0x01, 0xFF, 0xFF,
+ 0xC0, 0x1F, 0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x00, 0x1F, 0xFE, 0x00, 0x01,
+ 0xFE, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1F, 0xF8, 0x38, 0x0F, 0xFF, 0xFF,
+ 0x81, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0x00, 0xF0,
+ 0x1F, 0x80, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFC, 0x01, 0xFF,
+ 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xFF, 0x00, 0x7C, 0x03,
+ 0xF8, 0x03, 0xE0, 0x07, 0xC0, 0x1E, 0x00, 0x3E, 0x00, 0xF0, 0x01, 0xF0,
+ 0x0F, 0x80, 0x1F, 0x80, 0x7C, 0x01, 0xF8, 0x03, 0xE0, 0x3F, 0x80, 0x1F,
+ 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xF8, 0x00, 0x7F, 0xFF,
+ 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x1E, 0x07, 0xF0, 0x01, 0xF0, 0x1F, 0xC0,
+ 0x0F, 0x80, 0x7E, 0x00, 0x7C, 0x03, 0xF8, 0x03, 0xC0, 0x0F, 0xC0, 0xFF,
+ 0xE0, 0x7F, 0xCF, 0xFF, 0x01, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xC0,
+ 0x3F, 0xDF, 0xFC, 0x01, 0xFC, 0x00, 0x0F, 0xE1, 0x80, 0x0F, 0xFF, 0xF0,
+ 0x0F, 0xFF, 0xFC, 0x07, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xC1, 0xFC, 0x0F,
+ 0xE0, 0x7C, 0x01, 0xF8, 0x3E, 0x00, 0x3E, 0x0F, 0x80, 0x0F, 0x03, 0xE0,
+ 0x03, 0xC0, 0xFC, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x07, 0xFF, 0x80, 0x01,
+ 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x07, 0xFE,
+ 0x00, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xE1, 0xE0, 0x00, 0xF8, 0xF8, 0x00,
+ 0x3E, 0x3E, 0x00, 0x1F, 0x8F, 0xC0, 0x0F, 0xC3, 0xFC, 0x0F, 0xF0, 0xFF,
+ 0xFF, 0xF8, 0x3F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFE, 0x03, 0x9F, 0xFE, 0x00,
+ 0x01, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF7, 0xFF,
+ 0xFF, 0xFD, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0x9F, 0x07, 0x83, 0xE7,
+ 0x83, 0xE0, 0xFB, 0xE0, 0xF8, 0x3E, 0xF8, 0x3E, 0x0F, 0x3E, 0x0F, 0x07,
+ 0xCF, 0x07, 0xC1, 0xF3, 0x81, 0xF0, 0x38, 0x00, 0x7C, 0x00, 0x00, 0x1E,
+ 0x00, 0x00, 0x07, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0xF8, 0x00, 0x00,
+ 0x3E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00,
+ 0x00, 0x7C, 0x00, 0x07, 0xFF, 0xF8, 0x01, 0xFF, 0xFE, 0x00, 0xFF, 0xFF,
+ 0x80, 0x3F, 0xFF, 0xE0, 0x07, 0xFF, 0xF0, 0x00, 0x3F, 0xF0, 0x7F, 0xE7,
+ 0xFF, 0x8F, 0xFF, 0x7F, 0xF9, 0xFF, 0xF7, 0xFF, 0x1F, 0xFE, 0x7F, 0xF0,
+ 0xFF, 0xC1, 0xE0, 0x01, 0xF0, 0x1E, 0x00, 0x1F, 0x03, 0xE0, 0x01, 0xF0,
+ 0x3E, 0x00, 0x1F, 0x03, 0xE0, 0x01, 0xE0, 0x3C, 0x00, 0x3E, 0x07, 0xC0,
+ 0x03, 0xE0, 0x7C, 0x00, 0x3E, 0x07, 0xC0, 0x03, 0xC0, 0x7C, 0x00, 0x3C,
+ 0x07, 0x80, 0x07, 0xC0, 0xF8, 0x00, 0x7C, 0x0F, 0x80, 0x07, 0xC0, 0xF8,
+ 0x00, 0x78, 0x0F, 0x80, 0x0F, 0x80, 0xFC, 0x01, 0xF8, 0x0F, 0xC0, 0x3F,
+ 0x00, 0xFF, 0x07, 0xE0, 0x07, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xC0, 0x03,
+ 0xFF, 0xF0, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x7F, 0xF0,
+ 0x1F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFC, 0x0F,
+ 0xFF, 0x7F, 0xE0, 0x3F, 0xF8, 0x7C, 0x00, 0x1F, 0x01, 0xF0, 0x00, 0xF8,
+ 0x07, 0xC0, 0x03, 0xE0, 0x1F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0xF8, 0x00,
+ 0xF8, 0x03, 0xE0, 0x03, 0xE0, 0x1F, 0x00, 0x0F, 0xC0, 0xFC, 0x00, 0x1F,
+ 0x03, 0xE0, 0x00, 0x7C, 0x1F, 0x00, 0x01, 0xF0, 0xFC, 0x00, 0x07, 0xC3,
+ 0xE0, 0x00, 0x1F, 0x9F, 0x00, 0x00, 0x3E, 0xFC, 0x00, 0x00, 0xFB, 0xE0,
+ 0x00, 0x03, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xE0, 0x00,
+ 0x00, 0x7F, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00,
+ 0x1F, 0x00, 0x00, 0x00, 0x7F, 0xF0, 0x3F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
+ 0xFC, 0x1F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0x1E, 0x00,
+ 0x01, 0xE0, 0xF0, 0x7C, 0x1F, 0x0F, 0x87, 0xE0, 0xF0, 0x7C, 0x3F, 0x0F,
+ 0x83, 0xE3, 0xF8, 0x7C, 0x1F, 0x1F, 0xE3, 0xC0, 0xF9, 0xFF, 0x3E, 0x07,
+ 0xCF, 0xF9, 0xF0, 0x3E, 0xFF, 0xCF, 0x01, 0xF7, 0xBE, 0xF8, 0x0F, 0xFD,
+ 0xF7, 0xC0, 0x7B, 0xCF, 0xFC, 0x03, 0xFE, 0x7F, 0xE0, 0x3F, 0xE3, 0xFF,
+ 0x01, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0, 0x7F, 0x80, 0x7F, 0x83, 0xFC, 0x03,
+ 0xF8, 0x1F, 0xC0, 0x1F, 0xC0, 0xFE, 0x00, 0xFC, 0x07, 0xF0, 0x07, 0xE0,
+ 0x3F, 0x00, 0x3E, 0x01, 0xF8, 0x00, 0x01, 0xFE, 0x03, 0xFE, 0x03, 0xFF,
+ 0x07, 0xFF, 0x07, 0xFF, 0x07, 0xFF, 0x07, 0xFE, 0x07, 0xFE, 0x03, 0xFC,
+ 0x03, 0xFC, 0x00, 0xFC, 0x03, 0xF0, 0x00, 0xFE, 0x07, 0xE0, 0x00, 0x7E,
+ 0x1F, 0xC0, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x1F,
+ 0xFC, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07,
+ 0xE0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x7F,
+ 0xF8, 0x00, 0x00, 0xFC, 0xFC, 0x00, 0x01, 0xF8, 0x7E, 0x00, 0x03, 0xF0,
+ 0x7E, 0x00, 0x07, 0xE0, 0x3F, 0x00, 0x0F, 0xC0, 0x1F, 0x80, 0x7F, 0xE0,
+ 0x7F, 0xE0, 0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xE0,
+ 0xFF, 0xE0, 0x7F, 0xC0, 0xFF, 0xC0, 0x7F, 0xC0, 0x7F, 0xFF, 0xF0, 0x3F,
+ 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0x03, 0xFF, 0x7F, 0x80, 0xFF, 0x87, 0xC0,
+ 0x1F, 0x01, 0xF8, 0x0F, 0x80, 0x3E, 0x07, 0xC0, 0x0F, 0xC3, 0xE0, 0x01,
+ 0xF1, 0xF0, 0x00, 0x7E, 0xF8, 0x00, 0x0F, 0xFC, 0x00, 0x03, 0xFE, 0x00,
+ 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x00, 0xF0,
+ 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01,
+ 0xE0, 0x00, 0x00, 0x78, 0x00, 0x07, 0xFF, 0xF0, 0x03, 0xFF, 0xFE, 0x00,
+ 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x00, 0x01, 0xFF,
+ 0xFF, 0xC0, 0x3F, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xE0,
+ 0x3F, 0xFF, 0xFC, 0x07, 0xC0, 0x3F, 0x00, 0xF8, 0x0F, 0xC0, 0x1F, 0x03,
+ 0xF0, 0x03, 0xC0, 0xFC, 0x00, 0xF8, 0x3F, 0x00, 0x0E, 0x0F, 0xC0, 0x00,
+ 0x03, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x1F, 0x80,
+ 0x00, 0x07, 0xE0, 0x00, 0x01, 0xF8, 0x0E, 0x00, 0x7E, 0x03, 0xE0, 0x1F,
+ 0x80, 0x7C, 0x07, 0xE0, 0x0F, 0x01, 0xF8, 0x03, 0xE0, 0x7E, 0x00, 0x7C,
+ 0x1F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFC, 0x0F, 0xFF,
+ 0xFF, 0x81, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0xFF, 0xC0, 0x3F, 0xF0, 0x0F,
+ 0xFC, 0x07, 0xFF, 0x01, 0xFF, 0x80, 0x7C, 0x00, 0x1E, 0x00, 0x07, 0x80,
+ 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x07, 0xC0, 0x01,
+ 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x03, 0xE0, 0x00, 0xF8,
+ 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00,
+ 0x1F, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F,
+ 0x80, 0x03, 0xC0, 0x01, 0xF0, 0x00, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE,
+ 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0x00, 0x20, 0x03, 0xC0, 0x3E, 0x01, 0xF0,
+ 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x3E, 0x01, 0xF0, 0x0F, 0x80,
+ 0x7C, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x0F, 0x80, 0x7C, 0x03,
+ 0xE0, 0x1F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0x7C, 0x03, 0xE0, 0x1F,
+ 0x00, 0xF8, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x1F, 0x00, 0xF8,
+ 0x07, 0xC0, 0x3E, 0x00, 0xF0, 0x07, 0x80, 0x38, 0x00, 0xFF, 0xC0, 0x7F,
+ 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x03, 0xE0, 0x00, 0xF0,
+ 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xE0, 0x00, 0x78, 0x00,
+ 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F,
+ 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x78, 0x00, 0x3E, 0x00, 0x0F, 0x80,
+ 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01,
+ 0xF0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x0F, 0x80, 0x7F, 0xE0, 0x3F, 0xF8,
+ 0x0F, 0xFC, 0x03, 0xFF, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x08, 0x00, 0x01,
+ 0xC0, 0x00, 0x3C, 0x00, 0x07, 0xE0, 0x00, 0xFE, 0x00, 0x1F, 0xF0, 0x03,
+ 0xFF, 0x80, 0xFF, 0xF8, 0x1F, 0xCF, 0xC3, 0xF8, 0xFE, 0x7E, 0x07, 0xEF,
+ 0xC0, 0x3F, 0xF8, 0x03, 0xFF, 0x00, 0x1F, 0xE0, 0x00, 0xE0, 0x7F, 0xFF,
+ 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xEF, 0xFF, 0xFF, 0xFF, 0x00, 0x60, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F,
+ 0x06, 0x00, 0x3F, 0xE0, 0x03, 0xFF, 0xF8, 0x07, 0xFF, 0xFC, 0x07, 0xFF,
+ 0xFE, 0x07, 0xFF, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3E, 0x00, 0x00,
+ 0x3E, 0x00, 0x7F, 0xFE, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, 0xFC, 0x1F, 0xFF,
+ 0xFC, 0x3F, 0xFF, 0xFC, 0x7F, 0x00, 0x78, 0x7C, 0x00, 0x78, 0xF8, 0x00,
+ 0xF8, 0xF8, 0x03, 0xF8, 0xFC, 0x0F, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF,
+ 0xFF, 0x7F, 0xFF, 0xFF, 0x3F, 0xFD, 0xFE, 0x0F, 0xE0, 0x00, 0x03, 0xFC,
+ 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00,
+ 0x00, 0x3F, 0x80, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00,
+ 0x1F, 0x00, 0x00, 0x00, 0xF0, 0xFE, 0x00, 0x0F, 0xBF, 0xFC, 0x00, 0x7F,
+ 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0x00, 0xFF, 0x03,
+ 0xF8, 0x0F, 0xE0, 0x07, 0xE0, 0x7E, 0x00, 0x3F, 0x03, 0xE0, 0x00, 0xF8,
+ 0x1F, 0x00, 0x07, 0xC0, 0xF0, 0x00, 0x3E, 0x0F, 0x80, 0x01, 0xF0, 0x7C,
+ 0x00, 0x1F, 0x03, 0xE0, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0xC0, 0xFC, 0x00,
+ 0x7C, 0x0F, 0xE0, 0x07, 0xE3, 0xFF, 0xC0, 0xFE, 0x3F, 0xFF, 0xFF, 0xE1,
+ 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xE0, 0x7F, 0x9F, 0xFC, 0x00, 0x00,
+ 0x3F, 0x80, 0x00, 0x00, 0x1F, 0xE3, 0x80, 0x7F, 0xFF, 0xC0, 0x7F, 0xFF,
+ 0xE0, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF, 0x01, 0xFC, 0x7E, 0x00,
+ 0x7C, 0x7E, 0x00, 0x3E, 0x3E, 0x00, 0x0E, 0x3E, 0x00, 0x00, 0x1F, 0x00,
+ 0x00, 0x1F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0,
+ 0x00, 0x01, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x0C, 0x7F, 0x80, 0x3F, 0x1F,
+ 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0x00,
+ 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xFE, 0x00, 0x00,
+ 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x3E,
+ 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x7C, 0x00, 0x3F, 0x87, 0xC0, 0x0F,
+ 0xFF, 0x7C, 0x03, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF,
+ 0x81, 0xFC, 0x0F, 0xF8, 0x3F, 0x00, 0x3F, 0x83, 0xE0, 0x01, 0xF0, 0x7C,
+ 0x00, 0x1F, 0x07, 0xC0, 0x01, 0xF0, 0xF8, 0x00, 0x1F, 0x0F, 0x80, 0x01,
+ 0xF0, 0xF8, 0x00, 0x1E, 0x0F, 0x80, 0x03, 0xE0, 0xF8, 0x00, 0x3E, 0x0F,
+ 0xC0, 0x07, 0xE0, 0xFC, 0x00, 0xFE, 0x07, 0xF0, 0x3F, 0xF8, 0x7F, 0xFF,
+ 0xFF, 0xC3, 0xFF, 0xFF, 0xFC, 0x3F, 0xFF, 0xFF, 0xC0, 0xFF, 0xE7, 0xF8,
+ 0x03, 0xF8, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0xF0, 0x03, 0xFF,
+ 0xF8, 0x07, 0xFF, 0xFC, 0x0F, 0xFF, 0xFE, 0x1F, 0xE0, 0x7E, 0x3F, 0x80,
+ 0x1F, 0x3F, 0x00, 0x0F, 0x7E, 0x00, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00,
+ 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x1C, 0x7F, 0x01, 0xFE, 0x7F, 0xFF,
+ 0xFE, 0x3F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, 0x03, 0xFF,
+ 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xF0,
+ 0x00, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xE0, 0x01, 0xF0, 0x00, 0x00, 0x3E,
+ 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x7F, 0xFF, 0xF0,
+ 0x0F, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x00, 0xFF,
+ 0xFF, 0xE0, 0x00, 0x78, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00,
+ 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01,
+ 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1E, 0x00,
+ 0x00, 0x03, 0xE0, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF0, 0x0F,
+ 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFE, 0x00, 0x00, 0x3F,
+ 0x80, 0x00, 0x0F, 0xFE, 0xFF, 0x03, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFF,
+ 0x0F, 0xFF, 0xFF, 0xF1, 0xFC, 0x1F, 0xFE, 0x3F, 0x80, 0x7F, 0x03, 0xE0,
+ 0x03, 0xF0, 0x7E, 0x00, 0x3E, 0x07, 0xC0, 0x03, 0xE0, 0xF8, 0x00, 0x3E,
+ 0x0F, 0x80, 0x03, 0xE0, 0xF8, 0x00, 0x3E, 0x0F, 0x80, 0x03, 0xC0, 0xF8,
+ 0x00, 0x7C, 0x0F, 0xC0, 0x0F, 0xC0, 0xFC, 0x01, 0xFC, 0x07, 0xF0, 0x7F,
+ 0x80, 0x7F, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF8, 0x00,
+ 0xFF, 0xEF, 0x80, 0x03, 0xF0, 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01,
+ 0xF0, 0x00, 0x00, 0x7E, 0x00, 0x1F, 0xFF, 0xE0, 0x03, 0xFF, 0xFC, 0x00,
+ 0x3F, 0xFF, 0x80, 0x03, 0xFF, 0xE0, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x03,
+ 0xF8, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x3F, 0xE0, 0x00,
+ 0x07, 0xF0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0,
+ 0x00, 0x01, 0xF1, 0xF8, 0x00, 0x79, 0xFF, 0x80, 0x1E, 0xFF, 0xF0, 0x0F,
+ 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x80, 0xFF, 0x07, 0xE0, 0x3F, 0x00, 0xF8,
+ 0x1F, 0x80, 0x3E, 0x07, 0xC0, 0x0F, 0x81, 0xF0, 0x03, 0xC0, 0x7C, 0x00,
+ 0xF0, 0x1E, 0x00, 0x7C, 0x0F, 0x80, 0x1F, 0x03, 0xE0, 0x07, 0xC0, 0xF8,
+ 0x01, 0xE0, 0x3C, 0x00, 0xF8, 0x0F, 0x00, 0x3E, 0x1F, 0xF8, 0x3F, 0xEF,
+ 0xFE, 0x1F, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xF0, 0x3F,
+ 0xE0, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3E,
+ 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0xFF, 0xC0, 0x07, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x1F, 0xFC, 0x00,
+ 0x3F, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00,
+ 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x00, 0x01,
+ 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x3F, 0xFF,
+ 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF,
+ 0x80, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xF0, 0x00, 0x07,
+ 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0xFF, 0xFE, 0x07, 0xFF, 0xFC, 0x0F, 0xFF, 0xF8, 0x1F, 0xFF, 0xF0,
+ 0x3F, 0xFF, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00,
+ 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x07, 0xC0, 0x00,
+ 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF8, 0x00, 0x01,
+ 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x3E,
+ 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0xC0,
+ 0xFF, 0xFF, 0x03, 0xFF, 0xFC, 0x07, 0xFF, 0xF0, 0x0F, 0xFF, 0xC0, 0x0F,
+ 0xFC, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0xC0,
+ 0x00, 0x1F, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x0F,
+ 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x3C, 0x3F, 0xF0,
+ 0x1F, 0x1F, 0xFC, 0x07, 0xC7, 0xFF, 0x01, 0xF1, 0xFF, 0xC0, 0x78, 0x7F,
+ 0xE0, 0x1E, 0x7F, 0x80, 0x0F, 0xBF, 0x80, 0x03, 0xFF, 0xC0, 0x00, 0xFF,
+ 0xC0, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xFC, 0x00, 0x07, 0xFF, 0x80, 0x01,
+ 0xF7, 0xF0, 0x00, 0x7C, 0xFE, 0x00, 0x1E, 0x1F, 0xC0, 0x0F, 0x83, 0xF8,
+ 0x1F, 0xE0, 0xFF, 0xEF, 0xF8, 0x3F, 0xFB, 0xFE, 0x1F, 0xFE, 0xFF, 0x07,
+ 0xFF, 0x9F, 0xC0, 0xFF, 0xC0, 0x00, 0x7F, 0xF0, 0x01, 0xFF, 0xC0, 0x03,
+ 0xFF, 0x80, 0x07, 0xFF, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x7C, 0x00, 0x00,
+ 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F,
+ 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0,
+ 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00,
+ 0x00, 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x80, 0x00,
+ 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x7F, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0x00, 0x00, 0x07, 0x81, 0xE0,
+ 0x3F, 0xBF, 0x9F, 0xE1, 0xFF, 0xFE, 0xFF, 0x87, 0xFF, 0xFF, 0xFF, 0x1F,
+ 0xFF, 0xFF, 0xFC, 0x7F, 0xC7, 0xF1, 0xF0, 0x7E, 0x1F, 0x87, 0xC1, 0xF0,
+ 0x7C, 0x1F, 0x07, 0x81, 0xE0, 0x7C, 0x1E, 0x0F, 0x81, 0xE0, 0xF8, 0x3E,
+ 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3C, 0x0F, 0x03,
+ 0xC1, 0xF0, 0x7C, 0x0F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF1,
+ 0xFE, 0x1F, 0x87, 0xEF, 0xFC, 0x7F, 0x1F, 0xFF, 0xF3, 0xFC, 0x7F, 0xFF,
+ 0xCF, 0xF3, 0xFF, 0xFE, 0x3F, 0x8F, 0xE0, 0x00, 0x01, 0xF8, 0x01, 0xF9,
+ 0xFF, 0x80, 0xFE, 0xFF, 0xF0, 0x7F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0x83,
+ 0xFF, 0x07, 0xE0, 0x3F, 0x00, 0xF8, 0x1F, 0x80, 0x3E, 0x07, 0xC0, 0x0F,
+ 0x81, 0xF0, 0x03, 0xC0, 0x7C, 0x00, 0xF0, 0x1E, 0x00, 0x7C, 0x0F, 0x80,
+ 0x1F, 0x03, 0xE0, 0x07, 0xC0, 0xF8, 0x01, 0xE0, 0x3C, 0x00, 0xF8, 0x0F,
+ 0x00, 0x3E, 0x1F, 0xF8, 0x3F, 0xEF, 0xFE, 0x1F, 0xFF, 0xFF, 0x87, 0xFF,
+ 0xFF, 0xE1, 0xFF, 0xFF, 0xF0, 0x3F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x7F,
+ 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF0, 0xFF,
+ 0x03, 0xF8, 0xFE, 0x00, 0xFE, 0x7C, 0x00, 0x3F, 0x7C, 0x00, 0x0F, 0xBE,
+ 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x00, 0xFF,
+ 0xC0, 0x00, 0xFB, 0xE0, 0x00, 0xFD, 0xF8, 0x00, 0x7C, 0xFE, 0x00, 0xFE,
+ 0x3F, 0x81, 0xFE, 0x1F, 0xFF, 0xFE, 0x07, 0xFF, 0xFE, 0x01, 0xFF, 0xFC,
+ 0x00, 0x7F, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x07,
+ 0xF9, 0xFF, 0xC0, 0x1F, 0xF7, 0xFF, 0xC0, 0x3F, 0xFF, 0xFF, 0xC0, 0x7F,
+ 0xFF, 0xFF, 0xC0, 0x7F, 0xF0, 0x3F, 0x80, 0x3F, 0x80, 0x1F, 0x80, 0x7E,
+ 0x00, 0x3F, 0x00, 0xF8, 0x00, 0x3E, 0x01, 0xF0, 0x00, 0x7C, 0x03, 0xC0,
+ 0x00, 0xF8, 0x0F, 0x80, 0x01, 0xF0, 0x1F, 0x00, 0x07, 0xE0, 0x3E, 0x00,
+ 0x0F, 0x80, 0x7C, 0x00, 0x3F, 0x01, 0xFC, 0x00, 0xFC, 0x03, 0xFE, 0x07,
+ 0xF8, 0x07, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0x80, 0x1E, 0xFF, 0xFC,
+ 0x00, 0x7C, 0xFF, 0xF0, 0x00, 0xF8, 0x7F, 0x00, 0x01, 0xF0, 0x00, 0x00,
+ 0x03, 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01,
+ 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x1F,
+ 0xFF, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00,
+ 0x07, 0xFF, 0x3F, 0xC0, 0xFF, 0xFD, 0xFE, 0x0F, 0xFF, 0xFF, 0xF0, 0xFF,
+ 0xFF, 0xFF, 0x8F, 0xE0, 0x7F, 0xF8, 0xFC, 0x00, 0xFE, 0x07, 0xC0, 0x03,
+ 0xE0, 0x7C, 0x00, 0x1F, 0x03, 0xE0, 0x00, 0xF8, 0x1E, 0x00, 0x07, 0xC1,
+ 0xF0, 0x00, 0x3E, 0x0F, 0x80, 0x01, 0xE0, 0x7C, 0x00, 0x1F, 0x03, 0xF0,
+ 0x01, 0xF8, 0x1F, 0x80, 0x1F, 0xC0, 0xFF, 0x03, 0xFC, 0x03, 0xFF, 0xFF,
+ 0xE0, 0x1F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xF8, 0x00, 0xFF, 0xE7, 0xC0,
+ 0x01, 0xFC, 0x3C, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x1F, 0x00, 0x00,
+ 0x00, 0xF8, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x7F,
+ 0xFE, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0xFF, 0xF0,
+ 0x00, 0x00, 0x00, 0x0F, 0x80, 0x3F, 0xC3, 0xFE, 0x07, 0xFC, 0xFF, 0xE0,
+ 0x7F, 0xDF, 0xFF, 0x07, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0x1C, 0x00, 0x7F,
+ 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xC0, 0x00,
+ 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1F,
+ 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x01, 0xE0, 0x00,
+ 0x07, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x00, 0xFF,
+ 0xFF, 0xF0, 0x07, 0xFF, 0xFE, 0x00, 0x00, 0x3F, 0xCE, 0x03, 0xFF, 0xFC,
+ 0x0F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC3, 0xF8, 0x0F, 0x87,
+ 0xC0, 0x0E, 0x0F, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xFF, 0x80, 0x3F,
+ 0xFF, 0xC0, 0x3F, 0xFF, 0xC0, 0x1F, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0x00,
+ 0x3F, 0x1C, 0x00, 0x3E, 0x7C, 0x00, 0x7C, 0xFC, 0x03, 0xF3, 0xFF, 0xFF,
+ 0xE7, 0xFF, 0xFF, 0x8F, 0xFF, 0xFE, 0x1F, 0xFF, 0xF0, 0x00, 0xFF, 0x00,
+ 0x00, 0x03, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07,
+ 0x80, 0x00, 0x78, 0x00, 0x7F, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xE0, 0x00,
+ 0x1E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3C, 0x00,
+ 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7E, 0x00, 0xF7, 0xFF,
+ 0xFF, 0x7F, 0xFF, 0xF3, 0xFF, 0xFE, 0x1F, 0xFF, 0x80, 0x7F, 0x80, 0x7F,
+ 0x01, 0xFF, 0xFE, 0x07, 0xFF, 0xF8, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0xE0,
+ 0x3F, 0xC7, 0xC0, 0x07, 0x8F, 0x80, 0x1F, 0x3E, 0x00, 0x3E, 0x7C, 0x00,
+ 0x7C, 0xF8, 0x00, 0xF1, 0xF0, 0x03, 0xE3, 0xE0, 0x07, 0xC7, 0xC0, 0x0F,
+ 0x8F, 0x80, 0x1F, 0x1F, 0x00, 0x7C, 0x3E, 0x01, 0xF8, 0x7E, 0x0F, 0xFC,
+ 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xF1, 0xFF, 0xEF, 0xE1, 0xFF, 0xBF, 0x80,
+ 0xFC, 0x00, 0x00, 0x7F, 0xF0, 0x7F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF0,
+ 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xE0, 0xFF, 0xE1, 0xF8, 0x03, 0xE0,
+ 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x07, 0xC0, 0x0F, 0x80, 0xF8, 0x00, 0xFC,
+ 0x1F, 0x80, 0x07, 0xC1, 0xF0, 0x00, 0x7C, 0x3E, 0x00, 0x07, 0xE7, 0xE0,
+ 0x00, 0x3E, 0x7C, 0x00, 0x03, 0xEF, 0x80, 0x00, 0x3F, 0xF0, 0x00, 0x03,
+ 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x1F, 0xC0,
+ 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7F, 0xC0, 0x1F, 0xEF, 0xFC, 0x03, 0xFF,
+ 0xFF, 0xC0, 0x7F, 0xFF, 0xFC, 0x07, 0xFE, 0x7F, 0x80, 0x3F, 0xC3, 0xE1,
+ 0xF0, 0xF8, 0x3E, 0x3F, 0x0F, 0x03, 0xE3, 0xF1, 0xF0, 0x3E, 0x7F, 0x1E,
+ 0x03, 0xE7, 0xF3, 0xE0, 0x3E, 0xFF, 0xBC, 0x03, 0xFF, 0xFF, 0xC0, 0x3F,
+ 0xFF, 0xFC, 0x03, 0xFE, 0xFF, 0x80, 0x3F, 0xEF, 0xF8, 0x03, 0xFC, 0xFF,
+ 0x00, 0x3F, 0x8F, 0xF0, 0x03, 0xF8, 0x7E, 0x00, 0x3F, 0x07, 0xE0, 0x01,
+ 0xF0, 0x7C, 0x00, 0x1E, 0x07, 0xC0, 0x00, 0x03, 0xFE, 0x0F, 0xF8, 0x3F,
+ 0xF0, 0xFF, 0xC1, 0xFF, 0x8F, 0xFE, 0x0F, 0xFC, 0x7F, 0xF0, 0x7F, 0xC1,
+ 0xFF, 0x00, 0xFE, 0x1F, 0xC0, 0x03, 0xF9, 0xFC, 0x00, 0x0F, 0xFF, 0xC0,
+ 0x00, 0x3F, 0xF8, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00,
+ 0x7F, 0xE0, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0xFE, 0xFE, 0x00, 0x0F, 0xE3,
+ 0xF8, 0x00, 0xFE, 0x0F, 0xE0, 0x3F, 0xE0, 0x7F, 0xC3, 0xFF, 0x87, 0xFF,
+ 0x3F, 0xFC, 0x7F, 0xF9, 0xFF, 0xE3, 0xFF, 0x87, 0xFE, 0x0F, 0xF8, 0x00,
+ 0x01, 0xFE, 0x03, 0xFE, 0x03, 0xFF, 0x07, 0xFF, 0x07, 0xFF, 0x07, 0xFF,
+ 0x07, 0xFF, 0x07, 0xFE, 0x03, 0xFC, 0x03, 0xFC, 0x01, 0xF8, 0x01, 0xF0,
+ 0x00, 0xF8, 0x03, 0xF0, 0x00, 0xF8, 0x03, 0xE0, 0x00, 0xFC, 0x07, 0xC0,
+ 0x00, 0x7C, 0x0F, 0x80, 0x00, 0x7C, 0x0F, 0x80, 0x00, 0x7E, 0x1F, 0x00,
+ 0x00, 0x7E, 0x3E, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x00, 0x3E, 0x7C, 0x00,
+ 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x1F, 0xE0, 0x00,
+ 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00,
+ 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00,
+ 0x00, 0x7C, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00,
+ 0x07, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF,
+ 0xE0, 0xFF, 0xFF, 0xE0, 0x7C, 0x0F, 0xE0, 0x3C, 0x0F, 0xE0, 0x1E, 0x0F,
+ 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x1F,
+ 0x80, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, 0xF0, 0x3F,
+ 0x00, 0xF8, 0x3F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFE, 0x0F,
+ 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0x80, 0x00, 0x0F, 0x00, 0x1F, 0xC0, 0x1F,
+ 0xE0, 0x1F, 0xF0, 0x0F, 0xE0, 0x0F, 0xC0, 0x07, 0xC0, 0x07, 0xC0, 0x03,
+ 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x78, 0x00, 0x7C, 0x00, 0x3E, 0x00,
+ 0x1F, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x3F, 0x80, 0x3F, 0xC0, 0x1F, 0xC0,
+ 0x0F, 0xE0, 0x07, 0xF8, 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F,
+ 0x80, 0x07, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00,
+ 0x7E, 0x00, 0x3F, 0x80, 0x1F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x00, 0x78,
+ 0x00, 0x01, 0xE0, 0x3C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0x80, 0xF0, 0x3E,
+ 0x07, 0xC0, 0xF0, 0x1E, 0x03, 0xC0, 0xF8, 0x1F, 0x03, 0xC0, 0x78, 0x0F,
+ 0x03, 0xE0, 0x7C, 0x0F, 0x01, 0xE0, 0x3C, 0x0F, 0x81, 0xF0, 0x3C, 0x07,
+ 0x80, 0xF0, 0x3E, 0x07, 0xC0, 0xF0, 0x1E, 0x07, 0xC0, 0xF8, 0x1F, 0x03,
+ 0xC0, 0x70, 0x00, 0x00, 0xF0, 0x00, 0xFC, 0x00, 0x7F, 0x00, 0x3F, 0xC0,
+ 0x0F, 0xE0, 0x03, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F,
+ 0x00, 0x0F, 0x80, 0x07, 0x80, 0x03, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00,
+ 0xF8, 0x00, 0x7E, 0x00, 0x3F, 0xC0, 0x0F, 0xE0, 0x07, 0xF0, 0x07, 0xF8,
+ 0x07, 0xF8, 0x03, 0xE0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF0, 0x00, 0x78,
+ 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x00, 0x1F, 0x80, 0x7F,
+ 0xC0, 0x7F, 0xC0, 0x3F, 0xC0, 0x1F, 0xC0, 0x07, 0x80, 0x00, 0x03, 0xE0,
+ 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0xE0, 0x39, 0xFF, 0xE0, 0xF7, 0xFF, 0xE7,
+ 0xFF, 0xCF, 0xFF, 0xFE, 0x0F, 0xFF, 0x38, 0x0F, 0xFC, 0x00, 0x0F, 0xE0,
+ 0x00, 0x0F, 0x80 };
+
+const GFXglyph FreeMonoBoldOblique24pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 28, 0, 1 }, // 0x20 ' '
+ { 0, 12, 31, 28, 12, -29 }, // 0x21 '!'
+ { 47, 17, 14, 28, 11, -28 }, // 0x22 '"'
+ { 77, 24, 34, 28, 5, -30 }, // 0x23 '#'
+ { 179, 25, 38, 28, 4, -31 }, // 0x24 '$'
+ { 298, 22, 30, 28, 6, -28 }, // 0x25 '%'
+ { 381, 21, 28, 28, 5, -26 }, // 0x26 '&'
+ { 455, 7, 14, 28, 16, -28 }, // 0x27 '''
+ { 468, 14, 37, 28, 14, -29 }, // 0x28 '('
+ { 533, 14, 37, 28, 5, -29 }, // 0x29 ')'
+ { 598, 21, 19, 28, 8, -28 }, // 0x2A '*'
+ { 648, 24, 26, 28, 5, -25 }, // 0x2B '+'
+ { 726, 12, 14, 28, 6, -6 }, // 0x2C ','
+ { 747, 24, 5, 28, 5, -15 }, // 0x2D '-'
+ { 762, 7, 6, 28, 11, -4 }, // 0x2E '.'
+ { 768, 28, 38, 28, 3, -32 }, // 0x2F '/'
+ { 901, 23, 31, 28, 6, -29 }, // 0x30 '0'
+ { 991, 21, 30, 28, 4, -29 }, // 0x31 '1'
+ { 1070, 26, 30, 28, 3, -29 }, // 0x32 '2'
+ { 1168, 25, 31, 28, 4, -29 }, // 0x33 '3'
+ { 1265, 22, 28, 28, 5, -27 }, // 0x34 '4'
+ { 1342, 25, 31, 28, 4, -29 }, // 0x35 '5'
+ { 1439, 24, 31, 28, 7, -29 }, // 0x36 '6'
+ { 1532, 22, 30, 28, 9, -29 }, // 0x37 '7'
+ { 1615, 23, 31, 28, 6, -29 }, // 0x38 '8'
+ { 1705, 24, 31, 28, 5, -29 }, // 0x39 '9'
+ { 1798, 10, 22, 28, 11, -20 }, // 0x3A ':'
+ { 1826, 15, 28, 28, 5, -20 }, // 0x3B ';'
+ { 1879, 25, 21, 28, 5, -23 }, // 0x3C '<'
+ { 1945, 26, 14, 28, 4, -19 }, // 0x3D '='
+ { 1991, 25, 22, 28, 4, -23 }, // 0x3E '>'
+ { 2060, 19, 29, 28, 10, -27 }, // 0x3F '?'
+ { 2129, 23, 36, 28, 5, -28 }, // 0x40 '@'
+ { 2233, 30, 27, 28, 0, -26 }, // 0x41 'A'
+ { 2335, 29, 27, 28, 1, -26 }, // 0x42 'B'
+ { 2433, 28, 29, 28, 3, -27 }, // 0x43 'C'
+ { 2535, 28, 27, 28, 1, -26 }, // 0x44 'D'
+ { 2630, 29, 27, 28, 1, -26 }, // 0x45 'E'
+ { 2728, 31, 27, 28, 0, -26 }, // 0x46 'F'
+ { 2833, 28, 29, 28, 3, -27 }, // 0x47 'G'
+ { 2935, 30, 27, 28, 1, -26 }, // 0x48 'H'
+ { 3037, 25, 27, 28, 3, -26 }, // 0x49 'I'
+ { 3122, 31, 28, 28, 0, -26 }, // 0x4A 'J'
+ { 3231, 31, 27, 28, 0, -26 }, // 0x4B 'K'
+ { 3336, 27, 27, 28, 1, -26 }, // 0x4C 'L'
+ { 3428, 34, 27, 28, 0, -26 }, // 0x4D 'M'
+ { 3543, 32, 27, 28, 1, -26 }, // 0x4E 'N'
+ { 3651, 27, 29, 28, 3, -27 }, // 0x4F 'O'
+ { 3749, 28, 27, 28, 1, -26 }, // 0x50 'P'
+ { 3844, 27, 35, 28, 3, -27 }, // 0x51 'Q'
+ { 3963, 29, 27, 28, 0, -26 }, // 0x52 'R'
+ { 4061, 26, 29, 28, 3, -27 }, // 0x53 'S'
+ { 4156, 26, 27, 28, 4, -26 }, // 0x54 'T'
+ { 4244, 28, 28, 28, 4, -26 }, // 0x55 'U'
+ { 4342, 30, 27, 28, 2, -26 }, // 0x56 'V'
+ { 4444, 29, 27, 28, 3, -26 }, // 0x57 'W'
+ { 4542, 32, 27, 28, 0, -26 }, // 0x58 'X'
+ { 4650, 26, 27, 28, 4, -26 }, // 0x59 'Y'
+ { 4738, 27, 27, 28, 2, -26 }, // 0x5A 'Z'
+ { 4830, 18, 37, 28, 10, -29 }, // 0x5B '['
+ { 4914, 13, 38, 28, 10, -32 }, // 0x5C '\'
+ { 4976, 18, 37, 28, 5, -29 }, // 0x5D ']'
+ { 5060, 20, 15, 28, 8, -29 }, // 0x5E '^'
+ { 5098, 29, 5, 28, -2, 5 }, // 0x5F '_'
+ { 5117, 8, 8, 28, 13, -30 }, // 0x60 '`'
+ { 5125, 24, 23, 28, 3, -21 }, // 0x61 'a'
+ { 5194, 29, 31, 28, 0, -29 }, // 0x62 'b'
+ { 5307, 25, 23, 28, 3, -21 }, // 0x63 'c'
+ { 5379, 28, 31, 28, 3, -29 }, // 0x64 'd'
+ { 5488, 24, 23, 28, 3, -21 }, // 0x65 'e'
+ { 5557, 28, 30, 28, 4, -29 }, // 0x66 'f'
+ { 5662, 28, 31, 28, 3, -21 }, // 0x67 'g'
+ { 5771, 26, 30, 28, 2, -29 }, // 0x68 'h'
+ { 5869, 23, 29, 28, 3, -28 }, // 0x69 'i'
+ { 5953, 23, 38, 28, 3, -28 }, // 0x6A 'j'
+ { 6063, 26, 30, 28, 2, -29 }, // 0x6B 'k'
+ { 6161, 23, 30, 28, 3, -29 }, // 0x6C 'l'
+ { 6248, 30, 22, 28, 0, -21 }, // 0x6D 'm'
+ { 6331, 26, 22, 28, 2, -21 }, // 0x6E 'n'
+ { 6403, 25, 23, 28, 3, -21 }, // 0x6F 'o'
+ { 6475, 31, 31, 28, -1, -21 }, // 0x70 'p'
+ { 6596, 29, 31, 28, 2, -21 }, // 0x71 'q'
+ { 6709, 28, 22, 28, 2, -21 }, // 0x72 'r'
+ { 6786, 23, 23, 28, 4, -21 }, // 0x73 's'
+ { 6853, 20, 28, 28, 5, -26 }, // 0x74 't'
+ { 6923, 23, 22, 28, 5, -20 }, // 0x75 'u'
+ { 6987, 28, 21, 28, 3, -20 }, // 0x76 'v'
+ { 7061, 28, 21, 28, 3, -20 }, // 0x77 'w'
+ { 7135, 29, 21, 28, 1, -20 }, // 0x78 'x'
+ { 7212, 32, 30, 28, -1, -20 }, // 0x79 'y'
+ { 7332, 25, 21, 28, 4, -20 }, // 0x7A 'z'
+ { 7398, 17, 37, 28, 10, -29 }, // 0x7B '{'
+ { 7477, 11, 36, 28, 11, -28 }, // 0x7C '|'
+ { 7527, 17, 37, 28, 6, -29 }, // 0x7D '}'
+ { 7606, 23, 10, 28, 5, -17 } }; // 0x7E '~'
+
+const GFXfont FreeMonoBoldOblique24pt7b PROGMEM = {
+ (uint8_t *)FreeMonoBoldOblique24pt7bBitmaps,
+ (GFXglyph *)FreeMonoBoldOblique24pt7bGlyphs,
+ 0x20, 0x7E, 47 };
+
+// Approx. 8307 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBoldOblique9pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBoldOblique9pt7b.h
new file mode 100644
index 000000000000..b530723a345c
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoBoldOblique9pt7b.h
@@ -0,0 +1,203 @@
+const uint8_t FreeMonoBoldOblique9pt7bBitmaps[] PROGMEM = {
+ 0x39, 0xCC, 0x67, 0x31, 0x8C, 0x07, 0x38, 0x6C, 0xD9, 0x36, 0x48, 0x80,
+ 0x09, 0x0D, 0x86, 0xCF, 0xF7, 0xF9, 0xB3, 0xFD, 0xFE, 0x6C, 0x36, 0x1B,
+ 0x00, 0x00, 0x06, 0x07, 0x07, 0xE6, 0x33, 0x01, 0xE0, 0x7C, 0x06, 0x43,
+ 0x33, 0xBF, 0x83, 0x03, 0x00, 0x80, 0x1C, 0x11, 0x10, 0x88, 0x83, 0xB8,
+ 0xF3, 0xB8, 0x22, 0x21, 0x11, 0x07, 0x00, 0x0F, 0x1F, 0x30, 0x30, 0x38,
+ 0x7B, 0xDF, 0xCE, 0xFF, 0x7E, 0xFA, 0x80, 0x19, 0x8C, 0xC6, 0x63, 0x18,
+ 0xC6, 0x31, 0xC6, 0x30, 0x31, 0xC6, 0x31, 0x8C, 0x63, 0x31, 0x98, 0xCC,
+ 0x40, 0x08, 0x08, 0xFF, 0xFF, 0x38, 0x6C, 0x6C, 0x0C, 0x06, 0x03, 0x1F,
+ 0xFF, 0xF8, 0xC0, 0x60, 0x30, 0x10, 0x00, 0x36, 0x4C, 0x80, 0xFF, 0xFF,
+ 0xC0, 0xFC, 0x00, 0x00, 0x0C, 0x03, 0x00, 0xC0, 0x18, 0x06, 0x01, 0x80,
+ 0x30, 0x0C, 0x03, 0x00, 0x60, 0x18, 0x06, 0x00, 0xC0, 0x30, 0x00, 0x0F,
+ 0x0F, 0xCC, 0x6C, 0x36, 0x1B, 0x0D, 0x05, 0x86, 0xC3, 0x63, 0x3F, 0x8F,
+ 0x00, 0x06, 0x1C, 0x3C, 0x6C, 0x0C, 0x0C, 0x08, 0x18, 0x18, 0x18, 0xFE,
+ 0xFE, 0x07, 0x83, 0xF1, 0x8C, 0x43, 0x00, 0xC0, 0xE0, 0x70, 0x38, 0x38,
+ 0x1C, 0x6F, 0xF3, 0xFC, 0x1F, 0x1F, 0xC0, 0x60, 0x30, 0x30, 0x70, 0x38,
+ 0x06, 0x03, 0x03, 0xBF, 0x9F, 0x80, 0x03, 0x07, 0x0B, 0x1B, 0x32, 0x66,
+ 0xFF, 0xFF, 0x1E, 0x1E, 0x3F, 0x9F, 0x98, 0x0F, 0xC7, 0xF3, 0x18, 0x0C,
+ 0x06, 0x06, 0x7F, 0x1E, 0x00, 0x07, 0x87, 0xCE, 0x06, 0x06, 0x03, 0xF3,
+ 0xFD, 0xC6, 0xC3, 0x63, 0xBF, 0x8F, 0x80, 0xFF, 0xFF, 0xC3, 0x06, 0x06,
+ 0x0C, 0x18, 0x18, 0x30, 0x30, 0x60, 0x1F, 0x1F, 0xDC, 0x6C, 0x36, 0x31,
+ 0xF1, 0xF8, 0xC6, 0xC3, 0x63, 0xBF, 0x8F, 0x80, 0x1E, 0x3F, 0x33, 0x63,
+ 0x63, 0x67, 0x7F, 0x3E, 0x06, 0x1C, 0xF8, 0xF0, 0x77, 0x00, 0x00, 0xEE,
+ 0x1C, 0x70, 0x00, 0x00, 0x03, 0x0C, 0x61, 0x08, 0x00, 0x00, 0xC1, 0xE1,
+ 0xE1, 0xE0, 0xF0, 0x07, 0x00, 0xF0, 0x0C, 0x7F, 0xDF, 0xF0, 0x00, 0x00,
+ 0x7F, 0xFF, 0xF0, 0x30, 0x0F, 0x00, 0xE0, 0x1E, 0x07, 0xC7, 0x87, 0x83,
+ 0x00, 0x7D, 0xFF, 0x18, 0x30, 0xE3, 0x9C, 0x30, 0x01, 0xC3, 0x80, 0x0F,
+ 0x0F, 0xCC, 0x6C, 0x36, 0x72, 0x79, 0x7D, 0xB6, 0xDA, 0x6F, 0xB3, 0xD8,
+ 0x0C, 0x07, 0xE1, 0xE0, 0x0F, 0x83, 0xF0, 0x1E, 0x03, 0xC0, 0xD8, 0x31,
+ 0x87, 0xF1, 0xFE, 0x30, 0xDF, 0x3F, 0xC7, 0x80, 0x3F, 0xC7, 0xFC, 0x61,
+ 0x8C, 0x31, 0xFC, 0x3F, 0x84, 0x19, 0x83, 0x30, 0x6F, 0xFB, 0xFE, 0x00,
+ 0x0F, 0xF1, 0xFF, 0x30, 0x66, 0x06, 0x60, 0x0C, 0x00, 0xC0, 0x0C, 0x00,
+ 0xE0, 0xC7, 0xF8, 0x3F, 0x00, 0x3F, 0x87, 0xF8, 0x63, 0x8C, 0x31, 0x06,
+ 0x60, 0xCC, 0x19, 0x86, 0x31, 0xCF, 0xF3, 0xF8, 0x00, 0x3F, 0xE3, 0xFE,
+ 0x18, 0x61, 0xB6, 0x1F, 0x01, 0xF0, 0x32, 0x03, 0x00, 0x30, 0x4F, 0xFC,
+ 0xFF, 0xC0, 0x3F, 0xF3, 0xFE, 0x18, 0x61, 0xB6, 0x1F, 0x03, 0xF0, 0x32,
+ 0x03, 0x00, 0x30, 0x0F, 0xC0, 0xFC, 0x00, 0x0F, 0xE3, 0xFC, 0xC1, 0x30,
+ 0x06, 0x01, 0x80, 0x31, 0xF6, 0x3E, 0xE1, 0x9F, 0xF0, 0xF8, 0x00, 0x1E,
+ 0xF3, 0xCF, 0x18, 0x61, 0x84, 0x10, 0xC3, 0xFC, 0x3F, 0xC3, 0x08, 0x31,
+ 0x8F, 0xBC, 0xFB, 0xC0, 0x3F, 0xCF, 0xF0, 0x60, 0x10, 0x0C, 0x03, 0x00,
+ 0xC0, 0x20, 0x18, 0x3F, 0xCF, 0xF0, 0x07, 0xF0, 0x7F, 0x00, 0x80, 0x18,
+ 0x01, 0x80, 0x18, 0x61, 0x84, 0x10, 0xC3, 0x0F, 0xE0, 0x7C, 0x00, 0x3E,
+ 0xE7, 0xFC, 0x66, 0x0D, 0x81, 0x60, 0x7C, 0x0E, 0xC1, 0x98, 0x31, 0x1F,
+ 0x3B, 0xE7, 0x00, 0x3F, 0x07, 0xE0, 0x30, 0x06, 0x00, 0xC0, 0x10, 0x06,
+ 0x00, 0xC3, 0x18, 0x6F, 0xFB, 0xFF, 0x00, 0x38, 0x39, 0xC3, 0xC7, 0x3C,
+ 0x79, 0xE3, 0xDA, 0x1F, 0xF0, 0x9D, 0x8C, 0xCC, 0x60, 0x67, 0xCF, 0x3C,
+ 0x78, 0x3C, 0xF9, 0xE7, 0x87, 0x18, 0x3C, 0xC1, 0x66, 0x1B, 0xB0, 0xCD,
+ 0x06, 0x78, 0x31, 0xC3, 0xCE, 0x3E, 0x30, 0x0F, 0x0F, 0xE7, 0x1D, 0x83,
+ 0xC0, 0xF0, 0x3C, 0x0F, 0x06, 0xE3, 0x9F, 0xC3, 0xC0, 0x3F, 0xC7, 0xFC,
+ 0x61, 0x8C, 0x31, 0x8E, 0x3F, 0x87, 0xE1, 0x80, 0x30, 0x0F, 0xC3, 0xF0,
+ 0x00, 0x0F, 0x0F, 0xE7, 0x1D, 0x83, 0xC0, 0xF0, 0x3C, 0x0F, 0x06, 0xE3,
+ 0x1F, 0xC3, 0xC0, 0x80, 0x7F, 0x3F, 0xC0, 0x3F, 0xC3, 0xFE, 0x18, 0x61,
+ 0x86, 0x10, 0xE3, 0xFC, 0x3F, 0x83, 0x18, 0x31, 0xCF, 0x8F, 0xF8, 0x70,
+ 0x1E, 0xCF, 0xF7, 0x19, 0x80, 0x70, 0x1F, 0x81, 0xF3, 0x0C, 0xC3, 0x3F,
+ 0x8B, 0xC0, 0x7F, 0xCF, 0xF9, 0x93, 0x66, 0x60, 0xC0, 0x18, 0x02, 0x00,
+ 0xC0, 0x18, 0x0F, 0xC1, 0xF8, 0x00, 0xF9, 0xFF, 0x7D, 0x83, 0x30, 0x64,
+ 0x09, 0x83, 0x30, 0x66, 0x0C, 0xE3, 0x0F, 0xC0, 0xF0, 0x00, 0xF9, 0xFE,
+ 0x3D, 0x83, 0x30, 0xC6, 0x30, 0xE6, 0x0D, 0x81, 0xB0, 0x3C, 0x07, 0x00,
+ 0x60, 0x00, 0xF9, 0xFF, 0x3D, 0x83, 0x36, 0x64, 0xC8, 0xBF, 0x35, 0xE7,
+ 0xB8, 0xE7, 0x1C, 0xE3, 0x18, 0x00, 0x3C, 0xF3, 0xCF, 0x1C, 0xC0, 0xD8,
+ 0x0F, 0x00, 0x60, 0x0F, 0x01, 0xB8, 0x31, 0x8F, 0x3C, 0xF3, 0xC0, 0x79,
+ 0xEE, 0x38, 0xC6, 0x19, 0x81, 0xE0, 0x38, 0x06, 0x00, 0xC0, 0x18, 0x0F,
+ 0xC3, 0xF8, 0x00, 0x3F, 0xCF, 0xF3, 0x18, 0xCC, 0x06, 0x03, 0x01, 0x80,
+ 0xC6, 0x61, 0xBF, 0xCF, 0xF0, 0x1E, 0x3C, 0xC1, 0x83, 0x06, 0x08, 0x30,
+ 0x60, 0xC1, 0x06, 0x0F, 0x1E, 0x00, 0x06, 0x31, 0x86, 0x31, 0x8C, 0x31,
+ 0x8C, 0x61, 0x8C, 0x60, 0x1E, 0x78, 0x30, 0x60, 0xC1, 0x86, 0x0C, 0x18,
+ 0x30, 0x41, 0x8F, 0x1E, 0x00, 0x08, 0x1C, 0x3C, 0x76, 0xE7, 0xC3, 0x7F,
+ 0xFF, 0xFC, 0x88, 0x80, 0x0F, 0x07, 0xE1, 0xF9, 0xFE, 0xE3, 0x30, 0xCF,
+ 0xFD, 0xFF, 0x38, 0x07, 0x00, 0x60, 0x0F, 0xC1, 0xFC, 0x71, 0xCC, 0x19,
+ 0x83, 0x30, 0xDF, 0xFB, 0xBC, 0x00, 0x1F, 0xCF, 0xF6, 0x1B, 0x00, 0xC0,
+ 0x30, 0x0F, 0xF1, 0xF8, 0x01, 0xE0, 0x38, 0x03, 0x0F, 0x63, 0xFC, 0xC3,
+ 0x30, 0x66, 0x0C, 0xC3, 0x9F, 0xF9, 0xF7, 0x00, 0x1F, 0x1F, 0xD8, 0x3F,
+ 0xFF, 0xFE, 0x1B, 0xFC, 0xF8, 0x07, 0xC3, 0xF1, 0x81, 0xFE, 0x7F, 0x84,
+ 0x03, 0x00, 0xC0, 0x30, 0x3F, 0x8F, 0xE0, 0x1E, 0xE7, 0xFD, 0x86, 0x60,
+ 0xCC, 0x19, 0xC6, 0x3F, 0xC1, 0xD8, 0x03, 0x00, 0xE1, 0xF8, 0x3E, 0x00,
+ 0x38, 0x1E, 0x01, 0x00, 0xDC, 0x3F, 0x8C, 0x62, 0x19, 0x84, 0x63, 0x3D,
+ 0xFF, 0x7C, 0x06, 0x03, 0x00, 0x03, 0xC3, 0xE0, 0x20, 0x30, 0x18, 0x0C,
+ 0x3F, 0xFF, 0xE0, 0x01, 0x81, 0x80, 0x07, 0xF3, 0xF8, 0x0C, 0x04, 0x06,
+ 0x03, 0x01, 0x80, 0xC0, 0x40, 0x67, 0xE3, 0xE0, 0x38, 0x0E, 0x01, 0x80,
+ 0x4F, 0x37, 0xCF, 0x83, 0xC0, 0xF0, 0x26, 0x39, 0xEE, 0x78, 0x1F, 0x0F,
+ 0x01, 0x80, 0xC0, 0x60, 0x20, 0x30, 0x18, 0x0C, 0x3F, 0xFF, 0xE0, 0x7E,
+ 0xE7, 0xFF, 0x33, 0x32, 0x63, 0x66, 0x36, 0x62, 0xF7, 0x7F, 0x67, 0x77,
+ 0x8F, 0xF8, 0xC3, 0x10, 0x66, 0x08, 0xC3, 0x3C, 0x7F, 0x8F, 0x1F, 0x0F,
+ 0xE6, 0x1F, 0x03, 0xC0, 0xF8, 0x67, 0xF0, 0xF8, 0x3F, 0xE3, 0xFF, 0x1C,
+ 0x31, 0x83, 0x18, 0x31, 0x86, 0x3F, 0xE3, 0x78, 0x30, 0x03, 0x00, 0xFC,
+ 0x0F, 0x80, 0x1E, 0xEF, 0xFD, 0x86, 0x60, 0xCC, 0x19, 0xC7, 0x3F, 0xE1,
+ 0xE8, 0x03, 0x00, 0x60, 0x3E, 0x07, 0xC0, 0x39, 0xDF, 0xF1, 0xC0, 0x60,
+ 0x10, 0x0C, 0x0F, 0xF3, 0xF8, 0x1F, 0x7F, 0x63, 0x7E, 0x1F, 0xC3, 0xFE,
+ 0xFC, 0x10, 0x08, 0x0C, 0x1F, 0xEF, 0xF1, 0x80, 0x80, 0xC0, 0x60, 0x3F,
+ 0x8F, 0x80, 0xF3, 0xFC, 0xF6, 0x09, 0x86, 0x61, 0x98, 0xE7, 0xF8, 0xFE,
+ 0xFB, 0xFF, 0x7C, 0xC6, 0x19, 0x83, 0x60, 0x6C, 0x07, 0x00, 0xC0, 0xF1,
+ 0xFE, 0x3D, 0xB3, 0x37, 0xC7, 0xF8, 0xEE, 0x1D, 0xC3, 0x30, 0x79, 0xEF,
+ 0x38, 0xEE, 0x0F, 0x01, 0xE0, 0x6E, 0x3C, 0xE7, 0xBC, 0x3C, 0xF3, 0x8F,
+ 0x18, 0xC1, 0x9C, 0x19, 0x81, 0xF0, 0x0E, 0x00, 0xE0, 0x0C, 0x01, 0x80,
+ 0xFC, 0x0F, 0xC0, 0x7F, 0xBF, 0xD9, 0xC1, 0x83, 0x83, 0x1B, 0xFD, 0xFE,
+ 0x06, 0x1C, 0x60, 0xC1, 0x86, 0x3C, 0x70, 0x30, 0x41, 0x83, 0x07, 0x06,
+ 0x00, 0x33, 0x32, 0x26, 0x66, 0x44, 0xCC, 0xC8, 0x0C, 0x0E, 0x04, 0x0C,
+ 0x0C, 0x0C, 0x0F, 0x0F, 0x18, 0x18, 0x10, 0x30, 0xF0, 0xE0, 0x38, 0x7C,
+ 0xF7, 0xC1, 0xC0 };
+
+const GFXglyph FreeMonoBoldOblique9pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 11, 0, 1 }, // 0x20 ' '
+ { 0, 5, 11, 11, 4, -10 }, // 0x21 '!'
+ { 7, 7, 5, 11, 4, -10 }, // 0x22 '"'
+ { 12, 9, 12, 11, 2, -10 }, // 0x23 '#'
+ { 26, 9, 14, 11, 2, -11 }, // 0x24 '$'
+ { 42, 9, 11, 11, 2, -10 }, // 0x25 '%'
+ { 55, 8, 10, 11, 2, -9 }, // 0x26 '&'
+ { 65, 2, 5, 11, 6, -10 }, // 0x27 '''
+ { 67, 5, 14, 11, 5, -10 }, // 0x28 '('
+ { 76, 5, 14, 11, 2, -10 }, // 0x29 ')'
+ { 85, 8, 7, 11, 3, -10 }, // 0x2A '*'
+ { 92, 9, 9, 11, 2, -8 }, // 0x2B '+'
+ { 103, 4, 5, 11, 2, -1 }, // 0x2C ','
+ { 106, 9, 2, 11, 2, -5 }, // 0x2D '-'
+ { 109, 3, 2, 11, 4, -1 }, // 0x2E '.'
+ { 110, 11, 15, 11, 1, -12 }, // 0x2F '/'
+ { 131, 9, 12, 11, 2, -11 }, // 0x30 '0'
+ { 145, 8, 12, 11, 2, -11 }, // 0x31 '1'
+ { 157, 10, 12, 11, 1, -11 }, // 0x32 '2'
+ { 172, 9, 12, 11, 2, -11 }, // 0x33 '3'
+ { 186, 8, 10, 11, 2, -9 }, // 0x34 '4'
+ { 196, 9, 11, 11, 3, -10 }, // 0x35 '5'
+ { 209, 9, 12, 11, 3, -11 }, // 0x36 '6'
+ { 223, 8, 11, 11, 3, -10 }, // 0x37 '7'
+ { 234, 9, 12, 11, 2, -11 }, // 0x38 '8'
+ { 248, 8, 12, 11, 3, -11 }, // 0x39 '9'
+ { 260, 4, 8, 11, 4, -7 }, // 0x3A ':'
+ { 264, 6, 11, 11, 2, -7 }, // 0x3B ';'
+ { 273, 10, 8, 11, 2, -8 }, // 0x3C '<'
+ { 283, 10, 6, 11, 1, -7 }, // 0x3D '='
+ { 291, 10, 8, 11, 1, -8 }, // 0x3E '>'
+ { 301, 7, 11, 11, 4, -10 }, // 0x3F '?'
+ { 311, 9, 15, 11, 2, -11 }, // 0x40 '@'
+ { 328, 11, 11, 11, 0, -10 }, // 0x41 'A'
+ { 344, 11, 11, 11, 0, -10 }, // 0x42 'B'
+ { 360, 12, 11, 11, 1, -10 }, // 0x43 'C'
+ { 377, 11, 11, 11, 0, -10 }, // 0x44 'D'
+ { 393, 12, 11, 11, 0, -10 }, // 0x45 'E'
+ { 410, 12, 11, 11, 0, -10 }, // 0x46 'F'
+ { 427, 11, 11, 11, 1, -10 }, // 0x47 'G'
+ { 443, 12, 11, 11, 0, -10 }, // 0x48 'H'
+ { 460, 10, 11, 11, 1, -10 }, // 0x49 'I'
+ { 474, 12, 11, 11, 0, -10 }, // 0x4A 'J'
+ { 491, 11, 11, 11, 0, -10 }, // 0x4B 'K'
+ { 507, 11, 11, 11, 0, -10 }, // 0x4C 'L'
+ { 523, 13, 11, 11, 0, -10 }, // 0x4D 'M'
+ { 541, 13, 11, 11, 0, -10 }, // 0x4E 'N'
+ { 559, 10, 11, 11, 1, -10 }, // 0x4F 'O'
+ { 573, 11, 11, 11, 0, -10 }, // 0x50 'P'
+ { 589, 10, 14, 11, 1, -10 }, // 0x51 'Q'
+ { 607, 12, 11, 11, 0, -10 }, // 0x52 'R'
+ { 624, 10, 11, 11, 2, -10 }, // 0x53 'S'
+ { 638, 11, 11, 11, 1, -10 }, // 0x54 'T'
+ { 654, 11, 11, 11, 1, -10 }, // 0x55 'U'
+ { 670, 11, 11, 11, 1, -10 }, // 0x56 'V'
+ { 686, 11, 11, 11, 1, -10 }, // 0x57 'W'
+ { 702, 12, 11, 11, 0, -10 }, // 0x58 'X'
+ { 719, 11, 11, 11, 1, -10 }, // 0x59 'Y'
+ { 735, 10, 11, 11, 1, -10 }, // 0x5A 'Z'
+ { 749, 7, 14, 11, 4, -10 }, // 0x5B '['
+ { 762, 5, 15, 11, 4, -12 }, // 0x5C '\'
+ { 772, 7, 14, 11, 2, -10 }, // 0x5D ']'
+ { 785, 8, 6, 11, 3, -11 }, // 0x5E '^'
+ { 791, 11, 2, 11, -1, 3 }, // 0x5F '_'
+ { 794, 3, 3, 11, 5, -11 }, // 0x60 '`'
+ { 796, 10, 8, 11, 1, -7 }, // 0x61 'a'
+ { 806, 11, 11, 11, 0, -10 }, // 0x62 'b'
+ { 822, 10, 8, 11, 1, -7 }, // 0x63 'c'
+ { 832, 11, 11, 11, 1, -10 }, // 0x64 'd'
+ { 848, 9, 8, 11, 1, -7 }, // 0x65 'e'
+ { 857, 10, 11, 11, 2, -10 }, // 0x66 'f'
+ { 871, 11, 12, 11, 1, -7 }, // 0x67 'g'
+ { 888, 10, 11, 11, 1, -10 }, // 0x68 'h'
+ { 902, 9, 11, 11, 1, -10 }, // 0x69 'i'
+ { 915, 9, 15, 11, 1, -10 }, // 0x6A 'j'
+ { 932, 10, 11, 11, 1, -10 }, // 0x6B 'k'
+ { 946, 9, 11, 11, 1, -10 }, // 0x6C 'l'
+ { 959, 12, 8, 11, 0, -7 }, // 0x6D 'm'
+ { 971, 11, 8, 11, 1, -7 }, // 0x6E 'n'
+ { 982, 10, 8, 11, 1, -7 }, // 0x6F 'o'
+ { 992, 12, 12, 11, -1, -7 }, // 0x70 'p'
+ { 1010, 11, 12, 11, 1, -7 }, // 0x71 'q'
+ { 1027, 10, 8, 11, 1, -7 }, // 0x72 'r'
+ { 1037, 8, 8, 11, 2, -7 }, // 0x73 's'
+ { 1045, 9, 11, 11, 1, -10 }, // 0x74 't'
+ { 1058, 10, 8, 11, 1, -7 }, // 0x75 'u'
+ { 1068, 11, 8, 11, 1, -7 }, // 0x76 'v'
+ { 1079, 11, 8, 11, 1, -7 }, // 0x77 'w'
+ { 1090, 11, 8, 11, 1, -7 }, // 0x78 'x'
+ { 1101, 12, 12, 11, 0, -7 }, // 0x79 'y'
+ { 1119, 9, 8, 11, 2, -7 }, // 0x7A 'z'
+ { 1128, 7, 14, 11, 3, -10 }, // 0x7B '{'
+ { 1141, 4, 14, 11, 4, -10 }, // 0x7C '|'
+ { 1148, 8, 14, 11, 2, -10 }, // 0x7D '}'
+ { 1162, 9, 4, 11, 2, -6 } }; // 0x7E '~'
+
+const GFXfont FreeMonoBoldOblique9pt7b PROGMEM = {
+ (uint8_t *)FreeMonoBoldOblique9pt7bBitmaps,
+ (GFXglyph *)FreeMonoBoldOblique9pt7bGlyphs,
+ 0x20, 0x7E, 18 };
+
+// Approx. 1839 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoOblique12pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoOblique12pt7b.h
new file mode 100644
index 000000000000..83a9a7708fba
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoOblique12pt7b.h
@@ -0,0 +1,248 @@
+const uint8_t FreeMonoOblique12pt7bBitmaps[] PROGMEM = {
+ 0x11, 0x11, 0x12, 0x22, 0x22, 0x00, 0x0E, 0xE0, 0xE7, 0xE7, 0xC6, 0xC6,
+ 0xC6, 0x84, 0x84, 0x02, 0x40, 0x88, 0x12, 0x02, 0x40, 0x48, 0x7F, 0xC2,
+ 0x40, 0x48, 0x11, 0x1F, 0xF8, 0x48, 0x09, 0x02, 0x40, 0x48, 0x09, 0x02,
+ 0x20, 0x02, 0x01, 0x00, 0xF4, 0xC3, 0x60, 0x50, 0x04, 0x00, 0xC0, 0x0F,
+ 0x00, 0x60, 0x0A, 0x02, 0x81, 0x30, 0xC7, 0xC0, 0x80, 0x20, 0x08, 0x00,
+ 0x0E, 0x02, 0x20, 0x84, 0x10, 0x82, 0x20, 0x38, 0x00, 0x38, 0x38, 0x38,
+ 0x08, 0xE0, 0x22, 0x08, 0x41, 0x08, 0x22, 0x03, 0x80, 0x07, 0x84, 0x04,
+ 0x02, 0x01, 0x00, 0xC1, 0xA2, 0x8A, 0x85, 0x43, 0x31, 0x8F, 0x60, 0xFF,
+ 0x6D, 0x20, 0x00, 0x44, 0x42, 0x21, 0x08, 0x84, 0x21, 0x08, 0x42, 0x10,
+ 0x42, 0x00, 0x00, 0x84, 0x10, 0x84, 0x21, 0x08, 0x46, 0x21, 0x10, 0x88,
+ 0x44, 0x00, 0x04, 0x02, 0x02, 0x1D, 0x13, 0xF0, 0x40, 0x50, 0x48, 0x44,
+ 0x00, 0x02, 0x00, 0x40, 0x08, 0x02, 0x00, 0x41, 0xFF, 0xC1, 0x00, 0x20,
+ 0x08, 0x01, 0x00, 0x20, 0x00, 0x1C, 0xE3, 0x18, 0x63, 0x08, 0x00, 0xFF,
+ 0xE0, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x80, 0x04, 0x00, 0x40, 0x04, 0x00,
+ 0x60, 0x02, 0x00, 0x20, 0x03, 0x00, 0x10, 0x01, 0x00, 0x18, 0x00, 0x80,
+ 0x08, 0x00, 0x80, 0x04, 0x00, 0x40, 0x04, 0x00, 0x00, 0x07, 0x06, 0x23,
+ 0x04, 0x81, 0x40, 0x50, 0x14, 0x06, 0x02, 0x80, 0xA0, 0x28, 0x0A, 0x04,
+ 0x83, 0x11, 0x83, 0x80, 0x03, 0x03, 0x83, 0x83, 0x43, 0x20, 0x10, 0x08,
+ 0x08, 0x04, 0x02, 0x01, 0x01, 0x00, 0x80, 0x43, 0xFE, 0x01, 0xC0, 0x62,
+ 0x0C, 0x10, 0x81, 0x00, 0x10, 0x02, 0x00, 0x60, 0x0C, 0x01, 0x00, 0x20,
+ 0x0C, 0x01, 0x80, 0x20, 0x04, 0x04, 0xFF, 0xC0, 0x07, 0xC3, 0x0C, 0x00,
+ 0x80, 0x10, 0x06, 0x01, 0x81, 0xC0, 0x0C, 0x00, 0x40, 0x08, 0x01, 0x00,
+ 0x20, 0x09, 0x86, 0x0F, 0x00, 0x00, 0xC0, 0x50, 0x24, 0x12, 0x04, 0x82,
+ 0x21, 0x08, 0x82, 0x21, 0x10, 0x4F, 0xF8, 0x04, 0x01, 0x00, 0x80, 0xF8,
+ 0x0F, 0xE2, 0x00, 0x40, 0x08, 0x01, 0x00, 0x4E, 0x0E, 0x20, 0x02, 0x00,
+ 0x40, 0x08, 0x01, 0x00, 0x40, 0x19, 0x06, 0x1F, 0x00, 0x01, 0xE0, 0xC0,
+ 0x60, 0x18, 0x02, 0x00, 0x80, 0x13, 0xC5, 0x88, 0xE0, 0x98, 0x12, 0x02,
+ 0x40, 0x48, 0x10, 0x84, 0x0F, 0x00, 0xFF, 0xA0, 0x20, 0x08, 0x04, 0x01,
+ 0x00, 0x80, 0x20, 0x10, 0x04, 0x02, 0x00, 0x80, 0x40, 0x10, 0x08, 0x02,
+ 0x00, 0x07, 0x81, 0x08, 0x40, 0x90, 0x12, 0x02, 0x40, 0x84, 0x20, 0x78,
+ 0x30, 0x88, 0x0A, 0x01, 0x40, 0x28, 0x08, 0x82, 0x0F, 0x80, 0x07, 0x81,
+ 0x08, 0x40, 0x90, 0x12, 0x02, 0x40, 0xC8, 0x39, 0x8D, 0x1E, 0x40, 0x08,
+ 0x02, 0x00, 0xC0, 0x30, 0x18, 0x3E, 0x00, 0x19, 0xCC, 0x00, 0x00, 0x0C,
+ 0xE6, 0x00, 0x06, 0x1C, 0x30, 0x00, 0x00, 0x00, 0x1C, 0x30, 0xE1, 0x86,
+ 0x08, 0x00, 0x00, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x06, 0x00, 0x30,
+ 0x00, 0xC0, 0x06, 0x00, 0x18, 0x00, 0xC0, 0x7F, 0xF8, 0x00, 0x00, 0x01,
+ 0xFF, 0xE0, 0x18, 0x00, 0xC0, 0x03, 0x00, 0x18, 0x00, 0x60, 0x03, 0x00,
+ 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x00, 0x3E, 0xC3, 0x81, 0x01, 0x03,
+ 0x06, 0x18, 0x20, 0x20, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x07, 0x82, 0x31,
+ 0x04, 0x81, 0x20, 0x48, 0x74, 0x65, 0x21, 0x48, 0x92, 0x28, 0x7A, 0x00,
+ 0x80, 0x20, 0x04, 0x00, 0xF8, 0x07, 0xE0, 0x02, 0x80, 0x0A, 0x00, 0x48,
+ 0x01, 0x20, 0x08, 0x40, 0x41, 0x01, 0x04, 0x0F, 0xF0, 0x20, 0x41, 0x01,
+ 0x04, 0x02, 0x20, 0x0B, 0xE1, 0xF0, 0x1F, 0xF0, 0x40, 0xC2, 0x02, 0x10,
+ 0x10, 0x81, 0x84, 0x18, 0x7F, 0x82, 0x02, 0x10, 0x08, 0x80, 0x44, 0x02,
+ 0x60, 0x22, 0x03, 0x7F, 0xE0, 0x07, 0x91, 0x87, 0x20, 0x34, 0x02, 0x40,
+ 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x04, 0x04, 0x61,
+ 0x81, 0xE0, 0x1F, 0xE0, 0x41, 0x82, 0x06, 0x10, 0x11, 0x00, 0x88, 0x04,
+ 0x40, 0x22, 0x01, 0x10, 0x11, 0x00, 0x88, 0x08, 0x40, 0xC2, 0x0C, 0x7F,
+ 0x80, 0x1F, 0xFC, 0x20, 0x10, 0x80, 0x82, 0x00, 0x08, 0x00, 0x22, 0x01,
+ 0xF8, 0x04, 0x20, 0x10, 0x00, 0x40, 0x01, 0x01, 0x0C, 0x04, 0x20, 0x13,
+ 0xFF, 0xC0, 0x1F, 0xFC, 0x20, 0x10, 0x80, 0x42, 0x01, 0x08, 0x00, 0x22,
+ 0x01, 0xF8, 0x04, 0x20, 0x10, 0x00, 0x40, 0x01, 0x00, 0x0C, 0x00, 0x20,
+ 0x03, 0xF8, 0x00, 0x07, 0xD0, 0x83, 0x30, 0x12, 0x00, 0x40, 0x04, 0x00,
+ 0x80, 0x08, 0x00, 0x83, 0xE8, 0x04, 0x80, 0x4C, 0x04, 0x60, 0x41, 0xF8,
+ 0x0F, 0x3C, 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x81, 0x01, 0x02, 0x03,
+ 0xFC, 0x08, 0x08, 0x10, 0x10, 0x20, 0x40, 0x40, 0x80, 0x81, 0x02, 0x02,
+ 0x1F, 0x1E, 0x00, 0x3F, 0xE0, 0x40, 0x08, 0x01, 0x00, 0x20, 0x08, 0x01,
+ 0x00, 0x20, 0x04, 0x00, 0x80, 0x20, 0x04, 0x00, 0x81, 0xFF, 0x00, 0x03,
+ 0xFE, 0x00, 0x20, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08,
+ 0x00, 0x20, 0x40, 0x40, 0x80, 0x81, 0x01, 0x02, 0x04, 0x06, 0x10, 0x07,
+ 0xC0, 0x00, 0x1F, 0x1E, 0x10, 0x10, 0x20, 0xC0, 0x43, 0x00, 0x88, 0x01,
+ 0x20, 0x07, 0xC0, 0x0C, 0x40, 0x10, 0x40, 0x20, 0x80, 0x41, 0x01, 0x81,
+ 0x02, 0x02, 0x1F, 0x87, 0x00, 0x3F, 0x80, 0x40, 0x04, 0x00, 0x40, 0x08,
+ 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x01, 0x01, 0x10, 0x11, 0x02, 0x10,
+ 0x2F, 0xFE, 0x1C, 0x03, 0x85, 0x03, 0x02, 0x82, 0x81, 0x41, 0x40, 0xA1,
+ 0x20, 0x89, 0x30, 0x44, 0x90, 0x22, 0x88, 0x11, 0x44, 0x08, 0x42, 0x08,
+ 0x03, 0x04, 0x01, 0x02, 0x00, 0x87, 0xC3, 0xE0, 0x3C, 0x3E, 0x18, 0x08,
+ 0x38, 0x20, 0x50, 0x41, 0x20, 0x82, 0x61, 0x04, 0x42, 0x08, 0x88, 0x10,
+ 0x90, 0x41, 0x20, 0x83, 0x41, 0x02, 0x82, 0x06, 0x1F, 0x04, 0x00, 0x03,
+ 0xC0, 0x61, 0x84, 0x04, 0x40, 0x14, 0x00, 0xA0, 0x06, 0x00, 0x30, 0x01,
+ 0x80, 0x14, 0x00, 0xA0, 0x08, 0x80, 0x86, 0x18, 0x0F, 0x00, 0x1F, 0xE0,
+ 0x40, 0x82, 0x02, 0x10, 0x10, 0x80, 0x84, 0x08, 0x40, 0x83, 0xF8, 0x10,
+ 0x00, 0x80, 0x04, 0x00, 0x60, 0x02, 0x00, 0x7F, 0x00, 0x03, 0xC0, 0x61,
+ 0x84, 0x04, 0x40, 0x14, 0x00, 0xA0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x14,
+ 0x00, 0xA0, 0x08, 0x80, 0x86, 0x18, 0x1F, 0x00, 0x40, 0x0F, 0xC4, 0x41,
+ 0xC0, 0x1F, 0xE0, 0x40, 0x82, 0x02, 0x10, 0x10, 0x80, 0x84, 0x08, 0x60,
+ 0x83, 0xF8, 0x10, 0xC0, 0x82, 0x04, 0x08, 0x40, 0x42, 0x03, 0x7E, 0x0C,
+ 0x07, 0xA3, 0x0C, 0x40, 0x90, 0x12, 0x00, 0x40, 0x06, 0x00, 0x3C, 0x00,
+ 0x40, 0x0A, 0x01, 0x40, 0x4C, 0x11, 0x7C, 0x00, 0xFF, 0xE8, 0x42, 0x84,
+ 0x20, 0x40, 0x04, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x10,
+ 0x01, 0x00, 0x10, 0x0F, 0xE0, 0xF8, 0xF9, 0x00, 0x88, 0x08, 0x80, 0x44,
+ 0x02, 0x20, 0x11, 0x01, 0x08, 0x08, 0x80, 0x44, 0x02, 0x20, 0x31, 0x01,
+ 0x04, 0x30, 0x1E, 0x00, 0xF8, 0x7D, 0x00, 0x42, 0x01, 0x08, 0x08, 0x20,
+ 0x40, 0x81, 0x02, 0x08, 0x08, 0x20, 0x11, 0x00, 0x48, 0x01, 0x20, 0x05,
+ 0x00, 0x14, 0x00, 0x60, 0x00, 0xF8, 0x7D, 0x00, 0x44, 0x01, 0x11, 0x84,
+ 0x46, 0x21, 0x18, 0x84, 0xA2, 0x12, 0x90, 0x91, 0x42, 0x45, 0x0A, 0x14,
+ 0x28, 0x60, 0xC1, 0x83, 0x06, 0x00, 0x1E, 0x1E, 0x10, 0x10, 0x10, 0x40,
+ 0x21, 0x00, 0x24, 0x00, 0x78, 0x00, 0x60, 0x01, 0xC0, 0x06, 0x80, 0x09,
+ 0x80, 0x21, 0x00, 0x81, 0x02, 0x02, 0x1E, 0x1F, 0x00, 0xF0, 0xF4, 0x04,
+ 0x20, 0x82, 0x18, 0x11, 0x01, 0x20, 0x1C, 0x00, 0x80, 0x08, 0x00, 0x80,
+ 0x10, 0x01, 0x00, 0x10, 0x0F, 0xE0, 0x0F, 0xF1, 0x01, 0x10, 0x21, 0x04,
+ 0x00, 0x80, 0x10, 0x02, 0x00, 0x40, 0x0C, 0x01, 0x82, 0x10, 0x22, 0x04,
+ 0x40, 0x47, 0xFC, 0x0E, 0x20, 0x40, 0x81, 0x02, 0x08, 0x10, 0x20, 0x40,
+ 0x82, 0x04, 0x08, 0x10, 0x20, 0x81, 0xE0, 0x84, 0x20, 0x84, 0x20, 0x84,
+ 0x21, 0x04, 0x21, 0x08, 0x21, 0x08, 0x40, 0x1E, 0x04, 0x08, 0x20, 0x40,
+ 0x81, 0x02, 0x04, 0x10, 0x20, 0x40, 0x81, 0x02, 0x08, 0x11, 0xE0, 0x04,
+ 0x06, 0x04, 0x84, 0x44, 0x14, 0x0C, 0xFF, 0xFE, 0x99, 0x90, 0x1F, 0xC0,
+ 0x06, 0x00, 0x20, 0x02, 0x1F, 0xE6, 0x04, 0xC0, 0x48, 0x04, 0x81, 0xC7,
+ 0xEF, 0x18, 0x00, 0x40, 0x02, 0x00, 0x10, 0x00, 0x80, 0x09, 0xF0, 0x50,
+ 0xC3, 0x03, 0x10, 0x08, 0x80, 0x48, 0x02, 0x40, 0x23, 0x03, 0x1C, 0x33,
+ 0xBE, 0x00, 0x0F, 0xD3, 0x07, 0x60, 0x24, 0x02, 0x80, 0x08, 0x00, 0x80,
+ 0x08, 0x06, 0x41, 0xC3, 0xF0, 0x00, 0x38, 0x00, 0x40, 0x02, 0x00, 0x20,
+ 0x01, 0x07, 0xC8, 0x43, 0x44, 0x0E, 0x40, 0x24, 0x01, 0x20, 0x09, 0x00,
+ 0xC8, 0x0E, 0x20, 0xE0, 0xF9, 0xC0, 0x0F, 0x86, 0x09, 0x00, 0xA0, 0x1F,
+ 0xFF, 0x00, 0x20, 0x06, 0x00, 0x60, 0xC7, 0xE0, 0x01, 0xF8, 0x10, 0x01,
+ 0x00, 0x08, 0x00, 0x40, 0x1F, 0xF0, 0x20, 0x01, 0x00, 0x08, 0x00, 0x40,
+ 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x03, 0xFE, 0x00, 0x0F, 0x31, 0x86,
+ 0x10, 0x10, 0x80, 0x88, 0x04, 0x40, 0x22, 0x02, 0x10, 0x10, 0x43, 0x81,
+ 0xE4, 0x00, 0x40, 0x02, 0x00, 0x20, 0x3E, 0x00, 0x1C, 0x00, 0x20, 0x03,
+ 0x00, 0x10, 0x00, 0x80, 0x05, 0xF0, 0x30, 0xC3, 0x02, 0x10, 0x10, 0x80,
+ 0x84, 0x0C, 0x20, 0x63, 0x02, 0x10, 0x13, 0xE3, 0xE0, 0x01, 0x80, 0x40,
+ 0x10, 0x00, 0x00, 0x07, 0xC0, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, 0x10,
+ 0x04, 0x01, 0x0F, 0xFC, 0x00, 0x40, 0x10, 0x0C, 0x00, 0x00, 0x07, 0xF0,
+ 0x04, 0x01, 0x00, 0x40, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, 0x10, 0x04,
+ 0x01, 0x00, 0x8F, 0xC0, 0x18, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x01,
+ 0x1F, 0x10, 0x81, 0x30, 0x14, 0x01, 0xC0, 0x26, 0x02, 0x20, 0x21, 0x02,
+ 0x08, 0xE1, 0xE0, 0x0F, 0x80, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x20,
+ 0x08, 0x02, 0x00, 0x80, 0x20, 0x10, 0x04, 0x01, 0x0F, 0xFC, 0x3B, 0xB8,
+ 0x33, 0x91, 0x08, 0x44, 0x21, 0x10, 0x84, 0x42, 0x12, 0x10, 0x48, 0x42,
+ 0x21, 0x0B, 0xC6, 0x30, 0x19, 0xE0, 0xE3, 0x08, 0x11, 0x01, 0x10, 0x11,
+ 0x02, 0x10, 0x21, 0x02, 0x20, 0x2F, 0x87, 0x0F, 0x86, 0x19, 0x80, 0xA0,
+ 0x18, 0x03, 0x00, 0x60, 0x14, 0x06, 0x61, 0x87, 0xC0, 0x19, 0xF0, 0x28,
+ 0x20, 0xC0, 0x42, 0x01, 0x10, 0x04, 0x40, 0x11, 0x00, 0x86, 0x06, 0x14,
+ 0x30, 0xCF, 0x02, 0x00, 0x08, 0x00, 0x20, 0x03, 0xF0, 0x00, 0x0F, 0x39,
+ 0x85, 0x18, 0x18, 0x80, 0x88, 0x04, 0x40, 0x22, 0x01, 0x18, 0x18, 0x63,
+ 0x81, 0xE4, 0x00, 0x20, 0x01, 0x00, 0x10, 0x07, 0xE0, 0x1C, 0x78, 0x2C,
+ 0x01, 0x80, 0x18, 0x00, 0x80, 0x04, 0x00, 0x20, 0x02, 0x00, 0x10, 0x07,
+ 0xFC, 0x00, 0x0F, 0x44, 0x32, 0x04, 0x80, 0x1E, 0x00, 0x60, 0x0A, 0x02,
+ 0xC1, 0x2F, 0x80, 0x10, 0x08, 0x04, 0x02, 0x0F, 0xF9, 0x00, 0x80, 0x40,
+ 0x20, 0x20, 0x10, 0x08, 0x04, 0x19, 0xF0, 0xE0, 0xF2, 0x02, 0x40, 0x24,
+ 0x02, 0x40, 0x24, 0x06, 0x40, 0x44, 0x04, 0x41, 0xC3, 0xE6, 0xF8, 0xFA,
+ 0x01, 0x08, 0x10, 0x41, 0x02, 0x08, 0x10, 0x80, 0x48, 0x02, 0x40, 0x14,
+ 0x00, 0xC0, 0x00, 0xE0, 0x7A, 0x01, 0x10, 0x08, 0x8C, 0x84, 0xA4, 0x25,
+ 0x21, 0x4A, 0x0A, 0x50, 0x63, 0x02, 0x18, 0x00, 0x1E, 0x3C, 0x20, 0x40,
+ 0x46, 0x00, 0xB0, 0x03, 0x00, 0x0E, 0x00, 0xC8, 0x06, 0x10, 0x20, 0x23,
+ 0xE3, 0xC0, 0x3C, 0x3C, 0x40, 0x20, 0x81, 0x02, 0x08, 0x08, 0x20, 0x31,
+ 0x00, 0x48, 0x01, 0x40, 0x05, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, 0x08,
+ 0x03, 0xF0, 0x00, 0x3F, 0xC4, 0x18, 0x06, 0x01, 0x80, 0x60, 0x10, 0x04,
+ 0x01, 0x00, 0x40, 0x9F, 0xF0, 0x06, 0x10, 0x20, 0x41, 0x02, 0x04, 0x08,
+ 0x21, 0x80, 0x81, 0x02, 0x08, 0x10, 0x20, 0x40, 0xC0, 0x01, 0x11, 0x12,
+ 0x22, 0x24, 0x44, 0x44, 0x88, 0x80, 0x0C, 0x08, 0x10, 0x20, 0x40, 0x82,
+ 0x04, 0x08, 0x0C, 0x20, 0x81, 0x02, 0x04, 0x08, 0x21, 0x80, 0x38, 0x28,
+ 0x88, 0x0E, 0x00 };
+
+const GFXglyph FreeMonoOblique12pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 14, 0, 1 }, // 0x20 ' '
+ { 0, 4, 15, 14, 6, -14 }, // 0x21 '!'
+ { 8, 8, 7, 14, 5, -14 }, // 0x22 '"'
+ { 15, 11, 16, 14, 3, -14 }, // 0x23 '#'
+ { 37, 10, 18, 14, 4, -15 }, // 0x24 '$'
+ { 60, 11, 15, 14, 3, -14 }, // 0x25 '%'
+ { 81, 9, 12, 14, 3, -11 }, // 0x26 '&'
+ { 95, 3, 7, 14, 8, -14 }, // 0x27 '''
+ { 98, 5, 18, 14, 8, -14 }, // 0x28 '('
+ { 110, 5, 18, 14, 4, -14 }, // 0x29 ')'
+ { 122, 9, 9, 14, 5, -14 }, // 0x2A '*'
+ { 133, 11, 11, 14, 3, -11 }, // 0x2B '+'
+ { 149, 6, 7, 14, 3, -3 }, // 0x2C ','
+ { 155, 11, 1, 14, 3, -6 }, // 0x2D '-'
+ { 157, 3, 3, 14, 6, -2 }, // 0x2E '.'
+ { 159, 13, 18, 14, 2, -15 }, // 0x2F '/'
+ { 189, 10, 15, 14, 4, -14 }, // 0x30 '0'
+ { 208, 9, 15, 14, 3, -14 }, // 0x31 '1'
+ { 225, 12, 15, 14, 2, -14 }, // 0x32 '2'
+ { 248, 11, 15, 14, 3, -14 }, // 0x33 '3'
+ { 269, 10, 15, 14, 3, -14 }, // 0x34 '4'
+ { 288, 11, 15, 14, 3, -14 }, // 0x35 '5'
+ { 309, 11, 15, 14, 4, -14 }, // 0x36 '6'
+ { 330, 10, 15, 14, 5, -14 }, // 0x37 '7'
+ { 349, 11, 15, 14, 3, -14 }, // 0x38 '8'
+ { 370, 11, 15, 14, 3, -14 }, // 0x39 '9'
+ { 391, 5, 10, 14, 5, -9 }, // 0x3A ':'
+ { 398, 7, 13, 14, 3, -9 }, // 0x3B ';'
+ { 410, 12, 11, 14, 3, -11 }, // 0x3C '<'
+ { 427, 13, 4, 14, 2, -8 }, // 0x3D '='
+ { 434, 12, 11, 14, 2, -11 }, // 0x3E '>'
+ { 451, 8, 14, 14, 6, -13 }, // 0x3F '?'
+ { 465, 10, 16, 14, 3, -14 }, // 0x40 '@'
+ { 485, 14, 14, 14, 0, -13 }, // 0x41 'A'
+ { 510, 13, 14, 14, 1, -13 }, // 0x42 'B'
+ { 533, 12, 14, 14, 3, -13 }, // 0x43 'C'
+ { 554, 13, 14, 14, 1, -13 }, // 0x44 'D'
+ { 577, 14, 14, 14, 1, -13 }, // 0x45 'E'
+ { 602, 14, 14, 14, 1, -13 }, // 0x46 'F'
+ { 627, 12, 14, 14, 3, -13 }, // 0x47 'G'
+ { 648, 15, 14, 14, 1, -13 }, // 0x48 'H'
+ { 675, 11, 14, 14, 3, -13 }, // 0x49 'I'
+ { 695, 15, 14, 14, 2, -13 }, // 0x4A 'J'
+ { 722, 15, 14, 14, 1, -13 }, // 0x4B 'K'
+ { 749, 12, 14, 14, 2, -13 }, // 0x4C 'L'
+ { 770, 17, 14, 14, 0, -13 }, // 0x4D 'M'
+ { 800, 15, 14, 14, 1, -13 }, // 0x4E 'N'
+ { 827, 13, 14, 14, 2, -13 }, // 0x4F 'O'
+ { 850, 13, 14, 14, 1, -13 }, // 0x50 'P'
+ { 873, 13, 17, 14, 2, -13 }, // 0x51 'Q'
+ { 901, 13, 14, 14, 1, -13 }, // 0x52 'R'
+ { 924, 11, 14, 14, 3, -13 }, // 0x53 'S'
+ { 944, 12, 14, 14, 4, -13 }, // 0x54 'T'
+ { 965, 13, 14, 14, 3, -13 }, // 0x55 'U'
+ { 988, 14, 14, 14, 3, -13 }, // 0x56 'V'
+ { 1013, 14, 14, 14, 3, -13 }, // 0x57 'W'
+ { 1038, 15, 14, 14, 1, -13 }, // 0x58 'X'
+ { 1065, 12, 14, 14, 4, -13 }, // 0x59 'Y'
+ { 1086, 12, 14, 14, 2, -13 }, // 0x5A 'Z'
+ { 1107, 7, 18, 14, 6, -14 }, // 0x5B '['
+ { 1123, 5, 18, 14, 6, -15 }, // 0x5C '\'
+ { 1135, 7, 18, 14, 3, -14 }, // 0x5D ']'
+ { 1151, 9, 6, 14, 5, -14 }, // 0x5E '^'
+ { 1158, 15, 1, 14, -1, 3 }, // 0x5F '_'
+ { 1160, 3, 4, 14, 6, -15 }, // 0x60 '`'
+ { 1162, 12, 10, 14, 2, -9 }, // 0x61 'a'
+ { 1177, 13, 15, 14, 1, -14 }, // 0x62 'b'
+ { 1202, 12, 10, 14, 3, -9 }, // 0x63 'c'
+ { 1217, 13, 15, 14, 2, -14 }, // 0x64 'd'
+ { 1242, 11, 10, 14, 3, -9 }, // 0x65 'e'
+ { 1256, 13, 15, 14, 3, -14 }, // 0x66 'f'
+ { 1281, 13, 14, 14, 3, -9 }, // 0x67 'g'
+ { 1304, 13, 15, 14, 1, -14 }, // 0x68 'h'
+ { 1329, 10, 15, 14, 2, -14 }, // 0x69 'i'
+ { 1348, 10, 19, 14, 2, -14 }, // 0x6A 'j'
+ { 1372, 12, 15, 14, 2, -14 }, // 0x6B 'k'
+ { 1395, 10, 15, 14, 2, -14 }, // 0x6C 'l'
+ { 1414, 14, 10, 14, 0, -9 }, // 0x6D 'm'
+ { 1432, 12, 10, 14, 1, -9 }, // 0x6E 'n'
+ { 1447, 11, 10, 14, 3, -9 }, // 0x6F 'o'
+ { 1461, 14, 14, 14, 0, -9 }, // 0x70 'p'
+ { 1486, 13, 14, 14, 3, -9 }, // 0x71 'q'
+ { 1509, 13, 10, 14, 2, -9 }, // 0x72 'r'
+ { 1526, 10, 10, 14, 3, -9 }, // 0x73 's'
+ { 1539, 9, 14, 14, 3, -13 }, // 0x74 't'
+ { 1555, 12, 10, 14, 2, -9 }, // 0x75 'u'
+ { 1570, 13, 10, 14, 3, -9 }, // 0x76 'v'
+ { 1587, 13, 10, 14, 3, -9 }, // 0x77 'w'
+ { 1604, 14, 10, 14, 1, -9 }, // 0x78 'x'
+ { 1622, 14, 14, 14, 1, -9 }, // 0x79 'y'
+ { 1647, 11, 10, 14, 3, -9 }, // 0x7A 'z'
+ { 1661, 7, 18, 14, 5, -14 }, // 0x7B '{'
+ { 1677, 4, 17, 14, 6, -13 }, // 0x7C '|'
+ { 1686, 7, 18, 14, 4, -14 }, // 0x7D '}'
+ { 1702, 11, 3, 14, 3, -7 } }; // 0x7E '~'
+
+const GFXfont FreeMonoOblique12pt7b PROGMEM = {
+ (uint8_t *)FreeMonoOblique12pt7bBitmaps,
+ (GFXglyph *)FreeMonoOblique12pt7bGlyphs,
+ 0x20, 0x7E, 24 };
+
+// Approx. 2379 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoOblique18pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoOblique18pt7b.h
new file mode 100644
index 000000000000..1979e7203d07
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoOblique18pt7b.h
@@ -0,0 +1,398 @@
+const uint8_t FreeMonoOblique18pt7bBitmaps[] PROGMEM = {
+ 0x00, 0x1C, 0x38, 0x70, 0xC1, 0x83, 0x06, 0x18, 0x30, 0x60, 0xC1, 0x02,
+ 0x04, 0x00, 0x00, 0x01, 0xC7, 0x8F, 0x1C, 0x00, 0x78, 0x7B, 0xC3, 0xFC,
+ 0x3D, 0xE1, 0xEF, 0x0F, 0x70, 0x73, 0x83, 0x98, 0x18, 0xC0, 0xC6, 0x06,
+ 0x00, 0x00, 0x8C, 0x01, 0x18, 0x06, 0x20, 0x08, 0x40, 0x11, 0x80, 0x62,
+ 0x00, 0xC4, 0x01, 0x18, 0x02, 0x30, 0x7F, 0xFC, 0x10, 0x80, 0x23, 0x00,
+ 0xC4, 0x01, 0x88, 0x3F, 0xFF, 0x04, 0x60, 0x18, 0x80, 0x21, 0x00, 0x46,
+ 0x01, 0x88, 0x03, 0x10, 0x04, 0x60, 0x08, 0xC0, 0x31, 0x00, 0x00, 0x30,
+ 0x00, 0x20, 0x00, 0x20, 0x00, 0xF9, 0x03, 0x0F, 0x06, 0x03, 0x04, 0x03,
+ 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x03, 0xC0, 0x00, 0x78,
+ 0x00, 0x0C, 0x00, 0x04, 0x00, 0x04, 0x40, 0x04, 0x40, 0x08, 0x40, 0x18,
+ 0xF0, 0x60, 0x9F, 0x80, 0x02, 0x00, 0x06, 0x00, 0x04, 0x00, 0x04, 0x00,
+ 0x04, 0x00, 0x03, 0xC0, 0x0C, 0x60, 0x08, 0x20, 0x10, 0x20, 0x10, 0x20,
+ 0x10, 0x40, 0x18, 0x80, 0x0F, 0x00, 0x00, 0x0F, 0x00, 0x78, 0x07, 0xC0,
+ 0x3C, 0x00, 0xE0, 0x00, 0x01, 0xE0, 0x02, 0x18, 0x04, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x10, 0x0C, 0x20, 0x07, 0xC0, 0x01, 0xF0, 0x11, 0x81,
+ 0x00, 0x10, 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x80, 0x04, 0x00, 0xF0,
+ 0x09, 0x86, 0x84, 0x48, 0x32, 0x40, 0xA2, 0x07, 0x10, 0x30, 0x43, 0x81,
+ 0xE7, 0x80, 0x7B, 0xFD, 0xEF, 0x73, 0x98, 0xC6, 0x00, 0x01, 0x02, 0x06,
+ 0x0C, 0x0C, 0x18, 0x10, 0x30, 0x30, 0x60, 0x60, 0x60, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x40, 0x60, 0x60, 0x20, 0x04, 0x06,
+ 0x06, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x06,
+ 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x18, 0x10, 0x30, 0x60, 0x40, 0xC0, 0x01,
+ 0x00, 0x04, 0x00, 0x10, 0x00, 0xC6, 0xE3, 0xF8, 0x7E, 0x00, 0x70, 0x03,
+ 0x40, 0x19, 0x80, 0xC2, 0x06, 0x0C, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x02,
+ 0x00, 0x04, 0x00, 0x08, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0xFF, 0xFE,
+ 0x02, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x02,
+ 0x00, 0x04, 0x00, 0x0F, 0x87, 0x87, 0x83, 0x83, 0xC1, 0xC1, 0xC0, 0xC0,
+ 0xE0, 0x60, 0x00, 0xFF, 0xFF, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x60,
+ 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x04, 0x00,
+ 0x01, 0x80, 0x00, 0x60, 0x00, 0x08, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00,
+ 0x10, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x20, 0x00, 0x0C, 0x00, 0x03,
+ 0x00, 0x00, 0x40, 0x00, 0x18, 0x00, 0x06, 0x00, 0x00, 0x80, 0x00, 0x20,
+ 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, 0x00, 0x01,
+ 0xF0, 0x18, 0x60, 0x80, 0x86, 0x01, 0x10, 0x04, 0x80, 0x12, 0x00, 0x50,
+ 0x01, 0x40, 0x0D, 0x00, 0x24, 0x00, 0xA0, 0x02, 0x80, 0x1A, 0x00, 0x48,
+ 0x01, 0x20, 0x0C, 0x80, 0x22, 0x01, 0x84, 0x0C, 0x18, 0x60, 0x3E, 0x00,
+ 0x00, 0x60, 0x07, 0x00, 0x68, 0x06, 0x40, 0xE4, 0x04, 0x20, 0x01, 0x00,
+ 0x08, 0x00, 0x40, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00, 0x80, 0x04,
+ 0x00, 0x20, 0x01, 0x00, 0x08, 0x00, 0x80, 0x04, 0x0F, 0xFF, 0x80, 0x00,
+ 0x3C, 0x00, 0x61, 0x80, 0x40, 0x40, 0x40, 0x10, 0x60, 0x08, 0x00, 0x04,
+ 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x07, 0x00, 0x07,
+ 0x00, 0x06, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x0C,
+ 0x00, 0x1C, 0x01, 0x1C, 0x00, 0x8F, 0xFF, 0xC0, 0x00, 0xFC, 0x03, 0x06,
+ 0x06, 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02,
+ 0x00, 0x0C, 0x00, 0xF0, 0x00, 0x18, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02,
+ 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x40, 0x18, 0x70, 0x30,
+ 0x0F, 0xC0, 0x00, 0x1C, 0x00, 0xD0, 0x06, 0x80, 0x32, 0x00, 0x88, 0x04,
+ 0x20, 0x30, 0x81, 0x84, 0x04, 0x10, 0x20, 0x41, 0x81, 0x0C, 0x08, 0x60,
+ 0x21, 0x00, 0x8F, 0xFF, 0x80, 0x18, 0x00, 0x40, 0x01, 0x00, 0x04, 0x00,
+ 0x10, 0x07, 0xE0, 0x03, 0xFF, 0x03, 0x00, 0x01, 0x80, 0x00, 0x80, 0x00,
+ 0x40, 0x00, 0x20, 0x00, 0x30, 0x00, 0x1B, 0xE0, 0x0E, 0x0C, 0x00, 0x02,
+ 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00,
+ 0x08, 0x00, 0x04, 0x60, 0x04, 0x18, 0x04, 0x06, 0x0C, 0x00, 0xF8, 0x00,
+ 0x00, 0x3F, 0x00, 0xC0, 0x03, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00,
+ 0x30, 0x00, 0x20, 0x00, 0x40, 0x00, 0x43, 0xE0, 0x4C, 0x30, 0xB0, 0x18,
+ 0xE0, 0x08, 0xC0, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x10, 0xC0, 0x10,
+ 0x40, 0x20, 0x20, 0xC0, 0x1F, 0x00, 0xFF, 0xFC, 0x00, 0xE0, 0x04, 0x00,
+ 0x60, 0x02, 0x00, 0x30, 0x01, 0x00, 0x18, 0x00, 0x80, 0x0C, 0x00, 0x40,
+ 0x06, 0x00, 0x20, 0x03, 0x00, 0x10, 0x01, 0x80, 0x08, 0x00, 0xC0, 0x04,
+ 0x00, 0x60, 0x02, 0x00, 0x00, 0x00, 0xF0, 0x06, 0x18, 0x10, 0x18, 0x40,
+ 0x11, 0x00, 0x22, 0x00, 0x44, 0x00, 0x88, 0x02, 0x18, 0x08, 0x18, 0x60,
+ 0x1F, 0x80, 0xC1, 0x82, 0x01, 0x88, 0x01, 0x20, 0x02, 0x40, 0x04, 0x80,
+ 0x09, 0x00, 0x23, 0x00, 0x83, 0x06, 0x01, 0xF0, 0x00, 0x00, 0xF0, 0x06,
+ 0x18, 0x10, 0x10, 0x40, 0x30, 0x80, 0x22, 0x00, 0x44, 0x00, 0x88, 0x03,
+ 0x10, 0x0E, 0x30, 0x34, 0x30, 0xD0, 0x3E, 0x20, 0x00, 0x40, 0x01, 0x00,
+ 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0xC0, 0x02, 0x00, 0x18, 0x0F, 0xC0,
+ 0x00, 0x1C, 0x7C, 0xF9, 0xF1, 0xC0, 0x00, 0x00, 0x00, 0x01, 0xC7, 0xCF,
+ 0x9F, 0x1C, 0x00, 0x01, 0xC0, 0x7C, 0x0F, 0x81, 0xF0, 0x1C, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x07, 0x81, 0xE0, 0x3C, 0x0F, 0x01,
+ 0xC0, 0x70, 0x0E, 0x03, 0x80, 0x60, 0x00, 0x00, 0x01, 0x80, 0x03, 0x80,
+ 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x00,
+ 0xE0, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x07,
+ 0x00, 0x00, 0xE0, 0x00, 0x38, 0x7F, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x18, 0x00, 0x03, 0x80,
+ 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x00, 0xE0,
+ 0x00, 0x0E, 0x00, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03,
+ 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x00, 0x1F, 0xCE, 0x06, 0x80,
+ 0x38, 0x01, 0x80, 0x10, 0x01, 0x00, 0x20, 0x04, 0x01, 0x80, 0xF0, 0x18,
+ 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x80, 0xF8,
+ 0x07, 0x00, 0x01, 0xF0, 0x0C, 0x30, 0x30, 0x30, 0x40, 0x21, 0x00, 0x44,
+ 0x00, 0x88, 0x01, 0x10, 0x1E, 0x40, 0xC4, 0x86, 0x11, 0x08, 0x22, 0x20,
+ 0x48, 0x40, 0x90, 0x82, 0x21, 0x84, 0x40, 0xFC, 0x80, 0x01, 0x00, 0x02,
+ 0x00, 0x04, 0x00, 0x04, 0x00, 0x0C, 0x18, 0x07, 0xC0, 0x00, 0x01, 0xFE,
+ 0x00, 0x00, 0x68, 0x00, 0x06, 0x40, 0x00, 0x32, 0x00, 0x03, 0x10, 0x00,
+ 0x10, 0x80, 0x01, 0x84, 0x00, 0x18, 0x10, 0x00, 0xC0, 0x80, 0x0C, 0x04,
+ 0x00, 0x60, 0x20, 0x06, 0x01, 0x00, 0x3F, 0xFC, 0x02, 0x00, 0x20, 0x10,
+ 0x01, 0x01, 0x00, 0x08, 0x08, 0x00, 0x40, 0x80, 0x02, 0x0C, 0x00, 0x09,
+ 0xFC, 0x07, 0xF0, 0x0F, 0xFF, 0x00, 0x40, 0x60, 0x20, 0x0C, 0x08, 0x01,
+ 0x02, 0x00, 0x40, 0x80, 0x10, 0x40, 0x08, 0x10, 0x06, 0x04, 0x03, 0x01,
+ 0xFF, 0x80, 0x40, 0x38, 0x20, 0x02, 0x08, 0x00, 0x42, 0x00, 0x10, 0x80,
+ 0x04, 0x40, 0x01, 0x10, 0x00, 0x84, 0x00, 0x41, 0x00, 0x23, 0xFF, 0xF0,
+ 0x00, 0xFC, 0x40, 0xC1, 0xF0, 0xC0, 0x1C, 0x60, 0x06, 0x10, 0x00, 0x88,
+ 0x00, 0x24, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x30, 0x00, 0x08, 0x00,
+ 0x02, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x03, 0x00, 0x00,
+ 0x40, 0x06, 0x08, 0x03, 0x01, 0x83, 0x80, 0x3F, 0x00, 0x0F, 0xFE, 0x00,
+ 0x80, 0xC0, 0x20, 0x18, 0x10, 0x02, 0x04, 0x00, 0x41, 0x00, 0x10, 0x40,
+ 0x04, 0x20, 0x01, 0x08, 0x00, 0x42, 0x00, 0x10, 0x80, 0x08, 0x20, 0x02,
+ 0x10, 0x00, 0x84, 0x00, 0x21, 0x00, 0x10, 0x40, 0x08, 0x20, 0x06, 0x08,
+ 0x03, 0x02, 0x01, 0x83, 0xFF, 0x80, 0x0F, 0xFF, 0xE0, 0x10, 0x02, 0x02,
+ 0x00, 0x60, 0x20, 0x06, 0x02, 0x00, 0x60, 0x20, 0x00, 0x04, 0x00, 0x00,
+ 0x40, 0x80, 0x04, 0x10, 0x00, 0x7F, 0x00, 0x04, 0x10, 0x00, 0x81, 0x00,
+ 0x08, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x81, 0x00, 0x08, 0x10, 0x00,
+ 0x81, 0x00, 0x18, 0x10, 0x01, 0x8F, 0xFF, 0xF0, 0x0F, 0xFF, 0xF0, 0x10,
+ 0x03, 0x02, 0x00, 0x30, 0x20, 0x03, 0x02, 0x00, 0x20, 0x20, 0x00, 0x04,
+ 0x00, 0x00, 0x40, 0x80, 0x04, 0x10, 0x00, 0x7F, 0x00, 0x04, 0x10, 0x00,
+ 0x81, 0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0xFE,
+ 0x40, 0xC0, 0xF0, 0x40, 0x1C, 0x20, 0x03, 0x10, 0x00, 0x88, 0x00, 0x02,
+ 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x08, 0x00, 0x02, 0x01,
+ 0xFE, 0x80, 0x02, 0x20, 0x00, 0x88, 0x00, 0x22, 0x00, 0x08, 0x40, 0x04,
+ 0x18, 0x01, 0x03, 0x81, 0xC0, 0x3F, 0x80, 0x07, 0xE1, 0xF8, 0x08, 0x02,
+ 0x00, 0x80, 0x10, 0x04, 0x00, 0x80, 0x20, 0x04, 0x01, 0x00, 0x20, 0x18,
+ 0x02, 0x00, 0x80, 0x10, 0x04, 0x00, 0x80, 0x3F, 0xFC, 0x01, 0x00, 0x60,
+ 0x10, 0x02, 0x00, 0x80, 0x10, 0x04, 0x00, 0x80, 0x20, 0x04, 0x02, 0x00,
+ 0x40, 0x10, 0x02, 0x00, 0x80, 0x10, 0x04, 0x00, 0x81, 0xF8, 0x3F, 0x00,
+ 0x0F, 0xFF, 0x80, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02,
+ 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00,
+ 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x80, 0x1F, 0xFF, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x20,
+ 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x04,
+ 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x0C, 0x04, 0x00,
+ 0x80, 0x40, 0x08, 0x08, 0x00, 0x80, 0x80, 0x08, 0x08, 0x01, 0x00, 0x80,
+ 0x10, 0x0C, 0x02, 0x00, 0x60, 0xC0, 0x01, 0xF0, 0x00, 0x0F, 0xE1, 0xF8,
+ 0x08, 0x03, 0x00, 0x80, 0x60, 0x04, 0x06, 0x00, 0x20, 0x60, 0x01, 0x06,
+ 0x00, 0x10, 0xC0, 0x00, 0x8C, 0x00, 0x04, 0xC0, 0x00, 0x2F, 0x80, 0x01,
+ 0x8E, 0x00, 0x18, 0x30, 0x00, 0x80, 0xC0, 0x04, 0x06, 0x00, 0x20, 0x10,
+ 0x02, 0x00, 0xC0, 0x10, 0x06, 0x00, 0x80, 0x30, 0x04, 0x00, 0x81, 0xFC,
+ 0x07, 0x80, 0x07, 0xFC, 0x00, 0x10, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00,
+ 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x40,
+ 0x00, 0x10, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x10, 0x20, 0x04,
+ 0x08, 0x01, 0x04, 0x00, 0x81, 0x00, 0x20, 0x40, 0x0B, 0xFF, 0xFE, 0x0F,
+ 0x00, 0x1E, 0x03, 0x00, 0x38, 0x05, 0x00, 0x68, 0x04, 0x80, 0x68, 0x04,
+ 0x80, 0xC8, 0x04, 0x80, 0x90, 0x04, 0x81, 0x90, 0x08, 0x43, 0x10, 0x08,
+ 0x42, 0x10, 0x08, 0x46, 0x10, 0x08, 0x4C, 0x20, 0x10, 0x2C, 0x20, 0x10,
+ 0x38, 0x20, 0x10, 0x30, 0x20, 0x10, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20,
+ 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0xFC, 0x07, 0xE0, 0x1F,
+ 0x01, 0xFC, 0x0C, 0x00, 0x80, 0x78, 0x02, 0x01, 0xE0, 0x18, 0x04, 0x80,
+ 0x60, 0x13, 0x01, 0x00, 0x4C, 0x04, 0x03, 0x18, 0x10, 0x0C, 0x60, 0xC0,
+ 0x20, 0x83, 0x00, 0x83, 0x08, 0x06, 0x0C, 0x20, 0x18, 0x18, 0x80, 0x40,
+ 0x66, 0x01, 0x00, 0x98, 0x04, 0x03, 0x40, 0x30, 0x0D, 0x00, 0xC0, 0x14,
+ 0x02, 0x00, 0x70, 0x3F, 0x80, 0xC0, 0x00, 0xF8, 0x01, 0x83, 0x01, 0x00,
+ 0xC1, 0x00, 0x21, 0x00, 0x19, 0x00, 0x04, 0x80, 0x02, 0x80, 0x01, 0x40,
+ 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x28, 0x00, 0x14, 0x00, 0x12,
+ 0x00, 0x09, 0x80, 0x08, 0x40, 0x08, 0x30, 0x08, 0x0C, 0x18, 0x01, 0xF0,
+ 0x00, 0x0F, 0xFE, 0x00, 0x40, 0x60, 0x20, 0x0C, 0x08, 0x01, 0x02, 0x00,
+ 0x40, 0x80, 0x10, 0x40, 0x04, 0x10, 0x02, 0x04, 0x01, 0x01, 0x01, 0x80,
+ 0x7F, 0x80, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x40,
+ 0x00, 0x10, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xF8,
+ 0x01, 0x83, 0x01, 0x00, 0xC1, 0x00, 0x21, 0x00, 0x19, 0x00, 0x05, 0x00,
+ 0x02, 0x80, 0x01, 0x40, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x28,
+ 0x00, 0x14, 0x00, 0x12, 0x00, 0x09, 0x80, 0x08, 0x40, 0x08, 0x30, 0x08,
+ 0x0C, 0x18, 0x03, 0xF0, 0x00, 0xC0, 0x01, 0xC0, 0x01, 0xFE, 0x18, 0xC0,
+ 0xF0, 0x0F, 0xFE, 0x00, 0x40, 0x60, 0x20, 0x0C, 0x08, 0x01, 0x02, 0x00,
+ 0x40, 0x80, 0x10, 0x40, 0x04, 0x10, 0x02, 0x04, 0x01, 0x01, 0x01, 0x80,
+ 0x7F, 0x80, 0x20, 0x60, 0x08, 0x0C, 0x02, 0x03, 0x80, 0x80, 0x60, 0x40,
+ 0x18, 0x10, 0x03, 0x04, 0x00, 0xC1, 0x00, 0x1B, 0xF8, 0x07, 0x00, 0x7E,
+ 0x40, 0x60, 0xF0, 0x20, 0x1C, 0x10, 0x02, 0x08, 0x00, 0x82, 0x00, 0x00,
+ 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xC0, 0x00,
+ 0x18, 0x00, 0x01, 0x00, 0x00, 0x44, 0x00, 0x11, 0x00, 0x04, 0x40, 0x02,
+ 0x38, 0x01, 0x0B, 0x81, 0x82, 0x3F, 0x80, 0x3F, 0xFF, 0xA0, 0x20, 0x50,
+ 0x10, 0x28, 0x08, 0x24, 0x08, 0x10, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10,
+ 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x1F,
+ 0xFC, 0x00, 0x7E, 0x0F, 0xC4, 0x00, 0x42, 0x00, 0x10, 0x80, 0x08, 0x20,
+ 0x02, 0x08, 0x00, 0x82, 0x00, 0x21, 0x00, 0x08, 0x40, 0x04, 0x10, 0x01,
+ 0x04, 0x00, 0x41, 0x00, 0x10, 0x80, 0x0C, 0x20, 0x02, 0x08, 0x00, 0x82,
+ 0x00, 0x60, 0x80, 0x10, 0x10, 0x08, 0x06, 0x0C, 0x00, 0x7C, 0x00, 0xFE,
+ 0x03, 0xF9, 0x80, 0x02, 0x0C, 0x00, 0x30, 0x20, 0x01, 0x01, 0x00, 0x10,
+ 0x08, 0x01, 0x80, 0x60, 0x08, 0x03, 0x00, 0xC0, 0x18, 0x04, 0x00, 0x40,
+ 0x60, 0x02, 0x06, 0x00, 0x10, 0x20, 0x00, 0xC3, 0x00, 0x06, 0x10, 0x00,
+ 0x31, 0x80, 0x00, 0x88, 0x00, 0x04, 0x80, 0x00, 0x2C, 0x00, 0x01, 0xC0,
+ 0x00, 0x0E, 0x00, 0x00, 0x7F, 0x07, 0xF2, 0x00, 0x04, 0x20, 0x00, 0xC2,
+ 0x00, 0x08, 0x20, 0xC0, 0x82, 0x0C, 0x18, 0x21, 0xA1, 0x02, 0x1A, 0x10,
+ 0x23, 0x23, 0x04, 0x32, 0x30, 0x46, 0x22, 0x04, 0x62, 0x60, 0x4C, 0x26,
+ 0x04, 0xC2, 0x40, 0x58, 0x24, 0x05, 0x82, 0xC0, 0x70, 0x28, 0x07, 0x02,
+ 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x00, 0x0F, 0xC1, 0xF8, 0x30, 0x03, 0x00,
+ 0xC0, 0x30, 0x06, 0x03, 0x00, 0x18, 0x10, 0x00, 0xC1, 0x00, 0x03, 0x18,
+ 0x00, 0x09, 0x80, 0x00, 0x78, 0x00, 0x01, 0x80, 0x00, 0x1C, 0x00, 0x01,
+ 0xA0, 0x00, 0x19, 0x80, 0x01, 0x84, 0x00, 0x18, 0x30, 0x01, 0x80, 0xC0,
+ 0x08, 0x06, 0x00, 0x80, 0x18, 0x08, 0x00, 0xC1, 0xF8, 0x3F, 0x80, 0x7E,
+ 0x0F, 0xC4, 0x00, 0xC1, 0x80, 0x60, 0x20, 0x30, 0x0C, 0x08, 0x03, 0x04,
+ 0x00, 0x43, 0x00, 0x19, 0x80, 0x02, 0xC0, 0x00, 0xE0, 0x00, 0x10, 0x00,
+ 0x04, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02,
+ 0x00, 0x01, 0x00, 0x00, 0x40, 0x03, 0xFF, 0x80, 0x0F, 0xFF, 0x86, 0x00,
+ 0x82, 0x00, 0x81, 0x00, 0xC1, 0x80, 0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0x00,
+ 0xC0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00,
+ 0x60, 0x10, 0x60, 0x18, 0x20, 0x08, 0x20, 0x04, 0x20, 0x02, 0x30, 0x03,
+ 0x1F, 0xFF, 0x80, 0x07, 0xE0, 0x80, 0x10, 0x02, 0x00, 0xC0, 0x18, 0x02,
+ 0x00, 0x40, 0x18, 0x03, 0x00, 0x40, 0x08, 0x01, 0x00, 0x60, 0x0C, 0x01,
+ 0x00, 0x20, 0x04, 0x01, 0x80, 0x30, 0x04, 0x00, 0x80, 0x10, 0x06, 0x00,
+ 0xFC, 0x00, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20,
+ 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04,
+ 0x02, 0x02, 0x02, 0x02, 0x00, 0x07, 0xE0, 0x0C, 0x01, 0x00, 0x20, 0x04,
+ 0x01, 0x80, 0x30, 0x04, 0x00, 0x80, 0x30, 0x06, 0x00, 0x80, 0x10, 0x02,
+ 0x00, 0xC0, 0x18, 0x02, 0x00, 0x40, 0x18, 0x03, 0x00, 0x40, 0x08, 0x03,
+ 0x00, 0x60, 0xF8, 0x00, 0x01, 0x00, 0x1C, 0x01, 0xB0, 0x19, 0x81, 0x86,
+ 0x18, 0x11, 0x80, 0xD8, 0x03, 0x80, 0x18, 0xFF, 0xFF, 0xF8, 0xC7, 0x1C,
+ 0x71, 0x80, 0x03, 0xF8, 0x0C, 0x0C, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
+ 0x00, 0x02, 0x07, 0xFC, 0x18, 0x0C, 0x20, 0x04, 0x40, 0x04, 0x80, 0x04,
+ 0x80, 0x08, 0x80, 0x38, 0xC0, 0xE8, 0x3F, 0x0F, 0x0F, 0x00, 0x00, 0x20,
+ 0x00, 0x04, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x04, 0x00, 0x00, 0x87,
+ 0xC0, 0x13, 0x0C, 0x06, 0x80, 0x40, 0xE0, 0x0C, 0x18, 0x00, 0x82, 0x00,
+ 0x10, 0xC0, 0x02, 0x10, 0x00, 0x42, 0x00, 0x08, 0x40, 0x02, 0x08, 0x00,
+ 0x43, 0x80, 0x10, 0x70, 0x04, 0x09, 0x83, 0x0F, 0x1F, 0x80, 0x01, 0xFC,
+ 0x83, 0x03, 0xC6, 0x00, 0xE4, 0x00, 0x22, 0x00, 0x12, 0x00, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x18, 0x00, 0x64,
+ 0x00, 0x61, 0x81, 0xC0, 0x7F, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x30, 0x00,
+ 0x0C, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x60, 0x3F, 0x18, 0x10, 0x64,
+ 0x18, 0x0D, 0x08, 0x01, 0xC2, 0x00, 0x71, 0x00, 0x0C, 0x80, 0x02, 0x20,
+ 0x00, 0x88, 0x00, 0x62, 0x00, 0x18, 0x80, 0x0E, 0x20, 0x03, 0x04, 0x03,
+ 0x40, 0xC1, 0xB0, 0x1F, 0x8F, 0x00, 0x01, 0xF0, 0x0E, 0x0C, 0x18, 0x06,
+ 0x30, 0x02, 0x60, 0x01, 0x40, 0x01, 0xC0, 0x01, 0xFF, 0xFF, 0x80, 0x00,
+ 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x60, 0x06, 0x30, 0x1C, 0x0F, 0xE0,
+ 0x00, 0x1F, 0xE0, 0x0C, 0x00, 0x03, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00,
+ 0x02, 0x00, 0x07, 0xFF, 0xC0, 0x08, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00,
+ 0x08, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x80, 0x00,
+ 0x20, 0x00, 0x04, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x04, 0x00, 0x0F,
+ 0xFF, 0x00, 0x03, 0xE3, 0xE1, 0x83, 0x60, 0x40, 0x38, 0x10, 0x03, 0x04,
+ 0x00, 0x60, 0x80, 0x0C, 0x20, 0x01, 0x84, 0x00, 0x20, 0x80, 0x04, 0x10,
+ 0x01, 0x82, 0x00, 0x30, 0x60, 0x0C, 0x04, 0x02, 0x80, 0x61, 0x90, 0x07,
+ 0xC6, 0x00, 0x00, 0xC0, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00,
+ 0x30, 0x00, 0x0C, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x40, 0x00,
+ 0x10, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x23, 0xE0, 0x0B,
+ 0x0C, 0x05, 0x00, 0x81, 0x80, 0x20, 0x40, 0x08, 0x10, 0x02, 0x08, 0x00,
+ 0x82, 0x00, 0x60, 0x80, 0x18, 0x20, 0x06, 0x10, 0x01, 0x84, 0x00, 0x61,
+ 0x00, 0x30, 0x40, 0x0C, 0xFC, 0x1F, 0xC0, 0x00, 0x30, 0x00, 0x60, 0x00,
+ 0xC0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x20,
+ 0x00, 0x40, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00,
+ 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x10, 0x1F, 0xFF,
+ 0x80, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x60, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20,
+ 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x20, 0x00,
+ 0x40, 0x00, 0x80, 0x01, 0x00, 0x06, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20,
+ 0x00, 0x80, 0x03, 0x00, 0x0C, 0x0F, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x60,
+ 0x00, 0x10, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0xC0, 0x00, 0x30, 0xFC,
+ 0x08, 0x18, 0x02, 0x0C, 0x00, 0x8C, 0x00, 0x66, 0x00, 0x1B, 0x00, 0x05,
+ 0x80, 0x01, 0xB0, 0x00, 0x46, 0x00, 0x31, 0xC0, 0x0C, 0x30, 0x02, 0x06,
+ 0x00, 0x80, 0xC0, 0x60, 0x30, 0xF8, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x20,
+ 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00,
+ 0x20, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x20,
+ 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x04, 0x00, 0x08, 0x0F, 0xFF, 0xC0,
+ 0x1C, 0xF1, 0xE0, 0xF1, 0xE3, 0x0E, 0x1C, 0x10, 0xC1, 0x81, 0x08, 0x10,
+ 0x30, 0x81, 0x03, 0x18, 0x10, 0x21, 0x83, 0x02, 0x10, 0x30, 0x21, 0x02,
+ 0x06, 0x10, 0x20, 0x63, 0x02, 0x04, 0x30, 0x60, 0x42, 0x06, 0x04, 0xF8,
+ 0x70, 0xF0, 0x0E, 0x3E, 0x01, 0x60, 0x81, 0xC0, 0x20, 0xC0, 0x10, 0x40,
+ 0x08, 0x20, 0x04, 0x30, 0x02, 0x10, 0x02, 0x08, 0x01, 0x04, 0x00, 0x82,
+ 0x00, 0x42, 0x00, 0x21, 0x00, 0x20, 0x80, 0x13, 0xF0, 0x3E, 0x01, 0xF0,
+ 0x06, 0x0C, 0x18, 0x06, 0x20, 0x03, 0x60, 0x01, 0x40, 0x01, 0x80, 0x01,
+ 0x80, 0x01, 0x80, 0x01, 0x80, 0x02, 0x80, 0x06, 0xC0, 0x04, 0x40, 0x18,
+ 0x30, 0x60, 0x1F, 0x80, 0x0F, 0x1F, 0x80, 0x16, 0x0C, 0x01, 0xC0, 0x20,
+ 0x30, 0x03, 0x03, 0x00, 0x10, 0x20, 0x01, 0x02, 0x00, 0x10, 0x40, 0x01,
+ 0x04, 0x00, 0x10, 0x40, 0x02, 0x06, 0x00, 0x60, 0x60, 0x04, 0x0B, 0x00,
+ 0x80, 0x98, 0x30, 0x08, 0xFC, 0x00, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,
+ 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x0F, 0xF0, 0x00, 0x03,
+ 0xF1, 0xE1, 0x83, 0x20, 0x40, 0x34, 0x10, 0x03, 0x84, 0x00, 0x30, 0x80,
+ 0x04, 0x20, 0x00, 0x84, 0x00, 0x10, 0x80, 0x06, 0x10, 0x00, 0xC2, 0x00,
+ 0x30, 0x60, 0x0E, 0x04, 0x03, 0x40, 0x60, 0xC8, 0x07, 0xE2, 0x00, 0x00,
+ 0x40, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x01,
+ 0x00, 0x03, 0xFC, 0x00, 0x0F, 0x87, 0xC0, 0x23, 0x08, 0x04, 0xC0, 0x00,
+ 0xE0, 0x00, 0x18, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x02,
+ 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x40, 0x00, 0x08,
+ 0x00, 0x3F, 0xFE, 0x00, 0x01, 0xFA, 0x0C, 0x1C, 0x20, 0x08, 0x80, 0x11,
+ 0x00, 0x03, 0x00, 0x03, 0xF8, 0x00, 0x7C, 0x00, 0x0C, 0x00, 0x09, 0x00,
+ 0x16, 0x00, 0x2C, 0x00, 0x9E, 0x06, 0x27, 0xF0, 0x00, 0x08, 0x00, 0x40,
+ 0x02, 0x00, 0x10, 0x00, 0x80, 0x7F, 0xFC, 0x40, 0x02, 0x00, 0x10, 0x00,
+ 0x80, 0x08, 0x00, 0x40, 0x02, 0x00, 0x10, 0x01, 0x00, 0x08, 0x00, 0x40,
+ 0x02, 0x00, 0xD8, 0x1C, 0x3F, 0x00, 0xF0, 0x1E, 0x20, 0x04, 0x80, 0x09,
+ 0x00, 0x12, 0x00, 0x24, 0x00, 0xC8, 0x01, 0x20, 0x02, 0x40, 0x04, 0x80,
+ 0x09, 0x00, 0x12, 0x00, 0x64, 0x03, 0x8C, 0x1D, 0x0F, 0xC3, 0x80, 0xFE,
+ 0x0F, 0xE6, 0x00, 0x20, 0x40, 0x08, 0x08, 0x03, 0x01, 0x80, 0x40, 0x30,
+ 0x18, 0x06, 0x02, 0x00, 0x40, 0x80, 0x08, 0x30, 0x01, 0x84, 0x00, 0x31,
+ 0x80, 0x02, 0x20, 0x00, 0x48, 0x00, 0x09, 0x00, 0x01, 0xC0, 0x00, 0xF8,
+ 0x0F, 0xA0, 0x01, 0x90, 0x00, 0x88, 0x40, 0xC4, 0x30, 0x42, 0x18, 0x61,
+ 0x1A, 0x20, 0x8D, 0x10, 0x4C, 0x98, 0x26, 0x48, 0x16, 0x2C, 0x0B, 0x14,
+ 0x07, 0x0A, 0x03, 0x07, 0x01, 0x81, 0x00, 0x0F, 0x83, 0xE0, 0xC0, 0x18,
+ 0x0C, 0x0C, 0x01, 0x83, 0x00, 0x18, 0xC0, 0x01, 0xB0, 0x00, 0x1C, 0x00,
+ 0x03, 0x00, 0x00, 0xF0, 0x00, 0x63, 0x00, 0x18, 0x30, 0x06, 0x06, 0x01,
+ 0x80, 0x60, 0x60, 0x06, 0x3F, 0x07, 0xE0, 0x0F, 0xC0, 0xF8, 0x30, 0x01,
+ 0x00, 0x80, 0x18, 0x04, 0x00, 0x80, 0x30, 0x0C, 0x01, 0x80, 0xC0, 0x04,
+ 0x04, 0x00, 0x30, 0x60, 0x01, 0x86, 0x00, 0x04, 0x20, 0x00, 0x23, 0x00,
+ 0x01, 0xB0, 0x00, 0x0D, 0x00, 0x00, 0x38, 0x00, 0x01, 0x80, 0x00, 0x08,
+ 0x00, 0x00, 0xC0, 0x00, 0x04, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00,
+ 0x20, 0x00, 0x7F, 0xE0, 0x00, 0x1F, 0xFF, 0x10, 0x06, 0x10, 0x0C, 0x10,
+ 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x06,
+ 0x00, 0x0C, 0x00, 0x18, 0x04, 0x30, 0x0C, 0x60, 0x0C, 0xFF, 0xF8, 0x00,
+ 0xE0, 0x20, 0x08, 0x01, 0x00, 0x20, 0x04, 0x01, 0x00, 0x20, 0x04, 0x00,
+ 0x80, 0x20, 0x08, 0x0E, 0x00, 0x60, 0x04, 0x00, 0x80, 0x10, 0x02, 0x00,
+ 0x40, 0x08, 0x02, 0x00, 0x40, 0x08, 0x01, 0x00, 0x18, 0x00, 0x00, 0x10,
+ 0xC3, 0x08, 0x20, 0x86, 0x18, 0x41, 0x04, 0x30, 0xC2, 0x08, 0x21, 0x86,
+ 0x10, 0x43, 0x0C, 0x20, 0x06, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40,
+ 0x10, 0x04, 0x02, 0x00, 0x80, 0x20, 0x0C, 0x01, 0xC0, 0xC0, 0x40, 0x10,
+ 0x04, 0x03, 0x00, 0x80, 0x20, 0x08, 0x02, 0x01, 0x00, 0xC0, 0xE0, 0x00,
+ 0x1E, 0x02, 0x66, 0x0D, 0x86, 0x16, 0x06, 0x48, 0x07, 0x00 };
+
+const GFXglyph FreeMonoOblique18pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 21, 0, 1 }, // 0x20 ' '
+ { 0, 7, 22, 21, 9, -21 }, // 0x21 '!'
+ { 20, 13, 10, 21, 7, -20 }, // 0x22 '"'
+ { 37, 15, 24, 21, 5, -21 }, // 0x23 '#'
+ { 82, 16, 26, 21, 4, -22 }, // 0x24 '$'
+ { 134, 16, 21, 21, 5, -20 }, // 0x25 '%'
+ { 176, 13, 18, 21, 5, -17 }, // 0x26 '&'
+ { 206, 5, 10, 21, 12, -20 }, // 0x27 '''
+ { 213, 8, 25, 21, 12, -20 }, // 0x28 '('
+ { 238, 8, 25, 21, 5, -20 }, // 0x29 ')'
+ { 263, 14, 11, 21, 7, -19 }, // 0x2A '*'
+ { 283, 15, 17, 21, 5, -17 }, // 0x2B '+'
+ { 315, 9, 10, 21, 4, -4 }, // 0x2C ','
+ { 327, 16, 1, 21, 5, -9 }, // 0x2D '-'
+ { 329, 5, 5, 21, 8, -4 }, // 0x2E '.'
+ { 333, 19, 26, 21, 3, -22 }, // 0x2F '/'
+ { 395, 14, 21, 21, 5, -20 }, // 0x30 '0'
+ { 432, 13, 21, 21, 4, -20 }, // 0x31 '1'
+ { 467, 17, 21, 21, 3, -20 }, // 0x32 '2'
+ { 512, 16, 21, 21, 3, -20 }, // 0x33 '3'
+ { 554, 14, 21, 21, 5, -20 }, // 0x34 '4'
+ { 591, 17, 21, 21, 4, -20 }, // 0x35 '5'
+ { 636, 16, 21, 21, 6, -20 }, // 0x36 '6'
+ { 678, 13, 21, 21, 8, -20 }, // 0x37 '7'
+ { 713, 15, 21, 21, 5, -20 }, // 0x38 '8'
+ { 753, 15, 21, 21, 5, -20 }, // 0x39 '9'
+ { 793, 7, 15, 21, 8, -14 }, // 0x3A ':'
+ { 807, 11, 20, 21, 4, -14 }, // 0x3B ';'
+ { 835, 17, 16, 21, 5, -17 }, // 0x3C '<'
+ { 869, 19, 6, 21, 3, -12 }, // 0x3D '='
+ { 884, 18, 16, 21, 3, -17 }, // 0x3E '>'
+ { 920, 12, 20, 21, 8, -19 }, // 0x3F '?'
+ { 950, 15, 23, 21, 5, -20 }, // 0x40 '@'
+ { 994, 21, 20, 21, 0, -19 }, // 0x41 'A'
+ { 1047, 18, 20, 21, 2, -19 }, // 0x42 'B'
+ { 1092, 18, 20, 21, 4, -19 }, // 0x43 'C'
+ { 1137, 18, 20, 21, 2, -19 }, // 0x44 'D'
+ { 1182, 20, 20, 21, 2, -19 }, // 0x45 'E'
+ { 1232, 20, 20, 21, 2, -19 }, // 0x46 'F'
+ { 1282, 18, 20, 21, 4, -19 }, // 0x47 'G'
+ { 1327, 21, 20, 21, 2, -19 }, // 0x48 'H'
+ { 1380, 17, 20, 21, 4, -19 }, // 0x49 'I'
+ { 1423, 20, 20, 21, 4, -19 }, // 0x4A 'J'
+ { 1473, 21, 20, 21, 2, -19 }, // 0x4B 'K'
+ { 1526, 18, 20, 21, 2, -19 }, // 0x4C 'L'
+ { 1571, 24, 20, 21, 1, -19 }, // 0x4D 'M'
+ { 1631, 22, 20, 21, 2, -19 }, // 0x4E 'N'
+ { 1686, 17, 20, 21, 4, -19 }, // 0x4F 'O'
+ { 1729, 18, 20, 21, 2, -19 }, // 0x50 'P'
+ { 1774, 17, 24, 21, 4, -19 }, // 0x51 'Q'
+ { 1825, 18, 20, 21, 2, -19 }, // 0x52 'R'
+ { 1870, 18, 20, 21, 3, -19 }, // 0x53 'S'
+ { 1915, 17, 20, 21, 5, -19 }, // 0x54 'T'
+ { 1958, 18, 20, 21, 5, -19 }, // 0x55 'U'
+ { 2003, 21, 20, 21, 4, -19 }, // 0x56 'V'
+ { 2056, 20, 20, 21, 4, -19 }, // 0x57 'W'
+ { 2106, 21, 20, 21, 2, -19 }, // 0x58 'X'
+ { 2159, 18, 20, 21, 5, -19 }, // 0x59 'Y'
+ { 2204, 17, 20, 21, 4, -19 }, // 0x5A 'Z'
+ { 2247, 11, 25, 21, 9, -20 }, // 0x5B '['
+ { 2282, 8, 27, 21, 9, -22 }, // 0x5C '\'
+ { 2309, 11, 25, 21, 5, -20 }, // 0x5D ']'
+ { 2344, 13, 9, 21, 7, -20 }, // 0x5E '^'
+ { 2359, 21, 1, 21, -1, 4 }, // 0x5F '_'
+ { 2362, 5, 5, 21, 9, -21 }, // 0x60 '`'
+ { 2366, 16, 15, 21, 3, -14 }, // 0x61 'a'
+ { 2396, 19, 21, 21, 1, -20 }, // 0x62 'b'
+ { 2446, 17, 15, 21, 4, -14 }, // 0x63 'c'
+ { 2478, 18, 21, 21, 4, -20 }, // 0x64 'd'
+ { 2526, 16, 15, 21, 4, -14 }, // 0x65 'e'
+ { 2556, 19, 21, 21, 4, -20 }, // 0x66 'f'
+ { 2606, 19, 22, 21, 4, -14 }, // 0x67 'g'
+ { 2659, 18, 21, 21, 2, -20 }, // 0x68 'h'
+ { 2707, 15, 22, 21, 3, -21 }, // 0x69 'i'
+ { 2749, 15, 29, 21, 3, -21 }, // 0x6A 'j'
+ { 2804, 18, 21, 21, 2, -20 }, // 0x6B 'k'
+ { 2852, 15, 21, 21, 3, -20 }, // 0x6C 'l'
+ { 2892, 20, 15, 21, 1, -14 }, // 0x6D 'm'
+ { 2930, 17, 15, 21, 2, -14 }, // 0x6E 'n'
+ { 2962, 16, 15, 21, 4, -14 }, // 0x6F 'o'
+ { 2992, 20, 22, 21, 0, -14 }, // 0x70 'p'
+ { 3047, 19, 22, 21, 4, -14 }, // 0x71 'q'
+ { 3100, 19, 15, 21, 3, -14 }, // 0x72 'r'
+ { 3136, 15, 15, 21, 4, -14 }, // 0x73 's'
+ { 3165, 13, 20, 21, 5, -19 }, // 0x74 't'
+ { 3198, 15, 15, 21, 4, -14 }, // 0x75 'u'
+ { 3227, 19, 15, 21, 4, -14 }, // 0x76 'v'
+ { 3263, 17, 15, 21, 5, -14 }, // 0x77 'w'
+ { 3295, 19, 15, 21, 2, -14 }, // 0x78 'x'
+ { 3331, 21, 22, 21, 1, -14 }, // 0x79 'y'
+ { 3389, 16, 15, 21, 4, -14 }, // 0x7A 'z'
+ { 3419, 11, 25, 21, 8, -20 }, // 0x7B '{'
+ { 3454, 6, 24, 21, 9, -19 }, // 0x7C '|'
+ { 3472, 10, 25, 21, 6, -20 }, // 0x7D '}'
+ { 3504, 15, 5, 21, 5, -11 } }; // 0x7E '~'
+
+const GFXfont FreeMonoOblique18pt7b PROGMEM = {
+ (uint8_t *)FreeMonoOblique18pt7bBitmaps,
+ (GFXglyph *)FreeMonoOblique18pt7bGlyphs,
+ 0x20, 0x7E, 35 };
+
+// Approx. 4186 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoOblique24pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoOblique24pt7b.h
new file mode 100644
index 000000000000..8a5592c29c3e
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoOblique24pt7b.h
@@ -0,0 +1,643 @@
+const uint8_t FreeMonoOblique24pt7bBitmaps[] PROGMEM = {
+ 0x01, 0xC0, 0xF0, 0x3C, 0x0E, 0x03, 0x81, 0xE0, 0x78, 0x1C, 0x07, 0x01,
+ 0xC0, 0xE0, 0x38, 0x0E, 0x03, 0x00, 0xC0, 0x70, 0x1C, 0x06, 0x01, 0x80,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x0F, 0x83, 0xE0, 0xF8,
+ 0x1C, 0x00, 0x7E, 0x3F, 0x7E, 0x3F, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E,
+ 0x78, 0x3C, 0xF8, 0x7C, 0xF0, 0x78, 0xF0, 0x78, 0xF0, 0x78, 0xE0, 0x70,
+ 0xE0, 0x70, 0xE0, 0x70, 0xC0, 0x60, 0x00, 0x18, 0x30, 0x00, 0x61, 0x80,
+ 0x01, 0x86, 0x00, 0x04, 0x18, 0x00, 0x30, 0xC0, 0x00, 0xC3, 0x00, 0x03,
+ 0x0C, 0x00, 0x18, 0x30, 0x00, 0x61, 0x80, 0x01, 0x86, 0x00, 0x06, 0x18,
+ 0x07, 0xFF, 0xFF, 0x1F, 0xFF, 0xFC, 0x03, 0x0C, 0x00, 0x18, 0x30, 0x00,
+ 0x61, 0x80, 0x01, 0x86, 0x00, 0x06, 0x18, 0x00, 0x30, 0xC0, 0x1F, 0xFF,
+ 0xF8, 0x7F, 0xFF, 0xE0, 0x18, 0x30, 0x00, 0x61, 0x80, 0x01, 0x86, 0x00,
+ 0x06, 0x18, 0x00, 0x30, 0x40, 0x00, 0xC3, 0x00, 0x03, 0x0C, 0x00, 0x18,
+ 0x30, 0x00, 0x61, 0x80, 0x01, 0x86, 0x00, 0x06, 0x18, 0x00, 0x00, 0x03,
+ 0x00, 0x00, 0x18, 0x00, 0x00, 0x80, 0x00, 0x3F, 0x00, 0x07, 0xFD, 0x80,
+ 0x70, 0x7C, 0x06, 0x00, 0xE0, 0x60, 0x02, 0x07, 0x00, 0x10, 0x30, 0x00,
+ 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x00, 0x01, 0xF0, 0x00, 0x07,
+ 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x18,
+ 0x00, 0x00, 0xC2, 0x00, 0x06, 0x30, 0x00, 0x61, 0x80, 0x03, 0x1E, 0x00,
+ 0x30, 0xFC, 0x07, 0x06, 0x7F, 0xF0, 0x00, 0xFE, 0x00, 0x01, 0x80, 0x00,
+ 0x0C, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80,
+ 0x00, 0x00, 0x78, 0x00, 0x07, 0xF8, 0x00, 0x38, 0x60, 0x01, 0xC0, 0xC0,
+ 0x06, 0x03, 0x00, 0x30, 0x0C, 0x00, 0xC0, 0x30, 0x03, 0x01, 0x80, 0x0C,
+ 0x0E, 0x00, 0x38, 0x70, 0x00, 0x7F, 0x81, 0xC0, 0xF8, 0x3F, 0x00, 0x07,
+ 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xC0, 0x00, 0x78, 0x00, 0x01,
+ 0x00, 0x78, 0x00, 0x07, 0xF8, 0x00, 0x38, 0x60, 0x01, 0x80, 0xC0, 0x06,
+ 0x03, 0x00, 0x30, 0x0C, 0x00, 0xC0, 0x30, 0x03, 0x01, 0x80, 0x0C, 0x0E,
+ 0x00, 0x18, 0x70, 0x00, 0x7F, 0x80, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00,
+ 0x0F, 0xF8, 0x03, 0x8E, 0x00, 0xC0, 0x00, 0x38, 0x00, 0x06, 0x00, 0x00,
+ 0xC0, 0x00, 0x18, 0x00, 0x01, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x03,
+ 0xE0, 0x01, 0xCC, 0x0E, 0x60, 0xC3, 0xD8, 0x18, 0x63, 0x03, 0x18, 0xC0,
+ 0x33, 0x18, 0x06, 0xC3, 0x00, 0x70, 0x60, 0x0E, 0x0C, 0x01, 0xC0, 0xC0,
+ 0x78, 0x1C, 0x3B, 0xE1, 0xFE, 0x3C, 0x1F, 0x00, 0x00, 0x7E, 0xFD, 0xF3,
+ 0xE7, 0xCF, 0x3E, 0x78, 0xF1, 0xE3, 0x87, 0x0E, 0x18, 0x00, 0x00, 0x60,
+ 0x18, 0x07, 0x00, 0xC0, 0x30, 0x0E, 0x01, 0x80, 0x70, 0x0C, 0x03, 0x80,
+ 0x60, 0x1C, 0x03, 0x80, 0xE0, 0x1C, 0x03, 0x80, 0xF0, 0x1C, 0x03, 0x80,
+ 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x30,
+ 0x06, 0x00, 0xC0, 0x1C, 0x01, 0x80, 0x30, 0x02, 0x00, 0x01, 0x80, 0x30,
+ 0x06, 0x00, 0xE0, 0x0C, 0x01, 0x80, 0x30, 0x07, 0x00, 0xE0, 0x1C, 0x03,
+ 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x38, 0x07, 0x00,
+ 0xE0, 0x3C, 0x07, 0x00, 0xE0, 0x38, 0x07, 0x01, 0xC0, 0x38, 0x0E, 0x01,
+ 0x80, 0x70, 0x0C, 0x03, 0x00, 0xC0, 0x10, 0x00, 0x00, 0x20, 0x00, 0x18,
+ 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x30, 0x0E, 0x0C, 0x0B,
+ 0xF3, 0x3E, 0x3F, 0xFE, 0x01, 0xFC, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x0E,
+ 0x60, 0x07, 0x18, 0x01, 0x83, 0x00, 0xC0, 0xC0, 0x60, 0x30, 0x00, 0x00,
+ 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x18,
+ 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00,
+ 0x00, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x30, 0x00, 0x01,
+ 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80,
+ 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00,
+ 0x03, 0xF0, 0x7E, 0x07, 0xC0, 0xF8, 0x0F, 0x81, 0xF0, 0x1E, 0x03, 0xE0,
+ 0x3C, 0x07, 0x80, 0x70, 0x0F, 0x00, 0xE0, 0x0C, 0x00, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xE0, 0x3C, 0xFF, 0xFF, 0xFF, 0xCF, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C,
+ 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60,
+ 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00,
+ 0x00, 0x07, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x1C, 0x00,
+ 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x70, 0x00, 0x00, 0x60, 0x00,
+ 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00,
+ 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00,
+ 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xE0, 0x00, 0x00,
+ 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x0F, 0xF8, 0x01,
+ 0xC1, 0xC0, 0x38, 0x0E, 0x07, 0x00, 0x60, 0xE0, 0x03, 0x0C, 0x00, 0x31,
+ 0x80, 0x03, 0x18, 0x00, 0x33, 0x00, 0x03, 0x30, 0x00, 0x33, 0x00, 0x03,
+ 0x20, 0x00, 0x26, 0x00, 0x06, 0x60, 0x00, 0x66, 0x00, 0x06, 0x40, 0x00,
+ 0x4C, 0x00, 0x0C, 0xC0, 0x00, 0xCC, 0x00, 0x0C, 0xC0, 0x01, 0x8C, 0x00,
+ 0x18, 0xC0, 0x01, 0x8C, 0x00, 0x30, 0xC0, 0x07, 0x06, 0x00, 0xE0, 0x60,
+ 0x1C, 0x03, 0x87, 0x80, 0x3F, 0xF0, 0x00, 0xFC, 0x00, 0x00, 0x0E, 0x00,
+ 0x0F, 0x00, 0x0F, 0x80, 0x0E, 0xC0, 0x1C, 0xC0, 0x1C, 0x60, 0x1C, 0x30,
+ 0x08, 0x18, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01,
+ 0x80, 0x01, 0xC0, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00,
+ 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x01, 0x80,
+ 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x1F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00,
+ 0x07, 0xE0, 0x00, 0x3F, 0xE0, 0x01, 0xE0, 0xE0, 0x07, 0x00, 0xE0, 0x1C,
+ 0x00, 0xE0, 0x30, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x00, 0x03, 0x00, 0x00,
+ 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03,
+ 0x00, 0x00, 0x1C, 0x00, 0x00, 0x70, 0x00, 0x01, 0xC0, 0x00, 0x07, 0x00,
+ 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00,
+ 0x70, 0x00, 0x01, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xE0,
+ 0x00, 0xC3, 0x80, 0x01, 0x87, 0xFF, 0xFF, 0x0F, 0xFF, 0xFC, 0x00, 0x00,
+ 0x0F, 0xC0, 0x01, 0xFF, 0xC0, 0x1E, 0x07, 0x80, 0xE0, 0x06, 0x03, 0x00,
+ 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C,
+ 0x00, 0x00, 0x60, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00,
+ 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xE0, 0x00, 0x01,
+ 0x80, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0,
+ 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xE3, 0x00, 0x07, 0x0E, 0x00,
+ 0x38, 0x1E, 0x03, 0xC0, 0x3F, 0xFC, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x03,
+ 0xE0, 0x00, 0xF8, 0x00, 0x1B, 0x00, 0x06, 0x60, 0x01, 0x8C, 0x00, 0x63,
+ 0x00, 0x18, 0x60, 0x07, 0x0C, 0x00, 0xC1, 0x80, 0x30, 0x30, 0x0C, 0x0C,
+ 0x03, 0x01, 0x80, 0xC0, 0x30, 0x18, 0x06, 0x06, 0x00, 0xC1, 0x80, 0x30,
+ 0x60, 0x06, 0x18, 0x00, 0xC3, 0xFF, 0xFE, 0x7F, 0xFF, 0xC0, 0x00, 0xC0,
+ 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00, 0x03, 0x00,
+ 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x40,
+ 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00,
+ 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0xBF, 0xC0, 0x0F, 0xFF,
+ 0x80, 0xF8, 0x1E, 0x02, 0x00, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x06, 0x00,
+ 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x06,
+ 0x00, 0x00, 0x30, 0x00, 0x03, 0x80, 0x00, 0x18, 0xC0, 0x01, 0x87, 0x00,
+ 0x38, 0x1E, 0x07, 0x80, 0x7F, 0xF8, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x03,
+ 0xF0, 0x00, 0xFF, 0xC0, 0x1F, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x01,
+ 0x80, 0x00, 0x18, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x00, 0xC0, 0x00,
+ 0x0E, 0x00, 0x00, 0x60, 0x00, 0x07, 0x0F, 0x80, 0x31, 0xFF, 0x01, 0x9C,
+ 0x3C, 0x0D, 0x80, 0x60, 0xD8, 0x03, 0x87, 0x80, 0x0C, 0x38, 0x00, 0x61,
+ 0xC0, 0x03, 0x0C, 0x00, 0x18, 0x60, 0x00, 0xC3, 0x00, 0x0C, 0x18, 0x00,
+ 0x60, 0xE0, 0x06, 0x03, 0x00, 0x30, 0x1C, 0x07, 0x00, 0x70, 0x70, 0x01,
+ 0xFF, 0x00, 0x07, 0xE0, 0x00, 0x7F, 0xFF, 0xDF, 0xFF, 0xFC, 0x00, 0x0F,
+ 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00,
+ 0x06, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x18, 0x00, 0x0C,
+ 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, 0x0C, 0x00,
+ 0x06, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x18, 0x00, 0x0C,
+ 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x00, 0x3F, 0x00, 0x0F,
+ 0xFC, 0x01, 0xC1, 0xE0, 0x70, 0x06, 0x06, 0x00, 0x30, 0xC0, 0x03, 0x1C,
+ 0x00, 0x31, 0x80, 0x03, 0x18, 0x00, 0x31, 0x80, 0x06, 0x18, 0x00, 0xE0,
+ 0xC0, 0x1C, 0x0F, 0x07, 0x80, 0x3F, 0xE0, 0x03, 0xFE, 0x00, 0xE0, 0x70,
+ 0x18, 0x03, 0x83, 0x00, 0x1C, 0x60, 0x00, 0xC6, 0x00, 0x0C, 0xC0, 0x00,
+ 0xCC, 0x00, 0x0C, 0xC0, 0x00, 0xCC, 0x00, 0x18, 0xC0, 0x03, 0x8E, 0x00,
+ 0x70, 0x60, 0x0E, 0x07, 0x83, 0xC0, 0x3F, 0xF0, 0x00, 0xFC, 0x00, 0x00,
+ 0x0F, 0x80, 0x00, 0xFF, 0x80, 0x0F, 0x07, 0x00, 0x70, 0x0E, 0x03, 0x80,
+ 0x18, 0x0C, 0x00, 0x70, 0x60, 0x00, 0xC1, 0x80, 0x03, 0x0C, 0x00, 0x0C,
+ 0x30, 0x00, 0x30, 0xC0, 0x01, 0xC3, 0x00, 0x0F, 0x0C, 0x00, 0x6C, 0x38,
+ 0x03, 0xF0, 0x60, 0x1D, 0x81, 0xE1, 0xE6, 0x03, 0xFE, 0x18, 0x03, 0xE0,
+ 0xC0, 0x00, 0x03, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00,
+ 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x03,
+ 0xC0, 0x00, 0x7C, 0x00, 0xFF, 0xC0, 0x01, 0xF8, 0x00, 0x00, 0x07, 0x83,
+ 0xF1, 0xFC, 0x7F, 0x1F, 0x83, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7E, 0x3F, 0x8F, 0xE3, 0xF0, 0x78,
+ 0x00, 0x00, 0x3C, 0x00, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xC0, 0x0F,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7E, 0x00, 0xFC, 0x03, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x3E,
+ 0x00, 0xF8, 0x01, 0xE0, 0x07, 0x80, 0x0F, 0x00, 0x3C, 0x00, 0x70, 0x01,
+ 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3C, 0x00, 0x01,
+ 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00,
+ 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x03,
+ 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00,
+ 0x70, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00,
+ 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0C, 0x00, 0x3F, 0xFF, 0xFF, 0x9F,
+ 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF,
+ 0x00, 0x06, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0,
+ 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01,
+ 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00,
+ 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C,
+ 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00,
+ 0x00, 0x70, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x07, 0xF0, 0x3F, 0xFC, 0x78,
+ 0x1E, 0xC0, 0x07, 0xC0, 0x03, 0xC0, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00,
+ 0x06, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x38, 0x00, 0xE0, 0x07, 0xC0, 0x07,
+ 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x7E, 0x00, 0xFE, 0x00, 0xFE,
+ 0x00, 0x7C, 0x00, 0x00, 0x3F, 0x00, 0x1F, 0xF0, 0x07, 0x07, 0x01, 0xC0,
+ 0x70, 0x60, 0x06, 0x1C, 0x00, 0xC3, 0x00, 0x18, 0xC0, 0x03, 0x18, 0x00,
+ 0x66, 0x00, 0xFC, 0xC0, 0x7F, 0x98, 0x1C, 0x66, 0x06, 0x0C, 0xC1, 0x81,
+ 0x98, 0x30, 0x33, 0x0C, 0x0E, 0x61, 0x81, 0x98, 0x30, 0x33, 0x06, 0x06,
+ 0x60, 0xF0, 0xCC, 0x0F, 0xF9, 0x80, 0x7F, 0x30, 0x00, 0x06, 0x00, 0x00,
+ 0xC0, 0x00, 0x18, 0x00, 0x03, 0x80, 0x00, 0x30, 0x00, 0x07, 0x00, 0x00,
+ 0x70, 0x18, 0x0F, 0xFE, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x0F,
+ 0xFE, 0x00, 0x00, 0x06, 0xC0, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x31, 0x80,
+ 0x00, 0x06, 0x30, 0x00, 0x01, 0x86, 0x00, 0x00, 0x60, 0xC0, 0x00, 0x0C,
+ 0x1C, 0x00, 0x03, 0x01, 0x80, 0x00, 0x40, 0x30, 0x00, 0x18, 0x06, 0x00,
+ 0x06, 0x00, 0xC0, 0x00, 0xC0, 0x18, 0x00, 0x30, 0x01, 0x80, 0x07, 0xFF,
+ 0xF0, 0x01, 0xFF, 0xFE, 0x00, 0x60, 0x00, 0xC0, 0x0C, 0x00, 0x18, 0x03,
+ 0x00, 0x03, 0x00, 0x40, 0x00, 0x30, 0x18, 0x00, 0x06, 0x06, 0x00, 0x00,
+ 0xC0, 0xC0, 0x00, 0x18, 0xFF, 0x80, 0x7F, 0xFF, 0xF0, 0x0F, 0xFC, 0x03,
+ 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0xC0, 0x06, 0x00, 0x38, 0x01, 0x80, 0x07,
+ 0x00, 0xC0, 0x00, 0xC0, 0x30, 0x00, 0x30, 0x0C, 0x00, 0x0C, 0x03, 0x00,
+ 0x03, 0x00, 0xC0, 0x01, 0x80, 0x60, 0x00, 0xC0, 0x18, 0x01, 0xE0, 0x07,
+ 0xFF, 0xE0, 0x01, 0xFF, 0xFC, 0x00, 0xE0, 0x03, 0x80, 0x30, 0x00, 0x70,
+ 0x0C, 0x00, 0x0E, 0x03, 0x00, 0x01, 0x80, 0xC0, 0x00, 0x60, 0x60, 0x00,
+ 0x18, 0x18, 0x00, 0x06, 0x06, 0x00, 0x03, 0x01, 0x80, 0x01, 0xC0, 0x60,
+ 0x00, 0xE0, 0x30, 0x00, 0x70, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x00,
+ 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0xFC, 0xC0, 0x3C, 0x0F, 0x60, 0x78, 0x01,
+ 0xF0, 0x70, 0x00, 0x70, 0x70, 0x00, 0x18, 0x30, 0x00, 0x0C, 0x30, 0x00,
+ 0x06, 0x38, 0x00, 0x02, 0x18, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x0C, 0x00,
+ 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80,
+ 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18,
+ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x60,
+ 0x60, 0x00, 0x60, 0x38, 0x00, 0xE0, 0x0F, 0x01, 0xE0, 0x03, 0xFF, 0xC0,
+ 0x00, 0x3F, 0x00, 0x00, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0x00, 0x0C,
+ 0x00, 0xF0, 0x03, 0x00, 0x1C, 0x01, 0xC0, 0x03, 0x80, 0x60, 0x00, 0x60,
+ 0x18, 0x00, 0x1C, 0x06, 0x00, 0x03, 0x01, 0x80, 0x00, 0xC0, 0xC0, 0x00,
+ 0x30, 0x30, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0x03, 0x00, 0x00, 0xC0, 0xC0,
+ 0x00, 0x60, 0x60, 0x00, 0x18, 0x18, 0x00, 0x06, 0x06, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0xC0, 0xE0, 0x00, 0x70, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x0C,
+ 0x03, 0x00, 0x06, 0x00, 0xC0, 0x07, 0x00, 0x60, 0x07, 0x80, 0xFF, 0xFF,
+ 0xC0, 0x3F, 0xFF, 0x80, 0x00, 0x03, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFC,
+ 0x01, 0x80, 0x01, 0x80, 0x30, 0x00, 0x60, 0x0C, 0x00, 0x0C, 0x01, 0x80,
+ 0x01, 0x80, 0x30, 0x00, 0x30, 0x06, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00,
+ 0x30, 0x18, 0x00, 0x06, 0x03, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x1F, 0xF8,
+ 0x00, 0x07, 0x03, 0x00, 0x00, 0xC0, 0x60, 0x00, 0x18, 0x0C, 0x00, 0x03,
+ 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x18, 0x00, 0x0C, 0x03, 0x00, 0x01,
+ 0x80, 0x60, 0x00, 0x30, 0x0C, 0x00, 0x0C, 0x01, 0x80, 0x01, 0x80, 0x60,
+ 0x00, 0x30, 0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF,
+ 0xF0, 0x7F, 0xFF, 0xFF, 0x00, 0x60, 0x00, 0x30, 0x06, 0x00, 0x06, 0x00,
+ 0xC0, 0x00, 0x60, 0x0C, 0x00, 0x06, 0x00, 0xC0, 0x00, 0x60, 0x0C, 0x00,
+ 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x18, 0x0C, 0x00, 0x01, 0x80, 0xC0, 0x00,
+ 0x1F, 0xFC, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x38, 0x18, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x30, 0x18, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
+ 0x06, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x60,
+ 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xFF, 0xFC, 0x00,
+ 0x0F, 0xFF, 0xC0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0xFC, 0xC0, 0x3C,
+ 0x0F, 0xE0, 0x78, 0x01, 0xF0, 0x70, 0x00, 0x30, 0x70, 0x00, 0x18, 0x70,
+ 0x00, 0x0C, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18,
+ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01,
+ 0x80, 0x00, 0x01, 0x80, 0x1F, 0xFE, 0xC0, 0x0F, 0xFF, 0x60, 0x00, 0x06,
+ 0x30, 0x00, 0x06, 0x18, 0x00, 0x03, 0x0C, 0x00, 0x01, 0x87, 0x00, 0x00,
+ 0xC1, 0x80, 0x00, 0xE0, 0xE0, 0x00, 0x60, 0x38, 0x00, 0x70, 0x0F, 0x00,
+ 0xF8, 0x03, 0xFF, 0xF0, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xFC, 0x1F, 0xE0,
+ 0x7F, 0x83, 0xFC, 0x03, 0x00, 0x06, 0x00, 0x60, 0x01, 0x80, 0x1C, 0x00,
+ 0x30, 0x03, 0x00, 0x06, 0x00, 0x60, 0x00, 0xC0, 0x0C, 0x00, 0x38, 0x01,
+ 0x80, 0x06, 0x00, 0x60, 0x00, 0xC0, 0x0C, 0x00, 0x18, 0x01, 0xFF, 0xFF,
+ 0x00, 0x3F, 0xFF, 0xC0, 0x06, 0x00, 0x18, 0x01, 0x80, 0x03, 0x00, 0x30,
+ 0x00, 0x60, 0x06, 0x00, 0x0C, 0x00, 0xC0, 0x03, 0x00, 0x38, 0x00, 0x60,
+ 0x06, 0x00, 0x0C, 0x00, 0xC0, 0x01, 0x80, 0x18, 0x00, 0x70, 0x03, 0x00,
+ 0x0C, 0x00, 0xE0, 0x01, 0x80, 0xFF, 0x83, 0xFE, 0x1F, 0xF0, 0x7F, 0xC0,
+ 0x07, 0xFF, 0xFC, 0x1F, 0xFF, 0xF0, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00,
+ 0x0C, 0x00, 0x00, 0x70, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18,
+ 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00,
+ 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x01,
+ 0x80, 0x00, 0x06, 0x00, 0x00, 0x38, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00,
+ 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0xFF, 0xFF, 0x83, 0xFF, 0xFE, 0x00,
+ 0x00, 0x0F, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x0C, 0x00, 0x00,
+ 0x00, 0xC0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x18,
+ 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x03, 0x00, 0x00,
+ 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x07,
+ 0x00, 0x20, 0x00, 0x60, 0x06, 0x00, 0x06, 0x00, 0x60, 0x00, 0x60, 0x06,
+ 0x00, 0x06, 0x00, 0x60, 0x00, 0xC0, 0x0C, 0x00, 0x0C, 0x00, 0xC0, 0x00,
+ 0xC0, 0x0C, 0x00, 0x18, 0x00, 0xE0, 0x03, 0x00, 0x07, 0x00, 0x70, 0x00,
+ 0x3C, 0x1C, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x03,
+ 0xFF, 0x07, 0xF8, 0x3F, 0xF8, 0x3F, 0xC0, 0x18, 0x00, 0x70, 0x00, 0xC0,
+ 0x07, 0x00, 0x0C, 0x00, 0x60, 0x00, 0x60, 0x0E, 0x00, 0x03, 0x00, 0xE0,
+ 0x00, 0x18, 0x0C, 0x00, 0x00, 0xC1, 0xC0, 0x00, 0x0C, 0x1C, 0x00, 0x00,
+ 0x61, 0x80, 0x00, 0x03, 0x3C, 0x00, 0x00, 0x1B, 0x78, 0x00, 0x01, 0xF0,
+ 0xE0, 0x00, 0x0F, 0x03, 0x80, 0x00, 0x60, 0x0C, 0x00, 0x03, 0x00, 0x70,
+ 0x00, 0x18, 0x01, 0x80, 0x01, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x60, 0x00,
+ 0x60, 0x01, 0x80, 0x03, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x60, 0x01, 0x80,
+ 0x03, 0x00, 0xFF, 0xE0, 0x1F, 0x87, 0xFF, 0x00, 0x7C, 0x00, 0x07, 0xFF,
+ 0xE0, 0x03, 0xFF, 0xF0, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
+ 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00,
+ 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00,
+ 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00,
+ 0x00, 0xC0, 0x03, 0x00, 0x60, 0x01, 0x80, 0x60, 0x00, 0xC0, 0x30, 0x00,
+ 0x60, 0x18, 0x00, 0x30, 0x0C, 0x00, 0x30, 0x0E, 0x00, 0x18, 0x06, 0x00,
+ 0x0C, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0x00, 0x07, 0xF0, 0x00, 0x3F,
+ 0x07, 0xF0, 0x00, 0x7F, 0x01, 0xB0, 0x00, 0xD8, 0x01, 0xB0, 0x00, 0xD8,
+ 0x01, 0x98, 0x01, 0x98, 0x01, 0x98, 0x03, 0x30, 0x01, 0x98, 0x03, 0x30,
+ 0x03, 0x18, 0x06, 0x30, 0x03, 0x1C, 0x0C, 0x30, 0x03, 0x0C, 0x0C, 0x30,
+ 0x03, 0x0C, 0x18, 0x60, 0x07, 0x0C, 0x30, 0x60, 0x06, 0x0C, 0x30, 0x60,
+ 0x06, 0x06, 0x60, 0x60, 0x06, 0x06, 0xC0, 0x60, 0x06, 0x06, 0xC0, 0xC0,
+ 0x0C, 0x07, 0x80, 0xC0, 0x0C, 0x03, 0x00, 0xC0, 0x0C, 0x00, 0x00, 0xC0,
+ 0x0C, 0x00, 0x01, 0xC0, 0x0C, 0x00, 0x01, 0x80, 0x18, 0x00, 0x01, 0x80,
+ 0x18, 0x00, 0x01, 0x80, 0x18, 0x00, 0x01, 0x80, 0xFF, 0x80, 0x3F, 0xE0,
+ 0xFF, 0x80, 0x3F, 0xE0, 0x07, 0xE0, 0x0F, 0xFC, 0x3F, 0x80, 0x3F, 0xF0,
+ 0x0F, 0x00, 0x06, 0x00, 0x3C, 0x00, 0x10, 0x01, 0x98, 0x00, 0xC0, 0x06,
+ 0x60, 0x03, 0x00, 0x19, 0xC0, 0x0C, 0x00, 0x63, 0x00, 0x30, 0x01, 0x0C,
+ 0x01, 0x80, 0x0C, 0x18, 0x06, 0x00, 0x30, 0x60, 0x18, 0x00, 0xC1, 0xC0,
+ 0x60, 0x03, 0x03, 0x01, 0x00, 0x08, 0x0C, 0x0C, 0x00, 0x60, 0x18, 0x30,
+ 0x01, 0x80, 0x60, 0xC0, 0x06, 0x01, 0xC3, 0x00, 0x18, 0x03, 0x18, 0x00,
+ 0xC0, 0x0C, 0x60, 0x03, 0x00, 0x19, 0x80, 0x0C, 0x00, 0x66, 0x00, 0x30,
+ 0x01, 0xD8, 0x00, 0x80, 0x03, 0xC0, 0x06, 0x00, 0x0F, 0x00, 0xFF, 0xC0,
+ 0x1C, 0x03, 0xFE, 0x00, 0x70, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x7F, 0xF0,
+ 0x00, 0xF0, 0x78, 0x03, 0x80, 0x1C, 0x07, 0x00, 0x0E, 0x0E, 0x00, 0x06,
+ 0x0C, 0x00, 0x06, 0x18, 0x00, 0x07, 0x38, 0x00, 0x03, 0x30, 0x00, 0x03,
+ 0x60, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x03, 0xC0, 0x00, 0x03,
+ 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x06, 0xC0, 0x00, 0x06, 0xC0, 0x00, 0x06,
+ 0xC0, 0x00, 0x0C, 0xC0, 0x00, 0x1C, 0xC0, 0x00, 0x18, 0x60, 0x00, 0x30,
+ 0x60, 0x00, 0x70, 0x70, 0x00, 0xE0, 0x38, 0x01, 0xC0, 0x1E, 0x0F, 0x00,
+ 0x0F, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xFF, 0xFC, 0x01, 0xFF, 0xFF,
+ 0xC0, 0x06, 0x00, 0x78, 0x01, 0x80, 0x06, 0x00, 0xC0, 0x01, 0xC0, 0x30,
+ 0x00, 0x30, 0x0C, 0x00, 0x0C, 0x03, 0x00, 0x03, 0x00, 0xC0, 0x01, 0xC0,
+ 0x60, 0x00, 0x60, 0x18, 0x00, 0x30, 0x06, 0x00, 0x18, 0x01, 0x80, 0x3C,
+ 0x00, 0xFF, 0xFE, 0x00, 0x3F, 0xFC, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00,
+ 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x18, 0x00, 0x00, 0x06,
+ 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00,
+ 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x7F,
+ 0xF0, 0x00, 0xF0, 0x78, 0x03, 0x80, 0x1C, 0x07, 0x00, 0x0E, 0x0E, 0x00,
+ 0x06, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x03, 0x38, 0x00, 0x03, 0x30, 0x00,
+ 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x03, 0xC0, 0x00,
+ 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x06, 0xC0, 0x00, 0x06, 0xC0, 0x00,
+ 0x06, 0xC0, 0x00, 0x0C, 0xC0, 0x00, 0x1C, 0xC0, 0x00, 0x18, 0x60, 0x00,
+ 0x30, 0x60, 0x00, 0x70, 0x30, 0x00, 0xE0, 0x38, 0x01, 0xC0, 0x0E, 0x0F,
+ 0x00, 0x07, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0x1F, 0xF8,
+ 0x30, 0x3F, 0xFF, 0xF0, 0x78, 0x0F, 0x80, 0x07, 0xFF, 0xFC, 0x01, 0xFF,
+ 0xFF, 0xC0, 0x06, 0x00, 0x78, 0x01, 0x80, 0x0E, 0x00, 0xC0, 0x01, 0xC0,
+ 0x30, 0x00, 0x30, 0x0C, 0x00, 0x0C, 0x03, 0x00, 0x03, 0x00, 0xC0, 0x00,
+ 0xC0, 0x60, 0x00, 0x60, 0x18, 0x00, 0x30, 0x06, 0x00, 0x38, 0x01, 0x80,
+ 0x3C, 0x00, 0xFF, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x0C, 0x07, 0x80, 0x03,
+ 0x00, 0x70, 0x00, 0xC0, 0x0E, 0x00, 0x60, 0x01, 0x80, 0x18, 0x00, 0x70,
+ 0x06, 0x00, 0x0C, 0x01, 0x80, 0x03, 0x80, 0x60, 0x00, 0x60, 0x30, 0x00,
+ 0x1C, 0xFF, 0xE0, 0x07, 0xFF, 0xF8, 0x00, 0xF0, 0x00, 0x1F, 0xC0, 0x00,
+ 0x7F, 0xF3, 0x00, 0xE0, 0x3B, 0x03, 0x80, 0x0F, 0x07, 0x00, 0x0E, 0x06,
+ 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x0C,
+ 0x00, 0x00, 0x0E, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00,
+ 0x7F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x38, 0x00,
+ 0x00, 0x18, 0x00, 0x00, 0x18, 0x20, 0x00, 0x18, 0x60, 0x00, 0x18, 0x60,
+ 0x00, 0x30, 0x60, 0x00, 0x70, 0xF0, 0x00, 0xE0, 0xF8, 0x01, 0xC0, 0xDC,
+ 0x07, 0x80, 0x8F, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0xFF, 0xFE, 0x3F,
+ 0xFF, 0xFE, 0x30, 0x18, 0x06, 0x60, 0x18, 0x06, 0x60, 0x18, 0x06, 0x60,
+ 0x38, 0x0C, 0x60, 0x30, 0x04, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00,
+ 0x30, 0x00, 0x00, 0x70, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00,
+ 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00,
+ 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x01,
+ 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0xFF, 0xFE, 0x00, 0xFF,
+ 0xFC, 0x00, 0x7F, 0xC0, 0xFF, 0xDF, 0xF0, 0x3F, 0xF1, 0x80, 0x00, 0x60,
+ 0x60, 0x00, 0x30, 0x18, 0x00, 0x0C, 0x06, 0x00, 0x03, 0x03, 0x80, 0x00,
+ 0xC0, 0xC0, 0x00, 0x30, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x06, 0x03, 0x00,
+ 0x01, 0x81, 0xC0, 0x00, 0x60, 0x60, 0x00, 0x18, 0x18, 0x00, 0x0C, 0x06,
+ 0x00, 0x03, 0x01, 0x80, 0x00, 0xC0, 0xC0, 0x00, 0x30, 0x30, 0x00, 0x1C,
+ 0x0C, 0x00, 0x06, 0x03, 0x00, 0x01, 0x80, 0xC0, 0x00, 0xC0, 0x30, 0x00,
+ 0x70, 0x0E, 0x00, 0x38, 0x01, 0xC0, 0x1C, 0x00, 0x38, 0x1E, 0x00, 0x07,
+ 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFF, 0x80, 0x3F, 0xFF, 0xF0, 0x07,
+ 0xFC, 0xE0, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0x01, 0x80, 0x00, 0x60, 0x30,
+ 0x00, 0x18, 0x06, 0x00, 0x02, 0x00, 0xC0, 0x00, 0xC0, 0x0C, 0x00, 0x30,
+ 0x01, 0x80, 0x06, 0x00, 0x30, 0x01, 0x80, 0x06, 0x00, 0x60, 0x00, 0xC0,
+ 0x0C, 0x00, 0x18, 0x03, 0x00, 0x01, 0x80, 0xC0, 0x00, 0x30, 0x18, 0x00,
+ 0x06, 0x06, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x18, 0x30, 0x00, 0x03, 0x8C,
+ 0x00, 0x00, 0x31, 0x80, 0x00, 0x06, 0x60, 0x00, 0x00, 0xD8, 0x00, 0x00,
+ 0x1B, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x38, 0x00, 0x00, 0xFF, 0xC0,
+ 0x7F, 0xFF, 0xF8, 0x0F, 0xF8, 0xC0, 0x00, 0x0C, 0x18, 0x00, 0x01, 0x83,
+ 0x00, 0x00, 0x30, 0x60, 0x08, 0x0C, 0x0C, 0x07, 0x01, 0x81, 0x81, 0xE0,
+ 0x30, 0x60, 0x2C, 0x0C, 0x0C, 0x0D, 0x81, 0x81, 0x81, 0x30, 0x30, 0x30,
+ 0x66, 0x0C, 0x06, 0x08, 0xC1, 0x80, 0xC3, 0x0C, 0x30, 0x18, 0x41, 0x8C,
+ 0x03, 0x18, 0x31, 0x80, 0x62, 0x06, 0x30, 0x0C, 0xC0, 0xCC, 0x03, 0x10,
+ 0x19, 0x80, 0x66, 0x03, 0x30, 0x0C, 0x80, 0x6C, 0x01, 0xB0, 0x0D, 0x80,
+ 0x34, 0x01, 0xB0, 0x07, 0x80, 0x3C, 0x00, 0xE0, 0x07, 0x80, 0x1C, 0x00,
+ 0xF0, 0x00, 0x03, 0xF8, 0x03, 0xF8, 0x1F, 0xC0, 0x3F, 0xC0, 0x30, 0x00,
+ 0x30, 0x01, 0xC0, 0x03, 0x00, 0x06, 0x00, 0x30, 0x00, 0x18, 0x03, 0x00,
+ 0x00, 0xE0, 0x30, 0x00, 0x03, 0x03, 0x00, 0x00, 0x1C, 0x30, 0x00, 0x00,
+ 0x63, 0x00, 0x00, 0x03, 0xB0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x30,
+ 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x36, 0x00, 0x00, 0x03, 0x38, 0x00,
+ 0x00, 0x30, 0xC0, 0x00, 0x03, 0x07, 0x00, 0x00, 0x30, 0x18, 0x00, 0x03,
+ 0x00, 0x60, 0x00, 0x30, 0x03, 0x80, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00,
+ 0x70, 0x03, 0x00, 0x01, 0x80, 0xFF, 0x80, 0xFF, 0x07, 0xFC, 0x07, 0xF8,
+ 0x00, 0x7F, 0x80, 0x7F, 0x7F, 0x00, 0x7F, 0x1C, 0x00, 0x18, 0x0C, 0x00,
+ 0x30, 0x0C, 0x00, 0x70, 0x06, 0x00, 0xE0, 0x06, 0x00, 0xC0, 0x03, 0x01,
+ 0x80, 0x03, 0x03, 0x00, 0x01, 0x86, 0x00, 0x01, 0x8C, 0x00, 0x00, 0xD8,
+ 0x00, 0x00, 0xF0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0,
+ 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0,
+ 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80,
+ 0x00, 0xFF, 0xFE, 0x00, 0xFF, 0xFC, 0x00, 0x03, 0xFF, 0xFE, 0x07, 0xFF,
+ 0xF8, 0x0C, 0x00, 0x30, 0x10, 0x00, 0xC0, 0x60, 0x03, 0x80, 0xC0, 0x0E,
+ 0x01, 0x80, 0x38, 0x03, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00,
+ 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00,
+ 0x18, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x60, 0x18,
+ 0x00, 0xC0, 0x60, 0x01, 0x81, 0x80, 0x02, 0x06, 0x00, 0x0C, 0x18, 0x00,
+ 0x18, 0x60, 0x00, 0x30, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0x80, 0x01, 0xFE,
+ 0x03, 0xFC, 0x06, 0x00, 0x08, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01,
+ 0x80, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x40, 0x01, 0x80,
+ 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x60, 0x00, 0xC0, 0x01,
+ 0x80, 0x03, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0x80,
+ 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x20, 0x00, 0xFF, 0x01,
+ 0xFE, 0x00, 0xC0, 0x30, 0x0E, 0x01, 0x80, 0x60, 0x18, 0x07, 0x00, 0xC0,
+ 0x30, 0x0C, 0x03, 0x80, 0x60, 0x18, 0x06, 0x00, 0xC0, 0x30, 0x0C, 0x03,
+ 0x00, 0x60, 0x18, 0x06, 0x01, 0x80, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x18,
+ 0x06, 0x01, 0x80, 0x60, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x04, 0x01, 0xFE,
+ 0x03, 0xFC, 0x00, 0x10, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00,
+ 0x04, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x03, 0x00, 0x06,
+ 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00,
+ 0x06, 0x00, 0x08, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x06,
+ 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x01, 0x80, 0xFF, 0x01,
+ 0xFE, 0x00, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x07, 0x80, 0x03, 0x60, 0x01,
+ 0x8C, 0x00, 0xC3, 0x80, 0xE0, 0x60, 0x70, 0x1C, 0x38, 0x03, 0x1C, 0x00,
+ 0x6E, 0x00, 0x1F, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xC3, 0x86, 0x0C, 0x18, 0x70, 0xC0, 0x00, 0x3F, 0x80, 0x0F, 0xFF, 0x80,
+ 0x78, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00,
+ 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x38, 0x03, 0xFC, 0xC0, 0x7F, 0xFF,
+ 0x07, 0xC0, 0x0C, 0x38, 0x00, 0x31, 0xC0, 0x01, 0xCE, 0x00, 0x06, 0x30,
+ 0x00, 0x18, 0xC0, 0x00, 0xE3, 0x00, 0x07, 0x8E, 0x00, 0x7C, 0x1C, 0x0F,
+ 0x3F, 0x3F, 0xF0, 0xFC, 0x7F, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x7C,
+ 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x06, 0x00, 0x00,
+ 0x00, 0xC0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x06, 0x07, 0xE0, 0x00, 0xC3,
+ 0xFF, 0x00, 0x19, 0xC0, 0xF0, 0x03, 0x60, 0x07, 0x00, 0xD8, 0x00, 0x60,
+ 0x1E, 0x00, 0x0E, 0x03, 0x80, 0x00, 0xC0, 0x60, 0x00, 0x18, 0x0C, 0x00,
+ 0x03, 0x03, 0x00, 0x00, 0x60, 0x60, 0x00, 0x0C, 0x0C, 0x00, 0x01, 0x81,
+ 0x80, 0x00, 0x60, 0x70, 0x00, 0x0C, 0x0E, 0x00, 0x03, 0x01, 0xC0, 0x00,
+ 0x60, 0x3C, 0x00, 0x18, 0x05, 0x80, 0x06, 0x01, 0xB8, 0x01, 0x83, 0xF3,
+ 0xC1, 0xE0, 0x7E, 0x3F, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3F, 0x00,
+ 0x07, 0xFF, 0x30, 0x38, 0x0F, 0xC1, 0x80, 0x1F, 0x0C, 0x00, 0x18, 0x60,
+ 0x00, 0x63, 0x00, 0x01, 0x9C, 0x00, 0x06, 0x60, 0x00, 0x01, 0x80, 0x00,
+ 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C,
+ 0x00, 0x00, 0x30, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x80, 0x00, 0xC7, 0x00,
+ 0x0E, 0x0F, 0x01, 0xF0, 0x1F, 0xFF, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x00,
+ 0x1F, 0x80, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00,
+ 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0xFC, 0x0C, 0x01,
+ 0xFF, 0x86, 0x01, 0xC0, 0xE3, 0x03, 0x80, 0x1B, 0x03, 0x80, 0x05, 0x81,
+ 0x80, 0x03, 0xC1, 0x80, 0x00, 0xE1, 0x80, 0x00, 0x60, 0xC0, 0x00, 0x30,
+ 0x60, 0x00, 0x18, 0x60, 0x00, 0x0C, 0x30, 0x00, 0x06, 0x18, 0x00, 0x02,
+ 0x0C, 0x00, 0x03, 0x06, 0x00, 0x01, 0x83, 0x00, 0x01, 0xC1, 0xC0, 0x01,
+ 0xE0, 0x60, 0x01, 0xE0, 0x38, 0x01, 0xB0, 0x0F, 0x03, 0x9F, 0x03, 0xFF,
+ 0x0F, 0x80, 0x7E, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x07, 0xFF, 0x80, 0x78,
+ 0x0F, 0x03, 0x80, 0x0E, 0x1C, 0x00, 0x18, 0xE0, 0x00, 0x73, 0x00, 0x00,
+ 0xD8, 0x00, 0x03, 0x60, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0,
+ 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x00,
+ 0x00, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x03, 0x07, 0x80, 0xF8,
+ 0x0F, 0xFF, 0x80, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0xFF,
+ 0xF0, 0x00, 0xF0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x18, 0x00, 0x00, 0x06,
+ 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x07, 0xFF, 0xFC, 0x03,
+ 0xFF, 0xFF, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x60, 0x00,
+ 0x00, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0xC0,
+ 0x00, 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01,
+ 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00,
+ 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x0F, 0xFF, 0xFC, 0x03, 0xFF, 0xFE,
+ 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFF, 0x87, 0xC1, 0xE0, 0xF3, 0xE1, 0xC0,
+ 0x1B, 0x01, 0xC0, 0x07, 0x81, 0xC0, 0x03, 0xC0, 0xC0, 0x00, 0xE0, 0xC0,
+ 0x00, 0x60, 0x60, 0x00, 0x30, 0x60, 0x00, 0x18, 0x30, 0x00, 0x0C, 0x18,
+ 0x00, 0x06, 0x0C, 0x00, 0x06, 0x06, 0x00, 0x03, 0x03, 0x00, 0x03, 0x81,
+ 0xC0, 0x01, 0xC0, 0x60, 0x01, 0xC0, 0x38, 0x03, 0x60, 0x0F, 0x07, 0x30,
+ 0x03, 0xFF, 0x18, 0x00, 0x7E, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06,
+ 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01,
+ 0x80, 0x00, 0x03, 0x80, 0x03, 0xFF, 0x80, 0x01, 0xFF, 0x00, 0x00, 0x07,
+ 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00,
+ 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x01, 0x83, 0xF0, 0x01,
+ 0x8F, 0xF8, 0x01, 0x98, 0x1C, 0x03, 0xB0, 0x0E, 0x03, 0x40, 0x06, 0x03,
+ 0x80, 0x06, 0x03, 0x00, 0x06, 0x03, 0x00, 0x06, 0x07, 0x00, 0x06, 0x06,
+ 0x00, 0x0E, 0x06, 0x00, 0x0E, 0x06, 0x00, 0x0E, 0x06, 0x00, 0x0C, 0x0C,
+ 0x00, 0x0C, 0x0C, 0x00, 0x1C, 0x0C, 0x00, 0x1C, 0x0C, 0x00, 0x18, 0x0C,
+ 0x00, 0x18, 0x18, 0x00, 0x18, 0xFF, 0x01, 0xFF, 0xFF, 0x01, 0xFF, 0x00,
+ 0x07, 0x00, 0x00, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x1F,
+ 0xF0, 0x00, 0x06, 0x00, 0x01, 0xC0, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00,
+ 0xC0, 0x00, 0x18, 0x00, 0x07, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, 0x03,
+ 0x00, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0C,
+ 0x00, 0x01, 0x80, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x70, 0x00,
+ 0x07, 0x00, 0x00, 0x70, 0x00, 0x06, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x03, 0xFF, 0xF0,
+ 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06,
+ 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x0C, 0x00, 0x00,
+ 0xC0, 0x00, 0x0C, 0x00, 0x01, 0xC0, 0x00, 0x18, 0x00, 0x01, 0x80, 0x00,
+ 0x18, 0x00, 0x01, 0x80, 0x00, 0x38, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00,
+ 0x03, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00,
+ 0x03, 0x80, 0xFF, 0xF0, 0x0F, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xE0,
+ 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60,
+ 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0xC1,
+ 0xFF, 0x00, 0x80, 0x70, 0x01, 0x80, 0xC0, 0x01, 0x83, 0x80, 0x01, 0x87,
+ 0x00, 0x01, 0x8C, 0x00, 0x03, 0x38, 0x00, 0x03, 0x70, 0x00, 0x03, 0xF8,
+ 0x00, 0x03, 0x9C, 0x00, 0x03, 0x0C, 0x00, 0x06, 0x0E, 0x00, 0x06, 0x07,
+ 0x00, 0x06, 0x03, 0x80, 0x06, 0x01, 0x80, 0x04, 0x00, 0xC0, 0x0C, 0x00,
+ 0xE0, 0xFC, 0x03, 0xFE, 0xFC, 0x03, 0xFC, 0x01, 0xFF, 0x00, 0x3F, 0xE0,
+ 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0C, 0x00, 0x01, 0x80,
+ 0x00, 0x70, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00,
+ 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00,
+ 0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00,
+ 0x18, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0C, 0x03, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xF0, 0x00, 0x1E, 0x07, 0x81, 0xE7, 0xE1, 0xF8, 0x3D, 0x8E, 0xE3,
+ 0x81, 0xE0, 0xF8, 0x30, 0x38, 0x1E, 0x06, 0x06, 0x03, 0x80, 0xC1, 0x80,
+ 0x60, 0x18, 0x30, 0x0C, 0x03, 0x06, 0x01, 0x80, 0x60, 0xC0, 0x30, 0x08,
+ 0x18, 0x0C, 0x03, 0x06, 0x01, 0x80, 0x60, 0xC0, 0x30, 0x0C, 0x18, 0x06,
+ 0x01, 0x83, 0x00, 0x80, 0x60, 0x40, 0x30, 0x0C, 0x18, 0x06, 0x01, 0x83,
+ 0x00, 0xC0, 0x30, 0x60, 0x18, 0x06, 0x7F, 0x03, 0xC1, 0xFF, 0xE0, 0xF8,
+ 0x3E, 0x00, 0x03, 0xE0, 0x1F, 0x1F, 0xF0, 0x3E, 0x60, 0x70, 0x0F, 0x80,
+ 0x70, 0x3C, 0x00, 0x60, 0x70, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03,
+ 0x07, 0x00, 0x06, 0x0C, 0x00, 0x1C, 0x18, 0x00, 0x30, 0x30, 0x00, 0x60,
+ 0x60, 0x00, 0xC1, 0xC0, 0x01, 0x83, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C,
+ 0x00, 0x18, 0x18, 0x00, 0x30, 0x70, 0x00, 0x67, 0xFC, 0x07, 0xFF, 0xF0,
+ 0x0F, 0xE0, 0x00, 0x3F, 0x00, 0x07, 0xFF, 0x00, 0x3C, 0x0F, 0x01, 0xC0,
+ 0x1C, 0x0C, 0x00, 0x38, 0x60, 0x00, 0x63, 0x00, 0x00, 0xDC, 0x00, 0x03,
+ 0x60, 0x00, 0x0D, 0x80, 0x00, 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0,
+ 0x00, 0x1B, 0x00, 0x00, 0x6C, 0x00, 0x03, 0xB0, 0x00, 0x0C, 0x60, 0x00,
+ 0x61, 0xC0, 0x03, 0x03, 0x80, 0x38, 0x0F, 0x03, 0xC0, 0x0F, 0xFE, 0x00,
+ 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x1F, 0x8F, 0xFE, 0x00, 0xFC,
+ 0xE0, 0x78, 0x00, 0xCC, 0x00, 0xE0, 0x06, 0xC0, 0x03, 0x00, 0x3C, 0x00,
+ 0x1C, 0x01, 0xC0, 0x00, 0x60, 0x0C, 0x00, 0x03, 0x00, 0xE0, 0x00, 0x18,
+ 0x06, 0x00, 0x00, 0xC0, 0x30, 0x00, 0x06, 0x01, 0x80, 0x00, 0x30, 0x0C,
+ 0x00, 0x03, 0x00, 0xE0, 0x00, 0x18, 0x07, 0x00, 0x01, 0x80, 0x3C, 0x00,
+ 0x1C, 0x01, 0xE0, 0x01, 0xC0, 0x0D, 0x80, 0x1C, 0x00, 0xCF, 0x03, 0xC0,
+ 0x06, 0x3F, 0xF8, 0x00, 0x30, 0x7F, 0x00, 0x01, 0x80, 0x00, 0x00, 0x0C,
+ 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00,
+ 0x00, 0x01, 0x80, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x00,
+ 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7F, 0xE1, 0xF0, 0x78,
+ 0x1C, 0xFC, 0x38, 0x01, 0xB0, 0x1C, 0x00, 0x2C, 0x0E, 0x00, 0x0F, 0x03,
+ 0x00, 0x01, 0xC1, 0x80, 0x00, 0x60, 0x60, 0x00, 0x18, 0x30, 0x00, 0x06,
+ 0x0C, 0x00, 0x01, 0x83, 0x00, 0x00, 0x60, 0xC0, 0x00, 0x30, 0x30, 0x00,
+ 0x0C, 0x0C, 0x00, 0x07, 0x03, 0x80, 0x03, 0xC0, 0x60, 0x01, 0xB0, 0x1C,
+ 0x00, 0xD8, 0x03, 0xC0, 0xE6, 0x00, 0x7F, 0xF1, 0x80, 0x07, 0xE0, 0x60,
+ 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0xC0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00,
+ 0x7F, 0xF8, 0x00, 0x1F, 0xFE, 0x00, 0x07, 0xF0, 0x3E, 0x03, 0xF8, 0x7F,
+ 0xC0, 0x18, 0xF0, 0x60, 0x0C, 0xE0, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xC0,
+ 0x00, 0x03, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60,
+ 0x00, 0x00, 0x30, 0x00, 0x00, 0x38, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C,
+ 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x80, 0x00, 0x01,
+ 0x80, 0x00, 0x3F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF0, 0x00, 0x00, 0x3F, 0x00,
+ 0x0F, 0xFE, 0xC0, 0xF0, 0x3E, 0x0E, 0x00, 0x70, 0xE0, 0x01, 0x06, 0x00,
+ 0x08, 0x30, 0x00, 0x41, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x3F, 0xF0, 0x00,
+ 0x3F, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x18, 0x00, 0x00,
+ 0xCC, 0x00, 0x06, 0x60, 0x00, 0x33, 0x00, 0x03, 0x3C, 0x00, 0x71, 0xF8,
+ 0x0F, 0x0D, 0xFF, 0xF0, 0x01, 0xFC, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01,
+ 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x70, 0x03, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x0C, 0x00, 0x06, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0,
+ 0x00, 0xE0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x0E,
+ 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x03, 0x38, 0x0F,
+ 0x9F, 0xFF, 0x03, 0xF8, 0x00, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xC6, 0x00,
+ 0x0C, 0x30, 0x00, 0x61, 0x80, 0x03, 0x0C, 0x00, 0x18, 0x60, 0x01, 0x86,
+ 0x00, 0x0C, 0x30, 0x00, 0x61, 0x80, 0x03, 0x0C, 0x00, 0x18, 0x60, 0x01,
+ 0x86, 0x00, 0x0C, 0x30, 0x00, 0x61, 0x80, 0x03, 0x0C, 0x00, 0x38, 0x60,
+ 0x07, 0x83, 0x80, 0x6C, 0x1E, 0x1E, 0x7C, 0x7F, 0xE3, 0xE0, 0xF8, 0x00,
+ 0x00, 0x7F, 0xC0, 0xFF, 0xFF, 0xF0, 0x3F, 0xF1, 0xC0, 0x00, 0xC0, 0x30,
+ 0x00, 0x60, 0x0C, 0x00, 0x18, 0x03, 0x00, 0x0C, 0x00, 0xE0, 0x06, 0x00,
+ 0x18, 0x01, 0x80, 0x06, 0x00, 0xC0, 0x01, 0x80, 0x30, 0x00, 0x60, 0x18,
+ 0x00, 0x0C, 0x0C, 0x00, 0x03, 0x03, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x30,
+ 0xC0, 0x00, 0x06, 0x30, 0x00, 0x01, 0x98, 0x00, 0x00, 0x6C, 0x00, 0x00,
+ 0x1F, 0x00, 0x00, 0x07, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0x3F,
+ 0xCC, 0x00, 0x03, 0x06, 0x00, 0x01, 0x83, 0x00, 0x01, 0x81, 0x81, 0x80,
+ 0xC0, 0xC1, 0xE0, 0x60, 0x60, 0xF0, 0x60, 0x30, 0xD8, 0x30, 0x18, 0x6C,
+ 0x30, 0x0C, 0x66, 0x18, 0x06, 0x33, 0x18, 0x03, 0x31, 0x8C, 0x01, 0x98,
+ 0x66, 0x00, 0xD8, 0x36, 0x00, 0x6C, 0x1B, 0x00, 0x3C, 0x0F, 0x00, 0x1E,
+ 0x07, 0x80, 0x0E, 0x03, 0x80, 0x07, 0x01, 0xC0, 0x00, 0x07, 0xF0, 0x3F,
+ 0xC3, 0xFC, 0x0F, 0xF0, 0x38, 0x00, 0x60, 0x07, 0x00, 0x70, 0x00, 0xE0,
+ 0x38, 0x00, 0x18, 0x1C, 0x00, 0x03, 0x0C, 0x00, 0x00, 0xEE, 0x00, 0x00,
+ 0x1F, 0x00, 0x00, 0x03, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xDC, 0x00,
+ 0x00, 0xE3, 0x80, 0x00, 0x70, 0x70, 0x00, 0x38, 0x0E, 0x00, 0x18, 0x01,
+ 0x80, 0x1C, 0x00, 0x30, 0x0E, 0x00, 0x0E, 0x0F, 0xF0, 0x3F, 0xE3, 0xFC,
+ 0x0F, 0xF8, 0x03, 0xF8, 0x07, 0xF8, 0x3F, 0xC0, 0x3F, 0xC0, 0x60, 0x00,
+ 0x30, 0x01, 0x80, 0x01, 0x80, 0x0C, 0x00, 0x18, 0x00, 0x60, 0x01, 0x80,
+ 0x03, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0xC0, 0x00, 0x60, 0x0C, 0x00, 0x03,
+ 0x00, 0x60, 0x00, 0x0C, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x03, 0x06,
+ 0x00, 0x00, 0x1C, 0x30, 0x00, 0x00, 0x63, 0x00, 0x00, 0x03, 0x30, 0x00,
+ 0x00, 0x19, 0x80, 0x00, 0x00, 0x78, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00,
+ 0x1C, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x60,
+ 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x03, 0x00, 0x00,
+ 0x00, 0x30, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00,
+ 0x07, 0xFF, 0xF8, 0x3F, 0xFF, 0xC3, 0x00, 0x0C, 0x18, 0x00, 0xC0, 0xC0,
+ 0x0C, 0x00, 0x00, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00,
+ 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x18, 0x00, 0x01, 0x80,
+ 0x00, 0x18, 0x00, 0x01, 0x80, 0x0C, 0x18, 0x00, 0x61, 0x80, 0x02, 0x1F,
+ 0xFF, 0xF0, 0xFF, 0xFF, 0x80, 0x00, 0x0E, 0x00, 0x7C, 0x01, 0xC0, 0x03,
+ 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x01, 0xC0, 0x03, 0x00,
+ 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x60, 0x01, 0xC0, 0x0F, 0x00, 0xF8,
+ 0x01, 0xF0, 0x00, 0x30, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x03, 0x80,
+ 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0xE0, 0x01, 0x80, 0x03,
+ 0x00, 0x06, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x01, 0x80, 0xC0,
+ 0x60, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x40,
+ 0x60, 0x30, 0x18, 0x0C, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x60,
+ 0x30, 0x18, 0x08, 0x0C, 0x06, 0x03, 0x01, 0x80, 0x80, 0xC0, 0x60, 0x30,
+ 0x00, 0x01, 0xC0, 0x03, 0xC0, 0x01, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x06,
+ 0x00, 0x0C, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00,
+ 0x0C, 0x00, 0x18, 0x00, 0x38, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x7C, 0x03,
+ 0xC0, 0x0E, 0x00, 0x18, 0x00, 0x70, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00,
+ 0x06, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x03, 0x00, 0x0E,
+ 0x00, 0xF8, 0x01, 0xC0, 0x00, 0x0F, 0x00, 0x01, 0xFC, 0x03, 0x70, 0xE0,
+ 0x7E, 0x07, 0x1E, 0xC0, 0x3F, 0x80, 0x01, 0xE0 };
+
+const GFXglyph FreeMonoOblique24pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 28, 0, 1 }, // 0x20 ' '
+ { 0, 10, 30, 28, 12, -28 }, // 0x21 '!'
+ { 38, 16, 14, 28, 10, -28 }, // 0x22 '"'
+ { 66, 22, 32, 28, 6, -29 }, // 0x23 '#'
+ { 154, 21, 33, 28, 6, -29 }, // 0x24 '$'
+ { 241, 22, 29, 28, 6, -27 }, // 0x25 '%'
+ { 321, 19, 25, 28, 6, -23 }, // 0x26 '&'
+ { 381, 7, 14, 28, 16, -28 }, // 0x27 '''
+ { 394, 11, 34, 28, 16, -27 }, // 0x28 '('
+ { 441, 11, 34, 28, 7, -27 }, // 0x29 ')'
+ { 488, 18, 17, 28, 10, -28 }, // 0x2A '*'
+ { 527, 22, 22, 28, 6, -23 }, // 0x2B '+'
+ { 588, 12, 14, 28, 5, -6 }, // 0x2C ','
+ { 609, 22, 2, 28, 6, -13 }, // 0x2D '-'
+ { 615, 7, 6, 28, 11, -4 }, // 0x2E '.'
+ { 621, 24, 35, 28, 5, -30 }, // 0x2F '/'
+ { 726, 20, 30, 28, 7, -28 }, // 0x30 '0'
+ { 801, 17, 29, 28, 6, -28 }, // 0x31 '1'
+ { 863, 23, 29, 28, 4, -28 }, // 0x32 '2'
+ { 947, 22, 30, 28, 5, -28 }, // 0x33 '3'
+ { 1030, 19, 28, 28, 7, -27 }, // 0x34 '4'
+ { 1097, 21, 29, 28, 6, -27 }, // 0x35 '5'
+ { 1174, 21, 30, 28, 9, -28 }, // 0x36 '6'
+ { 1253, 18, 28, 28, 10, -27 }, // 0x37 '7'
+ { 1316, 20, 30, 28, 7, -28 }, // 0x38 '8'
+ { 1391, 22, 30, 28, 6, -28 }, // 0x39 '9'
+ { 1474, 10, 21, 28, 11, -19 }, // 0x3A ':'
+ { 1501, 15, 27, 28, 5, -19 }, // 0x3B ';'
+ { 1552, 23, 22, 28, 6, -23 }, // 0x3C '<'
+ { 1616, 25, 9, 28, 4, -17 }, // 0x3D '='
+ { 1645, 24, 22, 28, 4, -23 }, // 0x3E '>'
+ { 1711, 16, 28, 28, 11, -26 }, // 0x3F '?'
+ { 1767, 19, 32, 28, 7, -28 }, // 0x40 '@'
+ { 1843, 27, 26, 28, 1, -25 }, // 0x41 'A'
+ { 1931, 26, 26, 28, 2, -25 }, // 0x42 'B'
+ { 2016, 25, 28, 28, 5, -26 }, // 0x43 'C'
+ { 2104, 26, 26, 28, 2, -25 }, // 0x44 'D'
+ { 2189, 27, 26, 28, 2, -25 }, // 0x45 'E'
+ { 2277, 28, 26, 28, 2, -25 }, // 0x46 'F'
+ { 2368, 25, 28, 28, 5, -26 }, // 0x47 'G'
+ { 2456, 27, 26, 28, 3, -25 }, // 0x48 'H'
+ { 2544, 22, 26, 28, 6, -25 }, // 0x49 'I'
+ { 2616, 28, 27, 28, 5, -25 }, // 0x4A 'J'
+ { 2711, 29, 26, 28, 2, -25 }, // 0x4B 'K'
+ { 2806, 25, 26, 28, 3, -25 }, // 0x4C 'L'
+ { 2888, 32, 26, 28, 1, -25 }, // 0x4D 'M'
+ { 2992, 30, 26, 28, 2, -25 }, // 0x4E 'N'
+ { 3090, 24, 28, 28, 5, -26 }, // 0x4F 'O'
+ { 3174, 26, 26, 28, 2, -25 }, // 0x50 'P'
+ { 3259, 24, 32, 28, 5, -26 }, // 0x51 'Q'
+ { 3355, 26, 26, 28, 2, -25 }, // 0x52 'R'
+ { 3440, 24, 28, 28, 5, -26 }, // 0x53 'S'
+ { 3524, 24, 26, 28, 7, -25 }, // 0x54 'T'
+ { 3602, 26, 27, 28, 6, -25 }, // 0x55 'U'
+ { 3690, 27, 26, 28, 6, -25 }, // 0x56 'V'
+ { 3778, 27, 26, 28, 6, -25 }, // 0x57 'W'
+ { 3866, 29, 26, 28, 2, -25 }, // 0x58 'X'
+ { 3961, 24, 26, 28, 7, -25 }, // 0x59 'Y'
+ { 4039, 23, 26, 28, 5, -25 }, // 0x5A 'Z'
+ { 4114, 15, 34, 28, 12, -27 }, // 0x5B '['
+ { 4178, 10, 35, 28, 12, -30 }, // 0x5C '\'
+ { 4222, 15, 34, 28, 6, -27 }, // 0x5D ']'
+ { 4286, 18, 12, 28, 9, -28 }, // 0x5E '^'
+ { 4313, 28, 2, 28, -1, 5 }, // 0x5F '_'
+ { 4320, 6, 7, 28, 13, -29 }, // 0x60 '`'
+ { 4326, 22, 22, 28, 4, -20 }, // 0x61 'a'
+ { 4387, 27, 29, 28, 1, -27 }, // 0x62 'b'
+ { 4485, 22, 22, 28, 6, -20 }, // 0x63 'c'
+ { 4546, 25, 29, 28, 5, -27 }, // 0x64 'd'
+ { 4637, 22, 22, 28, 5, -20 }, // 0x65 'e'
+ { 4698, 26, 28, 28, 5, -27 }, // 0x66 'f'
+ { 4789, 25, 30, 28, 5, -20 }, // 0x67 'g'
+ { 4883, 24, 28, 28, 3, -27 }, // 0x68 'h'
+ { 4967, 19, 29, 28, 5, -28 }, // 0x69 'i'
+ { 5036, 20, 38, 28, 4, -28 }, // 0x6A 'j'
+ { 5131, 24, 28, 28, 3, -27 }, // 0x6B 'k'
+ { 5215, 19, 28, 28, 5, -27 }, // 0x6C 'l'
+ { 5282, 27, 21, 28, 1, -20 }, // 0x6D 'm'
+ { 5353, 23, 21, 28, 3, -20 }, // 0x6E 'n'
+ { 5414, 22, 22, 28, 5, -20 }, // 0x6F 'o'
+ { 5475, 29, 30, 28, -1, -20 }, // 0x70 'p'
+ { 5584, 26, 30, 28, 5, -20 }, // 0x71 'q'
+ { 5682, 25, 20, 28, 4, -19 }, // 0x72 'r'
+ { 5745, 21, 22, 28, 5, -20 }, // 0x73 's'
+ { 5803, 17, 27, 28, 7, -25 }, // 0x74 't'
+ { 5861, 21, 21, 28, 6, -19 }, // 0x75 'u'
+ { 5917, 26, 20, 28, 5, -19 }, // 0x76 'v'
+ { 5982, 25, 20, 28, 6, -19 }, // 0x77 'w'
+ { 6045, 26, 20, 28, 3, -19 }, // 0x78 'x'
+ { 6110, 29, 29, 28, 1, -19 }, // 0x79 'y'
+ { 6216, 21, 20, 28, 5, -19 }, // 0x7A 'z'
+ { 6269, 15, 34, 28, 10, -27 }, // 0x7B '{'
+ { 6333, 9, 35, 28, 12, -28 }, // 0x7C '|'
+ { 6373, 15, 34, 28, 8, -27 }, // 0x7D '}'
+ { 6437, 20, 6, 28, 7, -15 } }; // 0x7E '~'
+
+const GFXfont FreeMonoOblique24pt7b PROGMEM = {
+ (uint8_t *)FreeMonoOblique24pt7bBitmaps,
+ (GFXglyph *)FreeMonoOblique24pt7bGlyphs,
+ 0x20, 0x7E, 47 };
+
+// Approx. 7124 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoOblique9pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoOblique9pt7b.h
new file mode 100644
index 000000000000..a00ca829060b
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeMonoOblique9pt7b.h
@@ -0,0 +1,187 @@
+const uint8_t FreeMonoOblique9pt7bBitmaps[] PROGMEM = {
+ 0x11, 0x22, 0x24, 0x40, 0x00, 0xC0, 0xDE, 0xE5, 0x29, 0x00, 0x09, 0x05,
+ 0x02, 0x82, 0x47, 0xF8, 0xA0, 0x51, 0xFE, 0x28, 0x14, 0x0A, 0x09, 0x00,
+ 0x08, 0x1D, 0x23, 0x40, 0x70, 0x1C, 0x02, 0x82, 0x84, 0x78, 0x20, 0x20,
+ 0x1C, 0x11, 0x08, 0x83, 0x80, 0x18, 0x71, 0xC0, 0x1C, 0x11, 0x08, 0x83,
+ 0x80, 0x1E, 0x60, 0x81, 0x03, 0x0A, 0x65, 0x46, 0x88, 0xE8, 0xFA, 0x80,
+ 0x12, 0x24, 0x48, 0x88, 0x88, 0x88, 0x80, 0x01, 0x11, 0x11, 0x11, 0x22,
+ 0x44, 0x80, 0x10, 0x22, 0x5B, 0xC3, 0x0A, 0x22, 0x00, 0x04, 0x02, 0x02,
+ 0x1F, 0xF0, 0x80, 0x40, 0x20, 0x00, 0x36, 0x4C, 0x80, 0xFF, 0x80, 0xF0,
+ 0x00, 0x80, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10,
+ 0x08, 0x08, 0x00, 0x1C, 0x45, 0x0A, 0x18, 0x30, 0x61, 0x42, 0x85, 0x11,
+ 0xC0, 0x04, 0x38, 0x90, 0x20, 0x81, 0x02, 0x04, 0x08, 0x23, 0xF8, 0x07,
+ 0x04, 0xC4, 0x20, 0x10, 0x10, 0x30, 0x20, 0x20, 0x60, 0x40, 0x3F, 0x80,
+ 0x0F, 0x00, 0x40, 0x20, 0x20, 0x60, 0x18, 0x04, 0x02, 0x01, 0x43, 0x1E,
+ 0x00, 0x03, 0x05, 0x0A, 0x12, 0x22, 0x22, 0x42, 0x7F, 0x04, 0x04, 0x1E,
+ 0x1F, 0x88, 0x08, 0x05, 0xC3, 0x30, 0x08, 0x04, 0x02, 0x02, 0x42, 0x1E,
+ 0x00, 0x07, 0x18, 0x20, 0x40, 0x5C, 0xA6, 0xC2, 0x82, 0x82, 0xC4, 0x78,
+ 0xFF, 0x04, 0x10, 0x20, 0x82, 0x04, 0x10, 0x20, 0x81, 0x00, 0x1E, 0x23,
+ 0x41, 0x41, 0x62, 0x1C, 0x66, 0x82, 0x82, 0x84, 0x78, 0x1E, 0x23, 0x41,
+ 0x41, 0x43, 0x65, 0x3A, 0x02, 0x04, 0x18, 0xE0, 0x6C, 0x00, 0x36, 0x18,
+ 0xC0, 0x00, 0x19, 0x8C, 0xC4, 0x00, 0x01, 0x83, 0x06, 0x0C, 0x06, 0x00,
+ 0x80, 0x30, 0x04, 0xFF, 0x80, 0x00, 0x1F, 0xF0, 0x20, 0x0C, 0x01, 0x00,
+ 0x60, 0x20, 0x60, 0xC1, 0x80, 0x3D, 0x8E, 0x08, 0x10, 0xC6, 0x08, 0x00,
+ 0x01, 0x80, 0x1C, 0x45, 0x0A, 0x79, 0x34, 0x69, 0x4E, 0x81, 0x03, 0x03,
+ 0xC0, 0x0F, 0x00, 0x60, 0x12, 0x02, 0x40, 0x88, 0x21, 0x07, 0xE1, 0x04,
+ 0x20, 0x5E, 0x3C, 0x3F, 0x84, 0x11, 0x04, 0x82, 0x3F, 0x88, 0x32, 0x04,
+ 0x81, 0x60, 0xBF, 0xC0, 0x1E, 0x98, 0xD0, 0x28, 0x08, 0x04, 0x02, 0x01,
+ 0x00, 0x41, 0x1F, 0x00, 0x3F, 0x0C, 0x22, 0x04, 0x81, 0x20, 0x48, 0x12,
+ 0x09, 0x02, 0x43, 0x3F, 0x00, 0x3F, 0xC4, 0x11, 0x00, 0x88, 0x3E, 0x08,
+ 0x82, 0x00, 0x82, 0x60, 0xBF, 0xE0, 0x3F, 0xE2, 0x08, 0x40, 0x11, 0x03,
+ 0xE0, 0x44, 0x08, 0x01, 0x00, 0x60, 0x1F, 0x00, 0x1E, 0x98, 0xD0, 0x08,
+ 0x08, 0x04, 0x7A, 0x05, 0x02, 0x41, 0x1F, 0x00, 0x3D, 0xE2, 0x18, 0x42,
+ 0x08, 0x43, 0xF8, 0x41, 0x08, 0x21, 0x08, 0x21, 0x1E, 0xF0, 0x3F, 0x82,
+ 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x20, 0x10, 0x7F, 0x00, 0x0F, 0xE0,
+ 0x20, 0x04, 0x00, 0x80, 0x10, 0x02, 0x20, 0x84, 0x10, 0x84, 0x0F, 0x00,
+ 0x3C, 0xE2, 0x10, 0x44, 0x11, 0x02, 0xC0, 0x64, 0x08, 0x81, 0x08, 0x61,
+ 0x1E, 0x38, 0x3E, 0x02, 0x00, 0x80, 0x20, 0x10, 0x04, 0x01, 0x04, 0x42,
+ 0x10, 0xBF, 0xE0, 0x38, 0x38, 0xC3, 0x05, 0x28, 0x29, 0x42, 0x52, 0x13,
+ 0x10, 0x99, 0x84, 0x08, 0x20, 0x47, 0x8F, 0x00, 0x70, 0xE6, 0x08, 0xA1,
+ 0x14, 0x22, 0x48, 0x49, 0x11, 0x22, 0x14, 0x43, 0x1E, 0x20, 0x1E, 0x18,
+ 0x90, 0x28, 0x18, 0x0C, 0x06, 0x05, 0x02, 0x46, 0x1E, 0x00, 0x3F, 0x84,
+ 0x31, 0x04, 0x81, 0x20, 0x8F, 0xC2, 0x00, 0x80, 0x60, 0x3E, 0x00, 0x1E,
+ 0x18, 0x90, 0x28, 0x18, 0x0C, 0x06, 0x05, 0x02, 0x46, 0x1E, 0x08, 0x0F,
+ 0x44, 0x60, 0x3F, 0x84, 0x31, 0x04, 0x81, 0x20, 0x8F, 0xC2, 0x10, 0x84,
+ 0x60, 0xBC, 0x10, 0x0F, 0x88, 0xC8, 0x24, 0x01, 0x80, 0x38, 0x05, 0x02,
+ 0xC2, 0x5E, 0x00, 0xFF, 0xC4, 0x44, 0x02, 0x01, 0x00, 0x80, 0x40, 0x60,
+ 0x20, 0x7E, 0x00, 0xF1, 0xD0, 0x24, 0x09, 0x02, 0x41, 0xA0, 0x48, 0x12,
+ 0x04, 0xC6, 0x1F, 0x00, 0xF1, 0xE8, 0x11, 0x02, 0x20, 0x82, 0x20, 0x44,
+ 0x09, 0x01, 0x40, 0x28, 0x02, 0x00, 0xF1, 0xE8, 0x09, 0x12, 0x26, 0x45,
+ 0x48, 0xAA, 0x29, 0x45, 0x28, 0xC6, 0x18, 0xC0, 0x38, 0xE2, 0x08, 0x26,
+ 0x05, 0x00, 0x40, 0x18, 0x04, 0x81, 0x08, 0x41, 0x1C, 0x70, 0xE3, 0xA0,
+ 0x90, 0x84, 0x81, 0x80, 0x80, 0x40, 0x20, 0x20, 0x7E, 0x00, 0x3F, 0x90,
+ 0x88, 0x80, 0x80, 0x80, 0x80, 0x80, 0x82, 0x82, 0x7F, 0x00, 0x39, 0x08,
+ 0x44, 0x21, 0x08, 0x42, 0x21, 0x0E, 0x00, 0x88, 0x44, 0x44, 0x22, 0x22,
+ 0x11, 0x11, 0x38, 0x42, 0x11, 0x08, 0x42, 0x10, 0x84, 0x2E, 0x00, 0x08,
+ 0x28, 0x92, 0x18, 0x20, 0xFF, 0xC0, 0xA4, 0x3E, 0x00, 0x80, 0x47, 0xA4,
+ 0x34, 0x12, 0x18, 0xF7, 0x38, 0x01, 0x00, 0x40, 0x09, 0xE1, 0xC6, 0x20,
+ 0x44, 0x09, 0x01, 0x30, 0x46, 0x13, 0xBC, 0x00, 0x1F, 0x48, 0x74, 0x0A,
+ 0x00, 0x80, 0x20, 0x0C, 0x18, 0xF8, 0x01, 0x80, 0x40, 0x23, 0x96, 0x32,
+ 0x0A, 0x05, 0x02, 0x81, 0x61, 0x1F, 0xE0, 0x1F, 0x30, 0xD0, 0x3F, 0xF8,
+ 0x04, 0x01, 0x00, 0x7C, 0x07, 0xC3, 0x00, 0x80, 0xFE, 0x10, 0x04, 0x01,
+ 0x00, 0x40, 0x10, 0x08, 0x0F, 0xE0, 0x1D, 0xD8, 0xC4, 0x12, 0x04, 0x82,
+ 0x20, 0x8C, 0x61, 0xE8, 0x02, 0x01, 0x07, 0x80, 0x30, 0x04, 0x01, 0x00,
+ 0x5C, 0x38, 0x88, 0x22, 0x08, 0x82, 0x21, 0x18, 0x4F, 0x3C, 0x04, 0x04,
+ 0x00, 0x38, 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 0xFF, 0x01, 0x00, 0x80,
+ 0x03, 0xF0, 0x10, 0x08, 0x04, 0x02, 0x02, 0x01, 0x00, 0x80, 0x40, 0x47,
+ 0xC0, 0x38, 0x08, 0x04, 0x02, 0x71, 0x20, 0xA0, 0xA0, 0x68, 0x24, 0x11,
+ 0x38, 0xE0, 0x3C, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x08, 0x10, 0x10,
+ 0xFF, 0x3E, 0xE2, 0x64, 0x88, 0x91, 0x12, 0x24, 0x48, 0x91, 0x17, 0x33,
+ 0x37, 0x14, 0x4C, 0x24, 0x12, 0x09, 0x08, 0x85, 0xE3, 0x1E, 0x10, 0x90,
+ 0x30, 0x18, 0x0C, 0x0B, 0x08, 0x78, 0x33, 0xC3, 0x8C, 0x40, 0x88, 0x12,
+ 0x02, 0x60, 0x8C, 0x31, 0x78, 0x20, 0x08, 0x03, 0xE0, 0x00, 0x1C, 0xD8,
+ 0xC4, 0x12, 0x04, 0x81, 0x20, 0x4C, 0x21, 0xF8, 0x02, 0x00, 0x81, 0xF0,
+ 0x73, 0x8E, 0x04, 0x04, 0x02, 0x01, 0x00, 0x81, 0xFC, 0x1F, 0x61, 0x40,
+ 0x3C, 0x03, 0x81, 0x82, 0xFC, 0x10, 0x63, 0xF9, 0x02, 0x04, 0x10, 0x20,
+ 0x40, 0x7C, 0xE3, 0x10, 0x90, 0x48, 0x24, 0x22, 0x11, 0x18, 0xF6, 0xF3,
+ 0xD0, 0x44, 0x10, 0x88, 0x24, 0x09, 0x02, 0x80, 0x40, 0xE1, 0xD0, 0x24,
+ 0x91, 0x24, 0x55, 0x19, 0x86, 0x61, 0x10, 0x39, 0xC4, 0x20, 0xB0, 0x30,
+ 0x0C, 0x04, 0x86, 0x13, 0x8E, 0x3C, 0x71, 0x04, 0x10, 0x40, 0x88, 0x09,
+ 0x00, 0xA0, 0x06, 0x00, 0x40, 0x08, 0x01, 0x00, 0xFC, 0x00, 0x7F, 0x42,
+ 0x04, 0x08, 0x10, 0x20, 0x42, 0xFE, 0x0C, 0x41, 0x04, 0x30, 0x8C, 0x08,
+ 0x21, 0x04, 0x10, 0x60, 0x24, 0x94, 0x92, 0x52, 0x40, 0x18, 0x20, 0x82,
+ 0x10, 0x40, 0xC4, 0x10, 0x82, 0x08, 0xC0, 0x61, 0x24, 0x30 };
+
+const GFXglyph FreeMonoOblique9pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 11, 0, 1 }, // 0x20 ' '
+ { 0, 4, 11, 11, 4, -10 }, // 0x21 '!'
+ { 6, 5, 5, 11, 4, -10 }, // 0x22 '"'
+ { 10, 9, 12, 11, 2, -10 }, // 0x23 '#'
+ { 24, 8, 12, 11, 3, -10 }, // 0x24 '$'
+ { 36, 9, 11, 11, 2, -10 }, // 0x25 '%'
+ { 49, 7, 10, 11, 2, -9 }, // 0x26 '&'
+ { 58, 2, 5, 11, 6, -10 }, // 0x27 '''
+ { 60, 4, 13, 11, 6, -10 }, // 0x28 '('
+ { 67, 4, 13, 11, 3, -10 }, // 0x29 ')'
+ { 74, 7, 7, 11, 4, -10 }, // 0x2A '*'
+ { 81, 9, 8, 11, 2, -8 }, // 0x2B '+'
+ { 90, 4, 5, 11, 2, -1 }, // 0x2C ','
+ { 93, 9, 1, 11, 2, -5 }, // 0x2D '-'
+ { 95, 2, 2, 11, 4, -1 }, // 0x2E '.'
+ { 96, 9, 13, 11, 2, -11 }, // 0x2F '/'
+ { 111, 7, 11, 11, 3, -10 }, // 0x30 '0'
+ { 121, 7, 11, 11, 2, -10 }, // 0x31 '1'
+ { 131, 9, 11, 11, 2, -10 }, // 0x32 '2'
+ { 144, 9, 11, 11, 2, -10 }, // 0x33 '3'
+ { 157, 8, 11, 11, 2, -10 }, // 0x34 '4'
+ { 168, 9, 11, 11, 2, -10 }, // 0x35 '5'
+ { 181, 8, 11, 11, 3, -10 }, // 0x36 '6'
+ { 192, 7, 11, 11, 4, -10 }, // 0x37 '7'
+ { 202, 8, 11, 11, 3, -10 }, // 0x38 '8'
+ { 213, 8, 11, 11, 3, -10 }, // 0x39 '9'
+ { 224, 3, 8, 11, 4, -7 }, // 0x3A ':'
+ { 227, 5, 11, 11, 2, -7 }, // 0x3B ';'
+ { 234, 9, 8, 11, 2, -8 }, // 0x3C '<'
+ { 243, 9, 4, 11, 2, -6 }, // 0x3D '='
+ { 248, 9, 8, 11, 2, -8 }, // 0x3E '>'
+ { 257, 7, 10, 11, 4, -9 }, // 0x3F '?'
+ { 266, 7, 12, 11, 3, -10 }, // 0x40 '@'
+ { 277, 11, 10, 11, 0, -9 }, // 0x41 'A'
+ { 291, 10, 10, 11, 1, -9 }, // 0x42 'B'
+ { 304, 9, 10, 11, 2, -9 }, // 0x43 'C'
+ { 316, 10, 10, 11, 1, -9 }, // 0x44 'D'
+ { 329, 10, 10, 11, 1, -9 }, // 0x45 'E'
+ { 342, 11, 10, 11, 1, -9 }, // 0x46 'F'
+ { 356, 9, 10, 11, 2, -9 }, // 0x47 'G'
+ { 368, 11, 10, 11, 1, -9 }, // 0x48 'H'
+ { 382, 9, 10, 11, 2, -9 }, // 0x49 'I'
+ { 394, 11, 10, 11, 2, -9 }, // 0x4A 'J'
+ { 408, 11, 10, 11, 1, -9 }, // 0x4B 'K'
+ { 422, 10, 10, 11, 1, -9 }, // 0x4C 'L'
+ { 435, 13, 10, 11, 0, -9 }, // 0x4D 'M'
+ { 452, 11, 10, 11, 1, -9 }, // 0x4E 'N'
+ { 466, 9, 10, 11, 2, -9 }, // 0x4F 'O'
+ { 478, 10, 10, 11, 1, -9 }, // 0x50 'P'
+ { 491, 9, 13, 11, 2, -9 }, // 0x51 'Q'
+ { 506, 10, 10, 11, 1, -9 }, // 0x52 'R'
+ { 519, 9, 10, 11, 2, -9 }, // 0x53 'S'
+ { 531, 9, 10, 11, 3, -9 }, // 0x54 'T'
+ { 543, 10, 10, 11, 2, -9 }, // 0x55 'U'
+ { 556, 11, 10, 11, 2, -9 }, // 0x56 'V'
+ { 570, 11, 10, 11, 2, -9 }, // 0x57 'W'
+ { 584, 11, 10, 11, 1, -9 }, // 0x58 'X'
+ { 598, 9, 10, 11, 3, -9 }, // 0x59 'Y'
+ { 610, 9, 10, 11, 2, -9 }, // 0x5A 'Z'
+ { 622, 5, 13, 11, 5, -10 }, // 0x5B '['
+ { 631, 4, 14, 11, 4, -11 }, // 0x5C '\'
+ { 638, 5, 13, 11, 2, -10 }, // 0x5D ']'
+ { 647, 7, 5, 11, 3, -10 }, // 0x5E '^'
+ { 652, 11, 1, 11, 0, 2 }, // 0x5F '_'
+ { 654, 2, 3, 11, 5, -11 }, // 0x60 '`'
+ { 655, 9, 8, 11, 2, -7 }, // 0x61 'a'
+ { 664, 11, 11, 11, 0, -10 }, // 0x62 'b'
+ { 680, 10, 8, 11, 2, -7 }, // 0x63 'c'
+ { 690, 9, 11, 11, 2, -10 }, // 0x64 'd'
+ { 703, 9, 8, 11, 2, -7 }, // 0x65 'e'
+ { 712, 10, 11, 11, 2, -10 }, // 0x66 'f'
+ { 726, 10, 11, 11, 2, -7 }, // 0x67 'g'
+ { 740, 10, 11, 11, 1, -10 }, // 0x68 'h'
+ { 754, 8, 11, 11, 2, -10 }, // 0x69 'i'
+ { 765, 9, 14, 11, 1, -10 }, // 0x6A 'j'
+ { 781, 9, 11, 11, 1, -10 }, // 0x6B 'k'
+ { 794, 8, 11, 11, 2, -10 }, // 0x6C 'l'
+ { 805, 11, 8, 11, 0, -7 }, // 0x6D 'm'
+ { 816, 9, 8, 11, 1, -7 }, // 0x6E 'n'
+ { 825, 9, 8, 11, 2, -7 }, // 0x6F 'o'
+ { 834, 11, 11, 11, 0, -7 }, // 0x70 'p'
+ { 850, 10, 11, 11, 2, -7 }, // 0x71 'q'
+ { 864, 9, 8, 11, 2, -7 }, // 0x72 'r'
+ { 873, 8, 8, 11, 2, -7 }, // 0x73 's'
+ { 881, 7, 10, 11, 2, -9 }, // 0x74 't'
+ { 890, 9, 8, 11, 2, -7 }, // 0x75 'u'
+ { 899, 10, 8, 11, 2, -7 }, // 0x76 'v'
+ { 909, 10, 8, 11, 2, -7 }, // 0x77 'w'
+ { 919, 10, 8, 11, 1, -7 }, // 0x78 'x'
+ { 929, 12, 11, 11, 0, -7 }, // 0x79 'y'
+ { 946, 8, 8, 11, 2, -7 }, // 0x7A 'z'
+ { 954, 6, 13, 11, 4, -10 }, // 0x7B '{'
+ { 964, 3, 12, 11, 5, -9 }, // 0x7C '|'
+ { 969, 6, 13, 11, 3, -10 }, // 0x7D '}'
+ { 979, 7, 3, 11, 3, -6 } }; // 0x7E '~'
+
+const GFXfont FreeMonoOblique9pt7b PROGMEM = {
+ (uint8_t *)FreeMonoOblique9pt7bBitmaps,
+ (GFXglyph *)FreeMonoOblique9pt7bGlyphs,
+ 0x20, 0x7E, 18 };
+
+// Approx. 1654 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSans12pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSans12pt7b.h
new file mode 100644
index 000000000000..9ecbb8fb04d9
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSans12pt7b.h
@@ -0,0 +1,270 @@
+const uint8_t FreeSans12pt7bBitmaps[] PROGMEM = {
+ 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xCF, 0x3C, 0xF3, 0x8A, 0x20, 0x06, 0x30,
+ 0x31, 0x03, 0x18, 0x18, 0xC7, 0xFF, 0xBF, 0xFC, 0x31, 0x03, 0x18, 0x18,
+ 0xC7, 0xFF, 0xBF, 0xFC, 0x31, 0x01, 0x18, 0x18, 0xC0, 0xC6, 0x06, 0x30,
+ 0x04, 0x03, 0xE1, 0xFF, 0x72, 0x6C, 0x47, 0x88, 0xF1, 0x07, 0x20, 0x7E,
+ 0x03, 0xF0, 0x17, 0x02, 0x3C, 0x47, 0x88, 0xF1, 0x1B, 0x26, 0x7F, 0xC3,
+ 0xE0, 0x10, 0x02, 0x00, 0x00, 0x06, 0x03, 0xC0, 0x40, 0x7E, 0x0C, 0x0E,
+ 0x70, 0x80, 0xC3, 0x18, 0x0C, 0x31, 0x00, 0xE7, 0x30, 0x07, 0xE6, 0x00,
+ 0x3C, 0x40, 0x00, 0x0C, 0x7C, 0x00, 0x8F, 0xE0, 0x19, 0xC7, 0x01, 0x18,
+ 0x30, 0x31, 0x83, 0x02, 0x1C, 0x70, 0x40, 0xFE, 0x04, 0x07, 0xC0, 0x0F,
+ 0x00, 0x7E, 0x03, 0x9C, 0x0C, 0x30, 0x30, 0xC0, 0xE7, 0x01, 0xF8, 0x03,
+ 0x80, 0x3E, 0x01, 0xCC, 0x6E, 0x19, 0xB0, 0x7C, 0xC0, 0xF3, 0x03, 0xCE,
+ 0x1F, 0x9F, 0xE6, 0x1E, 0x1C, 0xFF, 0xA0, 0x08, 0x8C, 0x66, 0x31, 0x98,
+ 0xC6, 0x31, 0x8C, 0x63, 0x08, 0x63, 0x08, 0x61, 0x0C, 0x20, 0x82, 0x18,
+ 0xC3, 0x18, 0xC3, 0x18, 0xC6, 0x31, 0x8C, 0x62, 0x31, 0x88, 0xC4, 0x62,
+ 0x00, 0x10, 0x23, 0x5B, 0xE3, 0x8D, 0x91, 0x00, 0x0C, 0x03, 0x00, 0xC0,
+ 0x30, 0xFF, 0xFF, 0xF0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0xF5, 0x60,
+ 0xFF, 0xF0, 0xF0, 0x02, 0x0C, 0x10, 0x20, 0xC1, 0x02, 0x0C, 0x10, 0x20,
+ 0xC1, 0x02, 0x0C, 0x10, 0x20, 0xC1, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x30,
+ 0x6E, 0x0F, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C,
+ 0x0E, 0xC1, 0x9C, 0x71, 0xFC, 0x1F, 0x00, 0x08, 0xCF, 0xFF, 0x8C, 0x63,
+ 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0x1F, 0x0F, 0xF9, 0x87, 0x60, 0x7C,
+ 0x06, 0x00, 0xC0, 0x18, 0x07, 0x01, 0xC0, 0xF0, 0x78, 0x1C, 0x06, 0x00,
+ 0x80, 0x30, 0x07, 0xFF, 0xFF, 0xE0, 0x3F, 0x0F, 0xF3, 0x87, 0x60, 0x6C,
+ 0x0C, 0x01, 0x80, 0x70, 0x7C, 0x0F, 0x80, 0x18, 0x01, 0x80, 0x3C, 0x07,
+ 0x80, 0xD8, 0x73, 0xFC, 0x1F, 0x00, 0x01, 0x80, 0x70, 0x0E, 0x03, 0xC0,
+ 0xD8, 0x1B, 0x06, 0x61, 0x8C, 0x21, 0x8C, 0x33, 0x06, 0x7F, 0xFF, 0xFE,
+ 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x3F, 0xCF, 0xF9, 0x80, 0x30, 0x06,
+ 0x00, 0xDE, 0x1F, 0xE7, 0x0E, 0x00, 0xE0, 0x0C, 0x01, 0x80, 0x30, 0x07,
+ 0x81, 0xF8, 0x73, 0xFC, 0x1F, 0x00, 0x0F, 0x07, 0xF9, 0xC3, 0x30, 0x74,
+ 0x01, 0x80, 0x33, 0xC7, 0xFE, 0xF0, 0xDC, 0x1F, 0x01, 0xE0, 0x3C, 0x06,
+ 0xC1, 0xDC, 0x71, 0xFC, 0x1F, 0x00, 0xFF, 0xFF, 0xFC, 0x01, 0x00, 0x60,
+ 0x18, 0x02, 0x00, 0xC0, 0x30, 0x06, 0x01, 0x80, 0x30, 0x04, 0x01, 0x80,
+ 0x30, 0x06, 0x01, 0x80, 0x30, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x30, 0x66,
+ 0x0C, 0xC1, 0x8C, 0x61, 0xFC, 0x3F, 0x8E, 0x3B, 0x01, 0xE0, 0x3C, 0x07,
+ 0x80, 0xD8, 0x31, 0xFC, 0x1F, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x6C,
+ 0x07, 0x80, 0xF0, 0x1E, 0x07, 0x61, 0xEF, 0xFC, 0x79, 0x80, 0x30, 0x05,
+ 0x81, 0x98, 0x73, 0xFC, 0x1E, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0xF0, 0x00,
+ 0x0F, 0x56, 0x00, 0x00, 0x07, 0x01, 0xE0, 0xF8, 0x3C, 0x0F, 0x00, 0xE0,
+ 0x07, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0x00,
+ 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x0E, 0x00, 0x78, 0x01, 0xF0, 0x07,
+ 0xC0, 0x0F, 0x00, 0x70, 0x1E, 0x0F, 0x03, 0xC0, 0xF0, 0x08, 0x00, 0x1F,
+ 0x1F, 0xEE, 0x1B, 0x03, 0xC0, 0xC0, 0x30, 0x0C, 0x06, 0x03, 0x81, 0xC0,
+ 0xE0, 0x30, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x03, 0x00, 0x00, 0xFE,
+ 0x00, 0x0F, 0xFE, 0x00, 0xF0, 0x3E, 0x07, 0x00, 0x3C, 0x38, 0x00, 0x30,
+ 0xC1, 0xE0, 0x66, 0x0F, 0xD9, 0xD8, 0x61, 0xC3, 0xC3, 0x07, 0x0F, 0x1C,
+ 0x1C, 0x3C, 0x60, 0x60, 0xF1, 0x81, 0x83, 0xC6, 0x06, 0x1B, 0x18, 0x38,
+ 0xEE, 0x71, 0xE7, 0x18, 0xFD, 0xF8, 0x71, 0xE7, 0xC0, 0xE0, 0x00, 0x01,
+ 0xE0, 0x00, 0x01, 0xFF, 0xC0, 0x01, 0xFC, 0x00, 0x03, 0xC0, 0x03, 0xC0,
+ 0x03, 0xC0, 0x07, 0xE0, 0x06, 0x60, 0x06, 0x60, 0x0E, 0x70, 0x0C, 0x30,
+ 0x0C, 0x30, 0x1C, 0x38, 0x18, 0x18, 0x1F, 0xF8, 0x3F, 0xFC, 0x30, 0x1C,
+ 0x30, 0x0C, 0x70, 0x0E, 0x60, 0x06, 0x60, 0x06, 0xFF, 0xC7, 0xFF, 0x30,
+ 0x19, 0x80, 0x6C, 0x03, 0x60, 0x1B, 0x00, 0xD8, 0x0C, 0xFF, 0xC7, 0xFF,
+ 0x30, 0x0D, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x06, 0xFF, 0xF7,
+ 0xFE, 0x00, 0x07, 0xE0, 0x3F, 0xF0, 0xE0, 0x73, 0x80, 0x66, 0x00, 0x6C,
+ 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x06, 0x00,
+ 0x06, 0x00, 0x6C, 0x00, 0xDC, 0x03, 0x1E, 0x0E, 0x1F, 0xF8, 0x0F, 0xC0,
+ 0xFF, 0x83, 0xFF, 0x8C, 0x07, 0x30, 0x0E, 0xC0, 0x1B, 0x00, 0x7C, 0x00,
+ 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x1F, 0x00,
+ 0x6C, 0x03, 0xB0, 0x1C, 0xFF, 0xE3, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xC0,
+ 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xFF, 0xEF, 0xFE, 0xC0,
+ 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xFF, 0xDF,
+ 0xFB, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x00,
+ 0x07, 0xF0, 0x1F, 0xFC, 0x3C, 0x1E, 0x70, 0x06, 0x60, 0x03, 0xE0, 0x00,
+ 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x7F, 0xC0, 0x7F, 0xC0, 0x03, 0xC0, 0x03,
+ 0x60, 0x03, 0x60, 0x07, 0x30, 0x0F, 0x3C, 0x1F, 0x1F, 0xFB, 0x07, 0xE1,
+ 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78,
+ 0x03, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00,
+ 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01,
+ 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60,
+ 0x3C, 0x1E, 0x0F, 0x07, 0xC7, 0x7F, 0x1F, 0x00, 0xC0, 0x3B, 0x01, 0xCC,
+ 0x0E, 0x30, 0x70, 0xC3, 0x83, 0x1C, 0x0C, 0xE0, 0x33, 0x80, 0xDE, 0x03,
+ 0xDC, 0x0E, 0x38, 0x30, 0x60, 0xC1, 0xC3, 0x03, 0x8C, 0x06, 0x30, 0x1C,
+ 0xC0, 0x3B, 0x00, 0x60, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C,
+ 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00,
+ 0xFF, 0xFF, 0xF0, 0xE0, 0x07, 0xE0, 0x07, 0xF0, 0x0F, 0xF0, 0x0F, 0xD0,
+ 0x0F, 0xD8, 0x1B, 0xD8, 0x1B, 0xD8, 0x1B, 0xCC, 0x33, 0xCC, 0x33, 0xCC,
+ 0x33, 0xC6, 0x63, 0xC6, 0x63, 0xC6, 0x63, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC1, 0x83, 0xE0, 0x1F, 0x00, 0xFC, 0x07, 0xE0, 0x3D, 0x81, 0xEE,
+ 0x0F, 0x30, 0x79, 0xC3, 0xC6, 0x1E, 0x18, 0xF0, 0xE7, 0x83, 0x3C, 0x1D,
+ 0xE0, 0x6F, 0x01, 0xF8, 0x0F, 0xC0, 0x3E, 0x01, 0xC0, 0x03, 0xE0, 0x0F,
+ 0xFC, 0x0F, 0x07, 0x86, 0x00, 0xC6, 0x00, 0x33, 0x00, 0x1B, 0x00, 0x07,
+ 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x36, 0x00,
+ 0x33, 0x00, 0x18, 0xC0, 0x18, 0x78, 0x3C, 0x1F, 0xFC, 0x03, 0xF8, 0x00,
+ 0xFF, 0x8F, 0xFE, 0xC0, 0x6C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x07,
+ 0xFF, 0xEF, 0xFC, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00,
+ 0xC0, 0x0C, 0x00, 0x03, 0xE0, 0x0F, 0xFC, 0x0F, 0x07, 0x86, 0x00, 0xC6,
+ 0x00, 0x33, 0x00, 0x1B, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00,
+ 0xF0, 0x00, 0x78, 0x00, 0x36, 0x00, 0x33, 0x01, 0x98, 0xC0, 0xFC, 0x78,
+ 0x3C, 0x1F, 0xFF, 0x03, 0xF9, 0x80, 0x00, 0x40, 0xFF, 0xC3, 0xFF, 0xCC,
+ 0x03, 0xB0, 0x06, 0xC0, 0x1B, 0x00, 0x6C, 0x01, 0xB0, 0x0C, 0xFF, 0xE3,
+ 0xFF, 0xCC, 0x03, 0xB0, 0x06, 0xC0, 0x1B, 0x00, 0x6C, 0x01, 0xB0, 0x06,
+ 0xC0, 0x1B, 0x00, 0x70, 0x0F, 0xE0, 0x7F, 0xC3, 0x83, 0x9C, 0x07, 0x60,
+ 0x0D, 0x80, 0x06, 0x00, 0x1E, 0x00, 0x3F, 0x80, 0x3F, 0xC0, 0x0F, 0x80,
+ 0x07, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0xDE, 0x0E, 0x3F, 0xF0, 0x3F, 0x80,
+ 0xFF, 0xFF, 0xFF, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60,
+ 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60,
+ 0x06, 0x00, 0x60, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0,
+ 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01,
+ 0xE0, 0x0F, 0x80, 0xEE, 0x0E, 0x3F, 0xE0, 0x7C, 0x00, 0x60, 0x06, 0xC0,
+ 0x1D, 0xC0, 0x31, 0x80, 0x63, 0x01, 0xC7, 0x03, 0x06, 0x06, 0x0C, 0x1C,
+ 0x1C, 0x30, 0x18, 0x60, 0x31, 0xC0, 0x73, 0x00, 0x66, 0x00, 0xDC, 0x01,
+ 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0xE0, 0x30, 0x1D, 0x80, 0xE0,
+ 0x76, 0x07, 0x81, 0xD8, 0x1E, 0x06, 0x70, 0x7C, 0x18, 0xC1, 0xB0, 0xE3,
+ 0x0C, 0xC3, 0x8C, 0x33, 0x0C, 0x38, 0xC6, 0x30, 0x67, 0x18, 0xC1, 0x98,
+ 0x67, 0x06, 0x61, 0xD8, 0x1D, 0x83, 0x60, 0x3C, 0x0D, 0x80, 0xF0, 0x3E,
+ 0x03, 0xC0, 0x70, 0x0F, 0x01, 0xC0, 0x18, 0x07, 0x00, 0x70, 0x0E, 0x60,
+ 0x38, 0xE0, 0x60, 0xE1, 0xC0, 0xC3, 0x01, 0xCC, 0x01, 0xF8, 0x01, 0xE0,
+ 0x03, 0x80, 0x07, 0x80, 0x1F, 0x00, 0x33, 0x00, 0xE7, 0x03, 0x86, 0x06,
+ 0x0E, 0x1C, 0x0E, 0x70, 0x0C, 0xC0, 0x1C, 0x60, 0x06, 0x70, 0x0E, 0x30,
+ 0x1C, 0x38, 0x18, 0x1C, 0x38, 0x0C, 0x30, 0x0E, 0x70, 0x06, 0x60, 0x03,
+ 0xC0, 0x03, 0xC0, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
+ 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xC0, 0x0E,
+ 0x00, 0xE0, 0x0E, 0x00, 0x60, 0x07, 0x00, 0x70, 0x07, 0x00, 0x30, 0x03,
+ 0x80, 0x38, 0x03, 0x80, 0x18, 0x01, 0xC0, 0x1C, 0x00, 0xFF, 0xFF, 0xFF,
+ 0xC0, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF,
+ 0xF0, 0x81, 0x81, 0x02, 0x06, 0x04, 0x08, 0x18, 0x10, 0x20, 0x60, 0x40,
+ 0x81, 0x81, 0x02, 0x06, 0x04, 0xFF, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+ 0x33, 0x33, 0x33, 0x3F, 0xF0, 0x0C, 0x0E, 0x05, 0x86, 0xC3, 0x21, 0x19,
+ 0x8C, 0x83, 0xC1, 0x80, 0xFF, 0xFE, 0xE3, 0x8C, 0x30, 0x3F, 0x07, 0xF8,
+ 0xE1, 0xCC, 0x0C, 0x00, 0xC0, 0x1C, 0x3F, 0xCF, 0x8C, 0xC0, 0xCC, 0x0C,
+ 0xE3, 0xC7, 0xEF, 0x3C, 0x70, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0,
+ 0x0C, 0xF8, 0xDF, 0xCF, 0x0E, 0xE0, 0x7C, 0x03, 0xC0, 0x3C, 0x03, 0xC0,
+ 0x3C, 0x03, 0xE0, 0x6F, 0x0E, 0xDF, 0xCC, 0xF8, 0x1F, 0x0F, 0xE7, 0x1B,
+ 0x83, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x38, 0x37, 0x1C, 0xFE, 0x1F,
+ 0x00, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x3C, 0xCF, 0xFB, 0x8F,
+ 0xE0, 0xF8, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF8, 0x3B, 0x8F, 0x3F,
+ 0x63, 0xCC, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x3C, 0x07, 0xFF, 0xFF, 0xFE,
+ 0x00, 0xC0, 0x1C, 0x0D, 0xC3, 0x1F, 0xE1, 0xF0, 0x3B, 0xD8, 0xC6, 0x7F,
+ 0xEC, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x00, 0x1E, 0x67, 0xFD, 0xC7,
+ 0xF0, 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x7C, 0x1D, 0xC7, 0x9F,
+ 0xB1, 0xE6, 0x00, 0xC0, 0x3E, 0x0E, 0x7F, 0xC7, 0xE0, 0xC0, 0x30, 0x0C,
+ 0x03, 0x00, 0xC0, 0x33, 0xCD, 0xFB, 0xC7, 0xE0, 0xF0, 0x3C, 0x0F, 0x03,
+ 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x30, 0xF0, 0x3F, 0xFF, 0xFF,
+ 0xF0, 0x33, 0x00, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F,
+ 0xE0, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x83, 0x30, 0xC6, 0x30,
+ 0xCC, 0x1B, 0x83, 0xF0, 0x77, 0x0C, 0x61, 0x8E, 0x30, 0xE6, 0x0C, 0xC1,
+ 0xD8, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xCF, 0x1F, 0x6F, 0xDF, 0xFC,
+ 0x78, 0xFC, 0x18, 0x3C, 0x0C, 0x1E, 0x06, 0x0F, 0x03, 0x07, 0x81, 0x83,
+ 0xC0, 0xC1, 0xE0, 0x60, 0xF0, 0x30, 0x78, 0x18, 0x3C, 0x0C, 0x18, 0xCF,
+ 0x37, 0xEF, 0x1F, 0x83, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C,
+ 0x0F, 0x03, 0xC0, 0xC0, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x7C, 0x07, 0x80,
+ 0xF0, 0x1E, 0x03, 0xC0, 0x7C, 0x1D, 0xC7, 0x1F, 0xC1, 0xF0, 0xCF, 0x8D,
+ 0xFC, 0xF0, 0xEE, 0x06, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3E,
+ 0x07, 0xF0, 0xEF, 0xFC, 0xCF, 0x8C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x00,
+ 0x1E, 0x67, 0xFD, 0xC7, 0xF0, 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0,
+ 0x7C, 0x1D, 0xC7, 0x9F, 0xF1, 0xE6, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60,
+ 0xCF, 0x7F, 0x38, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC0, 0x3E, 0x1F,
+ 0xEE, 0x1B, 0x00, 0xC0, 0x3C, 0x07, 0xF0, 0x3E, 0x01, 0xF0, 0x3E, 0x1D,
+ 0xFE, 0x3E, 0x00, 0x63, 0x19, 0xFF, 0xB1, 0x8C, 0x63, 0x18, 0xC6, 0x31,
+ 0xE7, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0,
+ 0xF0, 0x7E, 0x3D, 0xFB, 0x3C, 0xC0, 0xE0, 0x66, 0x06, 0x60, 0x67, 0x0C,
+ 0x30, 0xC3, 0x0C, 0x39, 0x81, 0x98, 0x19, 0x81, 0xF0, 0x0F, 0x00, 0xE0,
+ 0x0E, 0x00, 0xC1, 0xC1, 0xB0, 0xE1, 0xD8, 0x70, 0xCC, 0x2C, 0x66, 0x36,
+ 0x31, 0x9B, 0x18, 0xCD, 0x98, 0x64, 0x6C, 0x16, 0x36, 0x0F, 0x1A, 0x07,
+ 0x8F, 0x03, 0x83, 0x80, 0xC1, 0xC0, 0x60, 0xEE, 0x18, 0xC6, 0x0C, 0xC1,
+ 0xF0, 0x1C, 0x01, 0x80, 0x78, 0x1B, 0x03, 0x30, 0xC7, 0x30, 0x66, 0x06,
+ 0xE0, 0x6C, 0x0D, 0x83, 0x38, 0x63, 0x0C, 0x63, 0x0E, 0x60, 0xCC, 0x1B,
+ 0x03, 0x60, 0x3C, 0x07, 0x00, 0xE0, 0x18, 0x03, 0x00, 0xE0, 0x78, 0x0E,
+ 0x00, 0xFF, 0xFF, 0xF0, 0x18, 0x0C, 0x07, 0x03, 0x81, 0xC0, 0x60, 0x30,
+ 0x18, 0x0E, 0x03, 0xFF, 0xFF, 0xC0, 0x19, 0xCC, 0x63, 0x18, 0xC6, 0x31,
+ 0x99, 0x86, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x1C, 0x60, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFC, 0xC7, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x0C, 0x33, 0x31,
+ 0x8C, 0x63, 0x18, 0xC6, 0x73, 0x00, 0x70, 0x3E, 0x09, 0xE4, 0x1F, 0x03,
+ 0x80 };
+
+const GFXglyph FreeSans12pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 6, 0, 1 }, // 0x20 ' '
+ { 0, 2, 18, 8, 3, -17 }, // 0x21 '!'
+ { 5, 6, 6, 8, 1, -16 }, // 0x22 '"'
+ { 10, 13, 16, 13, 0, -15 }, // 0x23 '#'
+ { 36, 11, 20, 13, 1, -17 }, // 0x24 '$'
+ { 64, 20, 17, 21, 1, -16 }, // 0x25 '%'
+ { 107, 14, 17, 16, 1, -16 }, // 0x26 '&'
+ { 137, 2, 6, 5, 1, -16 }, // 0x27 '''
+ { 139, 5, 23, 8, 2, -17 }, // 0x28 '('
+ { 154, 5, 23, 8, 1, -17 }, // 0x29 ')'
+ { 169, 7, 7, 9, 1, -17 }, // 0x2A '*'
+ { 176, 10, 11, 14, 2, -10 }, // 0x2B '+'
+ { 190, 2, 6, 7, 2, -1 }, // 0x2C ','
+ { 192, 6, 2, 8, 1, -7 }, // 0x2D '-'
+ { 194, 2, 2, 6, 2, -1 }, // 0x2E '.'
+ { 195, 7, 18, 7, 0, -17 }, // 0x2F '/'
+ { 211, 11, 17, 13, 1, -16 }, // 0x30 '0'
+ { 235, 5, 17, 13, 3, -16 }, // 0x31 '1'
+ { 246, 11, 17, 13, 1, -16 }, // 0x32 '2'
+ { 270, 11, 17, 13, 1, -16 }, // 0x33 '3'
+ { 294, 11, 17, 13, 1, -16 }, // 0x34 '4'
+ { 318, 11, 17, 13, 1, -16 }, // 0x35 '5'
+ { 342, 11, 17, 13, 1, -16 }, // 0x36 '6'
+ { 366, 11, 17, 13, 1, -16 }, // 0x37 '7'
+ { 390, 11, 17, 13, 1, -16 }, // 0x38 '8'
+ { 414, 11, 17, 13, 1, -16 }, // 0x39 '9'
+ { 438, 2, 13, 6, 2, -12 }, // 0x3A ':'
+ { 442, 2, 16, 6, 2, -11 }, // 0x3B ';'
+ { 446, 12, 12, 14, 1, -11 }, // 0x3C '<'
+ { 464, 12, 6, 14, 1, -8 }, // 0x3D '='
+ { 473, 12, 12, 14, 1, -11 }, // 0x3E '>'
+ { 491, 10, 18, 13, 2, -17 }, // 0x3F '?'
+ { 514, 22, 21, 24, 1, -17 }, // 0x40 '@'
+ { 572, 16, 18, 16, 0, -17 }, // 0x41 'A'
+ { 608, 13, 18, 16, 2, -17 }, // 0x42 'B'
+ { 638, 15, 18, 17, 1, -17 }, // 0x43 'C'
+ { 672, 14, 18, 17, 2, -17 }, // 0x44 'D'
+ { 704, 12, 18, 15, 2, -17 }, // 0x45 'E'
+ { 731, 11, 18, 14, 2, -17 }, // 0x46 'F'
+ { 756, 16, 18, 18, 1, -17 }, // 0x47 'G'
+ { 792, 13, 18, 17, 2, -17 }, // 0x48 'H'
+ { 822, 2, 18, 7, 2, -17 }, // 0x49 'I'
+ { 827, 9, 18, 13, 1, -17 }, // 0x4A 'J'
+ { 848, 14, 18, 16, 2, -17 }, // 0x4B 'K'
+ { 880, 10, 18, 14, 2, -17 }, // 0x4C 'L'
+ { 903, 16, 18, 20, 2, -17 }, // 0x4D 'M'
+ { 939, 13, 18, 18, 2, -17 }, // 0x4E 'N'
+ { 969, 17, 18, 19, 1, -17 }, // 0x4F 'O'
+ { 1008, 12, 18, 16, 2, -17 }, // 0x50 'P'
+ { 1035, 17, 19, 19, 1, -17 }, // 0x51 'Q'
+ { 1076, 14, 18, 17, 2, -17 }, // 0x52 'R'
+ { 1108, 14, 18, 16, 1, -17 }, // 0x53 'S'
+ { 1140, 12, 18, 15, 1, -17 }, // 0x54 'T'
+ { 1167, 13, 18, 17, 2, -17 }, // 0x55 'U'
+ { 1197, 15, 18, 15, 0, -17 }, // 0x56 'V'
+ { 1231, 22, 18, 22, 0, -17 }, // 0x57 'W'
+ { 1281, 15, 18, 16, 0, -17 }, // 0x58 'X'
+ { 1315, 16, 18, 16, 0, -17 }, // 0x59 'Y'
+ { 1351, 13, 18, 15, 1, -17 }, // 0x5A 'Z'
+ { 1381, 4, 23, 7, 2, -17 }, // 0x5B '['
+ { 1393, 7, 18, 7, 0, -17 }, // 0x5C '\'
+ { 1409, 4, 23, 7, 1, -17 }, // 0x5D ']'
+ { 1421, 9, 9, 11, 1, -16 }, // 0x5E '^'
+ { 1432, 15, 1, 13, -1, 4 }, // 0x5F '_'
+ { 1434, 5, 4, 6, 1, -17 }, // 0x60 '`'
+ { 1437, 12, 13, 13, 1, -12 }, // 0x61 'a'
+ { 1457, 12, 18, 13, 1, -17 }, // 0x62 'b'
+ { 1484, 10, 13, 12, 1, -12 }, // 0x63 'c'
+ { 1501, 11, 18, 13, 1, -17 }, // 0x64 'd'
+ { 1526, 11, 13, 13, 1, -12 }, // 0x65 'e'
+ { 1544, 5, 18, 7, 1, -17 }, // 0x66 'f'
+ { 1556, 11, 18, 13, 1, -12 }, // 0x67 'g'
+ { 1581, 10, 18, 13, 1, -17 }, // 0x68 'h'
+ { 1604, 2, 18, 5, 2, -17 }, // 0x69 'i'
+ { 1609, 4, 23, 6, 0, -17 }, // 0x6A 'j'
+ { 1621, 11, 18, 12, 1, -17 }, // 0x6B 'k'
+ { 1646, 2, 18, 5, 1, -17 }, // 0x6C 'l'
+ { 1651, 17, 13, 19, 1, -12 }, // 0x6D 'm'
+ { 1679, 10, 13, 13, 1, -12 }, // 0x6E 'n'
+ { 1696, 11, 13, 13, 1, -12 }, // 0x6F 'o'
+ { 1714, 12, 17, 13, 1, -12 }, // 0x70 'p'
+ { 1740, 11, 17, 13, 1, -12 }, // 0x71 'q'
+ { 1764, 6, 13, 8, 1, -12 }, // 0x72 'r'
+ { 1774, 10, 13, 12, 1, -12 }, // 0x73 's'
+ { 1791, 5, 16, 7, 1, -15 }, // 0x74 't'
+ { 1801, 10, 13, 13, 1, -12 }, // 0x75 'u'
+ { 1818, 12, 13, 12, 0, -12 }, // 0x76 'v'
+ { 1838, 17, 13, 17, 0, -12 }, // 0x77 'w'
+ { 1866, 11, 13, 11, 0, -12 }, // 0x78 'x'
+ { 1884, 11, 18, 11, 0, -12 }, // 0x79 'y'
+ { 1909, 10, 13, 12, 1, -12 }, // 0x7A 'z'
+ { 1926, 5, 23, 8, 1, -17 }, // 0x7B '{'
+ { 1941, 2, 23, 6, 2, -17 }, // 0x7C '|'
+ { 1947, 5, 23, 8, 2, -17 }, // 0x7D '}'
+ { 1962, 10, 5, 12, 1, -10 } }; // 0x7E '~'
+
+const GFXfont FreeSans12pt7b PROGMEM = {
+ (uint8_t *)FreeSans12pt7bBitmaps,
+ (GFXglyph *)FreeSans12pt7bGlyphs,
+ 0x20, 0x7E, 29 };
+
+// Approx. 2641 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSans18pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSans18pt7b.h
new file mode 100644
index 000000000000..3fdc5911ef46
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSans18pt7b.h
@@ -0,0 +1,452 @@
+const uint8_t FreeSans18pt7bBitmaps[] PROGMEM = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x20, 0x3F, 0xFC, 0xE3, 0xF1,
+ 0xF8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8E, 0x82, 0x41, 0x00, 0x01, 0xC3, 0x80,
+ 0x38, 0x70, 0x06, 0x0E, 0x00, 0xC1, 0x80, 0x38, 0x70, 0x07, 0x0E, 0x0F,
+ 0xFF, 0xF9, 0xFF, 0xFF, 0x3F, 0xFF, 0xE0, 0xE1, 0xC0, 0x1C, 0x38, 0x03,
+ 0x87, 0x00, 0x70, 0xE0, 0x0C, 0x18, 0x3F, 0xFF, 0xF7, 0xFF, 0xFE, 0xFF,
+ 0xFF, 0xC1, 0xC3, 0x80, 0x30, 0x60, 0x06, 0x0C, 0x01, 0xC3, 0x80, 0x38,
+ 0x70, 0x07, 0x0E, 0x00, 0xC1, 0x80, 0x03, 0x00, 0x0F, 0xC0, 0x3F, 0xF0,
+ 0x3F, 0xF8, 0x7B, 0x3C, 0xF3, 0x1C, 0xE3, 0x0E, 0xE3, 0x0E, 0xE3, 0x0E,
+ 0xE3, 0x00, 0xE3, 0x00, 0xF3, 0x00, 0x7B, 0x00, 0x7F, 0x80, 0x1F, 0xF0,
+ 0x07, 0xFC, 0x03, 0x7E, 0x03, 0x0F, 0x03, 0x07, 0xE3, 0x07, 0xE3, 0x07,
+ 0xE3, 0x07, 0xE3, 0x0F, 0x73, 0x3E, 0x7F, 0xFC, 0x3F, 0xF8, 0x0F, 0xE0,
+ 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x78, 0x00,
+ 0xE0, 0x0F, 0xF0, 0x06, 0x00, 0xFF, 0xC0, 0x70, 0x07, 0x0E, 0x07, 0x00,
+ 0x70, 0x38, 0x38, 0x03, 0x00, 0xC3, 0x80, 0x18, 0x06, 0x1C, 0x00, 0xE0,
+ 0x71, 0xC0, 0x03, 0x87, 0x8C, 0x00, 0x1F, 0xF8, 0xE0, 0x00, 0x7F, 0x86,
+ 0x00, 0x01, 0xF8, 0x70, 0x00, 0x00, 0x03, 0x03, 0xC0, 0x00, 0x38, 0x7F,
+ 0x80, 0x01, 0x87, 0xFE, 0x00, 0x1C, 0x38, 0x70, 0x00, 0xC3, 0x81, 0xC0,
+ 0x0E, 0x18, 0x06, 0x00, 0xE0, 0xC0, 0x30, 0x07, 0x07, 0x03, 0x80, 0x70,
+ 0x1C, 0x38, 0x03, 0x80, 0xFF, 0xC0, 0x38, 0x03, 0xFC, 0x01, 0x80, 0x07,
+ 0x80, 0x01, 0xF0, 0x00, 0x7F, 0x80, 0x0F, 0xFC, 0x01, 0xE1, 0xE0, 0x1C,
+ 0x0E, 0x01, 0xC0, 0xE0, 0x1C, 0x0E, 0x01, 0xE1, 0xE0, 0x0E, 0x3C, 0x00,
+ 0x77, 0x80, 0x07, 0xF0, 0x00, 0x7C, 0x00, 0x0F, 0xE0, 0x03, 0xCF, 0x1C,
+ 0x78, 0x79, 0xC7, 0x03, 0xDC, 0xE0, 0x1F, 0x8E, 0x00, 0xF8, 0xE0, 0x0F,
+ 0x0E, 0x00, 0x70, 0xF0, 0x0F, 0x87, 0xC3, 0xFC, 0x7F, 0xFD, 0xC3, 0xFF,
+ 0x0E, 0x0F, 0xC0, 0xF0, 0xFF, 0xFF, 0xFA, 0x40, 0x06, 0x06, 0x0C, 0x0C,
+ 0x18, 0x18, 0x38, 0x30, 0x70, 0x70, 0x70, 0x60, 0xE0, 0xE0, 0xE0, 0xE0,
+ 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x60, 0x70, 0x70, 0x70, 0x30, 0x38, 0x18,
+ 0x18, 0x0C, 0x0C, 0x06, 0x03, 0xC0, 0x60, 0x30, 0x30, 0x38, 0x18, 0x1C,
+ 0x0C, 0x0E, 0x0E, 0x0E, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x06, 0x0E, 0x0E, 0x0E, 0x0C, 0x1C, 0x18, 0x38, 0x30, 0x30,
+ 0x60, 0xC0, 0x0C, 0x03, 0x00, 0xC3, 0xB7, 0xFF, 0xC7, 0x81, 0xE0, 0xEC,
+ 0x73, 0x88, 0x40, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
+ 0x80, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x01,
+ 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0xFF,
+ 0xF6, 0xDA, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xC0, 0x30, 0x18,
+ 0x06, 0x01, 0x80, 0xC0, 0x30, 0x0C, 0x06, 0x01, 0x80, 0x60, 0x30, 0x0C,
+ 0x03, 0x00, 0xC0, 0x60, 0x18, 0x06, 0x03, 0x00, 0xC0, 0x30, 0x18, 0x06,
+ 0x01, 0x80, 0xC0, 0x30, 0x00, 0x07, 0xE0, 0x0F, 0xF8, 0x1F, 0xFC, 0x3C,
+ 0x3C, 0x78, 0x1E, 0x70, 0x0E, 0x70, 0x0E, 0xE0, 0x07, 0xE0, 0x07, 0xE0,
+ 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0,
+ 0x07, 0xE0, 0x07, 0xE0, 0x0F, 0x70, 0x0E, 0x70, 0x0E, 0x78, 0x1E, 0x3C,
+ 0x3C, 0x1F, 0xF8, 0x1F, 0xF0, 0x07, 0xE0, 0x03, 0x03, 0x07, 0x0F, 0x3F,
+ 0xFF, 0xFF, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xE0, 0x1F, 0xF8,
+ 0x3F, 0xFC, 0x7C, 0x3E, 0x70, 0x0F, 0xF0, 0x0F, 0xE0, 0x07, 0xE0, 0x07,
+ 0x00, 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0xF8,
+ 0x03, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x70, 0x00,
+ 0x60, 0x00, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xF0,
+ 0x07, 0xFE, 0x07, 0xFF, 0x87, 0x83, 0xC3, 0x80, 0xF3, 0x80, 0x39, 0xC0,
+ 0x1C, 0xE0, 0x0E, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x7F, 0x00, 0x3F, 0x00,
+ 0x1F, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x03, 0xF0, 0x01,
+ 0xF8, 0x00, 0xFE, 0x00, 0x77, 0x00, 0x73, 0xE0, 0xF8, 0xFF, 0xF8, 0x3F,
+ 0xF8, 0x07, 0xF0, 0x00, 0x00, 0x38, 0x00, 0x38, 0x00, 0x78, 0x00, 0xF8,
+ 0x00, 0xF8, 0x01, 0xF8, 0x03, 0xB8, 0x03, 0x38, 0x07, 0x38, 0x0E, 0x38,
+ 0x1C, 0x38, 0x18, 0x38, 0x38, 0x38, 0x70, 0x38, 0x60, 0x38, 0xE0, 0x38,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38,
+ 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x1F, 0xFF, 0x0F, 0xFF, 0x8F, 0xFF,
+ 0xC7, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x39,
+ 0xF0, 0x3F, 0xFE, 0x1F, 0xFF, 0x8F, 0x83, 0xE7, 0x00, 0xF0, 0x00, 0x3C,
+ 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xFC, 0x00,
+ 0xEF, 0x00, 0x73, 0xC0, 0xF0, 0xFF, 0xF8, 0x3F, 0xF8, 0x07, 0xE0, 0x00,
+ 0x03, 0xE0, 0x0F, 0xF8, 0x1F, 0xFC, 0x3C, 0x1E, 0x38, 0x0E, 0x70, 0x0E,
+ 0x70, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xE3, 0xE0, 0xEF, 0xF8, 0xFF, 0xFC,
+ 0xFC, 0x3E, 0xF0, 0x0E, 0xF0, 0x0F, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07,
+ 0x60, 0x07, 0x70, 0x0F, 0x70, 0x0E, 0x3C, 0x3E, 0x3F, 0xFC, 0x1F, 0xF8,
+ 0x07, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x06, 0x00, 0x0E,
+ 0x00, 0x1C, 0x00, 0x18, 0x00, 0x38, 0x00, 0x70, 0x00, 0x60, 0x00, 0xE0,
+ 0x00, 0xC0, 0x01, 0xC0, 0x01, 0x80, 0x03, 0x80, 0x03, 0x80, 0x07, 0x00,
+ 0x07, 0x00, 0x07, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0C, 0x00,
+ 0x1C, 0x00, 0x1C, 0x00, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x87, 0x83,
+ 0xC7, 0x80, 0xF3, 0x80, 0x39, 0xC0, 0x1C, 0xE0, 0x0E, 0x78, 0x0F, 0x1E,
+ 0x0F, 0x07, 0xFF, 0x01, 0xFF, 0x03, 0xFF, 0xE3, 0xE0, 0xF9, 0xC0, 0x1D,
+ 0xC0, 0x0F, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0xF7, 0x00,
+ 0x73, 0xE0, 0xF8, 0xFF, 0xF8, 0x3F, 0xF8, 0x07, 0xF0, 0x00, 0x07, 0xE0,
+ 0x1F, 0xF8, 0x3F, 0xFC, 0x7C, 0x3C, 0x70, 0x0E, 0xF0, 0x0E, 0xE0, 0x06,
+ 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x0F, 0x70, 0x0F, 0x78, 0x3F,
+ 0x3F, 0xFF, 0x1F, 0xF7, 0x07, 0xC7, 0x00, 0x07, 0x00, 0x06, 0x00, 0x0E,
+ 0x70, 0x0E, 0x70, 0x1C, 0x78, 0x3C, 0x3F, 0xF8, 0x1F, 0xF0, 0x07, 0xC0,
+ 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x80, 0xFF, 0xF0, 0x00, 0x00,
+ 0x00, 0x07, 0xFF, 0xB6, 0xD6, 0x00, 0x00, 0x80, 0x03, 0xC0, 0x07, 0xE0,
+ 0x0F, 0xC0, 0x3F, 0x80, 0x7E, 0x00, 0xFC, 0x01, 0xF0, 0x00, 0xE0, 0x00,
+ 0x7C, 0x00, 0x1F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x80, 0x07, 0xF0, 0x00,
+ 0x7E, 0x00, 0x0F, 0x00, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x80, 0x80, 0x00, 0x70, 0x00, 0x3E, 0x00, 0x0F, 0xE0, 0x00, 0xFC,
+ 0x00, 0x1F, 0xC0, 0x03, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0x80, 0x0F, 0xC0,
+ 0x1F, 0x80, 0x7F, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x01, 0xC0, 0x00,
+ 0x80, 0x00, 0x00, 0x0F, 0xC0, 0x7F, 0xE1, 0xFF, 0xE3, 0xC3, 0xEF, 0x01,
+ 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0x00, 0x0E, 0x00, 0x38, 0x00, 0xF0,
+ 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x00, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x0E,
+ 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x03, 0x80,
+ 0x07, 0x00, 0x0E, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x3F, 0xFF, 0x00,
+ 0x00, 0xFF, 0xFF, 0xC0, 0x01, 0xF8, 0x0F, 0xE0, 0x03, 0xE0, 0x01, 0xF0,
+ 0x07, 0x80, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x3C, 0x1E, 0x00, 0x00, 0x1E,
+ 0x3C, 0x03, 0xE0, 0x1E, 0x38, 0x0F, 0xF3, 0x8E, 0x78, 0x1E, 0x3F, 0x0F,
+ 0x70, 0x38, 0x1F, 0x07, 0x70, 0x78, 0x0F, 0x07, 0xE0, 0x70, 0x0E, 0x07,
+ 0xE0, 0x70, 0x0E, 0x07, 0xE0, 0xE0, 0x0E, 0x07, 0xE0, 0xE0, 0x1C, 0x07,
+ 0xE0, 0xE0, 0x1C, 0x0E, 0xE0, 0xE0, 0x1C, 0x0E, 0xE0, 0xE0, 0x38, 0x1C,
+ 0xF0, 0x70, 0x78, 0x3C, 0x70, 0x78, 0xFC, 0x78, 0x78, 0x3F, 0xDF, 0xF0,
+ 0x38, 0x1F, 0x0F, 0xC0, 0x3C, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00,
+ 0x0F, 0x80, 0x00, 0x00, 0x07, 0xF0, 0x0E, 0x00, 0x01, 0xFF, 0xFE, 0x00,
+ 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x03,
+ 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xDC, 0x00, 0x07, 0x78,
+ 0x00, 0x3C, 0xE0, 0x00, 0xE3, 0x80, 0x03, 0x8F, 0x00, 0x1E, 0x1C, 0x00,
+ 0x70, 0x70, 0x01, 0xC1, 0xE0, 0x0E, 0x03, 0x80, 0x38, 0x0E, 0x00, 0xE0,
+ 0x3C, 0x07, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0xFF, 0xFF, 0x83, 0xC0, 0x0E,
+ 0x0E, 0x00, 0x3C, 0x78, 0x00, 0xF1, 0xE0, 0x01, 0xC7, 0x00, 0x07, 0xBC,
+ 0x00, 0x1E, 0xF0, 0x00, 0x3B, 0x80, 0x00, 0xF0, 0xFF, 0xFC, 0x1F, 0xFF,
+ 0xE3, 0xFF, 0xFE, 0x70, 0x03, 0xCE, 0x00, 0x3D, 0xC0, 0x03, 0xB8, 0x00,
+ 0x77, 0x00, 0x0E, 0xE0, 0x01, 0xDC, 0x00, 0x73, 0x80, 0x1E, 0x7F, 0xFF,
+ 0x8F, 0xFF, 0xF1, 0xFF, 0xFF, 0x38, 0x00, 0xF7, 0x00, 0x0E, 0xE0, 0x00,
+ 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x03,
+ 0xF8, 0x00, 0xF7, 0xFF, 0xFC, 0xFF, 0xFF, 0x1F, 0xFF, 0x80, 0x00, 0xFF,
+ 0x00, 0x0F, 0xFF, 0x00, 0xFF, 0xFE, 0x07, 0xE0, 0x7C, 0x3E, 0x00, 0x78,
+ 0xF0, 0x00, 0xE7, 0x80, 0x03, 0xDC, 0x00, 0x07, 0x70, 0x00, 0x03, 0x80,
+ 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00,
+ 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x1D, 0xC0, 0x00, 0x77,
+ 0x00, 0x03, 0xDE, 0x00, 0x0E, 0x3C, 0x00, 0x78, 0xF8, 0x03, 0xC1, 0xF8,
+ 0x1F, 0x03, 0xFF, 0xF8, 0x03, 0xFF, 0xC0, 0x03, 0xF8, 0x00, 0xFF, 0xF8,
+ 0x0F, 0xFF, 0xE0, 0xFF, 0xFF, 0x0E, 0x00, 0xF8, 0xE0, 0x03, 0xCE, 0x00,
+ 0x1C, 0xE0, 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0xFE, 0x00, 0x07, 0xE0,
+ 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E,
+ 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x0F, 0xE0, 0x00, 0xEE, 0x00, 0x0E,
+ 0xE0, 0x01, 0xEE, 0x00, 0x3C, 0xE0, 0x0F, 0x8F, 0xFF, 0xF0, 0xFF, 0xFE,
+ 0x0F, 0xFF, 0x80, 0xFF, 0xFF, 0xBF, 0xFF, 0xEF, 0xFF, 0xFB, 0x80, 0x00,
+ 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38,
+ 0x00, 0x0E, 0x00, 0x03, 0xFF, 0xFE, 0xFF, 0xFF, 0xBF, 0xFF, 0xEE, 0x00,
+ 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00,
+ 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x0E, 0x00,
+ 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38,
+ 0x00, 0x1F, 0xFF, 0xCF, 0xFF, 0xE7, 0xFF, 0xF3, 0x80, 0x01, 0xC0, 0x00,
+ 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00,
+ 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x7F,
+ 0x80, 0x03, 0xFF, 0xE0, 0x07, 0xFF, 0xF8, 0x0F, 0x80, 0xFC, 0x1E, 0x00,
+ 0x3E, 0x3C, 0x00, 0x0E, 0x78, 0x00, 0x0F, 0x70, 0x00, 0x07, 0x70, 0x00,
+ 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x03,
+ 0xFF, 0xE0, 0x03, 0xFF, 0xE0, 0x03, 0xFF, 0xE0, 0x00, 0x07, 0xF0, 0x00,
+ 0x07, 0x70, 0x00, 0x07, 0x70, 0x00, 0x0F, 0x78, 0x00, 0x0F, 0x3C, 0x00,
+ 0x1F, 0x1E, 0x00, 0x3F, 0x0F, 0xC0, 0xF7, 0x07, 0xFF, 0xE7, 0x03, 0xFF,
+ 0xC3, 0x00, 0xFF, 0x03, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0,
+ 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0,
+ 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80,
+ 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00,
+ 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00,
+ 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0,
+ 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1F, 0x80, 0x7E,
+ 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0xC0, 0xF7, 0x87, 0x9F, 0xFE, 0x3F, 0xF0,
+ 0x3F, 0x00, 0xE0, 0x01, 0xEE, 0x00, 0x3C, 0xE0, 0x07, 0x8E, 0x00, 0xF0,
+ 0xE0, 0x1E, 0x0E, 0x03, 0xE0, 0xE0, 0x7C, 0x0E, 0x0F, 0x80, 0xE1, 0xF0,
+ 0x0E, 0x1E, 0x00, 0xE3, 0xC0, 0x0E, 0x7C, 0x00, 0xEF, 0xE0, 0x0F, 0xCE,
+ 0x00, 0xF8, 0xF0, 0x0F, 0x07, 0x80, 0xE0, 0x3C, 0x0E, 0x03, 0xC0, 0xE0,
+ 0x1E, 0x0E, 0x00, 0xF0, 0xE0, 0x0F, 0x0E, 0x00, 0x78, 0xE0, 0x03, 0xCE,
+ 0x00, 0x3C, 0xE0, 0x01, 0xEE, 0x00, 0x0F, 0xE0, 0x01, 0xC0, 0x03, 0x80,
+ 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01,
+ 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70,
+ 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00,
+ 0x38, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0x00, 0x1F, 0xF8,
+ 0x00, 0x1F, 0xF8, 0x00, 0x1F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC,
+ 0x00, 0x3F, 0xEE, 0x00, 0x77, 0xEE, 0x00, 0x77, 0xEE, 0x00, 0x77, 0xE7,
+ 0x00, 0xE7, 0xE7, 0x00, 0xE7, 0xE7, 0x00, 0xE7, 0xE3, 0x81, 0xC7, 0xE3,
+ 0x81, 0xC7, 0xE3, 0x81, 0xC7, 0xE1, 0xC3, 0x87, 0xE1, 0xC3, 0x87, 0xE1,
+ 0xC3, 0x87, 0xE0, 0xE7, 0x07, 0xE0, 0xE7, 0x07, 0xE0, 0xE7, 0x07, 0xE0,
+ 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x3C, 0x07, 0xE0,
+ 0x3C, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF8, 0x00, 0x7F, 0xC0, 0x07,
+ 0xFC, 0x00, 0x7F, 0xE0, 0x07, 0xEF, 0x00, 0x7E, 0x70, 0x07, 0xE7, 0x80,
+ 0x7E, 0x3C, 0x07, 0xE1, 0xC0, 0x7E, 0x1E, 0x07, 0xE0, 0xE0, 0x7E, 0x0F,
+ 0x07, 0xE0, 0x78, 0x7E, 0x03, 0x87, 0xE0, 0x3C, 0x7E, 0x01, 0xE7, 0xE0,
+ 0x0E, 0x7E, 0x00, 0xF7, 0xE0, 0x07, 0xFE, 0x00, 0x3F, 0xE0, 0x03, 0xFE,
+ 0x00, 0x1F, 0xE0, 0x01, 0xFE, 0x00, 0x0F, 0x00, 0x7F, 0x00, 0x01, 0xFF,
+ 0xF0, 0x01, 0xFF, 0xFC, 0x01, 0xF0, 0x1F, 0x01, 0xE0, 0x03, 0xC1, 0xE0,
+ 0x00, 0xF1, 0xE0, 0x00, 0x3C, 0xE0, 0x00, 0x0E, 0x70, 0x00, 0x07, 0x70,
+ 0x00, 0x03, 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F,
+ 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03,
+ 0xB8, 0x00, 0x03, 0x9C, 0x00, 0x01, 0xCF, 0x00, 0x01, 0xE3, 0xC0, 0x01,
+ 0xE0, 0xF0, 0x01, 0xE0, 0x3E, 0x03, 0xE0, 0x0F, 0xFF, 0xE0, 0x03, 0xFF,
+ 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFF, 0xFC, 0x3F, 0xFF, 0x8F, 0xFF, 0xF3,
+ 0x80, 0x3E, 0xE0, 0x03, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0,
+ 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x3F, 0x80, 0x1E, 0xFF, 0xFF, 0x3F, 0xFF,
+ 0x8F, 0xFF, 0xC3, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03,
+ 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0,
+ 0x00, 0x38, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0xFF, 0xF0, 0x01, 0xFF,
+ 0xFC, 0x01, 0xF0, 0x1F, 0x01, 0xE0, 0x03, 0xC1, 0xE0, 0x00, 0xF1, 0xE0,
+ 0x00, 0x3C, 0xE0, 0x00, 0x0E, 0x70, 0x00, 0x07, 0x70, 0x00, 0x01, 0xF8,
+ 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F,
+ 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xB8, 0x00, 0x03,
+ 0x9C, 0x00, 0x01, 0xCF, 0x00, 0x39, 0xE3, 0xC0, 0x1F, 0xE0, 0xF0, 0x07,
+ 0xE0, 0x3E, 0x03, 0xF0, 0x0F, 0xFF, 0xFC, 0x03, 0xFF, 0xEE, 0x00, 0x3F,
+ 0x83, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x20, 0xFF, 0xFE, 0x0F, 0xFF,
+ 0xF8, 0xFF, 0xFF, 0xCE, 0x00, 0x3C, 0xE0, 0x01, 0xEE, 0x00, 0x0E, 0xE0,
+ 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x01, 0xCE,
+ 0x00, 0x3C, 0xFF, 0xFF, 0x8F, 0xFF, 0xF0, 0xFF, 0xFF, 0x8E, 0x00, 0x3C,
+ 0xE0, 0x01, 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x00,
+ 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0xFE, 0x00,
+ 0x0F, 0x03, 0xFC, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, 0xE0, 0x7C, 0x38,
+ 0x01, 0xE7, 0x00, 0x0E, 0x70, 0x00, 0xE7, 0x00, 0x00, 0x70, 0x00, 0x07,
+ 0x80, 0x00, 0x3E, 0x00, 0x01, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x3F, 0xF8,
+ 0x00, 0x3F, 0xE0, 0x00, 0x3E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0xE0, 0x00,
+ 0x7E, 0x00, 0x07, 0xF0, 0x00, 0x77, 0x80, 0x0E, 0x7C, 0x03, 0xE3, 0xFF,
+ 0xFC, 0x1F, 0xFF, 0x80, 0x3F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x80, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07,
+ 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E,
+ 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C,
+ 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38,
+ 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0xE0, 0x00, 0xFC, 0x00,
+ 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00,
+ 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00,
+ 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00,
+ 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7F, 0x00, 0x1E, 0xF0, 0x07,
+ 0x9F, 0x01, 0xF1, 0xFF, 0xFC, 0x1F, 0xFE, 0x00, 0x7F, 0x00, 0xE0, 0x00,
+ 0x7F, 0x80, 0x03, 0xFC, 0x00, 0x1C, 0xE0, 0x01, 0xE7, 0x80, 0x0F, 0x3C,
+ 0x00, 0x70, 0xE0, 0x07, 0x87, 0x80, 0x3C, 0x1C, 0x01, 0xC0, 0xE0, 0x0E,
+ 0x07, 0x80, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x38, 0x07, 0x83, 0x80, 0x1C,
+ 0x1C, 0x00, 0xE0, 0xE0, 0x07, 0x8E, 0x00, 0x1C, 0x70, 0x00, 0xE3, 0x80,
+ 0x07, 0xB8, 0x00, 0x1D, 0xC0, 0x00, 0xEE, 0x00, 0x07, 0xE0, 0x00, 0x1F,
+ 0x00, 0x00, 0xF8, 0x00, 0x03, 0x80, 0x00, 0x70, 0x03, 0xC0, 0x0F, 0x70,
+ 0x03, 0xC0, 0x0F, 0x78, 0x03, 0xE0, 0x0F, 0x78, 0x03, 0xE0, 0x0E, 0x38,
+ 0x07, 0xE0, 0x0E, 0x38, 0x07, 0xF0, 0x1E, 0x3C, 0x07, 0x70, 0x1E, 0x3C,
+ 0x07, 0x70, 0x1C, 0x1C, 0x0E, 0x70, 0x1C, 0x1C, 0x0E, 0x38, 0x3C, 0x1C,
+ 0x0E, 0x38, 0x3C, 0x1E, 0x1E, 0x38, 0x38, 0x0E, 0x1C, 0x38, 0x38, 0x0E,
+ 0x1C, 0x1C, 0x38, 0x0E, 0x1C, 0x1C, 0x78, 0x0F, 0x3C, 0x1C, 0x70, 0x07,
+ 0x38, 0x0E, 0x70, 0x07, 0x38, 0x0E, 0x70, 0x07, 0x38, 0x0E, 0x70, 0x07,
+ 0x70, 0x0E, 0xE0, 0x03, 0xF0, 0x07, 0xE0, 0x03, 0xF0, 0x07, 0xE0, 0x03,
+ 0xF0, 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xC0, 0x01, 0xE0, 0x03, 0xC0, 0x01,
+ 0xE0, 0x03, 0xC0, 0xF0, 0x00, 0x7B, 0xC0, 0x07, 0x8F, 0x00, 0x38, 0x78,
+ 0x03, 0xC1, 0xE0, 0x3C, 0x07, 0x81, 0xC0, 0x3C, 0x1E, 0x00, 0xF1, 0xE0,
+ 0x03, 0x8E, 0x00, 0x1E, 0xF0, 0x00, 0x7F, 0x00, 0x01, 0xF0, 0x00, 0x0F,
+ 0x80, 0x00, 0x7C, 0x00, 0x07, 0xF0, 0x00, 0x3B, 0x80, 0x03, 0xDE, 0x00,
+ 0x3C, 0x78, 0x01, 0xC1, 0xC0, 0x1E, 0x0F, 0x01, 0xE0, 0x3C, 0x0E, 0x00,
+ 0xE0, 0xF0, 0x07, 0x8F, 0x00, 0x1E, 0x70, 0x00, 0xF7, 0x80, 0x03, 0xC0,
+ 0xF0, 0x00, 0x3C, 0xF0, 0x00, 0x78, 0xF0, 0x01, 0xE1, 0xE0, 0x03, 0x81,
+ 0xE0, 0x0F, 0x01, 0xC0, 0x1C, 0x03, 0xC0, 0x78, 0x03, 0xC1, 0xE0, 0x07,
+ 0x83, 0x80, 0x07, 0x8F, 0x00, 0x07, 0x1C, 0x00, 0x0F, 0x78, 0x00, 0x0E,
+ 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38,
+ 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80,
+ 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00,
+ 0x00, 0x70, 0x00, 0x7F, 0xFF, 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0x80, 0x00,
+ 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E,
+ 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0,
+ 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x7C, 0x00,
+ 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xF8, 0xE3, 0x8E, 0x38, 0xE3,
+ 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3,
+ 0x8E, 0x38, 0xE3, 0x8F, 0xFF, 0xFC, 0xC0, 0x30, 0x06, 0x01, 0x80, 0x60,
+ 0x0C, 0x03, 0x00, 0xC0, 0x18, 0x06, 0x01, 0x80, 0x20, 0x0C, 0x03, 0x00,
+ 0x40, 0x18, 0x06, 0x01, 0x80, 0x30, 0x0C, 0x03, 0x00, 0x60, 0x18, 0x06,
+ 0x00, 0xC0, 0x30, 0xFF, 0xFF, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7,
+ 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7,
+ 0x1C, 0x7F, 0xFF, 0xFC, 0x07, 0x00, 0x78, 0x03, 0xC0, 0x3F, 0x01, 0xD8,
+ 0x0C, 0xE0, 0xE3, 0x06, 0x1C, 0x70, 0xE3, 0x83, 0x18, 0x1D, 0xC0, 0x6C,
+ 0x03, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF0, 0xF0, 0xE0, 0xE0,
+ 0xE0, 0x07, 0xF0, 0x0F, 0xFC, 0x0F, 0xFF, 0x0F, 0x03, 0xC7, 0x00, 0xE0,
+ 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0xFE, 0x0F, 0xFF, 0x1F, 0xF3,
+ 0x9F, 0x01, 0xCF, 0x00, 0xE7, 0x00, 0x73, 0x80, 0x79, 0xE0, 0xFC, 0x7F,
+ 0xEF, 0x9F, 0xE3, 0xC7, 0xE1, 0xE0, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00,
+ 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE3, 0xE0, 0xEF, 0xF8,
+ 0xFF, 0xFC, 0xFC, 0x3E, 0xF8, 0x1E, 0xF0, 0x0E, 0xE0, 0x0F, 0xE0, 0x07,
+ 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xF0, 0x0E,
+ 0xF8, 0x1E, 0xFC, 0x3C, 0xEF, 0xFC, 0xEF, 0xF8, 0xE3, 0xE0, 0x07, 0xF0,
+ 0x1F, 0xF8, 0x3F, 0xFC, 0x3C, 0x1E, 0x78, 0x0E, 0x70, 0x07, 0xE0, 0x00,
+ 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x07,
+ 0x70, 0x07, 0x78, 0x0E, 0x7C, 0x1E, 0x3F, 0xFC, 0x1F, 0xF8, 0x07, 0xE0,
+ 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00,
+ 0x1C, 0x00, 0x0E, 0x0F, 0xC7, 0x1F, 0xFB, 0x9F, 0xFF, 0xDF, 0x07, 0xEF,
+ 0x01, 0xF7, 0x00, 0x7F, 0x80, 0x3F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0x03,
+ 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x77, 0x00, 0x7B, 0xC0, 0x7D, 0xF0,
+ 0x7E, 0x7F, 0xFB, 0x1F, 0xF9, 0x83, 0xF0, 0xC0, 0x07, 0xE0, 0x1F, 0xF8,
+ 0x3F, 0xFC, 0x7C, 0x1E, 0x70, 0x0E, 0x60, 0x06, 0xE0, 0x07, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0x70, 0x07,
+ 0x78, 0x0E, 0x3C, 0x1E, 0x3F, 0xFC, 0x1F, 0xF8, 0x07, 0xE0, 0x0E, 0x3C,
+ 0xF9, 0xC3, 0x87, 0x0E, 0x7F, 0xFF, 0xFC, 0xE1, 0xC3, 0x87, 0x0E, 0x1C,
+ 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0x07, 0xC7, 0x1F,
+ 0xF7, 0x3F, 0xFF, 0x3C, 0x3F, 0x78, 0x0F, 0x70, 0x0F, 0xE0, 0x07, 0xE0,
+ 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0x70,
+ 0x0F, 0x78, 0x0F, 0x7C, 0x3F, 0x3F, 0xF7, 0x1F, 0xE7, 0x07, 0xC7, 0x00,
+ 0x07, 0x00, 0x07, 0x00, 0x0E, 0x70, 0x0E, 0x78, 0x1E, 0x3F, 0xFC, 0x1F,
+ 0xF8, 0x07, 0xE0, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00,
+ 0x1C, 0x00, 0x38, 0x00, 0x71, 0xF8, 0xE7, 0xFD, 0xDF, 0xFB, 0xF0, 0xFF,
+ 0xC0, 0xFF, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0,
+ 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07,
+ 0xE0, 0x0F, 0xC0, 0x1C, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFC, 0x1C, 0x71, 0xC7, 0x00, 0x00, 0x07, 0x1C, 0x71, 0xC7, 0x1C,
+ 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C,
+ 0x73, 0xFF, 0xFB, 0xC0, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00,
+ 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x3C, 0xE0, 0x78, 0xE0, 0xF0,
+ 0xE1, 0xE0, 0xE3, 0xC0, 0xE7, 0x80, 0xEF, 0x00, 0xEF, 0x80, 0xFF, 0x80,
+ 0xFB, 0xC0, 0xF1, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xE0, 0x70, 0xE0, 0x78,
+ 0xE0, 0x3C, 0xE0, 0x1C, 0xE0, 0x1E, 0xE0, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xE3, 0xE0, 0xF8, 0xE7, 0xF1, 0xFE,
+ 0xEF, 0xFB, 0xFE, 0xF8, 0x7F, 0x0F, 0xF0, 0x3E, 0x07, 0xF0, 0x1C, 0x07,
+ 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07,
+ 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07,
+ 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07,
+ 0xE0, 0x1C, 0x07, 0xE3, 0xF1, 0xCF, 0xFB, 0xBF, 0xF7, 0xE1, 0xFF, 0x81,
+ 0xFE, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F,
+ 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0,
+ 0x1F, 0x80, 0x38, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x87, 0x83, 0xC7,
+ 0x80, 0xF3, 0x80, 0x3B, 0x80, 0x1F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x01,
+ 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x3B, 0x80, 0x39, 0xE0, 0x3C, 0x78,
+ 0x3C, 0x3F, 0xFE, 0x0F, 0xFE, 0x01, 0xFC, 0x00, 0xE3, 0xE0, 0xE7, 0xF8,
+ 0xEF, 0xFC, 0xFC, 0x3E, 0xF8, 0x1E, 0xF0, 0x0E, 0xE0, 0x0F, 0xE0, 0x07,
+ 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xF0, 0x0E,
+ 0xF8, 0x1E, 0xFC, 0x3E, 0xFF, 0xFC, 0xEF, 0xF8, 0xE3, 0xE0, 0xE0, 0x00,
+ 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0x07, 0xE1,
+ 0x8F, 0xFC, 0xCF, 0xFF, 0x67, 0x83, 0xF7, 0x80, 0xFB, 0x80, 0x3F, 0xC0,
+ 0x1F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x7E,
+ 0x00, 0x3B, 0x80, 0x3D, 0xE0, 0x3E, 0xF8, 0x3F, 0x3F, 0xFF, 0x8F, 0xFD,
+ 0xC1, 0xF8, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00,
+ 0x07, 0x00, 0x03, 0x80, 0xE3, 0xF7, 0xFB, 0xFF, 0x8F, 0x07, 0x83, 0x81,
+ 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70,
+ 0x38, 0x00, 0x0F, 0xC0, 0xFF, 0x87, 0xFF, 0x3C, 0x1E, 0xE0, 0x3B, 0x80,
+ 0x0E, 0x00, 0x3C, 0x00, 0x7F, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x7F, 0x00,
+ 0x3F, 0x80, 0x7E, 0x01, 0xFC, 0x1F, 0x7F, 0xF8, 0xFF, 0xC1, 0xFC, 0x00,
+ 0x38, 0x70, 0xE1, 0xCF, 0xFF, 0xFF, 0x9C, 0x38, 0x70, 0xE1, 0xC3, 0x87,
+ 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0xE7, 0xC7, 0x80, 0xE0, 0x0F, 0xC0,
+ 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07,
+ 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x03, 0xFC,
+ 0x0F, 0xFC, 0x3F, 0x7F, 0xEE, 0xFF, 0x9C, 0x7E, 0x38, 0x70, 0x03, 0xB8,
+ 0x03, 0x9C, 0x01, 0xC7, 0x00, 0xE3, 0x80, 0xE1, 0xC0, 0x70, 0x70, 0x38,
+ 0x38, 0x38, 0x1C, 0x1C, 0x07, 0x0E, 0x03, 0x8E, 0x01, 0xC7, 0x00, 0x77,
+ 0x00, 0x3B, 0x80, 0x1D, 0xC0, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00,
+ 0x70, 0x00, 0xF0, 0x1C, 0x03, 0xB8, 0x1F, 0x03, 0xDC, 0x0F, 0x81, 0xCE,
+ 0x07, 0xC0, 0xE7, 0x83, 0xE0, 0x71, 0xC3, 0xB8, 0x70, 0xE1, 0xDC, 0x38,
+ 0x70, 0xEE, 0x1C, 0x1C, 0x63, 0x0E, 0x0E, 0x71, 0xCE, 0x07, 0x38, 0xE7,
+ 0x03, 0x9C, 0x73, 0x80, 0xEC, 0x19, 0x80, 0x7E, 0x0F, 0xC0, 0x3F, 0x07,
+ 0xE0, 0x0F, 0x83, 0xF0, 0x07, 0x80, 0xF0, 0x03, 0xC0, 0x78, 0x01, 0xE0,
+ 0x3C, 0x00, 0x70, 0x07, 0x38, 0x0E, 0x3C, 0x1C, 0x1C, 0x1C, 0x0E, 0x38,
+ 0x0F, 0x70, 0x07, 0x70, 0x03, 0xE0, 0x03, 0xC0, 0x01, 0xC0, 0x03, 0xE0,
+ 0x07, 0xE0, 0x07, 0x70, 0x0E, 0x78, 0x1E, 0x38, 0x1C, 0x1C, 0x38, 0x1E,
+ 0x78, 0x0E, 0x70, 0x07, 0x70, 0x07, 0x38, 0x03, 0x9C, 0x01, 0xC7, 0x01,
+ 0xC3, 0x80, 0xE1, 0xC0, 0x70, 0x70, 0x70, 0x38, 0x38, 0x1C, 0x3C, 0x07,
+ 0x1C, 0x03, 0x8E, 0x01, 0xCE, 0x00, 0x77, 0x00, 0x3B, 0x80, 0x1F, 0x80,
+ 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x38,
+ 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x0F,
+ 0x00, 0x00, 0x7F, 0xFC, 0xFF, 0xF9, 0xFF, 0xF0, 0x00, 0xE0, 0x03, 0x80,
+ 0x0E, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x1C, 0x00, 0x70,
+ 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xF8, 0x07, 0x0F, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
+ 0x1C, 0x1C, 0x1C, 0x1C, 0x38, 0xF8, 0xE0, 0xF8, 0x38, 0x1C, 0x1C, 0x1C,
+ 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x0F, 0x07, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xE0, 0xF0, 0xF8, 0x38,
+ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x1C, 0x1F,
+ 0x07, 0x1F, 0x1C, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38,
+ 0x38, 0x38, 0xF8, 0xF0, 0xE0, 0x38, 0x00, 0xFC, 0x03, 0xFC, 0x1F, 0x3E,
+ 0x3C, 0x1F, 0xE0, 0x1F, 0x80, 0x1E, 0x00 };
+
+const GFXglyph FreeSans18pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 9, 0, 1 }, // 0x20 ' '
+ { 0, 3, 26, 12, 4, -25 }, // 0x21 '!'
+ { 10, 9, 9, 12, 1, -24 }, // 0x22 '"'
+ { 21, 19, 24, 19, 0, -23 }, // 0x23 '#'
+ { 78, 16, 30, 19, 2, -26 }, // 0x24 '$'
+ { 138, 29, 25, 31, 1, -24 }, // 0x25 '%'
+ { 229, 20, 25, 23, 2, -24 }, // 0x26 '&'
+ { 292, 3, 9, 7, 2, -24 }, // 0x27 '''
+ { 296, 8, 33, 12, 3, -25 }, // 0x28 '('
+ { 329, 8, 33, 12, 1, -25 }, // 0x29 ')'
+ { 362, 10, 10, 14, 2, -25 }, // 0x2A '*'
+ { 375, 16, 16, 20, 2, -15 }, // 0x2B '+'
+ { 407, 3, 9, 10, 3, -3 }, // 0x2C ','
+ { 411, 8, 3, 12, 2, -10 }, // 0x2D '-'
+ { 414, 3, 4, 9, 3, -3 }, // 0x2E '.'
+ { 416, 10, 26, 10, 0, -25 }, // 0x2F '/'
+ { 449, 16, 25, 19, 2, -24 }, // 0x30 '0'
+ { 499, 8, 25, 19, 4, -24 }, // 0x31 '1'
+ { 524, 16, 25, 19, 2, -24 }, // 0x32 '2'
+ { 574, 17, 25, 19, 1, -24 }, // 0x33 '3'
+ { 628, 16, 25, 19, 1, -24 }, // 0x34 '4'
+ { 678, 17, 25, 19, 1, -24 }, // 0x35 '5'
+ { 732, 16, 25, 19, 2, -24 }, // 0x36 '6'
+ { 782, 16, 25, 19, 2, -24 }, // 0x37 '7'
+ { 832, 17, 25, 19, 1, -24 }, // 0x38 '8'
+ { 886, 16, 25, 19, 1, -24 }, // 0x39 '9'
+ { 936, 3, 19, 9, 3, -18 }, // 0x3A ':'
+ { 944, 3, 24, 9, 3, -18 }, // 0x3B ';'
+ { 953, 17, 17, 20, 2, -16 }, // 0x3C '<'
+ { 990, 17, 9, 20, 2, -12 }, // 0x3D '='
+ { 1010, 17, 17, 20, 2, -16 }, // 0x3E '>'
+ { 1047, 15, 26, 19, 3, -25 }, // 0x3F '?'
+ { 1096, 32, 31, 36, 1, -25 }, // 0x40 '@'
+ { 1220, 22, 26, 23, 1, -25 }, // 0x41 'A'
+ { 1292, 19, 26, 23, 3, -25 }, // 0x42 'B'
+ { 1354, 22, 26, 25, 1, -25 }, // 0x43 'C'
+ { 1426, 20, 26, 24, 3, -25 }, // 0x44 'D'
+ { 1491, 18, 26, 22, 3, -25 }, // 0x45 'E'
+ { 1550, 17, 26, 21, 3, -25 }, // 0x46 'F'
+ { 1606, 24, 26, 27, 1, -25 }, // 0x47 'G'
+ { 1684, 19, 26, 25, 3, -25 }, // 0x48 'H'
+ { 1746, 3, 26, 10, 4, -25 }, // 0x49 'I'
+ { 1756, 14, 26, 18, 1, -25 }, // 0x4A 'J'
+ { 1802, 20, 26, 24, 3, -25 }, // 0x4B 'K'
+ { 1867, 15, 26, 20, 3, -25 }, // 0x4C 'L'
+ { 1916, 24, 26, 30, 3, -25 }, // 0x4D 'M'
+ { 1994, 20, 26, 26, 3, -25 }, // 0x4E 'N'
+ { 2059, 25, 26, 27, 1, -25 }, // 0x4F 'O'
+ { 2141, 18, 26, 23, 3, -25 }, // 0x50 'P'
+ { 2200, 25, 28, 27, 1, -25 }, // 0x51 'Q'
+ { 2288, 20, 26, 25, 3, -25 }, // 0x52 'R'
+ { 2353, 20, 26, 23, 1, -25 }, // 0x53 'S'
+ { 2418, 19, 26, 22, 1, -25 }, // 0x54 'T'
+ { 2480, 19, 26, 25, 3, -25 }, // 0x55 'U'
+ { 2542, 21, 26, 23, 1, -25 }, // 0x56 'V'
+ { 2611, 32, 26, 33, 0, -25 }, // 0x57 'W'
+ { 2715, 21, 26, 23, 1, -25 }, // 0x58 'X'
+ { 2784, 23, 26, 24, 0, -25 }, // 0x59 'Y'
+ { 2859, 19, 26, 22, 1, -25 }, // 0x5A 'Z'
+ { 2921, 6, 33, 10, 2, -25 }, // 0x5B '['
+ { 2946, 10, 26, 10, 0, -25 }, // 0x5C '\'
+ { 2979, 6, 33, 10, 1, -25 }, // 0x5D ']'
+ { 3004, 13, 13, 16, 2, -24 }, // 0x5E '^'
+ { 3026, 21, 2, 19, -1, 5 }, // 0x5F '_'
+ { 3032, 7, 5, 9, 1, -25 }, // 0x60 '`'
+ { 3037, 17, 19, 19, 1, -18 }, // 0x61 'a'
+ { 3078, 16, 26, 20, 2, -25 }, // 0x62 'b'
+ { 3130, 16, 19, 18, 1, -18 }, // 0x63 'c'
+ { 3168, 17, 26, 20, 1, -25 }, // 0x64 'd'
+ { 3224, 16, 19, 19, 1, -18 }, // 0x65 'e'
+ { 3262, 7, 26, 10, 1, -25 }, // 0x66 'f'
+ { 3285, 16, 27, 19, 1, -18 }, // 0x67 'g'
+ { 3339, 15, 26, 19, 2, -25 }, // 0x68 'h'
+ { 3388, 3, 26, 8, 2, -25 }, // 0x69 'i'
+ { 3398, 6, 34, 9, 0, -25 }, // 0x6A 'j'
+ { 3424, 16, 26, 18, 2, -25 }, // 0x6B 'k'
+ { 3476, 3, 26, 7, 2, -25 }, // 0x6C 'l'
+ { 3486, 24, 19, 28, 2, -18 }, // 0x6D 'm'
+ { 3543, 15, 19, 19, 2, -18 }, // 0x6E 'n'
+ { 3579, 17, 19, 19, 1, -18 }, // 0x6F 'o'
+ { 3620, 16, 25, 20, 2, -18 }, // 0x70 'p'
+ { 3670, 17, 25, 20, 1, -18 }, // 0x71 'q'
+ { 3724, 9, 19, 12, 2, -18 }, // 0x72 'r'
+ { 3746, 14, 19, 17, 2, -18 }, // 0x73 's'
+ { 3780, 7, 23, 10, 1, -22 }, // 0x74 't'
+ { 3801, 15, 19, 19, 2, -18 }, // 0x75 'u'
+ { 3837, 17, 19, 17, 0, -18 }, // 0x76 'v'
+ { 3878, 25, 19, 25, 0, -18 }, // 0x77 'w'
+ { 3938, 16, 19, 17, 0, -18 }, // 0x78 'x'
+ { 3976, 17, 27, 17, 0, -18 }, // 0x79 'y'
+ { 4034, 15, 19, 17, 1, -18 }, // 0x7A 'z'
+ { 4070, 8, 33, 12, 1, -25 }, // 0x7B '{'
+ { 4103, 2, 33, 9, 3, -25 }, // 0x7C '|'
+ { 4112, 8, 33, 12, 3, -25 }, // 0x7D '}'
+ { 4145, 15, 7, 18, 1, -15 } }; // 0x7E '~'
+
+const GFXfont FreeSans18pt7b PROGMEM = {
+ (uint8_t *)FreeSans18pt7bBitmaps,
+ (GFXglyph *)FreeSans18pt7bGlyphs,
+ 0x20, 0x7E, 42 };
+
+// Approx. 4831 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSans24pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSans24pt7b.h
new file mode 100644
index 000000000000..ff2d174fbd1a
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSans24pt7b.h
@@ -0,0 +1,727 @@
+const uint8_t FreeSans24pt7bBitmaps[] PROGMEM = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x76, 0x66,
+ 0x66, 0x00, 0x0F, 0xFF, 0xFF, 0xF1, 0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1F,
+ 0xE3, 0xFC, 0x7F, 0x8F, 0xF1, 0xEC, 0x19, 0x83, 0x30, 0x60, 0x00, 0x70,
+ 0x3C, 0x00, 0x70, 0x3C, 0x00, 0xF0, 0x38, 0x00, 0xF0, 0x38, 0x00, 0xF0,
+ 0x78, 0x00, 0xE0, 0x78, 0x00, 0xE0, 0x78, 0x01, 0xE0, 0x70, 0x01, 0xE0,
+ 0x70, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x03, 0xC0,
+ 0xE0, 0x03, 0xC0, 0xE0, 0x03, 0xC0, 0xE0, 0x03, 0x81, 0xE0, 0x03, 0x81,
+ 0xE0, 0x03, 0x81, 0xE0, 0x07, 0x81, 0xC0, 0x07, 0x81, 0xC0, 0xFF, 0xFF,
+ 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0x0F, 0x03, 0x80, 0x0F, 0x03,
+ 0x80, 0x0F, 0x07, 0x80, 0x0E, 0x07, 0x80, 0x0E, 0x07, 0x80, 0x1E, 0x07,
+ 0x00, 0x1E, 0x07, 0x00, 0x1E, 0x07, 0x00, 0x1C, 0x0F, 0x00, 0x1C, 0x0F,
+ 0x00, 0x00, 0x38, 0x00, 0x01, 0xFC, 0x00, 0x1F, 0xFE, 0x00, 0x7F, 0xFE,
+ 0x01, 0xFF, 0xFE, 0x07, 0xE7, 0x3E, 0x0F, 0x8E, 0x3C, 0x3E, 0x1C, 0x3C,
+ 0x78, 0x38, 0x38, 0xF0, 0x70, 0x71, 0xE0, 0xE0, 0xE3, 0xC1, 0xC0, 0x07,
+ 0x83, 0x80, 0x0F, 0x87, 0x00, 0x0F, 0x8E, 0x00, 0x1F, 0xDC, 0x00, 0x1F,
+ 0xF8, 0x00, 0x1F, 0xFF, 0x00, 0x0F, 0xFF, 0x80, 0x07, 0xFF, 0x80, 0x03,
+ 0xFF, 0x80, 0x07, 0x1F, 0x80, 0x0E, 0x1F, 0x00, 0x1C, 0x1F, 0x00, 0x38,
+ 0x1F, 0xC0, 0x70, 0x3F, 0x80, 0xE0, 0x7F, 0x81, 0xC0, 0xFF, 0x03, 0x81,
+ 0xEF, 0x07, 0x07, 0x9F, 0x0E, 0x0F, 0x3E, 0x1C, 0x3E, 0x3F, 0x39, 0xF8,
+ 0x3F, 0xFF, 0xE0, 0x3F, 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x03, 0x80, 0x00,
+ 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00,
+ 0x00, 0x00, 0x1C, 0x00, 0x0F, 0xC0, 0x00, 0x78, 0x00, 0x3F, 0xE0, 0x00,
+ 0xE0, 0x01, 0xFF, 0xE0, 0x03, 0x80, 0x03, 0xFF, 0xE0, 0x07, 0x00, 0x0F,
+ 0x87, 0xC0, 0x1C, 0x00, 0x3C, 0x03, 0xC0, 0x38, 0x00, 0x70, 0x03, 0x80,
+ 0xE0, 0x00, 0xE0, 0x07, 0x03, 0xC0, 0x01, 0xC0, 0x0E, 0x07, 0x00, 0x03,
+ 0x80, 0x1C, 0x1E, 0x00, 0x07, 0x80, 0x78, 0x38, 0x00, 0x07, 0xC3, 0xE0,
+ 0xF0, 0x00, 0x07, 0xFF, 0xC1, 0xC0, 0x00, 0x0F, 0xFF, 0x07, 0x80, 0x00,
+ 0x0F, 0xFC, 0x0E, 0x00, 0x00, 0x07, 0xE0, 0x38, 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x3F, 0x00, 0x00, 0x03, 0x80, 0xFF,
+ 0x80, 0x00, 0x0E, 0x07, 0xFF, 0x80, 0x00, 0x3C, 0x0F, 0xFF, 0x80, 0x00,
+ 0x70, 0x3E, 0x1F, 0x00, 0x01, 0xE0, 0xF0, 0x0F, 0x00, 0x03, 0x81, 0xC0,
+ 0x0E, 0x00, 0x0F, 0x03, 0x80, 0x1C, 0x00, 0x1C, 0x07, 0x00, 0x38, 0x00,
+ 0x78, 0x0E, 0x00, 0x70, 0x00, 0xE0, 0x1E, 0x01, 0xE0, 0x03, 0x80, 0x1F,
+ 0x0F, 0x80, 0x07, 0x00, 0x1F, 0xFF, 0x00, 0x1C, 0x00, 0x3F, 0xFC, 0x00,
+ 0x38, 0x00, 0x1F, 0xF0, 0x00, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7E, 0x00,
+ 0x00, 0x1F, 0xF0, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x7F, 0xFC, 0x00, 0x07,
+ 0xC3, 0xC0, 0x00, 0xF8, 0x1E, 0x00, 0x0F, 0x00, 0xE0, 0x00, 0xF0, 0x0E,
+ 0x00, 0x0F, 0x00, 0xE0, 0x00, 0xF0, 0x0E, 0x00, 0x07, 0x81, 0xE0, 0x00,
+ 0x7C, 0x3C, 0x00, 0x03, 0xEF, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x01, 0xFE,
+ 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0xE0, 0x00,
+ 0x1F, 0x1E, 0x07, 0x83, 0xE0, 0xF0, 0x78, 0x7C, 0x0F, 0x8F, 0x87, 0x80,
+ 0x7C, 0xF0, 0xF0, 0x03, 0xFF, 0x0F, 0x00, 0x1F, 0xE0, 0xF0, 0x00, 0xFE,
+ 0x0F, 0x00, 0x0F, 0xC0, 0xF0, 0x00, 0x7E, 0x0F, 0x80, 0x0F, 0xF0, 0x7C,
+ 0x01, 0xFF, 0x07, 0xF0, 0x7D, 0xF8, 0x3F, 0xFF, 0x8F, 0xC1, 0xFF, 0xF0,
+ 0x7E, 0x0F, 0xFE, 0x03, 0xE0, 0x3F, 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xF6, 0x66, 0x01, 0xC0, 0x70, 0x38, 0x1C, 0x07, 0x03, 0xC0, 0xE0, 0x78,
+ 0x1C, 0x07, 0x03, 0xC0, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x70, 0x3C,
+ 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03,
+ 0xC0, 0x70, 0x1E, 0x07, 0x81, 0xE0, 0x38, 0x0F, 0x03, 0xC0, 0x70, 0x1E,
+ 0x03, 0x80, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x18, 0x07, 0xE0, 0x38, 0x07,
+ 0x01, 0xC0, 0x38, 0x0F, 0x01, 0xC0, 0x78, 0x0E, 0x03, 0x80, 0xF0, 0x1C,
+ 0x07, 0x01, 0xE0, 0x78, 0x1E, 0x03, 0x80, 0xF0, 0x3C, 0x0F, 0x03, 0xC0,
+ 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x07, 0x81, 0xE0, 0x78,
+ 0x1E, 0x07, 0x03, 0xC0, 0xF0, 0x38, 0x1E, 0x07, 0x01, 0xC0, 0xE0, 0x38,
+ 0x1C, 0x06, 0x03, 0x80, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x63,
+ 0x1B, 0xFF, 0xFF, 0xFF, 0xC3, 0xF0, 0x07, 0x80, 0x3F, 0x01, 0xCE, 0x07,
+ 0x3C, 0x38, 0x70, 0x21, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00,
+ 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, 0x0E,
+ 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x07, 0x00, 0x00, 0x0E, 0x00,
+ 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00,
+ 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xF3,
+ 0x33, 0x36, 0xEC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF0,
+ 0x00, 0x38, 0x01, 0xC0, 0x0C, 0x00, 0xE0, 0x07, 0x00, 0x30, 0x03, 0x80,
+ 0x1C, 0x00, 0xC0, 0x06, 0x00, 0x70, 0x03, 0x80, 0x18, 0x01, 0xC0, 0x0E,
+ 0x00, 0x60, 0x03, 0x00, 0x38, 0x01, 0x80, 0x0C, 0x00, 0xE0, 0x07, 0x00,
+ 0x30, 0x03, 0x80, 0x1C, 0x00, 0xC0, 0x06, 0x00, 0x70, 0x03, 0x80, 0x18,
+ 0x01, 0xC0, 0x0E, 0x00, 0x60, 0x07, 0x00, 0x38, 0x00, 0x00, 0xFC, 0x00,
+ 0x0F, 0xFC, 0x00, 0xFF, 0xFC, 0x07, 0xFF, 0xF8, 0x1F, 0x87, 0xE0, 0xF8,
+ 0x07, 0xC3, 0xC0, 0x0F, 0x1F, 0x00, 0x3E, 0x78, 0x00, 0x79, 0xE0, 0x01,
+ 0xE7, 0x80, 0x07, 0xBC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF,
+ 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00,
+ 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03,
+ 0xDE, 0x00, 0x1E, 0x78, 0x00, 0x79, 0xE0, 0x01, 0xE7, 0xC0, 0x0F, 0x8F,
+ 0x00, 0x3C, 0x3E, 0x01, 0xF0, 0x7C, 0x1F, 0x81, 0xFF, 0xFE, 0x03, 0xFF,
+ 0xF0, 0x03, 0xFF, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x60, 0x1C, 0x03, 0x80,
+ 0xF0, 0x3E, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x3C, 0x07, 0x80, 0xF0,
+ 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E,
+ 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03,
+ 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x01, 0xFE, 0x00, 0x1F, 0xFE, 0x01, 0xFF,
+ 0xFE, 0x0F, 0xFF, 0xFC, 0x3F, 0x03, 0xF9, 0xF0, 0x03, 0xE7, 0x80, 0x07,
+ 0xFE, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xC0,
+ 0x00, 0x0F, 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00,
+ 0x7C, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x80, 0x07, 0xF8, 0x00, 0x3F, 0xC0,
+ 0x03, 0xFC, 0x00, 0x1F, 0xC0, 0x00, 0xFC, 0x00, 0x07, 0xC0, 0x00, 0x3E,
+ 0x00, 0x00, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x70, 0x00,
+ 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
+ 0x00, 0xFE, 0x00, 0x0F, 0xFF, 0x80, 0x3F, 0xFF, 0x80, 0xFF, 0xFF, 0x83,
+ 0xF0, 0x1F, 0x87, 0xC0, 0x1F, 0x1F, 0x00, 0x1F, 0x3C, 0x00, 0x1E, 0x78,
+ 0x00, 0x3C, 0xF0, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00,
+ 0x07, 0x80, 0x00, 0x7F, 0x00, 0x1F, 0xFC, 0x00, 0x3F, 0xE0, 0x00, 0x7F,
+ 0xE0, 0x00, 0xFF, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x03,
+ 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0xF0, 0x00, 0x1F,
+ 0xE0, 0x00, 0x3F, 0xE0, 0x00, 0xFB, 0xC0, 0x01, 0xE7, 0xC0, 0x07, 0xC7,
+ 0xE0, 0x3F, 0x0F, 0xFF, 0xFE, 0x0F, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x03,
+ 0xFC, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x1F, 0x00, 0x00,
+ 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x3F,
+ 0xE0, 0x00, 0x7B, 0xC0, 0x01, 0xE7, 0x80, 0x07, 0x8F, 0x00, 0x0F, 0x1E,
+ 0x00, 0x3C, 0x3C, 0x00, 0xF0, 0x78, 0x03, 0xC0, 0xF0, 0x07, 0x81, 0xE0,
+ 0x1E, 0x03, 0xC0, 0x78, 0x07, 0x81, 0xE0, 0x0F, 0x03, 0xC0, 0x1E, 0x0F,
+ 0x00, 0x3C, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFE, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00,
+ 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x03,
+ 0xC0, 0x1F, 0xFF, 0xF0, 0x7F, 0xFF, 0xC1, 0xFF, 0xFF, 0x07, 0xFF, 0xFC,
+ 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C,
+ 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x1F, 0x3F, 0x80, 0x7B, 0xFF,
+ 0x81, 0xFF, 0xFF, 0x07, 0xFF, 0xFE, 0x1F, 0x80, 0xFC, 0x78, 0x01, 0xF8,
+ 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00,
+ 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3F, 0xC0, 0x00,
+ 0xFF, 0x80, 0x07, 0x9E, 0x00, 0x1E, 0x7C, 0x00, 0xF1, 0xFC, 0x0F, 0xC3,
+ 0xFF, 0xFE, 0x07, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, 0x07, 0xF0, 0x00, 0x00,
+ 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x7F, 0xFC, 0x03, 0xFF, 0xF8, 0x1F, 0x83,
+ 0xF0, 0xF8, 0x07, 0xC3, 0xC0, 0x0F, 0x8F, 0x00, 0x1E, 0x78, 0x00, 0x79,
+ 0xE0, 0x00, 0x07, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0, 0xFE, 0x03, 0xCF,
+ 0xFE, 0x0F, 0x7F, 0xFE, 0x3F, 0xFF, 0xFC, 0xFF, 0x03, 0xF3, 0xF0, 0x03,
+ 0xEF, 0x80, 0x07, 0xBE, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF,
+ 0x00, 0x03, 0xFC, 0x00, 0x0F, 0x70, 0x00, 0x3D, 0xC0, 0x00, 0xF7, 0x80,
+ 0x07, 0x9F, 0x00, 0x3E, 0x3E, 0x00, 0xF8, 0xFC, 0x0F, 0xC1, 0xFF, 0xFE,
+ 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0x80, 0x07, 0xF8, 0x00, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0x00, 0x00,
+ 0x78, 0x00, 0x07, 0x80, 0x00, 0x38, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00,
+ 0x01, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x70,
+ 0x00, 0x07, 0x80, 0x00, 0x38, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x01,
+ 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x38, 0x00,
+ 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78,
+ 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00,
+ 0x01, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0xFF, 0xFC, 0x07, 0xFF, 0xF8, 0x3F,
+ 0x03, 0xF1, 0xF0, 0x03, 0xC7, 0xC0, 0x0F, 0x9E, 0x00, 0x1E, 0x78, 0x00,
+ 0x79, 0xE0, 0x01, 0xE7, 0x80, 0x0F, 0x8F, 0x00, 0x3C, 0x3F, 0x03, 0xF0,
+ 0x7F, 0xFF, 0x80, 0x7F, 0xF8, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0xFC,
+ 0x0F, 0xC7, 0xC0, 0x0F, 0x9E, 0x00, 0x1E, 0xF8, 0x00, 0x7F, 0xC0, 0x00,
+ 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF,
+ 0x80, 0x07, 0xDE, 0x00, 0x1E, 0x7C, 0x00, 0xF8, 0xFC, 0x0F, 0xC3, 0xFF,
+ 0xFF, 0x07, 0xFF, 0xF8, 0x07, 0xFF, 0x80, 0x07, 0xF8, 0x00, 0x01, 0xFC,
+ 0x00, 0x3F, 0xF8, 0x03, 0xFF, 0xE0, 0x3F, 0xFF, 0x83, 0xF0, 0x7E, 0x3E,
+ 0x00, 0xF1, 0xE0, 0x07, 0xCF, 0x00, 0x1E, 0xF0, 0x00, 0x77, 0x80, 0x03,
+ 0xBC, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xE0,
+ 0x03, 0xEF, 0x00, 0x1F, 0x7C, 0x01, 0xF9, 0xF8, 0x3F, 0xCF, 0xFF, 0xFE,
+ 0x3F, 0xFE, 0xF0, 0xFF, 0xE7, 0x80, 0xFC, 0x3C, 0x00, 0x01, 0xE0, 0x00,
+ 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x9E, 0x00, 0x3C, 0xF0, 0x03, 0xC7,
+ 0xC0, 0x3E, 0x1F, 0x03, 0xE0, 0xFF, 0xFE, 0x03, 0xFF, 0xE0, 0x0F, 0xFE,
+ 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF3, 0x33, 0x36, 0xEC, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1C, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0xC0,
+ 0x03, 0xFC, 0x00, 0x3F, 0xE0, 0x01, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF,
+ 0x80, 0x03, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xF0,
+ 0x00, 0x07, 0xFC, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F,
+ 0xC0, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x01,
+ 0xC0, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xF0, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x07,
+ 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0x00,
+ 0x3F, 0xC0, 0x00, 0x1F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xF8, 0x00,
+ 0x01, 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0xC0, 0x03, 0xFC, 0x00, 0x1F,
+ 0xE0, 0x01, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x80, 0x07, 0xFC, 0x00,
+ 0x0F, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0xF8,
+ 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x7E, 0x0F, 0xE7, 0x80,
+ 0x3E, 0x78, 0x01, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0,
+ 0x00, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0,
+ 0x00, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80,
+ 0x01, 0xF0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0,
+ 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01,
+ 0xE0, 0x00, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xC0,
+ 0x00, 0x00, 0x3F, 0xFF, 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x00,
+ 0x07, 0xFC, 0x03, 0xFF, 0x00, 0x01, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x7E,
+ 0x00, 0x00, 0x7F, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xF0, 0x07, 0xC0, 0x00,
+ 0x00, 0x3F, 0x01, 0xF0, 0x00, 0x00, 0x03, 0xF0, 0x3C, 0x00, 0x7E, 0x00,
+ 0x3E, 0x0F, 0x00, 0x3F, 0xE3, 0xC3, 0xE3, 0xE0, 0x1F, 0xFE, 0x78, 0x3C,
+ 0x78, 0x07, 0xE1, 0xFF, 0x07, 0xDF, 0x01, 0xF0, 0x1F, 0xC0, 0xFB, 0xC0,
+ 0x7C, 0x01, 0xF8, 0x0F, 0x78, 0x0F, 0x00, 0x3F, 0x01, 0xEF, 0x03, 0xC0,
+ 0x07, 0xC0, 0x3F, 0xC0, 0x78, 0x00, 0xF8, 0x07, 0xF8, 0x0F, 0x00, 0x1F,
+ 0x00, 0xFF, 0x03, 0xC0, 0x03, 0xC0, 0x1F, 0xE0, 0x78, 0x00, 0x78, 0x07,
+ 0xFC, 0x0F, 0x00, 0x1F, 0x00, 0xF7, 0x81, 0xE0, 0x03, 0xC0, 0x1E, 0xF0,
+ 0x3C, 0x00, 0x78, 0x07, 0x9E, 0x07, 0x80, 0x1F, 0x01, 0xF3, 0xE0, 0xF8,
+ 0x07, 0xC0, 0x3C, 0x3C, 0x0F, 0x81, 0xF8, 0x0F, 0x87, 0x81, 0xF8, 0x7F,
+ 0x87, 0xE0, 0xF8, 0x1F, 0xFE, 0xFF, 0xF8, 0x0F, 0x01, 0xFF, 0x1F, 0xFC,
+ 0x01, 0xF0, 0x0F, 0x80, 0xFE, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8,
+ 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00,
+ 0x7C, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xFF, 0xF8,
+ 0x00, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00,
+ 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00,
+ 0x07, 0xF8, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0xF7, 0xC0, 0x00, 0x03,
+ 0xDF, 0x00, 0x00, 0x1F, 0x3C, 0x00, 0x00, 0x78, 0xF8, 0x00, 0x01, 0xE3,
+ 0xE0, 0x00, 0x0F, 0x87, 0x80, 0x00, 0x3C, 0x1F, 0x00, 0x01, 0xF0, 0x7C,
+ 0x00, 0x07, 0x80, 0xF0, 0x00, 0x1E, 0x03, 0xE0, 0x00, 0xF8, 0x0F, 0x80,
+ 0x03, 0xC0, 0x1E, 0x00, 0x0F, 0x00, 0x7C, 0x00, 0x7C, 0x01, 0xF0, 0x01,
+ 0xE0, 0x03, 0xC0, 0x07, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFE, 0x00, 0xFF,
+ 0xFF, 0xFC, 0x07, 0xFF, 0xFF, 0xF0, 0x1F, 0x00, 0x07, 0xC0, 0x78, 0x00,
+ 0x0F, 0x83, 0xE0, 0x00, 0x3E, 0x0F, 0x80, 0x00, 0xF8, 0x3C, 0x00, 0x01,
+ 0xF1, 0xF0, 0x00, 0x07, 0xC7, 0xC0, 0x00, 0x1F, 0x1E, 0x00, 0x00, 0x3E,
+ 0xF8, 0x00, 0x00, 0xFB, 0xE0, 0x00, 0x01, 0xE0, 0xFF, 0xFF, 0x80, 0x7F,
+ 0xFF, 0xF0, 0x3F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0x0F, 0x00, 0x0F, 0xC7,
+ 0x80, 0x01, 0xE3, 0xC0, 0x00, 0xF9, 0xE0, 0x00, 0x3C, 0xF0, 0x00, 0x1E,
+ 0x78, 0x00, 0x0F, 0x3C, 0x00, 0x07, 0x9E, 0x00, 0x07, 0x8F, 0x00, 0x03,
+ 0xC7, 0x80, 0x07, 0xC3, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF,
+ 0xF8, 0x7F, 0xFF, 0xFE, 0x3C, 0x00, 0x0F, 0x9E, 0x00, 0x03, 0xEF, 0x00,
+ 0x00, 0xF7, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0,
+ 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x01, 0xFF,
+ 0x00, 0x01, 0xF7, 0x80, 0x01, 0xFB, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF8,
+ 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xF0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x07,
+ 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0xFE, 0x01,
+ 0xF8, 0x07, 0xC0, 0x03, 0xE0, 0x7C, 0x00, 0x0F, 0x87, 0xC0, 0x00, 0x3C,
+ 0x3C, 0x00, 0x01, 0xE3, 0xE0, 0x00, 0x07, 0x9E, 0x00, 0x00, 0x3C, 0xF0,
+ 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x78, 0x00, 0x00, 0x03, 0xC0, 0x00,
+ 0x00, 0x1E, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00,
+ 0x3C, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x78,
+ 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0F, 0x78, 0x00,
+ 0x00, 0x7B, 0xC0, 0x00, 0x07, 0xDF, 0x00, 0x00, 0x3C, 0x78, 0x00, 0x01,
+ 0xE3, 0xE0, 0x00, 0x1F, 0x0F, 0x80, 0x01, 0xF0, 0x3E, 0x00, 0x1F, 0x81,
+ 0xFE, 0x03, 0xF8, 0x07, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xF8, 0x00, 0x3F,
+ 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xFE,
+ 0x03, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xFE, 0x0F, 0x00, 0x0F, 0xE1, 0xE0,
+ 0x00, 0x7E, 0x3C, 0x00, 0x07, 0xE7, 0x80, 0x00, 0x7C, 0xF0, 0x00, 0x07,
+ 0xDE, 0x00, 0x00, 0x7B, 0xC0, 0x00, 0x0F, 0x78, 0x00, 0x01, 0xEF, 0x00,
+ 0x00, 0x1F, 0xE0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x0F,
+ 0xF0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x07, 0xF8, 0x00,
+ 0x00, 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xF7,
+ 0x80, 0x00, 0x1E, 0xF0, 0x00, 0x03, 0xDE, 0x00, 0x00, 0xFB, 0xC0, 0x00,
+ 0x3E, 0x78, 0x00, 0x0F, 0xCF, 0x00, 0x03, 0xF1, 0xE0, 0x01, 0xFC, 0x3F,
+ 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xF0,
+ 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF,
+ 0xFE, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00,
+ 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00,
+ 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xFF, 0xFF,
+ 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xF0, 0x00,
+ 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00,
+ 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00,
+ 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F,
+ 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00,
+ 0x00, 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00,
+ 0x3F, 0xFF, 0xFC, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0x3C,
+ 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00,
+ 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x00,
+ 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0,
+ 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0xFF, 0xFE,
+ 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xFF, 0x00, 0x7F, 0x80, 0x7F,
+ 0x01, 0xF8, 0x00, 0x3F, 0x07, 0xE0, 0x00, 0x1F, 0x0F, 0x80, 0x00, 0x1E,
+ 0x3E, 0x00, 0x00, 0x3E, 0x78, 0x00, 0x00, 0x3D, 0xF0, 0x00, 0x00, 0x03,
+ 0xC0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3C,
+ 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0xE0,
+ 0x00, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFF, 0x00,
+ 0x07, 0xFF, 0xFE, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x07, 0xBC, 0x00,
+ 0x00, 0x0F, 0x78, 0x00, 0x00, 0x1E, 0xF8, 0x00, 0x00, 0x7D, 0xF0, 0x00,
+ 0x00, 0xF9, 0xF0, 0x00, 0x03, 0xF3, 0xF0, 0x00, 0x07, 0xE3, 0xF0, 0x00,
+ 0x1F, 0xC3, 0xF0, 0x00, 0xFF, 0x83, 0xFC, 0x07, 0xEF, 0x03, 0xFF, 0xFF,
+ 0x9E, 0x03, 0xFF, 0xFE, 0x1C, 0x01, 0xFF, 0xF0, 0x38, 0x00, 0x7F, 0x80,
+ 0x00, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0,
+ 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F,
+ 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00,
+ 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00,
+ 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00,
+ 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00,
+ 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC,
+ 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03,
+ 0xFC, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0xE0,
+ 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0,
+ 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80,
+ 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00,
+ 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00,
+ 0x03, 0xC0, 0x00, 0x7F, 0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xC0,
+ 0x07, 0xF8, 0x01, 0xFF, 0x80, 0x3E, 0xF0, 0x0F, 0x9F, 0x83, 0xF1, 0xFF,
+ 0xFC, 0x3F, 0xFF, 0x01, 0xFF, 0xC0, 0x0F, 0xE0, 0x00, 0xF0, 0x00, 0x07,
+ 0xDE, 0x00, 0x01, 0xF3, 0xC0, 0x00, 0x7C, 0x78, 0x00, 0x1F, 0x0F, 0x00,
+ 0x07, 0xC1, 0xE0, 0x01, 0xF0, 0x3C, 0x00, 0x7C, 0x07, 0x80, 0x1F, 0x00,
+ 0xF0, 0x07, 0xC0, 0x1E, 0x01, 0xF0, 0x03, 0xC0, 0x7C, 0x00, 0x78, 0x1F,
+ 0x00, 0x0F, 0x07, 0xC0, 0x01, 0xE1, 0xF0, 0x00, 0x3C, 0x7E, 0x00, 0x07,
+ 0x9F, 0xE0, 0x00, 0xF7, 0xFE, 0x00, 0x1F, 0xF7, 0xC0, 0x03, 0xFC, 0x7C,
+ 0x00, 0x7F, 0x07, 0xC0, 0x0F, 0xC0, 0xF8, 0x01, 0xF0, 0x0F, 0x80, 0x3C,
+ 0x00, 0xF8, 0x07, 0x80, 0x1F, 0x80, 0xF0, 0x01, 0xF0, 0x1E, 0x00, 0x1F,
+ 0x03, 0xC0, 0x03, 0xF0, 0x78, 0x00, 0x3E, 0x0F, 0x00, 0x03, 0xE1, 0xE0,
+ 0x00, 0x3E, 0x3C, 0x00, 0x07, 0xC7, 0x80, 0x00, 0x7C, 0xF0, 0x00, 0x07,
+ 0xDE, 0x00, 0x00, 0xFC, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01,
+ 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00,
+ 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F,
+ 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00,
+ 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78,
+ 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00,
+ 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFC, 0x00,
+ 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x7F, 0xFE, 0x00,
+ 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00,
+ 0x00, 0xFF, 0xF7, 0x00, 0x00, 0xEF, 0xF7, 0x80, 0x01, 0xEF, 0xF7, 0x80,
+ 0x01, 0xEF, 0xF3, 0xC0, 0x01, 0xCF, 0xF3, 0xC0, 0x03, 0xCF, 0xF3, 0xC0,
+ 0x03, 0xCF, 0xF1, 0xE0, 0x03, 0x8F, 0xF1, 0xE0, 0x07, 0x8F, 0xF1, 0xE0,
+ 0x07, 0x8F, 0xF0, 0xF0, 0x0F, 0x0F, 0xF0, 0xF0, 0x0F, 0x0F, 0xF0, 0xF0,
+ 0x0F, 0x0F, 0xF0, 0x78, 0x1E, 0x0F, 0xF0, 0x78, 0x1E, 0x0F, 0xF0, 0x78,
+ 0x1E, 0x0F, 0xF0, 0x3C, 0x3C, 0x0F, 0xF0, 0x3C, 0x3C, 0x0F, 0xF0, 0x3C,
+ 0x3C, 0x0F, 0xF0, 0x1E, 0x78, 0x0F, 0xF0, 0x1E, 0x78, 0x0F, 0xF0, 0x0E,
+ 0x78, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x07,
+ 0xF0, 0x0F, 0xF0, 0x07, 0xE0, 0x0F, 0xF0, 0x07, 0xE0, 0x0F, 0xF0, 0x03,
+ 0xE0, 0x0F, 0xF8, 0x00, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x3F,
+ 0xF8, 0x00, 0x0F, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0xFF, 0xF8, 0x00,
+ 0x3F, 0xDE, 0x00, 0x0F, 0xF7, 0xC0, 0x03, 0xFC, 0xF8, 0x00, 0xFF, 0x1E,
+ 0x00, 0x3F, 0xC7, 0xC0, 0x0F, 0xF0, 0xF0, 0x03, 0xFC, 0x3E, 0x00, 0xFF,
+ 0x07, 0xC0, 0x3F, 0xC0, 0xF0, 0x0F, 0xF0, 0x3E, 0x03, 0xFC, 0x07, 0xC0,
+ 0xFF, 0x00, 0xF0, 0x3F, 0xC0, 0x3E, 0x0F, 0xF0, 0x07, 0x83, 0xFC, 0x01,
+ 0xF0, 0xFF, 0x00, 0x3E, 0x3F, 0xC0, 0x07, 0x8F, 0xF0, 0x01, 0xF3, 0xFC,
+ 0x00, 0x3E, 0xFF, 0x00, 0x07, 0xBF, 0xC0, 0x01, 0xFF, 0xF0, 0x00, 0x3F,
+ 0xFC, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x3F, 0xF0, 0x00,
+ 0x0F, 0xFC, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x3F, 0xFF,
+ 0x80, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x7F, 0x80,
+ 0xFF, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x7E, 0x00, 0x03, 0xF0, 0x3E, 0x00,
+ 0x00, 0xF8, 0x3E, 0x00, 0x00, 0x3E, 0x1E, 0x00, 0x00, 0x0F, 0x1F, 0x00,
+ 0x00, 0x07, 0xCF, 0x00, 0x00, 0x01, 0xE7, 0x80, 0x00, 0x00, 0xF7, 0xC0,
+ 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x0F, 0xF0,
+ 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x01, 0xFE,
+ 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x3F,
+ 0xC0, 0x00, 0x00, 0x3E, 0xF0, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x0F,
+ 0x3E, 0x00, 0x00, 0x0F, 0x8F, 0x00, 0x00, 0x07, 0x87, 0xC0, 0x00, 0x07,
+ 0xC1, 0xF0, 0x00, 0x07, 0xC0, 0xFC, 0x00, 0x07, 0xE0, 0x3F, 0x00, 0x07,
+ 0xE0, 0x0F, 0xF0, 0x1F, 0xE0, 0x03, 0xFF, 0xFF, 0xE0, 0x00, 0xFF, 0xFF,
+ 0xE0, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
+ 0x80, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFC, 0xF0, 0x00,
+ 0xFE, 0xF0, 0x00, 0x3E, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x0F, 0xF0, 0x00,
+ 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00,
+ 0x0F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x3E, 0xF0, 0x00, 0xFE, 0xFF, 0xFF,
+ 0xFC, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xC0, 0xF0, 0x00,
+ 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00,
+ 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00,
+ 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00,
+ 0x00, 0xF0, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x3F, 0xFF, 0x80,
+ 0x00, 0x7F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x7F, 0x80, 0xFF,
+ 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x7E, 0x00, 0x03, 0xF0, 0x3E, 0x00, 0x00,
+ 0xF8, 0x3E, 0x00, 0x00, 0x3E, 0x1E, 0x00, 0x00, 0x0F, 0x1F, 0x00, 0x00,
+ 0x07, 0xCF, 0x00, 0x00, 0x01, 0xE7, 0x80, 0x00, 0x00, 0xF7, 0xC0, 0x00,
+ 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x0F, 0xF0, 0x00,
+ 0x00, 0x07, 0xF8, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x01, 0xFE, 0x00,
+ 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x3F, 0xC0,
+ 0x00, 0x00, 0x3E, 0xF0, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x0F, 0x3E,
+ 0x00, 0x00, 0x0F, 0x8F, 0x00, 0x03, 0x87, 0x87, 0xC0, 0x03, 0xE7, 0xC1,
+ 0xF0, 0x00, 0xFF, 0xC0, 0xFC, 0x00, 0x3F, 0xE0, 0x3F, 0x00, 0x0F, 0xE0,
+ 0x0F, 0xF0, 0x1F, 0xF0, 0x03, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xFF,
+ 0x00, 0x1F, 0xFF, 0xC7, 0xC0, 0x01, 0xFF, 0x01, 0xE0, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFE, 0x0F,
+ 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0xF0, 0x00, 0x3F, 0x3C, 0x00, 0x07,
+ 0xCF, 0x00, 0x00, 0xFB, 0xC0, 0x00, 0x1E, 0xF0, 0x00, 0x07, 0xBC, 0x00,
+ 0x01, 0xEF, 0x00, 0x00, 0x7B, 0xC0, 0x00, 0x1E, 0xF0, 0x00, 0x07, 0xBC,
+ 0x00, 0x03, 0xCF, 0x00, 0x01, 0xF3, 0xC0, 0x00, 0xF8, 0xFF, 0xFF, 0xFC,
+ 0x3F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0xF0, 0x00,
+ 0x3F, 0x3C, 0x00, 0x03, 0xCF, 0x00, 0x00, 0xFB, 0xC0, 0x00, 0x1E, 0xF0,
+ 0x00, 0x07, 0xBC, 0x00, 0x01, 0xEF, 0x00, 0x00, 0x7B, 0xC0, 0x00, 0x1E,
+ 0xF0, 0x00, 0x07, 0xBC, 0x00, 0x01, 0xEF, 0x00, 0x00, 0x7B, 0xC0, 0x00,
+ 0x1E, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x01, 0xF0, 0x00, 0x7F, 0xC0, 0x00,
+ 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x81, 0xF8, 0x07,
+ 0xF0, 0x7C, 0x00, 0x1F, 0x0F, 0x00, 0x01, 0xE3, 0xE0, 0x00, 0x3E, 0x78,
+ 0x00, 0x03, 0xCF, 0x00, 0x00, 0x79, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00,
+ 0x07, 0xC0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF,
+ 0xE0, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0xFF, 0xF8,
+ 0x00, 0x03, 0xFF, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x3F, 0x80, 0x00,
+ 0x01, 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x3F,
+ 0xC0, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xF7, 0x80, 0x00, 0x3E, 0xF8, 0x00,
+ 0x07, 0x9F, 0x80, 0x01, 0xF1, 0xFE, 0x01, 0xFC, 0x1F, 0xFF, 0xFF, 0x01,
+ 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
+ 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00,
+ 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78,
+ 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00,
+ 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00,
+ 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0,
+ 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01,
+ 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00,
+ 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80,
+ 0x00, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0,
+ 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F,
+ 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00,
+ 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00,
+ 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF,
+ 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00,
+ 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00,
+ 0x00, 0xFF, 0x00, 0x00, 0x7D, 0xE0, 0x00, 0x1E, 0x7C, 0x00, 0x0F, 0x9F,
+ 0x80, 0x07, 0xE3, 0xF8, 0x07, 0xF0, 0x7F, 0xFF, 0xF8, 0x0F, 0xFF, 0xFC,
+ 0x00, 0xFF, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0xF8, 0x00, 0x00, 0xF7, 0xC0,
+ 0x00, 0x0F, 0x9E, 0x00, 0x00, 0x7C, 0xF8, 0x00, 0x03, 0xC7, 0xC0, 0x00,
+ 0x3E, 0x1E, 0x00, 0x01, 0xF0, 0xF8, 0x00, 0x0F, 0x07, 0xC0, 0x00, 0xF8,
+ 0x1E, 0x00, 0x07, 0xC0, 0xF8, 0x00, 0x3C, 0x07, 0xC0, 0x03, 0xE0, 0x1E,
+ 0x00, 0x1F, 0x00, 0xF8, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x80, 0x1E, 0x00,
+ 0x7C, 0x00, 0xF8, 0x03, 0xC0, 0x03, 0xC0, 0x1E, 0x00, 0x1F, 0x01, 0xF0,
+ 0x00, 0xF8, 0x0F, 0x00, 0x03, 0xC0, 0x78, 0x00, 0x1F, 0x07, 0x80, 0x00,
+ 0xF8, 0x3C, 0x00, 0x03, 0xC1, 0xE0, 0x00, 0x1F, 0x1E, 0x00, 0x00, 0x78,
+ 0xF0, 0x00, 0x03, 0xC7, 0x80, 0x00, 0x1F, 0x78, 0x00, 0x00, 0x7B, 0xC0,
+ 0x00, 0x03, 0xDE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00,
+ 0x03, 0xF8, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8,
+ 0x00, 0x3F, 0x00, 0x07, 0xFE, 0x00, 0x0F, 0xC0, 0x01, 0xFF, 0x80, 0x03,
+ 0xF0, 0x00, 0x7D, 0xE0, 0x00, 0xFC, 0x00, 0x1E, 0x7C, 0x00, 0x7F, 0x80,
+ 0x0F, 0x9F, 0x00, 0x1F, 0xE0, 0x03, 0xE7, 0xC0, 0x07, 0xF8, 0x00, 0xF8,
+ 0xF0, 0x01, 0xFF, 0x00, 0x3C, 0x3E, 0x00, 0xF3, 0xC0, 0x1F, 0x0F, 0x80,
+ 0x3C, 0xF0, 0x07, 0xC3, 0xE0, 0x0F, 0x3C, 0x01, 0xF0, 0x78, 0x07, 0xC7,
+ 0x80, 0x78, 0x1F, 0x01, 0xE1, 0xE0, 0x1E, 0x07, 0xC0, 0x78, 0x78, 0x0F,
+ 0x80, 0xF0, 0x1E, 0x1E, 0x03, 0xE0, 0x3C, 0x0F, 0x83, 0xC0, 0xF0, 0x0F,
+ 0x83, 0xC0, 0xF0, 0x3C, 0x03, 0xE0, 0xF0, 0x3C, 0x1F, 0x00, 0x78, 0x3C,
+ 0x0F, 0x87, 0xC0, 0x1E, 0x1E, 0x01, 0xE1, 0xE0, 0x07, 0x87, 0x80, 0x78,
+ 0x78, 0x01, 0xF1, 0xE0, 0x1E, 0x1E, 0x00, 0x3C, 0xF8, 0x03, 0xCF, 0x80,
+ 0x0F, 0x3C, 0x00, 0xF3, 0xC0, 0x03, 0xCF, 0x00, 0x3C, 0xF0, 0x00, 0xFB,
+ 0xC0, 0x0F, 0xBC, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x07, 0xF8, 0x00,
+ 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x03, 0xF8,
+ 0x00, 0x0F, 0xC0, 0x00, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x00,
+ 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x01, 0xF0, 0x00, 0x7C, 0x00,
+ 0x01, 0xF3, 0xF0, 0x00, 0x1F, 0x8F, 0x80, 0x00, 0xF8, 0x3E, 0x00, 0x0F,
+ 0x80, 0xF8, 0x00, 0xF8, 0x07, 0xC0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x00,
+ 0x7C, 0x07, 0xC0, 0x03, 0xE0, 0x3E, 0x00, 0x0F, 0x83, 0xE0, 0x00, 0x3E,
+ 0x3E, 0x00, 0x01, 0xF1, 0xF0, 0x00, 0x07, 0xDF, 0x00, 0x00, 0x1F, 0xF0,
+ 0x00, 0x00, 0xFF, 0x80, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00,
+ 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x07,
+ 0xDF, 0x00, 0x00, 0x7C, 0x78, 0x00, 0x03, 0xE3, 0xE0, 0x00, 0x3E, 0x0F,
+ 0x80, 0x03, 0xE0, 0x3E, 0x00, 0x1F, 0x01, 0xF0, 0x01, 0xF0, 0x07, 0xC0,
+ 0x1F, 0x00, 0x3F, 0x00, 0xF8, 0x00, 0xF8, 0x0F, 0x80, 0x03, 0xE0, 0xF8,
+ 0x00, 0x1F, 0x8F, 0xC0, 0x00, 0x7C, 0x7C, 0x00, 0x01, 0xF7, 0xC0, 0x00,
+ 0x0F, 0xC0, 0xFC, 0x00, 0x00, 0xFD, 0xF0, 0x00, 0x03, 0xE7, 0xE0, 0x00,
+ 0x1F, 0x0F, 0x80, 0x00, 0x7C, 0x1F, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x1F,
+ 0x00, 0xF8, 0x00, 0x7C, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80,
+ 0x0F, 0x80, 0x7C, 0x00, 0x1E, 0x01, 0xE0, 0x00, 0x7C, 0x0F, 0x80, 0x00,
+ 0xF8, 0x7C, 0x00, 0x03, 0xE1, 0xE0, 0x00, 0x07, 0xCF, 0x80, 0x00, 0x0F,
+ 0x3C, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0xFC,
+ 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1E, 0x00,
+ 0x00, 0x00, 0x78, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00,
+ 0x00, 0x1E, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00,
+ 0x07, 0x80, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x01,
+ 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3F, 0xFF,
+ 0xFF, 0xC7, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xE0,
+ 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x01,
+ 0xF8, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xE0, 0x00,
+ 0x00, 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x01, 0xF0,
+ 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x07, 0xE0, 0x00, 0x01,
+ 0xF8, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xF0, 0x00,
+ 0x00, 0xFC, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0,
+ 0x00, 0x00, 0x7E, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00,
+ 0xF8, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0,
+ 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
+ 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
+ 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xE0, 0x07, 0x00, 0x18, 0x00, 0xE0, 0x07, 0x00, 0x18, 0x00, 0xE0,
+ 0x07, 0x00, 0x18, 0x00, 0xC0, 0x07, 0x00, 0x38, 0x00, 0xC0, 0x07, 0x00,
+ 0x38, 0x00, 0xC0, 0x06, 0x00, 0x38, 0x00, 0xC0, 0x06, 0x00, 0x38, 0x01,
+ 0xC0, 0x06, 0x00, 0x38, 0x01, 0xC0, 0x06, 0x00, 0x30, 0x01, 0xC0, 0x0E,
+ 0x00, 0x30, 0x01, 0xC0, 0x0E, 0x00, 0x30, 0x01, 0xC0, 0x0E, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
+ 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
+ 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
+ 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x3F,
+ 0x00, 0x0F, 0xC0, 0x07, 0xF8, 0x01, 0xCE, 0x00, 0x73, 0x80, 0x3C, 0x70,
+ 0x0E, 0x1C, 0x07, 0x87, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x38, 0x07, 0x0E,
+ 0x01, 0xC7, 0x80, 0x79, 0xC0, 0x0E, 0x70, 0x03, 0xB8, 0x00, 0x70, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F, 0x01, 0xE0, 0x3C, 0x07,
+ 0x00, 0xE0, 0x1C, 0x01, 0xFF, 0x00, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0xE0,
+ 0x3F, 0xFF, 0xF0, 0x7E, 0x03, 0xF8, 0x7C, 0x00, 0xF8, 0x78, 0x00, 0x78,
+ 0x00, 0x00, 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF8,
+ 0x00, 0x03, 0xF8, 0x00, 0xFF, 0xF8, 0x0F, 0xFF, 0xF8, 0x3F, 0xFE, 0x78,
+ 0x7F, 0x80, 0x78, 0xFC, 0x00, 0x78, 0xF8, 0x00, 0x78, 0xF0, 0x00, 0x78,
+ 0xF0, 0x00, 0xF8, 0xF0, 0x00, 0xF8, 0xF8, 0x03, 0xF8, 0x7E, 0x0F, 0xF8,
+ 0x7F, 0xFF, 0x7F, 0x3F, 0xFE, 0x3F, 0x1F, 0xFC, 0x3F, 0x07, 0xE0, 0x1F,
+ 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0,
+ 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0, 0x7E,
+ 0x03, 0xC7, 0xFE, 0x0F, 0x7F, 0xFC, 0x3D, 0xFF, 0xF8, 0xFF, 0x07, 0xF3,
+ 0xF8, 0x07, 0xCF, 0xC0, 0x0F, 0xBE, 0x00, 0x1E, 0xF8, 0x00, 0x7B, 0xE0,
+ 0x01, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00,
+ 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x01, 0xFF,
+ 0x80, 0x07, 0xBE, 0x00, 0x1E, 0xFC, 0x00, 0xFB, 0xF8, 0x07, 0xCF, 0xF0,
+ 0x7F, 0x3B, 0xFF, 0xF8, 0xE7, 0xFF, 0xC3, 0x8F, 0xFE, 0x00, 0x0F, 0xE0,
+ 0x00, 0x00, 0xFE, 0x00, 0x3F, 0xFC, 0x03, 0xFF, 0xF0, 0x3F, 0xFF, 0xC3,
+ 0xF0, 0x3F, 0x1F, 0x00, 0xF9, 0xF0, 0x03, 0xCF, 0x00, 0x0F, 0x78, 0x00,
+ 0x07, 0xC0, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78,
+ 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00,
+ 0x1E, 0x00, 0x1E, 0xF0, 0x00, 0xF7, 0xC0, 0x0F, 0x9F, 0x00, 0xF8, 0xFC,
+ 0x0F, 0xC3, 0xFF, 0xFC, 0x0F, 0xFF, 0xC0, 0x3F, 0xFC, 0x00, 0x7F, 0x00,
+ 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0,
+ 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x01,
+ 0xFC, 0x1E, 0x0F, 0xFE, 0x3C, 0x3F, 0xFF, 0x78, 0xFF, 0xFF, 0xF3, 0xF8,
+ 0x3F, 0xE7, 0xC0, 0x1F, 0xDF, 0x00, 0x1F, 0xBE, 0x00, 0x1F, 0x78, 0x00,
+ 0x3F, 0xF0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFF, 0x00, 0x01,
+ 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x1F,
+ 0xF0, 0x00, 0x7D, 0xE0, 0x00, 0xFB, 0xC0, 0x01, 0xF7, 0xC0, 0x07, 0xE7,
+ 0xC0, 0x1F, 0xCF, 0xE0, 0xFF, 0x8F, 0xFF, 0xF7, 0x0F, 0xFF, 0xCE, 0x0F,
+ 0xFF, 0x1C, 0x07, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0xFF,
+ 0xFC, 0x07, 0xFF, 0xF8, 0x1F, 0x83, 0xF0, 0xF8, 0x07, 0xC7, 0xC0, 0x0F,
+ 0x9E, 0x00, 0x1E, 0x78, 0x00, 0x7B, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC,
+ 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00,
+ 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x1E,
+ 0x7C, 0x00, 0x78, 0xF8, 0x03, 0xE3, 0xF0, 0x3F, 0x07, 0xFF, 0xF8, 0x0F,
+ 0xFF, 0xE0, 0x1F, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0x03, 0xC3, 0xF0, 0xFC,
+ 0x7F, 0x1F, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x3F, 0xFF, 0xFF, 0xFF, 0x1E,
+ 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81,
+ 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78,
+ 0x1E, 0x07, 0x80, 0x00, 0xFC, 0x00, 0x1F, 0xF8, 0xF0, 0xFF, 0xFB, 0xC7,
+ 0xFF, 0xFF, 0x3F, 0x83, 0xFC, 0xF8, 0x07, 0xF7, 0xC0, 0x0F, 0xDE, 0x00,
+ 0x1F, 0x78, 0x00, 0x7F, 0xE0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F,
+ 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0,
+ 0x00, 0x3F, 0xC0, 0x00, 0xF7, 0x80, 0x07, 0xDE, 0x00, 0x1F, 0x7C, 0x00,
+ 0xFC, 0xF8, 0x07, 0xF3, 0xF8, 0x3F, 0xC7, 0xFF, 0xEF, 0x0F, 0xFF, 0x3C,
+ 0x1F, 0xF8, 0xF0, 0x1F, 0x83, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x79, 0xE0,
+ 0x01, 0xE7, 0xC0, 0x0F, 0x8F, 0x80, 0xFC, 0x3F, 0xFF, 0xF0, 0x7F, 0xFF,
+ 0x80, 0xFF, 0xFC, 0x00, 0x7F, 0x80, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0,
+ 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80,
+ 0x00, 0xF0, 0xFE, 0x1E, 0x3F, 0xE3, 0xCF, 0xFF, 0x7B, 0xFF, 0xEF, 0xF0,
+ 0xFF, 0xF8, 0x07, 0xFF, 0x00, 0x7F, 0xC0, 0x0F, 0xF8, 0x01, 0xFE, 0x00,
+ 0x3F, 0xC0, 0x07, 0xF8, 0x00, 0xFF, 0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x00,
+ 0x7F, 0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xC0, 0x07, 0xF8, 0x00,
+ 0xFF, 0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x00, 0x7F, 0x80, 0x0F, 0xF0, 0x01,
+ 0xFE, 0x00, 0x3C, 0xFF, 0xFF, 0xF0, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F,
+ 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
+ 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
+ 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x1F,
+ 0xFF, 0xFE, 0xFE, 0xF8, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01,
+ 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00,
+ 0x00, 0xF0, 0x00, 0x07, 0x80, 0x1F, 0x3C, 0x01, 0xF1, 0xE0, 0x1F, 0x0F,
+ 0x01, 0xF0, 0x78, 0x1F, 0x03, 0xC1, 0xF0, 0x1E, 0x1F, 0x00, 0xF1, 0xF0,
+ 0x07, 0x9F, 0x00, 0x3D, 0xF8, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0x80, 0x7F,
+ 0x7C, 0x03, 0xF1, 0xF0, 0x1F, 0x07, 0xC0, 0xF0, 0x3E, 0x07, 0x80, 0xF8,
+ 0x3C, 0x03, 0xC1, 0xE0, 0x1F, 0x0F, 0x00, 0x7C, 0x78, 0x03, 0xE3, 0xC0,
+ 0x0F, 0x9E, 0x00, 0x3C, 0xF0, 0x01, 0xF7, 0x80, 0x07, 0xC0, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0x00, 0xFC, 0x03, 0xF0, 0xE3, 0xFE, 0x0F, 0xFC, 0xE7,
+ 0xFF, 0x1F, 0xFE, 0xEF, 0xFF, 0xBF, 0xFE, 0xFE, 0x0F, 0xF8, 0x3F, 0xFC,
+ 0x07, 0xF0, 0x1F, 0xF8, 0x03, 0xE0, 0x0F, 0xF8, 0x03, 0xE0, 0x0F, 0xF0,
+ 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0,
+ 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0,
+ 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0,
+ 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0,
+ 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0,
+ 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0x00,
+ 0x7E, 0x0E, 0x1F, 0xF8, 0xE7, 0xFF, 0xCE, 0xFF, 0xFE, 0xEF, 0x07, 0xFF,
+ 0xE0, 0x1F, 0xFC, 0x01, 0xFF, 0x80, 0x0F, 0xF8, 0x00, 0xFF, 0x00, 0x0F,
+ 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00,
+ 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00,
+ 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0,
+ 0x00, 0xFF, 0x00, 0x0F, 0x00, 0xFE, 0x00, 0x07, 0xFF, 0x00, 0x3F, 0xFF,
+ 0x80, 0xFF, 0xFF, 0x83, 0xF8, 0x3F, 0x87, 0xC0, 0x1F, 0x1F, 0x00, 0x1F,
+ 0x3C, 0x00, 0x1E, 0x78, 0x00, 0x3D, 0xF0, 0x00, 0x7F, 0xC0, 0x00, 0x7F,
+ 0x80, 0x00, 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8,
+ 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x7D, 0xE0, 0x00, 0xF3, 0xC0,
+ 0x01, 0xE7, 0xC0, 0x07, 0xC7, 0xC0, 0x1F, 0x0F, 0xE0, 0xFE, 0x0F, 0xFF,
+ 0xF8, 0x0F, 0xFF, 0xE0, 0x0F, 0xFF, 0x80, 0x03, 0xF8, 0x00, 0x00, 0xFE,
+ 0x03, 0x8F, 0xFE, 0x0E, 0x7F, 0xFC, 0x3B, 0xFF, 0xF8, 0xFF, 0x87, 0xF3,
+ 0xF8, 0x07, 0xCF, 0xC0, 0x0F, 0xBE, 0x00, 0x1E, 0xF8, 0x00, 0x7B, 0xE0,
+ 0x01, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00,
+ 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x01, 0xFF,
+ 0x80, 0x07, 0xBE, 0x00, 0x1E, 0xFC, 0x00, 0xFB, 0xF8, 0x07, 0xCF, 0xF0,
+ 0x7F, 0x3F, 0xFF, 0xF8, 0xF7, 0xFF, 0xC3, 0xC7, 0xFE, 0x0F, 0x07, 0xE0,
+ 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C,
+ 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00,
+ 0xFE, 0x00, 0x07, 0xFF, 0x1C, 0x3F, 0xFF, 0x38, 0xFF, 0xFF, 0x73, 0xF8,
+ 0x3F, 0xE7, 0xC0, 0x1F, 0xDF, 0x00, 0x1F, 0xBE, 0x00, 0x1F, 0x78, 0x00,
+ 0x3F, 0xF0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFF, 0x00, 0x01,
+ 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x1F,
+ 0xF0, 0x00, 0x7D, 0xE0, 0x00, 0xFB, 0xC0, 0x01, 0xF7, 0xC0, 0x07, 0xE7,
+ 0xC0, 0x1F, 0xCF, 0xE0, 0xFF, 0x8F, 0xFF, 0xEF, 0x0F, 0xFF, 0xDE, 0x0F,
+ 0xFE, 0x3C, 0x07, 0xF0, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00,
+ 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00,
+ 0x3C, 0x00, 0x00, 0x78, 0x00, 0xFE, 0x1F, 0xE7, 0xFE, 0xFF, 0xFF, 0x8F,
+ 0xC0, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F,
+ 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F,
+ 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0x01, 0xFC, 0x00, 0xFF, 0xF0,
+ 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x3E, 0x07, 0xE7, 0xC0, 0x3E, 0x78, 0x01,
+ 0xE7, 0x80, 0x00, 0x78, 0x00, 0x07, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xFC,
+ 0x00, 0x1F, 0xFC, 0x00, 0xFF, 0xF8, 0x03, 0xFF, 0xC0, 0x03, 0xFE, 0x00,
+ 0x03, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF,
+ 0x80, 0x1F, 0x7E, 0x07, 0xE7, 0xFF, 0xFE, 0x3F, 0xFF, 0xC1, 0xFF, 0xF0,
+ 0x03, 0xFC, 0x00, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x8F, 0xFF,
+ 0xFF, 0xFF, 0xC7, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E,
+ 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81,
+ 0xE0, 0x78, 0x1F, 0xC7, 0xF0, 0xFC, 0x1F, 0xF0, 0x00, 0xFF, 0x00, 0x0F,
+ 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00,
+ 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00,
+ 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0,
+ 0x00, 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x3F, 0xF8, 0x07, 0xFF,
+ 0xE0, 0xFF, 0x7F, 0xFF, 0x77, 0xFF, 0xE7, 0x1F, 0xFC, 0x70, 0x7E, 0x00,
+ 0x78, 0x00, 0x3E, 0xF0, 0x00, 0x79, 0xF0, 0x00, 0xF1, 0xE0, 0x03, 0xE3,
+ 0xC0, 0x07, 0x87, 0xC0, 0x0F, 0x07, 0x80, 0x3C, 0x0F, 0x00, 0x78, 0x1F,
+ 0x01, 0xF0, 0x1E, 0x03, 0xC0, 0x3C, 0x07, 0x80, 0x7C, 0x1F, 0x00, 0x78,
+ 0x3C, 0x00, 0xF0, 0x78, 0x01, 0xF1, 0xE0, 0x01, 0xE3, 0xC0, 0x03, 0xC7,
+ 0x80, 0x03, 0xDE, 0x00, 0x07, 0xBC, 0x00, 0x0F, 0x70, 0x00, 0x0F, 0xE0,
+ 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00,
+ 0xF8, 0x03, 0xE0, 0x07, 0x9E, 0x00, 0xFC, 0x01, 0xE7, 0x80, 0x3F, 0x00,
+ 0x79, 0xF0, 0x0F, 0xC0, 0x3E, 0x3C, 0x07, 0xF0, 0x0F, 0x0F, 0x01, 0xFE,
+ 0x03, 0xC3, 0xC0, 0x7F, 0x80, 0xF0, 0x78, 0x1D, 0xE0, 0x78, 0x1E, 0x0F,
+ 0x38, 0x1E, 0x07, 0x83, 0xCF, 0x07, 0x81, 0xE0, 0xF3, 0xC1, 0xE0, 0x3C,
+ 0x38, 0xF0, 0xF0, 0x0F, 0x1E, 0x1C, 0x3C, 0x03, 0xC7, 0x87, 0x8F, 0x00,
+ 0x71, 0xE1, 0xE3, 0x80, 0x1E, 0x70, 0x79, 0xE0, 0x07, 0xBC, 0x0E, 0x78,
+ 0x01, 0xEF, 0x03, 0xDE, 0x00, 0x3B, 0xC0, 0xF7, 0x00, 0x0F, 0xE0, 0x3F,
+ 0xC0, 0x03, 0xF8, 0x07, 0xF0, 0x00, 0x7E, 0x01, 0xF8, 0x00, 0x1F, 0x80,
+ 0x7E, 0x00, 0x07, 0xC0, 0x1F, 0x80, 0x01, 0xF0, 0x03, 0xC0, 0x00, 0x7C,
+ 0x00, 0x78, 0xF0, 0x03, 0xE1, 0xE0, 0x0F, 0x07, 0xC0, 0x78, 0x0F, 0x03,
+ 0xE0, 0x1E, 0x0F, 0x00, 0x7C, 0x78, 0x00, 0xF3, 0xE0, 0x01, 0xEF, 0x00,
+ 0x07, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x03,
+ 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0xC0, 0x03, 0xCF, 0x00, 0x0F, 0x1E,
+ 0x00, 0x78, 0x7C, 0x03, 0xE0, 0xF0, 0x0F, 0x03, 0xE0, 0x78, 0x07, 0xC3,
+ 0xE0, 0x0F, 0x1F, 0x00, 0x3E, 0x78, 0x00, 0x7C, 0x78, 0x00, 0x3D, 0xE0,
+ 0x01, 0xF7, 0x80, 0x07, 0x8F, 0x00, 0x1E, 0x3C, 0x00, 0xF0, 0xF0, 0x03,
+ 0xC1, 0xE0, 0x0F, 0x07, 0x80, 0x78, 0x1E, 0x01, 0xE0, 0x3C, 0x07, 0x80,
+ 0xF0, 0x3C, 0x03, 0xC0, 0xF0, 0x07, 0x87, 0xC0, 0x1E, 0x1E, 0x00, 0x78,
+ 0x78, 0x00, 0xF3, 0xC0, 0x03, 0xCF, 0x00, 0x0F, 0x3C, 0x00, 0x1F, 0xE0,
+ 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00,
+ 0x3E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x3C,
+ 0x00, 0x01, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3E, 0x00, 0x0F, 0xF0, 0x00,
+ 0x3F, 0xC0, 0x00, 0xFE, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x7F, 0xFF, 0xF7,
+ 0xFF, 0xFF, 0x7F, 0xFF, 0xF7, 0xFF, 0xFF, 0x00, 0x01, 0xE0, 0x00, 0x3E,
+ 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C,
+ 0x00, 0x07, 0x80, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C,
+ 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xC0, 0x00, 0x7C,
+ 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0,
+ 0x01, 0xE0, 0xFC, 0x1F, 0x87, 0x80, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E,
+ 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01,
+ 0xC0, 0x78, 0x1E, 0x0F, 0x81, 0xE0, 0x3C, 0x07, 0xC0, 0x3C, 0x03, 0x80,
+ 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38,
+ 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0F, 0x00, 0xFC, 0x1F, 0x80,
+ 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0x1F, 0x83, 0xF0, 0x0F, 0x00,
+ 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0,
+ 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x1C, 0x03, 0xC0, 0x3E, 0x03,
+ 0xC0, 0x78, 0x1F, 0x07, 0x80, 0xE0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03,
+ 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80,
+ 0x70, 0x1E, 0x1F, 0x83, 0xF0, 0x78, 0x00, 0x3E, 0x00, 0x0F, 0xF0, 0x0D,
+ 0xFF, 0x01, 0xF0, 0xF8, 0x7C, 0x0F, 0xFD, 0x80, 0x7F, 0x80, 0x03, 0xE0 };
+
+const GFXglyph FreeSans24pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 12, 0, 1 }, // 0x20 ' '
+ { 0, 4, 34, 16, 6, -33 }, // 0x21 '!'
+ { 17, 11, 12, 16, 2, -32 }, // 0x22 '"'
+ { 34, 24, 33, 26, 1, -31 }, // 0x23 '#'
+ { 133, 23, 41, 26, 1, -34 }, // 0x24 '$'
+ { 251, 39, 34, 42, 1, -32 }, // 0x25 '%'
+ { 417, 28, 34, 31, 2, -32 }, // 0x26 '&'
+ { 536, 4, 12, 9, 2, -32 }, // 0x27 '''
+ { 542, 10, 44, 16, 3, -33 }, // 0x28 '('
+ { 597, 10, 44, 16, 2, -33 }, // 0x29 ')'
+ { 652, 14, 14, 18, 2, -33 }, // 0x2A '*'
+ { 677, 23, 22, 27, 2, -21 }, // 0x2B '+'
+ { 741, 4, 12, 13, 4, -4 }, // 0x2C ','
+ { 747, 11, 4, 16, 2, -14 }, // 0x2D '-'
+ { 753, 4, 5, 12, 4, -4 }, // 0x2E '.'
+ { 756, 13, 35, 13, 0, -33 }, // 0x2F '/'
+ { 813, 22, 34, 26, 2, -32 }, // 0x30 '0'
+ { 907, 11, 33, 26, 5, -32 }, // 0x31 '1'
+ { 953, 22, 33, 26, 2, -32 }, // 0x32 '2'
+ { 1044, 23, 34, 26, 1, -32 }, // 0x33 '3'
+ { 1142, 23, 33, 26, 1, -32 }, // 0x34 '4'
+ { 1237, 22, 34, 26, 2, -32 }, // 0x35 '5'
+ { 1331, 22, 34, 26, 2, -32 }, // 0x36 '6'
+ { 1425, 21, 33, 26, 2, -32 }, // 0x37 '7'
+ { 1512, 22, 34, 26, 2, -32 }, // 0x38 '8'
+ { 1606, 21, 34, 26, 2, -32 }, // 0x39 '9'
+ { 1696, 4, 25, 12, 4, -24 }, // 0x3A ':'
+ { 1709, 4, 32, 12, 4, -24 }, // 0x3B ';'
+ { 1725, 23, 23, 27, 2, -22 }, // 0x3C '<'
+ { 1792, 23, 12, 27, 2, -16 }, // 0x3D '='
+ { 1827, 23, 23, 27, 2, -22 }, // 0x3E '>'
+ { 1894, 20, 35, 26, 4, -34 }, // 0x3F '?'
+ { 1982, 43, 42, 48, 2, -34 }, // 0x40 '@'
+ { 2208, 30, 34, 31, 1, -33 }, // 0x41 'A'
+ { 2336, 25, 34, 31, 4, -33 }, // 0x42 'B'
+ { 2443, 29, 36, 33, 2, -34 }, // 0x43 'C'
+ { 2574, 27, 34, 33, 4, -33 }, // 0x44 'D'
+ { 2689, 24, 34, 30, 4, -33 }, // 0x45 'E'
+ { 2791, 22, 34, 28, 4, -33 }, // 0x46 'F'
+ { 2885, 31, 36, 36, 2, -34 }, // 0x47 'G'
+ { 3025, 26, 34, 34, 4, -33 }, // 0x48 'H'
+ { 3136, 4, 34, 13, 5, -33 }, // 0x49 'I'
+ { 3153, 19, 35, 25, 2, -33 }, // 0x4A 'J'
+ { 3237, 27, 34, 32, 4, -33 }, // 0x4B 'K'
+ { 3352, 21, 34, 26, 4, -33 }, // 0x4C 'L'
+ { 3442, 32, 34, 40, 4, -33 }, // 0x4D 'M'
+ { 3578, 26, 34, 34, 4, -33 }, // 0x4E 'N'
+ { 3689, 33, 36, 37, 2, -34 }, // 0x4F 'O'
+ { 3838, 24, 34, 31, 4, -33 }, // 0x50 'P'
+ { 3940, 33, 38, 37, 2, -34 }, // 0x51 'Q'
+ { 4097, 26, 34, 33, 4, -33 }, // 0x52 'R'
+ { 4208, 27, 36, 31, 2, -34 }, // 0x53 'S'
+ { 4330, 26, 34, 30, 2, -33 }, // 0x54 'T'
+ { 4441, 26, 35, 34, 4, -33 }, // 0x55 'U'
+ { 4555, 29, 34, 30, 1, -33 }, // 0x56 'V'
+ { 4679, 42, 34, 44, 1, -33 }, // 0x57 'W'
+ { 4858, 29, 34, 31, 1, -33 }, // 0x58 'X'
+ { 4982, 30, 34, 32, 1, -33 }, // 0x59 'Y'
+ { 5110, 27, 34, 29, 1, -33 }, // 0x5A 'Z'
+ { 5225, 8, 44, 13, 3, -33 }, // 0x5B '['
+ { 5269, 13, 35, 13, 0, -33 }, // 0x5C '\'
+ { 5326, 8, 44, 13, 1, -33 }, // 0x5D ']'
+ { 5370, 18, 18, 22, 2, -32 }, // 0x5E '^'
+ { 5411, 28, 2, 26, -1, 7 }, // 0x5F '_'
+ { 5418, 10, 7, 12, 1, -34 }, // 0x60 '`'
+ { 5427, 24, 27, 26, 1, -25 }, // 0x61 'a'
+ { 5508, 22, 35, 26, 3, -33 }, // 0x62 'b'
+ { 5605, 21, 27, 24, 1, -25 }, // 0x63 'c'
+ { 5676, 23, 35, 26, 1, -33 }, // 0x64 'd'
+ { 5777, 22, 27, 25, 1, -25 }, // 0x65 'e'
+ { 5852, 10, 34, 13, 1, -33 }, // 0x66 'f'
+ { 5895, 22, 36, 26, 1, -25 }, // 0x67 'g'
+ { 5994, 19, 34, 25, 3, -33 }, // 0x68 'h'
+ { 6075, 4, 34, 10, 3, -33 }, // 0x69 'i'
+ { 6092, 8, 44, 11, 0, -33 }, // 0x6A 'j'
+ { 6136, 21, 34, 24, 3, -33 }, // 0x6B 'k'
+ { 6226, 4, 34, 10, 3, -33 }, // 0x6C 'l'
+ { 6243, 32, 26, 38, 3, -25 }, // 0x6D 'm'
+ { 6347, 20, 26, 25, 3, -25 }, // 0x6E 'n'
+ { 6412, 23, 27, 25, 1, -25 }, // 0x6F 'o'
+ { 6490, 22, 35, 26, 3, -25 }, // 0x70 'p'
+ { 6587, 23, 35, 26, 1, -25 }, // 0x71 'q'
+ { 6688, 12, 26, 16, 3, -25 }, // 0x72 'r'
+ { 6727, 20, 27, 23, 1, -25 }, // 0x73 's'
+ { 6795, 10, 32, 13, 1, -30 }, // 0x74 't'
+ { 6835, 20, 26, 25, 3, -24 }, // 0x75 'u'
+ { 6900, 23, 25, 23, 0, -24 }, // 0x76 'v'
+ { 6972, 34, 25, 34, 0, -24 }, // 0x77 'w'
+ { 7079, 22, 25, 22, 0, -24 }, // 0x78 'x'
+ { 7148, 22, 35, 22, 0, -24 }, // 0x79 'y'
+ { 7245, 20, 25, 23, 1, -24 }, // 0x7A 'z'
+ { 7308, 11, 44, 16, 2, -33 }, // 0x7B '{'
+ { 7369, 3, 44, 12, 4, -33 }, // 0x7C '|'
+ { 7386, 11, 44, 16, 2, -33 }, // 0x7D '}'
+ { 7447, 19, 7, 24, 2, -19 } }; // 0x7E '~'
+
+const GFXfont FreeSans24pt7b PROGMEM = {
+ (uint8_t *)FreeSans24pt7bBitmaps,
+ (GFXglyph *)FreeSans24pt7bGlyphs,
+ 0x20, 0x7E, 56 };
+
+// Approx. 8136 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSans9pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSans9pt7b.h
new file mode 100644
index 000000000000..1f006a189826
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSans9pt7b.h
@@ -0,0 +1,201 @@
+const uint8_t FreeSans9pt7bBitmaps[] PROGMEM = {
+ 0xFF, 0xFF, 0xF8, 0xC0, 0xDE, 0xF7, 0x20, 0x09, 0x86, 0x41, 0x91, 0xFF,
+ 0x13, 0x04, 0xC3, 0x20, 0xC8, 0xFF, 0x89, 0x82, 0x61, 0x90, 0x10, 0x1F,
+ 0x14, 0xDA, 0x3D, 0x1E, 0x83, 0x40, 0x78, 0x17, 0x08, 0xF4, 0x7A, 0x35,
+ 0x33, 0xF0, 0x40, 0x20, 0x38, 0x10, 0xEC, 0x20, 0xC6, 0x20, 0xC6, 0x40,
+ 0xC6, 0x40, 0x6C, 0x80, 0x39, 0x00, 0x01, 0x3C, 0x02, 0x77, 0x02, 0x63,
+ 0x04, 0x63, 0x04, 0x77, 0x08, 0x3C, 0x0E, 0x06, 0x60, 0xCC, 0x19, 0x81,
+ 0xE0, 0x18, 0x0F, 0x03, 0x36, 0xC2, 0xD8, 0x73, 0x06, 0x31, 0xE3, 0xC4,
+ 0xFE, 0x13, 0x26, 0x6C, 0xCC, 0xCC, 0xC4, 0x66, 0x23, 0x10, 0x8C, 0x46,
+ 0x63, 0x33, 0x33, 0x32, 0x66, 0x4C, 0x80, 0x25, 0x7E, 0xA5, 0x00, 0x30,
+ 0xC3, 0x3F, 0x30, 0xC3, 0x0C, 0xD6, 0xF0, 0xC0, 0x08, 0x44, 0x21, 0x10,
+ 0x84, 0x42, 0x11, 0x08, 0x00, 0x3C, 0x66, 0x42, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0x42, 0x66, 0x3C, 0x11, 0x3F, 0x33, 0x33, 0x33, 0x33,
+ 0x30, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x1C, 0x1C, 0x1C, 0x18, 0x18,
+ 0x10, 0x08, 0x07, 0xF8, 0x3C, 0x66, 0xC3, 0xC3, 0x03, 0x06, 0x1C, 0x07,
+ 0x03, 0xC3, 0xC3, 0x66, 0x3C, 0x0C, 0x18, 0x71, 0x62, 0xC9, 0xA3, 0x46,
+ 0xFE, 0x18, 0x30, 0x60, 0xC0, 0x7F, 0x20, 0x10, 0x08, 0x08, 0x07, 0xF3,
+ 0x8C, 0x03, 0x01, 0x80, 0xF0, 0x6C, 0x63, 0xE0, 0x1E, 0x31, 0x98, 0x78,
+ 0x0C, 0x06, 0xF3, 0x8D, 0x83, 0xC1, 0xE0, 0xD0, 0x6C, 0x63, 0xE0, 0xFF,
+ 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x18, 0x18, 0x10, 0x30, 0x30,
+ 0x3E, 0x31, 0xB0, 0x78, 0x3C, 0x1B, 0x18, 0xF8, 0xC6, 0xC1, 0xE0, 0xF0,
+ 0x6C, 0x63, 0xE0, 0x3C, 0x66, 0xC2, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03,
+ 0x03, 0xC2, 0x66, 0x3C, 0xC0, 0x00, 0x30, 0xC0, 0x00, 0x00, 0x64, 0xA0,
+ 0x00, 0x81, 0xC7, 0x8E, 0x0C, 0x07, 0x80, 0x70, 0x0E, 0x01, 0x80, 0xFF,
+ 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x70, 0x0E, 0x01, 0xC0, 0x18, 0x38, 0x71,
+ 0xC0, 0x80, 0x00, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x18, 0x38, 0x18,
+ 0x18, 0x0C, 0x00, 0x00, 0x01, 0x80, 0x03, 0xF0, 0x06, 0x0E, 0x06, 0x01,
+ 0x86, 0x00, 0x66, 0x1D, 0xBB, 0x31, 0xCF, 0x18, 0xC7, 0x98, 0x63, 0xCC,
+ 0x31, 0xE6, 0x11, 0xB3, 0x99, 0xCC, 0xF7, 0x86, 0x00, 0x01, 0x80, 0x00,
+ 0x70, 0x40, 0x0F, 0xE0, 0x06, 0x00, 0xF0, 0x0F, 0x00, 0x90, 0x19, 0x81,
+ 0x98, 0x10, 0x83, 0x0C, 0x3F, 0xC2, 0x04, 0x60, 0x66, 0x06, 0xC0, 0x30,
+ 0xFF, 0x18, 0x33, 0x03, 0x60, 0x6C, 0x0D, 0x83, 0x3F, 0xC6, 0x06, 0xC0,
+ 0x78, 0x0F, 0x01, 0xE0, 0x6F, 0xF8, 0x1F, 0x86, 0x19, 0x81, 0xA0, 0x3C,
+ 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x68, 0x0D, 0x83, 0x18, 0x61, 0xF0,
+ 0xFF, 0x18, 0x33, 0x03, 0x60, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0,
+ 0x78, 0x0F, 0x03, 0x60, 0xCF, 0xF0, 0xFF, 0xE0, 0x30, 0x18, 0x0C, 0x06,
+ 0x03, 0xFD, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xF8, 0xFF, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x0F, 0x83,
+ 0x0E, 0x60, 0x66, 0x03, 0xC0, 0x0C, 0x00, 0xC1, 0xFC, 0x03, 0xC0, 0x36,
+ 0x03, 0x60, 0x73, 0x0F, 0x0F, 0x10, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C,
+ 0x07, 0x80, 0xFF, 0xFE, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x06,
+ 0xFF, 0xFF, 0xFF, 0xC0, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x07,
+ 0x8F, 0x1E, 0x27, 0x80, 0xC0, 0xD8, 0x33, 0x0C, 0x63, 0x0C, 0xC1, 0xB8,
+ 0x3F, 0x07, 0x30, 0xC3, 0x18, 0x63, 0x06, 0x60, 0x6C, 0x0C, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xE0,
+ 0x3F, 0x01, 0xFC, 0x1F, 0xE0, 0xFD, 0x05, 0xEC, 0x6F, 0x63, 0x79, 0x13,
+ 0xCD, 0x9E, 0x6C, 0xF1, 0x47, 0x8E, 0x3C, 0x71, 0x80, 0xE0, 0x7C, 0x0F,
+ 0xC1, 0xE8, 0x3D, 0x87, 0x98, 0xF1, 0x1E, 0x33, 0xC3, 0x78, 0x6F, 0x07,
+ 0xE0, 0x7C, 0x0E, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 0x6C, 0x01, 0xE0,
+ 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x0C, 0x60, 0xC0, 0xF8,
+ 0x00, 0xFF, 0x30, 0x6C, 0x0F, 0x03, 0xC0, 0xF0, 0x6F, 0xF3, 0x00, 0xC0,
+ 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x00, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0,
+ 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x6C,
+ 0x60, 0xC0, 0xFB, 0x00, 0x08, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0,
+ 0x6C, 0x0C, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x06, 0xC0,
+ 0x70, 0x3F, 0x18, 0x6C, 0x0F, 0x03, 0xC0, 0x1E, 0x01, 0xF0, 0x0E, 0x00,
+ 0xF0, 0x3C, 0x0D, 0x86, 0x3F, 0x00, 0xFF, 0x86, 0x03, 0x01, 0x80, 0xC0,
+ 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x78, 0x0F,
+ 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01,
+ 0xB0, 0x61, 0xF0, 0xC0, 0x6C, 0x0D, 0x81, 0x10, 0x63, 0x0C, 0x61, 0x04,
+ 0x60, 0xCC, 0x19, 0x01, 0x60, 0x3C, 0x07, 0x00, 0x60, 0xC1, 0x81, 0x30,
+ 0xE1, 0x98, 0x70, 0xCC, 0x28, 0x66, 0x26, 0x21, 0x13, 0x30, 0xC8, 0x98,
+ 0x6C, 0x4C, 0x14, 0x34, 0x0A, 0x1A, 0x07, 0x07, 0x03, 0x03, 0x80, 0x81,
+ 0x80, 0x60, 0x63, 0x0C, 0x30, 0xC1, 0x98, 0x0F, 0x00, 0xE0, 0x06, 0x00,
+ 0xF0, 0x19, 0x01, 0x98, 0x30, 0xC6, 0x0E, 0x60, 0x60, 0xC0, 0x36, 0x06,
+ 0x30, 0xC3, 0x0C, 0x19, 0x81, 0xD8, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60,
+ 0x06, 0x00, 0x60, 0x06, 0x00, 0xFF, 0xC0, 0x60, 0x30, 0x0C, 0x06, 0x03,
+ 0x01, 0xC0, 0x60, 0x30, 0x18, 0x06, 0x03, 0x00, 0xFF, 0xC0, 0xFB, 0x6D,
+ 0xB6, 0xDB, 0x6D, 0xB6, 0xE0, 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x84,
+ 0x10, 0x80, 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xDB, 0xE0, 0x30, 0x60, 0xA2,
+ 0x44, 0xD8, 0xA1, 0x80, 0xFF, 0xC0, 0xC6, 0x30, 0x7E, 0x71, 0xB0, 0xC0,
+ 0x60, 0xF3, 0xDB, 0x0D, 0x86, 0xC7, 0x3D, 0xC0, 0xC0, 0x60, 0x30, 0x1B,
+ 0xCE, 0x36, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x6D, 0xE0, 0x3C,
+ 0x66, 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x03, 0x03, 0x03,
+ 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x3C, 0x66,
+ 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x36, 0x6F, 0x66, 0x66,
+ 0x66, 0x66, 0x60, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67,
+ 0x3B, 0x03, 0x03, 0xC6, 0x7C, 0xC0, 0xC0, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xC0, 0x30, 0x03,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xE0, 0xC0, 0x60, 0x30, 0x18, 0x4C,
+ 0x46, 0x63, 0x61, 0xF0, 0xEC, 0x62, 0x31, 0x98, 0x6C, 0x30, 0xFF, 0xFF,
+ 0xFF, 0xC0, 0xDE, 0xF7, 0x1C, 0xF0, 0xC7, 0x86, 0x3C, 0x31, 0xE1, 0x8F,
+ 0x0C, 0x78, 0x63, 0xC3, 0x1E, 0x18, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0x66, 0x3C, 0xDE, 0x71, 0xB0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83,
+ 0xE3, 0x6F, 0x30, 0x18, 0x0C, 0x00, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03, 0x03, 0xDF, 0x31, 0x8C, 0x63, 0x18,
+ 0xC6, 0x00, 0x3E, 0xE3, 0xC0, 0xC0, 0xE0, 0x3C, 0x07, 0xC3, 0xE3, 0x7E,
+ 0x66, 0xF6, 0x66, 0x66, 0x66, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC7, 0x7B, 0xC1, 0xA0, 0x98, 0xCC, 0x42, 0x21, 0xB0, 0xD0,
+ 0x28, 0x1C, 0x0C, 0x00, 0xC6, 0x1E, 0x38, 0x91, 0xC4, 0xCA, 0x66, 0xD3,
+ 0x16, 0xD0, 0xA6, 0x87, 0x1C, 0x38, 0xC0, 0xC6, 0x00, 0x43, 0x62, 0x36,
+ 0x1C, 0x18, 0x1C, 0x3C, 0x26, 0x62, 0x43, 0xC1, 0x21, 0x98, 0xCC, 0x42,
+ 0x61, 0xB0, 0xD0, 0x38, 0x1C, 0x0C, 0x06, 0x03, 0x01, 0x03, 0x00, 0xFE,
+ 0x0C, 0x30, 0xC1, 0x86, 0x18, 0x20, 0xC1, 0xFC, 0x36, 0x66, 0x66, 0x6E,
+ 0xCE, 0x66, 0x66, 0x66, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC6, 0x66,
+ 0x66, 0x67, 0x37, 0x66, 0x66, 0x66, 0xC0, 0x61, 0x24, 0x38 };
+
+const GFXglyph FreeSans9pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 5, 0, 1 }, // 0x20 ' '
+ { 0, 2, 13, 6, 2, -12 }, // 0x21 '!'
+ { 4, 5, 4, 6, 1, -12 }, // 0x22 '"'
+ { 7, 10, 12, 10, 0, -11 }, // 0x23 '#'
+ { 22, 9, 16, 10, 1, -13 }, // 0x24 '$'
+ { 40, 16, 13, 16, 1, -12 }, // 0x25 '%'
+ { 66, 11, 13, 12, 1, -12 }, // 0x26 '&'
+ { 84, 2, 4, 4, 1, -12 }, // 0x27 '''
+ { 85, 4, 17, 6, 1, -12 }, // 0x28 '('
+ { 94, 4, 17, 6, 1, -12 }, // 0x29 ')'
+ { 103, 5, 5, 7, 1, -12 }, // 0x2A '*'
+ { 107, 6, 8, 11, 3, -7 }, // 0x2B '+'
+ { 113, 2, 4, 5, 2, 0 }, // 0x2C ','
+ { 114, 4, 1, 6, 1, -4 }, // 0x2D '-'
+ { 115, 2, 1, 5, 1, 0 }, // 0x2E '.'
+ { 116, 5, 13, 5, 0, -12 }, // 0x2F '/'
+ { 125, 8, 13, 10, 1, -12 }, // 0x30 '0'
+ { 138, 4, 13, 10, 3, -12 }, // 0x31 '1'
+ { 145, 9, 13, 10, 1, -12 }, // 0x32 '2'
+ { 160, 8, 13, 10, 1, -12 }, // 0x33 '3'
+ { 173, 7, 13, 10, 2, -12 }, // 0x34 '4'
+ { 185, 9, 13, 10, 1, -12 }, // 0x35 '5'
+ { 200, 9, 13, 10, 1, -12 }, // 0x36 '6'
+ { 215, 8, 13, 10, 0, -12 }, // 0x37 '7'
+ { 228, 9, 13, 10, 1, -12 }, // 0x38 '8'
+ { 243, 8, 13, 10, 1, -12 }, // 0x39 '9'
+ { 256, 2, 10, 5, 1, -9 }, // 0x3A ':'
+ { 259, 3, 12, 5, 1, -8 }, // 0x3B ';'
+ { 264, 9, 9, 11, 1, -8 }, // 0x3C '<'
+ { 275, 9, 4, 11, 1, -5 }, // 0x3D '='
+ { 280, 9, 9, 11, 1, -8 }, // 0x3E '>'
+ { 291, 9, 13, 10, 1, -12 }, // 0x3F '?'
+ { 306, 17, 16, 18, 1, -12 }, // 0x40 '@'
+ { 340, 12, 13, 12, 0, -12 }, // 0x41 'A'
+ { 360, 11, 13, 12, 1, -12 }, // 0x42 'B'
+ { 378, 11, 13, 13, 1, -12 }, // 0x43 'C'
+ { 396, 11, 13, 13, 1, -12 }, // 0x44 'D'
+ { 414, 9, 13, 11, 1, -12 }, // 0x45 'E'
+ { 429, 8, 13, 11, 1, -12 }, // 0x46 'F'
+ { 442, 12, 13, 14, 1, -12 }, // 0x47 'G'
+ { 462, 11, 13, 13, 1, -12 }, // 0x48 'H'
+ { 480, 2, 13, 5, 2, -12 }, // 0x49 'I'
+ { 484, 7, 13, 10, 1, -12 }, // 0x4A 'J'
+ { 496, 11, 13, 12, 1, -12 }, // 0x4B 'K'
+ { 514, 8, 13, 10, 1, -12 }, // 0x4C 'L'
+ { 527, 13, 13, 15, 1, -12 }, // 0x4D 'M'
+ { 549, 11, 13, 13, 1, -12 }, // 0x4E 'N'
+ { 567, 13, 13, 14, 1, -12 }, // 0x4F 'O'
+ { 589, 10, 13, 12, 1, -12 }, // 0x50 'P'
+ { 606, 13, 14, 14, 1, -12 }, // 0x51 'Q'
+ { 629, 12, 13, 13, 1, -12 }, // 0x52 'R'
+ { 649, 10, 13, 12, 1, -12 }, // 0x53 'S'
+ { 666, 9, 13, 11, 1, -12 }, // 0x54 'T'
+ { 681, 11, 13, 13, 1, -12 }, // 0x55 'U'
+ { 699, 11, 13, 12, 0, -12 }, // 0x56 'V'
+ { 717, 17, 13, 17, 0, -12 }, // 0x57 'W'
+ { 745, 12, 13, 12, 0, -12 }, // 0x58 'X'
+ { 765, 12, 13, 12, 0, -12 }, // 0x59 'Y'
+ { 785, 10, 13, 11, 1, -12 }, // 0x5A 'Z'
+ { 802, 3, 17, 5, 1, -12 }, // 0x5B '['
+ { 809, 5, 13, 5, 0, -12 }, // 0x5C '\'
+ { 818, 3, 17, 5, 0, -12 }, // 0x5D ']'
+ { 825, 7, 7, 8, 1, -12 }, // 0x5E '^'
+ { 832, 10, 1, 10, 0, 3 }, // 0x5F '_'
+ { 834, 4, 3, 5, 0, -12 }, // 0x60 '`'
+ { 836, 9, 10, 10, 1, -9 }, // 0x61 'a'
+ { 848, 9, 13, 10, 1, -12 }, // 0x62 'b'
+ { 863, 8, 10, 9, 1, -9 }, // 0x63 'c'
+ { 873, 8, 13, 10, 1, -12 }, // 0x64 'd'
+ { 886, 8, 10, 10, 1, -9 }, // 0x65 'e'
+ { 896, 4, 13, 5, 1, -12 }, // 0x66 'f'
+ { 903, 8, 14, 10, 1, -9 }, // 0x67 'g'
+ { 917, 8, 13, 10, 1, -12 }, // 0x68 'h'
+ { 930, 2, 13, 4, 1, -12 }, // 0x69 'i'
+ { 934, 4, 17, 4, 0, -12 }, // 0x6A 'j'
+ { 943, 9, 13, 9, 1, -12 }, // 0x6B 'k'
+ { 958, 2, 13, 4, 1, -12 }, // 0x6C 'l'
+ { 962, 13, 10, 15, 1, -9 }, // 0x6D 'm'
+ { 979, 8, 10, 10, 1, -9 }, // 0x6E 'n'
+ { 989, 8, 10, 10, 1, -9 }, // 0x6F 'o'
+ { 999, 9, 13, 10, 1, -9 }, // 0x70 'p'
+ { 1014, 8, 13, 10, 1, -9 }, // 0x71 'q'
+ { 1027, 5, 10, 6, 1, -9 }, // 0x72 'r'
+ { 1034, 8, 10, 9, 1, -9 }, // 0x73 's'
+ { 1044, 4, 12, 5, 1, -11 }, // 0x74 't'
+ { 1050, 8, 10, 10, 1, -9 }, // 0x75 'u'
+ { 1060, 9, 10, 9, 0, -9 }, // 0x76 'v'
+ { 1072, 13, 10, 13, 0, -9 }, // 0x77 'w'
+ { 1089, 8, 10, 9, 0, -9 }, // 0x78 'x'
+ { 1099, 9, 14, 9, 0, -9 }, // 0x79 'y'
+ { 1115, 7, 10, 9, 1, -9 }, // 0x7A 'z'
+ { 1124, 4, 17, 6, 1, -12 }, // 0x7B '{'
+ { 1133, 2, 17, 4, 2, -12 }, // 0x7C '|'
+ { 1138, 4, 17, 6, 1, -12 }, // 0x7D '}'
+ { 1147, 7, 3, 9, 1, -7 } }; // 0x7E '~'
+
+const GFXfont FreeSans9pt7b PROGMEM = {
+ (uint8_t *)FreeSans9pt7bBitmaps,
+ (GFXglyph *)FreeSans9pt7bGlyphs,
+ 0x20, 0x7E, 22 };
+
+// Approx. 1822 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBold12pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBold12pt7b.h
new file mode 100644
index 000000000000..e0922be27913
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBold12pt7b.h
@@ -0,0 +1,288 @@
+const uint8_t FreeSansBold12pt7bBitmaps[] PROGMEM = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x76, 0x66, 0x60, 0xFF, 0xF0, 0xF3, 0xFC, 0xFF,
+ 0x3F, 0xCF, 0x61, 0x98, 0x60, 0x0E, 0x70, 0x73, 0x83, 0x18, 0xFF, 0xF7,
+ 0xFF, 0xBF, 0xFC, 0x73, 0x83, 0x18, 0x18, 0xC7, 0xFF, 0xBF, 0xFD, 0xFF,
+ 0xE3, 0x18, 0x39, 0xC1, 0xCE, 0x0E, 0x70, 0x02, 0x00, 0x7E, 0x0F, 0xF8,
+ 0x7F, 0xE7, 0xAF, 0xB9, 0x3D, 0xC8, 0x0F, 0x40, 0x3F, 0x00, 0xFF, 0x00,
+ 0xFC, 0x05, 0xFF, 0x27, 0xF9, 0x3F, 0xEB, 0xEF, 0xFE, 0x3F, 0xE0, 0x7C,
+ 0x00, 0x80, 0x04, 0x00, 0x3C, 0x06, 0x0F, 0xC1, 0x81, 0xFC, 0x30, 0x73,
+ 0x8C, 0x0C, 0x31, 0x81, 0xCE, 0x60, 0x1F, 0xCC, 0x03, 0xF3, 0x00, 0x3C,
+ 0x67, 0x80, 0x19, 0xF8, 0x02, 0x7F, 0x80, 0xCE, 0x70, 0x11, 0x86, 0x06,
+ 0x39, 0xC1, 0x87, 0xF8, 0x30, 0x7E, 0x0C, 0x07, 0x80, 0x07, 0x80, 0x1F,
+ 0xC0, 0x3F, 0xE0, 0x3C, 0xE0, 0x3C, 0xE0, 0x3E, 0xE0, 0x0F, 0xC0, 0x07,
+ 0x00, 0x3F, 0x8C, 0x7F, 0xCC, 0xF1, 0xFC, 0xF0, 0xF8, 0xF0, 0x78, 0xF8,
+ 0xF8, 0x7F, 0xFC, 0x3F, 0xDE, 0x1F, 0x8E, 0xFF, 0xFF, 0x66, 0x0C, 0x73,
+ 0x8E, 0x71, 0xC7, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x1C, 0x71, 0xC3,
+ 0x8E, 0x18, 0x70, 0xC3, 0x87, 0x1C, 0x38, 0xE3, 0x87, 0x1C, 0x71, 0xC7,
+ 0x1C, 0x71, 0xCE, 0x38, 0xE7, 0x1C, 0x63, 0x80, 0x10, 0x23, 0x5F, 0xF3,
+ 0x87, 0x1B, 0x14, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x0F, 0xFF, 0xFF, 0xFF,
+ 0xF8, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x00, 0xFF, 0xF3, 0x36, 0xC0, 0xFF,
+ 0xFF, 0xC0, 0xFF, 0xF0, 0x0C, 0x30, 0x86, 0x18, 0x61, 0x0C, 0x30, 0xC2,
+ 0x18, 0x61, 0x84, 0x30, 0xC0, 0x1F, 0x83, 0xFC, 0x7F, 0xE7, 0x9E, 0xF0,
+ 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0,
+ 0xF7, 0x9E, 0x7F, 0xE3, 0xFC, 0x0F, 0x00, 0x06, 0x1C, 0x7F, 0xFF, 0xE3,
+ 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x1F, 0x83,
+ 0xFC, 0x7F, 0xEF, 0x9F, 0xF0, 0xFF, 0x0F, 0x00, 0xF0, 0x0F, 0x01, 0xE0,
+ 0x3C, 0x0F, 0x81, 0xE0, 0x3C, 0x03, 0x80, 0x7F, 0xF7, 0xFF, 0x7F, 0xF0,
+ 0x1F, 0x07, 0xFC, 0xFF, 0xEF, 0x1E, 0xF1, 0xE0, 0x1E, 0x03, 0xC0, 0x78,
+ 0x07, 0xC0, 0x1E, 0x00, 0xF0, 0x0F, 0xF0, 0xFF, 0x1F, 0x7F, 0xE7, 0xFC,
+ 0x1F, 0x80, 0x03, 0xC0, 0xF8, 0x1F, 0x07, 0xE1, 0xBC, 0x27, 0x8C, 0xF3,
+ 0x1E, 0x63, 0xD8, 0x7B, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, 0x80, 0xF0, 0x1E,
+ 0x03, 0xC0, 0x3F, 0xE7, 0xFE, 0x7F, 0xE7, 0x00, 0x60, 0x06, 0xF8, 0x7F,
+ 0xCF, 0xFE, 0xF1, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xFE, 0x1E, 0xFF,
+ 0xE7, 0xFC, 0x3F, 0x00, 0x0F, 0x83, 0xFC, 0x7F, 0xE7, 0x9F, 0xF0, 0x0F,
+ 0x78, 0xFF, 0xCF, 0xFE, 0xF9, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xF7,
+ 0x9F, 0x7F, 0xE3, 0xFC, 0x0F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xE0,
+ 0x1C, 0x07, 0x01, 0xE0, 0x38, 0x0F, 0x01, 0xC0, 0x78, 0x0F, 0x01, 0xE0,
+ 0x38, 0x0F, 0x01, 0xE0, 0x3C, 0x00, 0x0F, 0x03, 0xFC, 0x7F, 0xC7, 0x9E,
+ 0x70, 0xE7, 0x0E, 0x39, 0xC1, 0xF8, 0x3F, 0xC7, 0x9E, 0xF0, 0xFF, 0x0F,
+ 0xF0, 0xFF, 0x9F, 0x7F, 0xE3, 0xFC, 0x1F, 0x80, 0x1F, 0x03, 0xFC, 0x7F,
+ 0xEF, 0x9E, 0xF0, 0xEF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF9, 0xF7, 0xFF, 0x3F,
+ 0xF1, 0xEF, 0x00, 0xEF, 0x1E, 0x7F, 0xE7, 0xFC, 0x1F, 0x00, 0xFF, 0xF0,
+ 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0xFF, 0x11, 0x6C,
+ 0x00, 0x10, 0x07, 0x03, 0xF1, 0xFC, 0x7E, 0x0F, 0x80, 0xE0, 0x0F, 0xC0,
+ 0x3F, 0x80, 0x7F, 0x00, 0xF0, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00,
+ 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x0E, 0x00, 0xFC,
+ 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0x00, 0xF0, 0x7F, 0x1F, 0x8F, 0xE0, 0xF0,
+ 0x08, 0x00, 0x1F, 0x07, 0xFC, 0x7F, 0xEF, 0x9F, 0xF0, 0xFF, 0x0F, 0x00,
+ 0xF0, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x0E, 0x00, 0xE0, 0x00,
+ 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x00, 0xFE, 0x00, 0x1F, 0xFC, 0x03, 0xC0,
+ 0xF0, 0x38, 0x01, 0xC3, 0x80, 0x07, 0x18, 0x3D, 0x99, 0x87, 0xEC, 0x6C,
+ 0x71, 0xC3, 0xC3, 0x06, 0x1E, 0x18, 0x30, 0xF1, 0x81, 0x87, 0x8C, 0x18,
+ 0x7C, 0x60, 0xC3, 0x63, 0x8E, 0x3B, 0x8F, 0xDF, 0x8C, 0x3C, 0xF0, 0x70,
+ 0x00, 0x01, 0xC0, 0x00, 0x07, 0x80, 0x80, 0x1F, 0xFE, 0x00, 0x1F, 0xC0,
+ 0x00, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x07, 0xF0, 0x07, 0xF0, 0x07,
+ 0x70, 0x0F, 0x78, 0x0E, 0x78, 0x0E, 0x38, 0x1E, 0x3C, 0x1C, 0x3C, 0x3F,
+ 0xFC, 0x3F, 0xFE, 0x3F, 0xFE, 0x78, 0x0E, 0x78, 0x0F, 0x70, 0x0F, 0xF0,
+ 0x07, 0xFF, 0xC3, 0xFF, 0xCF, 0xFF, 0x3C, 0x3E, 0xF0, 0x7B, 0xC1, 0xEF,
+ 0x0F, 0xBF, 0xFC, 0xFF, 0xE3, 0xFF, 0xCF, 0x07, 0xBC, 0x0F, 0xF0, 0x3F,
+ 0xC0, 0xFF, 0x07, 0xFF, 0xFE, 0xFF, 0xFB, 0xFF, 0x80, 0x07, 0xE0, 0x1F,
+ 0xF8, 0x3F, 0xFC, 0x7C, 0x3E, 0x78, 0x1F, 0xF8, 0x0F, 0xF0, 0x00, 0xF0,
+ 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF8, 0x0F, 0x78,
+ 0x1F, 0x7C, 0x3E, 0x3F, 0xFE, 0x1F, 0xFC, 0x07, 0xF0, 0xFF, 0xE1, 0xFF,
+ 0xE3, 0xFF, 0xE7, 0x83, 0xEF, 0x03, 0xDE, 0x07, 0xFC, 0x07, 0xF8, 0x0F,
+ 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x03, 0xFE, 0x07, 0xBC,
+ 0x1F, 0x7F, 0xFC, 0xFF, 0xF1, 0xFF, 0x80, 0xFF, 0xF7, 0xFF, 0xBF, 0xFD,
+ 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0xFC, 0xFF, 0xE7, 0xFF, 0x3C,
+ 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F,
+ 0xFE, 0xFF, 0xEF, 0xFE, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F,
+ 0x00, 0xF0, 0x0F, 0x00, 0x03, 0xF0, 0x0F, 0xFC, 0x3F, 0xFE, 0x3E, 0x1F,
+ 0x78, 0x07, 0x78, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x7F, 0xF0, 0x7F,
+ 0xF0, 0x7F, 0xF0, 0x07, 0x78, 0x07, 0x7C, 0x0F, 0x3E, 0x1F, 0x3F, 0xFB,
+ 0x0F, 0xFB, 0x03, 0xE3, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0,
+ 0x3F, 0xC0, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFC,
+ 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xF0,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xE0, 0x3C,
+ 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07,
+ 0xF8, 0xFF, 0x1F, 0xE3, 0xFC, 0x7B, 0xFE, 0x7F, 0xC3, 0xE0, 0xF0, 0x3E,
+ 0xF0, 0x3C, 0xF0, 0x78, 0xF0, 0xF0, 0xF1, 0xE0, 0xF3, 0xC0, 0xF7, 0x80,
+ 0xFF, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0xFB, 0xC0, 0xF1, 0xE0, 0xF0, 0xF0,
+ 0xF0, 0xF0, 0xF0, 0x78, 0xF0, 0x3C, 0xF0, 0x3E, 0xF0, 0x1E, 0xF0, 0x1E,
+ 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03,
+ 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8,
+ 0x1F, 0xFE, 0x0F, 0xFF, 0x0F, 0xFF, 0x87, 0xFF, 0xC3, 0xFF, 0xE1, 0xFF,
+ 0xF9, 0xFF, 0xFC, 0xEF, 0xFE, 0x77, 0xFB, 0x3B, 0xFD, 0xDD, 0xFE, 0xFC,
+ 0xFF, 0x7E, 0x7F, 0x9F, 0x3F, 0xCF, 0x9F, 0xE7, 0x8F, 0xF3, 0xC7, 0xF8,
+ 0xE3, 0xC0, 0xF0, 0x1F, 0xF0, 0x3F, 0xF0, 0x7F, 0xE0, 0xFF, 0xE1, 0xFF,
+ 0xC3, 0xFD, 0xC7, 0xFB, 0x8F, 0xF3, 0x9F, 0xE7, 0x3F, 0xC7, 0x7F, 0x8F,
+ 0xFF, 0x0F, 0xFE, 0x1F, 0xFC, 0x1F, 0xF8, 0x1F, 0xF0, 0x3F, 0xE0, 0x3C,
+ 0x03, 0xE0, 0x0F, 0xFC, 0x0F, 0xFF, 0x87, 0xC7, 0xC7, 0x80, 0xF3, 0xC0,
+ 0x7B, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x01, 0xFE,
+ 0x00, 0xF7, 0x80, 0xF3, 0xC0, 0x78, 0xF0, 0xF8, 0x7F, 0xFC, 0x1F, 0xFC,
+ 0x03, 0xF8, 0x00, 0xFF, 0xE3, 0xFF, 0xEF, 0xFF, 0xBC, 0x1F, 0xF0, 0x3F,
+ 0xC0, 0xFF, 0x03, 0xFC, 0x1F, 0xFF, 0xFB, 0xFF, 0xCF, 0xFE, 0x3C, 0x00,
+ 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x00, 0x03,
+ 0xE0, 0x0F, 0xFC, 0x0F, 0xFF, 0x87, 0xC7, 0xC7, 0x80, 0xF3, 0xC0, 0x7B,
+ 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x01, 0xFE, 0x04,
+ 0xF7, 0x87, 0xF3, 0xC3, 0xF8, 0xF0, 0xF8, 0x7F, 0xFC, 0x1F, 0xFF, 0x83,
+ 0xF1, 0x80, 0x00, 0x00, 0xFF, 0xF8, 0xFF, 0xFC, 0xFF, 0xFC, 0xF0, 0x3E,
+ 0xF0, 0x1E, 0xF0, 0x1E, 0xF0, 0x1E, 0xF0, 0x3C, 0xFF, 0xF8, 0xFF, 0xF0,
+ 0xFF, 0xF8, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x3C,
+ 0xF0, 0x3C, 0xF0, 0x1F, 0x0F, 0xC0, 0x7F, 0xE1, 0xFF, 0xE7, 0xC3, 0xEF,
+ 0x03, 0xDE, 0x00, 0x3C, 0x00, 0x7F, 0x00, 0x7F, 0xF0, 0x3F, 0xF8, 0x0F,
+ 0xF8, 0x01, 0xF0, 0x01, 0xFE, 0x03, 0xDE, 0x0F, 0xBF, 0xFE, 0x3F, 0xF8,
+ 0x1F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0x0F, 0x00, 0xF0, 0x0F,
+ 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F,
+ 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F,
+ 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03,
+ 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xF7, 0x87, 0x9F, 0xFE, 0x3F, 0xF0, 0x3F,
+ 0x00, 0x70, 0x0E, 0xF0, 0x3D, 0xE0, 0x79, 0xC0, 0xE3, 0x81, 0xC7, 0x87,
+ 0x87, 0x0E, 0x0E, 0x1C, 0x1E, 0x78, 0x1C, 0xE0, 0x39, 0xC0, 0x73, 0x80,
+ 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x70,
+ 0x38, 0x1C, 0xE0, 0xF0, 0x79, 0xE1, 0xF0, 0xF3, 0xC3, 0xE1, 0xE3, 0x87,
+ 0xC3, 0x87, 0x0F, 0x87, 0x0E, 0x3B, 0x9E, 0x1E, 0x77, 0x38, 0x1C, 0xEE,
+ 0x70, 0x39, 0xCC, 0xE0, 0x73, 0x99, 0xC0, 0x6E, 0x3F, 0x00, 0xFC, 0x7E,
+ 0x01, 0xF8, 0xFC, 0x03, 0xF0, 0xF8, 0x03, 0xE1, 0xE0, 0x07, 0x83, 0xC0,
+ 0x0F, 0x07, 0x80, 0xF0, 0x3C, 0xF0, 0xF9, 0xE1, 0xE1, 0xE7, 0x83, 0xCF,
+ 0x03, 0xFC, 0x03, 0xF0, 0x07, 0xE0, 0x07, 0x80, 0x0F, 0x00, 0x3F, 0x00,
+ 0xFF, 0x01, 0xFE, 0x07, 0x9E, 0x0F, 0x1E, 0x3C, 0x3C, 0xF8, 0x3D, 0xE0,
+ 0x78, 0xF0, 0x1E, 0x78, 0x1E, 0x78, 0x3C, 0x3C, 0x3C, 0x3C, 0x78, 0x1E,
+ 0x78, 0x0E, 0x70, 0x0F, 0xF0, 0x07, 0xE0, 0x07, 0xE0, 0x03, 0xC0, 0x03,
+ 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03,
+ 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x01, 0xF0, 0x0F, 0x00, 0xF0, 0x0F,
+ 0x00, 0xF8, 0x07, 0x80, 0x78, 0x07, 0x80, 0x7C, 0x03, 0xC0, 0x3C, 0x03,
+ 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFC, 0xF3, 0xCF,
+ 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xFF, 0xFF,
+ 0xC0, 0xC1, 0x81, 0x03, 0x06, 0x04, 0x0C, 0x18, 0x10, 0x30, 0x60, 0x40,
+ 0xC1, 0x81, 0x03, 0x06, 0xFF, 0xFF, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3,
+ 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0xFF, 0xFF, 0xC0, 0x0F, 0x00,
+ 0xF0, 0x0F, 0x01, 0xF8, 0x1B, 0x83, 0x9C, 0x39, 0xC3, 0x0C, 0x70, 0xE7,
+ 0x0E, 0xE0, 0x70, 0xFF, 0xFF, 0xFF, 0xFC, 0xE6, 0x30, 0x1F, 0x83, 0xFF,
+ 0x1F, 0xFD, 0xE1, 0xE0, 0x0F, 0x03, 0xF9, 0xFF, 0xDF, 0x1E, 0xF0, 0xF7,
+ 0x8F, 0xBF, 0xFC, 0xFF, 0xE3, 0xCF, 0x80, 0xF0, 0x07, 0x80, 0x3C, 0x01,
+ 0xE0, 0x0F, 0x00, 0x7B, 0xC3, 0xFF, 0x9F, 0xFE, 0xF8, 0xF7, 0x83, 0xFC,
+ 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xE3, 0xDF, 0xFE, 0xFF, 0xE7, 0xBE,
+ 0x00, 0x0F, 0x83, 0xFE, 0x7F, 0xF7, 0x8F, 0xF0, 0x7F, 0x00, 0xF0, 0x0F,
+ 0x00, 0xF0, 0x77, 0x8F, 0x7F, 0xF3, 0xFE, 0x0F, 0x80, 0x00, 0x78, 0x03,
+ 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x8F, 0xBC, 0xFF, 0xEF, 0xFF, 0x78, 0xFF,
+ 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3D, 0xE3, 0xEF, 0xFF, 0x3F,
+ 0xF8, 0xFB, 0xC0, 0x1F, 0x81, 0xFE, 0x1F, 0xF9, 0xF1, 0xCF, 0x07, 0x7F,
+ 0xFB, 0xFF, 0xDE, 0x00, 0xF0, 0x03, 0xC3, 0x9F, 0xFC, 0x7F, 0xC0, 0xF8,
+ 0x00, 0x3E, 0xFD, 0xFB, 0xC7, 0x9F, 0xBF, 0x3C, 0x78, 0xF1, 0xE3, 0xC7,
+ 0x8F, 0x1E, 0x3C, 0x78, 0xF0, 0x1E, 0x79, 0xFB, 0xDF, 0xFE, 0xF1, 0xFF,
+ 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0xC7, 0xDF, 0xFE, 0x7F,
+ 0xF1, 0xF7, 0x80, 0x3C, 0x01, 0xFF, 0x1E, 0x7F, 0xF0, 0xFE, 0x00, 0xF0,
+ 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x7C, 0xFF, 0xEF, 0xFF, 0xF9,
+ 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0,
+ 0xFF, 0x0F, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3C,
+ 0xF3, 0xC0, 0x00, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C,
+ 0xF3, 0xCF, 0xFF, 0xFF, 0x80, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0,
+ 0x0F, 0x0F, 0xF1, 0xEF, 0x3C, 0xF7, 0x8F, 0xF0, 0xFF, 0x0F, 0xF8, 0xFF,
+ 0x8F, 0x3C, 0xF1, 0xCF, 0x1E, 0xF0, 0xEF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x8F, 0x9F, 0xFB, 0xFB, 0xFF, 0xFF,
+ 0xFC, 0xF8, 0xFF, 0x1E, 0x1F, 0xE3, 0xC3, 0xFC, 0x78, 0x7F, 0x8F, 0x0F,
+ 0xF1, 0xE1, 0xFE, 0x3C, 0x3F, 0xC7, 0x87, 0xF8, 0xF0, 0xFF, 0x1E, 0x1E,
+ 0xF7, 0xCF, 0xFE, 0xFF, 0xFF, 0x9F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F,
+ 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xF0, 0x0F, 0x81, 0xFF, 0x1F,
+ 0xFC, 0xF1, 0xEF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7B, 0xC7,
+ 0x9F, 0xFC, 0x7F, 0xC0, 0xF8, 0x00, 0xF7, 0xC7, 0xFF, 0x3F, 0xFD, 0xF1,
+ 0xEF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0xC7, 0xBF, 0xFD,
+ 0xFF, 0xCF, 0x78, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x00,
+ 0x0F, 0x79, 0xFF, 0xDF, 0xFE, 0xF1, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE,
+ 0x0F, 0xF0, 0x7B, 0xC7, 0xDF, 0xFE, 0x7F, 0xF1, 0xF7, 0x80, 0x3C, 0x01,
+ 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0xF3, 0xF7, 0xFF, 0xF8, 0xF0, 0xF0,
+ 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x1F, 0x87, 0xFC, 0xFF, 0xEF,
+ 0x0F, 0xF8, 0x0F, 0xF0, 0x7F, 0xE0, 0xFF, 0x01, 0xFF, 0x0F, 0xFF, 0xE7,
+ 0xFE, 0x1F, 0x80, 0x79, 0xE7, 0xBF, 0xFD, 0xE7, 0x9E, 0x79, 0xE7, 0x9E,
+ 0x7D, 0xF3, 0xC0, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F,
+ 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x1F, 0xFF, 0xF7, 0xFF, 0x3E, 0xF0, 0xF0,
+ 0x7B, 0x83, 0x9E, 0x1C, 0xF1, 0xE3, 0x8E, 0x1C, 0x70, 0x77, 0x83, 0xB8,
+ 0x1D, 0xC0, 0x7E, 0x03, 0xE0, 0x1F, 0x00, 0x70, 0x00, 0xF0, 0xE1, 0xDC,
+ 0x78, 0x77, 0x1F, 0x3D, 0xE7, 0xCF, 0x79, 0xB3, 0x8E, 0x6C, 0xE3, 0xBB,
+ 0x38, 0xEE, 0xFC, 0x1F, 0x3F, 0x07, 0xC7, 0xC1, 0xF1, 0xF0, 0x7C, 0x78,
+ 0x0E, 0x1E, 0x00, 0x78, 0xF3, 0xC7, 0x8F, 0x78, 0x3B, 0x81, 0xFC, 0x07,
+ 0xC0, 0x1E, 0x01, 0xF0, 0x1F, 0xC0, 0xEF, 0x0F, 0x78, 0xF1, 0xE7, 0x87,
+ 0x00, 0xF0, 0x7B, 0x83, 0x9E, 0x1C, 0x71, 0xE3, 0x8E, 0x1E, 0x70, 0x73,
+ 0x83, 0xB8, 0x1F, 0xC0, 0x7E, 0x03, 0xE0, 0x0F, 0x00, 0x70, 0x03, 0x80,
+ 0x3C, 0x07, 0xC0, 0x3E, 0x01, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F,
+ 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0,
+ 0x1C, 0xF3, 0xCE, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0xBC, 0xF0, 0xE3, 0x8E,
+ 0x38, 0xE3, 0x8E, 0x3C, 0xF1, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0,
+ 0xE3, 0x8F, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x0F, 0x3D, 0xC7, 0x1C,
+ 0x71, 0xC7, 0x1C, 0xF3, 0xCE, 0x00, 0x78, 0x0F, 0xE0, 0xCF, 0x30, 0x7F,
+ 0x01, 0xE0 };
+
+const GFXglyph FreeSansBold12pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 7, 0, 1 }, // 0x20 ' '
+ { 0, 4, 17, 8, 3, -16 }, // 0x21 '!'
+ { 9, 10, 6, 11, 1, -17 }, // 0x22 '"'
+ { 17, 13, 16, 13, 0, -15 }, // 0x23 '#'
+ { 43, 13, 20, 13, 0, -17 }, // 0x24 '$'
+ { 76, 19, 17, 21, 1, -16 }, // 0x25 '%'
+ { 117, 16, 17, 17, 1, -16 }, // 0x26 '&'
+ { 151, 4, 6, 6, 1, -17 }, // 0x27 '''
+ { 154, 6, 22, 8, 1, -17 }, // 0x28 '('
+ { 171, 6, 22, 8, 1, -17 }, // 0x29 ')'
+ { 188, 7, 8, 9, 1, -17 }, // 0x2A '*'
+ { 195, 11, 11, 14, 2, -10 }, // 0x2B '+'
+ { 211, 4, 7, 6, 1, -2 }, // 0x2C ','
+ { 215, 6, 3, 8, 1, -7 }, // 0x2D '-'
+ { 218, 4, 3, 6, 1, -2 }, // 0x2E '.'
+ { 220, 6, 17, 7, 0, -16 }, // 0x2F '/'
+ { 233, 12, 17, 13, 1, -16 }, // 0x30 '0'
+ { 259, 7, 17, 14, 3, -16 }, // 0x31 '1'
+ { 274, 12, 17, 13, 1, -16 }, // 0x32 '2'
+ { 300, 12, 17, 13, 1, -16 }, // 0x33 '3'
+ { 326, 11, 17, 13, 1, -16 }, // 0x34 '4'
+ { 350, 12, 17, 13, 1, -16 }, // 0x35 '5'
+ { 376, 12, 17, 13, 1, -16 }, // 0x36 '6'
+ { 402, 11, 17, 13, 1, -16 }, // 0x37 '7'
+ { 426, 12, 17, 13, 1, -16 }, // 0x38 '8'
+ { 452, 12, 17, 13, 1, -16 }, // 0x39 '9'
+ { 478, 4, 12, 6, 1, -11 }, // 0x3A ':'
+ { 484, 4, 16, 6, 1, -11 }, // 0x3B ';'
+ { 492, 12, 12, 14, 1, -11 }, // 0x3C '<'
+ { 510, 12, 9, 14, 1, -9 }, // 0x3D '='
+ { 524, 12, 12, 14, 1, -11 }, // 0x3E '>'
+ { 542, 12, 18, 15, 2, -17 }, // 0x3F '?'
+ { 569, 21, 21, 23, 1, -17 }, // 0x40 '@'
+ { 625, 16, 18, 17, 0, -17 }, // 0x41 'A'
+ { 661, 14, 18, 17, 2, -17 }, // 0x42 'B'
+ { 693, 16, 18, 17, 1, -17 }, // 0x43 'C'
+ { 729, 15, 18, 17, 2, -17 }, // 0x44 'D'
+ { 763, 13, 18, 16, 2, -17 }, // 0x45 'E'
+ { 793, 12, 18, 15, 2, -17 }, // 0x46 'F'
+ { 820, 16, 18, 18, 1, -17 }, // 0x47 'G'
+ { 856, 14, 18, 18, 2, -17 }, // 0x48 'H'
+ { 888, 4, 18, 7, 2, -17 }, // 0x49 'I'
+ { 897, 11, 18, 14, 1, -17 }, // 0x4A 'J'
+ { 922, 16, 18, 17, 2, -17 }, // 0x4B 'K'
+ { 958, 11, 18, 15, 2, -17 }, // 0x4C 'L'
+ { 983, 17, 18, 21, 2, -17 }, // 0x4D 'M'
+ { 1022, 15, 18, 18, 2, -17 }, // 0x4E 'N'
+ { 1056, 17, 18, 19, 1, -17 }, // 0x4F 'O'
+ { 1095, 14, 18, 16, 2, -17 }, // 0x50 'P'
+ { 1127, 17, 19, 19, 1, -17 }, // 0x51 'Q'
+ { 1168, 16, 18, 17, 2, -17 }, // 0x52 'R'
+ { 1204, 15, 18, 16, 1, -17 }, // 0x53 'S'
+ { 1238, 12, 18, 15, 2, -17 }, // 0x54 'T'
+ { 1265, 14, 18, 18, 2, -17 }, // 0x55 'U'
+ { 1297, 15, 18, 16, 0, -17 }, // 0x56 'V'
+ { 1331, 23, 18, 23, 0, -17 }, // 0x57 'W'
+ { 1383, 15, 18, 16, 1, -17 }, // 0x58 'X'
+ { 1417, 16, 18, 15, 0, -17 }, // 0x59 'Y'
+ { 1453, 13, 18, 15, 1, -17 }, // 0x5A 'Z'
+ { 1483, 6, 23, 8, 2, -17 }, // 0x5B '['
+ { 1501, 7, 17, 7, 0, -16 }, // 0x5C '\'
+ { 1516, 6, 23, 8, 0, -17 }, // 0x5D ']'
+ { 1534, 12, 11, 14, 1, -16 }, // 0x5E '^'
+ { 1551, 15, 2, 13, -1, 4 }, // 0x5F '_'
+ { 1555, 4, 3, 6, 0, -17 }, // 0x60 '`'
+ { 1557, 13, 13, 14, 1, -12 }, // 0x61 'a'
+ { 1579, 13, 18, 15, 2, -17 }, // 0x62 'b'
+ { 1609, 12, 13, 13, 1, -12 }, // 0x63 'c'
+ { 1629, 13, 18, 15, 1, -17 }, // 0x64 'd'
+ { 1659, 13, 13, 14, 1, -12 }, // 0x65 'e'
+ { 1681, 7, 18, 8, 1, -17 }, // 0x66 'f'
+ { 1697, 13, 18, 15, 1, -12 }, // 0x67 'g'
+ { 1727, 12, 18, 14, 2, -17 }, // 0x68 'h'
+ { 1754, 4, 18, 7, 2, -17 }, // 0x69 'i'
+ { 1763, 6, 23, 7, 0, -17 }, // 0x6A 'j'
+ { 1781, 12, 18, 14, 2, -17 }, // 0x6B 'k'
+ { 1808, 4, 18, 6, 2, -17 }, // 0x6C 'l'
+ { 1817, 19, 13, 21, 2, -12 }, // 0x6D 'm'
+ { 1848, 12, 13, 15, 2, -12 }, // 0x6E 'n'
+ { 1868, 13, 13, 15, 1, -12 }, // 0x6F 'o'
+ { 1890, 13, 18, 15, 2, -12 }, // 0x70 'p'
+ { 1920, 13, 18, 15, 1, -12 }, // 0x71 'q'
+ { 1950, 8, 13, 9, 2, -12 }, // 0x72 'r'
+ { 1963, 12, 13, 13, 1, -12 }, // 0x73 's'
+ { 1983, 6, 15, 8, 1, -14 }, // 0x74 't'
+ { 1995, 12, 13, 15, 2, -12 }, // 0x75 'u'
+ { 2015, 13, 13, 13, 0, -12 }, // 0x76 'v'
+ { 2037, 18, 13, 19, 0, -12 }, // 0x77 'w'
+ { 2067, 13, 13, 13, 0, -12 }, // 0x78 'x'
+ { 2089, 13, 18, 13, 0, -12 }, // 0x79 'y'
+ { 2119, 10, 13, 12, 1, -12 }, // 0x7A 'z'
+ { 2136, 6, 23, 9, 1, -17 }, // 0x7B '{'
+ { 2154, 2, 22, 7, 2, -17 }, // 0x7C '|'
+ { 2160, 6, 23, 9, 3, -17 }, // 0x7D '}'
+ { 2178, 12, 5, 12, 0, -7 } }; // 0x7E '~'
+
+const GFXfont FreeSansBold12pt7b PROGMEM = {
+ (uint8_t *)FreeSansBold12pt7bBitmaps,
+ (GFXglyph *)FreeSansBold12pt7bGlyphs,
+ 0x20, 0x7E, 29 };
+
+// Approx. 2858 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBold18pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBold18pt7b.h
new file mode 100644
index 000000000000..d5927cde4479
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBold18pt7b.h
@@ -0,0 +1,481 @@
+const uint8_t FreeSansBold18pt7bBitmaps[] PROGMEM = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE7, 0x39, 0xCE, 0x73, 0x80,
+ 0x0F, 0xFF, 0xFF, 0xF8, 0xF8, 0xFF, 0xC7, 0xFE, 0x3F, 0xF1, 0xFF, 0x8F,
+ 0xFC, 0x7D, 0xC1, 0xCE, 0x0E, 0x70, 0x70, 0x03, 0xC3, 0x80, 0x3C, 0x78,
+ 0x03, 0xC7, 0x80, 0x38, 0x78, 0x07, 0x87, 0x07, 0xFF, 0xFF, 0x7F, 0xFF,
+ 0xF7, 0xFF, 0xFF, 0x7F, 0xFF, 0xF0, 0xF0, 0xE0, 0x0F, 0x0E, 0x00, 0xF1,
+ 0xE0, 0x0F, 0x1E, 0x00, 0xE1, 0xE0, 0xFF, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF,
+ 0xFF, 0xCF, 0xFF, 0xFC, 0x1C, 0x3C, 0x03, 0xC3, 0x80, 0x3C, 0x78, 0x03,
+ 0xC7, 0x80, 0x38, 0x78, 0x03, 0x87, 0x80, 0x00, 0x60, 0x00, 0x7F, 0x80,
+ 0x3F, 0xFC, 0x0F, 0xFF, 0xC3, 0xFF, 0xFC, 0xFC, 0xDF, 0x9F, 0x19, 0xFB,
+ 0xC3, 0x1F, 0x78, 0x63, 0xEF, 0x8C, 0x01, 0xFD, 0x80, 0x1F, 0xF0, 0x01,
+ 0xFF, 0xC0, 0x1F, 0xFE, 0x00, 0x7F, 0xE0, 0x03, 0xFE, 0x00, 0x67, 0xE0,
+ 0x0C, 0x7F, 0xE1, 0x8F, 0xFC, 0x31, 0xFF, 0xC6, 0x3E, 0xFC, 0xDF, 0x9F,
+ 0xFF, 0xF1, 0xFF, 0xFC, 0x0F, 0xFF, 0x00, 0x7F, 0x80, 0x01, 0x80, 0x00,
+ 0x30, 0x00, 0x06, 0x00, 0x0F, 0x00, 0x1C, 0x01, 0xFE, 0x00, 0xE0, 0x1F,
+ 0xF8, 0x0E, 0x00, 0xFF, 0xC0, 0x70, 0x0F, 0x0F, 0x07, 0x00, 0x70, 0x38,
+ 0x38, 0x03, 0x81, 0xC3, 0x80, 0x1C, 0x0E, 0x3C, 0x00, 0xF0, 0xF1, 0xC0,
+ 0x03, 0xFF, 0x1C, 0x00, 0x1F, 0xF8, 0xE0, 0x00, 0x7F, 0x8E, 0x00, 0x00,
+ 0xF0, 0x70, 0xF8, 0x00, 0x07, 0x1F, 0xF0, 0x00, 0x39, 0xFF, 0xC0, 0x03,
+ 0x8F, 0xFE, 0x00, 0x1C, 0xF0, 0x78, 0x01, 0xC7, 0x01, 0xC0, 0x0C, 0x38,
+ 0x0E, 0x00, 0xE1, 0xC0, 0x70, 0x06, 0x0F, 0x07, 0x80, 0x70, 0x3F, 0xF8,
+ 0x07, 0x01, 0xFF, 0xC0, 0x38, 0x07, 0xFC, 0x03, 0x80, 0x0F, 0x80, 0x01,
+ 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0xC0, 0x03, 0xFF, 0x80, 0x1F, 0x1E,
+ 0x00, 0x7C, 0x78, 0x01, 0xF1, 0xE0, 0x07, 0xE7, 0x80, 0x0F, 0xBC, 0x00,
+ 0x1F, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0xF0, 0xF0, 0xFF,
+ 0xE3, 0xC7, 0xE7, 0xCF, 0x3F, 0x0F, 0xF8, 0xF8, 0x3F, 0xE3, 0xE0, 0x7F,
+ 0x8F, 0x80, 0xFC, 0x3F, 0x03, 0xF0, 0x7E, 0x3F, 0xE1, 0xFF, 0xFF, 0x83,
+ 0xFF, 0xFF, 0x07, 0xFE, 0x7E, 0x07, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFD,
+ 0xCE, 0x70, 0x07, 0x87, 0x83, 0xC3, 0xC1, 0xE1, 0xE0, 0xF0, 0x78, 0x78,
+ 0x3C, 0x1E, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E,
+ 0x0F, 0x03, 0x81, 0xE0, 0xF0, 0x78, 0x1E, 0x0F, 0x03, 0x81, 0xE0, 0x70,
+ 0x3C, 0x0E, 0x07, 0x80, 0xF0, 0x38, 0x1E, 0x07, 0x83, 0xC0, 0xF0, 0x78,
+ 0x3C, 0x0F, 0x07, 0x83, 0xC0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83,
+ 0xC1, 0xE0, 0xF0, 0x78, 0x78, 0x3C, 0x1E, 0x0F, 0x0F, 0x07, 0x87, 0x83,
+ 0xC1, 0xC1, 0xE0, 0xE0, 0xF0, 0x00, 0x06, 0x00, 0x60, 0x06, 0x07, 0x6E,
+ 0x7F, 0xE3, 0xFC, 0x0F, 0x01, 0xF8, 0x1F, 0x83, 0x9C, 0x10, 0x80, 0x03,
+ 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xC0, 0x03, 0xC0, 0x03,
+ 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0x8C, 0x63,
+ 0x37, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x80, 0x01,
+ 0x81, 0xC0, 0xC0, 0x60, 0x70, 0x38, 0x18, 0x0C, 0x0E, 0x06, 0x03, 0x01,
+ 0x81, 0xC0, 0xC0, 0x60, 0x30, 0x38, 0x18, 0x0C, 0x0E, 0x07, 0x03, 0x01,
+ 0x81, 0xC0, 0xC0, 0x00, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x87, 0xFF,
+ 0xC7, 0xE3, 0xF3, 0xE0, 0xF9, 0xF0, 0x7D, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC,
+ 0x07, 0xFE, 0x03, 0xFF, 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F,
+ 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xDF, 0x07, 0xCF, 0x83, 0xE7, 0xE3,
+ 0xF1, 0xFF, 0xF0, 0xFF, 0xF8, 0x3F, 0xF8, 0x07, 0xF0, 0x00, 0x01, 0xC0,
+ 0xF0, 0x3C, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xC1, 0xF0, 0x7C,
+ 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07,
+ 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC0, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF,
+ 0x8F, 0xFF, 0xE7, 0xE3, 0xF7, 0xE0, 0xFF, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8,
+ 0x0F, 0x80, 0x07, 0xC0, 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xF0, 0x03, 0xF0,
+ 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xC0, 0x07, 0xC0,
+ 0x03, 0xE0, 0x03, 0xFF, 0xFD, 0xFF, 0xFE, 0xFF, 0xFF, 0x7F, 0xFF, 0x80,
+ 0x07, 0xE0, 0x0F, 0xFC, 0x0F, 0xFF, 0x0F, 0xFF, 0xCF, 0xC3, 0xF7, 0xC0,
+ 0xFB, 0xE0, 0x7D, 0xF0, 0x3E, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x0F, 0x80,
+ 0x3F, 0x80, 0x1F, 0xC0, 0x0F, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F,
+ 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x83, 0xF7, 0xC3, 0xF3, 0xFF, 0xF8, 0xFF,
+ 0xF8, 0x3F, 0xF8, 0x07, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0xFC, 0x01, 0xFC,
+ 0x01, 0xFC, 0x03, 0xFC, 0x07, 0x7C, 0x07, 0x7C, 0x0E, 0x7C, 0x0E, 0x7C,
+ 0x1C, 0x7C, 0x18, 0x7C, 0x38, 0x7C, 0x70, 0x7C, 0x60, 0x7C, 0xE0, 0x7C,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7C, 0x00, 0x7C,
+ 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x7C, 0x1F, 0xFF, 0x0F, 0xFF,
+ 0x8F, 0xFF, 0xC7, 0xFF, 0xE3, 0xC0, 0x01, 0xE0, 0x00, 0xE0, 0x00, 0x70,
+ 0x00, 0x79, 0xF0, 0x3F, 0xFE, 0x1F, 0xFF, 0x8F, 0xFF, 0xE7, 0xC3, 0xF0,
+ 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xFE, 0x03,
+ 0xFF, 0x03, 0xFF, 0xC3, 0xF3, 0xFF, 0xF1, 0xFF, 0xF8, 0x3F, 0xF0, 0x07,
+ 0xE0, 0x00, 0x03, 0xF8, 0x03, 0xFF, 0x81, 0xFF, 0xF0, 0xFF, 0xFE, 0x3E,
+ 0x1F, 0x9F, 0x03, 0xE7, 0xC0, 0x03, 0xE0, 0x00, 0xF8, 0xF8, 0x3E, 0xFF,
+ 0x8F, 0xFF, 0xF3, 0xFF, 0xFE, 0xFE, 0x1F, 0xBF, 0x03, 0xFF, 0x80, 0x7F,
+ 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xF7, 0x80, 0x7D, 0xF0, 0x3E, 0x7E,
+ 0x1F, 0x8F, 0xFF, 0xC1, 0xFF, 0xF0, 0x3F, 0xF0, 0x03, 0xF0, 0x00, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xF0, 0x00, 0xF8,
+ 0x00, 0xF8, 0x00, 0x78, 0x00, 0x7C, 0x00, 0x3C, 0x00, 0x3E, 0x00, 0x1E,
+ 0x00, 0x1F, 0x00, 0x0F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xC0, 0x03,
+ 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x78, 0x00, 0x7C, 0x00, 0x3E, 0x00,
+ 0x1F, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xE0, 0x07, 0xFC, 0x0F, 0xFF, 0x07,
+ 0xFF, 0xC7, 0xC3, 0xF3, 0xC0, 0xF9, 0xE0, 0x3C, 0xF0, 0x1E, 0x78, 0x1F,
+ 0x1E, 0x1F, 0x07, 0xFF, 0x01, 0xFF, 0x03, 0xFF, 0xE3, 0xF1, 0xF9, 0xF0,
+ 0x7D, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x83, 0xF7,
+ 0xC3, 0xF3, 0xFF, 0xF8, 0xFF, 0xF8, 0x3F, 0xF8, 0x07, 0xF0, 0x00, 0x07,
+ 0xE0, 0x0F, 0xFC, 0x0F, 0xFF, 0x0F, 0xFF, 0xC7, 0xE3, 0xF7, 0xE0, 0xFB,
+ 0xE0, 0x3D, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x83,
+ 0xF7, 0xE3, 0xFB, 0xFF, 0xFC, 0xFF, 0xFE, 0x3F, 0xDF, 0x07, 0xCF, 0x80,
+ 0x07, 0x80, 0x03, 0xDF, 0x03, 0xE7, 0xC3, 0xE3, 0xFF, 0xF0, 0xFF, 0xF0,
+ 0x3F, 0xF0, 0x07, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00,
+ 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00,
+ 0x00, 0x7F, 0xFF, 0xFF, 0xC6, 0x33, 0x9B, 0xD8, 0x00, 0x00, 0xC0, 0x00,
+ 0xF0, 0x01, 0xFC, 0x03, 0xFF, 0x03, 0xFF, 0x07, 0xFE, 0x0F, 0xFC, 0x03,
+ 0xF8, 0x00, 0xF0, 0x00, 0x3F, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0xE0, 0x07,
+ 0xFF, 0x00, 0x3F, 0xF0, 0x01, 0xFC, 0x00, 0x1F, 0x00, 0x00, 0xC0, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xF0, 0xC0, 0x00, 0x3C, 0x00, 0x0F, 0xE0, 0x03, 0xFF, 0x00, 0x3F, 0xF0,
+ 0x01, 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0x00, 0x03, 0xC0, 0x07, 0xF0,
+ 0x0F, 0xFC, 0x1F, 0xF8, 0x3F, 0xF8, 0x3F, 0xF0, 0x0F, 0xE0, 0x03, 0xC0,
+ 0x00, 0xC0, 0x00, 0x00, 0x07, 0xF0, 0x07, 0xFF, 0x03, 0xFF, 0xF1, 0xFF,
+ 0xFC, 0x7E, 0x3F, 0xBF, 0x03, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07,
+ 0xC0, 0x03, 0xF0, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x80,
+ 0x1F, 0xC0, 0x07, 0xC0, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0,
+ 0x00, 0xF8, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0xC0, 0x01, 0xF8, 0x07, 0xF0, 0x03, 0xE0, 0x01, 0xF8, 0x07,
+ 0x80, 0x00, 0x7C, 0x0F, 0x00, 0x00, 0x3C, 0x1E, 0x03, 0xE3, 0x9E, 0x3C,
+ 0x0F, 0xF7, 0x8E, 0x38, 0x1F, 0xFF, 0x0E, 0x78, 0x3E, 0x1F, 0x07, 0x70,
+ 0x38, 0x0F, 0x07, 0x70, 0x78, 0x0F, 0x07, 0xE0, 0x70, 0x0E, 0x07, 0xE0,
+ 0x70, 0x0E, 0x07, 0xE0, 0xE0, 0x0E, 0x07, 0xE0, 0xE0, 0x1E, 0x0F, 0xE0,
+ 0xE0, 0x1C, 0x0E, 0xE0, 0xE0, 0x3C, 0x1E, 0xE0, 0xF0, 0x3C, 0x3C, 0xF0,
+ 0xF0, 0xFC, 0x7C, 0x70, 0x7F, 0xFF, 0xF8, 0x78, 0x3F, 0xCF, 0xF0, 0x3C,
+ 0x1F, 0x07, 0xC0, 0x3E, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x0F,
+ 0xC0, 0x01, 0x00, 0x07, 0xF0, 0x0F, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7F,
+ 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0x01, 0xFF,
+ 0x80, 0x01, 0xFF, 0x80, 0x01, 0xF7, 0xC0, 0x03, 0xE7, 0xC0, 0x03, 0xE7,
+ 0xC0, 0x03, 0xE3, 0xE0, 0x07, 0xC3, 0xE0, 0x07, 0xC3, 0xE0, 0x07, 0xC1,
+ 0xF0, 0x0F, 0x81, 0xF0, 0x0F, 0x81, 0xF0, 0x0F, 0xFF, 0xF8, 0x1F, 0xFF,
+ 0xF8, 0x1F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFC, 0x3E, 0x00, 0x7C, 0x3E, 0x00,
+ 0x7E, 0x3E, 0x00, 0x3E, 0x7C, 0x00, 0x3E, 0x7C, 0x00, 0x3F, 0x7C, 0x00,
+ 0x1F, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0xF8,
+ 0x07, 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xEF,
+ 0x80, 0x3E, 0xF8, 0x07, 0xCF, 0xFF, 0xF8, 0xFF, 0xFF, 0x0F, 0xFF, 0xF8,
+ 0xFF, 0xFF, 0xCF, 0x80, 0x7E, 0xF8, 0x01, 0xEF, 0x80, 0x1F, 0xF8, 0x01,
+ 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x3E, 0xFF, 0xFF, 0xEF, 0xFF,
+ 0xFC, 0xFF, 0xFF, 0x8F, 0xFF, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xFF, 0x80,
+ 0x3F, 0xFF, 0xC0, 0xFF, 0xFF, 0xC3, 0xF8, 0x1F, 0x87, 0xE0, 0x1F, 0x9F,
+ 0x80, 0x1F, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3F, 0xF0, 0x00, 0x03, 0xE0,
+ 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00,
+ 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x7D, 0xF0, 0x00,
+ 0xFB, 0xF0, 0x03, 0xF3, 0xF0, 0x0F, 0xC7, 0xF0, 0x3F, 0x87, 0xFF, 0xFE,
+ 0x07, 0xFF, 0xF8, 0x03, 0xFF, 0xC0, 0x01, 0xFE, 0x00, 0xFF, 0xFC, 0x07,
+ 0xFF, 0xF8, 0x3F, 0xFF, 0xE1, 0xFF, 0xFF, 0x8F, 0x80, 0xFE, 0x7C, 0x01,
+ 0xF3, 0xE0, 0x07, 0xDF, 0x00, 0x3E, 0xF8, 0x01, 0xF7, 0xC0, 0x07, 0xFE,
+ 0x00, 0x3F, 0xF0, 0x01, 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0xE0, 0x03,
+ 0xFF, 0x00, 0x1F, 0xF8, 0x00, 0xFF, 0xC0, 0x0F, 0xFE, 0x00, 0x7D, 0xF0,
+ 0x03, 0xEF, 0x80, 0x3E, 0x7C, 0x07, 0xF3, 0xFF, 0xFF, 0x1F, 0xFF, 0xF0,
+ 0xFF, 0xFF, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xDF, 0xFF, 0xFB, 0xFF,
+ 0xFF, 0x7F, 0xFF, 0xEF, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0,
+ 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7F, 0xFF, 0xCF, 0xFF,
+ 0xF9, 0xFF, 0xFF, 0x3F, 0xFF, 0xE7, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00,
+ 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3F, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0,
+ 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0xFF, 0xEF, 0xFF, 0xF7,
+ 0xFF, 0xFB, 0xFF, 0xFD, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00,
+ 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8,
+ 0x00, 0x7C, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x03, 0xFF, 0xE0, 0x07, 0xFF,
+ 0xF8, 0x0F, 0xFF, 0xFC, 0x1F, 0xC0, 0xFE, 0x3F, 0x00, 0x7E, 0x7E, 0x00,
+ 0x3F, 0x7C, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00,
+ 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x03, 0xFF, 0xF8, 0x03, 0xFF, 0xF8, 0x03,
+ 0xFF, 0xF8, 0x03, 0xFF, 0xFC, 0x00, 0x0F, 0x7C, 0x00, 0x1F, 0x7C, 0x00,
+ 0x1F, 0x7E, 0x00, 0x3F, 0x3F, 0x00, 0x7F, 0x1F, 0xC1, 0xFF, 0x0F, 0xFF,
+ 0xFF, 0x07, 0xFF, 0xE7, 0x03, 0xFF, 0xC7, 0x00, 0xFF, 0x07, 0xF8, 0x01,
+ 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80,
+ 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x01, 0xFF,
+ 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F,
+ 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01,
+ 0xFF, 0x80, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x1F, 0x00, 0x1F,
+ 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F,
+ 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F,
+ 0x00, 0x1F, 0x00, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F,
+ 0xF8, 0x1F, 0xFC, 0x3F, 0x7F, 0xFE, 0x3F, 0xFC, 0x1F, 0xF8, 0x07, 0xE0,
+ 0xF8, 0x01, 0xFB, 0xE0, 0x0F, 0xCF, 0x80, 0x7E, 0x3E, 0x03, 0xF0, 0xF8,
+ 0x1F, 0x83, 0xE0, 0xFC, 0x0F, 0x87, 0xE0, 0x3E, 0x3F, 0x00, 0xF8, 0xF8,
+ 0x03, 0xE7, 0xE0, 0x0F, 0xBF, 0x00, 0x3F, 0xF8, 0x00, 0xFF, 0xF0, 0x03,
+ 0xFF, 0xE0, 0x0F, 0xFF, 0x80, 0x3F, 0xBF, 0x00, 0xFC, 0x7E, 0x03, 0xE0,
+ 0xFC, 0x0F, 0x81, 0xF8, 0x3E, 0x07, 0xE0, 0xF8, 0x0F, 0xC3, 0xE0, 0x1F,
+ 0x8F, 0x80, 0x7F, 0x3E, 0x00, 0xFC, 0xF8, 0x01, 0xFB, 0xE0, 0x03, 0xF0,
+ 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0,
+ 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F,
+ 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00,
+ 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0x00, 0xFF, 0xFF,
+ 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0x81, 0xFF, 0xFF,
+ 0x81, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0x81, 0xFF, 0xFB, 0xC3, 0xDF, 0xFB,
+ 0xC3, 0xDF, 0xFB, 0xC3, 0xDF, 0xFB, 0xC3, 0xDF, 0xF9, 0xC7, 0xDF, 0xF9,
+ 0xE7, 0x9F, 0xF9, 0xE7, 0x9F, 0xF9, 0xE7, 0x9F, 0xF9, 0xE7, 0x9F, 0xF8,
+ 0xFF, 0x1F, 0xF8, 0xFF, 0x1F, 0xF8, 0xFF, 0x1F, 0xF8, 0xFF, 0x1F, 0xF8,
+ 0x7F, 0x1F, 0xF8, 0x7E, 0x1F, 0xF8, 0x7E, 0x1F, 0xF8, 0x7E, 0x1F, 0xF8,
+ 0x3E, 0x1F, 0xF8, 0x01, 0xFF, 0xC0, 0x1F, 0xFE, 0x01, 0xFF, 0xE0, 0x1F,
+ 0xFF, 0x01, 0xFF, 0xF0, 0x1F, 0xFF, 0x81, 0xFF, 0xF8, 0x1F, 0xFF, 0xC1,
+ 0xFF, 0xBC, 0x1F, 0xFB, 0xE1, 0xFF, 0x9F, 0x1F, 0xF9, 0xF1, 0xFF, 0x8F,
+ 0x9F, 0xF8, 0x79, 0xFF, 0x87, 0xDF, 0xF8, 0x3D, 0xFF, 0x83, 0xFF, 0xF8,
+ 0x1F, 0xFF, 0x81, 0xFF, 0xF8, 0x0F, 0xFF, 0x80, 0xFF, 0xF8, 0x07, 0xFF,
+ 0x80, 0x3F, 0xF8, 0x03, 0xFF, 0x80, 0x1F, 0x00, 0x7F, 0x00, 0x01, 0xFF,
+ 0xF0, 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x01, 0xFC, 0x1F, 0xC1, 0xF8,
+ 0x03, 0xF1, 0xF8, 0x00, 0xFC, 0xF8, 0x00, 0x3E, 0x7C, 0x00, 0x1F, 0x7C,
+ 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x00, 0xFF,
+ 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xF0, 0x00, 0x1F, 0xF8, 0x00, 0x0F,
+ 0xBE, 0x00, 0x0F, 0x9F, 0x00, 0x07, 0xCF, 0xC0, 0x07, 0xE3, 0xF0, 0x07,
+ 0xE0, 0xFE, 0x0F, 0xE0, 0x7F, 0xFF, 0xE0, 0x0F, 0xFF, 0xE0, 0x03, 0xFF,
+ 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFF, 0xFC, 0x1F, 0xFF, 0xE3, 0xFF, 0xFE,
+ 0x7F, 0xFF, 0xEF, 0x80, 0xFF, 0xF0, 0x0F, 0xFE, 0x00, 0xFF, 0xC0, 0x1F,
+ 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x1F, 0xFC, 0x07, 0xEF, 0xFF, 0xFD,
+ 0xFF, 0xFF, 0x3F, 0xFF, 0xC7, 0xFF, 0xE0, 0xF8, 0x00, 0x1F, 0x00, 0x03,
+ 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07,
+ 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0xFF,
+ 0xF0, 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x01, 0xFC, 0x1F, 0xC1, 0xF8,
+ 0x03, 0xF1, 0xF8, 0x00, 0xFC, 0xF8, 0x00, 0x3E, 0x7C, 0x00, 0x1F, 0x7C,
+ 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x00, 0xFF,
+ 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xF0, 0x00, 0x1F, 0xF8, 0x01, 0x0F,
+ 0xBE, 0x01, 0xCF, 0x9F, 0x01, 0xFF, 0xCF, 0xC0, 0x7F, 0xE3, 0xF0, 0x1F,
+ 0xE0, 0xFE, 0x0F, 0xF0, 0x7F, 0xFF, 0xF8, 0x0F, 0xFF, 0xFE, 0x03, 0xFF,
+ 0xEF, 0x80, 0x3F, 0xC3, 0x80, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x07, 0xFF,
+ 0xFE, 0x3F, 0xFF, 0xF9, 0xFF, 0xFF, 0xCF, 0x80, 0x3F, 0x7C, 0x00, 0xFB,
+ 0xE0, 0x07, 0xDF, 0x00, 0x3E, 0xF8, 0x01, 0xF7, 0xC0, 0x0F, 0x3E, 0x00,
+ 0xF9, 0xFF, 0xFF, 0x8F, 0xFF, 0xF8, 0x7F, 0xFF, 0xC3, 0xFF, 0xFF, 0x1F,
+ 0x00, 0xFC, 0xF8, 0x03, 0xE7, 0xC0, 0x1F, 0x3E, 0x00, 0xF9, 0xF0, 0x07,
+ 0xCF, 0x80, 0x3E, 0x7C, 0x01, 0xF3, 0xE0, 0x0F, 0x9F, 0x00, 0x7C, 0xF8,
+ 0x03, 0xF7, 0xC0, 0x0F, 0xC0, 0x07, 0xF8, 0x01, 0xFF, 0xF0, 0x3F, 0xFF,
+ 0x87, 0xFF, 0xFC, 0x7E, 0x0F, 0xCF, 0xC0, 0x7E, 0xF8, 0x03, 0xEF, 0x80,
+ 0x3E, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0x00, 0x07, 0xFF, 0xC0, 0x3F,
+ 0xFF, 0x81, 0xFF, 0xFC, 0x03, 0xFF, 0xE0, 0x01, 0xFF, 0x00, 0x03, 0xF0,
+ 0x00, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xFC, 0x03, 0xFF, 0xE0, 0x7E,
+ 0x7F, 0xFF, 0xE3, 0xFF, 0xFC, 0x1F, 0xFF, 0x00, 0x3F, 0xC0, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x1F, 0x00, 0x03, 0xE0,
+ 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0,
+ 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80,
+ 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00,
+ 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00,
+ 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01,
+ 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80,
+ 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8,
+ 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF,
+ 0x80, 0x1F, 0x7C, 0x03, 0xE7, 0xE0, 0x7E, 0x3F, 0xFF, 0xC3, 0xFF, 0xFC,
+ 0x0F, 0xFF, 0x00, 0x3F, 0xC0, 0xF8, 0x00, 0xFB, 0xE0, 0x03, 0xE7, 0xC0,
+ 0x1F, 0x9F, 0x00, 0x7C, 0x7C, 0x01, 0xF0, 0xF8, 0x07, 0xC3, 0xE0, 0x3E,
+ 0x0F, 0x80, 0xF8, 0x1E, 0x03, 0xE0, 0x7C, 0x1F, 0x01, 0xF0, 0x7C, 0x03,
+ 0xC1, 0xF0, 0x0F, 0x87, 0x80, 0x3E, 0x3E, 0x00, 0xF8, 0xF8, 0x01, 0xE3,
+ 0xC0, 0x07, 0xCF, 0x00, 0x1F, 0x7C, 0x00, 0x3D, 0xE0, 0x00, 0xFF, 0x80,
+ 0x03, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x00,
+ 0xF8, 0x00, 0x03, 0xE0, 0x00, 0xF8, 0x07, 0xC0, 0x3F, 0xF8, 0x07, 0xE0,
+ 0x3E, 0xFC, 0x07, 0xE0, 0x3E, 0x7C, 0x0F, 0xE0, 0x3E, 0x7C, 0x0F, 0xE0,
+ 0x7E, 0x7C, 0x0F, 0xE0, 0x7C, 0x7C, 0x0F, 0xF0, 0x7C, 0x3E, 0x0F, 0xF0,
+ 0x7C, 0x3E, 0x1E, 0xF0, 0x78, 0x3E, 0x1E, 0x70, 0xF8, 0x1E, 0x1E, 0x70,
+ 0xF8, 0x1E, 0x1E, 0x78, 0xF8, 0x1F, 0x1E, 0x78, 0xF0, 0x1F, 0x3C, 0x78,
+ 0xF0, 0x0F, 0x3C, 0x39, 0xF0, 0x0F, 0x3C, 0x3D, 0xF0, 0x0F, 0x3C, 0x3D,
+ 0xE0, 0x0F, 0xBC, 0x3D, 0xE0, 0x07, 0xF8, 0x3D, 0xE0, 0x07, 0xF8, 0x1F,
+ 0xE0, 0x07, 0xF8, 0x1F, 0xC0, 0x03, 0xF8, 0x1F, 0xC0, 0x03, 0xF8, 0x1F,
+ 0xC0, 0x03, 0xF0, 0x0F, 0x80, 0x03, 0xF0, 0x0F, 0x80, 0x01, 0xF0, 0x0F,
+ 0x80, 0xFE, 0x01, 0xF9, 0xF8, 0x07, 0xE3, 0xF0, 0x3F, 0x0F, 0xC0, 0xF8,
+ 0x1F, 0x87, 0xE0, 0x7E, 0x3F, 0x00, 0xFC, 0xFC, 0x01, 0xF7, 0xE0, 0x07,
+ 0xFF, 0x00, 0x0F, 0xFC, 0x00, 0x3F, 0xE0, 0x00, 0x7F, 0x00, 0x00, 0xFC,
+ 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0x80, 0x03, 0xFF, 0x00,
+ 0x1F, 0x7E, 0x00, 0xFC, 0xF8, 0x03, 0xE3, 0xF0, 0x1F, 0x87, 0xC0, 0x7C,
+ 0x1F, 0x83, 0xF0, 0x3F, 0x1F, 0x80, 0xFC, 0x7E, 0x01, 0xFB, 0xF0, 0x07,
+ 0xF0, 0xFC, 0x01, 0xFF, 0xE0, 0x0F, 0x9F, 0x00, 0xFC, 0xFC, 0x07, 0xC3,
+ 0xE0, 0x7E, 0x1F, 0x83, 0xE0, 0x7C, 0x1F, 0x03, 0xF1, 0xF0, 0x0F, 0x8F,
+ 0x80, 0x7E, 0xF8, 0x01, 0xF7, 0xC0, 0x0F, 0xFC, 0x00, 0x3F, 0xE0, 0x00,
+ 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0,
+ 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x03,
+ 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x7E, 0x00, 0x1F,
+ 0x80, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF8,
+ 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x00,
+ 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01,
+ 0xFC, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
+ 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
+ 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x38, 0x06,
+ 0x01, 0x80, 0x70, 0x0C, 0x03, 0x00, 0xE0, 0x18, 0x06, 0x01, 0xC0, 0x30,
+ 0x0C, 0x03, 0x00, 0xE0, 0x18, 0x06, 0x01, 0xC0, 0x30, 0x0C, 0x03, 0x80,
+ 0x60, 0x18, 0x07, 0x01, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0x1F,
+ 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F,
+ 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x03, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x0F, 0xF0, 0x0F, 0xF0,
+ 0x0F, 0x78, 0x1E, 0x78, 0x1E, 0x78, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x1E,
+ 0x78, 0x1E, 0x78, 0x1E, 0x70, 0x0F, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xF0, 0xF0, 0xE0, 0xE0, 0x07, 0xF8, 0x07,
+ 0xFF, 0x83, 0xFF, 0xF1, 0xFF, 0xFE, 0x7C, 0x1F, 0xBE, 0x03, 0xE0, 0x00,
+ 0xF8, 0x01, 0xFE, 0x0F, 0xFF, 0x8F, 0xFF, 0xE7, 0xF8, 0xFB, 0xF0, 0x3E,
+ 0xF8, 0x0F, 0xBE, 0x07, 0xEF, 0xC3, 0xFB, 0xFF, 0xFE, 0x7F, 0xFF, 0x8F,
+ 0xFB, 0xF1, 0xF8, 0xFC, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0,
+ 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE7, 0xE0, 0xFB, 0xFC,
+ 0x3F, 0xFF, 0xCF, 0xFF, 0xF3, 0xF8, 0x7E, 0xFC, 0x0F, 0xBF, 0x03, 0xFF,
+ 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xF0,
+ 0x3F, 0xFC, 0x0F, 0xBF, 0x87, 0xEF, 0xFF, 0xF3, 0xFF, 0xFC, 0xFB, 0xFC,
+ 0x3E, 0x7E, 0x00, 0x03, 0xF0, 0x07, 0xFE, 0x0F, 0xFF, 0x87, 0xFF, 0xE7,
+ 0xE1, 0xFB, 0xE0, 0x7F, 0xE0, 0x3F, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00,
+ 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0xFB, 0xE0, 0x7D, 0xF8, 0x7E, 0x7F,
+ 0xFE, 0x3F, 0xFE, 0x0F, 0xFE, 0x00, 0xFC, 0x00, 0x00, 0x03, 0xE0, 0x00,
+ 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00,
+ 0xF8, 0x1F, 0x1F, 0x0F, 0xFB, 0xE3, 0xFF, 0xFC, 0xFF, 0xFF, 0xBF, 0x8F,
+ 0xF7, 0xC0, 0x7F, 0xF8, 0x0F, 0xFE, 0x00, 0xFF, 0xC0, 0x1F, 0xF8, 0x03,
+ 0xFF, 0x00, 0x7F, 0xE0, 0x0F, 0xFE, 0x03, 0xF7, 0xC0, 0x7E, 0xFC, 0x3F,
+ 0xCF, 0xFF, 0xF8, 0xFF, 0xFF, 0x0F, 0xFB, 0xE0, 0xFC, 0x7C, 0x07, 0xE0,
+ 0x07, 0xFE, 0x03, 0xFF, 0xE0, 0xFF, 0xF8, 0x7E, 0x1F, 0x1F, 0x03, 0xCF,
+ 0x80, 0xFB, 0xE0, 0x1E, 0xFF, 0xFF, 0xBF, 0xFF, 0xEF, 0xFF, 0xFB, 0xE0,
+ 0x00, 0xF8, 0x00, 0x3F, 0x03, 0xE7, 0xE1, 0xF9, 0xFF, 0xFC, 0x3F, 0xFE,
+ 0x07, 0xFF, 0x00, 0x7F, 0x00, 0x0F, 0xC7, 0xF3, 0xFC, 0xFF, 0x3E, 0x0F,
+ 0x83, 0xE3, 0xFE, 0xFF, 0xBF, 0xE3, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0,
+ 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E,
+ 0x0F, 0x80, 0x07, 0xC7, 0xC3, 0xFD, 0xF3, 0xFF, 0xFC, 0xFF, 0xFF, 0x7E,
+ 0x1F, 0xDF, 0x03, 0xFF, 0xC0, 0xFF, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01,
+ 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xFC, 0x0F, 0xDF, 0x03, 0xF7, 0xE1, 0xFD,
+ 0xFF, 0xFF, 0x3F, 0xFF, 0xC7, 0xFD, 0xF0, 0x7C, 0x7C, 0x00, 0x1F, 0x00,
+ 0x07, 0xFF, 0x03, 0xF7, 0xE1, 0xF9, 0xFF, 0xFC, 0x3F, 0xFE, 0x01, 0xFE,
+ 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07,
+ 0xC0, 0x03, 0xE0, 0x01, 0xF1, 0xF0, 0xFB, 0xFE, 0x7F, 0xFF, 0xBF, 0xFF,
+ 0xDF, 0xC3, 0xFF, 0xC0, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8,
+ 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0x7F,
+ 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xC0, 0xFF, 0xFF, 0xF0,
+ 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xC0, 0x3E, 0x7C, 0xF9, 0xF0, 0x00, 0x00, 0x1F, 0x3E, 0x7C, 0xF9,
+ 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E,
+ 0x7C, 0xF9, 0xF3, 0xFF, 0xFF, 0xFE, 0xF8, 0xF8, 0x00, 0x7C, 0x00, 0x3E,
+ 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x3E,
+ 0xF8, 0x3E, 0x7C, 0x3F, 0x3E, 0x3F, 0x1F, 0x3F, 0x0F, 0x9F, 0x07, 0xDF,
+ 0x03, 0xFF, 0x81, 0xFF, 0xC0, 0xFF, 0xF0, 0x7F, 0xF8, 0x3F, 0x7E, 0x1F,
+ 0x1F, 0x0F, 0x87, 0xC7, 0xC3, 0xF3, 0xE0, 0xF9, 0xF0, 0x7E, 0xF8, 0x1F,
+ 0x7C, 0x0F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF8, 0xF8, 0x3F, 0x1F,
+ 0x7F, 0x9F, 0xF3, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xC3, 0xF8,
+ 0x7F, 0xF8, 0x3F, 0x07, 0xFE, 0x07, 0xC0, 0xFF, 0xC0, 0xF8, 0x1F, 0xF8,
+ 0x1F, 0x03, 0xFF, 0x03, 0xE0, 0x7F, 0xE0, 0x7C, 0x0F, 0xFC, 0x0F, 0x81,
+ 0xFF, 0x81, 0xF0, 0x3F, 0xF0, 0x3E, 0x07, 0xFE, 0x07, 0xC0, 0xFF, 0xC0,
+ 0xF8, 0x1F, 0xF8, 0x1F, 0x03, 0xFF, 0x03, 0xE0, 0x7F, 0xE0, 0x7C, 0x0F,
+ 0x80, 0xF8, 0xF8, 0x7D, 0xFF, 0x3F, 0xFF, 0xDF, 0xFF, 0xEF, 0xE1, 0xFF,
+ 0xE0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03,
+ 0xFF, 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8,
+ 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xE0, 0x03, 0xF8, 0x01, 0xFF, 0xC0, 0x7F,
+ 0xFC, 0x1F, 0xFF, 0xC7, 0xF0, 0xFC, 0xF8, 0x0F, 0xBF, 0x01, 0xFF, 0xC0,
+ 0x1F, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0xC0,
+ 0x7E, 0xF8, 0x0F, 0x9F, 0x87, 0xF1, 0xFF, 0xFC, 0x1F, 0xFF, 0x01, 0xFF,
+ 0xC0, 0x0F, 0xE0, 0x00, 0xF8, 0xF8, 0x3E, 0xFF, 0x8F, 0xFF, 0xF3, 0xFF,
+ 0xFC, 0xFE, 0x1F, 0xBF, 0x03, 0xEF, 0xC0, 0xFF, 0xE0, 0x1F, 0xF8, 0x07,
+ 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xFC, 0x0F, 0xFF, 0x03, 0xEF,
+ 0xE1, 0xFB, 0xFF, 0xFC, 0xFF, 0xFF, 0x3E, 0xFF, 0x0F, 0x8F, 0x83, 0xE0,
+ 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00,
+ 0x3E, 0x00, 0x00, 0x07, 0xE3, 0xE1, 0xFF, 0x7C, 0x7F, 0xFF, 0x9F, 0xFF,
+ 0xF7, 0xF1, 0xFE, 0xF8, 0x0F, 0xFF, 0x01, 0xFF, 0xC0, 0x1F, 0xF8, 0x03,
+ 0xFF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0xC0, 0x7E, 0xF8, 0x0F,
+ 0xDF, 0x83, 0xF9, 0xFF, 0xFF, 0x3F, 0xFF, 0xE1, 0xFF, 0x7C, 0x1F, 0x8F,
+ 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F,
+ 0x00, 0x03, 0xE0, 0x00, 0x7C, 0xF8, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xE1,
+ 0xF8, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0,
+ 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x00, 0x07, 0xF0, 0x0F, 0xFE,
+ 0x0F, 0xFF, 0x87, 0xFF, 0xE7, 0xE1, 0xF3, 0xE0, 0x79, 0xF8, 0x00, 0xFF,
+ 0x80, 0x3F, 0xFC, 0x1F, 0xFF, 0x83, 0xFF, 0xC0, 0x3F, 0xF0, 0x01, 0xFF,
+ 0xC0, 0x7D, 0xF0, 0x7E, 0xFF, 0xFE, 0x3F, 0xFF, 0x0F, 0xFF, 0x01, 0xFE,
+ 0x00, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0x3E, 0x1F,
+ 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xF3,
+ 0xF8, 0xFC, 0x3E, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x01, 0xFF,
+ 0x80, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07,
+ 0xFE, 0x03, 0xFF, 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0xFF, 0xF0, 0xFF, 0xFF,
+ 0xFF, 0x7F, 0xFF, 0x9F, 0xF7, 0xC7, 0xE3, 0xE0, 0x7C, 0x07, 0xCF, 0x80,
+ 0xF9, 0xF0, 0x1F, 0x1F, 0x07, 0xC3, 0xE0, 0xF8, 0x7C, 0x1F, 0x07, 0x83,
+ 0xC0, 0xF8, 0xF8, 0x1F, 0x1F, 0x01, 0xE3, 0xC0, 0x3E, 0x78, 0x07, 0xDF,
+ 0x00, 0x7B, 0xC0, 0x0F, 0xF8, 0x01, 0xFF, 0x00, 0x1F, 0xC0, 0x03, 0xF8,
+ 0x00, 0x7F, 0x00, 0x07, 0xC0, 0x00, 0xFC, 0x1F, 0x03, 0xEF, 0x83, 0xE0,
+ 0x7D, 0xF0, 0x7E, 0x1F, 0x3E, 0x0F, 0xC3, 0xE3, 0xC3, 0xF8, 0x7C, 0x7C,
+ 0x7F, 0x0F, 0x0F, 0x8F, 0xF3, 0xE1, 0xF1, 0xDE, 0x7C, 0x1E, 0x7B, 0xCF,
+ 0x83, 0xEF, 0x39, 0xE0, 0x7D, 0xE7, 0x3C, 0x07, 0xB8, 0xFF, 0x80, 0xF7,
+ 0x1F, 0xE0, 0x1F, 0xE3, 0xFC, 0x03, 0xFC, 0x3F, 0x80, 0x3F, 0x07, 0xF0,
+ 0x07, 0xE0, 0xFC, 0x00, 0xFC, 0x1F, 0x80, 0x0F, 0x83, 0xF0, 0x00, 0xFC,
+ 0x1F, 0x9F, 0x07, 0xE7, 0xE3, 0xF0, 0xF8, 0xF8, 0x1F, 0x7E, 0x07, 0xDF,
+ 0x00, 0xFF, 0x80, 0x1F, 0xE0, 0x07, 0xF0, 0x00, 0xF8, 0x00, 0x7F, 0x00,
+ 0x3F, 0xE0, 0x0F, 0xF8, 0x07, 0xDF, 0x03, 0xF7, 0xE0, 0xF8, 0xF8, 0x7E,
+ 0x3F, 0x1F, 0x07, 0xEF, 0xC0, 0xF8, 0x7C, 0x03, 0xEF, 0x80, 0xF9, 0xF8,
+ 0x1F, 0x1F, 0x03, 0xE3, 0xE0, 0xF8, 0x7C, 0x1F, 0x07, 0xC3, 0xE0, 0xF8,
+ 0x78, 0x0F, 0x1F, 0x01, 0xF3, 0xC0, 0x3E, 0x78, 0x03, 0xDF, 0x00, 0x7F,
+ 0xC0, 0x0F, 0xF8, 0x00, 0xFF, 0x00, 0x1F, 0xC0, 0x01, 0xF8, 0x00, 0x3F,
+ 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1E, 0x00, 0x07, 0xC0, 0x07, 0xF8,
+ 0x00, 0xFE, 0x00, 0x1F, 0x80, 0x03, 0xE0, 0x00, 0x7F, 0xFE, 0x7F, 0xFE,
+ 0x7F, 0xFE, 0x7F, 0xFE, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0,
+ 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00,
+ 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x87,
+ 0xC7, 0xE3, 0xF1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1,
+ 0xE0, 0xF0, 0xF9, 0xF8, 0xF0, 0x7E, 0x0F, 0x83, 0xC1, 0xE0, 0xF0, 0x78,
+ 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xFC, 0x7E, 0x1F, 0x07, 0x80,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xE0, 0xF0, 0x7C, 0x3E, 0x1F, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E,
+ 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x1F, 0x83, 0xC7, 0xE7, 0xC3,
+ 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC7, 0xE3, 0xE1,
+ 0xF0, 0xF0, 0x00, 0x3C, 0x00, 0xFE, 0x0F, 0xFE, 0x1E, 0x1F, 0xFC, 0x0F,
+ 0xC0, 0x0F, 0x00 };
+
+const GFXglyph FreeSansBold18pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 10, 0, 1 }, // 0x20 ' '
+ { 0, 5, 25, 12, 4, -24 }, // 0x21 '!'
+ { 16, 13, 9, 17, 2, -25 }, // 0x22 '"'
+ { 31, 20, 24, 19, 0, -23 }, // 0x23 '#'
+ { 91, 19, 29, 19, 0, -25 }, // 0x24 '$'
+ { 160, 29, 25, 31, 1, -24 }, // 0x25 '%'
+ { 251, 22, 25, 25, 2, -24 }, // 0x26 '&'
+ { 320, 5, 9, 9, 2, -25 }, // 0x27 '''
+ { 326, 9, 33, 12, 1, -25 }, // 0x28 '('
+ { 364, 9, 33, 12, 1, -25 }, // 0x29 ')'
+ { 402, 12, 11, 14, 0, -25 }, // 0x2A '*'
+ { 419, 16, 16, 20, 2, -15 }, // 0x2B '+'
+ { 451, 5, 11, 9, 2, -4 }, // 0x2C ','
+ { 458, 9, 4, 12, 1, -10 }, // 0x2D '-'
+ { 463, 5, 5, 9, 2, -4 }, // 0x2E '.'
+ { 467, 9, 25, 10, 0, -24 }, // 0x2F '/'
+ { 496, 17, 25, 19, 1, -24 }, // 0x30 '0'
+ { 550, 10, 25, 19, 3, -24 }, // 0x31 '1'
+ { 582, 17, 25, 19, 1, -24 }, // 0x32 '2'
+ { 636, 17, 25, 19, 1, -24 }, // 0x33 '3'
+ { 690, 16, 25, 19, 2, -24 }, // 0x34 '4'
+ { 740, 17, 25, 19, 1, -24 }, // 0x35 '5'
+ { 794, 18, 25, 19, 1, -24 }, // 0x36 '6'
+ { 851, 17, 25, 19, 1, -24 }, // 0x37 '7'
+ { 905, 17, 25, 19, 1, -24 }, // 0x38 '8'
+ { 959, 17, 25, 19, 1, -24 }, // 0x39 '9'
+ { 1013, 5, 18, 9, 2, -17 }, // 0x3A ':'
+ { 1025, 5, 24, 9, 2, -17 }, // 0x3B ';'
+ { 1040, 18, 17, 20, 1, -16 }, // 0x3C '<'
+ { 1079, 17, 12, 20, 2, -13 }, // 0x3D '='
+ { 1105, 18, 17, 20, 1, -16 }, // 0x3E '>'
+ { 1144, 18, 26, 21, 2, -25 }, // 0x3F '?'
+ { 1203, 32, 31, 34, 1, -25 }, // 0x40 '@'
+ { 1327, 24, 26, 24, 0, -25 }, // 0x41 'A'
+ { 1405, 20, 26, 25, 3, -25 }, // 0x42 'B'
+ { 1470, 23, 26, 25, 1, -25 }, // 0x43 'C'
+ { 1545, 21, 26, 25, 3, -25 }, // 0x44 'D'
+ { 1614, 19, 26, 23, 3, -25 }, // 0x45 'E'
+ { 1676, 17, 26, 22, 3, -25 }, // 0x46 'F'
+ { 1732, 24, 26, 27, 1, -25 }, // 0x47 'G'
+ { 1810, 20, 26, 26, 3, -25 }, // 0x48 'H'
+ { 1875, 5, 26, 11, 3, -25 }, // 0x49 'I'
+ { 1892, 16, 26, 20, 1, -25 }, // 0x4A 'J'
+ { 1944, 22, 26, 25, 3, -25 }, // 0x4B 'K'
+ { 2016, 17, 26, 22, 3, -25 }, // 0x4C 'L'
+ { 2072, 24, 26, 30, 3, -25 }, // 0x4D 'M'
+ { 2150, 20, 26, 26, 3, -25 }, // 0x4E 'N'
+ { 2215, 25, 26, 27, 1, -25 }, // 0x4F 'O'
+ { 2297, 19, 26, 24, 3, -25 }, // 0x50 'P'
+ { 2359, 25, 27, 27, 1, -25 }, // 0x51 'Q'
+ { 2444, 21, 26, 25, 3, -25 }, // 0x52 'R'
+ { 2513, 20, 26, 24, 2, -25 }, // 0x53 'S'
+ { 2578, 19, 26, 23, 2, -25 }, // 0x54 'T'
+ { 2640, 20, 26, 26, 3, -25 }, // 0x55 'U'
+ { 2705, 22, 26, 23, 1, -25 }, // 0x56 'V'
+ { 2777, 32, 26, 34, 1, -25 }, // 0x57 'W'
+ { 2881, 22, 26, 24, 1, -25 }, // 0x58 'X'
+ { 2953, 21, 26, 22, 1, -25 }, // 0x59 'Y'
+ { 3022, 19, 26, 21, 1, -25 }, // 0x5A 'Z'
+ { 3084, 8, 33, 12, 2, -25 }, // 0x5B '['
+ { 3117, 10, 25, 10, 0, -24 }, // 0x5C '\'
+ { 3149, 8, 33, 12, 1, -25 }, // 0x5D ']'
+ { 3182, 16, 15, 20, 2, -23 }, // 0x5E '^'
+ { 3212, 21, 3, 19, -1, 5 }, // 0x5F '_'
+ { 3220, 7, 5, 9, 1, -25 }, // 0x60 '`'
+ { 3225, 18, 19, 20, 1, -18 }, // 0x61 'a'
+ { 3268, 18, 26, 22, 2, -25 }, // 0x62 'b'
+ { 3327, 17, 19, 20, 1, -18 }, // 0x63 'c'
+ { 3368, 19, 26, 22, 1, -25 }, // 0x64 'd'
+ { 3430, 18, 19, 20, 1, -18 }, // 0x65 'e'
+ { 3473, 10, 26, 12, 1, -25 }, // 0x66 'f'
+ { 3506, 18, 26, 21, 1, -18 }, // 0x67 'g'
+ { 3565, 17, 26, 21, 2, -25 }, // 0x68 'h'
+ { 3621, 5, 26, 10, 2, -25 }, // 0x69 'i'
+ { 3638, 7, 33, 10, 0, -25 }, // 0x6A 'j'
+ { 3667, 17, 26, 20, 2, -25 }, // 0x6B 'k'
+ { 3723, 5, 26, 9, 2, -25 }, // 0x6C 'l'
+ { 3740, 27, 19, 31, 2, -18 }, // 0x6D 'm'
+ { 3805, 17, 19, 21, 2, -18 }, // 0x6E 'n'
+ { 3846, 19, 19, 21, 1, -18 }, // 0x6F 'o'
+ { 3892, 18, 26, 22, 2, -18 }, // 0x70 'p'
+ { 3951, 19, 26, 22, 1, -18 }, // 0x71 'q'
+ { 4013, 11, 19, 14, 2, -18 }, // 0x72 'r'
+ { 4040, 17, 19, 19, 1, -18 }, // 0x73 's'
+ { 4081, 9, 23, 12, 1, -22 }, // 0x74 't'
+ { 4107, 17, 19, 21, 2, -18 }, // 0x75 'u'
+ { 4148, 19, 19, 19, 0, -18 }, // 0x76 'v'
+ { 4194, 27, 19, 27, 0, -18 }, // 0x77 'w'
+ { 4259, 18, 19, 19, 1, -18 }, // 0x78 'x'
+ { 4302, 19, 26, 19, 0, -18 }, // 0x79 'y'
+ { 4364, 16, 19, 18, 1, -18 }, // 0x7A 'z'
+ { 4402, 9, 33, 14, 1, -25 }, // 0x7B '{'
+ { 4440, 3, 33, 10, 4, -25 }, // 0x7C '|'
+ { 4453, 9, 33, 14, 3, -25 }, // 0x7D '}'
+ { 4491, 15, 6, 18, 1, -10 } }; // 0x7E '~'
+
+const GFXfont FreeSansBold18pt7b PROGMEM = {
+ (uint8_t *)FreeSansBold18pt7bBitmaps,
+ (GFXglyph *)FreeSansBold18pt7bGlyphs,
+ 0x20, 0x7E, 42 };
+
+// Approx. 5175 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBold24pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBold24pt7b.h
new file mode 100644
index 000000000000..aadc9a1dc45f
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBold24pt7b.h
@@ -0,0 +1,784 @@
+const uint8_t FreeSansBold24pt7bBitmaps[] PROGMEM = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xDF, 0x3E, 0x7C, 0xF9, 0xF3, 0xE7, 0xC7, 0x0E, 0x1C, 0x00, 0x00, 0x07,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFE, 0x1F, 0xFF, 0x87, 0xFF, 0xE1,
+ 0xFF, 0xF8, 0x7F, 0xFE, 0x1F, 0xFF, 0x87, 0xFF, 0xE1, 0xFD, 0xF0, 0x3E,
+ 0x7C, 0x0F, 0x9F, 0x03, 0xE3, 0x80, 0x70, 0xE0, 0x1C, 0x00, 0xF8, 0x3E,
+ 0x00, 0x3E, 0x0F, 0x80, 0x0F, 0x83, 0xE0, 0x03, 0xE0, 0xF8, 0x00, 0xF8,
+ 0x7C, 0x00, 0x7C, 0x1F, 0x00, 0x1F, 0x07, 0xC1, 0xFF, 0xFF, 0xFF, 0x7F,
+ 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF,
+ 0x03, 0xE0, 0xF8, 0x00, 0xF8, 0x3E, 0x00, 0x3E, 0x1F, 0x00, 0x1F, 0x07,
+ 0xC0, 0x07, 0xC1, 0xF0, 0x01, 0xF0, 0x7C, 0x00, 0x7C, 0x1F, 0x03, 0xFF,
+ 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF3,
+ 0xFF, 0xFF, 0xFC, 0x0F, 0x87, 0xC0, 0x07, 0xC1, 0xF0, 0x01, 0xF0, 0x7C,
+ 0x00, 0x7C, 0x1F, 0x00, 0x1F, 0x07, 0xC0, 0x07, 0xC3, 0xE0, 0x03, 0xE0,
+ 0xF8, 0x00, 0xF8, 0x3E, 0x00, 0x3E, 0x0F, 0x80, 0x00, 0x00, 0x38, 0x00,
+ 0x00, 0x1C, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFF,
+ 0x80, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF8, 0x7F, 0x73, 0xFE, 0x7F, 0x38,
+ 0xFF, 0x3F, 0x1C, 0x3F, 0xDF, 0x8E, 0x0F, 0xEF, 0xC7, 0x07, 0xF7, 0xE3,
+ 0x80, 0x03, 0xF9, 0xC0, 0x01, 0xFE, 0xE0, 0x00, 0x7F, 0xF0, 0x00, 0x3F,
+ 0xFC, 0x00, 0x0F, 0xFF, 0xC0, 0x03, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x80,
+ 0x0F, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0xE7, 0xFC, 0x00, 0x71, 0xFF,
+ 0x00, 0x38, 0x7F, 0xFF, 0x1C, 0x1F, 0xFF, 0x8E, 0x0F, 0xFF, 0xC7, 0x07,
+ 0xFF, 0xE3, 0x87, 0xFB, 0xF9, 0xC3, 0xF9, 0xFE, 0xE7, 0xFC, 0x7F, 0xFF,
+ 0xFC, 0x3F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x00, 0x3F,
+ 0xE0, 0x00, 0x03, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x00, 0xE0, 0x00, 0x00,
+ 0x70, 0x00, 0x03, 0xE0, 0x00, 0x3C, 0x00, 0x1F, 0xF0, 0x00, 0x78, 0x00,
+ 0x7F, 0xF8, 0x01, 0xE0, 0x01, 0xFF, 0xF0, 0x03, 0xC0, 0x07, 0xFF, 0xF0,
+ 0x0F, 0x00, 0x0F, 0x83, 0xE0, 0x1E, 0x00, 0x3E, 0x03, 0xE0, 0x78, 0x00,
+ 0x78, 0x03, 0xC0, 0xF0, 0x00, 0xF0, 0x07, 0x83, 0xC0, 0x01, 0xE0, 0x0F,
+ 0x07, 0x80, 0x03, 0xE0, 0x3E, 0x1E, 0x00, 0x03, 0xE0, 0xF8, 0x3C, 0x00,
+ 0x07, 0xFF, 0xF0, 0xF0, 0x00, 0x07, 0xFF, 0xC1, 0xE0, 0x00, 0x07, 0xFF,
+ 0x07, 0x80, 0x00, 0x07, 0xFC, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x3C, 0x00,
+ 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x01, 0xE0, 0xFF, 0x80, 0x00,
+ 0x07, 0x87, 0xFF, 0xC0, 0x00, 0x0F, 0x0F, 0xFF, 0x80, 0x00, 0x3C, 0x3F,
+ 0xFF, 0x80, 0x00, 0x78, 0xFC, 0x1F, 0x00, 0x01, 0xE1, 0xF0, 0x1F, 0x00,
+ 0x03, 0xC3, 0xC0, 0x1E, 0x00, 0x0F, 0x07, 0x80, 0x3C, 0x00, 0x1E, 0x0F,
+ 0x00, 0x78, 0x00, 0x78, 0x1F, 0x01, 0xF0, 0x00, 0xF0, 0x1F, 0x07, 0xC0,
+ 0x03, 0xC0, 0x3F, 0xFF, 0x80, 0x07, 0x80, 0x3F, 0xFE, 0x00, 0x1E, 0x00,
+ 0x7F, 0xF8, 0x00, 0x7C, 0x00, 0x3F, 0xE0, 0x00, 0xF0, 0x00, 0x1F, 0x00,
+ 0x00, 0x3F, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00,
+ 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x3F, 0xCF, 0xC0, 0x00, 0xFE,
+ 0x1F, 0x00, 0x03, 0xF8, 0x7C, 0x00, 0x0F, 0xE1, 0xF0, 0x00, 0x3F, 0xC7,
+ 0xC0, 0x00, 0x7F, 0x3E, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xC0,
+ 0x00, 0x07, 0xFE, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x7F, 0x80, 0x00,
+ 0x07, 0xFF, 0x03, 0xE0, 0x3F, 0xFE, 0x0F, 0x83, 0xFF, 0xF8, 0x3E, 0x1F,
+ 0xF3, 0xF1, 0xF8, 0x7F, 0x07, 0xE7, 0xE3, 0xFC, 0x1F, 0xFF, 0x0F, 0xE0,
+ 0x3F, 0xFC, 0x3F, 0x80, 0x7F, 0xF0, 0xFE, 0x01, 0xFF, 0x83, 0xF8, 0x03,
+ 0xFE, 0x0F, 0xF0, 0x0F, 0xF0, 0x3F, 0xE0, 0x7F, 0xE0, 0x7F, 0xC3, 0xFF,
+ 0xC1, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xFB, 0xFC,
+ 0x0F, 0xFF, 0xC7, 0xF8, 0x1F, 0xFE, 0x0F, 0xE0, 0x0F, 0xE0, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x7C, 0xF8, 0xE1, 0xC0, 0x00,
+ 0xF0, 0x0F, 0x80, 0xF8, 0x07, 0xC0, 0x7C, 0x07, 0xE0, 0x3E, 0x03, 0xF0,
+ 0x1F, 0x80, 0xF8, 0x0F, 0xC0, 0x7E, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F,
+ 0xC0, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0,
+ 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x00, 0xF8, 0x07, 0xE0, 0x3F, 0x01,
+ 0xF8, 0x07, 0xC0, 0x3F, 0x01, 0xF8, 0x07, 0xC0, 0x3F, 0x00, 0xF8, 0x07,
+ 0xE0, 0x1F, 0x00, 0xF8, 0x03, 0xE0, 0x1F, 0x00, 0x7C, 0x01, 0xE0, 0x78,
+ 0x03, 0xE0, 0x0F, 0x80, 0x7C, 0x01, 0xF0, 0x0F, 0x80, 0x3E, 0x01, 0xF0,
+ 0x0F, 0xC0, 0x3E, 0x01, 0xF8, 0x0F, 0xC0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0,
+ 0x7E, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07,
+ 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xE0, 0x3F, 0x01, 0xF8,
+ 0x0F, 0xC0, 0x7C, 0x07, 0xE0, 0x3F, 0x01, 0xF0, 0x1F, 0x80, 0xF8, 0x0F,
+ 0xC0, 0x7C, 0x07, 0xE0, 0x3E, 0x03, 0xF0, 0x1F, 0x01, 0xF0, 0x00, 0x03,
+ 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x06, 0x38, 0xDF, 0xFF, 0xFF, 0xFF,
+ 0x9F, 0xFE, 0x07, 0xC0, 0x1F, 0xC0, 0x3F, 0x80, 0xF7, 0x83, 0xC7, 0x87,
+ 0x8F, 0x02, 0x08, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0,
+ 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00,
+ 0x00, 0x3E, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0x00, 0x00,
+ 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03,
+ 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x87, 0x0E, 0x1C, 0x78, 0xEF, 0xDF, 0x38, 0x00, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x80, 0x00, 0x38, 0x03, 0xC0, 0x1C, 0x00, 0xE0, 0x07, 0x00,
+ 0x70, 0x03, 0x80, 0x1C, 0x01, 0xE0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x38,
+ 0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x07, 0x00, 0x38, 0x03, 0xC0, 0x1C, 0x00,
+ 0xE0, 0x07, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x01, 0xE0, 0x0E, 0x00, 0x70,
+ 0x03, 0x80, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00,
+ 0xFF, 0x00, 0x03, 0xFF, 0xC0, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF8, 0x1F,
+ 0xFF, 0xF8, 0x3F, 0xFF, 0xFC, 0x3F, 0xC3, 0xFC, 0x7F, 0x81, 0xFE, 0x7F,
+ 0x00, 0xFE, 0x7F, 0x00, 0xFE, 0x7F, 0x00, 0xFE, 0xFE, 0x00, 0x7F, 0xFE,
+ 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE,
+ 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE,
+ 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0x7F,
+ 0x00, 0xFE, 0x7F, 0x00, 0xFE, 0x7F, 0x00, 0xFE, 0x7F, 0x81, 0xFE, 0x3F,
+ 0xC3, 0xFC, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xF8, 0x1F, 0xFF, 0xF8, 0x0F,
+ 0xFF, 0xF0, 0x03, 0xFF, 0xC0, 0x00, 0xFF, 0x00, 0x00, 0x3C, 0x01, 0xF0,
+ 0x07, 0xC0, 0x3F, 0x01, 0xFC, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F,
+ 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F,
+ 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07,
+ 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x01, 0xFE, 0x00, 0x0F, 0xFF, 0x80,
+ 0x3F, 0xFF, 0x80, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0x9F,
+ 0xE0, 0xFF, 0x7F, 0x80, 0xFF, 0xFE, 0x01, 0xFF, 0xFC, 0x01, 0xFF, 0xF8,
+ 0x03, 0xFF, 0xF0, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00,
+ 0x7F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x7F,
+ 0xC0, 0x01, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x00,
+ 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x00, 0x01,
+ 0xFC, 0x00, 0x03, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xBF,
+ 0xFF, 0xFF, 0x7F, 0xFF, 0xFE, 0xFF, 0xFF, 0xFC, 0x01, 0xFE, 0x00, 0x0F,
+ 0xFF, 0x80, 0x7F, 0xFF, 0x81, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0x8F, 0xFF,
+ 0xFF, 0x1F, 0xE1, 0xFF, 0x7F, 0x81, 0xFE, 0xFE, 0x01, 0xFD, 0xFC, 0x03,
+ 0xFB, 0xF8, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7F,
+ 0x00, 0x01, 0xFC, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0xC0,
+ 0x00, 0xFF, 0xE0, 0x00, 0x3F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0xC0,
+ 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8,
+ 0x07, 0xFF, 0xF8, 0x0F, 0xF7, 0xF8, 0x3F, 0xCF, 0xFF, 0xFF, 0x9F, 0xFF,
+ 0xFE, 0x1F, 0xFF, 0xF8, 0x1F, 0xFF, 0xE0, 0x0F, 0xFF, 0x80, 0x07, 0xF8,
+ 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x03, 0xFE, 0x00, 0x0F, 0xF8,
+ 0x00, 0x7F, 0xE0, 0x03, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x7B, 0xF8, 0x01,
+ 0xEF, 0xE0, 0x0F, 0x3F, 0x80, 0x78, 0xFE, 0x01, 0xE3, 0xF8, 0x0F, 0x0F,
+ 0xE0, 0x38, 0x3F, 0x81, 0xE0, 0xFE, 0x07, 0x03, 0xF8, 0x3C, 0x0F, 0xE1,
+ 0xE0, 0x3F, 0x87, 0x00, 0xFE, 0x3C, 0x03, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xF0, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80,
+ 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x1F, 0xFF, 0xFC, 0x3F,
+ 0xFF, 0xF8, 0x7F, 0xFF, 0xF0, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xC7, 0xFF,
+ 0xFF, 0x8F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x78, 0x00,
+ 0x01, 0xF1, 0xF8, 0x03, 0xEF, 0xFE, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xFE,
+ 0x1F, 0xFF, 0xFE, 0x7F, 0xFF, 0xFC, 0xFE, 0x07, 0xFC, 0x00, 0x07, 0xF8,
+ 0x00, 0x07, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0,
+ 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0xF8, 0x03, 0xFF, 0xF8,
+ 0x0F, 0xF7, 0xF8, 0x3F, 0xEF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0x0F, 0xFF,
+ 0xFC, 0x0F, 0xFF, 0xE0, 0x0F, 0xFF, 0x80, 0x03, 0xF8, 0x00, 0x00, 0xFF,
+ 0x00, 0x07, 0xFF, 0x80, 0x1F, 0xFF, 0xC0, 0x7F, 0xFF, 0x81, 0xFF, 0xFF,
+ 0x87, 0xFF, 0xFF, 0x8F, 0xF0, 0xFF, 0x3F, 0xC0, 0xFE, 0x7F, 0x00, 0x00,
+ 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE3, 0xF0, 0x1F,
+ 0xDF, 0xF8, 0x3F, 0xFF, 0xFC, 0x7F, 0xFF, 0xFC, 0xFF, 0xFF, 0xF9, 0xFF,
+ 0x87, 0xFB, 0xFC, 0x07, 0xF7, 0xF8, 0x0F, 0xFF, 0xE0, 0x0F, 0xFF, 0xC0,
+ 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x7F, 0x7E, 0x00, 0xFE, 0xFC, 0x01,
+ 0xFD, 0xFC, 0x07, 0xFB, 0xF8, 0x0F, 0xE3, 0xFC, 0x7F, 0xC7, 0xFF, 0xFF,
+ 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xF8, 0x0F, 0xFF, 0xE0, 0x07, 0xFF, 0x80,
+ 0x03, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x3F, 0x00,
+ 0x00, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00,
+ 0x7F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F,
+ 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xF0,
+ 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFC, 0x00,
+ 0x01, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00,
+ 0x3F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07,
+ 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x1F,
+ 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x7F, 0x83, 0xFC, 0x7F,
+ 0x00, 0xFC, 0x7E, 0x00, 0xFC, 0x7E, 0x00, 0x7C, 0x7E, 0x00, 0x7C, 0x7E,
+ 0x00, 0xFC, 0x3F, 0x00, 0xF8, 0x3F, 0x83, 0xF8, 0x0F, 0xFF, 0xF0, 0x07,
+ 0xFF, 0xC0, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF8, 0x3F, 0xC3, 0xFC, 0x7F,
+ 0x00, 0xFE, 0x7F, 0x00, 0xFE, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE,
+ 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0xFF, 0xFF,
+ 0x00, 0xFE, 0x7F, 0x83, 0xFE, 0x7F, 0xFF, 0xFE, 0x3F, 0xFF, 0xFC, 0x1F,
+ 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x07, 0xFF, 0xC0, 0x00, 0xFF, 0x00, 0x00,
+ 0xFF, 0x00, 0x03, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF0, 0x3F,
+ 0xFF, 0xF8, 0x3F, 0xFF, 0xFC, 0x7F, 0xC3, 0xFC, 0x7F, 0x01, 0xFE, 0xFF,
+ 0x00, 0xFE, 0xFE, 0x00, 0x7E, 0xFE, 0x00, 0x7E, 0xFE, 0x00, 0x7F, 0xFE,
+ 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0xFF, 0x7F,
+ 0x01, 0xFF, 0x7F, 0xC3, 0xFF, 0x7F, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x1F,
+ 0xFF, 0xFF, 0x0F, 0xFF, 0x7F, 0x07, 0xFE, 0x7F, 0x01, 0xFC, 0x7E, 0x00,
+ 0x00, 0x7E, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x7F, 0x01, 0xFC, 0x7F,
+ 0x83, 0xFC, 0x7F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF0, 0x1F,
+ 0xFF, 0xE0, 0x07, 0xFF, 0x80, 0x01, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFE, 0x1C, 0x38, 0x71, 0xE7, 0xBF, 0x7C, 0xE0, 0x00,
+ 0x00, 0x02, 0x00, 0x00, 0x3C, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0xF0, 0x01,
+ 0xFF, 0xE0, 0x0F, 0xFF, 0xC0, 0xFF, 0xFC, 0x0F, 0xFF, 0xC0, 0x7F, 0xFC,
+ 0x01, 0xFF, 0xC0, 0x03, 0xFC, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0xE0, 0x00,
+ 0x1F, 0xF8, 0x00, 0x3F, 0xFE, 0x00, 0x0F, 0xFF, 0x80, 0x07, 0xFF, 0xE0,
+ 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x0F, 0xE0,
+ 0x00, 0x03, 0xC0, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 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, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x80, 0x00,
+ 0x01, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x0F, 0xFE, 0x00,
+ 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF0, 0x00, 0x7F, 0xFC,
+ 0x00, 0x1F, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0xE0,
+ 0x01, 0xFF, 0xC0, 0x0F, 0xFF, 0x80, 0xFF, 0xF8, 0x0F, 0xFF, 0x80, 0xFF,
+ 0xFC, 0x03, 0xFF, 0xC0, 0x07, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x1E, 0x00,
+ 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x07, 0xFF, 0xC0, 0x1F,
+ 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x3F, 0xFF, 0xFC, 0x7F, 0xFF, 0xFC, 0x7F,
+ 0x83, 0xFE, 0x7F, 0x01, 0xFE, 0xFF, 0x00, 0xFF, 0xFE, 0x00, 0x7F, 0xFE,
+ 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x00,
+ 0x01, 0xFE, 0x00, 0x03, 0xFE, 0x00, 0x07, 0xFC, 0x00, 0x0F, 0xF8, 0x00,
+ 0x3F, 0xF0, 0x00, 0x3F, 0xE0, 0x00, 0x7F, 0x80, 0x00, 0x7F, 0x00, 0x00,
+ 0xFE, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00,
+ 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00,
+ 0xFE, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xE0,
+ 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF8, 0x00,
+ 0x03, 0xFE, 0x01, 0xFF, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x7F,
+ 0x80, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x00, 0x03, 0xF8, 0x07, 0xF0, 0x00,
+ 0x00, 0x1F, 0x00, 0xFC, 0x00, 0x00, 0x01, 0xF0, 0x3F, 0x00, 0x00, 0x00,
+ 0x3E, 0x0F, 0xC0, 0x07, 0xE3, 0xC3, 0xE1, 0xF0, 0x03, 0xFE, 0xF8, 0x3C,
+ 0x7E, 0x01, 0xFF, 0xFF, 0x07, 0x8F, 0x80, 0x7E, 0x1F, 0xC0, 0x7B, 0xF0,
+ 0x1F, 0x81, 0xF8, 0x0F, 0x7C, 0x03, 0xE0, 0x1F, 0x01, 0xEF, 0x80, 0xF8,
+ 0x03, 0xC0, 0x3F, 0xF0, 0x1E, 0x00, 0x78, 0x07, 0xFC, 0x07, 0xC0, 0x0F,
+ 0x00, 0xFF, 0x80, 0xF0, 0x01, 0xE0, 0x1F, 0xF0, 0x1E, 0x00, 0x38, 0x07,
+ 0xFE, 0x07, 0xC0, 0x0F, 0x00, 0xFF, 0xC0, 0xF8, 0x01, 0xE0, 0x1E, 0xF8,
+ 0x1F, 0x00, 0x38, 0x07, 0xDF, 0x03, 0xE0, 0x0F, 0x00, 0xF3, 0xF0, 0x7C,
+ 0x03, 0xE0, 0x3E, 0x3E, 0x0F, 0xC0, 0xFC, 0x0F, 0x87, 0xC0, 0xFC, 0x3F,
+ 0xC7, 0xF0, 0xFC, 0x1F, 0xFF, 0xFF, 0xFC, 0x0F, 0xC1, 0xFF, 0xEF, 0xFF,
+ 0x01, 0xFC, 0x1F, 0xF8, 0xFF, 0x80, 0x1F, 0xC0, 0xFC, 0x07, 0xC0, 0x01,
+ 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x00, 0x01, 0xFE,
+ 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x60, 0x00, 0x01, 0xFF, 0xFF,
+ 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x7F, 0xFF, 0xF0,
+ 0x00, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00,
+ 0x0F, 0xF8, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00,
+ 0x1F, 0xFC, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00,
+ 0x3F, 0xFE, 0x00, 0x00, 0x3F, 0x7E, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00,
+ 0x7F, 0x7F, 0x00, 0x00, 0x7E, 0x3F, 0x00, 0x00, 0xFE, 0x3F, 0x80, 0x00,
+ 0xFE, 0x3F, 0x80, 0x01, 0xFC, 0x1F, 0x80, 0x01, 0xFC, 0x1F, 0xC0, 0x01,
+ 0xF8, 0x1F, 0xC0, 0x03, 0xF8, 0x0F, 0xE0, 0x03, 0xF8, 0x0F, 0xE0, 0x03,
+ 0xF0, 0x0F, 0xE0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xFF, 0xFF, 0xF0, 0x07,
+ 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xF8, 0x1F,
+ 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0xFC, 0x1F, 0xC0, 0x01, 0xFC, 0x3F,
+ 0x80, 0x01, 0xFC, 0x3F, 0x80, 0x00, 0xFE, 0x3F, 0x80, 0x00, 0xFE, 0x7F,
+ 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x7F, 0xFF,
+ 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFF,
+ 0x8F, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0x3F, 0x80, 0x1F, 0xF7, 0xF0,
+ 0x01, 0xFE, 0xFE, 0x00, 0x1F, 0xDF, 0xC0, 0x03, 0xFB, 0xF8, 0x00, 0x7F,
+ 0x7F, 0x00, 0x1F, 0xCF, 0xE0, 0x07, 0xF9, 0xFF, 0xFF, 0xFE, 0x3F, 0xFF,
+ 0xFF, 0x87, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0xE3,
+ 0xFF, 0xFF, 0xFE, 0x7F, 0x00, 0x1F, 0xEF, 0xE0, 0x01, 0xFD, 0xFC, 0x00,
+ 0x1F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xFF,
+ 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xEF, 0xFF, 0xFF,
+ 0xFD, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xF8, 0xFF,
+ 0xFF, 0xFC, 0x1F, 0xFF, 0xFC, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x03, 0xFF,
+ 0xF8, 0x00, 0x1F, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF,
+ 0xE0, 0x3F, 0xFF, 0xFF, 0xC1, 0xFF, 0x81, 0xFF, 0x0F, 0xF8, 0x01, 0xFE,
+ 0x3F, 0xC0, 0x07, 0xF9, 0xFE, 0x00, 0x0F, 0xE7, 0xF8, 0x00, 0x1F, 0xDF,
+ 0xC0, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x0F, 0xE0,
+ 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x03, 0xF8, 0x00,
+ 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00,
+ 0x03, 0xF8, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00,
+ 0x7F, 0x00, 0x01, 0xFD, 0xFC, 0x00, 0x07, 0xF7, 0xF8, 0x00, 0x3F, 0xCF,
+ 0xF0, 0x00, 0xFE, 0x3F, 0xE0, 0x07, 0xF8, 0x7F, 0xE0, 0x7F, 0xC0, 0xFF,
+ 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0xC0, 0x07, 0xFF,
+ 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x07, 0xFC, 0x00, 0xFF, 0xFF, 0xC0,
+ 0x0F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xE0, 0xFF,
+ 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF8, 0xFE, 0x00, 0xFF, 0xCF, 0xE0, 0x03,
+ 0xFC, 0xFE, 0x00, 0x1F, 0xEF, 0xE0, 0x01, 0xFE, 0xFE, 0x00, 0x0F, 0xEF,
+ 0xE0, 0x00, 0xFE, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00,
+ 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F,
+ 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0,
+ 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xEF, 0xE0, 0x00, 0xFE, 0xFE, 0x00, 0x1F,
+ 0xEF, 0xE0, 0x01, 0xFE, 0xFE, 0x00, 0x3F, 0xCF, 0xE0, 0x0F, 0xFC, 0xFF,
+ 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF,
+ 0xC0, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0x7F,
+ 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xF7,
+ 0xFF, 0xFF, 0xFB, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00,
+ 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00,
+ 0x07, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF,
+ 0xFE, 0x7F, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x9F, 0xC0, 0x00, 0x0F, 0xE0,
+ 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE,
+ 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00,
+ 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFF, 0xFF,
+ 0xFC, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF,
+ 0xFC, 0xFF, 0xFF, 0xFC, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00,
+ 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00,
+ 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00,
+ 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00,
+ 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFF,
+ 0x00, 0x1F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF,
+ 0x07, 0xFE, 0x03, 0xFF, 0x0F, 0xF0, 0x01, 0xFE, 0x3F, 0xC0, 0x01, 0xFC,
+ 0x7F, 0x00, 0x01, 0xFD, 0xFE, 0x00, 0x03, 0xFB, 0xF8, 0x00, 0x00, 0x07,
+ 0xF0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x7F,
+ 0x00, 0x00, 0x00, 0xFE, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xF8,
+ 0x00, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0xC0,
+ 0x07, 0xFF, 0xFF, 0xC0, 0x00, 0x1F, 0xBF, 0x80, 0x00, 0x3F, 0x7F, 0x00,
+ 0x00, 0x7E, 0xFF, 0x00, 0x01, 0xFC, 0xFF, 0x00, 0x03, 0xF9, 0xFF, 0x00,
+ 0x0F, 0xF1, 0xFF, 0x00, 0x3F, 0xE3, 0xFF, 0x83, 0xFF, 0xC3, 0xFF, 0xFF,
+ 0xFF, 0x83, 0xFF, 0xFF, 0xDF, 0x03, 0xFF, 0xFF, 0x9E, 0x03, 0xFF, 0xFE,
+ 0x3C, 0x01, 0xFF, 0xF0, 0x78, 0x00, 0x7F, 0x80, 0x00, 0xFE, 0x00, 0x0F,
+ 0xFF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xE0,
+ 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x7F,
+ 0xFE, 0x00, 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0x00,
+ 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xFF,
+ 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0xC0, 0x01,
+ 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFC,
+ 0x00, 0x1F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x0F,
+ 0xFF, 0xC0, 0x01, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 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, 0x01,
+ 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC,
+ 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00,
+ 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07,
+ 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xF0,
+ 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0xE0,
+ 0x1F, 0xFF, 0x80, 0x7F, 0xFE, 0x01, 0xFF, 0xF8, 0x07, 0xFF, 0xE0, 0x1F,
+ 0xFF, 0xC0, 0xFF, 0xFF, 0x87, 0xFD, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0x8F,
+ 0xFF, 0xFC, 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, 0x00, 0x1F, 0xE0, 0x00, 0xFE,
+ 0x00, 0x0F, 0xF3, 0xF8, 0x00, 0x7F, 0x8F, 0xE0, 0x03, 0xFC, 0x3F, 0x80,
+ 0x1F, 0xE0, 0xFE, 0x00, 0xFF, 0x83, 0xF8, 0x07, 0xFC, 0x0F, 0xE0, 0x1F,
+ 0xE0, 0x3F, 0x80, 0xFF, 0x00, 0xFE, 0x07, 0xF8, 0x03, 0xF8, 0x3F, 0xC0,
+ 0x0F, 0xE1, 0xFE, 0x00, 0x3F, 0x8F, 0xF0, 0x00, 0xFE, 0x7F, 0x80, 0x03,
+ 0xFB, 0xFC, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0xFF,
+ 0xFF, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x3F, 0xF7,
+ 0xF8, 0x00, 0xFF, 0x8F, 0xF0, 0x03, 0xFC, 0x3F, 0xC0, 0x0F, 0xE0, 0x7F,
+ 0x80, 0x3F, 0x80, 0xFF, 0x00, 0xFE, 0x01, 0xFE, 0x03, 0xF8, 0x07, 0xFC,
+ 0x0F, 0xE0, 0x0F, 0xF0, 0x3F, 0x80, 0x1F, 0xE0, 0xFE, 0x00, 0x3F, 0xC3,
+ 0xF8, 0x00, 0xFF, 0x8F, 0xE0, 0x01, 0xFE, 0x3F, 0x80, 0x03, 0xFC, 0xFE,
+ 0x00, 0x07, 0xFB, 0xF8, 0x00, 0x1F, 0xF0, 0xFE, 0x00, 0x01, 0xFC, 0x00,
+ 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00,
+ 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03,
+ 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x3F,
+ 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8,
+ 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x80,
+ 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, 0x00,
+ 0x07, 0xF0, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xE0, 0x03,
+ 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0xFC, 0x00,
+ 0x7F, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFF, 0xC0,
+ 0x1F, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xFC,
+ 0x07, 0xFF, 0xFF, 0xBE, 0x03, 0xEF, 0xFF, 0xDF, 0x01, 0xF7, 0xFF, 0xEF,
+ 0x80, 0xFB, 0xFF, 0xF7, 0xC0, 0xFD, 0xFF, 0xFB, 0xF0, 0x7C, 0xFF, 0xFC,
+ 0xF8, 0x3E, 0x7F, 0xFE, 0x7C, 0x1F, 0x3F, 0xFF, 0x3E, 0x0F, 0x9F, 0xFF,
+ 0x9F, 0x8F, 0x8F, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF,
+ 0xF1, 0xF1, 0xF1, 0xFF, 0xF8, 0xFC, 0xF8, 0xFF, 0xFC, 0x3E, 0xF8, 0x7F,
+ 0xFE, 0x1F, 0x7C, 0x3F, 0xFF, 0x0F, 0xBE, 0x1F, 0xFF, 0x87, 0xDF, 0x0F,
+ 0xFF, 0xC3, 0xFF, 0x07, 0xFF, 0xE0, 0xFF, 0x83, 0xFF, 0xF0, 0x7F, 0xC1,
+ 0xFF, 0xF8, 0x3F, 0xE0, 0xFF, 0xFC, 0x1F, 0xF0, 0x7F, 0xFE, 0x07, 0xF0,
+ 0x3F, 0xFF, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x00, 0x07, 0xFF, 0xF0, 0x00,
+ 0x7F, 0xFF, 0x80, 0x07, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xC0, 0x07, 0xFF,
+ 0xFC, 0x00, 0x7F, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xF0,
+ 0x07, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xF8, 0x07, 0xFF, 0xEF, 0xC0, 0x7F,
+ 0xFE, 0xFE, 0x07, 0xFF, 0xE7, 0xE0, 0x7F, 0xFE, 0x7F, 0x07, 0xFF, 0xE3,
+ 0xF0, 0x7F, 0xFE, 0x1F, 0x87, 0xFF, 0xE1, 0xFC, 0x7F, 0xFE, 0x0F, 0xC7,
+ 0xFF, 0xE0, 0xFE, 0x7F, 0xFE, 0x07, 0xE7, 0xFF, 0xE0, 0x3F, 0x7F, 0xFE,
+ 0x03, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xE0, 0x0F,
+ 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xE0, 0x07, 0xFF, 0xFE, 0x00, 0x3F, 0xFF,
+ 0xE0, 0x03, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00,
+ 0x0F, 0xFF, 0xE0, 0x00, 0x7F, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x3F, 0xFF,
+ 0x80, 0x00, 0x7F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x7F, 0xFF,
+ 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x3F, 0xC0,
+ 0x0F, 0xF8, 0x3F, 0xC0, 0x01, 0xFE, 0x1F, 0xC0, 0x00, 0x7F, 0x1F, 0xE0,
+ 0x00, 0x3F, 0xCF, 0xE0, 0x00, 0x0F, 0xE7, 0xF0, 0x00, 0x07, 0xF7, 0xF8,
+ 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x7F, 0xFE,
+ 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x0F, 0xFF,
+ 0xC0, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x01, 0xFF,
+ 0xFC, 0x00, 0x01, 0xFE, 0xFE, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0x7F,
+ 0x3F, 0xC0, 0x00, 0x7F, 0x8F, 0xE0, 0x00, 0x3F, 0x87, 0xF8, 0x00, 0x3F,
+ 0xC1, 0xFE, 0x00, 0x3F, 0xC0, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xFF, 0xFF,
+ 0xE0, 0x0F, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0xE0, 0x00, 0xFF, 0xFF,
+ 0xE0, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
+ 0xE0, 0x3F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xFC, 0xFF,
+ 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xEF, 0xE0, 0x0F, 0xFB, 0xF8, 0x00, 0xFF,
+ 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00,
+ 0x7F, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x03, 0xFF, 0xF8,
+ 0x03, 0xFE, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF3,
+ 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x0F, 0xE0, 0x00,
+ 0x03, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0,
+ 0x00, 0x03, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F,
+ 0xE0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00,
+ 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x7F, 0xFF,
+ 0xE0, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF,
+ 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x3F, 0xC0, 0x07, 0xF8, 0x3F, 0xC0,
+ 0x01, 0xFE, 0x1F, 0xC0, 0x00, 0x7F, 0x1F, 0xE0, 0x00, 0x3F, 0xCF, 0xE0,
+ 0x00, 0x0F, 0xE7, 0xF0, 0x00, 0x07, 0xF7, 0xF8, 0x00, 0x03, 0xFF, 0xF8,
+ 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x3F, 0xFF,
+ 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x07, 0xFF,
+ 0xE0, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x01, 0xFF, 0xFC, 0x00, 0x21, 0xFE,
+ 0xFE, 0x00, 0x38, 0xFE, 0x7F, 0x00, 0x3E, 0x7F, 0x3F, 0xC0, 0x3F, 0xFF,
+ 0x8F, 0xE0, 0x0F, 0xFF, 0x87, 0xF8, 0x03, 0xFF, 0xC1, 0xFE, 0x00, 0xFF,
+ 0xC0, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF,
+ 0xFC, 0x03, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF,
+ 0xCF, 0xC0, 0x01, 0xFF, 0x03, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF,
+ 0xF8, 0x0F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xF8,
+ 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFC, 0xFE, 0x00, 0x3F, 0xEF, 0xE0,
+ 0x01, 0xFE, 0xFE, 0x00, 0x0F, 0xEF, 0xE0, 0x00, 0xFE, 0xFE, 0x00, 0x0F,
+ 0xEF, 0xE0, 0x00, 0xFE, 0xFE, 0x00, 0x0F, 0xEF, 0xE0, 0x01, 0xFC, 0xFE,
+ 0x00, 0x3F, 0xCF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF,
+ 0xC0, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x8F,
+ 0xE0, 0x07, 0xF8, 0xFE, 0x00, 0x1F, 0xCF, 0xE0, 0x01, 0xFC, 0xFE, 0x00,
+ 0x1F, 0xCF, 0xE0, 0x01, 0xFC, 0xFE, 0x00, 0x1F, 0xCF, 0xE0, 0x01, 0xFC,
+ 0xFE, 0x00, 0x1F, 0xCF, 0xE0, 0x01, 0xFC, 0xFE, 0x00, 0x1F, 0xCF, 0xE0,
+ 0x01, 0xFC, 0xFE, 0x00, 0x1F, 0xEF, 0xE0, 0x00, 0xFF, 0x00, 0xFF, 0xC0,
+ 0x00, 0x3F, 0xFF, 0x80, 0x0F, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xF0, 0x3F,
+ 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xFC, 0x7F, 0xC0, 0xFF, 0xCF, 0xF0, 0x03,
+ 0xFE, 0xFE, 0x00, 0x1F, 0xEF, 0xE0, 0x00, 0xFE, 0xFE, 0x00, 0x0F, 0xEF,
+ 0xE0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x7F, 0xFC,
+ 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0xF0,
+ 0x07, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00,
+ 0x03, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x07,
+ 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFF,
+ 0x00, 0x0F, 0xE7, 0xFC, 0x03, 0xFE, 0x7F, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF,
+ 0xFC, 0x1F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFC, 0x00,
+ 0x07, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0,
+ 0x0F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0,
+ 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF8, 0x00, 0x00,
+ 0x7F, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80,
+ 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03,
+ 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0xFC, 0x00,
+ 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F,
+ 0xC0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xE0, 0x00,
+ 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0xFE, 0x00,
+ 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF,
+ 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00,
+ 0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x3F, 0xFF,
+ 0x00, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0x80, 0x03,
+ 0xFF, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xF8,
+ 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x1F,
+ 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0xC0,
+ 0x01, 0xFF, 0xFC, 0x00, 0x7F, 0xBF, 0xC0, 0x1F, 0xE7, 0xFC, 0x07, 0xFC,
+ 0x7F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF,
+ 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x03,
+ 0xFF, 0xF0, 0x00, 0x1F, 0xDF, 0xC0, 0x01, 0xFC, 0xFE, 0x00, 0x0F, 0xE7,
+ 0xF0, 0x00, 0x7F, 0x1F, 0xC0, 0x03, 0xF0, 0xFE, 0x00, 0x3F, 0x87, 0xF0,
+ 0x01, 0xFC, 0x1F, 0xC0, 0x0F, 0xC0, 0xFE, 0x00, 0xFE, 0x03, 0xF0, 0x07,
+ 0xF0, 0x1F, 0x80, 0x3F, 0x00, 0xFE, 0x03, 0xF8, 0x03, 0xF0, 0x1F, 0xC0,
+ 0x1F, 0x80, 0xFC, 0x00, 0xFE, 0x07, 0xE0, 0x03, 0xF0, 0x7F, 0x00, 0x1F,
+ 0x83, 0xF0, 0x00, 0xFE, 0x1F, 0x80, 0x03, 0xF1, 0xF8, 0x00, 0x1F, 0x8F,
+ 0xC0, 0x00, 0xFC, 0x7E, 0x00, 0x03, 0xF3, 0xE0, 0x00, 0x1F, 0xBF, 0x00,
+ 0x00, 0xFD, 0xF8, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00,
+ 0xFF, 0xE0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0xFF,
+ 0x80, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0xFE, 0x00,
+ 0x00, 0xFF, 0x00, 0x3F, 0x80, 0x1F, 0xFF, 0xE0, 0x07, 0xF0, 0x03, 0xFD,
+ 0xFC, 0x01, 0xFE, 0x00, 0x7F, 0x3F, 0x80, 0x3F, 0xE0, 0x0F, 0xE7, 0xF0,
+ 0x07, 0xFC, 0x01, 0xFC, 0x7F, 0x00, 0xFF, 0x80, 0x7F, 0x8F, 0xE0, 0x1F,
+ 0xF0, 0x0F, 0xE1, 0xFC, 0x07, 0xFF, 0x01, 0xFC, 0x3F, 0x80, 0xFB, 0xE0,
+ 0x3F, 0x83, 0xF0, 0x1F, 0x7C, 0x07, 0xE0, 0x7F, 0x03, 0xEF, 0x81, 0xFC,
+ 0x0F, 0xE0, 0x7D, 0xF0, 0x3F, 0x80, 0xFC, 0x1F, 0x9F, 0x07, 0xF0, 0x1F,
+ 0x83, 0xE3, 0xE0, 0xFC, 0x03, 0xF0, 0x7C, 0x7C, 0x1F, 0x80, 0x7F, 0x0F,
+ 0x8F, 0x87, 0xF0, 0x07, 0xE1, 0xF0, 0xF8, 0xFC, 0x00, 0xFC, 0x7E, 0x1F,
+ 0x1F, 0x80, 0x1F, 0x8F, 0x83, 0xE3, 0xF0, 0x01, 0xF9, 0xF0, 0x7C, 0x7E,
+ 0x00, 0x3F, 0x3E, 0x0F, 0x9F, 0x80, 0x07, 0xE7, 0xC0, 0xFB, 0xF0, 0x00,
+ 0xFD, 0xF0, 0x1F, 0x7E, 0x00, 0x0F, 0xBE, 0x03, 0xEF, 0xC0, 0x01, 0xFF,
+ 0xC0, 0x7D, 0xF0, 0x00, 0x3F, 0xF8, 0x0F, 0xFE, 0x00, 0x03, 0xFF, 0x00,
+ 0xFF, 0xC0, 0x00, 0x7F, 0xC0, 0x1F, 0xF0, 0x00, 0x0F, 0xF8, 0x03, 0xFE,
+ 0x00, 0x01, 0xFF, 0x00, 0x7F, 0xC0, 0x00, 0x1F, 0xE0, 0x07, 0xF8, 0x00,
+ 0x03, 0xFC, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x00, 0x07,
+ 0xE0, 0x03, 0xF8, 0x00, 0x7F, 0x80, 0x07, 0xF9, 0xFF, 0x00, 0x3F, 0xC3,
+ 0xFC, 0x00, 0xFF, 0x07, 0xF8, 0x07, 0xF8, 0x1F, 0xE0, 0x1F, 0xC0, 0x3F,
+ 0xC0, 0xFF, 0x00, 0xFF, 0x07, 0xF8, 0x01, 0xFE, 0x1F, 0xE0, 0x03, 0xF8,
+ 0xFF, 0x00, 0x0F, 0xF3, 0xF8, 0x00, 0x1F, 0xDF, 0xE0, 0x00, 0x3F, 0xFF,
+ 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x07, 0xFF, 0x00,
+ 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0xFF, 0x80, 0x00,
+ 0x03, 0xFF, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x03,
+ 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x7F, 0x7F, 0x80, 0x03, 0xF8,
+ 0xFF, 0x00, 0x1F, 0xE1, 0xFC, 0x00, 0x7F, 0x07, 0xF8, 0x03, 0xFC, 0x0F,
+ 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x80, 0x7F, 0x83, 0xFC, 0x01, 0xFE,
+ 0x0F, 0xF0, 0x03, 0xFC, 0x7F, 0x80, 0x0F, 0xFB, 0xFE, 0x00, 0x1F, 0xE0,
+ 0xFF, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x7F, 0x9F, 0xE0, 0x03, 0xFC, 0xFF,
+ 0x00, 0x3F, 0xC3, 0xFC, 0x01, 0xFE, 0x0F, 0xE0, 0x0F, 0xE0, 0x7F, 0x00,
+ 0xFF, 0x01, 0xFC, 0x07, 0xF0, 0x0F, 0xE0, 0x7F, 0x80, 0x3F, 0x83, 0xF8,
+ 0x01, 0xFC, 0x3F, 0xC0, 0x07, 0xF1, 0xFC, 0x00, 0x3F, 0x8F, 0xE0, 0x00,
+ 0xFE, 0xFE, 0x00, 0x07, 0xF7, 0xF0, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0xFF,
+ 0xF8, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x7F, 0xC0,
+ 0x00, 0x01, 0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00,
+ 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x07,
+ 0xF0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x0F, 0xE0,
+ 0x00, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00,
+ 0x00, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0,
+ 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F,
+ 0x80, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03,
+ 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x3F, 0xC0, 0x00,
+ 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFE, 0x00,
+ 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0,
+ 0x00, 0x0F, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F,
+ 0xE1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1,
+ 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC,
+ 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, 0x3F,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xE0, 0x03, 0xC0, 0x07, 0x00,
+ 0x1C, 0x00, 0x78, 0x00, 0xE0, 0x03, 0x80, 0x0F, 0x00, 0x1C, 0x00, 0x70,
+ 0x01, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0x70, 0x01, 0xC0, 0x07,
+ 0x00, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00,
+ 0x78, 0x00, 0xE0, 0x03, 0x80, 0x0F, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xE0,
+ 0x03, 0x80, 0x0E, 0x00, 0x3C, 0x00, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, 0x3F, 0x87, 0xF0,
+ 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE,
+ 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F,
+ 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xF0,
+ 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x0F, 0xFC, 0x00,
+ 0x7D, 0xF0, 0x01, 0xF7, 0xC0, 0x0F, 0xDF, 0x80, 0x3E, 0x3E, 0x00, 0xF8,
+ 0xFC, 0x07, 0xE1, 0xF0, 0x1F, 0x07, 0xC0, 0xFC, 0x1F, 0x83, 0xE0, 0x3E,
+ 0x0F, 0x80, 0xFC, 0x7E, 0x01, 0xF1, 0xF0, 0x07, 0xC7, 0xC0, 0x1F, 0xBE,
+ 0x00, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3E, 0x0F, 0x83, 0xC0, 0xF0, 0x38, 0x1E,
+ 0x01, 0xFF, 0x00, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0xF8,
+ 0x7F, 0xFF, 0xF8, 0x7F, 0xFF, 0xFC, 0x7F, 0x03, 0xFC, 0x7E, 0x01, 0xFC,
+ 0x00, 0x01, 0xFC, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xFC, 0x03, 0xFF, 0xFC,
+ 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x7F, 0xC1, 0xFC, 0xFF, 0x01, 0xFC,
+ 0xFE, 0x01, 0xFC, 0xFE, 0x03, 0xFC, 0xFE, 0x03, 0xFC, 0xFF, 0x07, 0xFC,
+ 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFC, 0x7F, 0xFF, 0xFC, 0x3F, 0xFD, 0xFE,
+ 0x1F, 0xF0, 0xFF, 0x07, 0xE0, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00,
+ 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00,
+ 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x0F,
+ 0xC0, 0x3F, 0x9F, 0xF8, 0x1F, 0xDF, 0xFF, 0x0F, 0xFF, 0xFF, 0xC7, 0xFF,
+ 0xFF, 0xE3, 0xFF, 0xFF, 0xF9, 0xFF, 0x83, 0xFE, 0xFF, 0x80, 0xFF, 0x7F,
+ 0x80, 0x3F, 0xBF, 0xC0, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xE0, 0x03, 0xFF,
+ 0xF0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x3F,
+ 0xFF, 0x80, 0x3F, 0xFF, 0xC0, 0x1F, 0xDF, 0xF0, 0x1F, 0xEF, 0xFC, 0x1F,
+ 0xF7, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xF8, 0xFE, 0xFF,
+ 0xF8, 0x7F, 0x3F, 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x00, 0xFF, 0x00, 0x07,
+ 0xFF, 0xC0, 0x3F, 0xFF, 0xC0, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xC7, 0xFF,
+ 0xFF, 0x9F, 0xF0, 0x7F, 0xBF, 0xC0, 0x7F, 0x7F, 0x00, 0x7F, 0xFC, 0x00,
+ 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00,
+ 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0xFD,
+ 0xFE, 0x03, 0xFB, 0xFE, 0x0F, 0xF3, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0x87,
+ 0xFF, 0xFE, 0x07, 0xFF, 0xF8, 0x03, 0xFF, 0xE0, 0x01, 0xFE, 0x00, 0x00,
+ 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0,
+ 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F,
+ 0x00, 0x00, 0x3F, 0x80, 0x7E, 0x1F, 0xC0, 0xFF, 0xCF, 0xE1, 0xFF, 0xF7,
+ 0xF1, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFE, 0xFF, 0x83,
+ 0xFF, 0x7F, 0x80, 0xFF, 0xBF, 0x80, 0x3F, 0xFF, 0xC0, 0x1F, 0xFF, 0xC0,
+ 0x07, 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, 0xFC,
+ 0x00, 0x7F, 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x3F, 0xDF, 0xC0, 0x1F, 0xEF,
+ 0xF0, 0x1F, 0xF7, 0xFC, 0x1F, 0xF9, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFE,
+ 0x3F, 0xFF, 0xFF, 0x0F, 0xFF, 0xBF, 0x81, 0xFF, 0x9F, 0xC0, 0x3F, 0x00,
+ 0x00, 0x00, 0xFE, 0x00, 0x03, 0xFF, 0x80, 0x0F, 0xFF, 0xE0, 0x1F, 0xFF,
+ 0xF0, 0x3F, 0xFF, 0xF8, 0x3F, 0xC3, 0xF8, 0x7F, 0x80, 0xFC, 0x7F, 0x00,
+ 0xFC, 0x7F, 0x00, 0x7C, 0xFE, 0x00, 0x7E, 0xFE, 0x00, 0x7E, 0xFF, 0xFF,
+ 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFE, 0x00,
+ 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x7F, 0x00,
+ 0xFE, 0x3F, 0xC1, 0xFE, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xF8, 0x0F, 0xFF,
+ 0xF0, 0x03, 0xFF, 0xC0, 0x00, 0xFF, 0x00, 0x01, 0xFC, 0x1F, 0xF0, 0xFF,
+ 0xC3, 0xFF, 0x1F, 0xFC, 0x7F, 0x81, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F,
+ 0x0F, 0xFF, 0xBF, 0xFE, 0xFF, 0xFB, 0xFF, 0xE1, 0xFC, 0x07, 0xF0, 0x1F,
+ 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07,
+ 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01,
+ 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x00, 0x00, 0xF8, 0x7F, 0x07, 0xFE,
+ 0x7F, 0x0F, 0xFF, 0x7F, 0x1F, 0xFF, 0x7F, 0x3F, 0xFF, 0xFF, 0x3F, 0xFF,
+ 0xFF, 0x7F, 0xC3, 0xFF, 0x7F, 0x81, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0x00,
+ 0xFF, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00,
+ 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0xFF, 0xFF, 0x00,
+ 0xFF, 0x7F, 0x81, 0xFF, 0x7F, 0xC3, 0xFF, 0x3F, 0xFF, 0xFF, 0x3F, 0xFF,
+ 0xFF, 0x1F, 0xFF, 0xFF, 0x0F, 0xFF, 0x7F, 0x07, 0xFE, 0x7F, 0x01, 0xF8,
+ 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x7F, 0x00,
+ 0xFF, 0x7F, 0x01, 0xFE, 0x7F, 0xC3, 0xFE, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF,
+ 0xF8, 0x0F, 0xFF, 0xE0, 0x01, 0xFF, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00,
+ 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00,
+ 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x3F, 0x83,
+ 0xF8, 0xFF, 0xC7, 0xF7, 0xFF, 0xCF, 0xEF, 0xFF, 0xDF, 0xFF, 0xFF, 0xBF,
+ 0xFF, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0x01, 0xFF, 0xFE, 0x01, 0xFF, 0xF8,
+ 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80,
+ 0x3F, 0xFF, 0x00, 0x7F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03,
+ 0xFF, 0xF0, 0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F,
+ 0xFF, 0x00, 0x7F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFC, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFC, 0x1F, 0xC7, 0xF1, 0xFC, 0x7F, 0x1F, 0xC7, 0xF0, 0x00,
+ 0x00, 0x00, 0x07, 0xF1, 0xFC, 0x7F, 0x1F, 0xC7, 0xF1, 0xFC, 0x7F, 0x1F,
+ 0xC7, 0xF1, 0xFC, 0x7F, 0x1F, 0xC7, 0xF1, 0xFC, 0x7F, 0x1F, 0xC7, 0xF1,
+ 0xFC, 0x7F, 0x1F, 0xC7, 0xF1, 0xFC, 0x7F, 0x1F, 0xC7, 0xF1, 0xFC, 0x7F,
+ 0x1F, 0xC7, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFE, 0xFE, 0x00,
+ 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F,
+ 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE,
+ 0x00, 0x01, 0xFC, 0x03, 0xFB, 0xF8, 0x0F, 0xE7, 0xF0, 0x3F, 0xCF, 0xE0,
+ 0xFF, 0x1F, 0xC3, 0xFC, 0x3F, 0x87, 0xF0, 0x7F, 0x1F, 0xC0, 0xFE, 0x7F,
+ 0x01, 0xFD, 0xFC, 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xF0, 0x0F, 0xFF, 0xE0,
+ 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, 0xE0, 0x7F, 0xDF, 0xC0, 0xFF, 0x3F, 0xC1,
+ 0xFC, 0x3F, 0x83, 0xF8, 0x3F, 0x87, 0xF0, 0x7F, 0x8F, 0xE0, 0x7F, 0x1F,
+ 0xC0, 0xFF, 0x3F, 0x80, 0xFE, 0x7F, 0x01, 0xFE, 0xFE, 0x01, 0xFD, 0xFC,
+ 0x03, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 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, 0xFE, 0x1F, 0x80, 0x7E,
+ 0x0F, 0xE7, 0xFE, 0x1F, 0xF8, 0xFE, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0xFF,
+ 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x83, 0xFF, 0x0F, 0xFF, 0xF0, 0x1F, 0xE0, 0x7F, 0xFE, 0x01, 0xFC, 0x07,
+ 0xFF, 0xE0, 0x1F, 0xC0, 0x7F, 0xFE, 0x01, 0xFC, 0x07, 0xFF, 0xE0, 0x1F,
+ 0xC0, 0x7F, 0xFE, 0x01, 0xFC, 0x07, 0xFF, 0xE0, 0x1F, 0xC0, 0x7F, 0xFE,
+ 0x01, 0xFC, 0x07, 0xFF, 0xE0, 0x1F, 0xC0, 0x7F, 0xFE, 0x01, 0xFC, 0x07,
+ 0xFF, 0xE0, 0x1F, 0xC0, 0x7F, 0xFE, 0x01, 0xFC, 0x07, 0xFF, 0xE0, 0x1F,
+ 0xC0, 0x7F, 0xFE, 0x01, 0xFC, 0x07, 0xFF, 0xE0, 0x1F, 0xC0, 0x7F, 0xFE,
+ 0x01, 0xFC, 0x07, 0xFF, 0xE0, 0x1F, 0xC0, 0x7F, 0xFE, 0x01, 0xFC, 0x07,
+ 0xF0, 0xFE, 0x1F, 0xC1, 0xFC, 0xFF, 0xE3, 0xFB, 0xFF, 0xE7, 0xFF, 0xFF,
+ 0xEF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0x80, 0xFF,
+ 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x07, 0xFF,
+ 0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x7F, 0xFE,
+ 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xE0,
+ 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x7F, 0xFE, 0x00,
+ 0xFE, 0x00, 0x7F, 0x80, 0x01, 0xFF, 0xF0, 0x01, 0xFF, 0xFE, 0x01, 0xFF,
+ 0xFF, 0x81, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xF1, 0xFF, 0x07, 0xFC, 0xFF,
+ 0x01, 0xFE, 0x7F, 0x00, 0x7F, 0x7F, 0x80, 0x3F, 0xFF, 0x80, 0x0F, 0xFF,
+ 0xC0, 0x07, 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xF8, 0x00, 0xFF,
+ 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xBF, 0x80, 0x3F, 0x9F, 0xE0, 0x3F,
+ 0xCF, 0xF8, 0x3F, 0xE3, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF,
+ 0xF0, 0x0F, 0xFF, 0xF0, 0x03, 0xFF, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0xFE,
+ 0x1F, 0x80, 0x7F, 0x3F, 0xF0, 0x3F, 0xBF, 0xFE, 0x1F, 0xDF, 0xFF, 0x8F,
+ 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xF3, 0xFF, 0x07, 0xFD, 0xFF, 0x01, 0xFE,
+ 0xFF, 0x00, 0x7F, 0x7F, 0x80, 0x3F, 0xFF, 0x80, 0x0F, 0xFF, 0xC0, 0x07,
+ 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00,
+ 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x80, 0x3F, 0xBF, 0xE0, 0x3F, 0xDF, 0xF8,
+ 0x3F, 0xCF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xE3, 0xFB, 0xFF, 0xE1, 0xFD,
+ 0xFF, 0xF0, 0xFE, 0x7F, 0xE0, 0x7F, 0x0F, 0xC0, 0x3F, 0x80, 0x00, 0x1F,
+ 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01,
+ 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00,
+ 0x1F, 0xC0, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x81, 0xFF, 0x9F, 0xC3, 0xFF,
+ 0xEF, 0xE1, 0xFF, 0xF7, 0xF1, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFD, 0xFF,
+ 0x07, 0xFE, 0xFF, 0x01, 0xFF, 0x7F, 0x00, 0x7F, 0xFF, 0x80, 0x3F, 0xFF,
+ 0x80, 0x0F, 0xFF, 0xC0, 0x07, 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF,
+ 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xBF, 0x80, 0x3F,
+ 0xDF, 0xE0, 0x3F, 0xEF, 0xF8, 0x3F, 0xF3, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF,
+ 0xFC, 0x7F, 0xFE, 0xFE, 0x1F, 0xFF, 0x7F, 0x03, 0xFF, 0x3F, 0x80, 0x7E,
+ 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00,
+ 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80,
+ 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0xFE, 0x1F, 0xFC,
+ 0x7F, 0xFB, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7F, 0x80,
+ 0xFF, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F,
+ 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xE0,
+ 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x07,
+ 0xFF, 0xE0, 0x0F, 0xFF, 0xF8, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x7F,
+ 0x81, 0xFE, 0x7F, 0x00, 0xFE, 0x7F, 0x00, 0xFE, 0x7F, 0xC0, 0x00, 0x7F,
+ 0xFC, 0x00, 0x7F, 0xFF, 0x80, 0x3F, 0xFF, 0xF0, 0x1F, 0xFF, 0xFC, 0x07,
+ 0xFF, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0x00,
+ 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0x7F, 0x81, 0xFE, 0x7F,
+ 0xFF, 0xFE, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x01,
+ 0xFF, 0x80, 0x3F, 0x83, 0xF8, 0x3F, 0x83, 0xF8, 0x3F, 0x83, 0xF8, 0x3F,
+ 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xF8, 0x3F, 0x83, 0xF8, 0x3F,
+ 0x83, 0xF8, 0x3F, 0x83, 0xF8, 0x3F, 0x83, 0xF8, 0x3F, 0x83, 0xF8, 0x3F,
+ 0x83, 0xF8, 0x3F, 0x83, 0xF8, 0x3F, 0x83, 0xFF, 0x3F, 0xF1, 0xFF, 0x0F,
+ 0xF0, 0x7F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xF0,
+ 0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00,
+ 0x7F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x07,
+ 0xFF, 0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x7F,
+ 0xFE, 0x00, 0xFF, 0xFC, 0x03, 0xFF, 0xFC, 0x07, 0xFF, 0xFC, 0x3F, 0xFF,
+ 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xDF, 0xFF, 0xBF, 0x9F, 0xFF, 0x7F, 0x1F,
+ 0xFC, 0xFE, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x3F, 0xBF, 0x80, 0x1F, 0x9F,
+ 0xC0, 0x1F, 0xC7, 0xE0, 0x0F, 0xE3, 0xF8, 0x07, 0xE1, 0xFC, 0x07, 0xF0,
+ 0x7E, 0x03, 0xF8, 0x3F, 0x81, 0xF8, 0x1F, 0xC0, 0xFC, 0x07, 0xE0, 0xFE,
+ 0x03, 0xF8, 0x7E, 0x00, 0xFC, 0x3F, 0x00, 0x7E, 0x1F, 0x80, 0x3F, 0x1F,
+ 0x80, 0x0F, 0xCF, 0xC0, 0x07, 0xE7, 0xE0, 0x03, 0xF7, 0xE0, 0x00, 0xFF,
+ 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0xF8, 0x00, 0x0F, 0xFC, 0x00, 0x07,
+ 0xFE, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00,
+ 0xFC, 0x03, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0x01, 0xFF, 0xF8, 0x0F, 0xE0,
+ 0x3F, 0x3F, 0x03, 0xFE, 0x07, 0xE7, 0xE0, 0x7F, 0xC1, 0xFC, 0xFE, 0x0F,
+ 0xF8, 0x3F, 0x9F, 0xC1, 0xFF, 0x07, 0xE1, 0xF8, 0x3D, 0xE0, 0xFC, 0x3F,
+ 0x0F, 0xBE, 0x3F, 0x87, 0xF1, 0xF7, 0xC7, 0xE0, 0x7E, 0x3E, 0xF8, 0xFC,
+ 0x0F, 0xC7, 0xDF, 0x1F, 0x81, 0xF9, 0xF1, 0xE3, 0xF0, 0x3F, 0x3E, 0x3E,
+ 0xFC, 0x03, 0xF7, 0xC7, 0xDF, 0x80, 0x7E, 0xF8, 0xFB, 0xF0, 0x0F, 0xDE,
+ 0x1F, 0x7C, 0x00, 0xFF, 0xC1, 0xFF, 0x80, 0x1F, 0xF8, 0x3F, 0xF0, 0x03,
+ 0xFF, 0x07, 0xFE, 0x00, 0x7F, 0xC0, 0xFF, 0x80, 0x07, 0xF8, 0x1F, 0xF0,
+ 0x00, 0xFF, 0x01, 0xFE, 0x00, 0x1F, 0xE0, 0x3F, 0x80, 0x01, 0xFC, 0x07,
+ 0xF0, 0x00, 0xFF, 0x00, 0xFF, 0x7F, 0x81, 0xFE, 0x3F, 0x81, 0xFC, 0x3F,
+ 0xC3, 0xFC, 0x1F, 0xC3, 0xF8, 0x0F, 0xE7, 0xF0, 0x0F, 0xEF, 0xF0, 0x07,
+ 0xFF, 0xE0, 0x03, 0xFF, 0xC0, 0x03, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0x00,
+ 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x03,
+ 0xFF, 0xC0, 0x07, 0xFF, 0xC0, 0x07, 0xFF, 0xE0, 0x0F, 0xE7, 0xF0, 0x1F,
+ 0xE7, 0xF0, 0x1F, 0xC3, 0xF8, 0x3F, 0xC3, 0xFC, 0x7F, 0x81, 0xFC, 0x7F,
+ 0x01, 0xFE, 0xFF, 0x00, 0xFF, 0x7F, 0x00, 0x3F, 0xBF, 0x80, 0x1F, 0xDF,
+ 0xC0, 0x0F, 0xC7, 0xF0, 0x07, 0xE3, 0xF8, 0x07, 0xF1, 0xFC, 0x03, 0xF0,
+ 0x7F, 0x01, 0xF8, 0x3F, 0x81, 0xFC, 0x0F, 0xC0, 0xFC, 0x07, 0xF0, 0x7E,
+ 0x03, 0xF8, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0x7E, 0x1F, 0x80, 0x3F, 0x8F,
+ 0xC0, 0x0F, 0xCF, 0xC0, 0x07, 0xE7, 0xE0, 0x03, 0xFB, 0xF0, 0x00, 0xFD,
+ 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xFC, 0x00, 0x07,
+ 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00,
+ 0x1F, 0xC0, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xF0, 0x00,
+ 0x03, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x0F, 0xFC, 0x00,
+ 0x07, 0xFC, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x7F, 0xFF,
+ 0xFB, 0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xBF,
+ 0xFF, 0xFC, 0x00, 0x3F, 0xE0, 0x03, 0xFE, 0x00, 0x1F, 0xE0, 0x01, 0xFE,
+ 0x00, 0x1F, 0xE0, 0x01, 0xFE, 0x00, 0x1F, 0xE0, 0x01, 0xFE, 0x00, 0x1F,
+ 0xE0, 0x01, 0xFE, 0x00, 0x1F, 0xE0, 0x01, 0xFE, 0x00, 0x1F, 0xE0, 0x01,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xF8, 0x01, 0xF8, 0x1F, 0xC1, 0xFE, 0x0F, 0xF0, 0xFF,
+ 0x87, 0xE0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00,
+ 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x3F,
+ 0x0F, 0xF0, 0x7F, 0x03, 0xF8, 0x1F, 0xE0, 0x1F, 0x80, 0x7C, 0x03, 0xE0,
+ 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03,
+ 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xE0, 0x3F, 0xE0, 0xFF, 0x07, 0xF8, 0x1F,
+ 0xC0, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFC, 0x07, 0xF0, 0x3F, 0xC1, 0xFE, 0x0F, 0xF8, 0x0F, 0xC0, 0x3E, 0x01,
+ 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E,
+ 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x80, 0x7F, 0x81, 0xFC,
+ 0x0F, 0xE0, 0xFF, 0x0F, 0xC0, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07,
+ 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8,
+ 0x0F, 0xC3, 0xFE, 0x1F, 0xE0, 0xFF, 0x07, 0xF0, 0x3F, 0x00, 0x1F, 0x00,
+ 0x03, 0xFE, 0x00, 0x1F, 0xF8, 0x0F, 0xFF, 0xF0, 0xFF, 0x0F, 0xFF, 0xF0,
+ 0x1F, 0xF8, 0x00, 0x7F, 0x80, 0x00, 0xF8 };
+
+const GFXglyph FreeSansBold24pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 13, 0, 1 }, // 0x20 ' '
+ { 0, 7, 34, 16, 5, -33 }, // 0x21 '!'
+ { 30, 18, 12, 22, 2, -33 }, // 0x22 '"'
+ { 57, 26, 33, 26, 0, -31 }, // 0x23 '#'
+ { 165, 25, 40, 26, 1, -34 }, // 0x24 '$'
+ { 290, 39, 34, 42, 1, -32 }, // 0x25 '%'
+ { 456, 30, 35, 34, 3, -33 }, // 0x26 '&'
+ { 588, 7, 12, 12, 3, -33 }, // 0x27 '''
+ { 599, 13, 44, 16, 2, -33 }, // 0x28 '('
+ { 671, 13, 44, 16, 1, -33 }, // 0x29 ')'
+ { 743, 15, 15, 18, 1, -33 }, // 0x2A '*'
+ { 772, 23, 22, 27, 2, -21 }, // 0x2B '+'
+ { 836, 7, 15, 12, 2, -6 }, // 0x2C ','
+ { 850, 13, 6, 16, 1, -15 }, // 0x2D '-'
+ { 860, 7, 7, 12, 2, -6 }, // 0x2E '.'
+ { 867, 13, 34, 13, 0, -32 }, // 0x2F '/'
+ { 923, 24, 35, 26, 1, -33 }, // 0x30 '0'
+ { 1028, 14, 33, 26, 4, -32 }, // 0x31 '1'
+ { 1086, 23, 34, 26, 2, -33 }, // 0x32 '2'
+ { 1184, 23, 35, 26, 2, -33 }, // 0x33 '3'
+ { 1285, 22, 33, 26, 2, -32 }, // 0x34 '4'
+ { 1376, 23, 34, 26, 2, -32 }, // 0x35 '5'
+ { 1474, 23, 35, 26, 2, -33 }, // 0x36 '6'
+ { 1575, 23, 33, 26, 1, -32 }, // 0x37 '7'
+ { 1670, 24, 35, 26, 1, -33 }, // 0x38 '8'
+ { 1775, 24, 35, 26, 1, -33 }, // 0x39 '9'
+ { 1880, 7, 25, 12, 2, -24 }, // 0x3A ':'
+ { 1902, 7, 33, 12, 2, -24 }, // 0x3B ';'
+ { 1931, 23, 23, 27, 2, -22 }, // 0x3C '<'
+ { 1998, 23, 18, 27, 2, -19 }, // 0x3D '='
+ { 2050, 23, 23, 27, 2, -22 }, // 0x3E '>'
+ { 2117, 24, 35, 29, 3, -34 }, // 0x3F '?'
+ { 2222, 43, 41, 46, 1, -34 }, // 0x40 '@'
+ { 2443, 32, 34, 33, 0, -33 }, // 0x41 'A'
+ { 2579, 27, 34, 33, 4, -33 }, // 0x42 'B'
+ { 2694, 30, 36, 34, 2, -34 }, // 0x43 'C'
+ { 2829, 28, 34, 34, 4, -33 }, // 0x44 'D'
+ { 2948, 25, 34, 31, 4, -33 }, // 0x45 'E'
+ { 3055, 24, 34, 30, 4, -33 }, // 0x46 'F'
+ { 3157, 31, 36, 36, 2, -34 }, // 0x47 'G'
+ { 3297, 27, 34, 35, 4, -33 }, // 0x48 'H'
+ { 3412, 7, 34, 15, 4, -33 }, // 0x49 'I'
+ { 3442, 22, 35, 27, 1, -33 }, // 0x4A 'J'
+ { 3539, 30, 34, 34, 4, -33 }, // 0x4B 'K'
+ { 3667, 23, 34, 29, 4, -33 }, // 0x4C 'L'
+ { 3765, 33, 34, 41, 4, -33 }, // 0x4D 'M'
+ { 3906, 28, 34, 35, 4, -33 }, // 0x4E 'N'
+ { 4025, 33, 36, 37, 2, -34 }, // 0x4F 'O'
+ { 4174, 26, 34, 32, 4, -33 }, // 0x50 'P'
+ { 4285, 33, 37, 37, 2, -34 }, // 0x51 'Q'
+ { 4438, 28, 34, 34, 4, -33 }, // 0x52 'R'
+ { 4557, 28, 36, 32, 2, -34 }, // 0x53 'S'
+ { 4683, 27, 34, 30, 2, -33 }, // 0x54 'T'
+ { 4798, 27, 35, 35, 4, -33 }, // 0x55 'U'
+ { 4917, 29, 34, 31, 1, -33 }, // 0x56 'V'
+ { 5041, 43, 34, 45, 1, -33 }, // 0x57 'W'
+ { 5224, 30, 34, 32, 1, -33 }, // 0x58 'X'
+ { 5352, 29, 34, 30, 1, -33 }, // 0x59 'Y'
+ { 5476, 26, 34, 29, 1, -33 }, // 0x5A 'Z'
+ { 5587, 11, 43, 16, 3, -33 }, // 0x5B '['
+ { 5647, 14, 34, 13, -1, -32 }, // 0x5C '\'
+ { 5707, 11, 43, 16, 1, -33 }, // 0x5D ']'
+ { 5767, 22, 20, 27, 3, -32 }, // 0x5E '^'
+ { 5822, 28, 4, 26, -1, 6 }, // 0x5F '_'
+ { 5836, 9, 7, 12, 1, -35 }, // 0x60 '`'
+ { 5844, 24, 26, 27, 2, -24 }, // 0x61 'a'
+ { 5922, 25, 35, 29, 3, -33 }, // 0x62 'b'
+ { 6032, 23, 26, 26, 2, -24 }, // 0x63 'c'
+ { 6107, 25, 35, 29, 2, -33 }, // 0x64 'd'
+ { 6217, 24, 26, 27, 2, -24 }, // 0x65 'e'
+ { 6295, 14, 34, 16, 1, -33 }, // 0x66 'f'
+ { 6355, 24, 36, 29, 2, -24 }, // 0x67 'g'
+ { 6463, 23, 34, 28, 3, -33 }, // 0x68 'h'
+ { 6561, 7, 34, 13, 3, -33 }, // 0x69 'i'
+ { 6591, 10, 45, 13, 0, -33 }, // 0x6A 'j'
+ { 6648, 23, 34, 27, 3, -33 }, // 0x6B 'k'
+ { 6746, 7, 34, 13, 3, -33 }, // 0x6C 'l'
+ { 6776, 36, 25, 42, 3, -24 }, // 0x6D 'm'
+ { 6889, 23, 25, 29, 3, -24 }, // 0x6E 'n'
+ { 6961, 25, 26, 29, 2, -24 }, // 0x6F 'o'
+ { 7043, 25, 36, 29, 3, -24 }, // 0x70 'p'
+ { 7156, 25, 36, 29, 2, -24 }, // 0x71 'q'
+ { 7269, 15, 25, 18, 3, -24 }, // 0x72 'r'
+ { 7316, 24, 26, 26, 1, -24 }, // 0x73 's'
+ { 7394, 12, 32, 16, 2, -30 }, // 0x74 't'
+ { 7442, 23, 26, 29, 3, -24 }, // 0x75 'u'
+ { 7517, 25, 25, 25, 0, -24 }, // 0x76 'v'
+ { 7596, 35, 25, 37, 1, -24 }, // 0x77 'w'
+ { 7706, 24, 25, 26, 1, -24 }, // 0x78 'x'
+ { 7781, 25, 36, 26, 0, -24 }, // 0x79 'y'
+ { 7894, 21, 25, 24, 1, -24 }, // 0x7A 'z'
+ { 7960, 13, 43, 18, 2, -33 }, // 0x7B '{'
+ { 8030, 4, 44, 13, 5, -33 }, // 0x7C '|'
+ { 8052, 13, 43, 18, 3, -33 }, // 0x7D '}'
+ { 8122, 21, 8, 23, 1, -14 } }; // 0x7E '~'
+
+const GFXfont FreeSansBold24pt7b PROGMEM = {
+ (uint8_t *)FreeSansBold24pt7bBitmaps,
+ (GFXglyph *)FreeSansBold24pt7bGlyphs,
+ 0x20, 0x7E, 56 };
+
+// Approx. 8815 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBold9pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBold9pt7b.h
new file mode 100644
index 000000000000..aeea463e7b0a
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBold9pt7b.h
@@ -0,0 +1,208 @@
+const uint8_t FreeSansBold9pt7bBitmaps[] PROGMEM = {
+ 0xFF, 0xFF, 0xFE, 0x48, 0x7E, 0xEF, 0xDF, 0xBF, 0x74, 0x40, 0x19, 0x86,
+ 0x67, 0xFD, 0xFF, 0x33, 0x0C, 0xC3, 0x33, 0xFE, 0xFF, 0x99, 0x86, 0x61,
+ 0x90, 0x10, 0x1F, 0x1F, 0xDE, 0xFF, 0x3F, 0x83, 0xC0, 0xFC, 0x1F, 0x09,
+ 0xFC, 0xFE, 0xF7, 0xF1, 0xE0, 0x40, 0x38, 0x10, 0x7C, 0x30, 0xC6, 0x20,
+ 0xC6, 0x40, 0xC6, 0x40, 0x7C, 0x80, 0x39, 0x9C, 0x01, 0x3E, 0x03, 0x63,
+ 0x02, 0x63, 0x04, 0x63, 0x0C, 0x3E, 0x08, 0x1C, 0x0E, 0x01, 0xF8, 0x3B,
+ 0x83, 0xB8, 0x3F, 0x01, 0xE0, 0x3E, 0x67, 0x76, 0xE3, 0xEE, 0x1C, 0xF3,
+ 0xC7, 0xFE, 0x3F, 0x70, 0xFF, 0xF4, 0x18, 0x63, 0x1C, 0x73, 0x8E, 0x38,
+ 0xE3, 0x8E, 0x18, 0x70, 0xC3, 0x06, 0x08, 0x61, 0x83, 0x0E, 0x38, 0x71,
+ 0xC7, 0x1C, 0x71, 0xC6, 0x38, 0xE3, 0x18, 0x40, 0x21, 0x3E, 0x45, 0x28,
+ 0x38, 0x70, 0xE7, 0xFF, 0xE7, 0x0E, 0x1C, 0xFC, 0x9C, 0xFF, 0xC0, 0xFC,
+ 0x08, 0xC4, 0x23, 0x10, 0x84, 0x62, 0x11, 0x88, 0x00, 0x3E, 0x3F, 0x9D,
+ 0xDC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0xF1, 0xDD, 0xCF, 0xE3, 0xE0,
+ 0x08, 0xFF, 0xF3, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x80, 0x3E, 0x3F, 0xB8,
+ 0xFC, 0x70, 0x38, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x0F, 0xF7, 0xF8,
+ 0x3C, 0x7F, 0xE7, 0xE7, 0x07, 0x0C, 0x0E, 0x07, 0x07, 0xE7, 0xE7, 0x7E,
+ 0x3C, 0x0E, 0x1E, 0x1E, 0x2E, 0x2E, 0x4E, 0x4E, 0x8E, 0xFF, 0xFF, 0x0E,
+ 0x0E, 0x0E, 0x7F, 0x3F, 0x90, 0x18, 0x0D, 0xE7, 0xFB, 0x9E, 0x07, 0x03,
+ 0x81, 0xF1, 0xFF, 0xE7, 0xC0, 0x3E, 0x3F, 0x9C, 0xFC, 0x0E, 0xE7, 0xFB,
+ 0xDF, 0xC7, 0xE3, 0xF1, 0xDD, 0xEF, 0xE3, 0xE0, 0xFF, 0xFF, 0xC0, 0xE0,
+ 0xE0, 0x60, 0x70, 0x30, 0x38, 0x1C, 0x0C, 0x0E, 0x07, 0x03, 0x80, 0x3F,
+ 0x1F, 0xEE, 0x3F, 0x87, 0xE3, 0xCF, 0xC7, 0xFB, 0xCF, 0xE1, 0xF8, 0x7F,
+ 0x3D, 0xFE, 0x3F, 0x00, 0x3E, 0x3F, 0xBD, 0xDC, 0x7E, 0x3F, 0x1F, 0xDE,
+ 0xFF, 0x3B, 0x81, 0xF9, 0xCF, 0xE3, 0xC0, 0xFC, 0x00, 0x07, 0xE0, 0xFC,
+ 0x00, 0x07, 0xE5, 0xE0, 0x00, 0x83, 0xC7, 0xDF, 0x0C, 0x07, 0x80, 0xF8,
+ 0x1F, 0x01, 0x80, 0xFF, 0xFF, 0xC0, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x70,
+ 0x3F, 0x03, 0xE0, 0x38, 0x7D, 0xF1, 0xE0, 0x80, 0x00, 0x3E, 0x3F, 0xB8,
+ 0xFC, 0x70, 0x38, 0x1C, 0x1C, 0x1C, 0x1C, 0x0E, 0x00, 0x03, 0x81, 0xC0,
+ 0x03, 0xF0, 0x0F, 0xFC, 0x1E, 0x0E, 0x38, 0x02, 0x70, 0xE9, 0x63, 0x19,
+ 0xC2, 0x19, 0xC6, 0x11, 0xC6, 0x33, 0xC6, 0x32, 0x63, 0xFE, 0x73, 0xDC,
+ 0x3C, 0x00, 0x1F, 0xF8, 0x07, 0xF0, 0x07, 0x00, 0xF0, 0x0F, 0x80, 0xF8,
+ 0x1D, 0x81, 0x9C, 0x19, 0xC3, 0x8C, 0x3F, 0xE7, 0xFE, 0x70, 0x66, 0x07,
+ 0xE0, 0x70, 0xFF, 0x9F, 0xFB, 0x83, 0xF0, 0x7E, 0x0F, 0xFF, 0x3F, 0xF7,
+ 0x06, 0xE0, 0xFC, 0x1F, 0x83, 0xFF, 0xEF, 0xF8, 0x1F, 0x83, 0xFE, 0x78,
+ 0xE7, 0x07, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x07, 0x07, 0x78,
+ 0xF3, 0xFE, 0x1F, 0x80, 0xFF, 0x8F, 0xFC, 0xE0, 0xEE, 0x0E, 0xE0, 0x7E,
+ 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x0E, 0xE0, 0xEF, 0xFC, 0xFF, 0x80,
+ 0xFF, 0xFF, 0xF8, 0x1C, 0x0E, 0x07, 0xFB, 0xFD, 0xC0, 0xE0, 0x70, 0x38,
+ 0x1F, 0xFF, 0xF8, 0xFF, 0xFF, 0xF8, 0x1C, 0x0E, 0x07, 0xFB, 0xFD, 0xC0,
+ 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x00, 0x0F, 0x87, 0xF9, 0xE3, 0xB8, 0x3E,
+ 0x01, 0xC0, 0x38, 0xFF, 0x1F, 0xE0, 0x6E, 0x0D, 0xE3, 0x9F, 0xD0, 0xF2,
+ 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xFF, 0xFF, 0xFF, 0x07, 0xE0,
+ 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x07,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xE7, 0xE7, 0xE7, 0x7E, 0x3C,
+ 0xE0, 0xEE, 0x1C, 0xE3, 0x8E, 0x70, 0xEE, 0x0F, 0xC0, 0xFE, 0x0F, 0x70,
+ 0xE7, 0x0E, 0x38, 0xE1, 0xCE, 0x0E, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
+ 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xFF, 0xFF, 0xF8, 0x7F, 0xE1,
+ 0xFF, 0x87, 0xFE, 0x1F, 0xEC, 0x7F, 0xB3, 0x7E, 0xCD, 0xFB, 0x37, 0xEC,
+ 0xDF, 0x9E, 0x7E, 0x79, 0xF9, 0xE7, 0xE7, 0x9C, 0xE0, 0xFE, 0x1F, 0xC3,
+ 0xFC, 0x7F, 0xCF, 0xD9, 0xFB, 0xBF, 0x37, 0xE7, 0xFC, 0x7F, 0x87, 0xF0,
+ 0xFE, 0x0E, 0x0F, 0x81, 0xFF, 0x1E, 0x3C, 0xE0, 0xEE, 0x03, 0xF0, 0x1F,
+ 0x80, 0xFC, 0x07, 0xE0, 0x3B, 0x83, 0x9E, 0x3C, 0x7F, 0xC0, 0xF8, 0x00,
+ 0xFF, 0x9F, 0xFB, 0x87, 0xF0, 0x7E, 0x0F, 0xC3, 0xFF, 0xF7, 0xFC, 0xE0,
+ 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x00, 0x0F, 0x81, 0xFF, 0x1E, 0x3C, 0xE0,
+ 0xEE, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE1, 0xBB, 0x8F, 0x9E, 0x3C,
+ 0x7F, 0xE0, 0xFB, 0x80, 0x08, 0xFF, 0x8F, 0xFC, 0xE0, 0xEE, 0x0E, 0xE0,
+ 0xEE, 0x0E, 0xFF, 0xCF, 0xFC, 0xE0, 0xEE, 0x0E, 0xE0, 0xEE, 0x0E, 0xE0,
+ 0xF0, 0x3F, 0x0F, 0xFB, 0xC7, 0xF0, 0x7E, 0x01, 0xFC, 0x1F, 0xF0, 0x3F,
+ 0x00, 0xFC, 0x1D, 0xC7, 0xBF, 0xE1, 0xF8, 0xFF, 0xFF, 0xC7, 0x03, 0x81,
+ 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0xFC,
+ 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F,
+ 0xC7, 0xBF, 0xE1, 0xF0, 0x60, 0x67, 0x0E, 0x70, 0xE3, 0x0C, 0x30, 0xC3,
+ 0x9C, 0x19, 0x81, 0x98, 0x1F, 0x80, 0xF0, 0x0F, 0x00, 0xF0, 0x06, 0x00,
+ 0x61, 0xC3, 0xB8, 0xE1, 0x9C, 0x70, 0xCE, 0x3C, 0xE3, 0x36, 0x71, 0x9B,
+ 0x30, 0xED, 0x98, 0x36, 0x7C, 0x1B, 0x3C, 0x0F, 0x1E, 0x07, 0x8F, 0x01,
+ 0xC3, 0x80, 0xE1, 0x80, 0x70, 0xE7, 0x8E, 0x39, 0xC1, 0xF8, 0x1F, 0x80,
+ 0xF0, 0x07, 0x00, 0xF0, 0x1F, 0x81, 0x9C, 0x39, 0xC7, 0x0E, 0x70, 0xE0,
+ 0xE0, 0xFC, 0x39, 0xC7, 0x18, 0xC3, 0xB8, 0x36, 0x07, 0xC0, 0x70, 0x0E,
+ 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0xFF, 0xFF, 0xC0, 0xE0, 0xE0, 0xF0,
+ 0x70, 0x70, 0x70, 0x78, 0x38, 0x38, 0x1F, 0xFF, 0xF8, 0xFF, 0xEE, 0xEE,
+ 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xF0, 0x86, 0x10, 0x86, 0x10, 0x84, 0x30,
+ 0x84, 0x30, 0x80, 0xFF, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xF0,
+ 0x18, 0x1C, 0x3C, 0x3E, 0x36, 0x66, 0x63, 0xC3, 0xFF, 0xC0, 0xCC, 0x3F,
+ 0x1F, 0xEE, 0x38, 0x0E, 0x3F, 0x9E, 0xEE, 0x3B, 0x9E, 0xFF, 0x9E, 0xE0,
+ 0xE0, 0x38, 0x0E, 0x03, 0xBC, 0xFF, 0xBC, 0xEE, 0x1F, 0x87, 0xE1, 0xF8,
+ 0x7F, 0x3B, 0xFE, 0xEF, 0x00, 0x1F, 0x3F, 0xDC, 0x7C, 0x0E, 0x07, 0x03,
+ 0x80, 0xE3, 0x7F, 0x8F, 0x00, 0x03, 0x81, 0xC0, 0xE7, 0x77, 0xFB, 0xBF,
+ 0x8F, 0xC7, 0xE3, 0xF1, 0xFD, 0xEF, 0xF3, 0xB8, 0x3E, 0x3F, 0x9C, 0xDC,
+ 0x3F, 0xFF, 0xFF, 0x81, 0xC3, 0x7F, 0x8F, 0x00, 0x3B, 0xDD, 0xFF, 0xB9,
+ 0xCE, 0x73, 0x9C, 0xE7, 0x00, 0x3B, 0xBF, 0xDD, 0xFC, 0x7E, 0x3F, 0x1F,
+ 0x8F, 0xEF, 0x7F, 0x9D, 0xC0, 0xFC, 0x77, 0xF1, 0xF0, 0xE0, 0x70, 0x38,
+ 0x1D, 0xEF, 0xFF, 0x9F, 0x8F, 0xC7, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, 0x38,
+ 0xFC, 0x7F, 0xFF, 0xFF, 0xFE, 0x77, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x7F, 0xE0, 0xE0, 0x70, 0x38, 0x1C, 0x7E, 0x77, 0x73, 0xF1, 0xF8, 0xFE,
+ 0x77, 0x39, 0xDC, 0x6E, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEF, 0x7B,
+ 0xFF, 0xFE, 0x39, 0xF8, 0xE7, 0xE3, 0x9F, 0x8E, 0x7E, 0x39, 0xF8, 0xE7,
+ 0xE3, 0x9F, 0x8E, 0x70, 0xEF, 0x7F, 0xF8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F,
+ 0xC7, 0xE3, 0xF1, 0xC0, 0x1E, 0x1F, 0xE7, 0x3B, 0x87, 0xE1, 0xF8, 0x7E,
+ 0x1D, 0xCE, 0x7F, 0x87, 0x80, 0xEF, 0x3F, 0xEF, 0x3B, 0x87, 0xE1, 0xF8,
+ 0x7E, 0x1F, 0xCE, 0xFF, 0xBB, 0xCE, 0x03, 0x80, 0xE0, 0x38, 0x00, 0x3B,
+ 0xBF, 0xFD, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F, 0xEF, 0x7F, 0x9D, 0xC0, 0xE0,
+ 0x70, 0x38, 0x1C, 0xEF, 0xFF, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x80, 0x3E,
+ 0x3F, 0xB8, 0xFC, 0x0F, 0xC3, 0xFC, 0x3F, 0xC7, 0xFF, 0x1F, 0x00, 0x73,
+ 0xBF, 0xF7, 0x39, 0xCE, 0x73, 0x9E, 0x70, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E,
+ 0x3F, 0x1F, 0x8F, 0xC7, 0xFF, 0xBD, 0xC0, 0xE1, 0x98, 0x67, 0x39, 0xCC,
+ 0x33, 0x0D, 0xC3, 0xE0, 0x78, 0x1E, 0x07, 0x00, 0xE3, 0x1D, 0x9E, 0x66,
+ 0x79, 0x99, 0xE6, 0x77, 0xB8, 0xD2, 0xC3, 0xCF, 0x0F, 0x3C, 0x3C, 0xF0,
+ 0x73, 0x80, 0x73, 0x9C, 0xE3, 0xF0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0xFC,
+ 0x73, 0x9C, 0xE0, 0xE1, 0xD8, 0x67, 0x39, 0xCE, 0x33, 0x0E, 0xC3, 0xE0,
+ 0x78, 0x1E, 0x03, 0x00, 0xC0, 0x70, 0x38, 0x0E, 0x00, 0xFE, 0xFE, 0x0E,
+ 0x1C, 0x38, 0x38, 0x70, 0xE0, 0xFF, 0xFF, 0x37, 0x66, 0x66, 0x6E, 0xE6,
+ 0x66, 0x66, 0x67, 0x30, 0xFF, 0xFF, 0x80, 0xCE, 0x66, 0x66, 0x67, 0x76,
+ 0x66, 0x66, 0x6E, 0xC0, 0x71, 0x8E };
+
+const GFXglyph FreeSansBold9pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 5, 0, 1 }, // 0x20 ' '
+ { 0, 3, 13, 6, 2, -12 }, // 0x21 '!'
+ { 5, 7, 5, 9, 1, -12 }, // 0x22 '"'
+ { 10, 10, 12, 10, 0, -11 }, // 0x23 '#'
+ { 25, 9, 15, 10, 1, -13 }, // 0x24 '$'
+ { 42, 16, 13, 16, 0, -12 }, // 0x25 '%'
+ { 68, 12, 13, 13, 1, -12 }, // 0x26 '&'
+ { 88, 3, 5, 5, 1, -12 }, // 0x27 '''
+ { 90, 6, 17, 6, 1, -12 }, // 0x28 '('
+ { 103, 6, 17, 6, 0, -12 }, // 0x29 ')'
+ { 116, 5, 6, 7, 1, -12 }, // 0x2A '*'
+ { 120, 7, 8, 11, 2, -7 }, // 0x2B '+'
+ { 127, 3, 5, 4, 1, -1 }, // 0x2C ','
+ { 129, 5, 2, 6, 0, -5 }, // 0x2D '-'
+ { 131, 3, 2, 4, 1, -1 }, // 0x2E '.'
+ { 132, 5, 13, 5, 0, -12 }, // 0x2F '/'
+ { 141, 9, 13, 10, 1, -12 }, // 0x30 '0'
+ { 156, 5, 13, 10, 2, -12 }, // 0x31 '1'
+ { 165, 9, 13, 10, 1, -12 }, // 0x32 '2'
+ { 180, 8, 13, 10, 1, -12 }, // 0x33 '3'
+ { 193, 8, 13, 10, 2, -12 }, // 0x34 '4'
+ { 206, 9, 13, 10, 1, -12 }, // 0x35 '5'
+ { 221, 9, 13, 10, 1, -12 }, // 0x36 '6'
+ { 236, 9, 13, 10, 0, -12 }, // 0x37 '7'
+ { 251, 10, 13, 10, 0, -12 }, // 0x38 '8'
+ { 268, 9, 13, 10, 1, -12 }, // 0x39 '9'
+ { 283, 3, 9, 4, 1, -8 }, // 0x3A ':'
+ { 287, 3, 12, 4, 1, -8 }, // 0x3B ';'
+ { 292, 9, 9, 11, 1, -8 }, // 0x3C '<'
+ { 303, 9, 6, 11, 1, -6 }, // 0x3D '='
+ { 310, 9, 9, 11, 1, -8 }, // 0x3E '>'
+ { 321, 9, 13, 11, 1, -12 }, // 0x3F '?'
+ { 336, 16, 15, 18, 0, -12 }, // 0x40 '@'
+ { 366, 12, 13, 13, 0, -12 }, // 0x41 'A'
+ { 386, 11, 13, 13, 1, -12 }, // 0x42 'B'
+ { 404, 12, 13, 13, 1, -12 }, // 0x43 'C'
+ { 424, 12, 13, 13, 1, -12 }, // 0x44 'D'
+ { 444, 9, 13, 12, 1, -12 }, // 0x45 'E'
+ { 459, 9, 13, 11, 1, -12 }, // 0x46 'F'
+ { 474, 11, 13, 14, 1, -12 }, // 0x47 'G'
+ { 492, 11, 13, 13, 1, -12 }, // 0x48 'H'
+ { 510, 3, 13, 6, 1, -12 }, // 0x49 'I'
+ { 515, 8, 13, 10, 1, -12 }, // 0x4A 'J'
+ { 528, 12, 13, 13, 1, -12 }, // 0x4B 'K'
+ { 548, 8, 13, 11, 1, -12 }, // 0x4C 'L'
+ { 561, 14, 13, 16, 1, -12 }, // 0x4D 'M'
+ { 584, 11, 13, 14, 1, -12 }, // 0x4E 'N'
+ { 602, 13, 13, 14, 1, -12 }, // 0x4F 'O'
+ { 624, 11, 13, 12, 1, -12 }, // 0x50 'P'
+ { 642, 13, 14, 14, 1, -12 }, // 0x51 'Q'
+ { 665, 12, 13, 13, 1, -12 }, // 0x52 'R'
+ { 685, 11, 13, 12, 1, -12 }, // 0x53 'S'
+ { 703, 9, 13, 12, 2, -12 }, // 0x54 'T'
+ { 718, 11, 13, 13, 1, -12 }, // 0x55 'U'
+ { 736, 12, 13, 12, 0, -12 }, // 0x56 'V'
+ { 756, 17, 13, 17, 0, -12 }, // 0x57 'W'
+ { 784, 12, 13, 12, 0, -12 }, // 0x58 'X'
+ { 804, 11, 13, 12, 1, -12 }, // 0x59 'Y'
+ { 822, 9, 13, 11, 1, -12 }, // 0x5A 'Z'
+ { 837, 4, 17, 6, 1, -12 }, // 0x5B '['
+ { 846, 5, 13, 5, 0, -12 }, // 0x5C '\'
+ { 855, 4, 17, 6, 0, -12 }, // 0x5D ']'
+ { 864, 8, 8, 11, 1, -12 }, // 0x5E '^'
+ { 872, 10, 1, 10, 0, 4 }, // 0x5F '_'
+ { 874, 3, 2, 5, 0, -12 }, // 0x60 '`'
+ { 875, 10, 10, 10, 1, -9 }, // 0x61 'a'
+ { 888, 10, 13, 11, 1, -12 }, // 0x62 'b'
+ { 905, 9, 10, 10, 1, -9 }, // 0x63 'c'
+ { 917, 9, 13, 11, 1, -12 }, // 0x64 'd'
+ { 932, 9, 10, 10, 1, -9 }, // 0x65 'e'
+ { 944, 5, 13, 6, 1, -12 }, // 0x66 'f'
+ { 953, 9, 14, 11, 1, -9 }, // 0x67 'g'
+ { 969, 9, 13, 11, 1, -12 }, // 0x68 'h'
+ { 984, 3, 13, 5, 1, -12 }, // 0x69 'i'
+ { 989, 4, 17, 5, 0, -12 }, // 0x6A 'j'
+ { 998, 9, 13, 10, 1, -12 }, // 0x6B 'k'
+ { 1013, 3, 13, 5, 1, -12 }, // 0x6C 'l'
+ { 1018, 14, 10, 16, 1, -9 }, // 0x6D 'm'
+ { 1036, 9, 10, 11, 1, -9 }, // 0x6E 'n'
+ { 1048, 10, 10, 11, 1, -9 }, // 0x6F 'o'
+ { 1061, 10, 14, 11, 1, -9 }, // 0x70 'p'
+ { 1079, 9, 14, 11, 1, -9 }, // 0x71 'q'
+ { 1095, 6, 10, 7, 1, -9 }, // 0x72 'r'
+ { 1103, 9, 10, 10, 1, -9 }, // 0x73 's'
+ { 1115, 5, 12, 6, 1, -11 }, // 0x74 't'
+ { 1123, 9, 10, 11, 1, -9 }, // 0x75 'u'
+ { 1135, 10, 10, 10, 0, -9 }, // 0x76 'v'
+ { 1148, 14, 10, 14, 0, -9 }, // 0x77 'w'
+ { 1166, 10, 10, 10, 0, -9 }, // 0x78 'x'
+ { 1179, 10, 14, 10, 0, -9 }, // 0x79 'y'
+ { 1197, 8, 10, 9, 1, -9 }, // 0x7A 'z'
+ { 1207, 4, 17, 7, 1, -12 }, // 0x7B '{'
+ { 1216, 1, 17, 5, 2, -12 }, // 0x7C '|'
+ { 1219, 4, 17, 7, 2, -12 }, // 0x7D '}'
+ { 1228, 8, 2, 9, 0, -4 } }; // 0x7E '~'
+
+const GFXfont FreeSansBold9pt7b PROGMEM = {
+ (uint8_t *)FreeSansBold9pt7bBitmaps,
+ (GFXglyph *)FreeSansBold9pt7bGlyphs,
+ 0x20, 0x7E, 22 };
+
+// Approx. 1902 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBoldOblique12pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBoldOblique12pt7b.h
new file mode 100644
index 000000000000..fabbad3f497e
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBoldOblique12pt7b.h
@@ -0,0 +1,317 @@
+const uint8_t FreeSansBoldOblique12pt7bBitmaps[] PROGMEM = {
+ 0x1C, 0x3C, 0x78, 0xE1, 0xC3, 0x8F, 0x1C, 0x38, 0x70, 0xC1, 0x83, 0x00,
+ 0x1C, 0x78, 0xF0, 0x71, 0xFC, 0xFE, 0x3B, 0x8E, 0xC3, 0x30, 0xC0, 0x01,
+ 0x8C, 0x07, 0x38, 0x0C, 0x61, 0xFF, 0xF3, 0xFF, 0xE7, 0xFF, 0x83, 0x9C,
+ 0x0E, 0x70, 0x1C, 0xE1, 0xFF, 0xF3, 0xFF, 0xC7, 0xFF, 0x83, 0x18, 0x0E,
+ 0x70, 0x18, 0xC0, 0x73, 0x80, 0x00, 0x40, 0x07, 0xF0, 0x3F, 0xF0, 0xFF,
+ 0xF3, 0xC9, 0xE7, 0xB3, 0xCF, 0x60, 0x1F, 0xC0, 0x3F, 0xC0, 0x3F, 0xE0,
+ 0x1F, 0xE0, 0x1B, 0xE0, 0x33, 0xDE, 0x47, 0xBC, 0x8F, 0x7F, 0x7C, 0x7F,
+ 0xF0, 0x7F, 0x80, 0x18, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x01, 0x87,
+ 0x80, 0xC3, 0xF0, 0x61, 0xFE, 0x10, 0xE1, 0x8C, 0x30, 0x66, 0x0C, 0x3B,
+ 0x03, 0xFC, 0x80, 0x7E, 0x60, 0x0F, 0x30, 0x00, 0x18, 0x70, 0x0C, 0x7E,
+ 0x03, 0x1F, 0xC1, 0x8E, 0x30, 0xC3, 0x1C, 0x60, 0xFE, 0x18, 0x1F, 0x8C,
+ 0x07, 0x80, 0x01, 0xE0, 0x07, 0xF0, 0x1F, 0xE0, 0x79, 0xC0, 0xF3, 0x81,
+ 0xEE, 0x01, 0xF8, 0x01, 0xE0, 0x1F, 0xC6, 0x7B, 0xDD, 0xE3, 0xF7, 0x87,
+ 0xEF, 0x07, 0x9F, 0x1F, 0x3F, 0xFF, 0x3F, 0xDE, 0x3F, 0x1C, 0x7F, 0xEE,
+ 0xCC, 0x03, 0x83, 0x81, 0x81, 0xC1, 0xC0, 0xE0, 0xE0, 0x70, 0x70, 0x38,
+ 0x3C, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x18, 0x0E, 0x07,
+ 0x01, 0x80, 0x06, 0x03, 0x81, 0xC0, 0x60, 0x38, 0x1C, 0x0E, 0x07, 0x03,
+ 0x81, 0xC0, 0xE0, 0xE0, 0x70, 0x38, 0x38, 0x1C, 0x1C, 0x0E, 0x0E, 0x06,
+ 0x07, 0x07, 0x00, 0x0C, 0x0C, 0x4F, 0xFF, 0x1C, 0x3C, 0x6C, 0x44, 0x03,
+ 0x80, 0x38, 0x07, 0x00, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0xE0, 0x0E,
+ 0x00, 0xE0, 0x0C, 0x00, 0x7B, 0xDC, 0x23, 0x33, 0x00, 0x7F, 0xFF, 0xF0,
+ 0x7F, 0xE0, 0x00, 0xC0, 0x30, 0x18, 0x04, 0x03, 0x00, 0x80, 0x60, 0x10,
+ 0x0C, 0x02, 0x01, 0x80, 0x40, 0x30, 0x08, 0x06, 0x01, 0x00, 0xC0, 0x00,
+ 0x03, 0xC0, 0x7F, 0x87, 0xFC, 0x78, 0xF3, 0xC7, 0xBC, 0x3D, 0xE1, 0xEF,
+ 0x0F, 0xF0, 0x7F, 0x87, 0xBC, 0x3D, 0xE1, 0xEF, 0x1E, 0x78, 0xF3, 0xFF,
+ 0x0F, 0xF0, 0x3E, 0x00, 0x03, 0x83, 0x83, 0xCF, 0xEF, 0xF0, 0x78, 0x38,
+ 0x1C, 0x0E, 0x0F, 0x07, 0x03, 0x81, 0xC1, 0xE0, 0xF0, 0x70, 0x38, 0x00,
+ 0x03, 0xF0, 0x0F, 0xF8, 0x7F, 0xF8, 0xF1, 0xF3, 0xC1, 0xE7, 0x83, 0xC0,
+ 0x07, 0x80, 0x1E, 0x00, 0x78, 0x03, 0xE0, 0x0F, 0x00, 0x7C, 0x01, 0xE0,
+ 0x07, 0x00, 0x1F, 0xFC, 0x3F, 0xF8, 0xFF, 0xF0, 0x07, 0xE0, 0xFF, 0x8F,
+ 0xFE, 0xF8, 0xF7, 0x87, 0x80, 0x78, 0x0F, 0x80, 0xFC, 0x07, 0xE0, 0x0F,
+ 0x80, 0x3C, 0x01, 0xEF, 0x0F, 0x78, 0xF3, 0xFF, 0x8F, 0xF8, 0x3F, 0x00,
+ 0x00, 0x78, 0x07, 0xC0, 0x7E, 0x03, 0xF0, 0x37, 0x03, 0x38, 0x31, 0xC3,
+ 0x9E, 0x38, 0xF1, 0x87, 0x1F, 0xFE, 0xFF, 0xF7, 0xFF, 0x80, 0xF0, 0x07,
+ 0x00, 0x38, 0x03, 0xC0, 0x07, 0xFC, 0x1F, 0xF0, 0xFF, 0xC3, 0x00, 0x1C,
+ 0x00, 0x7F, 0x81, 0xFF, 0x0F, 0xFE, 0x38, 0xF8, 0x01, 0xE0, 0x07, 0x80,
+ 0x1E, 0xF0, 0xF3, 0xC7, 0xCF, 0xFE, 0x1F, 0xF0, 0x3F, 0x00, 0x03, 0xE0,
+ 0x7F, 0x87, 0xFE, 0x78, 0xF3, 0xC0, 0x3D, 0xE1, 0xFF, 0x8F, 0xFE, 0xF8,
+ 0xF7, 0xC7, 0xBC, 0x3D, 0xE1, 0xEF, 0x1E, 0x7C, 0xF3, 0xFF, 0x0F, 0xF0,
+ 0x1F, 0x00, 0x7F, 0xFB, 0xFF, 0xDF, 0xFE, 0x00, 0xE0, 0x0E, 0x00, 0xE0,
+ 0x0E, 0x00, 0xE0, 0x0F, 0x00, 0x70, 0x07, 0x00, 0x78, 0x03, 0x80, 0x3C,
+ 0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x00, 0x03, 0xF0, 0x1F, 0xE0, 0xFF, 0xC7,
+ 0x8F, 0x1C, 0x3C, 0x71, 0xE0, 0xFF, 0x03, 0xF8, 0x3F, 0xF1, 0xF1, 0xE7,
+ 0x87, 0xBC, 0x1E, 0xF0, 0x7B, 0xE3, 0xCF, 0xFF, 0x1F, 0xF8, 0x1F, 0x80,
+ 0x03, 0xE0, 0x3F, 0xE1, 0xFF, 0x8F, 0x9F, 0x3C, 0x3D, 0xE0, 0xF7, 0x83,
+ 0xDE, 0x1F, 0x78, 0xFD, 0xFF, 0xE3, 0xFF, 0x87, 0xDE, 0x00, 0xF3, 0xC7,
+ 0x8F, 0xFE, 0x1F, 0xF0, 0x3F, 0x00, 0x1C, 0xF3, 0x80, 0x00, 0x00, 0x00,
+ 0x01, 0xCF, 0x38, 0x0E, 0x3C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1,
+ 0xE3, 0x81, 0x06, 0x18, 0x60, 0x00, 0x00, 0x01, 0xC0, 0x7E, 0x1F, 0xE7,
+ 0xF8, 0x7E, 0x03, 0xE0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x00, 0x78, 0x00,
+ 0xC0, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07,
+ 0xFF, 0x9F, 0xFC, 0x7F, 0xF0, 0x30, 0x01, 0xE0, 0x0F, 0xE0, 0x3F, 0xC0,
+ 0x7F, 0x80, 0x7C, 0x07, 0xE1, 0xFE, 0x7F, 0x87, 0xE0, 0x38, 0x00, 0x00,
+ 0x00, 0x0F, 0xC1, 0xFF, 0x8F, 0xFC, 0xF1, 0xFF, 0x07, 0xF0, 0x3C, 0x01,
+ 0xE0, 0x1E, 0x01, 0xE0, 0x3E, 0x03, 0xE0, 0x1C, 0x01, 0xC0, 0x0E, 0x00,
+ 0x00, 0x07, 0x80, 0x3C, 0x01, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x03, 0xFF,
+ 0x80, 0x3C, 0x0F, 0x01, 0xC0, 0x0E, 0x0E, 0x00, 0x1C, 0x70, 0xF7, 0x73,
+ 0x87, 0xF8, 0xCC, 0x31, 0xE3, 0x61, 0x87, 0x0D, 0x8C, 0x1C, 0x3C, 0x30,
+ 0x61, 0xB1, 0x81, 0x86, 0xC6, 0x0C, 0x3B, 0x18, 0x71, 0xCC, 0x63, 0xCE,
+ 0x31, 0xFB, 0xF0, 0xE3, 0xCF, 0x01, 0xC0, 0x00, 0x03, 0xC0, 0xC0, 0x07,
+ 0xFF, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x3F, 0x00, 0x1F, 0x80,
+ 0x1F, 0xC0, 0x0F, 0xE0, 0x0F, 0xF0, 0x07, 0x7C, 0x07, 0x1E, 0x03, 0x8F,
+ 0x03, 0x87, 0x83, 0xC3, 0xC1, 0xFF, 0xE1, 0xFF, 0xF0, 0xFF, 0xFC, 0xF0,
+ 0x1E, 0x70, 0x0F, 0x78, 0x07, 0xB8, 0x03, 0xC0, 0x0F, 0xFE, 0x0F, 0xFF,
+ 0x87, 0xFF, 0xE3, 0xC0, 0xF1, 0xC0, 0x78, 0xE0, 0x3C, 0xF0, 0x3C, 0x7F,
+ 0xFC, 0x3F, 0xFC, 0x1F, 0xFF, 0x0E, 0x07, 0xCF, 0x01, 0xE7, 0x80, 0xF3,
+ 0x80, 0x79, 0xC0, 0x79, 0xFF, 0xF8, 0xFF, 0xFC, 0x7F, 0xF8, 0x00, 0x01,
+ 0xF8, 0x03, 0xFF, 0x03, 0xFF, 0xC3, 0xE1, 0xF3, 0xC0, 0x79, 0xE0, 0x3D,
+ 0xE0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00,
+ 0x0F, 0x00, 0xE7, 0x80, 0xF3, 0xE0, 0xF0, 0xFF, 0xF8, 0x3F, 0xF0, 0x07,
+ 0xE0, 0x00, 0x1F, 0xFC, 0x0F, 0xFF, 0x87, 0xFF, 0xC3, 0x81, 0xF1, 0xC0,
+ 0x79, 0xE0, 0x3C, 0xF0, 0x1E, 0x78, 0x0F, 0x38, 0x07, 0x9C, 0x03, 0xDE,
+ 0x03, 0xCF, 0x01, 0xE7, 0x81, 0xF3, 0x80, 0xF1, 0xC1, 0xF1, 0xFF, 0xF0,
+ 0xFF, 0xF0, 0x7F, 0xE0, 0x00, 0x0F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1C,
+ 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F,
+ 0xFC, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x70, 0x00, 0x70, 0x00, 0xFF,
+ 0xF8, 0xFF, 0xF8, 0xFF, 0xF8, 0x1F, 0xFF, 0x1F, 0xFE, 0x1F, 0xFE, 0x1C,
+ 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3F, 0xF8, 0x3F, 0xF8, 0x3F,
+ 0xF8, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x70, 0x00, 0xF0, 0x00, 0xF0,
+ 0x00, 0xF0, 0x00, 0xE0, 0x00, 0x01, 0xFC, 0x03, 0xFF, 0x03, 0xFF, 0xC3,
+ 0xE0, 0xF3, 0xC0, 0x39, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0xF0, 0x7F,
+ 0x78, 0x3F, 0xBC, 0x1F, 0xDE, 0x01, 0xCF, 0x00, 0xE7, 0xC0, 0xF1, 0xF0,
+ 0xF8, 0xFF, 0xFC, 0x3F, 0xEC, 0x07, 0xE6, 0x00, 0x1E, 0x03, 0x8F, 0x01,
+ 0xC7, 0x01, 0xE3, 0x80, 0xF3, 0xC0, 0x79, 0xE0, 0x38, 0xF0, 0x1C, 0x7F,
+ 0xFE, 0x3F, 0xFF, 0x3F, 0xFF, 0x9E, 0x03, 0x8F, 0x01, 0xC7, 0x01, 0xE3,
+ 0x80, 0xF3, 0xC0, 0x71, 0xE0, 0x38, 0xF0, 0x3C, 0x70, 0x1E, 0x00, 0x1E,
+ 0x3C, 0x78, 0xE1, 0xC7, 0x8F, 0x1E, 0x38, 0x71, 0xE3, 0xC7, 0x8E, 0x1C,
+ 0x78, 0xF1, 0xE0, 0x00, 0x1C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x38,
+ 0x00, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xC0, 0x07, 0x3C, 0x3C,
+ 0xF0, 0xF3, 0xC3, 0x8F, 0x1E, 0x3F, 0xF8, 0x7F, 0xC0, 0xFC, 0x00, 0x1E,
+ 0x07, 0xC7, 0x83, 0xE1, 0xE1, 0xE0, 0x70, 0xF0, 0x1C, 0x78, 0x0F, 0x3C,
+ 0x03, 0xDE, 0x00, 0xFF, 0x00, 0x3F, 0xC0, 0x0F, 0xF0, 0x07, 0xDE, 0x01,
+ 0xE7, 0xC0, 0x78, 0xF0, 0x1C, 0x3E, 0x0F, 0x07, 0x83, 0xC0, 0xF0, 0xF0,
+ 0x3C, 0x38, 0x07, 0x80, 0x0E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xC0,
+ 0x0E, 0x00, 0xF0, 0x07, 0x80, 0x38, 0x01, 0xC0, 0x1E, 0x00, 0xF0, 0x07,
+ 0x80, 0x38, 0x01, 0xC0, 0x1F, 0xFE, 0xFF, 0xF7, 0xFF, 0x80, 0x1F, 0x03,
+ 0xF1, 0xF0, 0x3F, 0x1F, 0x07, 0xF1, 0xF0, 0x7F, 0x3F, 0x0F, 0xE3, 0xF0,
+ 0xEE, 0x3B, 0x1E, 0xE3, 0xB1, 0xDE, 0x3B, 0x1D, 0xE7, 0xB3, 0x9C, 0x7B,
+ 0x39, 0xC7, 0x37, 0x9C, 0x73, 0x73, 0xCF, 0x3F, 0x3C, 0xF3, 0xE3, 0x8F,
+ 0x3E, 0x38, 0xE3, 0xC3, 0x8E, 0x3C, 0x78, 0x1E, 0x03, 0x87, 0xC0, 0xE1,
+ 0xF0, 0x38, 0x7C, 0x1E, 0x1F, 0x87, 0x8F, 0xE1, 0xC3, 0xB8, 0x70, 0xEF,
+ 0x1C, 0x39, 0xCF, 0x1E, 0x73, 0xC7, 0x8E, 0xE1, 0xC3, 0xB8, 0x70, 0xEE,
+ 0x1C, 0x1F, 0x8F, 0x07, 0xE3, 0xC1, 0xF0, 0xE0, 0x3C, 0x38, 0x0F, 0x00,
+ 0x01, 0xF8, 0x03, 0xFF, 0x03, 0xFF, 0xC3, 0xE3, 0xE3, 0xC0, 0xF9, 0xE0,
+ 0x3D, 0xE0, 0x1E, 0xF0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x03, 0xDE,
+ 0x01, 0xEF, 0x00, 0xF7, 0xC0, 0xF1, 0xF0, 0xF0, 0xFF, 0xF0, 0x3F, 0xF0,
+ 0x07, 0xE0, 0x00, 0x1F, 0xFC, 0x1F, 0xFE, 0x1F, 0xFF, 0x1C, 0x1F, 0x1C,
+ 0x0F, 0x3C, 0x0F, 0x3C, 0x0F, 0x3C, 0x1E, 0x3F, 0xFC, 0x3F, 0xFC, 0x7F,
+ 0xF0, 0x78, 0x00, 0x78, 0x00, 0x70, 0x00, 0x70, 0x00, 0xF0, 0x00, 0xF0,
+ 0x00, 0xF0, 0x00, 0x01, 0xF8, 0x03, 0xFF, 0x03, 0xFF, 0xC3, 0xE3, 0xE3,
+ 0xC0, 0xF9, 0xC0, 0x3D, 0xE0, 0x1E, 0xF0, 0x0F, 0xF0, 0x07, 0xF8, 0x03,
+ 0xFC, 0x03, 0xDE, 0x09, 0xEF, 0x0E, 0xE7, 0xC7, 0xF1, 0xF1, 0xF0, 0xFF,
+ 0xF8, 0x3F, 0xFE, 0x07, 0xE6, 0x00, 0x02, 0x00, 0x0F, 0xFE, 0x0F, 0xFF,
+ 0x87, 0xFF, 0xE3, 0x81, 0xF1, 0xC0, 0x78, 0xE0, 0x3C, 0xF0, 0x1C, 0x78,
+ 0x1E, 0x3F, 0xFC, 0x1F, 0xFC, 0x1F, 0xFF, 0x8F, 0x03, 0xC7, 0x81, 0xE3,
+ 0x80, 0xF1, 0xC0, 0xF1, 0xE0, 0x78, 0xF0, 0x3C, 0x78, 0x1F, 0x00, 0x03,
+ 0xF8, 0x0F, 0xFE, 0x1F, 0xFF, 0x1E, 0x1F, 0x3C, 0x0F, 0x3C, 0x0F, 0x3C,
+ 0x00, 0x3F, 0x00, 0x1F, 0xF0, 0x0F, 0xFC, 0x01, 0xFE, 0x00, 0x3E, 0xF0,
+ 0x1E, 0xF0, 0x1E, 0xF8, 0x3C, 0x7F, 0xF8, 0x7F, 0xF0, 0x1F, 0xC0, 0x7F,
+ 0xFE, 0xFF, 0xFD, 0xFF, 0xF8, 0x1C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0,
+ 0x03, 0x80, 0x07, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xE0, 0x01,
+ 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x38, 0x00, 0x1E, 0x07, 0x1C,
+ 0x0F, 0x3C, 0x0F, 0x3C, 0x0F, 0x3C, 0x0E, 0x38, 0x0E, 0x78, 0x1E, 0x78,
+ 0x1E, 0x78, 0x1E, 0x78, 0x1C, 0x70, 0x1C, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0,
+ 0x38, 0xF8, 0x78, 0xFF, 0xF0, 0x7F, 0xE0, 0x1F, 0x80, 0xF0, 0x1F, 0xE0,
+ 0x39, 0xC0, 0xF3, 0x81, 0xC7, 0x07, 0x8E, 0x0E, 0x1C, 0x3C, 0x3C, 0x70,
+ 0x79, 0xE0, 0xF3, 0x80, 0xEF, 0x01, 0xDC, 0x03, 0xB8, 0x07, 0xE0, 0x0F,
+ 0x80, 0x1F, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x70, 0x7F, 0x87, 0x83,
+ 0xFC, 0x3C, 0x3D, 0xE1, 0xE1, 0xEF, 0x1F, 0x0E, 0x78, 0xD8, 0xF3, 0xC6,
+ 0xC7, 0x0E, 0x76, 0x78, 0x73, 0x33, 0x83, 0xB9, 0x9C, 0x1D, 0xCD, 0xC0,
+ 0xEC, 0x6E, 0x07, 0xE3, 0xE0, 0x3E, 0x1F, 0x01, 0xF0, 0xF0, 0x0F, 0x87,
+ 0x80, 0x78, 0x38, 0x03, 0xC1, 0xC0, 0x00, 0x0F, 0x03, 0xC3, 0xC1, 0xE0,
+ 0xF8, 0xF0, 0x1E, 0x78, 0x07, 0x9E, 0x00, 0xFF, 0x00, 0x3F, 0x80, 0x0F,
+ 0xC0, 0x01, 0xE0, 0x00, 0xF8, 0x00, 0x3F, 0x00, 0x1F, 0xC0, 0x0F, 0xF0,
+ 0x07, 0x9E, 0x03, 0xC7, 0x80, 0xF0, 0xF0, 0x78, 0x3C, 0x3C, 0x0F, 0x80,
+ 0x78, 0x1E, 0xF0, 0x79, 0xE0, 0xF3, 0xC3, 0xC3, 0xCF, 0x07, 0x9E, 0x0F,
+ 0x78, 0x0F, 0xE0, 0x1F, 0x80, 0x3F, 0x00, 0x3C, 0x00, 0x70, 0x00, 0xE0,
+ 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x1F, 0xFF,
+ 0x0F, 0xFF, 0x87, 0xFF, 0xC0, 0x03, 0xC0, 0x03, 0xE0, 0x03, 0xE0, 0x03,
+ 0xE0, 0x03, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01,
+ 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xFF, 0xF0, 0xFF, 0xF8, 0x7F, 0xFC,
+ 0x00, 0x0F, 0xC3, 0xF0, 0xFC, 0x38, 0x1E, 0x07, 0x01, 0xC0, 0x70, 0x1C,
+ 0x0F, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x0F,
+ 0x03, 0x80, 0xFC, 0x3F, 0x0F, 0xC0, 0x08, 0x88, 0xC4, 0x44, 0x66, 0x66,
+ 0x66, 0x62, 0x22, 0x33, 0x33, 0x30, 0x0F, 0xC3, 0xF0, 0xFC, 0x07, 0x03,
+ 0xC0, 0xE0, 0x38, 0x0E, 0x03, 0x81, 0xC0, 0x70, 0x1C, 0x07, 0x03, 0xC0,
+ 0xE0, 0x38, 0x0E, 0x03, 0x81, 0xE0, 0x70, 0xFC, 0x3F, 0x0F, 0xC0, 0x03,
+ 0x80, 0xF0, 0x1E, 0x07, 0xE1, 0xDC, 0x3B, 0x8E, 0x71, 0x86, 0x70, 0xFC,
+ 0x1F, 0x83, 0x80, 0x7F, 0xFE, 0xFF, 0xFC, 0xE6, 0x30, 0x07, 0xE0, 0xFF,
+ 0x8F, 0xFE, 0x70, 0xE0, 0x07, 0x03, 0xF8, 0xFF, 0xCF, 0x9E, 0xF0, 0xF7,
+ 0x8F, 0x3F, 0xF8, 0xFF, 0xC3, 0xDF, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38,
+ 0x00, 0xF0, 0x01, 0xE0, 0x03, 0x9F, 0x07, 0xFF, 0x0F, 0xFF, 0x3E, 0x3E,
+ 0x78, 0x3C, 0xF0, 0x79, 0xC0, 0xF3, 0x81, 0xEF, 0x07, 0x9F, 0x1F, 0x3F,
+ 0xFC, 0x7F, 0xF0, 0xEF, 0x80, 0x07, 0xC0, 0xFF, 0x8F, 0xFE, 0xF8, 0xF7,
+ 0x87, 0xB8, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0xF7, 0x8F, 0x1F, 0xF8, 0xFF,
+ 0x81, 0xF0, 0x00, 0x00, 0x1E, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x03,
+ 0xC0, 0xF7, 0x87, 0xFE, 0x1F, 0xFC, 0x7C, 0x78, 0xF0, 0x73, 0xC0, 0xE7,
+ 0x81, 0x8F, 0x07, 0x1E, 0x0E, 0x3E, 0x3C, 0x7F, 0xF8, 0x7F, 0xE0, 0x7D,
+ 0xC0, 0x07, 0xC0, 0xFF, 0x8F, 0xFE, 0xF0, 0xF7, 0x87, 0xFF, 0xFF, 0xFF,
+ 0xFE, 0x00, 0xF0, 0x07, 0xC7, 0x9F, 0xF8, 0xFF, 0x81, 0xF0, 0x00, 0x07,
+ 0x87, 0xC7, 0xE3, 0xC1, 0xC3, 0xF9, 0xFC, 0x78, 0x3C, 0x1C, 0x0E, 0x07,
+ 0x07, 0x83, 0x81, 0xC0, 0xE0, 0xF0, 0x78, 0x00, 0x03, 0xDE, 0x1F, 0xF8,
+ 0x7F, 0xF1, 0xF1, 0xE3, 0xC1, 0xCF, 0x03, 0x9E, 0x06, 0x3C, 0x0C, 0x78,
+ 0x38, 0xF8, 0xF1, 0xFF, 0xC1, 0xFF, 0x81, 0xF7, 0x00, 0x0E, 0x3C, 0x3C,
+ 0x78, 0xF0, 0x7F, 0xC0, 0x7E, 0x00, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x07,
+ 0x00, 0x3C, 0x00, 0xF7, 0xC3, 0xBF, 0x8F, 0xFF, 0x3C, 0x3D, 0xE0, 0xE7,
+ 0x83, 0x9C, 0x0E, 0x70, 0x79, 0xC1, 0xEF, 0x07, 0x3C, 0x1C, 0xE0, 0x73,
+ 0x83, 0xC0, 0x0E, 0x3C, 0x70, 0x00, 0x03, 0x8F, 0x1E, 0x38, 0x71, 0xE3,
+ 0xC7, 0x0E, 0x1C, 0x78, 0xF1, 0xC0, 0x03, 0xC0, 0xE0, 0x38, 0x00, 0x00,
+ 0x01, 0xE0, 0x70, 0x1C, 0x07, 0x03, 0xC0, 0xF0, 0x38, 0x0E, 0x03, 0x81,
+ 0xE0, 0x70, 0x1C, 0x07, 0x03, 0xC0, 0xF0, 0xF8, 0x3E, 0x0F, 0x00, 0x0E,
+ 0x00, 0x1C, 0x00, 0x38, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0x87, 0x87, 0x1E,
+ 0x0E, 0x78, 0x3D, 0xE0, 0x7F, 0x80, 0xFE, 0x01, 0xFE, 0x03, 0xFC, 0x0F,
+ 0x38, 0x1E, 0x78, 0x38, 0xF0, 0x70, 0xF0, 0xE1, 0xE0, 0x0E, 0x3C, 0x78,
+ 0xE1, 0xC3, 0x8F, 0x1E, 0x38, 0x71, 0xE3, 0xC7, 0x0E, 0x1C, 0x78, 0xF1,
+ 0xC0, 0x1C, 0xF1, 0xE0, 0xEF, 0xDF, 0x87, 0xFF, 0xFE, 0x7C, 0x78, 0xF3,
+ 0xC3, 0x87, 0x9C, 0x1C, 0x38, 0xE1, 0xE1, 0xC7, 0x0E, 0x0E, 0x78, 0x70,
+ 0xF3, 0xC3, 0x87, 0x9C, 0x3C, 0x38, 0xE1, 0xE1, 0xC7, 0x0E, 0x0E, 0x00,
+ 0x3D, 0xF0, 0xEF, 0xE3, 0xFF, 0xCF, 0x0F, 0x78, 0x39, 0xC0, 0xE7, 0x03,
+ 0x9C, 0x1E, 0xF0, 0x7B, 0xC1, 0xCE, 0x07, 0x38, 0x1C, 0xE0, 0xF0, 0x07,
+ 0xE0, 0x7F, 0xE3, 0xFF, 0x9F, 0x1F, 0x78, 0x3F, 0xC0, 0xFF, 0x03, 0xFC,
+ 0x1F, 0xF0, 0x7B, 0xE3, 0xE7, 0xFF, 0x1F, 0xF8, 0x1F, 0x80, 0x0E, 0x7C,
+ 0x0F, 0xFE, 0x0F, 0xFF, 0x1F, 0x1F, 0x1E, 0x0F, 0x1E, 0x0F, 0x1C, 0x0F,
+ 0x1C, 0x0F, 0x3C, 0x1E, 0x3E, 0x3E, 0x3F, 0xFC, 0x3F, 0xF8, 0x7B, 0xE0,
+ 0x78, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0xF0, 0x00, 0x07, 0xBC,
+ 0x7F, 0xF3, 0xFF, 0x9F, 0x1E, 0x78, 0x3B, 0xC0, 0xEF, 0x03, 0x3C, 0x0C,
+ 0xF0, 0x73, 0xE3, 0xCF, 0xFF, 0x1F, 0xF8, 0x3C, 0xE0, 0x03, 0x80, 0x1E,
+ 0x00, 0x78, 0x01, 0xC0, 0x07, 0x00, 0x3D, 0xCE, 0xE3, 0xF8, 0xF0, 0x78,
+ 0x1E, 0x07, 0x01, 0xC0, 0xF0, 0x3C, 0x0E, 0x03, 0x80, 0xE0, 0x00, 0x1F,
+ 0xC3, 0xFE, 0x7F, 0xFF, 0x0F, 0xF0, 0x0F, 0xE0, 0x7F, 0xC1, 0xFE, 0x03,
+ 0xEE, 0x1E, 0xFF, 0xC7, 0xFC, 0x3F, 0x00, 0x1E, 0x1E, 0x1C, 0x7F, 0xFF,
+ 0x3C, 0x38, 0x38, 0x38, 0x78, 0x78, 0x70, 0x7C, 0xF8, 0x78, 0x38, 0x3C,
+ 0xE0, 0xE3, 0x83, 0x9E, 0x0E, 0x70, 0x79, 0xC1, 0xE7, 0x07, 0x3C, 0x1C,
+ 0xF0, 0xF3, 0xE7, 0xCF, 0xFF, 0x1F, 0xF8, 0x3C, 0xE0, 0xF0, 0x77, 0x87,
+ 0xBC, 0x38, 0xE3, 0xC7, 0x1C, 0x39, 0xE1, 0xCE, 0x0E, 0xE0, 0x77, 0x03,
+ 0xF0, 0x0F, 0x80, 0x78, 0x03, 0xC0, 0x00, 0xF1, 0xC3, 0xF8, 0xE3, 0xFC,
+ 0xF1, 0xDE, 0x79, 0xEF, 0x3C, 0xE7, 0xB6, 0x73, 0xDB, 0x70, 0xED, 0xB8,
+ 0x7C, 0xF8, 0x3E, 0x7C, 0x1F, 0x3C, 0x0F, 0x1E, 0x07, 0x8E, 0x00, 0x0F,
+ 0x1E, 0x0F, 0x3C, 0x0F, 0x38, 0x07, 0x70, 0x07, 0xF0, 0x03, 0xE0, 0x03,
+ 0xC0, 0x07, 0xC0, 0x0F, 0xE0, 0x1E, 0xE0, 0x3C, 0xF0, 0x3C, 0xF0, 0x78,
+ 0x78, 0x3C, 0x1C, 0x78, 0x78, 0xF0, 0xE1, 0xE3, 0xC1, 0xC7, 0x03, 0x9E,
+ 0x07, 0x38, 0x0E, 0xE0, 0x1D, 0xC0, 0x3F, 0x00, 0x7E, 0x00, 0x78, 0x00,
+ 0xF0, 0x01, 0xC0, 0x07, 0x00, 0x7E, 0x00, 0xF8, 0x01, 0xE0, 0x00, 0x1F,
+ 0xF9, 0xFF, 0xCF, 0xFC, 0x01, 0xE0, 0x3E, 0x03, 0xC0, 0x3C, 0x03, 0xC0,
+ 0x3C, 0x03, 0xC0, 0x3F, 0xF9, 0xFF, 0xCF, 0xFC, 0x00, 0x07, 0x87, 0xC3,
+ 0xE3, 0xC1, 0xC0, 0xE0, 0x70, 0x38, 0x3C, 0x1C, 0x0E, 0x1E, 0x0F, 0x03,
+ 0x81, 0xC0, 0xE0, 0x70, 0x78, 0x38, 0x1C, 0x0F, 0x87, 0xC1, 0xC0, 0x0C,
+ 0x30, 0x86, 0x18, 0x61, 0x8C, 0x30, 0xC3, 0x0C, 0x61, 0x86, 0x18, 0x63,
+ 0x0C, 0x30, 0xC2, 0x00, 0x00, 0x07, 0x07, 0xC3, 0xE0, 0x70, 0x38, 0x3C,
+ 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xE0, 0xF0, 0xE0, 0x70, 0x78, 0x38, 0x1C,
+ 0x0E, 0x07, 0x07, 0x8F, 0x87, 0xC3, 0xC0, 0x3C, 0x07, 0xE0, 0xC7, 0x30,
+ 0x7E, 0x01, 0xC0 };
+
+const GFXglyph FreeSansBoldOblique12pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 7, 0, 1 }, // 0x20 ' '
+ { 0, 7, 17, 8, 3, -16 }, // 0x21 '!'
+ { 15, 10, 6, 11, 4, -17 }, // 0x22 '"'
+ { 23, 15, 16, 13, 1, -15 }, // 0x23 '#'
+ { 53, 15, 21, 13, 1, -17 }, // 0x24 '$'
+ { 93, 18, 18, 21, 3, -17 }, // 0x25 '%'
+ { 134, 15, 17, 17, 2, -16 }, // 0x26 '&'
+ { 166, 4, 6, 6, 4, -17 }, // 0x27 '''
+ { 169, 9, 22, 8, 2, -17 }, // 0x28 '('
+ { 194, 9, 22, 8, -1, -16 }, // 0x29 ')'
+ { 219, 8, 8, 9, 3, -17 }, // 0x2A '*'
+ { 227, 12, 11, 14, 2, -10 }, // 0x2B '+'
+ { 244, 5, 7, 7, 1, -2 }, // 0x2C ','
+ { 249, 7, 3, 8, 2, -7 }, // 0x2D '-'
+ { 252, 4, 3, 7, 2, -2 }, // 0x2E '.'
+ { 254, 10, 17, 7, 0, -16 }, // 0x2F '/'
+ { 276, 13, 17, 13, 2, -16 }, // 0x30 '0'
+ { 304, 9, 17, 13, 4, -16 }, // 0x31 '1'
+ { 324, 15, 17, 13, 1, -16 }, // 0x32 '2'
+ { 356, 13, 17, 13, 2, -16 }, // 0x33 '3'
+ { 384, 13, 17, 13, 1, -16 }, // 0x34 '4'
+ { 412, 14, 17, 13, 1, -16 }, // 0x35 '5'
+ { 442, 13, 17, 13, 2, -16 }, // 0x36 '6'
+ { 470, 13, 17, 13, 3, -16 }, // 0x37 '7'
+ { 498, 14, 17, 13, 1, -16 }, // 0x38 '8'
+ { 528, 14, 17, 13, 2, -16 }, // 0x39 '9'
+ { 558, 6, 12, 8, 3, -11 }, // 0x3A ':'
+ { 567, 7, 16, 8, 2, -11 }, // 0x3B ';'
+ { 581, 13, 12, 14, 2, -11 }, // 0x3C '<'
+ { 601, 14, 9, 14, 1, -9 }, // 0x3D '='
+ { 617, 13, 12, 14, 1, -10 }, // 0x3E '>'
+ { 637, 13, 18, 15, 4, -17 }, // 0x3F '?'
+ { 667, 22, 21, 23, 2, -17 }, // 0x40 '@'
+ { 725, 17, 18, 17, 0, -17 }, // 0x41 'A'
+ { 764, 17, 18, 17, 2, -17 }, // 0x42 'B'
+ { 803, 17, 18, 17, 3, -17 }, // 0x43 'C'
+ { 842, 17, 18, 17, 2, -17 }, // 0x44 'D'
+ { 881, 16, 18, 16, 2, -17 }, // 0x45 'E'
+ { 917, 16, 18, 15, 2, -17 }, // 0x46 'F'
+ { 953, 17, 18, 19, 3, -17 }, // 0x47 'G'
+ { 992, 17, 18, 17, 2, -17 }, // 0x48 'H'
+ { 1031, 7, 18, 7, 2, -17 }, // 0x49 'I'
+ { 1047, 14, 18, 13, 1, -17 }, // 0x4A 'J'
+ { 1079, 18, 18, 17, 2, -17 }, // 0x4B 'K'
+ { 1120, 13, 18, 15, 2, -17 }, // 0x4C 'L'
+ { 1150, 20, 18, 20, 2, -17 }, // 0x4D 'M'
+ { 1195, 18, 18, 17, 2, -17 }, // 0x4E 'N'
+ { 1236, 17, 18, 19, 3, -17 }, // 0x4F 'O'
+ { 1275, 16, 18, 16, 2, -17 }, // 0x50 'P'
+ { 1311, 17, 19, 19, 3, -17 }, // 0x51 'Q'
+ { 1352, 17, 18, 17, 2, -17 }, // 0x52 'R'
+ { 1391, 16, 18, 16, 2, -17 }, // 0x53 'S'
+ { 1427, 15, 18, 15, 3, -17 }, // 0x54 'T'
+ { 1461, 16, 18, 17, 3, -17 }, // 0x55 'U'
+ { 1497, 15, 18, 16, 4, -17 }, // 0x56 'V'
+ { 1531, 21, 18, 23, 4, -17 }, // 0x57 'W'
+ { 1579, 18, 18, 16, 1, -17 }, // 0x58 'X'
+ { 1620, 15, 18, 16, 4, -17 }, // 0x59 'Y'
+ { 1654, 17, 18, 15, 1, -17 }, // 0x5A 'Z'
+ { 1693, 10, 23, 8, 1, -17 }, // 0x5B '['
+ { 1722, 4, 23, 7, 3, -22 }, // 0x5C '\'
+ { 1734, 10, 23, 8, 0, -17 }, // 0x5D ']'
+ { 1763, 11, 11, 14, 3, -16 }, // 0x5E '^'
+ { 1779, 15, 2, 13, -2, 4 }, // 0x5F '_'
+ { 1783, 4, 3, 8, 4, -17 }, // 0x60 '`'
+ { 1785, 13, 13, 13, 1, -12 }, // 0x61 'a'
+ { 1807, 15, 18, 15, 1, -17 }, // 0x62 'b'
+ { 1841, 13, 13, 13, 2, -12 }, // 0x63 'c'
+ { 1863, 15, 18, 15, 2, -17 }, // 0x64 'd'
+ { 1897, 13, 13, 13, 2, -12 }, // 0x65 'e'
+ { 1919, 9, 18, 8, 2, -17 }, // 0x66 'f'
+ { 1940, 15, 18, 15, 1, -12 }, // 0x67 'g'
+ { 1974, 14, 18, 15, 2, -17 }, // 0x68 'h'
+ { 2006, 7, 18, 7, 2, -17 }, // 0x69 'i'
+ { 2022, 10, 23, 7, -1, -17 }, // 0x6A 'j'
+ { 2051, 15, 18, 13, 1, -17 }, // 0x6B 'k'
+ { 2085, 7, 18, 7, 2, -17 }, // 0x6C 'l'
+ { 2101, 21, 13, 21, 1, -12 }, // 0x6D 'm'
+ { 2136, 14, 13, 15, 2, -12 }, // 0x6E 'n'
+ { 2159, 14, 13, 15, 2, -12 }, // 0x6F 'o'
+ { 2182, 16, 18, 15, 0, -12 }, // 0x70 'p'
+ { 2218, 14, 18, 15, 2, -12 }, // 0x71 'q'
+ { 2250, 10, 13, 9, 2, -12 }, // 0x72 'r'
+ { 2267, 12, 13, 13, 3, -12 }, // 0x73 's'
+ { 2287, 8, 15, 8, 2, -14 }, // 0x74 't'
+ { 2302, 14, 13, 15, 2, -12 }, // 0x75 'u'
+ { 2325, 13, 13, 13, 3, -12 }, // 0x76 'v'
+ { 2347, 17, 13, 19, 3, -12 }, // 0x77 'w'
+ { 2375, 16, 13, 13, 0, -12 }, // 0x78 'x'
+ { 2401, 15, 18, 13, 1, -12 }, // 0x79 'y'
+ { 2435, 13, 13, 12, 1, -12 }, // 0x7A 'z'
+ { 2457, 9, 23, 9, 3, -17 }, // 0x7B '{'
+ { 2483, 6, 23, 7, 1, -17 }, // 0x7C '|'
+ { 2501, 9, 23, 9, 0, -17 }, // 0x7D '}'
+ { 2527, 12, 5, 14, 2, -7 } }; // 0x7E '~'
+
+const GFXfont FreeSansBoldOblique12pt7b PROGMEM = {
+ (uint8_t *)FreeSansBoldOblique12pt7bBitmaps,
+ (GFXglyph *)FreeSansBoldOblique12pt7bGlyphs,
+ 0x20, 0x7E, 29 };
+
+// Approx. 3207 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBoldOblique18pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBoldOblique18pt7b.h
new file mode 100644
index 000000000000..79c748c785c6
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBoldOblique18pt7b.h
@@ -0,0 +1,545 @@
+const uint8_t FreeSansBoldOblique18pt7bBitmaps[] PROGMEM = {
+ 0x06, 0x01, 0xC0, 0x7C, 0x1F, 0x0F, 0xC3, 0xE0, 0xF8, 0x3E, 0x0F, 0x83,
+ 0xC0, 0xF0, 0x7C, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1C, 0x07, 0x01, 0xC0,
+ 0x60, 0x7C, 0x1F, 0x07, 0xC3, 0xF0, 0xF8, 0x00, 0x78, 0x7B, 0xC3, 0xFE,
+ 0x3F, 0xE1, 0xEF, 0x0F, 0x78, 0x7B, 0x83, 0x9C, 0x1C, 0xC0, 0xC0, 0x00,
+ 0x3C, 0x38, 0x00, 0xF1, 0xE0, 0x07, 0x87, 0x00, 0x1E, 0x3C, 0x00, 0xF0,
+ 0xE0, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0x1F, 0xFF, 0xF8,
+ 0x0F, 0x0E, 0x00, 0x3C, 0x78, 0x00, 0xE1, 0xE0, 0x07, 0x8F, 0x00, 0x1C,
+ 0x3C, 0x07, 0xFF, 0xFE, 0x1F, 0xFF, 0xF8, 0x7F, 0xFF, 0xE3, 0xFF, 0xFF,
+ 0x01, 0xE3, 0xC0, 0x0F, 0x0E, 0x00, 0x3C, 0x78, 0x01, 0xE1, 0xC0, 0x07,
+ 0x8F, 0x00, 0x3C, 0x38, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0xFC,
+ 0x00, 0xFF, 0xC0, 0x3F, 0xFC, 0x0F, 0xFF, 0xC3, 0xE6, 0x78, 0x78, 0xCF,
+ 0x1E, 0x39, 0xE3, 0xC7, 0x3C, 0x78, 0xC0, 0x0F, 0x98, 0x01, 0xFF, 0x00,
+ 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x00, 0x7F, 0x80, 0x0F, 0xF0,
+ 0x03, 0xBE, 0x00, 0x67, 0xCF, 0x8C, 0xF9, 0xF1, 0x9F, 0x3E, 0x77, 0xC7,
+ 0xEF, 0xF8, 0x7F, 0xFE, 0x0F, 0xFF, 0x80, 0xFF, 0xE0, 0x03, 0xE0, 0x00,
+ 0x38, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x07, 0x01, 0xE0,
+ 0x03, 0x81, 0xFE, 0x00, 0xC0, 0xFF, 0x80, 0x70, 0x7F, 0xF0, 0x38, 0x1E,
+ 0x3C, 0x1C, 0x0F, 0x07, 0x06, 0x03, 0x81, 0xC3, 0x80, 0xE0, 0xF1, 0xC0,
+ 0x3C, 0x78, 0xE0, 0x0F, 0xFE, 0x30, 0x01, 0xFF, 0x1C, 0x00, 0x7F, 0x8E,
+ 0x00, 0x07, 0x83, 0x00, 0x00, 0x01, 0x83, 0xE0, 0x00, 0xE3, 0xFE, 0x00,
+ 0x71, 0xFF, 0x80, 0x18, 0xFF, 0xF0, 0x0C, 0x3C, 0x3C, 0x07, 0x1C, 0x07,
+ 0x03, 0x87, 0x01, 0xC0, 0xC1, 0xE1, 0xE0, 0x60, 0x7F, 0xF8, 0x38, 0x0F,
+ 0xFC, 0x1C, 0x03, 0xFE, 0x06, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x03,
+ 0xFC, 0x00, 0x3F, 0xF0, 0x03, 0xFF, 0x80, 0x3F, 0x3C, 0x01, 0xF1, 0xE0,
+ 0x0F, 0x8F, 0x00, 0x7C, 0xF0, 0x03, 0xFF, 0x80, 0x0F, 0xF8, 0x00, 0x3F,
+ 0x00, 0x03, 0xF0, 0x00, 0x7F, 0xC7, 0x8F, 0xFE, 0x3C, 0xFC, 0xFB, 0xCF,
+ 0x83, 0xFE, 0xF8, 0x1F, 0xE7, 0xC0, 0x7E, 0x3E, 0x03, 0xE1, 0xF0, 0x1F,
+ 0x0F, 0xE3, 0xFC, 0x7F, 0xFF, 0xE1, 0xFF, 0xFF, 0x87, 0xFE, 0x7C, 0x0F,
+ 0xE1, 0xF0, 0x7B, 0xFF, 0xEF, 0x7B, 0x9C, 0xC0, 0x00, 0x78, 0x07, 0x80,
+ 0x78, 0x03, 0x80, 0x3C, 0x03, 0xC0, 0x1E, 0x01, 0xE0, 0x1E, 0x00, 0xF0,
+ 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0xF0, 0x07,
+ 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0,
+ 0x07, 0x80, 0x1C, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x00, 0xE0, 0x07, 0x80,
+ 0x1C, 0x00, 0x01, 0xC0, 0x0F, 0x00, 0x38, 0x01, 0xE0, 0x0F, 0x00, 0x78,
+ 0x01, 0xC0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80,
+ 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0xF8, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x1E,
+ 0x00, 0xF0, 0x07, 0x80, 0x78, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x1E, 0x01,
+ 0xE0, 0x1E, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x00, 0x03, 0x00, 0x70, 0x07,
+ 0x04, 0x63, 0xFF, 0xF7, 0xFF, 0x1F, 0x83, 0xF0, 0x3B, 0x87, 0x38, 0x21,
+ 0x00, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0,
+ 0x00, 0x7C, 0x07, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xE0,
+ 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x7C, 0x00, 0x1E,
+ 0x00, 0x3E, 0x7C, 0xF3, 0xE7, 0xC1, 0x87, 0x0C, 0x39, 0xE3, 0x00, 0x7F,
+ 0xDF, 0xFF, 0xFB, 0xFE, 0x7D, 0xF7, 0xBE, 0xF8, 0x00, 0x0E, 0x00, 0x18,
+ 0x00, 0x70, 0x00, 0xC0, 0x03, 0x80, 0x06, 0x00, 0x1C, 0x00, 0x30, 0x00,
+ 0xE0, 0x01, 0x80, 0x07, 0x00, 0x0C, 0x00, 0x38, 0x00, 0x60, 0x01, 0xC0,
+ 0x03, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x70, 0x00, 0xC0, 0x03, 0x80, 0x06,
+ 0x00, 0x1C, 0x00, 0x30, 0x00, 0xE0, 0x00, 0x00, 0xFC, 0x00, 0x7F, 0xC0,
+ 0x7F, 0xF8, 0x3F, 0xFE, 0x0F, 0x8F, 0xC7, 0xC1, 0xF1, 0xE0, 0x7C, 0xF8,
+ 0x1F, 0x3E, 0x07, 0xDF, 0x01, 0xF7, 0xC0, 0x7D, 0xF0, 0x3F, 0x7C, 0x0F,
+ 0xBF, 0x03, 0xEF, 0x80, 0xFB, 0xE0, 0x3E, 0xF8, 0x1F, 0x3E, 0x07, 0xCF,
+ 0x81, 0xE3, 0xE0, 0xF8, 0xFC, 0x7C, 0x1F, 0xFF, 0x07, 0xFF, 0x80, 0xFF,
+ 0xC0, 0x0F, 0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x3C, 0x03, 0xE0, 0xFF,
+ 0x3F, 0xF3, 0xFF, 0x9F, 0xFC, 0x03, 0xE0, 0x1F, 0x01, 0xF0, 0x0F, 0x80,
+ 0x7C, 0x03, 0xE0, 0x1E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x3E,
+ 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x3E, 0x00, 0x00, 0x1F, 0x80,
+ 0x07, 0xFF, 0x00, 0x7F, 0xFC, 0x07, 0xFF, 0xE0, 0x7E, 0x1F, 0x83, 0xE0,
+ 0x7C, 0x1F, 0x03, 0xE1, 0xF0, 0x1F, 0x0F, 0x80, 0xF8, 0x00, 0x0F, 0x80,
+ 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xE0, 0x00, 0xFC,
+ 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F,
+ 0x00, 0x03, 0xF0, 0x00, 0x1F, 0xFF, 0xE1, 0xFF, 0xFF, 0x0F, 0xFF, 0xF0,
+ 0x7F, 0xFF, 0x80, 0x00, 0x7F, 0x00, 0x1F, 0xFC, 0x03, 0xFF, 0xE0, 0x7F,
+ 0xFF, 0x0F, 0x83, 0xF0, 0xF0, 0x1F, 0x1F, 0x01, 0xF1, 0xE0, 0x1F, 0x00,
+ 0x03, 0xE0, 0x00, 0xFC, 0x00, 0xFF, 0x80, 0x0F, 0xF0, 0x00, 0xFF, 0x80,
+ 0x0F, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xCF, 0x80, 0x7C,
+ 0xF8, 0x07, 0xCF, 0x80, 0xF8, 0xFC, 0x3F, 0x8F, 0xFF, 0xF0, 0x7F, 0xFE,
+ 0x03, 0xFF, 0xC0, 0x0F, 0xE0, 0x00, 0x00, 0x07, 0xE0, 0x01, 0xFC, 0x00,
+ 0x7F, 0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x00, 0xEF, 0x80, 0x3D, 0xF0, 0x0F,
+ 0x7C, 0x03, 0xCF, 0x80, 0xF1, 0xF0, 0x1C, 0x3E, 0x07, 0x07, 0xC1, 0xE1,
+ 0xF0, 0x78, 0x3E, 0x1E, 0x07, 0xC3, 0xFF, 0xFE, 0x7F, 0xFF, 0xDF, 0xFF,
+ 0xFB, 0xFF, 0xFF, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00, 0x1F,
+ 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x01, 0xFF, 0xF0, 0x3F, 0xFF, 0x03,
+ 0xFF, 0xF0, 0x3F, 0xFF, 0x07, 0x80, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x00,
+ 0xF7, 0xE0, 0x0F, 0xFF, 0x01, 0xFF, 0xF8, 0x1F, 0xFF, 0x83, 0xF0, 0xFC,
+ 0x3E, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07,
+ 0x8F, 0x80, 0xF8, 0xF8, 0x1F, 0x8F, 0xC3, 0xF0, 0xFF, 0xFE, 0x07, 0xFF,
+ 0xC0, 0x3F, 0xF8, 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x3F, 0xF0, 0x0F,
+ 0xFF, 0x03, 0xFF, 0xE0, 0xF8, 0x7E, 0x3E, 0x07, 0xC7, 0x80, 0x01, 0xF0,
+ 0x00, 0x3C, 0xFC, 0x07, 0xFF, 0xC1, 0xFF, 0xFC, 0x3F, 0xFF, 0xC7, 0xE1,
+ 0xF8, 0xF8, 0x1F, 0x3E, 0x03, 0xE7, 0x80, 0x7C, 0xF0, 0x0F, 0x9E, 0x01,
+ 0xE3, 0xC0, 0x7C, 0x78, 0x1F, 0x0F, 0x87, 0xE0, 0xFF, 0xF8, 0x1F, 0xFE,
+ 0x01, 0xFF, 0x80, 0x0F, 0xC0, 0x00, 0x7F, 0xFF, 0xEF, 0xFF, 0xF9, 0xFF,
+ 0xFF, 0x7F, 0xFF, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03,
+ 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x07, 0x80, 0x01, 0xF0, 0x00, 0x7C,
+ 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x07, 0xC0,
+ 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x3E, 0x00,
+ 0x07, 0xC0, 0x00, 0x00, 0x7F, 0x00, 0x1F, 0xFC, 0x07, 0xFF, 0xE0, 0xFF,
+ 0xFF, 0x0F, 0x81, 0xF1, 0xF0, 0x0F, 0x1E, 0x00, 0xF1, 0xE0, 0x1E, 0x1F,
+ 0x07, 0xE0, 0xFF, 0xFC, 0x07, 0xFF, 0x00, 0xFF, 0xF8, 0x1F, 0xFF, 0x83,
+ 0xF0, 0xFC, 0x7C, 0x07, 0xC7, 0xC0, 0x7C, 0xF8, 0x07, 0xCF, 0x80, 0x7C,
+ 0xF8, 0x0F, 0x8F, 0x80, 0xF8, 0xFC, 0x3F, 0x0F, 0xFF, 0xF0, 0x7F, 0xFE,
+ 0x03, 0xFF, 0x80, 0x0F, 0xE0, 0x00, 0x00, 0x7E, 0x00, 0x3F, 0xF0, 0x0F,
+ 0xFF, 0x03, 0xFF, 0xE0, 0xFC, 0x3E, 0x3F, 0x03, 0xC7, 0xC0, 0x79, 0xF0,
+ 0x0F, 0x3E, 0x01, 0xE7, 0xC0, 0x3C, 0xF8, 0x0F, 0x9F, 0x03, 0xE3, 0xF0,
+ 0xFC, 0x7F, 0xFF, 0x87, 0xFF, 0xF0, 0x7F, 0xFE, 0x07, 0xE7, 0x80, 0x01,
+ 0xF0, 0x00, 0x3C, 0x7C, 0x0F, 0x8F, 0xC3, 0xE1, 0xFF, 0xF8, 0x1F, 0xFE,
+ 0x01, 0xFF, 0x80, 0x0F, 0xC0, 0x00, 0x0F, 0x87, 0xC3, 0xC3, 0xE1, 0xF0,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE1, 0xF0, 0xF0,
+ 0xF8, 0x7C, 0x00, 0x07, 0xC1, 0xF0, 0x78, 0x3E, 0x0F, 0x80, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x83, 0xE0, 0xF0, 0x7C,
+ 0x1F, 0x00, 0xC0, 0x70, 0x18, 0x0E, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x20,
+ 0x00, 0x3C, 0x00, 0x3F, 0x80, 0x3F, 0xE0, 0x3F, 0xFC, 0x3F, 0xFC, 0x1F,
+ 0xFC, 0x07, 0xFC, 0x00, 0xFC, 0x00, 0x1F, 0xF0, 0x03, 0xFF, 0x80, 0x1F,
+ 0xFE, 0x00, 0xFF, 0xF0, 0x03, 0xFE, 0x00, 0x1F, 0xC0, 0x00, 0x78, 0x00,
+ 0x03, 0x00, 0x1F, 0xFF, 0xF3, 0xFF, 0xFE, 0x3F, 0xFF, 0xE3, 0xFF, 0xFE,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF,
+ 0xC7, 0xFF, 0xFC, 0xFF, 0xFF, 0x8F, 0xFF, 0xF8, 0x18, 0x00, 0x03, 0xC0,
+ 0x00, 0x7F, 0x00, 0x0F, 0xF8, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0x3F,
+ 0xF8, 0x01, 0xFF, 0x00, 0x07, 0xE0, 0x07, 0xFC, 0x07, 0xFF, 0x07, 0xFF,
+ 0x87, 0xFF, 0x80, 0xFF, 0x80, 0x3F, 0x80, 0x07, 0x80, 0x00, 0x80, 0x00,
+ 0x00, 0x03, 0xF8, 0x03, 0xFF, 0xC1, 0xFF, 0xF8, 0xFF, 0xFE, 0x7E, 0x1F,
+ 0xDF, 0x03, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xC0, 0x03, 0xE0,
+ 0x01, 0xF8, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x1F,
+ 0x80, 0x07, 0x80, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0xC0, 0x01, 0xF0, 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x00,
+ 0x00, 0x00, 0x7F, 0x80, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xFE,
+ 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x0F, 0xC0, 0x03, 0xE0, 0x0F, 0x80, 0x00,
+ 0xF8, 0x0F, 0x00, 0x00, 0x3C, 0x0F, 0x01, 0xF1, 0xCF, 0x0F, 0x03, 0xFD,
+ 0xC7, 0x8F, 0x03, 0xFF, 0xE1, 0xC7, 0x03, 0xE3, 0xE0, 0xE7, 0x03, 0xC0,
+ 0xF0, 0x73, 0x83, 0xC0, 0x78, 0x3B, 0x81, 0xE0, 0x38, 0x1D, 0xC1, 0xE0,
+ 0x1C, 0x1C, 0xC0, 0xF0, 0x1C, 0x0E, 0xE0, 0x70, 0x0E, 0x0F, 0x70, 0x78,
+ 0x0E, 0x07, 0x38, 0x3C, 0x0F, 0x07, 0x1C, 0x1E, 0x0F, 0x87, 0x8E, 0x0F,
+ 0x8F, 0xCF, 0x87, 0x07, 0xFF, 0xFF, 0x83, 0xC1, 0xFE, 0x7F, 0x00, 0xE0,
+ 0x3C, 0x1F, 0x00, 0x78, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x0F,
+ 0xC0, 0x01, 0x00, 0x03, 0xF8, 0x07, 0x80, 0x00, 0xFF, 0xFF, 0xC0, 0x00,
+ 0x1F, 0xFF, 0xE0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00,
+ 0x0F, 0xE0, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0xC0, 0x00, 0xFF, 0x80, 0x03,
+ 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x1F, 0x7C, 0x00, 0x7E, 0xF8, 0x00, 0xF9,
+ 0xF0, 0x03, 0xF3, 0xE0, 0x07, 0xC3, 0xE0, 0x1F, 0x87, 0xC0, 0x3E, 0x0F,
+ 0x80, 0xF8, 0x1F, 0x01, 0xF0, 0x3E, 0x07, 0xFF, 0xFC, 0x1F, 0xFF, 0xF8,
+ 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xF1, 0xF0, 0x03, 0xE7, 0xC0, 0x07, 0xCF,
+ 0x80, 0x0F, 0xBE, 0x00, 0x1F, 0x7C, 0x00, 0x3F, 0xF0, 0x00, 0x7C, 0x07,
+ 0xFF, 0xF0, 0x07, 0xFF, 0xFC, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0x0F,
+ 0xC0, 0x3F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, 0x1F, 0x1F,
+ 0x80, 0x1E, 0x1F, 0x80, 0x3E, 0x1F, 0x00, 0x7C, 0x1F, 0xFF, 0xF8, 0x1F,
+ 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x3E, 0x00, 0xFC, 0x3E,
+ 0x00, 0x7C, 0x3E, 0x00, 0x7C, 0x7E, 0x00, 0x7C, 0x7C, 0x00, 0x7C, 0x7C,
+ 0x00, 0xF8, 0x7C, 0x01, 0xF8, 0x7F, 0xFF, 0xF0, 0xFF, 0xFF, 0xE0, 0xFF,
+ 0xFF, 0xC0, 0xFF, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0xF8, 0x01,
+ 0xFF, 0xFC, 0x03, 0xFF, 0xFE, 0x07, 0xE0, 0x7F, 0x0F, 0xC0, 0x3F, 0x1F,
+ 0x80, 0x1F, 0x3F, 0x00, 0x1F, 0x3E, 0x00, 0x1F, 0x7E, 0x00, 0x00, 0x7C,
+ 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8,
+ 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x7C, 0xF8,
+ 0x00, 0x7C, 0xFC, 0x00, 0xF8, 0xFC, 0x01, 0xF8, 0x7F, 0x07, 0xF0, 0x7F,
+ 0xFF, 0xE0, 0x3F, 0xFF, 0xC0, 0x0F, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x07,
+ 0xFF, 0xE0, 0x07, 0xFF, 0xF8, 0x07, 0xFF, 0xFC, 0x0F, 0xFF, 0xFE, 0x0F,
+ 0x80, 0x7E, 0x0F, 0x80, 0x3F, 0x0F, 0x80, 0x1F, 0x1F, 0x80, 0x1F, 0x1F,
+ 0x80, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x3F,
+ 0x00, 0x1F, 0x3E, 0x00, 0x3E, 0x3E, 0x00, 0x3E, 0x3E, 0x00, 0x3E, 0x3E,
+ 0x00, 0x3E, 0x7E, 0x00, 0x7C, 0x7C, 0x00, 0x7C, 0x7C, 0x00, 0xF8, 0x7C,
+ 0x01, 0xF8, 0x7C, 0x07, 0xF0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xC0, 0xFF,
+ 0xFF, 0x00, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xFF, 0x07, 0xFF, 0xFE, 0x07,
+ 0xFF, 0xFE, 0x0F, 0xFF, 0xFE, 0x0F, 0x80, 0x00, 0x0F, 0x80, 0x00, 0x0F,
+ 0x80, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x1F,
+ 0x00, 0x00, 0x1F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0xF0, 0x3F,
+ 0xFF, 0xF0, 0x3E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7E,
+ 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFF,
+ 0xFF, 0xF0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xE0, 0x07,
+ 0xFF, 0xFE, 0x0F, 0xFF, 0xFC, 0x3F, 0xFF, 0xF0, 0x7F, 0xFF, 0xE0, 0xF8,
+ 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x00,
+ 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0xFF, 0xFE,
+ 0x07, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00,
+ 0xFC, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F,
+ 0x80, 0x00, 0x3F, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0,
+ 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0xF8, 0x01, 0xFF, 0xFC, 0x03,
+ 0xFF, 0xFE, 0x07, 0xE0, 0x7E, 0x0F, 0x80, 0x3F, 0x1F, 0x00, 0x1F, 0x3E,
+ 0x00, 0x1F, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C,
+ 0x00, 0x00, 0xF8, 0x03, 0xFF, 0xF8, 0x07, 0xFF, 0xF8, 0x07, 0xFE, 0xF8,
+ 0x07, 0xFE, 0xF8, 0x00, 0x3E, 0xF8, 0x00, 0x3E, 0xFC, 0x00, 0x7E, 0xFC,
+ 0x00, 0x7C, 0x7E, 0x00, 0xFC, 0x7F, 0x83, 0xFC, 0x3F, 0xFF, 0xFC, 0x1F,
+ 0xFF, 0xBC, 0x0F, 0xFF, 0x38, 0x03, 0xFC, 0x38, 0x03, 0xE0, 0x07, 0xC0,
+ 0xF8, 0x01, 0xF0, 0x7E, 0x00, 0x7C, 0x1F, 0x00, 0x3F, 0x07, 0xC0, 0x0F,
+ 0x81, 0xF0, 0x03, 0xE0, 0xFC, 0x00, 0xF8, 0x3E, 0x00, 0x3E, 0x0F, 0x80,
+ 0x1F, 0x83, 0xE0, 0x07, 0xC0, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFC, 0x1F,
+ 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC1, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8,
+ 0x3F, 0x00, 0x3E, 0x0F, 0x80, 0x0F, 0x83, 0xE0, 0x07, 0xE0, 0xF8, 0x01,
+ 0xF0, 0x3E, 0x00, 0x7C, 0x1F, 0x80, 0x1F, 0x07, 0xC0, 0x0F, 0xC1, 0xF0,
+ 0x03, 0xF0, 0x7C, 0x00, 0xF8, 0x3F, 0x00, 0x3E, 0x00, 0x07, 0xC3, 0xF0,
+ 0xFC, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x7E, 0x1F, 0x07, 0xC1, 0xF0, 0x7C,
+ 0x3F, 0x0F, 0xC3, 0xE0, 0xF8, 0x3E, 0x0F, 0x87, 0xE1, 0xF0, 0x7C, 0x1F,
+ 0x07, 0xC3, 0xF0, 0xFC, 0x3E, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00,
+ 0x01, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0,
+ 0x00, 0x3E, 0x00, 0x07, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C,
+ 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x7C, 0x0F,
+ 0x8F, 0x81, 0xF8, 0xF8, 0x1F, 0x0F, 0x81, 0xF0, 0xF8, 0x1F, 0x0F, 0xC3,
+ 0xF0, 0xFF, 0xFE, 0x07, 0xFF, 0xC0, 0x3F, 0xF8, 0x01, 0xFC, 0x00, 0x07,
+ 0xC0, 0x0F, 0xC1, 0xF0, 0x07, 0xE0, 0x7C, 0x03, 0xF0, 0x3F, 0x03, 0xF8,
+ 0x0F, 0x81, 0xF8, 0x03, 0xE0, 0xFC, 0x00, 0xF8, 0x7E, 0x00, 0x7E, 0x3F,
+ 0x00, 0x1F, 0x1F, 0x80, 0x07, 0xCF, 0xC0, 0x01, 0xF7, 0xE0, 0x00, 0x7F,
+ 0xF0, 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00,
+ 0xFE, 0xFC, 0x00, 0x3F, 0x1F, 0x80, 0x1F, 0x87, 0xE0, 0x07, 0xC0, 0xFC,
+ 0x01, 0xF0, 0x3F, 0x00, 0x7C, 0x07, 0xE0, 0x1F, 0x01, 0xFC, 0x0F, 0xC0,
+ 0x3F, 0x03, 0xE0, 0x0F, 0xE0, 0xF8, 0x01, 0xF8, 0x3E, 0x00, 0x3F, 0x00,
+ 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x0F, 0xC0, 0x03,
+ 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x1F, 0x80, 0x07, 0xC0, 0x01, 0xF0,
+ 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x0F, 0xC0, 0x03, 0xE0, 0x00, 0xF8, 0x00,
+ 0x3E, 0x00, 0x0F, 0x80, 0x07, 0xE0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F,
+ 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xE0, 0x03,
+ 0xF8, 0x01, 0xFC, 0x07, 0xF0, 0x07, 0xF8, 0x1F, 0xE0, 0x0F, 0xF0, 0x3F,
+ 0xC0, 0x3F, 0xE0, 0x7F, 0x80, 0x7F, 0xC0, 0xFF, 0x01, 0xFF, 0x01, 0xFE,
+ 0x03, 0xFE, 0x07, 0xDC, 0x07, 0x7C, 0x0F, 0xB8, 0x1E, 0xF8, 0x1F, 0x70,
+ 0x3D, 0xF0, 0x3E, 0xF0, 0xF7, 0xC0, 0xF9, 0xE1, 0xEF, 0x81, 0xF3, 0xC7,
+ 0x9F, 0x03, 0xE7, 0x8F, 0x3E, 0x07, 0xCF, 0x3C, 0x7C, 0x0F, 0x9E, 0x79,
+ 0xF0, 0x3E, 0x3C, 0xE3, 0xE0, 0x7C, 0x7B, 0xC7, 0xC0, 0xF8, 0xF7, 0x8F,
+ 0x81, 0xF1, 0xFE, 0x1E, 0x07, 0xE3, 0xFC, 0x7C, 0x0F, 0x87, 0xF0, 0xF8,
+ 0x1F, 0x0F, 0xE1, 0xF0, 0x3E, 0x1F, 0x83, 0xE0, 0x7C, 0x3F, 0x0F, 0x81,
+ 0xF0, 0x7E, 0x1F, 0x00, 0x03, 0xE0, 0x07, 0xC0, 0x7E, 0x00, 0xF8, 0x1F,
+ 0xC0, 0x1F, 0x03, 0xF8, 0x03, 0xE0, 0x7F, 0x80, 0x7C, 0x0F, 0xF0, 0x1F,
+ 0x01, 0xFF, 0x03, 0xE0, 0x7F, 0xE0, 0x7C, 0x0F, 0xBC, 0x0F, 0x81, 0xF7,
+ 0xC1, 0xF0, 0x3E, 0xF8, 0x7C, 0x0F, 0x8F, 0x0F, 0x81, 0xF1, 0xF1, 0xF0,
+ 0x3E, 0x3E, 0x3E, 0x07, 0xC3, 0xC7, 0xC0, 0xF8, 0x7D, 0xF0, 0x3E, 0x0F,
+ 0xBE, 0x07, 0xC0, 0xF7, 0xC0, 0xF8, 0x1F, 0xF8, 0x1F, 0x01, 0xFE, 0x03,
+ 0xC0, 0x3F, 0xC0, 0xF8, 0x07, 0xF8, 0x1F, 0x00, 0x7F, 0x03, 0xE0, 0x0F,
+ 0xE0, 0x7C, 0x01, 0xF8, 0x1F, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0xE0, 0x00,
+ 0x3F, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0xC0, 0x7E, 0x07, 0xF0,
+ 0x7E, 0x01, 0xF8, 0x7C, 0x00, 0x7E, 0x3E, 0x00, 0x1F, 0x3E, 0x00, 0x0F,
+ 0x9E, 0x00, 0x07, 0xDF, 0x00, 0x03, 0xEF, 0x80, 0x01, 0xFF, 0x80, 0x00,
+ 0xFF, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x7D, 0xF0, 0x00, 0x3E, 0xF8, 0x00,
+ 0x1F, 0x7C, 0x00, 0x1F, 0x3E, 0x00, 0x1F, 0x9F, 0x80, 0x0F, 0x87, 0xE0,
+ 0x0F, 0x83, 0xF8, 0x1F, 0x80, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0x80, 0x0F,
+ 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0xF0,
+ 0x3F, 0xFF, 0xF0, 0x7F, 0xFF, 0xF0, 0xF8, 0x07, 0xE1, 0xF0, 0x07, 0xC3,
+ 0xE0, 0x0F, 0x8F, 0xC0, 0x1F, 0x1F, 0x00, 0x3E, 0x3E, 0x00, 0xF8, 0x7C,
+ 0x01, 0xF0, 0xF8, 0x07, 0xC3, 0xFF, 0xFF, 0x87, 0xFF, 0xFE, 0x0F, 0xFF,
+ 0xF8, 0x1F, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF0, 0x00,
+ 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x3F, 0x00, 0x00,
+ 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x1F, 0xC0,
+ 0x00, 0x3F, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0xC0, 0x7F, 0x07,
+ 0xF0, 0x7E, 0x01, 0xF8, 0x7E, 0x00, 0x7E, 0x3E, 0x00, 0x1F, 0x3E, 0x00,
+ 0x0F, 0x9E, 0x00, 0x07, 0xDF, 0x00, 0x03, 0xEF, 0x80, 0x01, 0xF7, 0x80,
+ 0x00, 0xFF, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x7D, 0xF0, 0x00, 0x3E, 0xF8,
+ 0x02, 0x1F, 0x7C, 0x03, 0x9F, 0x3E, 0x03, 0xFF, 0x9F, 0x81, 0xFF, 0x87,
+ 0xE0, 0x7F, 0x83, 0xF8, 0x3F, 0xC0, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xF0,
+ 0x0F, 0xFF, 0xFC, 0x01, 0xFE, 0x1C, 0x00, 0x00, 0x0C, 0x00, 0x07, 0xFF,
+ 0xF8, 0x07, 0xFF, 0xFE, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0x0F, 0x80,
+ 0x3F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, 0x1F, 0x1F, 0x80,
+ 0x1E, 0x1F, 0x00, 0x3E, 0x1F, 0x00, 0x7C, 0x1F, 0xFF, 0xF8, 0x1F, 0xFF,
+ 0xE0, 0x3F, 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x3E, 0x01, 0xF8, 0x3E, 0x00,
+ 0xF8, 0x3E, 0x00, 0xF8, 0x7E, 0x00, 0xF8, 0x7C, 0x00, 0xF8, 0x7C, 0x01,
+ 0xF0, 0x7C, 0x01, 0xF0, 0x7C, 0x01, 0xF0, 0xFC, 0x01, 0xF0, 0xF8, 0x01,
+ 0xF0, 0xF8, 0x01, 0xF0, 0x00, 0x3F, 0xC0, 0x07, 0xFF, 0xC0, 0x3F, 0xFF,
+ 0x81, 0xFF, 0xFF, 0x0F, 0xC0, 0xFC, 0x3E, 0x01, 0xF1, 0xF0, 0x07, 0xC7,
+ 0xC0, 0x1F, 0x1F, 0x00, 0x00, 0x7E, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF,
+ 0x80, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x03, 0xFE,
+ 0x00, 0x01, 0xF8, 0x00, 0x03, 0xEF, 0x80, 0x0F, 0xBE, 0x00, 0x3C, 0xFC,
+ 0x01, 0xF3, 0xF8, 0x1F, 0x87, 0xFF, 0xFE, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF,
+ 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xF0, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xC0, 0x00, 0x3E,
+ 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xC0, 0x00,
+ 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xC0,
+ 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07,
+ 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00,
+ 0x00, 0x0F, 0x80, 0x1F, 0x1F, 0x80, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00,
+ 0x3F, 0x1F, 0x00, 0x3E, 0x1F, 0x00, 0x3E, 0x3E, 0x00, 0x3E, 0x3E, 0x00,
+ 0x7E, 0x3E, 0x00, 0x7C, 0x3E, 0x00, 0x7C, 0x3E, 0x00, 0x7C, 0x7C, 0x00,
+ 0x7C, 0x7C, 0x00, 0xFC, 0x7C, 0x00, 0xF8, 0x7C, 0x00, 0xF8, 0x7C, 0x00,
+ 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x01, 0xF8, 0xF8, 0x01, 0xF0, 0xF8, 0x01,
+ 0xF0, 0xF8, 0x03, 0xE0, 0xFE, 0x0F, 0xE0, 0x7F, 0xFF, 0xC0, 0x7F, 0xFF,
+ 0x80, 0x1F, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0xFC, 0x00, 0x7F, 0xF0, 0x03,
+ 0xE7, 0xC0, 0x0F, 0x9F, 0x00, 0x7C, 0x7C, 0x01, 0xF1, 0xF0, 0x0F, 0x87,
+ 0xC0, 0x3E, 0x1F, 0x01, 0xF0, 0x7C, 0x07, 0x81, 0xF0, 0x3E, 0x03, 0xC0,
+ 0xF0, 0x0F, 0x07, 0xC0, 0x3E, 0x1E, 0x00, 0xF8, 0xF8, 0x03, 0xE3, 0xC0,
+ 0x0F, 0x9F, 0x00, 0x3E, 0x78, 0x00, 0xFB, 0xE0, 0x01, 0xEF, 0x00, 0x07,
+ 0xFC, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xE0,
+ 0x00, 0x1F, 0x80, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x07, 0xE0, 0x1F, 0xF8,
+ 0x07, 0xE0, 0x3F, 0xF8, 0x0F, 0xE0, 0x3E, 0xF8, 0x0F, 0xE0, 0x7E, 0xF8,
+ 0x1F, 0xE0, 0x7C, 0xF8, 0x1F, 0xE0, 0x7C, 0xF8, 0x3F, 0xE0, 0xF8, 0xF8,
+ 0x3D, 0xE0, 0xF8, 0x78, 0x3D, 0xE1, 0xF0, 0x78, 0x79, 0xE1, 0xF0, 0x78,
+ 0x79, 0xE1, 0xE0, 0x78, 0xF9, 0xE3, 0xE0, 0x78, 0xF1, 0xE3, 0xC0, 0x79,
+ 0xF1, 0xE7, 0xC0, 0x79, 0xE1, 0xE7, 0x80, 0x79, 0xE1, 0xE7, 0x80, 0x7B,
+ 0xC1, 0xEF, 0x80, 0x7B, 0xC1, 0xEF, 0x00, 0x7F, 0x81, 0xFF, 0x00, 0x7F,
+ 0x81, 0xFE, 0x00, 0x7F, 0x01, 0xFE, 0x00, 0x7F, 0x01, 0xFC, 0x00, 0x7F,
+ 0x01, 0xFC, 0x00, 0x7E, 0x01, 0xF8, 0x00, 0x3E, 0x01, 0xF8, 0x00, 0x3C,
+ 0x01, 0xF0, 0x00, 0x03, 0xF0, 0x07, 0xE0, 0x7E, 0x01, 0xF8, 0x07, 0xE0,
+ 0x7E, 0x00, 0xFC, 0x1F, 0x80, 0x1F, 0x83, 0xE0, 0x01, 0xF8, 0xF8, 0x00,
+ 0x3F, 0x3F, 0x00, 0x03, 0xEF, 0xC0, 0x00, 0x7F, 0xF0, 0x00, 0x0F, 0xFC,
+ 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x03, 0xF8, 0x00, 0x00,
+ 0x7F, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0xFF, 0xC0,
+ 0x00, 0x3E, 0xF8, 0x00, 0x0F, 0xDF, 0x80, 0x03, 0xF3, 0xF0, 0x00, 0xFC,
+ 0x3F, 0x00, 0x3F, 0x07, 0xE0, 0x07, 0xE0, 0xFC, 0x01, 0xF8, 0x0F, 0xC0,
+ 0x7E, 0x01, 0xF8, 0x1F, 0x80, 0x3F, 0x80, 0x7C, 0x00, 0xFD, 0xF8, 0x07,
+ 0xE7, 0xE0, 0x1F, 0x1F, 0x80, 0xFC, 0x3E, 0x07, 0xE0, 0xFC, 0x1F, 0x03,
+ 0xF0, 0xFC, 0x07, 0xC7, 0xE0, 0x1F, 0x1F, 0x00, 0x7E, 0xFC, 0x00, 0xFB,
+ 0xE0, 0x03, 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x00,
+ 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x01,
+ 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0,
+ 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0x83, 0xFF,
+ 0xFF, 0x81, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0x00, 0x07, 0xE0, 0x00,
+ 0x07, 0xE0, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00,
+ 0x07, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00,
+ 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00,
+ 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF8, 0x00,
+ 0x03, 0xF8, 0x00, 0x01, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF,
+ 0xF0, 0x7F, 0xFF, 0xF0, 0x00, 0x01, 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x1F,
+ 0xF0, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x0F, 0x00,
+ 0x1E, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F,
+ 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x0F, 0x00,
+ 0x1E, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F,
+ 0xF0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x00, 0xE7, 0x39, 0xCE, 0x31, 0x8C,
+ 0x63, 0x1C, 0xE7, 0x39, 0xCE, 0x31, 0x8C, 0x63, 0x9C, 0xE7, 0x38, 0x01,
+ 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x1F, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F,
+ 0x00, 0x3E, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x0F, 0x00,
+ 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F,
+ 0x00, 0x3E, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x0F, 0x00,
+ 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x1F, 0xF0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF,
+ 0x00, 0x00, 0x7C, 0x00, 0xFC, 0x01, 0xFC, 0x01, 0xFC, 0x03, 0xFC, 0x03,
+ 0x9E, 0x07, 0x9E, 0x0F, 0x1E, 0x0F, 0x1E, 0x1E, 0x1E, 0x1C, 0x0F, 0x3C,
+ 0x0F, 0x78, 0x0F, 0x78, 0x0F, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFE, 0xF3, 0x8C, 0x71, 0x80, 0x01, 0xFE, 0x01, 0xFF, 0xE0,
+ 0xFF, 0xF8, 0x7F, 0xFF, 0x1F, 0x0F, 0xC7, 0x81, 0xF0, 0x00, 0x7C, 0x00,
+ 0xFE, 0x07, 0xFF, 0x87, 0xFF, 0xE3, 0xFE, 0xF9, 0xF0, 0x7C, 0xF8, 0x1F,
+ 0x3E, 0x0F, 0xCF, 0x87, 0xF3, 0xFF, 0xF8, 0xFF, 0xFE, 0x1F, 0xEF, 0x81,
+ 0xE3, 0xF0, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00,
+ 0x07, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF9, 0xF8, 0x0F, 0xFF,
+ 0xC1, 0xFF, 0xFE, 0x1F, 0xFF, 0xE1, 0xFC, 0x3F, 0x1F, 0x83, 0xF1, 0xF0,
+ 0x1F, 0x3E, 0x01, 0xF3, 0xE0, 0x1F, 0x3C, 0x01, 0xF3, 0xC0, 0x1F, 0x3C,
+ 0x03, 0xE7, 0xC0, 0x3E, 0x7E, 0x07, 0xC7, 0xF1, 0xFC, 0x7F, 0xFF, 0x87,
+ 0xFF, 0xF0, 0xFB, 0xFE, 0x0F, 0x9F, 0x80, 0x00, 0xFC, 0x01, 0xFF, 0xC0,
+ 0xFF, 0xF8, 0x7F, 0xFF, 0x3F, 0x0F, 0xCF, 0x81, 0xF7, 0xC0, 0x7D, 0xF0,
+ 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x0F,
+ 0xBE, 0x07, 0xCF, 0xC3, 0xF1, 0xFF, 0xF8, 0x7F, 0xFC, 0x0F, 0xFE, 0x00,
+ 0xFE, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x00,
+ 0x3E, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x1F, 0x00, 0x7E, 0x7C,
+ 0x07, 0xFD, 0xF0, 0x3F, 0xFF, 0xC1, 0xFF, 0xFE, 0x0F, 0xE3, 0xF8, 0x3E,
+ 0x07, 0xE1, 0xF0, 0x1F, 0x87, 0xC0, 0x3C, 0x3E, 0x00, 0xF0, 0xF8, 0x07,
+ 0xC3, 0xE0, 0x1F, 0x0F, 0x80, 0x7C, 0x3E, 0x03, 0xE0, 0xF8, 0x1F, 0x83,
+ 0xF0, 0xFE, 0x07, 0xFF, 0xF8, 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, 0x00, 0x7E,
+ 0x7C, 0x00, 0x00, 0xFE, 0x00, 0x7F, 0xE0, 0x3F, 0xFE, 0x0F, 0xFF, 0xE3,
+ 0xF0, 0x7E, 0x7C, 0x07, 0xDF, 0x00, 0xFB, 0xE0, 0x1F, 0x7F, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x1F, 0x3F,
+ 0x07, 0xE3, 0xFF, 0xF8, 0x7F, 0xFE, 0x03, 0xFF, 0x00, 0x3F, 0x80, 0x00,
+ 0x00, 0xF8, 0x1F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7C, 0x07, 0xC0, 0x3E, 0x0F,
+ 0xFE, 0x7F, 0xF3, 0xFF, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C,
+ 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x78, 0x07, 0xC0, 0x3E, 0x01,
+ 0xF0, 0x0F, 0x80, 0xF8, 0x07, 0xC0, 0x00, 0x00, 0x7C, 0x7C, 0x07, 0xFD,
+ 0xF0, 0x3F, 0xF7, 0x81, 0xFF, 0xFE, 0x0F, 0xE3, 0xF8, 0x3E, 0x07, 0xE1,
+ 0xF8, 0x0F, 0x87, 0xC0, 0x3C, 0x1E, 0x00, 0xF0, 0xF8, 0x03, 0xC3, 0xE0,
+ 0x1F, 0x0F, 0x80, 0x78, 0x3E, 0x03, 0xE0, 0xF8, 0x1F, 0x83, 0xF0, 0xFE,
+ 0x07, 0xFF, 0xF8, 0x1F, 0xFF, 0xC0, 0x3F, 0xEF, 0x00, 0x3E, 0x7C, 0x00,
+ 0x01, 0xF0, 0x00, 0x07, 0xC3, 0xE0, 0x3E, 0x0F, 0x80, 0xF8, 0x3F, 0x0F,
+ 0xC0, 0x7F, 0xFE, 0x00, 0xFF, 0xF0, 0x00, 0xFE, 0x00, 0x00, 0x03, 0xE0,
+ 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C,
+ 0x00, 0x0F, 0x80, 0x00, 0xF8, 0xF8, 0x0F, 0xBF, 0xE0, 0xFF, 0xFF, 0x0F,
+ 0xFF, 0xF1, 0xFC, 0x3F, 0x1F, 0x81, 0xF1, 0xF0, 0x1F, 0x1F, 0x01, 0xF1,
+ 0xE0, 0x1F, 0x3E, 0x03, 0xE3, 0xE0, 0x3E, 0x3E, 0x03, 0xE3, 0xE0, 0x3E,
+ 0x7C, 0x03, 0xE7, 0xC0, 0x7C, 0x7C, 0x07, 0xC7, 0xC0, 0x7C, 0x7C, 0x07,
+ 0xCF, 0x80, 0x78, 0x07, 0xC1, 0xF0, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00,
+ 0x3E, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x0F, 0x83, 0xE0, 0xF8, 0x3E,
+ 0x0F, 0x87, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC3, 0xE0, 0xF8, 0x3E, 0x00,
+ 0x00, 0x3E, 0x00, 0x78, 0x01, 0xF0, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0x80, 0x1F,
+ 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80,
+ 0x1F, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x1F,
+ 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x03, 0xF0, 0x1F, 0xC0, 0x3F, 0x80,
+ 0x7E, 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00,
+ 0x0F, 0x80, 0x00, 0x78, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0,
+ 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x07, 0xC7, 0xE0, 0x3E, 0x7E, 0x01,
+ 0xF7, 0xE0, 0x0F, 0xFE, 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x3F, 0xFC,
+ 0x01, 0xFF, 0xE0, 0x0F, 0xDF, 0x00, 0xFC, 0xFC, 0x07, 0xC3, 0xE0, 0x3E,
+ 0x1F, 0x01, 0xF0, 0xFC, 0x0F, 0x83, 0xE0, 0xF8, 0x1F, 0x87, 0xC0, 0xFC,
+ 0x00, 0x07, 0xC1, 0xF0, 0x7C, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x1F,
+ 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x87,
+ 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC3, 0xE0, 0xF8, 0x3E, 0x00, 0x0F, 0x8F,
+ 0x83, 0xF0, 0x3E, 0xFF, 0x3F, 0xE0, 0xF7, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF,
+ 0xFF, 0x1F, 0xC7, 0xF8, 0x7C, 0x7C, 0x0F, 0x81, 0xF1, 0xF0, 0x3E, 0x07,
+ 0xCF, 0x81, 0xF0, 0x3E, 0x3E, 0x07, 0xC0, 0xF8, 0xF8, 0x1F, 0x03, 0xE3,
+ 0xE0, 0x7C, 0x0F, 0x8F, 0x81, 0xF0, 0x3E, 0x7C, 0x0F, 0x81, 0xF1, 0xF0,
+ 0x3E, 0x07, 0xC7, 0xC0, 0xF8, 0x1F, 0x1F, 0x03, 0xE0, 0x7C, 0x7C, 0x0F,
+ 0x81, 0xE3, 0xE0, 0x7C, 0x0F, 0x8F, 0x81, 0xF0, 0x3E, 0x00, 0x0F, 0x8F,
+ 0x80, 0xFB, 0xFE, 0x0F, 0xFF, 0xF1, 0xFF, 0xFF, 0x1F, 0xC3, 0xF1, 0xF8,
+ 0x1F, 0x1F, 0x01, 0xF1, 0xF0, 0x1F, 0x3E, 0x01, 0xF3, 0xE0, 0x3E, 0x3E,
+ 0x03, 0xE3, 0xE0, 0x3E, 0x3C, 0x03, 0xE7, 0xC0, 0x3E, 0x7C, 0x07, 0xC7,
+ 0xC0, 0x7C, 0x7C, 0x07, 0xC7, 0x80, 0x7C, 0xF8, 0x07, 0x80, 0x00, 0xFE,
+ 0x00, 0x7F, 0xF0, 0x3F, 0xFF, 0x0F, 0xFF, 0xE3, 0xF8, 0xFE, 0x7C, 0x0F,
+ 0xDF, 0x00, 0xFB, 0xE0, 0x1F, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x1F,
+ 0xFC, 0x03, 0xEF, 0x80, 0x7D, 0xF8, 0x1F, 0x3F, 0x07, 0xE3, 0xFF, 0xF8,
+ 0x7F, 0xFE, 0x07, 0xFF, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xE7, 0xE0, 0x0F,
+ 0xBF, 0xC0, 0x7D, 0xFF, 0x81, 0xFF, 0xFE, 0x07, 0xF0, 0xFC, 0x1F, 0x81,
+ 0xF0, 0x7C, 0x07, 0xC3, 0xE0, 0x1F, 0x0F, 0x80, 0x7C, 0x3E, 0x01, 0xF0,
+ 0xF0, 0x07, 0xC3, 0xC0, 0x3E, 0x1F, 0x00, 0xF8, 0x7E, 0x07, 0xC1, 0xFC,
+ 0x7F, 0x07, 0xFF, 0xF8, 0x1F, 0xFF, 0xC0, 0xFB, 0xFE, 0x03, 0xE7, 0xE0,
+ 0x0F, 0x80, 0x00, 0x3E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x1F,
+ 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x01,
+ 0xF1, 0xF0, 0x7F, 0xDF, 0x0F, 0xFD, 0xF1, 0xFF, 0xFE, 0x3F, 0x8F, 0xE3,
+ 0xE0, 0x7E, 0x7C, 0x03, 0xE7, 0xC0, 0x3E, 0xF8, 0x03, 0xCF, 0x80, 0x3C,
+ 0xF8, 0x07, 0xCF, 0x80, 0x7C, 0xF8, 0x0F, 0x8F, 0x81, 0xF8, 0xFC, 0x3F,
+ 0x87, 0xFF, 0xF8, 0x7F, 0xFF, 0x83, 0xFF, 0xF0, 0x1F, 0x9F, 0x00, 0x01,
+ 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00,
+ 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x0F, 0x8E, 0x1F, 0x7C, 0x3F,
+ 0xF0, 0xFF, 0xE1, 0xFC, 0x03, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x3E, 0x00,
+ 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0x80, 0x1F, 0x00, 0x3E,
+ 0x00, 0x7C, 0x00, 0xF0, 0x03, 0xE0, 0x00, 0x01, 0xFC, 0x01, 0xFF, 0xC0,
+ 0xFF, 0xF8, 0x7F, 0xFF, 0x3F, 0x0F, 0xCF, 0x81, 0xF3, 0xF0, 0x00, 0xFF,
+ 0x80, 0x3F, 0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xF8, 0x03, 0xFE, 0x00, 0x1F,
+ 0xBE, 0x03, 0xEF, 0xC1, 0xFB, 0xFF, 0xFC, 0x7F, 0xFE, 0x0F, 0xFF, 0x00,
+ 0xFE, 0x00, 0x0F, 0x81, 0xF0, 0x7C, 0x0F, 0x81, 0xF0, 0xFF, 0xBF, 0xF7,
+ 0xFE, 0x3E, 0x07, 0xC0, 0xF8, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0,
+ 0xF8, 0x1F, 0x03, 0xE0, 0x7F, 0x0F, 0xE1, 0xFC, 0x1F, 0x80, 0x1F, 0x01,
+ 0xF1, 0xF0, 0x1F, 0x3E, 0x03, 0xE3, 0xE0, 0x3E, 0x3E, 0x03, 0xE3, 0xE0,
+ 0x3E, 0x3E, 0x03, 0xE7, 0xC0, 0x7C, 0x7C, 0x07, 0xC7, 0xC0, 0x7C, 0x7C,
+ 0x07, 0xC7, 0xC0, 0x7C, 0xF8, 0x0F, 0x8F, 0x81, 0xF8, 0xF8, 0x3F, 0x8F,
+ 0xFF, 0xF8, 0xFF, 0xFF, 0x07, 0xFD, 0xF0, 0x3F, 0x1F, 0x00, 0xF8, 0x0F,
+ 0xFE, 0x03, 0xEF, 0x81, 0xF3, 0xE0, 0x7C, 0xF8, 0x3E, 0x3E, 0x0F, 0x8F,
+ 0x87, 0xC1, 0xE1, 0xF0, 0x78, 0xF8, 0x1E, 0x3E, 0x07, 0x9F, 0x01, 0xF7,
+ 0x80, 0x7F, 0xE0, 0x1F, 0xF0, 0x03, 0xFC, 0x00, 0xFE, 0x00, 0x3F, 0x80,
+ 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xF8, 0x1F, 0x07, 0xFF, 0x03, 0xE0, 0xFB,
+ 0xE0, 0xFC, 0x1F, 0x7C, 0x1F, 0x87, 0xCF, 0x87, 0xF0, 0xF9, 0xF0, 0xFE,
+ 0x3E, 0x3E, 0x3D, 0xC7, 0xC3, 0xC7, 0xB9, 0xF0, 0x79, 0xE7, 0x3E, 0x0F,
+ 0x3C, 0xE7, 0x81, 0xEF, 0x1D, 0xF0, 0x3D, 0xE3, 0xBC, 0x07, 0xBC, 0x7F,
+ 0x80, 0xFF, 0x0F, 0xE0, 0x1F, 0xE1, 0xFC, 0x03, 0xF8, 0x3F, 0x00, 0x7F,
+ 0x07, 0xE0, 0x0F, 0xC0, 0xF8, 0x01, 0xF8, 0x1F, 0x00, 0x00, 0x0F, 0xC1,
+ 0xF8, 0x3F, 0x07, 0xC0, 0x7C, 0x3E, 0x01, 0xF9, 0xF8, 0x03, 0xEF, 0xC0,
+ 0x0F, 0xBE, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0x80, 0x01, 0xFC, 0x00, 0x03,
+ 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x3E, 0xF8,
+ 0x01, 0xFB, 0xF0, 0x07, 0xC7, 0xC0, 0x3E, 0x1F, 0x81, 0xF8, 0x7E, 0x0F,
+ 0xC0, 0xF8, 0x00, 0x1F, 0x80, 0x7C, 0x3E, 0x03, 0xE0, 0xF8, 0x0F, 0x03,
+ 0xE0, 0x7C, 0x0F, 0x81, 0xE0, 0x3E, 0x0F, 0x80, 0xF8, 0x3C, 0x03, 0xE1,
+ 0xF0, 0x07, 0x87, 0x80, 0x1F, 0x3E, 0x00, 0x7C, 0xF0, 0x01, 0xF7, 0xC0,
+ 0x07, 0xDE, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0xC0, 0x01, 0xFE, 0x00, 0x03,
+ 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0,
+ 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x00, 0x01,
+ 0xF8, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0xE1, 0xFF, 0xFC, 0x3F,
+ 0xFF, 0x87, 0xFF, 0xE0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03,
+ 0xF0, 0x01, 0xFC, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8,
+ 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xFF, 0xF8, 0xFF, 0xFF, 0x1F, 0xFF,
+ 0xE3, 0xFF, 0xFC, 0x00, 0x00, 0x7C, 0x03, 0xF0, 0x1F, 0xC0, 0xFE, 0x03,
+ 0xE0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01,
+ 0xE0, 0x0F, 0x80, 0x3C, 0x01, 0xF0, 0x1F, 0x80, 0x70, 0x01, 0xF8, 0x01,
+ 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00,
+ 0xF0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xFC, 0x07, 0xE0, 0x0F, 0x80,
+ 0x1E, 0x00, 0x03, 0x81, 0xC0, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0C, 0x0E,
+ 0x07, 0x03, 0x81, 0xC0, 0xC0, 0xE0, 0x70, 0x38, 0x18, 0x1C, 0x0E, 0x07,
+ 0x03, 0x81, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x18, 0x1C, 0x0E, 0x07, 0x01,
+ 0x80, 0x80, 0x00, 0x00, 0x01, 0xE0, 0x07, 0xC0, 0x1F, 0x80, 0xFE, 0x00,
+ 0x78, 0x01, 0xE0, 0x07, 0x80, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00,
+ 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x7E, 0x00, 0x38, 0x07, 0xE0,
+ 0x3E, 0x00, 0xF0, 0x07, 0xC0, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80,
+ 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x1F, 0x01, 0xF8, 0x0F, 0xE0, 0x3F, 0x00,
+ 0xF8, 0x00, 0x0F, 0x00, 0x1F, 0xC1, 0xDF, 0xF0, 0xEE, 0x3F, 0xE6, 0x07,
+ 0xF0, 0x01, 0xE0 };
+
+const GFXglyph FreeSansBoldOblique18pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 10, 0, 1 }, // 0x20 ' '
+ { 0, 10, 25, 12, 4, -24 }, // 0x21 '!'
+ { 32, 13, 9, 17, 6, -25 }, // 0x22 '"'
+ { 47, 22, 24, 19, 1, -23 }, // 0x23 '#'
+ { 113, 19, 31, 19, 2, -26 }, // 0x24 '$'
+ { 187, 26, 26, 31, 5, -25 }, // 0x25 '%'
+ { 272, 21, 25, 25, 3, -24 }, // 0x26 '&'
+ { 338, 5, 9, 8, 6, -25 }, // 0x27 '''
+ { 344, 13, 33, 12, 3, -25 }, // 0x28 '('
+ { 398, 13, 33, 12, -1, -25 }, // 0x29 ')'
+ { 452, 12, 11, 14, 5, -25 }, // 0x2A '*'
+ { 469, 18, 16, 20, 3, -15 }, // 0x2B '+'
+ { 505, 7, 11, 10, 1, -4 }, // 0x2C ','
+ { 515, 10, 4, 12, 2, -10 }, // 0x2D '-'
+ { 520, 6, 5, 10, 2, -4 }, // 0x2E '.'
+ { 524, 15, 25, 10, 0, -24 }, // 0x2F '/'
+ { 571, 18, 25, 19, 3, -24 }, // 0x30 '0'
+ { 628, 13, 25, 19, 6, -24 }, // 0x31 '1'
+ { 669, 21, 25, 19, 1, -24 }, // 0x32 '2'
+ { 735, 20, 25, 19, 2, -24 }, // 0x33 '3'
+ { 798, 19, 25, 19, 2, -24 }, // 0x34 '4'
+ { 858, 20, 24, 19, 2, -23 }, // 0x35 '5'
+ { 918, 19, 25, 19, 3, -24 }, // 0x36 '6'
+ { 978, 19, 24, 19, 5, -23 }, // 0x37 '7'
+ { 1035, 20, 25, 19, 2, -24 }, // 0x38 '8'
+ { 1098, 19, 25, 19, 2, -24 }, // 0x39 '9'
+ { 1158, 9, 18, 12, 4, -17 }, // 0x3A ':'
+ { 1179, 10, 24, 12, 3, -17 }, // 0x3B ';'
+ { 1209, 19, 17, 20, 3, -16 }, // 0x3C '<'
+ { 1250, 20, 12, 20, 2, -13 }, // 0x3D '='
+ { 1280, 19, 17, 20, 1, -15 }, // 0x3E '>'
+ { 1321, 18, 26, 21, 6, -25 }, // 0x3F '?'
+ { 1380, 33, 31, 34, 3, -25 }, // 0x40 '@'
+ { 1508, 23, 26, 25, 1, -25 }, // 0x41 'A'
+ { 1583, 24, 26, 25, 3, -25 }, // 0x42 'B'
+ { 1661, 24, 26, 25, 4, -25 }, // 0x43 'C'
+ { 1739, 24, 26, 25, 3, -25 }, // 0x44 'D'
+ { 1817, 24, 26, 23, 3, -25 }, // 0x45 'E'
+ { 1895, 23, 26, 21, 3, -25 }, // 0x46 'F'
+ { 1970, 24, 26, 27, 4, -25 }, // 0x47 'G'
+ { 2048, 26, 26, 25, 2, -25 }, // 0x48 'H'
+ { 2133, 10, 26, 10, 2, -25 }, // 0x49 'I'
+ { 2166, 20, 26, 19, 2, -25 }, // 0x4A 'J'
+ { 2231, 26, 26, 25, 3, -25 }, // 0x4B 'K'
+ { 2316, 18, 26, 21, 3, -25 }, // 0x4C 'L'
+ { 2375, 31, 26, 29, 2, -25 }, // 0x4D 'M'
+ { 2476, 27, 26, 25, 2, -25 }, // 0x4E 'N'
+ { 2564, 25, 26, 27, 4, -25 }, // 0x4F 'O'
+ { 2646, 23, 26, 23, 3, -25 }, // 0x50 'P'
+ { 2721, 25, 27, 27, 4, -25 }, // 0x51 'Q'
+ { 2806, 24, 26, 25, 3, -25 }, // 0x52 'R'
+ { 2884, 22, 26, 23, 3, -25 }, // 0x53 'S'
+ { 2956, 21, 26, 21, 5, -25 }, // 0x54 'T'
+ { 3025, 24, 26, 25, 4, -25 }, // 0x55 'U'
+ { 3103, 22, 26, 23, 6, -25 }, // 0x56 'V'
+ { 3175, 32, 26, 33, 6, -25 }, // 0x57 'W'
+ { 3279, 27, 26, 23, 1, -25 }, // 0x58 'X'
+ { 3367, 22, 26, 23, 6, -25 }, // 0x59 'Y'
+ { 3439, 25, 26, 21, 1, -25 }, // 0x5A 'Z'
+ { 3521, 15, 33, 12, 1, -25 }, // 0x5B '['
+ { 3583, 5, 25, 10, 5, -24 }, // 0x5C '\'
+ { 3599, 15, 33, 12, -1, -25 }, // 0x5D ']'
+ { 3661, 16, 15, 20, 4, -23 }, // 0x5E '^'
+ { 3691, 21, 3, 19, -2, 5 }, // 0x5F '_'
+ { 3699, 5, 5, 12, 6, -25 }, // 0x60 '`'
+ { 3703, 18, 19, 19, 2, -18 }, // 0x61 'a'
+ { 3746, 20, 26, 21, 2, -25 }, // 0x62 'b'
+ { 3811, 18, 19, 19, 3, -18 }, // 0x63 'c'
+ { 3854, 22, 26, 21, 3, -25 }, // 0x64 'd'
+ { 3926, 19, 19, 19, 2, -18 }, // 0x65 'e'
+ { 3972, 13, 26, 12, 3, -25 }, // 0x66 'f'
+ { 4015, 22, 27, 21, 1, -18 }, // 0x67 'g'
+ { 4090, 20, 26, 21, 2, -25 }, // 0x68 'h'
+ { 4155, 10, 26, 10, 2, -25 }, // 0x69 'i'
+ { 4188, 15, 34, 10, -2, -25 }, // 0x6A 'j'
+ { 4252, 21, 26, 19, 2, -25 }, // 0x6B 'k'
+ { 4321, 10, 26, 10, 2, -25 }, // 0x6C 'l'
+ { 4354, 30, 19, 31, 2, -18 }, // 0x6D 'm'
+ { 4426, 20, 19, 21, 2, -18 }, // 0x6E 'n'
+ { 4474, 19, 19, 21, 3, -18 }, // 0x6F 'o'
+ { 4520, 22, 27, 21, 0, -18 }, // 0x70 'p'
+ { 4595, 20, 27, 21, 3, -18 }, // 0x71 'q'
+ { 4663, 15, 19, 14, 2, -18 }, // 0x72 'r'
+ { 4699, 18, 19, 19, 2, -18 }, // 0x73 's'
+ { 4742, 11, 23, 12, 4, -22 }, // 0x74 't'
+ { 4774, 20, 19, 21, 3, -18 }, // 0x75 'u'
+ { 4822, 18, 19, 19, 5, -18 }, // 0x76 'v'
+ { 4865, 27, 19, 27, 4, -18 }, // 0x77 'w'
+ { 4930, 22, 19, 19, 1, -18 }, // 0x78 'x'
+ { 4983, 22, 27, 19, 1, -18 }, // 0x79 'y'
+ { 5058, 19, 19, 17, 1, -18 }, // 0x7A 'z'
+ { 5104, 14, 33, 14, 2, -25 }, // 0x7B '{'
+ { 5162, 9, 33, 10, 2, -25 }, // 0x7C '|'
+ { 5200, 14, 33, 14, 2, -25 }, // 0x7D '}'
+ { 5258, 17, 6, 20, 3, -10 } }; // 0x7E '~'
+
+const GFXfont FreeSansBoldOblique18pt7b PROGMEM = {
+ (uint8_t *)FreeSansBoldOblique18pt7bBitmaps,
+ (GFXglyph *)FreeSansBoldOblique18pt7bGlyphs,
+ 0x20, 0x7E, 42 };
+
+// Approx. 5943 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBoldOblique24pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBoldOblique24pt7b.h
new file mode 100644
index 000000000000..ea65f9b8d210
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBoldOblique24pt7b.h
@@ -0,0 +1,893 @@
+const uint8_t FreeSansBoldOblique24pt7bBitmaps[] PROGMEM = {
+ 0x01, 0xE0, 0x07, 0xF0, 0x1F, 0xC0, 0xFF, 0x03, 0xF8, 0x0F, 0xE0, 0x3F,
+ 0x80, 0xFE, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xE0, 0x1F,
+ 0x80, 0x7E, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0xF8, 0x03, 0xE0, 0x0F,
+ 0x80, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x1F,
+ 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0xFE, 0x03, 0xF8, 0x00,
+ 0x7E, 0x0F, 0xDF, 0x83, 0xF7, 0xE0, 0xFF, 0xF0, 0x7E, 0xFC, 0x1F, 0xBF,
+ 0x07, 0xEF, 0xC1, 0xFB, 0xE0, 0x7C, 0xF8, 0x1F, 0x3C, 0x07, 0x8F, 0x01,
+ 0xE3, 0x80, 0x70, 0x00, 0x07, 0xC1, 0xF0, 0x00, 0x3E, 0x0F, 0x80, 0x03,
+ 0xE0, 0xF8, 0x00, 0x1F, 0x07, 0xC0, 0x01, 0xF0, 0x7C, 0x00, 0x0F, 0x83,
+ 0xE0, 0x00, 0xF8, 0x3E, 0x00, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF8,
+ 0x7F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xE0, 0x0F,
+ 0x83, 0xE0, 0x00, 0x7C, 0x3E, 0x00, 0x07, 0xC1, 0xF0, 0x00, 0x3E, 0x0F,
+ 0x80, 0x03, 0xE0, 0xF8, 0x00, 0x1F, 0x07, 0xC0, 0x00, 0xF8, 0x7C, 0x00,
+ 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFF, 0x83, 0xFF,
+ 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xE0, 0x1F, 0x07, 0xC0, 0x00, 0xF8, 0x3E,
+ 0x00, 0x0F, 0x83, 0xE0, 0x00, 0x7C, 0x1F, 0x00, 0x07, 0xC1, 0xF0, 0x00,
+ 0x3E, 0x0F, 0x80, 0x01, 0xF0, 0xF8, 0x00, 0x1F, 0x07, 0xC0, 0x00, 0xF8,
+ 0x3C, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0E,
+ 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x3F, 0xFF, 0xE0, 0x1F,
+ 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0x07, 0xF3, 0x9F, 0xC1, 0xF8, 0xE3, 0xF0,
+ 0x7C, 0x38, 0xFC, 0x3F, 0x0E, 0x3F, 0x0F, 0xC7, 0x8F, 0xC3, 0xF1, 0xC0,
+ 0x00, 0xFE, 0x70, 0x00, 0x3F, 0xDC, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF,
+ 0xE0, 0x00, 0x3F, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, 0x00,
+ 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x77, 0xF8, 0x00, 0x1C, 0xFE,
+ 0x00, 0x07, 0x3F, 0x8F, 0xE3, 0xCF, 0xE3, 0xF8, 0xE3, 0xF8, 0xFE, 0x38,
+ 0xFC, 0x3F, 0x8E, 0x7F, 0x0F, 0xF3, 0x9F, 0xC3, 0xFD, 0xFF, 0xE0, 0x7F,
+ 0xFF, 0xF0, 0x1F, 0xFF, 0xFC, 0x03, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00,
+ 0x03, 0xFC, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x03, 0x80,
+ 0x00, 0x01, 0xE0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x07,
+ 0x80, 0x7F, 0xE0, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0x1E, 0x01, 0xFF, 0xF0,
+ 0x01, 0xC0, 0x3F, 0xFF, 0x80, 0x3C, 0x07, 0xE1, 0xF8, 0x07, 0x80, 0x78,
+ 0x07, 0x80, 0xF0, 0x0F, 0x80, 0x78, 0x0E, 0x00, 0xF0, 0x07, 0x81, 0xC0,
+ 0x0F, 0x00, 0xF8, 0x3C, 0x00, 0xF0, 0x0F, 0x07, 0x80, 0x0F, 0xC3, 0xF0,
+ 0xF0, 0x00, 0xFF, 0xFE, 0x0E, 0x00, 0x07, 0xFF, 0xC1, 0xE0, 0x00, 0x7F,
+ 0xF8, 0x3C, 0x00, 0x03, 0xFF, 0x07, 0x80, 0x00, 0x0F, 0xC0, 0x70, 0x00,
+ 0x00, 0x00, 0x0E, 0x03, 0xF0, 0x00, 0x01, 0xE0, 0xFF, 0xC0, 0x00, 0x3C,
+ 0x1F, 0xFE, 0x00, 0x03, 0x83, 0xFF, 0xE0, 0x00, 0x70, 0x7F, 0xFF, 0x00,
+ 0x0F, 0x0F, 0xC3, 0xF0, 0x01, 0xE0, 0xF0, 0x0F, 0x00, 0x3C, 0x1F, 0x00,
+ 0xF0, 0x03, 0x81, 0xE0, 0x0F, 0x00, 0x78, 0x1E, 0x01, 0xF0, 0x0F, 0x01,
+ 0xE0, 0x1E, 0x01, 0xE0, 0x1F, 0x87, 0xE0, 0x1C, 0x01, 0xFF, 0xFC, 0x03,
+ 0x80, 0x0F, 0xFF, 0x80, 0x78, 0x00, 0xFF, 0xF0, 0x0F, 0x00, 0x07, 0xFE,
+ 0x01, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3F, 0xF0,
+ 0x00, 0x07, 0xFF, 0xC0, 0x00, 0x7F, 0xFF, 0x00, 0x03, 0xFF, 0xF8, 0x00,
+ 0x3F, 0x9F, 0xC0, 0x03, 0xF8, 0x7E, 0x00, 0x1F, 0xC3, 0xF0, 0x00, 0xFE,
+ 0x1F, 0x00, 0x07, 0xF1, 0xF8, 0x00, 0x3F, 0xCF, 0xC0, 0x01, 0xFE, 0xFC,
+ 0x00, 0x07, 0xFF, 0xC0, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0xFF, 0xC0, 0x00,
+ 0x07, 0xF8, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x1F, 0xFF, 0x07, 0xC1, 0xFF,
+ 0xF8, 0x3E, 0x3F, 0xFF, 0xE3, 0xE3, 0xFE, 0x3F, 0x1F, 0x1F, 0xC1, 0xFD,
+ 0xF1, 0xFC, 0x07, 0xFF, 0x8F, 0xC0, 0x3F, 0xF8, 0xFE, 0x00, 0xFF, 0xC7,
+ 0xF0, 0x07, 0xFC, 0x3F, 0x80, 0x1F, 0xC1, 0xFC, 0x00, 0xFE, 0x0F, 0xF0,
+ 0x1F, 0xF8, 0x7F, 0xC1, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF,
+ 0xFC, 0x3F, 0xFF, 0xCF, 0xE0, 0x7F, 0xF8, 0x7F, 0x80, 0xFF, 0x00, 0x00,
+ 0x7E, 0xFD, 0xFF, 0xEF, 0xDF, 0xBF, 0x7C, 0xF9, 0xE3, 0xC7, 0x00, 0x00,
+ 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0xC0, 0x07, 0xC0, 0x07, 0xC0,
+ 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xF0, 0x01, 0xF0, 0x01, 0xF8,
+ 0x00, 0xF8, 0x00, 0xFC, 0x00, 0x7C, 0x00, 0x7E, 0x00, 0x3E, 0x00, 0x1F,
+ 0x00, 0x1F, 0x80, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x03, 0xF0, 0x01,
+ 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80,
+ 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x1E,
+ 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0x7C, 0x00,
+ 0x3E, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00,
+ 0x1E, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x7C,
+ 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x03, 0xE0, 0x01, 0xF0, 0x00,
+ 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0,
+ 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E,
+ 0x00, 0x1F, 0x00, 0x1F, 0x80, 0x0F, 0x80, 0x07, 0xC0, 0x07, 0xE0, 0x03,
+ 0xE0, 0x03, 0xF0, 0x01, 0xF0, 0x01, 0xF8, 0x00, 0xF8, 0x00, 0xFC, 0x00,
+ 0x7C, 0x00, 0x7C, 0x00, 0x7E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3F, 0x00,
+ 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xE0, 0x03, 0x80, 0x07,
+ 0x00, 0x0E, 0x07, 0x3C, 0x6F, 0xFF, 0xFF, 0xFF, 0xBF, 0xFE, 0x0F, 0xE0,
+ 0x1F, 0xC0, 0x7F, 0x81, 0xEF, 0x87, 0x8F, 0x0E, 0x1E, 0x08, 0x10, 0x00,
+ 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x00,
+ 0x00, 0x1F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00,
+ 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFE,
+ 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00,
+ 0x00, 0xFC, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF8, 0x00,
+ 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0xC7, 0xF1, 0xF8, 0xFE, 0x3F,
+ 0x8F, 0xE0, 0x38, 0x1C, 0x07, 0x03, 0xC0, 0xE0, 0xF0, 0xFC, 0x3C, 0x0C,
+ 0x00, 0x7F, 0xFD, 0xFF, 0xF7, 0xFF, 0x9F, 0xFE, 0xFF, 0xFB, 0xFF, 0xE0,
+ 0x7F, 0x7F, 0x7F, 0x7E, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x70, 0x00, 0x0E,
+ 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x03,
+ 0x80, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x01,
+ 0xC0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00,
+ 0x70, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00,
+ 0x38, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00,
+ 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00,
+ 0x07, 0x00, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00,
+ 0x1F, 0xFC, 0x00, 0x3F, 0xFF, 0x80, 0x3F, 0xFF, 0xC0, 0x3F, 0xFF, 0xF0,
+ 0x1F, 0xC7, 0xF8, 0x1F, 0xC1, 0xFE, 0x1F, 0xC0, 0x7F, 0x0F, 0xC0, 0x3F,
+ 0x8F, 0xE0, 0x1F, 0xC7, 0xF0, 0x0F, 0xE3, 0xF0, 0x07, 0xF3, 0xF8, 0x03,
+ 0xF9, 0xFC, 0x01, 0xFC, 0xFC, 0x01, 0xFE, 0xFE, 0x00, 0xFE, 0x7F, 0x00,
+ 0x7F, 0x3F, 0x80, 0x3F, 0x9F, 0xC0, 0x1F, 0xCF, 0xE0, 0x1F, 0xEF, 0xE0,
+ 0x0F, 0xE7, 0xF0, 0x07, 0xF3, 0xF8, 0x03, 0xF9, 0xFC, 0x03, 0xF8, 0xFE,
+ 0x01, 0xFC, 0x7F, 0x00, 0xFE, 0x3F, 0x80, 0xFE, 0x1F, 0xE0, 0x7F, 0x0F,
+ 0xF8, 0xFF, 0x03, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0x80,
+ 0x1F, 0xFF, 0x00, 0x07, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x0F,
+ 0x80, 0x0F, 0x80, 0x07, 0xC0, 0x07, 0xE0, 0x0F, 0xF0, 0x3F, 0xF9, 0xFF,
+ 0xF8, 0xFF, 0xFC, 0xFF, 0xFE, 0x7F, 0xFF, 0x00, 0x3F, 0x80, 0x1F, 0x80,
+ 0x0F, 0xC0, 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xF8, 0x01, 0xFC,
+ 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x00, 0x1F, 0x80, 0x1F, 0xC0, 0x0F,
+ 0xE0, 0x07, 0xF0, 0x03, 0xF0, 0x01, 0xF8, 0x01, 0xFC, 0x00, 0xFE, 0x00,
+ 0x7F, 0x00, 0x3F, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x00, 0x00, 0x01, 0xFE,
+ 0x00, 0x00, 0x7F, 0xFC, 0x00, 0x0F, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0xE0,
+ 0x0F, 0xFF, 0xFF, 0x00, 0xFF, 0x07, 0xFC, 0x07, 0xF0, 0x1F, 0xE0, 0x7F,
+ 0x00, 0x7F, 0x03, 0xF0, 0x03, 0xF8, 0x1F, 0x80, 0x1F, 0xC1, 0xF8, 0x00,
+ 0xFE, 0x0F, 0xC0, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07, 0xF0,
+ 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x7F, 0x80, 0x00,
+ 0x07, 0xF8, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x1F, 0xF8, 0x00, 0x01, 0xFF,
+ 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x7F, 0xC0, 0x00,
+ 0x07, 0xFC, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x7F,
+ 0x80, 0x00, 0x03, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0x81, 0xFF, 0xFF,
+ 0xFC, 0x1F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xF0,
+ 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x0F, 0xFF, 0x80, 0x0F, 0xFF, 0xF0, 0x07,
+ 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xC0, 0xFE, 0x1F, 0xF0, 0x7F, 0x01, 0xFC,
+ 0x1F, 0x80, 0x7F, 0x07, 0xE0, 0x1F, 0xC3, 0xF0, 0x07, 0xF0, 0xFC, 0x01,
+ 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x80, 0x01,
+ 0xFF, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x07, 0xFF, 0x80,
+ 0x01, 0xFF, 0xE0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F,
+ 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7F, 0x3F, 0x80,
+ 0x3F, 0xCF, 0xE0, 0x0F, 0xE3, 0xF8, 0x07, 0xF8, 0xFF, 0x83, 0xFC, 0x3F,
+ 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xE0,
+ 0x03, 0xFF, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00,
+ 0x7F, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xF0, 0x00,
+ 0x3F, 0xF8, 0x00, 0x3D, 0xFC, 0x00, 0x3C, 0xFE, 0x00, 0x3E, 0x7E, 0x00,
+ 0x3E, 0x7F, 0x00, 0x1E, 0x3F, 0x80, 0x1E, 0x1F, 0xC0, 0x1E, 0x0F, 0xC0,
+ 0x1F, 0x07, 0xE0, 0x1F, 0x07, 0xF0, 0x1F, 0x03, 0xF8, 0x1F, 0x01, 0xFC,
+ 0x0F, 0x80, 0xFC, 0x0F, 0x80, 0xFE, 0x0F, 0x80, 0x7F, 0x07, 0xFF, 0xFF,
+ 0xF7, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF,
+ 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00,
+ 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x80, 0x00,
+ 0x7F, 0xFF, 0xE0, 0x0F, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0x80, 0x7F, 0xFF,
+ 0xF0, 0x0F, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x80, 0x7C, 0x00, 0x00, 0x0F,
+ 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80, 0x00,
+ 0x03, 0xE3, 0xF0, 0x00, 0x7F, 0xFF, 0x80, 0x1F, 0xFF, 0xF8, 0x03, 0xFF,
+ 0xFF, 0x80, 0x7F, 0xFF, 0xF0, 0x1F, 0xE1, 0xFF, 0x03, 0xF0, 0x1F, 0xE0,
+ 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00,
+ 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xF0, 0xFE, 0x00, 0xFE, 0x1F,
+ 0xC0, 0x3F, 0x83, 0xF8, 0x07, 0xF0, 0x7F, 0x83, 0xFC, 0x0F, 0xFF, 0xFF,
+ 0x80, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xF8, 0x01, 0xFF, 0xFE, 0x00, 0x0F,
+ 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xFE,
+ 0x00, 0x1F, 0xFF, 0x80, 0x1F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF8, 0x1F, 0xC3,
+ 0xFC, 0x1F, 0x80, 0xFE, 0x0F, 0xC0, 0x3F, 0x0F, 0xC0, 0x00, 0x07, 0xE0,
+ 0x00, 0x07, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF8, 0xFC, 0x01, 0xF9,
+ 0xFF, 0x80, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFC, 0x3F,
+ 0xE1, 0xFF, 0x1F, 0xE0, 0x7F, 0x8F, 0xE0, 0x1F, 0xCF, 0xE0, 0x0F, 0xE7,
+ 0xF0, 0x07, 0xF3, 0xF0, 0x03, 0xF9, 0xF8, 0x01, 0xF8, 0xFC, 0x01, 0xFC,
+ 0x7E, 0x00, 0xFE, 0x3F, 0x00, 0xFE, 0x1F, 0xC0, 0xFF, 0x0F, 0xF0, 0xFF,
+ 0x03, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x1F, 0xFF,
+ 0x80, 0x07, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xCF,
+ 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF,
+ 0x9F, 0xFF, 0xFF, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01,
+ 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00,
+ 0x1F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x01, 0xF8, 0x00,
+ 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xE0,
+ 0x00, 0x03, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F,
+ 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x00,
+ 0xFE, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xF0, 0x00,
+ 0x01, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00,
+ 0x0F, 0xFF, 0x80, 0x07, 0xFF, 0xF0, 0x03, 0xFF, 0xFE, 0x01, 0xFF, 0xFF,
+ 0xC0, 0xFE, 0x0F, 0xF0, 0x3E, 0x01, 0xFC, 0x1F, 0x80, 0x3F, 0x07, 0xC0,
+ 0x0F, 0xC1, 0xF0, 0x03, 0xF0, 0x7C, 0x01, 0xF8, 0x1F, 0x00, 0xFC, 0x03,
+ 0xF0, 0x7F, 0x00, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0,
+ 0x07, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x81, 0xFE, 0x1F, 0xE0, 0xFE, 0x03,
+ 0xFC, 0x3F, 0x00, 0x7F, 0x1F, 0xC0, 0x1F, 0xC7, 0xE0, 0x07, 0xF3, 0xF8,
+ 0x01, 0xFC, 0xFE, 0x00, 0x7F, 0x3F, 0x80, 0x3F, 0x8F, 0xE0, 0x0F, 0xE3,
+ 0xFC, 0x07, 0xF0, 0xFF, 0x87, 0xFC, 0x3F, 0xFF, 0xFE, 0x07, 0xFF, 0xFF,
+ 0x00, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xC0, 0x03, 0xFF, 0xE0, 0x00, 0x3F,
+ 0xC0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x3F, 0xFF, 0x00,
+ 0x3F, 0xFF, 0xC0, 0x3F, 0xFF, 0xF0, 0x3F, 0xC3, 0xF8, 0x3F, 0xC0, 0xFE,
+ 0x1F, 0xC0, 0x3F, 0x1F, 0xC0, 0x1F, 0x8F, 0xE0, 0x0F, 0xC7, 0xE0, 0x07,
+ 0xE7, 0xF0, 0x03, 0xF3, 0xF8, 0x01, 0xF9, 0xFC, 0x01, 0xFC, 0xFE, 0x00,
+ 0xFE, 0x7F, 0x00, 0xFE, 0x3F, 0xC0, 0xFF, 0x1F, 0xF0, 0xFF, 0x87, 0xFF,
+ 0xFF, 0xC3, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xE0, 0x3F, 0xF3, 0xF0, 0x07,
+ 0xE3, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00,
+ 0x00, 0x7E, 0x1F, 0xC0, 0x7E, 0x0F, 0xF0, 0xFF, 0x07, 0xFF, 0xFF, 0x01,
+ 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x0F, 0xFF, 0x00,
+ 0x01, 0xFC, 0x00, 0x00, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7E, 0x0F, 0xE0,
+ 0xFE, 0x0F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x07, 0xF0, 0x7F, 0x07,
+ 0xE0, 0xFE, 0x0F, 0xE0, 0xFE, 0x00, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0,
+ 0x7E, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0,
+ 0x03, 0x80, 0x1C, 0x00, 0x70, 0x03, 0xC0, 0x0E, 0x00, 0xF0, 0x0F, 0xC0,
+ 0x3C, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xE0, 0x00,
+ 0x01, 0xF8, 0x00, 0x03, 0xFE, 0x00, 0x07, 0xFF, 0x80, 0x0F, 0xFF, 0xE0,
+ 0x1F, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80,
+ 0x0F, 0xFF, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x3F, 0xFE,
+ 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xF8, 0x00,
+ 0x7F, 0xFF, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x3F, 0xF0, 0x00, 0x01, 0xF8,
+ 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x80, 0x1F, 0xFF, 0xFF, 0xC7, 0xFF,
+ 0xFF, 0xF1, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x8F,
+ 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF,
+ 0xFF, 0x1F, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xF8, 0xFF,
+ 0xFF, 0xFE, 0x3F, 0xFF, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x01, 0xE0, 0x00,
+ 0x00, 0x7E, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x0F, 0xFF, 0x00, 0x03, 0xFF,
+ 0xF8, 0x00, 0x7F, 0xFF, 0x80, 0x07, 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0xC0,
+ 0x01, 0xFF, 0xF0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x03, 0xFF,
+ 0xC0, 0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0x3F, 0xFF,
+ 0xE0, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0x80, 0x01, 0xFF, 0x00, 0x00, 0x7E,
+ 0x00, 0x00, 0x1C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80,
+ 0x01, 0xFF, 0xF0, 0x07, 0xFF, 0xF8, 0x0F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFE,
+ 0x1F, 0xFF, 0xFE, 0x3F, 0xC1, 0xFF, 0x3F, 0x80, 0xFF, 0x7F, 0x00, 0x7F,
+ 0x7E, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0x00, 0x00, 0xFE,
+ 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x0F, 0xF8,
+ 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFE, 0x00,
+ 0x01, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xE0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00,
+ 0x0F, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00,
+ 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00,
+ 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x80, 0x00,
+ 0x01, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x3F, 0xE0, 0x1F, 0xF8, 0x00, 0x07,
+ 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x07, 0xE0,
+ 0x00, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x00, 0x03, 0xF0, 0x0F, 0xC0, 0x00,
+ 0x00, 0x0F, 0x80, 0xFC, 0x00, 0x00, 0x00, 0x3E, 0x07, 0xC0, 0x03, 0xF1,
+ 0xF1, 0xF0, 0x7C, 0x00, 0xFF, 0xCF, 0x07, 0x87, 0xE0, 0x1F, 0xFF, 0xF8,
+ 0x3C, 0x7E, 0x01, 0xF8, 0x7F, 0x81, 0xE3, 0xE0, 0x1F, 0x01, 0xF8, 0x0F,
+ 0x3E, 0x01, 0xF0, 0x0F, 0xC0, 0x79, 0xF0, 0x1F, 0x00, 0x7C, 0x03, 0xDF,
+ 0x00, 0xF0, 0x03, 0xE0, 0x1C, 0xF8, 0x0F, 0x80, 0x1E, 0x01, 0xE7, 0xC0,
+ 0x78, 0x00, 0xF0, 0x0F, 0x3C, 0x07, 0xC0, 0x0F, 0x00, 0xF3, 0xE0, 0x3C,
+ 0x00, 0x78, 0x07, 0x9F, 0x03, 0xE0, 0x07, 0x80, 0x78, 0xF8, 0x1F, 0x00,
+ 0x7C, 0x07, 0xC7, 0xC0, 0xF8, 0x07, 0xC0, 0x7C, 0x3E, 0x07, 0xC0, 0x7E,
+ 0x07, 0xC1, 0xF0, 0x3F, 0x07, 0xF8, 0xFC, 0x0F, 0x81, 0xFF, 0xFF, 0xFF,
+ 0xC0, 0x7E, 0x07, 0xFF, 0xBF, 0xFC, 0x01, 0xF0, 0x1F, 0xF8, 0xFF, 0x80,
+ 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0xFC, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F,
+ 0xE0, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xE0, 0x03, 0x80, 0x00, 0x01, 0xFF,
+ 0xFF, 0xFE, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0xFF,
+ 0xFE, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
+ 0xF0, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x7F,
+ 0xF0, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0xFF,
+ 0xF0, 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x03, 0xFB,
+ 0xF8, 0x00, 0x07, 0xF3, 0xF8, 0x00, 0x07, 0xE3, 0xF8, 0x00, 0x0F, 0xE3,
+ 0xF8, 0x00, 0x0F, 0xC3, 0xF8, 0x00, 0x1F, 0xC3, 0xF8, 0x00, 0x1F, 0x83,
+ 0xF8, 0x00, 0x3F, 0x81, 0xFC, 0x00, 0x7F, 0x01, 0xFC, 0x00, 0x7F, 0x01,
+ 0xFC, 0x00, 0xFE, 0x01, 0xFC, 0x00, 0xFC, 0x01, 0xFC, 0x01, 0xFF, 0xFF,
+ 0xFC, 0x01, 0xFF, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xFF,
+ 0xFE, 0x07, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFE, 0x0F, 0xE0, 0x00,
+ 0xFE, 0x1F, 0xC0, 0x00, 0xFE, 0x1F, 0xC0, 0x00, 0xFE, 0x3F, 0x80, 0x00,
+ 0xFE, 0x3F, 0x80, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00,
+ 0x7F, 0x01, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0xF8, 0x01, 0xFF, 0xFF,
+ 0xFC, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF,
+ 0xFF, 0x03, 0xF8, 0x00, 0xFF, 0x03, 0xF8, 0x00, 0x7F, 0x07, 0xF0, 0x00,
+ 0x7F, 0x07, 0xF0, 0x00, 0x7F, 0x07, 0xF0, 0x00, 0x7E, 0x07, 0xF0, 0x00,
+ 0xFE, 0x0F, 0xF0, 0x03, 0xFC, 0x0F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF,
+ 0xF0, 0x0F, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF,
+ 0xF8, 0x1F, 0xFF, 0xFF, 0xF8, 0x1F, 0xC0, 0x07, 0xFC, 0x1F, 0xC0, 0x01,
+ 0xFC, 0x1F, 0xC0, 0x01, 0xFC, 0x3F, 0x80, 0x01, 0xFC, 0x3F, 0x80, 0x01,
+ 0xFC, 0x3F, 0x80, 0x01, 0xFC, 0x3F, 0x80, 0x03, 0xF8, 0x7F, 0x00, 0x07,
+ 0xF8, 0x7F, 0x00, 0x0F, 0xF0, 0x7F, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFF,
+ 0xE0, 0x7F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFE,
+ 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x07, 0xFF,
+ 0xE0, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xF8, 0x00, 0xFF, 0xFF,
+ 0xFC, 0x01, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0x03, 0xFE, 0x07, 0xFC, 0x01,
+ 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F, 0xE0, 0x00, 0x7F, 0x1F, 0xE0, 0x00,
+ 0x7F, 0x1F, 0xC0, 0x00, 0x7F, 0x3F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00,
+ 0x00, 0x7F, 0x80, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00,
+ 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00,
+ 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00,
+ 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xF8, 0xFE, 0x00, 0x03,
+ 0xF8, 0xFF, 0x00, 0x07, 0xF8, 0xFF, 0x00, 0x07, 0xF0, 0x7F, 0x80, 0x1F,
+ 0xF0, 0x7F, 0xE0, 0x7F, 0xE0, 0x3F, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xFF,
+ 0x80, 0x1F, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xFE, 0x00, 0x03, 0xFF, 0xF8,
+ 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF,
+ 0xE0, 0x03, 0xFF, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0xFC, 0x03, 0xFF, 0xFF,
+ 0xFC, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xF8, 0x03, 0xFE, 0x07, 0xF0, 0x01,
+ 0xFF, 0x07, 0xF0, 0x00, 0xFF, 0x07, 0xF0, 0x00, 0x7F, 0x07, 0xF0, 0x00,
+ 0x7F, 0x0F, 0xF0, 0x00, 0x7F, 0x0F, 0xE0, 0x00, 0x7F, 0x0F, 0xE0, 0x00,
+ 0x7F, 0x0F, 0xE0, 0x00, 0x7F, 0x0F, 0xE0, 0x00, 0x7F, 0x1F, 0xC0, 0x00,
+ 0x7F, 0x1F, 0xC0, 0x00, 0xFE, 0x1F, 0xC0, 0x00, 0xFE, 0x1F, 0xC0, 0x00,
+ 0xFE, 0x1F, 0xC0, 0x01, 0xFE, 0x3F, 0x80, 0x01, 0xFC, 0x3F, 0x80, 0x01,
+ 0xFC, 0x3F, 0x80, 0x03, 0xF8, 0x3F, 0x80, 0x07, 0xF8, 0x7F, 0x00, 0x0F,
+ 0xF0, 0x7F, 0x00, 0x1F, 0xF0, 0x7F, 0x00, 0x7F, 0xE0, 0x7F, 0xFF, 0xFF,
+ 0xC0, 0x7F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFE,
+ 0x00, 0xFF, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xFF,
+ 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF,
+ 0xFE, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xF8, 0x00,
+ 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xF0, 0x00,
+ 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00,
+ 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF,
+ 0xE0, 0x1F, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF,
+ 0xE0, 0x1F, 0xC0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00,
+ 0x00, 0x3F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00,
+ 0x00, 0x3F, 0x80, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00,
+ 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF,
+ 0xC0, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF,
+ 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0xFF,
+ 0xFE, 0x01, 0xFF, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xFE, 0x01, 0xFF, 0xFF,
+ 0xFE, 0x03, 0xF8, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x03, 0xF8, 0x00,
+ 0x00, 0x03, 0xF8, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x07, 0xF0, 0x00,
+ 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF,
+ 0xE0, 0x0F, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF,
+ 0xC0, 0x0F, 0xFF, 0xFF, 0xC0, 0x0F, 0xE0, 0x00, 0x00, 0x1F, 0xC0, 0x00,
+ 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x1F, 0xC0, 0x00,
+ 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00,
+ 0x00, 0x3F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x7F, 0x00, 0x00,
+ 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00,
+ 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x03, 0xFF,
+ 0xF8, 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xFF, 0x80, 0x0F, 0xFF,
+ 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFC, 0x07, 0xFC, 0x0F, 0xF8,
+ 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0x3F, 0x87, 0xF0, 0x00, 0x1F, 0xC7, 0xF0,
+ 0x00, 0x0F, 0xE3, 0xF8, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x01, 0xFC,
+ 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x7F,
+ 0x00, 0x3F, 0xFF, 0x3F, 0x00, 0x1F, 0xFF, 0xBF, 0x80, 0x0F, 0xFF, 0x9F,
+ 0xC0, 0x07, 0xFF, 0xCF, 0xE0, 0x03, 0xFF, 0xE7, 0xF0, 0x03, 0xFF, 0xF3,
+ 0xF8, 0x00, 0x01, 0xF9, 0xFC, 0x00, 0x01, 0xF8, 0xFF, 0x00, 0x00, 0xFC,
+ 0x7F, 0x80, 0x00, 0xFE, 0x3F, 0xC0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF,
+ 0x87, 0xFC, 0x00, 0xFF, 0x81, 0xFF, 0x81, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF,
+ 0xE0, 0x3F, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFE, 0xF8, 0x03, 0xFF, 0xFC,
+ 0x78, 0x00, 0x7F, 0xFC, 0x3C, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x01, 0xFC,
+ 0x00, 0x0F, 0xE0, 0x3F, 0x80, 0x01, 0xFC, 0x07, 0xF0, 0x00, 0x3F, 0x80,
+ 0xFE, 0x00, 0x0F, 0xE0, 0x1F, 0xC0, 0x01, 0xFC, 0x07, 0xF0, 0x00, 0x3F,
+ 0x80, 0xFE, 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x00, 0xFE, 0x03, 0xF8, 0x00,
+ 0x3F, 0x80, 0xFF, 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x00, 0xFE, 0x03, 0xF8,
+ 0x00, 0x1F, 0xC0, 0x7F, 0x00, 0x07, 0xF0, 0x0F, 0xFF, 0xFF, 0xFE, 0x03,
+ 0xFF, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xFF,
+ 0x01, 0xFF, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xFF, 0xF8, 0x0F, 0xE0, 0x00,
+ 0x7F, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x3F, 0x80, 0x01, 0xFC, 0x07, 0xF0,
+ 0x00, 0x7F, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x3F, 0x80, 0x01, 0xFC, 0x07,
+ 0xF0, 0x00, 0x3F, 0x80, 0xFE, 0x00, 0x0F, 0xE0, 0x1F, 0xC0, 0x01, 0xFC,
+ 0x07, 0xF0, 0x00, 0x3F, 0x80, 0xFE, 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x00,
+ 0xFE, 0x03, 0xF8, 0x00, 0x3F, 0x80, 0x7F, 0x00, 0x07, 0xF0, 0x1F, 0xC0,
+ 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x07, 0xF0, 0x3F, 0x80, 0xFE, 0x03, 0xF8,
+ 0x0F, 0xE0, 0x3F, 0x81, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC,
+ 0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x7F, 0x01, 0xFC,
+ 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE,
+ 0x03, 0xF8, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0xFE,
+ 0x03, 0xF8, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00,
+ 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80,
+ 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07,
+ 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xF0, 0x00,
+ 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7F,
+ 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00,
+ 0x0F, 0xE0, 0xFE, 0x03, 0xFC, 0x1F, 0xC0, 0x7F, 0x03, 0xF8, 0x0F, 0xE0,
+ 0xFE, 0x01, 0xFC, 0x1F, 0xC0, 0x3F, 0x83, 0xF8, 0x0F, 0xE0, 0x7F, 0x01,
+ 0xFC, 0x0F, 0xF0, 0xFF, 0x81, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xF8, 0x03,
+ 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0xFF, 0xE0, 0x00, 0x1F, 0xE0,
+ 0x00, 0x00, 0x00, 0xFE, 0x00, 0x0F, 0xF0, 0x0F, 0xF0, 0x00, 0xFF, 0x00,
+ 0x7F, 0x00, 0x1F, 0xF0, 0x03, 0xF8, 0x01, 0xFF, 0x00, 0x1F, 0xC0, 0x1F,
+ 0xE0, 0x00, 0xFE, 0x01, 0xFE, 0x00, 0x0F, 0xE0, 0x1F, 0xE0, 0x00, 0x7F,
+ 0x01, 0xFE, 0x00, 0x03, 0xF8, 0x1F, 0xE0, 0x00, 0x1F, 0xC1, 0xFE, 0x00,
+ 0x00, 0xFE, 0x1F, 0xE0, 0x00, 0x0F, 0xE3, 0xFE, 0x00, 0x00, 0x7F, 0x3F,
+ 0xC0, 0x00, 0x03, 0xFB, 0xFC, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x01,
+ 0xFF, 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xFF, 0xC0,
+ 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x01, 0xFF,
+ 0x9F, 0xE0, 0x00, 0x0F, 0xF8, 0xFF, 0x00, 0x00, 0x7F, 0x83, 0xFC, 0x00,
+ 0x03, 0xF8, 0x1F, 0xF0, 0x00, 0x1F, 0xC0, 0x7F, 0x80, 0x01, 0xFC, 0x01,
+ 0xFE, 0x00, 0x0F, 0xE0, 0x0F, 0xF0, 0x00, 0x7F, 0x00, 0x3F, 0xC0, 0x03,
+ 0xF8, 0x01, 0xFF, 0x00, 0x3F, 0x80, 0x07, 0xF8, 0x01, 0xFC, 0x00, 0x3F,
+ 0xE0, 0x0F, 0xE0, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x07, 0xFC, 0x03, 0xF8,
+ 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x01, 0xFC, 0x00, 0x01, 0xFC,
+ 0x00, 0x03, 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x03, 0xF8,
+ 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0,
+ 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xE0,
+ 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0,
+ 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80,
+ 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00,
+ 0x00, 0x7F, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x01, 0xFF,
+ 0x80, 0x03, 0xFF, 0x80, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x01,
+ 0xFF, 0xC0, 0x3F, 0xF0, 0x00, 0xFF, 0xE0, 0x3F, 0xF8, 0x00, 0xFF, 0xF0,
+ 0x1F, 0xFC, 0x00, 0x7F, 0xF8, 0x0F, 0xFE, 0x00, 0x7D, 0xF8, 0x07, 0xEF,
+ 0x00, 0x3E, 0xFC, 0x03, 0xF7, 0x80, 0x3F, 0xFE, 0x03, 0xFB, 0xC0, 0x1F,
+ 0x7F, 0x01, 0xFD, 0xE0, 0x1F, 0xBF, 0x00, 0xFE, 0xF0, 0x0F, 0x9F, 0x80,
+ 0x7E, 0x78, 0x0F, 0xDF, 0xC0, 0x7F, 0x3E, 0x07, 0xCF, 0xE0, 0x3F, 0x9F,
+ 0x07, 0xE7, 0xF0, 0x1F, 0xCF, 0x83, 0xE3, 0xF0, 0x0F, 0xE7, 0xC3, 0xF1,
+ 0xF8, 0x07, 0xE3, 0xE1, 0xF9, 0xFC, 0x07, 0xF1, 0xF0, 0xF8, 0xFE, 0x03,
+ 0xF8, 0xF8, 0xFC, 0x7F, 0x01, 0xFC, 0x7C, 0x7C, 0x3F, 0x00, 0xFC, 0x3E,
+ 0x7E, 0x1F, 0x80, 0x7E, 0x1F, 0x3E, 0x1F, 0xC0, 0x7F, 0x0F, 0xBF, 0x0F,
+ 0xE0, 0x3F, 0x87, 0xDF, 0x07, 0xE0, 0x1F, 0xC3, 0xFF, 0x83, 0xF0, 0x0F,
+ 0xC1, 0xFF, 0xC3, 0xF8, 0x0F, 0xE0, 0xFF, 0xC1, 0xFC, 0x07, 0xF0, 0x7F,
+ 0xE0, 0xFE, 0x03, 0xF8, 0x3F, 0xE0, 0x7E, 0x01, 0xFC, 0x1F, 0xF0, 0x3F,
+ 0x00, 0xFC, 0x0F, 0xF0, 0x3F, 0x80, 0xFE, 0x07, 0xF8, 0x1F, 0xC0, 0x7F,
+ 0x03, 0xF8, 0x0F, 0xC0, 0x00, 0x01, 0xFE, 0x00, 0x07, 0xE0, 0x3F, 0xC0,
+ 0x01, 0xFC, 0x07, 0xFC, 0x00, 0x3F, 0x80, 0xFF, 0x80, 0x07, 0xF0, 0x1F,
+ 0xF0, 0x00, 0xFC, 0x07, 0xFF, 0x00, 0x3F, 0x80, 0xFF, 0xE0, 0x07, 0xF0,
+ 0x1F, 0xFC, 0x00, 0xFE, 0x03, 0xFF, 0xC0, 0x1F, 0x80, 0xFF, 0xF8, 0x03,
+ 0xF0, 0x1F, 0xFF, 0x80, 0xFE, 0x03, 0xFB, 0xF0, 0x1F, 0xC0, 0x7E, 0x7E,
+ 0x03, 0xF8, 0x0F, 0xC7, 0xE0, 0x7E, 0x03, 0xF8, 0xFC, 0x0F, 0xC0, 0x7F,
+ 0x1F, 0x83, 0xF8, 0x0F, 0xE1, 0xF8, 0x7F, 0x01, 0xF8, 0x3F, 0x0F, 0xE0,
+ 0x3F, 0x07, 0xF1, 0xF8, 0x0F, 0xE0, 0x7E, 0x3F, 0x01, 0xFC, 0x0F, 0xCF,
+ 0xE0, 0x3F, 0x00, 0xFD, 0xFC, 0x07, 0xE0, 0x1F, 0xBF, 0x81, 0xFC, 0x03,
+ 0xF7, 0xE0, 0x3F, 0x80, 0x3F, 0xFC, 0x07, 0xF0, 0x07, 0xFF, 0x80, 0xFC,
+ 0x00, 0xFF, 0xF0, 0x1F, 0x80, 0x0F, 0xFC, 0x07, 0xF0, 0x01, 0xFF, 0x80,
+ 0xFE, 0x00, 0x3F, 0xF0, 0x1F, 0xC0, 0x03, 0xFE, 0x03, 0xF0, 0x00, 0x7F,
+ 0xC0, 0x7E, 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x00, 0x00,
+ 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x01,
+ 0xFF, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFF, 0xC0,
+ 0x3F, 0xF0, 0x3F, 0xF8, 0x1F, 0xF0, 0x03, 0xFE, 0x07, 0xF0, 0x00, 0x7F,
+ 0x83, 0xF8, 0x00, 0x0F, 0xF1, 0xFE, 0x00, 0x03, 0xFC, 0x7F, 0x00, 0x00,
+ 0x7F, 0x3F, 0x80, 0x00, 0x1F, 0xCF, 0xE0, 0x00, 0x07, 0xF7, 0xF0, 0x00,
+ 0x01, 0xFD, 0xFC, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x1F, 0xDF, 0xC0,
+ 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x03, 0xFB, 0xF8, 0x00, 0x00, 0xFE, 0xFE,
+ 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x00, 0x0F, 0xEF, 0xE0, 0x00, 0x07, 0xF3,
+ 0xF8, 0x00, 0x01, 0xFC, 0xFE, 0x00, 0x00, 0xFE, 0x3F, 0xC0, 0x00, 0x7F,
+ 0x8F, 0xF0, 0x00, 0x1F, 0xC1, 0xFE, 0x00, 0x0F, 0xE0, 0x7F, 0xC0, 0x0F,
+ 0xF8, 0x1F, 0xFC, 0x0F, 0xFC, 0x03, 0xFF, 0xFF, 0xFE, 0x00, 0x7F, 0xFF,
+ 0xFF, 0x00, 0x0F, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0x80, 0x00, 0x1F,
+ 0xFF, 0x80, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x03,
+ 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0xE0, 0x3F,
+ 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, 0xC1, 0xFE, 0x00, 0xFF, 0x83, 0xF8,
+ 0x00, 0xFF, 0x07, 0xF0, 0x00, 0xFE, 0x0F, 0xE0, 0x01, 0xFC, 0x1F, 0xC0,
+ 0x03, 0xF8, 0x7F, 0x00, 0x07, 0xF0, 0xFE, 0x00, 0x1F, 0xC1, 0xFC, 0x00,
+ 0x3F, 0x83, 0xF8, 0x00, 0xFE, 0x07, 0xF0, 0x07, 0xFC, 0x1F, 0xFF, 0xFF,
+ 0xF0, 0x3F, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFE,
+ 0x03, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0x80, 0x0F, 0xE0, 0x00, 0x00,
+ 0x1F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x01,
+ 0xFC, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x0F,
+ 0xE0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFE,
+ 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00,
+ 0x01, 0xFF, 0xF8, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0xF0,
+ 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0x3F, 0xF0, 0x3F,
+ 0xF0, 0x1F, 0xF0, 0x03, 0xFE, 0x07, 0xF8, 0x00, 0x7F, 0x83, 0xFC, 0x00,
+ 0x0F, 0xF1, 0xFE, 0x00, 0x03, 0xFC, 0x7F, 0x00, 0x00, 0x7F, 0x3F, 0x80,
+ 0x00, 0x1F, 0xCF, 0xE0, 0x00, 0x07, 0xF3, 0xF0, 0x00, 0x01, 0xFD, 0xFC,
+ 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x1F, 0xDF, 0x80, 0x00, 0x07, 0xFF,
+ 0xE0, 0x00, 0x03, 0xFB, 0xF8, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x3F,
+ 0xBF, 0x80, 0x00, 0x0F, 0xEF, 0xE0, 0x01, 0x87, 0xF3, 0xF8, 0x00, 0xF1,
+ 0xFC, 0xFE, 0x00, 0x7C, 0xFE, 0x3F, 0xC0, 0x3F, 0xFF, 0x8F, 0xF0, 0x07,
+ 0xFF, 0xC1, 0xFE, 0x01, 0xFF, 0xE0, 0x7F, 0xC0, 0x3F, 0xF8, 0x1F, 0xFC,
+ 0x0F, 0xFC, 0x03, 0xFF, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0x0F,
+ 0xFF, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0x9F, 0x80,
+ 0x01, 0xFF, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x60, 0x00, 0x01, 0xFF, 0xFF,
+ 0xF0, 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFF, 0x80, 0x7F, 0xFF,
+ 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xFC, 0x0F, 0xE0,
+ 0x03, 0xFE, 0x0F, 0xF0, 0x00, 0xFF, 0x07, 0xF0, 0x00, 0x3F, 0x83, 0xF8,
+ 0x00, 0x1F, 0xC1, 0xFC, 0x00, 0x0F, 0xC0, 0xFE, 0x00, 0x07, 0xE0, 0xFE,
+ 0x00, 0x07, 0xF0, 0x7F, 0x00, 0x07, 0xF0, 0x3F, 0x80, 0x0F, 0xF0, 0x1F,
+ 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xE0, 0x07,
+ 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0xFF, 0x01,
+ 0xFC, 0x00, 0x7F, 0x80, 0xFE, 0x00, 0x1F, 0xC0, 0x7F, 0x00, 0x0F, 0xE0,
+ 0x3F, 0x80, 0x07, 0xF0, 0x1F, 0xC0, 0x03, 0xF8, 0x1F, 0xC0, 0x01, 0xFC,
+ 0x0F, 0xE0, 0x01, 0xFC, 0x07, 0xF0, 0x00, 0xFE, 0x03, 0xF8, 0x00, 0x7F,
+ 0x01, 0xFC, 0x00, 0x3F, 0x81, 0xFC, 0x00, 0x1F, 0xC0, 0xFE, 0x00, 0x0F,
+ 0xE0, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x7F,
+ 0xFF, 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFC, 0x01, 0xFF, 0xFF,
+ 0xF8, 0x0F, 0xFF, 0xFF, 0xF0, 0x3F, 0xC0, 0x7F, 0xC1, 0xFE, 0x00, 0xFF,
+ 0x07, 0xF0, 0x01, 0xFC, 0x3F, 0x80, 0x07, 0xF0, 0xFE, 0x00, 0x1F, 0xC3,
+ 0xF8, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0xFF,
+ 0xE0, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x0F, 0xFF,
+ 0xFE, 0x00, 0x1F, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xF8, 0x00, 0x03, 0xFF,
+ 0xF0, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x01, 0xFC,
+ 0x00, 0x00, 0x07, 0xF3, 0xF8, 0x00, 0x1F, 0xCF, 0xE0, 0x00, 0x7E, 0x3F,
+ 0x80, 0x03, 0xF8, 0xFF, 0x00, 0x1F, 0xE3, 0xFF, 0x01, 0xFF, 0x07, 0xFF,
+ 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF,
+ 0xF0, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x3F, 0xF0, 0x00, 0x7F, 0xFF, 0xFF,
+ 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xF8,
+ 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x7F, 0x00, 0x00,
+ 0x07, 0xF0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFE,
+ 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xE0, 0x00,
+ 0x01, 0xFC, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x1F,
+ 0xC0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xF8, 0x00,
+ 0x00, 0x3F, 0x80, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07,
+ 0xF0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x7F, 0x00,
+ 0x00, 0x0F, 0xE0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x7F,
+ 0x07, 0xF0, 0x00, 0x7F, 0x07, 0xF0, 0x00, 0xFE, 0x0F, 0xE0, 0x00, 0xFE,
+ 0x0F, 0xE0, 0x00, 0xFE, 0x0F, 0xE0, 0x00, 0xFE, 0x0F, 0xE0, 0x00, 0xFE,
+ 0x0F, 0xE0, 0x01, 0xFC, 0x1F, 0xC0, 0x01, 0xFC, 0x1F, 0xC0, 0x01, 0xFC,
+ 0x1F, 0xC0, 0x01, 0xFC, 0x1F, 0xC0, 0x01, 0xFC, 0x3F, 0x80, 0x03, 0xF8,
+ 0x3F, 0x80, 0x03, 0xF8, 0x3F, 0x80, 0x03, 0xF8, 0x3F, 0x80, 0x03, 0xF8,
+ 0x3F, 0x80, 0x07, 0xF0, 0x7F, 0x00, 0x07, 0xF0, 0x7F, 0x00, 0x07, 0xF0,
+ 0x7F, 0x00, 0x07, 0xF0, 0x7F, 0x00, 0x07, 0xF0, 0x7F, 0x00, 0x0F, 0xE0,
+ 0xFE, 0x00, 0x0F, 0xE0, 0xFE, 0x00, 0x0F, 0xE0, 0xFE, 0x00, 0x0F, 0xE0,
+ 0xFE, 0x00, 0x1F, 0xC0, 0xFE, 0x00, 0x1F, 0xC0, 0xFF, 0x00, 0x3F, 0x80,
+ 0xFF, 0xC0, 0xFF, 0x80, 0x7F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFE, 0x00,
+ 0x3F, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xE0, 0x00,
+ 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x03, 0xF9, 0xFC, 0x00, 0x0F, 0xE7,
+ 0xF0, 0x00, 0x7F, 0x1F, 0xC0, 0x01, 0xFC, 0x7F, 0x00, 0x0F, 0xE1, 0xFC,
+ 0x00, 0x3F, 0x87, 0xF0, 0x01, 0xFC, 0x1F, 0xC0, 0x07, 0xF0, 0x3F, 0x00,
+ 0x3F, 0x80, 0xFC, 0x00, 0xFC, 0x03, 0xF0, 0x07, 0xF0, 0x0F, 0xC0, 0x1F,
+ 0x80, 0x3F, 0x80, 0xFE, 0x00, 0xFE, 0x03, 0xF0, 0x03, 0xF8, 0x1F, 0xC0,
+ 0x0F, 0xE0, 0x7E, 0x00, 0x1F, 0x83, 0xF8, 0x00, 0x7E, 0x0F, 0xC0, 0x01,
+ 0xF8, 0x7E, 0x00, 0x07, 0xE1, 0xF8, 0x00, 0x1F, 0x8F, 0xC0, 0x00, 0x7E,
+ 0x3F, 0x00, 0x01, 0xF9, 0xF8, 0x00, 0x07, 0xE7, 0xE0, 0x00, 0x0F, 0xFF,
+ 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0x00,
+ 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0xFF, 0x80, 0x00,
+ 0x01, 0xFC, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x00,
+ 0xFE, 0x00, 0x7F, 0x80, 0x1F, 0xFF, 0xC0, 0x0F, 0xF0, 0x03, 0xFB, 0xF8,
+ 0x01, 0xFE, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0xC0, 0x1F, 0xCF, 0xE0, 0x0F,
+ 0xF8, 0x03, 0xF9, 0xFC, 0x03, 0xFF, 0x00, 0xFE, 0x3F, 0x80, 0x7F, 0xE0,
+ 0x1F, 0xC7, 0xF0, 0x1F, 0xFC, 0x07, 0xF0, 0x7E, 0x03, 0xFF, 0x80, 0xFE,
+ 0x0F, 0xC0, 0x7D, 0xF0, 0x1F, 0x81, 0xF8, 0x1F, 0xBE, 0x07, 0xF0, 0x3F,
+ 0x03, 0xE7, 0xC0, 0xFC, 0x07, 0xE0, 0xFC, 0xF8, 0x3F, 0x80, 0xFC, 0x1F,
+ 0x1F, 0x07, 0xE0, 0x1F, 0x83, 0xE3, 0xE0, 0xFC, 0x03, 0xF0, 0xFC, 0x7C,
+ 0x3F, 0x00, 0x7E, 0x1F, 0x0F, 0x87, 0xE0, 0x0F, 0xC7, 0xE1, 0xF1, 0xF8,
+ 0x01, 0xF8, 0xF8, 0x3E, 0x3F, 0x00, 0x3F, 0x3F, 0x07, 0xCF, 0xC0, 0x07,
+ 0xE7, 0xC0, 0xF9, 0xF8, 0x00, 0xFC, 0xF8, 0x1F, 0x3E, 0x00, 0x1F, 0xBE,
+ 0x03, 0xEF, 0xC0, 0x01, 0xF7, 0xC0, 0x7D, 0xF0, 0x00, 0x3F, 0xF8, 0x0F,
+ 0xFE, 0x00, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x00, 0xFF, 0xC0, 0x3F, 0xF0,
+ 0x00, 0x1F, 0xF0, 0x07, 0xFC, 0x00, 0x03, 0xFE, 0x00, 0xFF, 0x80, 0x00,
+ 0x7F, 0x80, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x03, 0xFC, 0x00, 0x01, 0xFC,
+ 0x00, 0x7F, 0x80, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x01,
+ 0xFC, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x07, 0xFC, 0x00, 0xFF,
+ 0x00, 0x1F, 0xE0, 0x07, 0xF8, 0x00, 0xFF, 0x00, 0x7F, 0x80, 0x03, 0xFC,
+ 0x07, 0xF8, 0x00, 0x1F, 0xE0, 0x7F, 0x80, 0x00, 0xFF, 0x07, 0xF8, 0x00,
+ 0x03, 0xFC, 0x3F, 0x80, 0x00, 0x1F, 0xE3, 0xF8, 0x00, 0x00, 0x7F, 0x3F,
+ 0xC0, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x00,
+ 0x7F, 0xFC, 0x00, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x00, 0x0F, 0xFC, 0x00,
+ 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x1F,
+ 0xF0, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00,
+ 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x00, 0xFF, 0xFE,
+ 0x00, 0x00, 0x0F, 0xE7, 0xF0, 0x00, 0x00, 0xFF, 0x3F, 0xC0, 0x00, 0x0F,
+ 0xF1, 0xFE, 0x00, 0x00, 0xFF, 0x07, 0xF8, 0x00, 0x07, 0xF0, 0x3F, 0xC0,
+ 0x00, 0x7F, 0x01, 0xFE, 0x00, 0x07, 0xF8, 0x07, 0xF8, 0x00, 0x7F, 0x80,
+ 0x3F, 0xC0, 0x07, 0xF8, 0x01, 0xFF, 0x00, 0x7F, 0x80, 0x07, 0xF8, 0x07,
+ 0xFC, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xF7, 0xF8, 0x00, 0x7F,
+ 0xBF, 0xC0, 0x07, 0xF8, 0xFE, 0x00, 0x3F, 0x87, 0xF8, 0x03, 0xFC, 0x3F,
+ 0xC0, 0x3F, 0xC0, 0xFE, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x3F, 0xC1,
+ 0xFE, 0x00, 0xFE, 0x0F, 0xE0, 0x07, 0xF0, 0xFE, 0x00, 0x3F, 0x8F, 0xE0,
+ 0x00, 0xFE, 0x7F, 0x00, 0x07, 0xF7, 0xF0, 0x00, 0x3F, 0xFF, 0x00, 0x01,
+ 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x3F, 0xF8, 0x00, 0x01, 0xFF,
+ 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x01, 0xFC, 0x00,
+ 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00,
+ 0x3F, 0x80, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F,
+ 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x01, 0xFC, 0x00,
+ 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
+ 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF,
+ 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xF8, 0x00, 0x00,
+ 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00,
+ 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00,
+ 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00,
+ 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00,
+ 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00,
+ 0x07, 0xFC, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00,
+ 0x07, 0xF8, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00,
+ 0x07, 0xF8, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xFF,
+ 0x01, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF,
+ 0xC0, 0x3F, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x7F, 0xF8, 0x03, 0xFF, 0x80,
+ 0x1F, 0xFC, 0x00, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0x7E, 0x00, 0x03, 0xF0,
+ 0x00, 0x1F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03,
+ 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00,
+ 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x7E,
+ 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00,
+ 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xF8, 0x00, 0x0F, 0xC0,
+ 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F,
+ 0xC0, 0x00, 0x7E, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xFF, 0xC0,
+ 0x0F, 0xFE, 0x00, 0x7F, 0xF0, 0x07, 0xFF, 0x80, 0x3F, 0xFC, 0x00, 0x81,
+ 0xC3, 0xC7, 0x8F, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0xC7, 0x8F, 0x1E,
+ 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x8F, 0x1E, 0x3C, 0x38, 0x70, 0xE1,
+ 0xC3, 0x87, 0x0F, 0x1E, 0x3C, 0x78, 0xF0, 0x00, 0x7F, 0xF8, 0x03, 0xFF,
+ 0xC0, 0x1F, 0xFC, 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x01, 0xF8, 0x00,
+ 0x1F, 0xC0, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8,
+ 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x03,
+ 0xF8, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00,
+ 0x03, 0xF8, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x7F,
+ 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00,
+ 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0,
+ 0x00, 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x01, 0xFF,
+ 0xE0, 0x0F, 0xFE, 0x00, 0x7F, 0xF0, 0x03, 0xFF, 0x80, 0x3F, 0xFC, 0x00,
+ 0x00, 0x1F, 0x80, 0x00, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x80, 0x07,
+ 0xFC, 0x00, 0x7F, 0xE0, 0x03, 0xFF, 0x80, 0x3E, 0xFC, 0x01, 0xF3, 0xE0,
+ 0x1F, 0x1F, 0x01, 0xF8, 0xF8, 0x0F, 0x87, 0xE0, 0xFC, 0x3F, 0x07, 0xC0,
+ 0xF8, 0x7C, 0x07, 0xC7, 0xE0, 0x3E, 0x3E, 0x01, 0xFB, 0xF0, 0x0F, 0xDF,
+ 0x00, 0x3F, 0xF0, 0x01, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xE0, 0xF8, 0xF0, 0xF1, 0xE1,
+ 0xC3, 0xC3, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0xFF, 0xFF,
+ 0xC0, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xF8, 0x7F, 0x03, 0xFC, 0x3F, 0x00,
+ 0xFE, 0x1F, 0x80, 0x7E, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x80, 0x1F,
+ 0xFF, 0xC0, 0x7F, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0xFF, 0xF7, 0xF0, 0xFF,
+ 0x83, 0xF8, 0xFF, 0x01, 0xF8, 0x7F, 0x00, 0xFC, 0x7F, 0x00, 0xFE, 0x3F,
+ 0x80, 0x7F, 0x1F, 0xC0, 0x7F, 0x8F, 0xF0, 0xFF, 0x87, 0xFF, 0xFF, 0xC3,
+ 0xFF, 0xFF, 0xE0, 0xFF, 0xF7, 0xF8, 0x3F, 0xF3, 0xFC, 0x07, 0xE0, 0x00,
+ 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x01,
+ 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xE0, 0x00, 0x00, 0xFC, 0x00,
+ 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x3F, 0x80, 0x1F,
+ 0x9F, 0xFC, 0x03, 0xF7, 0xFF, 0xC0, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF,
+ 0x83, 0xFF, 0x0F, 0xF0, 0x7F, 0x80, 0xFF, 0x0F, 0xE0, 0x1F, 0xE3, 0xF8,
+ 0x01, 0xFC, 0x7F, 0x00, 0x3F, 0x8F, 0xC0, 0x07, 0xF1, 0xF8, 0x00, 0xFE,
+ 0x7F, 0x00, 0x1F, 0xCF, 0xC0, 0x03, 0xF9, 0xF8, 0x00, 0xFE, 0x3F, 0x00,
+ 0x1F, 0xC7, 0xE0, 0x03, 0xF9, 0xFC, 0x00, 0xFE, 0x3F, 0xC0, 0x3F, 0xC7,
+ 0xF8, 0x0F, 0xF0, 0xFF, 0x83, 0xFC, 0x1F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF,
+ 0xC0, 0xFF, 0xFF, 0xF0, 0x1F, 0x9F, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00,
+ 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xFC, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF,
+ 0xE0, 0x7F, 0xFF, 0xF0, 0x7F, 0x83, 0xFC, 0x7F, 0x00, 0xFE, 0x3F, 0x00,
+ 0x7F, 0x3F, 0x80, 0x3F, 0x9F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0,
+ 0x00, 0x07, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC,
+ 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x3F, 0x80, 0x3F, 0x9F,
+ 0xE0, 0x3F, 0x87, 0xF8, 0x3F, 0x83, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0,
+ 0x3F, 0xFF, 0xC0, 0x0F, 0xFF, 0x80, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x07,
+ 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0,
+ 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x7F, 0x00, 0x3F,
+ 0xF3, 0xF8, 0x03, 0xFF, 0xDF, 0x80, 0x7F, 0xFF, 0xFC, 0x07, 0xFF, 0xFF,
+ 0xE0, 0x3F, 0xC3, 0xFF, 0x03, 0xFC, 0x0F, 0xF8, 0x3F, 0xC0, 0x3F, 0x81,
+ 0xFC, 0x01, 0xFC, 0x1F, 0xC0, 0x07, 0xE0, 0xFE, 0x00, 0x3F, 0x07, 0xF0,
+ 0x03, 0xF8, 0x7F, 0x00, 0x1F, 0x83, 0xF8, 0x00, 0xFC, 0x1F, 0xC0, 0x07,
+ 0xE0, 0xFE, 0x00, 0x3F, 0x07, 0xF0, 0x03, 0xF0, 0x3F, 0x80, 0x3F, 0x81,
+ 0xFC, 0x01, 0xFC, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC3, 0xFF, 0x01, 0xFF,
+ 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFC, 0x00, 0xFF, 0xCF,
+ 0xE0, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0xFC, 0x00,
+ 0x7F, 0xFF, 0x00, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF0, 0x7F, 0x87, 0xF8,
+ 0x7F, 0x01, 0xFE, 0x7F, 0x00, 0x7F, 0x3F, 0x80, 0x3F, 0xBF, 0x80, 0x1F,
+ 0xDF, 0xC0, 0x0F, 0xEF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFD, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00,
+ 0x00, 0x3F, 0x80, 0x3F, 0x9F, 0xE0, 0x3F, 0x87, 0xF8, 0x3F, 0xC3, 0xFF,
+ 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0x80, 0x0F, 0xFF, 0x80, 0x00,
+ 0xFE, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x1F, 0xF0, 0x0F, 0xF8, 0x07, 0xFE,
+ 0x01, 0xFF, 0x80, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xC0, 0x03, 0xF0, 0x01,
+ 0xFC, 0x03, 0xFF, 0xF1, 0xFF, 0xF8, 0x7F, 0xFE, 0x1F, 0xFF, 0x80, 0xFE,
+ 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x7F, 0x00,
+ 0x1F, 0xC0, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F,
+ 0xE0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xF0,
+ 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x07, 0xC3, 0xF8,
+ 0x01, 0xFF, 0x9F, 0x80, 0x1F, 0xFE, 0xFC, 0x01, 0xFF, 0xFF, 0xE0, 0x1F,
+ 0xFF, 0xFF, 0x01, 0xFE, 0x1F, 0xF8, 0x1F, 0xE0, 0x3F, 0x80, 0xFE, 0x01,
+ 0xFC, 0x0F, 0xE0, 0x0F, 0xE0, 0x7F, 0x00, 0x3F, 0x07, 0xF0, 0x01, 0xF8,
+ 0x3F, 0x80, 0x0F, 0x81, 0xF8, 0x00, 0x7C, 0x1F, 0xC0, 0x07, 0xE0, 0xFE,
+ 0x00, 0x3F, 0x07, 0xF0, 0x01, 0xF0, 0x3F, 0x80, 0x1F, 0x81, 0xFC, 0x00,
+ 0xFC, 0x0F, 0xE0, 0x0F, 0xE0, 0x7F, 0x80, 0xFF, 0x03, 0xFE, 0x1F, 0xF0,
+ 0x0F, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xFC, 0x01, 0xFF, 0xF7, 0xE0, 0x07,
+ 0xFE, 0x7F, 0x00, 0x0F, 0xC3, 0xF0, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x01,
+ 0xFC, 0x0F, 0xE0, 0x0F, 0xC0, 0x7F, 0x00, 0xFE, 0x03, 0xFC, 0x1F, 0xE0,
+ 0x1F, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xE0, 0x01, 0xFF, 0xFC, 0x00, 0x01,
+ 0xFF, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xE0,
+ 0x00, 0x00, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00,
+ 0xFE, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xFE, 0x0F,
+ 0xC0, 0x1F, 0xCF, 0xFE, 0x03, 0xFB, 0xFF, 0xE0, 0x7F, 0xFF, 0xFE, 0x0F,
+ 0xFF, 0xFF, 0xC3, 0xFF, 0x07, 0xF8, 0x7F, 0x80, 0x7F, 0x0F, 0xE0, 0x0F,
+ 0xE1, 0xFC, 0x01, 0xFC, 0x7F, 0x00, 0x3F, 0x0F, 0xE0, 0x07, 0xE1, 0xFC,
+ 0x01, 0xFC, 0x3F, 0x00, 0x3F, 0x87, 0xE0, 0x07, 0xF1, 0xFC, 0x00, 0xFC,
+ 0x3F, 0x80, 0x1F, 0x87, 0xF0, 0x07, 0xF0, 0xFC, 0x00, 0xFE, 0x1F, 0x80,
+ 0x1F, 0xC7, 0xF0, 0x03, 0xF0, 0xFE, 0x00, 0x7E, 0x1F, 0xC0, 0x1F, 0xC3,
+ 0xF0, 0x03, 0xF8, 0xFE, 0x00, 0x7F, 0x1F, 0xC0, 0x0F, 0xC0, 0x01, 0xFC,
+ 0x07, 0xF0, 0x1F, 0x80, 0x7E, 0x03, 0xF8, 0x0F, 0xE0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xE0, 0x3F, 0x80, 0xFE,
+ 0x03, 0xF8, 0x0F, 0xC0, 0x3F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7E,
+ 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFC, 0x03, 0xF0, 0x1F, 0xC0, 0x7F,
+ 0x01, 0xFC, 0x07, 0xE0, 0x1F, 0x80, 0xFE, 0x03, 0xF8, 0x00, 0x00, 0x0F,
+ 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x3F,
+ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0xFE,
+ 0x00, 0x1F, 0xC0, 0x03, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0xC0, 0x03, 0xF8,
+ 0x00, 0x7F, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xE0,
+ 0x01, 0xFC, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x80,
+ 0x07, 0xF0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x07, 0xF0, 0x00, 0xFE, 0x00,
+ 0x1F, 0x80, 0x03, 0xF0, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x03, 0xF8, 0x00,
+ 0x7E, 0x00, 0x0F, 0xC0, 0x03, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xC0, 0x0F,
+ 0xF8, 0x03, 0xFE, 0x00, 0x7E, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x1F,
+ 0x80, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xF8, 0x00,
+ 0x00, 0x3F, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07,
+ 0xF0, 0x00, 0x00, 0x7F, 0x00, 0xFE, 0x07, 0xE0, 0x3F, 0xC0, 0x7E, 0x07,
+ 0xF8, 0x0F, 0xE0, 0xFF, 0x00, 0xFE, 0x1F, 0xC0, 0x0F, 0xE3, 0xF8, 0x00,
+ 0xFC, 0x7F, 0x00, 0x0F, 0xCF, 0xE0, 0x01, 0xFD, 0xFC, 0x00, 0x1F, 0xFF,
+ 0x80, 0x01, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x00,
+ 0x3F, 0xFF, 0xC0, 0x03, 0xFE, 0xFE, 0x00, 0x3F, 0xCF, 0xE0, 0x03, 0xF0,
+ 0xFE, 0x00, 0x7F, 0x07, 0xF0, 0x07, 0xF0, 0x7F, 0x00, 0x7F, 0x07, 0xF8,
+ 0x07, 0xE0, 0x3F, 0x80, 0x7E, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0xC0, 0xFE,
+ 0x01, 0xFC, 0x0F, 0xC0, 0x1F, 0xE0, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0x80,
+ 0x7E, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFC, 0x03, 0xF0, 0x1F, 0xC0,
+ 0x7F, 0x01, 0xFC, 0x07, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xC0,
+ 0x3F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7E, 0x03, 0xF8, 0x0F, 0xE0,
+ 0x3F, 0x80, 0xFC, 0x03, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xE0,
+ 0x1F, 0x80, 0xFE, 0x03, 0xF8, 0x00, 0x07, 0xF0, 0xFC, 0x03, 0xF0, 0x07,
+ 0xE3, 0xFF, 0x0F, 0xFC, 0x07, 0xEF, 0xFF, 0x3F, 0xFE, 0x0F, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xF8, 0x7F, 0xF0, 0xFF,
+ 0x0F, 0xE0, 0x3F, 0xC0, 0x7F, 0x0F, 0xE0, 0x3F, 0x80, 0x7F, 0x1F, 0xC0,
+ 0x3F, 0x80, 0x7E, 0x1F, 0xC0, 0x3F, 0x00, 0x7E, 0x1F, 0xC0, 0x3F, 0x00,
+ 0xFE, 0x1F, 0x80, 0x7F, 0x00, 0xFE, 0x3F, 0x80, 0x7F, 0x00, 0xFC, 0x3F,
+ 0x80, 0x7F, 0x00, 0xFC, 0x3F, 0x80, 0x7E, 0x01, 0xFC, 0x3F, 0x00, 0x7E,
+ 0x01, 0xFC, 0x3F, 0x00, 0xFE, 0x01, 0xFC, 0x7F, 0x00, 0xFE, 0x01, 0xF8,
+ 0x7F, 0x00, 0xFE, 0x01, 0xF8, 0x7F, 0x00, 0xFC, 0x03, 0xF8, 0x7E, 0x01,
+ 0xFC, 0x03, 0xF8, 0x7E, 0x01, 0xFC, 0x03, 0xF8, 0xFE, 0x01, 0xFC, 0x03,
+ 0xF0, 0xFE, 0x01, 0xF8, 0x03, 0xF0, 0xFE, 0x01, 0xF8, 0x07, 0xF0, 0x07,
+ 0xF0, 0xFE, 0x00, 0xFE, 0x7F, 0xF0, 0x1F, 0x9F, 0xFF, 0x03, 0xFF, 0xFF,
+ 0xF0, 0xFF, 0xFF, 0xFE, 0x1F, 0xF8, 0x3F, 0xC3, 0xFC, 0x03, 0xF8, 0x7F,
+ 0x00, 0x7F, 0x0F, 0xE0, 0x0F, 0xE3, 0xF8, 0x01, 0xF8, 0x7F, 0x00, 0x3F,
+ 0x0F, 0xC0, 0x0F, 0xE1, 0xF8, 0x01, 0xFC, 0x7F, 0x00, 0x3F, 0x8F, 0xE0,
+ 0x07, 0xE1, 0xFC, 0x00, 0xFC, 0x3F, 0x00, 0x3F, 0x87, 0xE0, 0x07, 0xF1,
+ 0xFC, 0x00, 0xFE, 0x3F, 0x80, 0x1F, 0x87, 0xF0, 0x03, 0xF0, 0xFC, 0x00,
+ 0xFE, 0x3F, 0x80, 0x1F, 0xC7, 0xF0, 0x03, 0xF8, 0xFE, 0x00, 0x7E, 0x00,
+ 0x00, 0x1F, 0xE0, 0x00, 0x1F, 0xFF, 0x00, 0x1F, 0xFF, 0xE0, 0x0F, 0xFF,
+ 0xFC, 0x07, 0xFF, 0xFF, 0x83, 0xFC, 0x1F, 0xE1, 0xFE, 0x03, 0xFC, 0xFF,
+ 0x00, 0xFF, 0x3F, 0x80, 0x1F, 0xDF, 0xC0, 0x07, 0xF7, 0xF0, 0x01, 0xFD,
+ 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x03,
+ 0xFB, 0xF8, 0x00, 0xFE, 0xFE, 0x00, 0x3F, 0xBF, 0x80, 0x1F, 0xCF, 0xF0,
+ 0x0F, 0xF3, 0xFC, 0x07, 0xF8, 0x7F, 0x83, 0xFC, 0x1F, 0xFF, 0xFE, 0x03,
+ 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0x80, 0x0F, 0xFF, 0x80, 0x00, 0x7F, 0x00,
+ 0x00, 0x01, 0xFC, 0x3F, 0x00, 0x0F, 0xCF, 0xFE, 0x00, 0x7E, 0xFF, 0xF8,
+ 0x07, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xFF, 0x01, 0xFF, 0x87, 0xF8, 0x0F,
+ 0xF0, 0x1F, 0xE0, 0xFF, 0x00, 0xFF, 0x07, 0xF0, 0x03, 0xF8, 0x3F, 0x80,
+ 0x1F, 0xC1, 0xF8, 0x00, 0xFE, 0x0F, 0xC0, 0x07, 0xF0, 0xFE, 0x00, 0x3F,
+ 0x87, 0xF0, 0x01, 0xFC, 0x3F, 0x00, 0x1F, 0xC1, 0xF8, 0x00, 0xFE, 0x1F,
+ 0xC0, 0x07, 0xF0, 0xFE, 0x00, 0x7F, 0x07, 0xF8, 0x07, 0xF8, 0x3F, 0xC0,
+ 0x7F, 0x81, 0xFF, 0x87, 0xF8, 0x1F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFC,
+ 0x07, 0xF7, 0xFF, 0xC0, 0x3F, 0x1F, 0xF8, 0x01, 0xF8, 0x7F, 0x00, 0x1F,
+ 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x3F, 0x00,
+ 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00,
+ 0x07, 0xE0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x87, 0xF0,
+ 0x0F, 0xFE, 0x7F, 0x01, 0xFF, 0xF7, 0xE0, 0x3F, 0xFF, 0x7E, 0x07, 0xFF,
+ 0xFF, 0xE0, 0xFF, 0x07, 0xFE, 0x1F, 0xE0, 0x3F, 0xE3, 0xFC, 0x03, 0xFC,
+ 0x3F, 0x80, 0x1F, 0xC7, 0xF0, 0x01, 0xFC, 0x7F, 0x00, 0x1F, 0xC7, 0xF0,
+ 0x01, 0xF8, 0xFE, 0x00, 0x1F, 0x8F, 0xE0, 0x03, 0xF8, 0xFE, 0x00, 0x3F,
+ 0x8F, 0xE0, 0x03, 0xF8, 0xFE, 0x00, 0x7F, 0x0F, 0xE0, 0x07, 0xF0, 0xFE,
+ 0x00, 0xFF, 0x0F, 0xF0, 0x1F, 0xF0, 0x7F, 0x87, 0xFF, 0x07, 0xFF, 0xFF,
+ 0xE0, 0x3F, 0xFF, 0x7E, 0x03, 0xFF, 0xEF, 0xE0, 0x1F, 0xFC, 0xFE, 0x00,
+ 0x7F, 0x0F, 0xC0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x01,
+ 0xFC, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x1F, 0x80,
+ 0x00, 0x03, 0xF8, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xF8, 0x00, 0x07,
+ 0xF0, 0xF0, 0x7F, 0x3F, 0x07, 0xE7, 0xE0, 0x7E, 0xFE, 0x0F, 0xFF, 0xE0,
+ 0xFF, 0xFE, 0x0F, 0xFC, 0x00, 0xFF, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00,
+ 0x1F, 0xC0, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x80,
+ 0x03, 0xF8, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0,
+ 0x00, 0x7F, 0x00, 0x07, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE,
+ 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0xF8, 0x03, 0xFF, 0xFC, 0x07,
+ 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0x0F, 0xE0, 0xFF, 0x1F, 0xC0, 0x7F, 0x1F,
+ 0xC0, 0x7F, 0x1F, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x1F, 0xFF, 0xC0, 0x0F,
+ 0xFF, 0xF0, 0x07, 0xFF, 0xF8, 0x03, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00,
+ 0x0F, 0xFE, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFE, 0xFC, 0x00, 0xFE, 0xFE,
+ 0x00, 0xFE, 0xFF, 0x03, 0xFC, 0x7F, 0xFF, 0xF8, 0x7F, 0xFF, 0xF8, 0x3F,
+ 0xFF, 0xE0, 0x1F, 0xFF, 0xC0, 0x03, 0xFE, 0x00, 0x03, 0xF0, 0x1F, 0xC0,
+ 0x7F, 0x01, 0xFC, 0x07, 0xE0, 0x3F, 0x80, 0xFE, 0x1F, 0xFF, 0x7F, 0xFD,
+ 0xFF, 0xFF, 0xFF, 0xC7, 0xF0, 0x1F, 0xC0, 0x7E, 0x01, 0xF8, 0x0F, 0xE0,
+ 0x3F, 0x80, 0xFE, 0x03, 0xF0, 0x0F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xE0,
+ 0x1F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0xF0, 0xFF, 0xC3, 0xFF,
+ 0x07, 0xFC, 0x0F, 0xE0, 0x0F, 0xC0, 0x0F, 0xE1, 0xF8, 0x01, 0xFC, 0x7F,
+ 0x00, 0x3F, 0x0F, 0xE0, 0x0F, 0xE1, 0xFC, 0x01, 0xFC, 0x3F, 0x00, 0x3F,
+ 0x87, 0xE0, 0x07, 0xE1, 0xFC, 0x00, 0xFC, 0x3F, 0x80, 0x3F, 0x87, 0xF0,
+ 0x07, 0xF0, 0xFC, 0x00, 0xFE, 0x1F, 0x80, 0x1F, 0x87, 0xF0, 0x03, 0xF0,
+ 0xFE, 0x00, 0xFE, 0x1F, 0x80, 0x1F, 0xC3, 0xF0, 0x03, 0xF0, 0xFE, 0x00,
+ 0x7E, 0x1F, 0xC0, 0x1F, 0xC3, 0xF8, 0x07, 0xF8, 0x7F, 0x01, 0xFF, 0x0F,
+ 0xF0, 0x7F, 0xC1, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0x03, 0xFF, 0xEF,
+ 0xE0, 0x3F, 0xF9, 0xFC, 0x01, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x7F, 0x7F,
+ 0x00, 0x3F, 0xBF, 0x80, 0x3F, 0x8F, 0xC0, 0x1F, 0xC7, 0xE0, 0x1F, 0xC3,
+ 0xF0, 0x0F, 0xC1, 0xFC, 0x0F, 0xE0, 0xFE, 0x07, 0xE0, 0x7F, 0x07, 0xF0,
+ 0x3F, 0x83, 0xF0, 0x0F, 0xC3, 0xF8, 0x07, 0xE1, 0xF8, 0x03, 0xF1, 0xFC,
+ 0x01, 0xF8, 0xFC, 0x00, 0xFC, 0xFC, 0x00, 0x7E, 0x7E, 0x00, 0x3F, 0x7E,
+ 0x00, 0x0F, 0xBF, 0x00, 0x07, 0xFF, 0x00, 0x03, 0xFF, 0x80, 0x01, 0xFF,
+ 0x80, 0x00, 0xFF, 0x80, 0x00, 0x7F, 0xC0, 0x00, 0x3F, 0xC0, 0x00, 0x1F,
+ 0xE0, 0x00, 0x00, 0xFE, 0x03, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0x01, 0xFF,
+ 0xF8, 0x1F, 0xE0, 0x3F, 0x7F, 0x03, 0xFC, 0x0F, 0xEF, 0xE0, 0xFF, 0x81,
+ 0xF9, 0xFC, 0x1F, 0xF0, 0x7F, 0x3F, 0x83, 0xFE, 0x0F, 0xC3, 0xF0, 0xFF,
+ 0xC3, 0xF8, 0x7E, 0x1E, 0xF8, 0x7E, 0x0F, 0xC7, 0xDF, 0x1F, 0xC1, 0xF8,
+ 0xFB, 0xE3, 0xF0, 0x3F, 0x1E, 0x7C, 0x7E, 0x07, 0xE7, 0xCF, 0x9F, 0x80,
+ 0xFC, 0xF1, 0xF3, 0xF0, 0x1F, 0xBE, 0x3E, 0xFC, 0x03, 0xF7, 0x87, 0xDF,
+ 0x80, 0x7E, 0xF0, 0xFF, 0xE0, 0x0F, 0xFE, 0x1F, 0xFC, 0x01, 0xFF, 0x83,
+ 0xFF, 0x00, 0x3F, 0xF0, 0x7F, 0xE0, 0x07, 0xFC, 0x0F, 0xF8, 0x00, 0x7F,
+ 0x81, 0xFF, 0x00, 0x0F, 0xF0, 0x3F, 0xC0, 0x01, 0xFC, 0x07, 0xF8, 0x00,
+ 0x3F, 0x80, 0xFE, 0x00, 0x00, 0x03, 0xFC, 0x07, 0xF8, 0x1F, 0xE0, 0x7F,
+ 0x80, 0x7F, 0x03, 0xF8, 0x03, 0xF8, 0x3F, 0x80, 0x1F, 0xE3, 0xF8, 0x00,
+ 0x7F, 0x3F, 0x80, 0x03, 0xF9, 0xFC, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x7F,
+ 0xFC, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x7F, 0xC0,
+ 0x00, 0x01, 0xFC, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x01, 0xFF, 0x80, 0x00,
+ 0x1F, 0xFE, 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x1F, 0xDF, 0xC0, 0x01, 0xFC,
+ 0xFE, 0x00, 0x1F, 0xE7, 0xF8, 0x00, 0xFE, 0x1F, 0xC0, 0x0F, 0xE0, 0xFE,
+ 0x00, 0xFF, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xC0, 0xFF, 0x00, 0xFF, 0x00,
+ 0x0F, 0xE0, 0x03, 0xF0, 0x7F, 0x00, 0x3F, 0x83, 0xF8, 0x01, 0xF8, 0x1F,
+ 0xC0, 0x1F, 0xC0, 0xFE, 0x00, 0xFC, 0x03, 0xF8, 0x0F, 0xE0, 0x1F, 0xC0,
+ 0x7E, 0x00, 0xFE, 0x07, 0xE0, 0x07, 0xF0, 0x3F, 0x00, 0x3F, 0x83, 0xF0,
+ 0x01, 0xFC, 0x1F, 0x80, 0x0F, 0xE1, 0xF8, 0x00, 0x3F, 0x0F, 0xC0, 0x01,
+ 0xF8, 0xFC, 0x00, 0x0F, 0xC7, 0xC0, 0x00, 0x7F, 0x7E, 0x00, 0x03, 0xFB,
+ 0xE0, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x03, 0xFF, 0x80,
+ 0x00, 0x1F, 0xF8, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00,
+ 0x3F, 0xC0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F,
+ 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x03, 0xF8, 0x00,
+ 0x01, 0xFF, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x07,
+ 0xF8, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xC0, 0xFF,
+ 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x1F, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0x80,
+ 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8,
+ 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F,
+ 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07,
+ 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00,
+ 0x7F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF,
+ 0xE0, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x0F, 0xC0, 0x0F, 0xF0, 0x07, 0xFC,
+ 0x01, 0xFE, 0x00, 0xFF, 0x80, 0x3E, 0x00, 0x0F, 0x80, 0x07, 0xE0, 0x01,
+ 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x03, 0xE0, 0x00, 0xF8,
+ 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x07, 0xE0, 0x01, 0xF0, 0x00, 0x7C, 0x00,
+ 0x3F, 0x00, 0x7F, 0x80, 0x1F, 0x80, 0x07, 0xE0, 0x03, 0xFC, 0x00, 0x3F,
+ 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0,
+ 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x01,
+ 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xF8, 0x01, 0xFE, 0x00, 0x7F,
+ 0x80, 0x0F, 0xE0, 0x01, 0xF8, 0x00, 0x00, 0x78, 0x03, 0xC0, 0x1C, 0x01,
+ 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1C, 0x01, 0xE0, 0x0F, 0x00, 0x78,
+ 0x03, 0xC0, 0x1C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x3C, 0x01,
+ 0xE0, 0x0F, 0x00, 0x78, 0x03, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78,
+ 0x03, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0x80, 0x3C, 0x01,
+ 0xE0, 0x0F, 0x00, 0x70, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x70,
+ 0x07, 0x80, 0x3C, 0x00, 0x00, 0x7E, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x01,
+ 0xFE, 0x00, 0x7F, 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x1F,
+ 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x0F, 0x80,
+ 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xF0, 0x00,
+ 0xFF, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x07, 0xF8, 0x03, 0xF0, 0x00, 0xF8,
+ 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00,
+ 0x1F, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x1F,
+ 0x80, 0x07, 0xC0, 0x01, 0xF0, 0x07, 0xFC, 0x01, 0xFE, 0x00, 0xFF, 0x80,
+ 0x3F, 0xC0, 0x0F, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0xFF, 0x80, 0x07, 0xFF,
+ 0x03, 0xDF, 0xFE, 0x0F, 0xF0, 0x7F, 0xFB, 0x80, 0xFF, 0xE0, 0x01, 0xFF,
+ 0x00, 0x03, 0xF0 };
+
+const GFXglyph FreeSansBoldOblique24pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 13, 0, 1 }, // 0x20 ' '
+ { 0, 14, 34, 16, 5, -33 }, // 0x21 '!'
+ { 60, 18, 12, 22, 8, -33 }, // 0x22 '"'
+ { 87, 29, 33, 26, 2, -31 }, // 0x23 '#'
+ { 207, 26, 42, 26, 3, -35 }, // 0x24 '$'
+ { 344, 36, 34, 42, 6, -32 }, // 0x25 '%'
+ { 497, 29, 35, 34, 4, -33 }, // 0x26 '&'
+ { 624, 7, 12, 11, 8, -33 }, // 0x27 '''
+ { 635, 17, 44, 16, 4, -33 }, // 0x28 '('
+ { 729, 17, 44, 16, 0, -34 }, // 0x29 ')'
+ { 823, 15, 15, 18, 7, -33 }, // 0x2A '*'
+ { 852, 24, 22, 27, 4, -21 }, // 0x2B '+'
+ { 918, 10, 15, 13, 1, -6 }, // 0x2C ','
+ { 937, 14, 6, 16, 3, -15 }, // 0x2D '-'
+ { 948, 8, 7, 13, 3, -6 }, // 0x2E '.'
+ { 955, 20, 34, 13, 0, -32 }, // 0x2F '/'
+ { 1040, 25, 35, 26, 4, -33 }, // 0x30 '0'
+ { 1150, 17, 33, 26, 8, -32 }, // 0x31 '1'
+ { 1221, 29, 34, 26, 1, -33 }, // 0x32 '2'
+ { 1345, 26, 35, 26, 3, -33 }, // 0x33 '3'
+ { 1459, 25, 32, 26, 3, -31 }, // 0x34 '4'
+ { 1559, 27, 34, 26, 3, -32 }, // 0x35 '5'
+ { 1674, 25, 35, 26, 4, -33 }, // 0x36 '6'
+ { 1784, 26, 33, 26, 6, -32 }, // 0x37 '7'
+ { 1892, 26, 35, 26, 3, -33 }, // 0x38 '8'
+ { 2006, 25, 35, 26, 4, -33 }, // 0x39 '9'
+ { 2116, 12, 25, 16, 5, -24 }, // 0x3A ':'
+ { 2154, 14, 33, 16, 3, -24 }, // 0x3B ';'
+ { 2212, 26, 23, 27, 4, -22 }, // 0x3C '<'
+ { 2287, 26, 18, 27, 3, -19 }, // 0x3D '='
+ { 2346, 26, 23, 27, 1, -21 }, // 0x3E '>'
+ { 2421, 24, 35, 29, 8, -34 }, // 0x3F '?'
+ { 2526, 45, 41, 46, 3, -34 }, // 0x40 '@'
+ { 2757, 32, 34, 34, 1, -33 }, // 0x41 'A'
+ { 2893, 32, 34, 34, 4, -33 }, // 0x42 'B'
+ { 3029, 32, 36, 34, 5, -34 }, // 0x43 'C'
+ { 3173, 32, 34, 34, 4, -33 }, // 0x44 'D'
+ { 3309, 32, 34, 31, 4, -33 }, // 0x45 'E'
+ { 3445, 32, 34, 29, 3, -33 }, // 0x46 'F'
+ { 3581, 33, 36, 37, 5, -34 }, // 0x47 'G'
+ { 3730, 35, 34, 34, 3, -33 }, // 0x48 'H'
+ { 3879, 14, 34, 13, 3, -33 }, // 0x49 'I'
+ { 3939, 27, 35, 26, 3, -33 }, // 0x4A 'J'
+ { 4058, 37, 34, 34, 3, -33 }, // 0x4B 'K'
+ { 4216, 24, 34, 29, 4, -33 }, // 0x4C 'L'
+ { 4318, 41, 34, 39, 3, -33 }, // 0x4D 'M'
+ { 4493, 35, 34, 34, 3, -33 }, // 0x4E 'N'
+ { 4642, 34, 36, 37, 5, -34 }, // 0x4F 'O'
+ { 4795, 31, 34, 31, 4, -33 }, // 0x50 'P'
+ { 4927, 34, 37, 37, 5, -34 }, // 0x51 'Q'
+ { 5085, 33, 34, 34, 4, -33 }, // 0x52 'R'
+ { 5226, 30, 36, 31, 4, -34 }, // 0x53 'S'
+ { 5361, 28, 34, 29, 7, -33 }, // 0x54 'T'
+ { 5480, 32, 35, 34, 6, -33 }, // 0x55 'U'
+ { 5620, 30, 34, 31, 8, -33 }, // 0x56 'V'
+ { 5748, 43, 34, 44, 8, -33 }, // 0x57 'W'
+ { 5931, 37, 34, 31, 1, -33 }, // 0x58 'X'
+ { 6089, 29, 34, 31, 9, -33 }, // 0x59 'Y'
+ { 6213, 33, 34, 29, 1, -33 }, // 0x5A 'Z'
+ { 6354, 21, 43, 16, 1, -33 }, // 0x5B '['
+ { 6467, 7, 36, 13, 6, -34 }, // 0x5C '\'
+ { 6499, 21, 43, 16, -1, -33 }, // 0x5D ']'
+ { 6612, 21, 20, 27, 6, -32 }, // 0x5E '^'
+ { 6665, 29, 4, 26, -3, 6 }, // 0x5F '_'
+ { 6680, 7, 7, 16, 8, -35 }, // 0x60 '`'
+ { 6687, 25, 26, 26, 2, -24 }, // 0x61 'a'
+ { 6769, 27, 35, 29, 3, -33 }, // 0x62 'b'
+ { 6888, 25, 26, 26, 4, -24 }, // 0x63 'c'
+ { 6970, 29, 35, 29, 4, -33 }, // 0x64 'd'
+ { 7097, 25, 26, 26, 3, -24 }, // 0x65 'e'
+ { 7179, 18, 34, 16, 4, -33 }, // 0x66 'f'
+ { 7256, 29, 35, 29, 2, -24 }, // 0x67 'g'
+ { 7383, 27, 34, 29, 3, -33 }, // 0x68 'h'
+ { 7498, 14, 34, 13, 3, -33 }, // 0x69 'i'
+ { 7558, 19, 44, 13, -2, -33 }, // 0x6A 'j'
+ { 7663, 28, 34, 26, 3, -33 }, // 0x6B 'k'
+ { 7782, 14, 34, 13, 3, -33 }, // 0x6C 'l'
+ { 7842, 40, 25, 42, 3, -24 }, // 0x6D 'm'
+ { 7967, 27, 25, 29, 3, -24 }, // 0x6E 'n'
+ { 8052, 26, 26, 29, 4, -24 }, // 0x6F 'o'
+ { 8137, 29, 35, 29, 1, -24 }, // 0x70 'p'
+ { 8264, 28, 35, 29, 3, -24 }, // 0x71 'q'
+ { 8387, 20, 25, 18, 3, -24 }, // 0x72 'r'
+ { 8450, 24, 26, 26, 3, -24 }, // 0x73 's'
+ { 8528, 14, 32, 16, 5, -30 }, // 0x74 't'
+ { 8584, 27, 26, 29, 4, -24 }, // 0x75 'u'
+ { 8672, 25, 25, 26, 6, -24 }, // 0x76 'v'
+ { 8751, 35, 25, 37, 6, -24 }, // 0x77 'w'
+ { 8861, 29, 25, 26, 1, -24 }, // 0x78 'x'
+ { 8952, 29, 35, 26, 2, -24 }, // 0x79 'y'
+ { 9079, 26, 25, 23, 1, -24 }, // 0x7A 'z'
+ { 9161, 18, 43, 18, 4, -33 }, // 0x7B '{'
+ { 9258, 13, 43, 13, 3, -33 }, // 0x7C '|'
+ { 9328, 18, 43, 18, 2, -33 }, // 0x7D '}'
+ { 9425, 22, 8, 27, 5, -14 } }; // 0x7E '~'
+
+const GFXfont FreeSansBoldOblique24pt7b PROGMEM = {
+ (uint8_t *)FreeSansBoldOblique24pt7bBitmaps,
+ (GFXglyph *)FreeSansBoldOblique24pt7bGlyphs,
+ 0x20, 0x7E, 56 };
+
+// Approx. 10119 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBoldOblique9pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBoldOblique9pt7b.h
new file mode 100644
index 000000000000..6250aca3e6ce
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansBoldOblique9pt7b.h
@@ -0,0 +1,227 @@
+const uint8_t FreeSansBoldOblique9pt7bBitmaps[] PROGMEM = {
+ 0x21, 0x8E, 0x73, 0x18, 0xC6, 0x21, 0x19, 0xCE, 0x00, 0xEF, 0xDF, 0xBE,
+ 0x68, 0x80, 0x06, 0xC1, 0x99, 0xFF, 0xBF, 0xF1, 0xB0, 0x66, 0x0C, 0xC7,
+ 0xFC, 0xFF, 0x8C, 0x83, 0x30, 0x64, 0x00, 0x02, 0x00, 0xF0, 0x7F, 0x1D,
+ 0x73, 0xEE, 0x78, 0x0F, 0x00, 0xF8, 0x0F, 0xC1, 0xBB, 0xA7, 0x74, 0xEF,
+ 0xF8, 0xFE, 0x04, 0x00, 0x80, 0x3C, 0x11, 0xF8, 0x8E, 0x66, 0x31, 0x90,
+ 0xCE, 0x83, 0xF4, 0x07, 0xB0, 0x00, 0x9E, 0x04, 0xFC, 0x26, 0x31, 0x98,
+ 0xC4, 0x7E, 0x20, 0xF0, 0x07, 0x80, 0xFC, 0x1D, 0xC1, 0xDC, 0x1F, 0x80,
+ 0xE0, 0x3E, 0x37, 0x77, 0xE3, 0xEE, 0x3C, 0xE3, 0xCF, 0xFE, 0x3C, 0xE0,
+ 0xFF, 0xE8, 0x06, 0x06, 0x0C, 0x18, 0x38, 0x30, 0x70, 0x60, 0xE0, 0xE0,
+ 0xE0, 0xE0, 0xE0, 0xE0, 0x60, 0x70, 0x30, 0x0C, 0x0E, 0x06, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x07, 0x06, 0x0E, 0x0C, 0x1C, 0x18, 0x30, 0x60, 0x60,
+ 0x32, 0xBF, 0x9C, 0xD2, 0x40, 0x0C, 0x06, 0x07, 0x1F, 0xFF, 0xF0, 0xC0,
+ 0xE0, 0x60, 0x77, 0x72, 0x6C, 0xFF, 0xC0, 0xFC, 0x02, 0x02, 0x04, 0x04,
+ 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x0F, 0x07, 0xE3,
+ 0x9D, 0xC7, 0x71, 0xDC, 0x7E, 0x1F, 0x8E, 0xE3, 0xB8, 0xEE, 0x73, 0xF8,
+ 0x3C, 0x00, 0x04, 0x3B, 0xF7, 0xE1, 0xC3, 0x06, 0x1C, 0x38, 0x70, 0xC1,
+ 0x87, 0x00, 0x0F, 0x87, 0xFC, 0xE3, 0xB8, 0x70, 0x0E, 0x03, 0x80, 0xF0,
+ 0x38, 0x1E, 0x07, 0x01, 0xC0, 0x7F, 0xCF, 0xF8, 0x0F, 0xC7, 0xFC, 0xE3,
+ 0xB8, 0x70, 0x1C, 0x0F, 0x03, 0xF0, 0x0E, 0x01, 0xDC, 0x3B, 0x8E, 0x7F,
+ 0x83, 0xE0, 0x03, 0xC0, 0xE0, 0x58, 0x2E, 0x13, 0x8C, 0xE6, 0x33, 0xFE,
+ 0xFF, 0x81, 0xC0, 0x60, 0x18, 0x0F, 0xE3, 0xFC, 0x60, 0x0C, 0x03, 0x78,
+ 0x7F, 0x9C, 0x70, 0x0E, 0x01, 0xDC, 0x33, 0x8E, 0x7F, 0x83, 0xE0, 0x0F,
+ 0x07, 0xE3, 0x9D, 0xC0, 0x7F, 0x1F, 0xEF, 0x3B, 0x8E, 0xE3, 0xB8, 0xCE,
+ 0x71, 0xF8, 0x3C, 0x00, 0x7F, 0xDF, 0xF0, 0x18, 0x0C, 0x06, 0x03, 0x81,
+ 0xC0, 0x60, 0x38, 0x0C, 0x07, 0x01, 0x80, 0x60, 0x00, 0x0F, 0x83, 0xFC,
+ 0xE3, 0x9C, 0x73, 0x9C, 0x3F, 0x0F, 0xE3, 0x8E, 0xE1, 0xDC, 0x3B, 0x8E,
+ 0x7F, 0xC3, 0xE0, 0x0F, 0x83, 0xF8, 0xE3, 0xB8, 0x77, 0x0E, 0xE1, 0xDC,
+ 0x7B, 0xFE, 0x3D, 0xC0, 0x33, 0x8E, 0x7F, 0x87, 0xC0, 0x77, 0x00, 0x00,
+ 0x0E, 0xE0, 0x39, 0xC0, 0x00, 0x01, 0xCE, 0x71, 0x19, 0x80, 0x00, 0x00,
+ 0x70, 0xFD, 0xF8, 0x70, 0x3F, 0x03, 0xF8, 0x1E, 0x01, 0x80, 0x7F, 0xDF,
+ 0xF0, 0x00, 0x00, 0xFF, 0xBF, 0xE0, 0x60, 0x1E, 0x07, 0xF0, 0x3F, 0x03,
+ 0x87, 0xEF, 0xC3, 0x80, 0x00, 0x00, 0x1F, 0x1F, 0xFE, 0x1F, 0x87, 0x01,
+ 0xC0, 0xE0, 0x70, 0x78, 0x3C, 0x0E, 0x00, 0x00, 0xE0, 0x38, 0x00, 0x00,
+ 0xFC, 0x00, 0xFF, 0xC0, 0xF0, 0x78, 0x70, 0x07, 0x38, 0x01, 0xCC, 0x3F,
+ 0x36, 0x31, 0x8D, 0x98, 0x63, 0xC4, 0x11, 0xF3, 0x0C, 0x6C, 0xC6, 0x73,
+ 0x3E, 0xF8, 0xE7, 0x3C, 0x1E, 0x00, 0x03, 0xFE, 0x00, 0x3F, 0x00, 0x01,
+ 0xE0, 0x0F, 0x00, 0xF8, 0x07, 0xC0, 0x6F, 0x03, 0x38, 0x31, 0xC3, 0x8E,
+ 0x1F, 0xF1, 0xFF, 0x8C, 0x1E, 0xE0, 0x76, 0x03, 0x80, 0x1F, 0xF0, 0xFF,
+ 0xC6, 0x0E, 0x70, 0x73, 0x87, 0x1F, 0xF0, 0xFF, 0x86, 0x0E, 0x70, 0x73,
+ 0x83, 0x9C, 0x38, 0xFF, 0xC7, 0xF8, 0x00, 0x07, 0xE0, 0xFF, 0x8F, 0x1E,
+ 0x70, 0x77, 0x00, 0x30, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x03, 0xBC,
+ 0x38, 0xFF, 0x83, 0xF0, 0x00, 0x1F, 0xE0, 0xFF, 0x86, 0x1E, 0x70, 0x73,
+ 0x83, 0x9C, 0x1C, 0xC0, 0xE6, 0x07, 0x70, 0x73, 0x83, 0x9C, 0x38, 0xFF,
+ 0x8F, 0xF0, 0x00, 0x1F, 0xF8, 0xFF, 0x86, 0x00, 0x70, 0x03, 0x80, 0x1F,
+ 0xF0, 0xFF, 0x86, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xFF, 0xC7, 0xFC,
+ 0x00, 0x1F, 0xF1, 0xFF, 0x18, 0x03, 0x80, 0x38, 0x03, 0xFC, 0x3F, 0xC7,
+ 0x00, 0x70, 0x07, 0x00, 0x70, 0x06, 0x00, 0xE0, 0x00, 0x07, 0xC1, 0xFE,
+ 0x38, 0x77, 0x03, 0x70, 0x0E, 0x00, 0xE1, 0xEE, 0x1E, 0xE0, 0x6E, 0x0E,
+ 0x70, 0xE7, 0xFC, 0x1F, 0x40, 0x1C, 0x1C, 0x60, 0x63, 0x83, 0x8E, 0x0E,
+ 0x38, 0x38, 0xFF, 0xC3, 0xFF, 0x1C, 0x1C, 0x70, 0x71, 0xC1, 0xC6, 0x06,
+ 0x18, 0x38, 0xE0, 0xE0, 0x39, 0xCE, 0x63, 0x39, 0xCE, 0x63, 0x39, 0xCE,
+ 0x00, 0x00, 0xC0, 0x18, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x00, 0xE0, 0x1C,
+ 0xE3, 0x9C, 0x73, 0x9C, 0x7F, 0x87, 0xC0, 0x1C, 0x3C, 0x71, 0xC1, 0x8E,
+ 0x0E, 0x70, 0x3B, 0x80, 0xFC, 0x03, 0xF0, 0x0E, 0xE0, 0x73, 0x81, 0xC7,
+ 0x07, 0x1C, 0x18, 0x38, 0xE0, 0xF0, 0x1C, 0x07, 0x01, 0x80, 0xE0, 0x38,
+ 0x0E, 0x03, 0x80, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xFF, 0x7F, 0x80, 0x1E,
+ 0x1F, 0x1E, 0x1E, 0x3E, 0x1E, 0x3E, 0x3E, 0x36, 0x3E, 0x36, 0x6E, 0x36,
+ 0x6C, 0x76, 0xCC, 0x76, 0xDC, 0x67, 0x9C, 0x67, 0x98, 0xE7, 0x18, 0xE7,
+ 0x18, 0x1C, 0x1C, 0x70, 0x63, 0xE1, 0x8F, 0x8E, 0x3E, 0x38, 0xDC, 0xC3,
+ 0x33, 0x1C, 0xEC, 0x71, 0xF1, 0xC7, 0xC6, 0x1E, 0x18, 0x38, 0xE0, 0xE0,
+ 0x07, 0xC0, 0xFF, 0x8E, 0x1E, 0xE0, 0x77, 0x03, 0xF0, 0x1F, 0x80, 0xFC,
+ 0x07, 0xE0, 0x77, 0x03, 0xBC, 0x38, 0xFF, 0x81, 0xF0, 0x00, 0x1F, 0xF0,
+ 0xFF, 0xC6, 0x0E, 0x70, 0x73, 0x83, 0x9C, 0x38, 0xFF, 0x87, 0xF8, 0x70,
+ 0x03, 0x80, 0x1C, 0x00, 0xC0, 0x0E, 0x00, 0x00, 0x07, 0xC0, 0xFF, 0x8F,
+ 0x1C, 0xE0, 0x77, 0x03, 0xB0, 0x1F, 0x80, 0xFC, 0x06, 0xE1, 0x77, 0x1F,
+ 0x3C, 0x78, 0xFF, 0xC1, 0xF6, 0x00, 0x20, 0x1F, 0xF0, 0xFF, 0xC6, 0x0E,
+ 0x70, 0x73, 0x83, 0x9C, 0x38, 0xFF, 0x87, 0xFC, 0x70, 0x73, 0x83, 0x9C,
+ 0x38, 0xC1, 0xC6, 0x0F, 0x00, 0x07, 0xE0, 0xFF, 0xC7, 0x0E, 0x70, 0x73,
+ 0x80, 0x1F, 0x80, 0x7F, 0x80, 0x7E, 0x00, 0x77, 0x03, 0xBC, 0x38, 0xFF,
+ 0xC3, 0xF8, 0x00, 0xFF, 0xDF, 0xF8, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x06,
+ 0x01, 0xC0, 0x38, 0x07, 0x00, 0xC0, 0x18, 0x07, 0x00, 0x38, 0x31, 0xC1,
+ 0x8C, 0x1C, 0xE0, 0xE7, 0x07, 0x38, 0x31, 0xC3, 0x9C, 0x1C, 0xE0, 0xE7,
+ 0x06, 0x38, 0x70, 0xFF, 0x03, 0xE0, 0x00, 0xE0, 0xFC, 0x1D, 0x87, 0x30,
+ 0xC6, 0x38, 0xC6, 0x19, 0xC3, 0xB0, 0x7E, 0x0F, 0x80, 0xF0, 0x1C, 0x03,
+ 0x00, 0xE1, 0xC3, 0xF1, 0xE3, 0xB8, 0xF1, 0xDC, 0x78, 0xCE, 0x6C, 0xE7,
+ 0x36, 0x63, 0xB3, 0x70, 0xD9, 0xB0, 0x7C, 0xD8, 0x3C, 0x78, 0x1E, 0x3C,
+ 0x0E, 0x1C, 0x07, 0x0E, 0x00, 0x0E, 0x1C, 0x38, 0xE0, 0xE7, 0x01, 0xD8,
+ 0x07, 0xE0, 0x0F, 0x00, 0x38, 0x01, 0xE0, 0x0F, 0xC0, 0x77, 0x01, 0x8E,
+ 0x0E, 0x38, 0x70, 0xF0, 0xE0, 0xEE, 0x39, 0xC7, 0x39, 0xC3, 0x70, 0x7C,
+ 0x0F, 0x80, 0xE0, 0x1C, 0x03, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x3F, 0xF3,
+ 0xFF, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x3C, 0x07,
+ 0x80, 0x70, 0x0F, 0xFC, 0xFF, 0xC0, 0x0F, 0x0F, 0x0C, 0x1C, 0x18, 0x18,
+ 0x18, 0x18, 0x30, 0x30, 0x30, 0x30, 0x60, 0x60, 0x60, 0x78, 0x78, 0x12,
+ 0x4C, 0x92, 0x49, 0x26, 0xD9, 0x20, 0x1E, 0x1E, 0x06, 0x06, 0x06, 0x0C,
+ 0x0C, 0x0C, 0x0C, 0x18, 0x18, 0x18, 0x18, 0x38, 0x30, 0xF0, 0xF0, 0x06,
+ 0x0E, 0x0E, 0x1B, 0x33, 0x33, 0x63, 0x63, 0xFF, 0xE0, 0xCC, 0x1F, 0x8F,
+ 0xF3, 0x1C, 0x06, 0x1F, 0x9F, 0xEE, 0x3B, 0x9C, 0xFF, 0x1D, 0xC0, 0x18,
+ 0x03, 0x00, 0xE0, 0x1D, 0xC3, 0xFC, 0x71, 0xDC, 0x3B, 0x87, 0x70, 0xEE,
+ 0x39, 0xCF, 0x7F, 0xCF, 0xE0, 0x0F, 0x0F, 0xF7, 0x1D, 0xC0, 0xE0, 0x38,
+ 0x0E, 0x03, 0x8E, 0x7F, 0x0F, 0x80, 0x00, 0x60, 0x06, 0x00, 0x61, 0xEE,
+ 0x3F, 0xE7, 0x9C, 0x71, 0xCE, 0x1C, 0xE1, 0xCE, 0x1C, 0xE3, 0x87, 0xF8,
+ 0x7F, 0x80, 0x1F, 0x0F, 0xE7, 0x1D, 0xC7, 0xFF, 0xFF, 0xFE, 0x03, 0x8E,
+ 0x7F, 0x0F, 0x80, 0x1C, 0xF3, 0x3F, 0xFD, 0xC7, 0x18, 0x63, 0x8E, 0x30,
+ 0xC0, 0x0F, 0x71, 0xFE, 0x3C, 0xE3, 0x8E, 0x70, 0xE7, 0x0E, 0x70, 0xC7,
+ 0x1C, 0x3F, 0xC3, 0xFC, 0x01, 0xCE, 0x38, 0x7F, 0x03, 0xE0, 0x18, 0x03,
+ 0x00, 0xE0, 0x1D, 0xE3, 0xFE, 0x71, 0xCC, 0x3B, 0x86, 0x70, 0xCC, 0x39,
+ 0x87, 0x30, 0xEE, 0x18, 0x39, 0xC0, 0x63, 0x39, 0xCE, 0x63, 0x39, 0xCE,
+ 0x00, 0x06, 0x06, 0x00, 0x0E, 0x0E, 0x0C, 0x0C, 0x1C, 0x1C, 0x1C, 0x18,
+ 0x18, 0x38, 0x38, 0x30, 0x70, 0xE0, 0x18, 0x03, 0x00, 0xE0, 0x1C, 0xE3,
+ 0x38, 0x6E, 0x1F, 0x83, 0xF0, 0x7E, 0x0E, 0xE1, 0x9C, 0x73, 0x8E, 0x38,
+ 0x39, 0xCE, 0x63, 0x39, 0xCE, 0x63, 0x39, 0xCE, 0x00, 0x3B, 0x9E, 0x3F,
+ 0xFF, 0x39, 0xC7, 0x71, 0xC6, 0x71, 0x86, 0x71, 0x8E, 0x63, 0x8E, 0x63,
+ 0x8C, 0xE3, 0x8C, 0xE3, 0x1C, 0x3B, 0xC7, 0xFC, 0xE3, 0xB8, 0x77, 0x0C,
+ 0xE1, 0x98, 0x73, 0x0E, 0xE1, 0xDC, 0x30, 0x0F, 0x87, 0xF9, 0xE7, 0xB8,
+ 0x7E, 0x0F, 0xC1, 0xF8, 0x77, 0x9E, 0x7F, 0x87, 0xC0, 0x1D, 0xE1, 0xFE,
+ 0x1C, 0x73, 0x87, 0x38, 0x73, 0x87, 0x38, 0xE3, 0x8E, 0x7F, 0xC7, 0xF8,
+ 0x60, 0x06, 0x00, 0x60, 0x0E, 0x00, 0x1E, 0xE7, 0xFD, 0xE7, 0x38, 0xEE,
+ 0x1D, 0xC3, 0xB8, 0x77, 0x1C, 0x7F, 0x8F, 0xF0, 0x0E, 0x01, 0x80, 0x30,
+ 0x06, 0x00, 0x3B, 0x36, 0x38, 0x70, 0x70, 0x70, 0x60, 0x60, 0xE0, 0xE0,
+ 0x3E, 0x3F, 0xF8, 0xFC, 0x0F, 0xC3, 0xF8, 0x3D, 0x8E, 0xFE, 0x3E, 0x00,
+ 0x38, 0xCF, 0xFE, 0x71, 0x86, 0x38, 0xE3, 0x8F, 0x3C, 0x31, 0xDC, 0x77,
+ 0x19, 0x86, 0x63, 0xB8, 0xEE, 0x33, 0x9C, 0xFF, 0x1F, 0xC0, 0xE1, 0x98,
+ 0xE6, 0x31, 0x9C, 0x66, 0x1B, 0x86, 0xC1, 0xF0, 0x78, 0x0E, 0x00, 0xE7,
+ 0x1B, 0x9C, 0xEE, 0x73, 0x3B, 0xDC, 0xEB, 0x63, 0xAD, 0x8F, 0xBC, 0x1C,
+ 0xF0, 0x73, 0xC1, 0xCE, 0x00, 0x1C, 0xE1, 0xCC, 0x0D, 0x80, 0xF8, 0x0F,
+ 0x00, 0xF0, 0x1F, 0x03, 0xB8, 0x33, 0x87, 0x38, 0x70, 0xCE, 0x38, 0xC6,
+ 0x19, 0xC3, 0x30, 0x66, 0x0F, 0x81, 0xF0, 0x3C, 0x03, 0x80, 0x60, 0x18,
+ 0x0F, 0x01, 0xC0, 0x00, 0x1F, 0xCF, 0xF0, 0x38, 0x1C, 0x0E, 0x07, 0x03,
+ 0x81, 0xC0, 0x7F, 0xBF, 0xE0, 0x0E, 0x38, 0x61, 0x83, 0x06, 0x0C, 0x78,
+ 0xF0, 0xC1, 0x83, 0x0E, 0x1C, 0x38, 0x78, 0x70, 0x18, 0xC4, 0x21, 0x18,
+ 0xC4, 0x21, 0x18, 0xC4, 0x23, 0x18, 0x80, 0x1C, 0x3C, 0x38, 0x70, 0xE1,
+ 0x83, 0x06, 0x1E, 0x5C, 0x60, 0xC1, 0x83, 0x0C, 0x38, 0xE0, 0x71, 0x8E };
+
+const GFXglyph FreeSansBoldOblique9pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 5, 0, 1 }, // 0x20 ' '
+ { 0, 5, 13, 6, 2, -12 }, // 0x21 '!'
+ { 9, 7, 5, 9, 3, -12 }, // 0x22 '"'
+ { 14, 11, 12, 10, 1, -11 }, // 0x23 '#'
+ { 31, 11, 16, 10, 1, -13 }, // 0x24 '$'
+ { 53, 14, 13, 16, 2, -12 }, // 0x25 '%'
+ { 76, 12, 13, 13, 2, -12 }, // 0x26 '&'
+ { 96, 3, 5, 4, 3, -12 }, // 0x27 '''
+ { 98, 8, 17, 6, 2, -12 }, // 0x28 '('
+ { 115, 8, 17, 6, -2, -13 }, // 0x29 ')'
+ { 132, 6, 6, 7, 3, -12 }, // 0x2A '*'
+ { 137, 9, 8, 11, 2, -7 }, // 0x2B '+'
+ { 146, 4, 6, 5, 0, -2 }, // 0x2C ','
+ { 149, 5, 2, 6, 1, -5 }, // 0x2D '-'
+ { 151, 3, 2, 5, 1, -1 }, // 0x2E '.'
+ { 152, 8, 13, 5, 0, -12 }, // 0x2F '/'
+ { 165, 10, 13, 10, 1, -12 }, // 0x30 '0'
+ { 182, 7, 13, 10, 3, -12 }, // 0x31 '1'
+ { 194, 11, 13, 10, 1, -12 }, // 0x32 '2'
+ { 212, 11, 13, 10, 1, -12 }, // 0x33 '3'
+ { 230, 10, 12, 10, 1, -11 }, // 0x34 '4'
+ { 245, 11, 13, 10, 1, -12 }, // 0x35 '5'
+ { 263, 10, 13, 10, 2, -12 }, // 0x36 '6'
+ { 280, 10, 13, 10, 2, -12 }, // 0x37 '7'
+ { 297, 11, 13, 10, 1, -12 }, // 0x38 '8'
+ { 315, 11, 13, 10, 1, -12 }, // 0x39 '9'
+ { 333, 4, 9, 6, 2, -8 }, // 0x3A ':'
+ { 338, 5, 12, 6, 1, -8 }, // 0x3B ';'
+ { 346, 10, 9, 11, 1, -8 }, // 0x3C '<'
+ { 358, 10, 6, 11, 1, -6 }, // 0x3D '='
+ { 366, 10, 9, 11, 1, -7 }, // 0x3E '>'
+ { 378, 10, 13, 11, 3, -12 }, // 0x3F '?'
+ { 395, 18, 16, 18, 1, -13 }, // 0x40 '@'
+ { 431, 13, 13, 13, 0, -12 }, // 0x41 'A'
+ { 453, 13, 13, 13, 1, -12 }, // 0x42 'B'
+ { 475, 13, 13, 13, 2, -12 }, // 0x43 'C'
+ { 497, 13, 13, 13, 1, -12 }, // 0x44 'D'
+ { 519, 13, 13, 12, 1, -12 }, // 0x45 'E'
+ { 541, 12, 13, 11, 1, -12 }, // 0x46 'F'
+ { 561, 12, 13, 14, 2, -12 }, // 0x47 'G'
+ { 581, 14, 13, 13, 1, -12 }, // 0x48 'H'
+ { 604, 5, 13, 5, 1, -12 }, // 0x49 'I'
+ { 613, 11, 13, 10, 1, -12 }, // 0x4A 'J'
+ { 631, 14, 13, 13, 1, -12 }, // 0x4B 'K'
+ { 654, 10, 13, 11, 1, -12 }, // 0x4C 'L'
+ { 671, 16, 13, 15, 1, -12 }, // 0x4D 'M'
+ { 697, 14, 13, 13, 1, -12 }, // 0x4E 'N'
+ { 720, 13, 13, 14, 2, -12 }, // 0x4F 'O'
+ { 742, 13, 13, 12, 1, -12 }, // 0x50 'P'
+ { 764, 13, 14, 14, 2, -12 }, // 0x51 'Q'
+ { 787, 13, 13, 13, 1, -12 }, // 0x52 'R'
+ { 809, 13, 13, 12, 1, -12 }, // 0x53 'S'
+ { 831, 11, 13, 11, 3, -12 }, // 0x54 'T'
+ { 849, 13, 13, 13, 2, -12 }, // 0x55 'U'
+ { 871, 11, 13, 12, 3, -12 }, // 0x56 'V'
+ { 889, 17, 13, 17, 3, -12 }, // 0x57 'W'
+ { 917, 14, 13, 12, 0, -12 }, // 0x58 'X'
+ { 940, 11, 13, 12, 3, -12 }, // 0x59 'Y'
+ { 958, 12, 13, 11, 1, -12 }, // 0x5A 'Z'
+ { 978, 8, 17, 6, 0, -12 }, // 0x5B '['
+ { 995, 3, 17, 5, 2, -16 }, // 0x5C '\'
+ { 1002, 8, 17, 6, 0, -13 }, // 0x5D ']'
+ { 1019, 8, 8, 11, 2, -12 }, // 0x5E '^'
+ { 1027, 11, 1, 10, -1, 4 }, // 0x5F '_'
+ { 1029, 3, 2, 6, 3, -12 }, // 0x60 '`'
+ { 1030, 10, 10, 10, 1, -9 }, // 0x61 'a'
+ { 1043, 11, 13, 11, 1, -12 }, // 0x62 'b'
+ { 1061, 10, 10, 10, 1, -9 }, // 0x63 'c'
+ { 1074, 12, 13, 11, 1, -12 }, // 0x64 'd'
+ { 1094, 10, 10, 10, 1, -9 }, // 0x65 'e'
+ { 1107, 6, 13, 6, 2, -12 }, // 0x66 'f'
+ { 1117, 12, 14, 11, 0, -9 }, // 0x67 'g'
+ { 1138, 11, 13, 11, 1, -12 }, // 0x68 'h'
+ { 1156, 5, 13, 5, 1, -12 }, // 0x69 'i'
+ { 1165, 8, 17, 5, -1, -12 }, // 0x6A 'j'
+ { 1182, 11, 13, 10, 1, -12 }, // 0x6B 'k'
+ { 1200, 5, 13, 5, 1, -12 }, // 0x6C 'l'
+ { 1209, 16, 10, 16, 1, -9 }, // 0x6D 'm'
+ { 1229, 11, 10, 11, 1, -9 }, // 0x6E 'n'
+ { 1243, 11, 10, 11, 1, -9 }, // 0x6F 'o'
+ { 1257, 12, 14, 11, 0, -9 }, // 0x70 'p'
+ { 1278, 11, 14, 11, 1, -9 }, // 0x71 'q'
+ { 1298, 8, 10, 7, 1, -9 }, // 0x72 'r'
+ { 1308, 9, 10, 10, 2, -9 }, // 0x73 's'
+ { 1320, 6, 12, 6, 2, -11 }, // 0x74 't'
+ { 1329, 10, 10, 11, 2, -9 }, // 0x75 'u'
+ { 1342, 10, 10, 10, 2, -9 }, // 0x76 'v'
+ { 1355, 14, 10, 14, 2, -9 }, // 0x77 'w'
+ { 1373, 12, 10, 10, 0, -9 }, // 0x78 'x'
+ { 1388, 11, 14, 10, 1, -9 }, // 0x79 'y'
+ { 1408, 10, 10, 9, 0, -9 }, // 0x7A 'z'
+ { 1421, 7, 17, 7, 2, -12 }, // 0x7B '{'
+ { 1436, 5, 17, 5, 1, -12 }, // 0x7C '|'
+ { 1447, 7, 17, 7, 0, -13 }, // 0x7D '}'
+ { 1462, 8, 2, 11, 2, -4 } }; // 0x7E '~'
+
+const GFXfont FreeSansBoldOblique9pt7b PROGMEM = {
+ (uint8_t *)FreeSansBoldOblique9pt7bBitmaps,
+ (GFXglyph *)FreeSansBoldOblique9pt7bGlyphs,
+ 0x20, 0x7E, 22 };
+
+// Approx. 2136 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansOblique12pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansOblique12pt7b.h
new file mode 100644
index 000000000000..efdbd8d11044
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansOblique12pt7b.h
@@ -0,0 +1,302 @@
+const uint8_t FreeSansOblique12pt7bBitmaps[] PROGMEM = {
+ 0x0C, 0x61, 0x86, 0x18, 0x63, 0x0C, 0x30, 0xC2, 0x18, 0x61, 0x00, 0x00,
+ 0xC3, 0x00, 0xCF, 0x3C, 0xE2, 0x8A, 0x20, 0x01, 0x8C, 0x03, 0x18, 0x06,
+ 0x60, 0x18, 0xC0, 0x31, 0x83, 0xFF, 0x87, 0xFF, 0x03, 0x18, 0x0C, 0x60,
+ 0x18, 0xC0, 0x23, 0x03, 0xFF, 0x8F, 0xFF, 0x02, 0x30, 0x0C, 0x60, 0x18,
+ 0x80, 0x63, 0x00, 0xC6, 0x00, 0x00, 0x80, 0x3F, 0x03, 0xFC, 0x32, 0x73,
+ 0x91, 0x99, 0x8C, 0xCC, 0x06, 0x60, 0x3E, 0x00, 0x7E, 0x01, 0xFC, 0x0C,
+ 0xEC, 0x43, 0x62, 0x1B, 0x11, 0x9D, 0x9C, 0x7F, 0xC1, 0xF8, 0x02, 0x00,
+ 0x10, 0x01, 0x80, 0x00, 0x00, 0x01, 0x83, 0xC0, 0x60, 0xFC, 0x18, 0x30,
+ 0xC2, 0x0C, 0x18, 0xC1, 0x83, 0x30, 0x38, 0xCC, 0x03, 0xF1, 0x00, 0x3C,
+ 0x40, 0x00, 0x18, 0xF0, 0x06, 0x3F, 0x01, 0x8C, 0x30, 0x23, 0x06, 0x0C,
+ 0x60, 0xC3, 0x0E, 0x30, 0xC0, 0xFC, 0x10, 0x0F, 0x00, 0x01, 0xE0, 0x3F,
+ 0x81, 0x8C, 0x18, 0x60, 0xC3, 0x06, 0x30, 0x1F, 0x00, 0xE0, 0x1F, 0x01,
+ 0xDC, 0xD8, 0x6D, 0x81, 0xEC, 0x0E, 0x60, 0x73, 0x87, 0xCF, 0xE6, 0x3E,
+ 0x38, 0xFE, 0xA0, 0x03, 0x06, 0x04, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x60,
+ 0x60, 0x60, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x40, 0x60,
+ 0x60, 0x20, 0x04, 0x06, 0x06, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x03, 0x03, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18, 0x30, 0x20, 0x60,
+ 0xC0, 0x0C, 0x0C, 0x49, 0x7F, 0x3C, 0x3C, 0x6C, 0x00, 0x03, 0x00, 0x30,
+ 0x03, 0x00, 0x30, 0xFF, 0xFF, 0xFF, 0x06, 0x00, 0x60, 0x06, 0x00, 0xC0,
+ 0x0C, 0x00, 0x77, 0x22, 0x6C, 0xFF, 0xF0, 0xFC, 0x00, 0x40, 0x30, 0x08,
+ 0x06, 0x01, 0x00, 0xC0, 0x20, 0x18, 0x04, 0x02, 0x00, 0x80, 0x40, 0x10,
+ 0x08, 0x02, 0x01, 0x00, 0xC0, 0x20, 0x00, 0x07, 0xC0, 0xFE, 0x1C, 0x73,
+ 0x83, 0x30, 0x36, 0x03, 0x60, 0x36, 0x03, 0xC0, 0x7C, 0x07, 0xC0, 0x6C,
+ 0x06, 0xC0, 0xEC, 0x0C, 0xE3, 0x87, 0xF0, 0x3E, 0x00, 0x02, 0x0C, 0x77,
+ 0xEF, 0xC1, 0x83, 0x0C, 0x18, 0x30, 0x61, 0xC3, 0x06, 0x0C, 0x18, 0x60,
+ 0x03, 0xF0, 0x1F, 0xE0, 0xE1, 0xC7, 0x03, 0x18, 0x0C, 0x00, 0x30, 0x01,
+ 0x80, 0x0E, 0x00, 0x70, 0x07, 0x80, 0x78, 0x07, 0x80, 0x38, 0x01, 0xC0,
+ 0x06, 0x00, 0x1F, 0xFC, 0xFF, 0xE0, 0x07, 0xC0, 0xFE, 0x1C, 0x73, 0x03,
+ 0x30, 0x30, 0x03, 0x00, 0xE0, 0x7C, 0x07, 0xC0, 0x0E, 0x00, 0x60, 0x06,
+ 0xC0, 0x6C, 0x0C, 0xE1, 0xC7, 0xF8, 0x3E, 0x00, 0x00, 0x60, 0x06, 0x00,
+ 0xE0, 0x1E, 0x03, 0xE0, 0x6C, 0x0C, 0xC1, 0x8C, 0x30, 0xC6, 0x1C, 0xC1,
+ 0x8F, 0xFF, 0xFF, 0xE0, 0x18, 0x03, 0x00, 0x30, 0x03, 0x00, 0x0F, 0xF8,
+ 0x7F, 0xC6, 0x00, 0x30, 0x01, 0x00, 0x1B, 0xC0, 0xFF, 0x06, 0x1C, 0x60,
+ 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x0C, 0x60, 0x63, 0x86, 0x0F, 0xE0,
+ 0x3E, 0x00, 0x03, 0xC0, 0xFE, 0x1C, 0x73, 0x83, 0x30, 0x06, 0x00, 0x67,
+ 0x87, 0xFC, 0xF0, 0xEE, 0x06, 0xC0, 0x6C, 0x06, 0xC0, 0x4C, 0x0C, 0xE1,
+ 0x87, 0xF8, 0x3E, 0x00, 0x3F, 0xFB, 0xFF, 0xC0, 0x0C, 0x00, 0xC0, 0x0C,
+ 0x00, 0xC0, 0x06, 0x00, 0x60, 0x06, 0x00, 0x70, 0x03, 0x00, 0x30, 0x03,
+ 0x80, 0x18, 0x01, 0xC0, 0x0C, 0x00, 0xE0, 0x00, 0x07, 0xC0, 0xFE, 0x1C,
+ 0x73, 0x03, 0x30, 0x33, 0x03, 0x38, 0x61, 0xFC, 0x3F, 0xC7, 0x0E, 0x60,
+ 0x6C, 0x06, 0xC0, 0x6C, 0x0C, 0xE1, 0xC7, 0xF8, 0x3E, 0x00, 0x07, 0xC1,
+ 0xFE, 0x38, 0x73, 0x03, 0x60, 0x36, 0x03, 0x60, 0x36, 0x07, 0x70, 0xF3,
+ 0xFE, 0x1E, 0x60, 0x0E, 0x00, 0xCC, 0x1C, 0xE3, 0x87, 0xF0, 0x3C, 0x00,
+ 0x39, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xC0, 0x1C, 0x70, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0x1C, 0x20, 0x86, 0x30, 0x00, 0x00, 0x01, 0xC0,
+ 0x3C, 0x0F, 0x81, 0xE0, 0x7C, 0x03, 0x80, 0x0F, 0x00, 0x1F, 0x00, 0x3E,
+ 0x00, 0x38, 0x00, 0x40, 0x7F, 0xFB, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF,
+ 0x7F, 0xF0, 0x20, 0x01, 0xC0, 0x07, 0xC0, 0x0F, 0x80, 0x0F, 0x00, 0x1C,
+ 0x03, 0xE0, 0x78, 0x1F, 0x03, 0xC0, 0x38, 0x00, 0x00, 0x00, 0x0F, 0x87,
+ 0xF9, 0xC3, 0xB0, 0x3C, 0x06, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x01, 0xC0,
+ 0x30, 0x0C, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00,
+ 0x3F, 0x80, 0x01, 0xFF, 0xE0, 0x0F, 0x01, 0xE0, 0x38, 0x00, 0xE0, 0xE0,
+ 0x00, 0xC3, 0x87, 0x81, 0xCE, 0x1F, 0xB1, 0x98, 0x71, 0xC3, 0x61, 0x83,
+ 0x86, 0xC6, 0x06, 0x0F, 0x0C, 0x0C, 0x3E, 0x30, 0x30, 0x6C, 0x60, 0x61,
+ 0xD8, 0xC1, 0x87, 0x31, 0xC7, 0x1C, 0x61, 0xF7, 0xF0, 0x63, 0xCF, 0x80,
+ 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x7F, 0x00, 0x00,
+ 0x00, 0x38, 0x00, 0x78, 0x00, 0x7C, 0x00, 0xFC, 0x00, 0xDC, 0x01, 0xCC,
+ 0x01, 0x8C, 0x03, 0x8C, 0x03, 0x0C, 0x06, 0x0C, 0x0E, 0x0E, 0x0F, 0xFE,
+ 0x1F, 0xFE, 0x18, 0x06, 0x38, 0x06, 0x30, 0x06, 0x70, 0x06, 0x60, 0x07,
+ 0x0F, 0xF8, 0x1F, 0xF8, 0x60, 0x38, 0xC0, 0x31, 0x80, 0x63, 0x00, 0xCE,
+ 0x03, 0x18, 0x0C, 0x3F, 0xF0, 0x7F, 0xF0, 0xC0, 0x73, 0x00, 0x66, 0x00,
+ 0xCC, 0x01, 0x98, 0x06, 0x70, 0x1C, 0xFF, 0xF1, 0xFF, 0x80, 0x01, 0xF8,
+ 0x07, 0xFE, 0x0E, 0x0E, 0x1C, 0x03, 0x38, 0x03, 0x30, 0x00, 0x60, 0x00,
+ 0x60, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x06,
+ 0xC0, 0x0C, 0xE0, 0x1C, 0x70, 0x78, 0x3F, 0xF0, 0x1F, 0x80, 0x0F, 0xF8,
+ 0x1F, 0xFC, 0x18, 0x0E, 0x18, 0x07, 0x18, 0x03, 0x18, 0x03, 0x38, 0x03,
+ 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x70, 0x06, 0x70, 0x06, 0x60, 0x0C,
+ 0x60, 0x0C, 0x60, 0x18, 0xE0, 0x78, 0xFF, 0xE0, 0xFF, 0x80, 0x0F, 0xFF,
+ 0x1F, 0xFE, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x38, 0x00,
+ 0x30, 0x00, 0x3F, 0xFC, 0x3F, 0xF8, 0x70, 0x00, 0x70, 0x00, 0x60, 0x00,
+ 0x60, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xFF, 0xF8, 0xFF, 0xF8, 0x0F, 0xFE,
+ 0x3F, 0xFC, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x0E, 0x00, 0x18,
+ 0x00, 0x3F, 0xF0, 0x7F, 0xE1, 0xC0, 0x03, 0x80, 0x06, 0x00, 0x0C, 0x00,
+ 0x18, 0x00, 0x70, 0x00, 0xC0, 0x01, 0x80, 0x00, 0x01, 0xF8, 0x07, 0xFE,
+ 0x0E, 0x0F, 0x18, 0x03, 0x30, 0x03, 0x70, 0x00, 0x60, 0x00, 0x60, 0x00,
+ 0xC0, 0x7F, 0xC0, 0x7E, 0xC0, 0x02, 0xC0, 0x06, 0xC0, 0x06, 0xE0, 0x0E,
+ 0x60, 0x1E, 0x78, 0x3C, 0x3F, 0xE4, 0x0F, 0x84, 0x0C, 0x01, 0x8E, 0x00,
+ 0xC6, 0x00, 0xE3, 0x00, 0x61, 0x80, 0x30, 0xC0, 0x18, 0xE0, 0x0C, 0x60,
+ 0x0E, 0x3F, 0xFE, 0x1F, 0xFF, 0x1C, 0x01, 0x8E, 0x01, 0xC6, 0x00, 0xE3,
+ 0x00, 0x61, 0x80, 0x31, 0xC0, 0x18, 0xC0, 0x1C, 0x60, 0x0C, 0x00, 0x0C,
+ 0x71, 0x86, 0x18, 0x63, 0x8C, 0x30, 0xC3, 0x1C, 0x61, 0x86, 0x18, 0xE3,
+ 0x00, 0x00, 0x18, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x38, 0x01,
+ 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x38, 0x01, 0x8C, 0x0C, 0x60, 0x63,
+ 0x07, 0x1C, 0x70, 0x7F, 0x01, 0xF0, 0x00, 0x0C, 0x03, 0x87, 0x01, 0xC1,
+ 0x80, 0xE0, 0x60, 0x60, 0x18, 0x70, 0x06, 0x38, 0x03, 0x9C, 0x00, 0xCE,
+ 0x00, 0x37, 0x80, 0x0F, 0x70, 0x07, 0x8C, 0x01, 0xC3, 0x80, 0x60, 0x60,
+ 0x18, 0x1C, 0x06, 0x03, 0x03, 0x80, 0xE0, 0xC0, 0x18, 0x30, 0x07, 0x00,
+ 0x0C, 0x03, 0x80, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x0E, 0x01, 0x80, 0x30,
+ 0x06, 0x01, 0xC0, 0x38, 0x06, 0x00, 0xC0, 0x18, 0x07, 0x00, 0xFF, 0xFF,
+ 0xFC, 0x0E, 0x00, 0x71, 0xE0, 0x0F, 0x1E, 0x00, 0xF1, 0xE0, 0x1E, 0x1E,
+ 0x01, 0xE1, 0xE0, 0x36, 0x3B, 0x03, 0x63, 0x30, 0x6E, 0x33, 0x0E, 0xC3,
+ 0x30, 0xCC, 0x33, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x31, 0xC6, 0x33, 0x18,
+ 0x61, 0xE1, 0x8E, 0x1E, 0x18, 0xC1, 0xC1, 0x8C, 0x1C, 0x38, 0x0C, 0x01,
+ 0x8F, 0x00, 0xC7, 0x80, 0x63, 0xE0, 0x71, 0xF0, 0x30, 0xD8, 0x18, 0xEE,
+ 0x0C, 0x63, 0x06, 0x31, 0xC7, 0x18, 0xE3, 0x0C, 0x31, 0x8C, 0x1C, 0xC6,
+ 0x06, 0x63, 0x03, 0xF1, 0x80, 0xF1, 0xC0, 0x78, 0xC0, 0x3C, 0x60, 0x0E,
+ 0x00, 0x01, 0xF8, 0x03, 0xFF, 0x03, 0x83, 0xC3, 0x80, 0x63, 0x00, 0x3B,
+ 0x80, 0x0D, 0x80, 0x06, 0xC0, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00,
+ 0xF8, 0x00, 0x6C, 0x00, 0x36, 0x00, 0x31, 0x80, 0x30, 0xF0, 0x78, 0x3F,
+ 0xF0, 0x07, 0xE0, 0x00, 0x0F, 0xF8, 0x3F, 0xF8, 0x60, 0x38, 0xC0, 0x31,
+ 0x80, 0x63, 0x00, 0xCE, 0x03, 0x18, 0x0E, 0x3F, 0xF8, 0x7F, 0xE1, 0xC0,
+ 0x03, 0x80, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x70, 0x00, 0xC0, 0x01,
+ 0x80, 0x00, 0x00, 0xFC, 0x01, 0xFF, 0xC0, 0xF0, 0x78, 0x70, 0x06, 0x38,
+ 0x01, 0xCC, 0x00, 0x36, 0x00, 0x0D, 0x80, 0x03, 0xC0, 0x00, 0xF0, 0x00,
+ 0x3C, 0x00, 0x1B, 0x00, 0x06, 0xC0, 0x03, 0x38, 0x1D, 0xC6, 0x03, 0xE1,
+ 0xE0, 0xF0, 0x3F, 0xFE, 0x03, 0xF1, 0xC0, 0x00, 0x20, 0x0F, 0xFC, 0x1F,
+ 0xFE, 0x18, 0x07, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x38, 0x06, 0x30,
+ 0x0C, 0x3F, 0xF8, 0x3F, 0xF8, 0x70, 0x1C, 0x70, 0x0C, 0x60, 0x0C, 0x60,
+ 0x0C, 0x60, 0x18, 0xE0, 0x18, 0xC0, 0x18, 0xC0, 0x1C, 0x03, 0xF8, 0x1F,
+ 0xF8, 0x70, 0x38, 0xC0, 0x33, 0x00, 0x66, 0x00, 0x0C, 0x00, 0x1E, 0x00,
+ 0x1F, 0xC0, 0x0F, 0xF0, 0x01, 0xF0, 0x00, 0xEC, 0x00, 0xD8, 0x01, 0xB0,
+ 0x06, 0x70, 0x38, 0x7F, 0xE0, 0x3F, 0x00, 0xFF, 0xFF, 0xFF, 0xF0, 0x70,
+ 0x01, 0xC0, 0x06, 0x00, 0x18, 0x00, 0x60, 0x03, 0x80, 0x0C, 0x00, 0x30,
+ 0x00, 0xC0, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x01, 0x80, 0x06, 0x00, 0x18,
+ 0x00, 0xE0, 0x00, 0x18, 0x03, 0x38, 0x03, 0x30, 0x07, 0x30, 0x06, 0x30,
+ 0x06, 0x70, 0x06, 0x70, 0x0E, 0x60, 0x0C, 0x60, 0x0C, 0x60, 0x0C, 0xE0,
+ 0x0C, 0xC0, 0x1C, 0xC0, 0x18, 0xC0, 0x18, 0xC0, 0x38, 0xE0, 0x70, 0x7F,
+ 0xE0, 0x1F, 0x80, 0xC0, 0x0F, 0xC0, 0x1B, 0x80, 0x73, 0x00, 0xC6, 0x03,
+ 0x0C, 0x06, 0x18, 0x18, 0x30, 0x70, 0x60, 0xC0, 0xE3, 0x81, 0xC6, 0x01,
+ 0x9C, 0x03, 0x30, 0x06, 0xE0, 0x0D, 0x80, 0x1E, 0x00, 0x3C, 0x00, 0x70,
+ 0x00, 0xC0, 0x70, 0x1F, 0x01, 0xC0, 0x6C, 0x0F, 0x03, 0xB0, 0x3C, 0x0C,
+ 0xC1, 0xF0, 0x73, 0x06, 0xC1, 0x8C, 0x3B, 0x06, 0x30, 0xC6, 0x30, 0xC7,
+ 0x18, 0xC3, 0x18, 0x67, 0x0C, 0xE1, 0x98, 0x33, 0x06, 0xE0, 0xDC, 0x1B,
+ 0x03, 0x60, 0x6C, 0x07, 0x81, 0xE0, 0x1C, 0x07, 0x80, 0x70, 0x1C, 0x01,
+ 0x80, 0x70, 0x00, 0x07, 0x00, 0xE0, 0xE0, 0x38, 0x0C, 0x0E, 0x01, 0xC3,
+ 0x80, 0x18, 0xE0, 0x03, 0x98, 0x00, 0x36, 0x00, 0x07, 0x80, 0x00, 0xF0,
+ 0x00, 0x1E, 0x00, 0x07, 0xC0, 0x01, 0xDC, 0x00, 0x73, 0x80, 0x1C, 0x30,
+ 0x03, 0x07, 0x00, 0xC0, 0x60, 0x38, 0x0E, 0x0E, 0x00, 0xC0, 0xE0, 0x06,
+ 0x60, 0x0C, 0x70, 0x1C, 0x70, 0x38, 0x30, 0x70, 0x38, 0x60, 0x18, 0xC0,
+ 0x1D, 0xC0, 0x1F, 0x80, 0x0F, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00,
+ 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x0F, 0xFF,
+ 0x87, 0xFF, 0x80, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01,
+ 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01,
+ 0xC0, 0x01, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xFF, 0xF8, 0x7F, 0xFC,
+ 0x00, 0x07, 0xC1, 0xE0, 0x60, 0x18, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x1C,
+ 0x06, 0x01, 0x80, 0x60, 0x18, 0x0E, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x06,
+ 0x01, 0x80, 0x60, 0x1E, 0x07, 0x80, 0x93, 0x6C, 0x92, 0x49, 0x24, 0xDB,
+ 0x24, 0x07, 0x81, 0xE0, 0x18, 0x06, 0x01, 0x80, 0xC0, 0x30, 0x0C, 0x03,
+ 0x01, 0xC0, 0x60, 0x18, 0x06, 0x01, 0x80, 0xE0, 0x30, 0x0C, 0x03, 0x00,
+ 0xC0, 0x60, 0x18, 0x1E, 0x0F, 0x80, 0x03, 0x01, 0xC0, 0xD8, 0x36, 0x19,
+ 0x84, 0x63, 0x19, 0x83, 0x60, 0xC0, 0xFF, 0xFC, 0xE6, 0x23, 0x07, 0xC3,
+ 0xFC, 0xE3, 0x98, 0x30, 0x06, 0x01, 0x87, 0xF3, 0xC6, 0xC0, 0xD8, 0x3B,
+ 0x0E, 0x7F, 0x77, 0xCC, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x30, 0x01, 0x80,
+ 0x0C, 0xF0, 0x7F, 0xC3, 0x87, 0x38, 0x19, 0x80, 0xCC, 0x06, 0x60, 0x32,
+ 0x03, 0xB0, 0x19, 0xC1, 0xCE, 0x1C, 0x7F, 0xC3, 0x7C, 0x00, 0x0F, 0x83,
+ 0xF8, 0xE3, 0xB8, 0x36, 0x07, 0xC0, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x1B,
+ 0x86, 0x3F, 0xC3, 0xE0, 0x00, 0x0C, 0x00, 0x60, 0x01, 0x80, 0x06, 0x00,
+ 0x18, 0x3E, 0x61, 0xFF, 0x0E, 0x3C, 0x70, 0x71, 0x80, 0xCE, 0x07, 0x30,
+ 0x18, 0xC0, 0x63, 0x01, 0x8C, 0x0E, 0x38, 0x78, 0x7F, 0xC0, 0xFB, 0x00,
+ 0x07, 0xC1, 0xFE, 0x38, 0x77, 0x03, 0x60, 0x37, 0xFF, 0xFF, 0xFC, 0x00,
+ 0xC0, 0x0C, 0x06, 0xE1, 0xC7, 0xF8, 0x3E, 0x00, 0x07, 0x0F, 0x1C, 0x18,
+ 0x18, 0x7E, 0x7E, 0x30, 0x30, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60,
+ 0xC0, 0xC0, 0x03, 0xCC, 0x3F, 0xA1, 0xC7, 0x8E, 0x0E, 0x30, 0x38, 0xC0,
+ 0xC6, 0x03, 0x18, 0x0C, 0x60, 0x71, 0x81, 0xC7, 0x0E, 0x0F, 0xF8, 0x1E,
+ 0x60, 0x03, 0x80, 0x0C, 0x30, 0x70, 0x7F, 0x80, 0xF8, 0x00, 0x0C, 0x00,
+ 0xC0, 0x0C, 0x01, 0x80, 0x18, 0x01, 0x9E, 0x1F, 0xF1, 0xC7, 0x38, 0x33,
+ 0x03, 0x30, 0x33, 0x07, 0x30, 0x66, 0x06, 0x60, 0x66, 0x06, 0x60, 0xC6,
+ 0x0C, 0x18, 0xC0, 0x00, 0x18, 0xC6, 0x33, 0x18, 0xC6, 0x31, 0x98, 0xC6,
+ 0x00, 0x01, 0x80, 0xC0, 0x00, 0x00, 0x00, 0x18, 0x1C, 0x0C, 0x06, 0x03,
+ 0x01, 0x81, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x18, 0x0C, 0x06, 0x03, 0x03,
+ 0x87, 0x83, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x30, 0x01, 0x80, 0x0C,
+ 0x18, 0x61, 0x83, 0x38, 0x33, 0x81, 0xB8, 0x0F, 0xC0, 0x77, 0x03, 0x18,
+ 0x30, 0xC1, 0x87, 0x0C, 0x18, 0x60, 0xE3, 0x03, 0x00, 0x18, 0xC6, 0x63,
+ 0x18, 0xC6, 0x33, 0x18, 0xC6, 0x31, 0x98, 0xC6, 0x00, 0x1B, 0xE3, 0xC3,
+ 0xFD, 0xFC, 0xF1, 0xE1, 0x9C, 0x18, 0x33, 0x03, 0x06, 0x60, 0xC0, 0xCC,
+ 0x18, 0x3B, 0x83, 0x06, 0x60, 0x60, 0xCC, 0x0C, 0x19, 0x83, 0x03, 0x30,
+ 0x60, 0xE6, 0x0C, 0x18, 0x1B, 0xE1, 0xFF, 0x3C, 0x73, 0x83, 0x30, 0x33,
+ 0x03, 0x30, 0x77, 0x06, 0x60, 0x66, 0x06, 0x60, 0x66, 0x0C, 0x60, 0xC0,
+ 0x07, 0xC1, 0xFE, 0x38, 0x77, 0x03, 0x60, 0x3E, 0x03, 0xC0, 0x3C, 0x06,
+ 0xC0, 0x6C, 0x0E, 0xE1, 0xC7, 0xF8, 0x3E, 0x00, 0x0C, 0xF0, 0x3F, 0xE0,
+ 0xE1, 0xC7, 0x03, 0x1C, 0x0C, 0x60, 0x31, 0x80, 0xCE, 0x07, 0x38, 0x18,
+ 0xE0, 0xE3, 0xC7, 0x0F, 0xF8, 0x77, 0xC1, 0x80, 0x06, 0x00, 0x18, 0x00,
+ 0x60, 0x03, 0x80, 0x00, 0x0F, 0x98, 0xFF, 0xCE, 0x3C, 0xE0, 0xE6, 0x03,
+ 0x70, 0x1B, 0x01, 0x98, 0x0C, 0xC0, 0x66, 0x07, 0x38, 0x78, 0xFF, 0x83,
+ 0xCC, 0x00, 0x60, 0x07, 0x00, 0x38, 0x01, 0x80, 0x0C, 0x00, 0x1B, 0x8F,
+ 0xCF, 0x07, 0x03, 0x01, 0x80, 0xC0, 0xE0, 0x60, 0x30, 0x18, 0x0C, 0x06,
+ 0x00, 0x0F, 0xC1, 0xFF, 0x30, 0x76, 0x03, 0x60, 0x07, 0x80, 0x3F, 0x80,
+ 0x7E, 0x00, 0x6C, 0x06, 0xE0, 0xCF, 0xF8, 0x3E, 0x00, 0x18, 0x30, 0x67,
+ 0xEF, 0xC6, 0x0C, 0x30, 0x60, 0xC1, 0x83, 0x0C, 0x18, 0x3C, 0x38, 0x30,
+ 0x33, 0x03, 0x30, 0x37, 0x06, 0x60, 0x66, 0x06, 0x60, 0x66, 0x06, 0xC0,
+ 0xEC, 0x0C, 0xC3, 0xCF, 0xFC, 0x7C, 0xC0, 0xC0, 0x78, 0x1B, 0x03, 0x60,
+ 0xC6, 0x18, 0xC6, 0x19, 0xC3, 0x30, 0x6C, 0x0D, 0x81, 0xE0, 0x3C, 0x03,
+ 0x00, 0xC1, 0xC3, 0xE1, 0xE1, 0xB0, 0xF0, 0xD8, 0x78, 0xCC, 0x6C, 0x66,
+ 0x36, 0x63, 0x33, 0x30, 0x99, 0xB0, 0x58, 0xD8, 0x2C, 0x78, 0x1C, 0x3C,
+ 0x0E, 0x1C, 0x06, 0x0E, 0x00, 0x0C, 0x1C, 0x30, 0xE0, 0xE3, 0x01, 0x98,
+ 0x07, 0xC0, 0x0E, 0x00, 0x30, 0x01, 0xE0, 0x0F, 0x80, 0x73, 0x01, 0x8C,
+ 0x0C, 0x38, 0x60, 0x60, 0x18, 0x0C, 0x60, 0x61, 0x83, 0x86, 0x0C, 0x1C,
+ 0x60, 0x31, 0x80, 0xCC, 0x03, 0x30, 0x0D, 0x80, 0x36, 0x00, 0xF0, 0x03,
+ 0x80, 0x06, 0x00, 0x30, 0x00, 0xC0, 0x06, 0x00, 0xF0, 0x03, 0x80, 0x00,
+ 0x1F, 0xF1, 0xFF, 0x00, 0x70, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0,
+ 0x18, 0x03, 0x00, 0x60, 0x0F, 0xFC, 0xFF, 0xC0, 0x07, 0x0E, 0x18, 0x18,
+ 0x18, 0x18, 0x30, 0x30, 0x30, 0x30, 0x60, 0xE0, 0xE0, 0x60, 0x60, 0x60,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xF0, 0x60, 0x0C, 0x30, 0x82, 0x08, 0x61,
+ 0x84, 0x10, 0x43, 0x0C, 0x20, 0x86, 0x18, 0x41, 0x04, 0x30, 0xC2, 0x00,
+ 0x00, 0x06, 0x07, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x0C, 0x06, 0x03,
+ 0x01, 0xC0, 0xE0, 0x60, 0x60, 0x30, 0x18, 0x0C, 0x0C, 0x06, 0x03, 0x01,
+ 0x83, 0x83, 0x80, 0x38, 0x0F, 0x82, 0x38, 0x83, 0xE0, 0x38 };
+
+const GFXglyph FreeSansOblique12pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 7, 0, 1 }, // 0x20 ' '
+ { 0, 6, 18, 7, 3, -17 }, // 0x21 '!'
+ { 14, 6, 6, 9, 4, -16 }, // 0x22 '"'
+ { 19, 15, 18, 13, 1, -17 }, // 0x23 '#'
+ { 53, 13, 21, 13, 2, -17 }, // 0x24 '$'
+ { 88, 19, 17, 21, 3, -16 }, // 0x25 '%'
+ { 129, 13, 17, 16, 2, -16 }, // 0x26 '&'
+ { 157, 2, 6, 5, 4, -16 }, // 0x27 '''
+ { 159, 8, 23, 8, 3, -17 }, // 0x28 '('
+ { 182, 8, 23, 8, 0, -16 }, // 0x29 ')'
+ { 205, 8, 8, 9, 4, -17 }, // 0x2A '*'
+ { 213, 12, 11, 14, 2, -10 }, // 0x2B '+'
+ { 230, 4, 6, 7, 1, -1 }, // 0x2C ','
+ { 233, 6, 2, 8, 2, -7 }, // 0x2D '-'
+ { 235, 3, 2, 7, 2, -1 }, // 0x2E '.'
+ { 236, 10, 18, 7, 0, -17 }, // 0x2F '/'
+ { 259, 12, 17, 13, 2, -16 }, // 0x30 '0'
+ { 285, 7, 17, 13, 5, -16 }, // 0x31 '1'
+ { 300, 14, 17, 13, 1, -16 }, // 0x32 '2'
+ { 330, 12, 17, 13, 2, -16 }, // 0x33 '3'
+ { 356, 12, 17, 13, 2, -16 }, // 0x34 '4'
+ { 382, 13, 17, 13, 2, -16 }, // 0x35 '5'
+ { 410, 12, 17, 13, 2, -16 }, // 0x36 '6'
+ { 436, 13, 17, 13, 3, -16 }, // 0x37 '7'
+ { 464, 12, 17, 13, 2, -16 }, // 0x38 '8'
+ { 490, 12, 17, 13, 2, -16 }, // 0x39 '9'
+ { 516, 5, 12, 7, 3, -11 }, // 0x3A ':'
+ { 524, 6, 16, 7, 2, -11 }, // 0x3B ';'
+ { 536, 13, 12, 14, 2, -11 }, // 0x3C '<'
+ { 556, 13, 6, 14, 2, -8 }, // 0x3D '='
+ { 566, 13, 12, 14, 1, -10 }, // 0x3E '>'
+ { 586, 11, 18, 13, 4, -17 }, // 0x3F '?'
+ { 611, 23, 21, 24, 2, -17 }, // 0x40 '@'
+ { 672, 16, 18, 16, 0, -17 }, // 0x41 'A'
+ { 708, 15, 18, 16, 2, -17 }, // 0x42 'B'
+ { 742, 16, 18, 17, 2, -17 }, // 0x43 'C'
+ { 778, 16, 18, 17, 2, -17 }, // 0x44 'D'
+ { 814, 16, 18, 16, 2, -17 }, // 0x45 'E'
+ { 850, 15, 18, 14, 2, -17 }, // 0x46 'F'
+ { 884, 16, 18, 19, 3, -17 }, // 0x47 'G'
+ { 920, 17, 18, 17, 2, -17 }, // 0x48 'H'
+ { 959, 6, 18, 7, 2, -17 }, // 0x49 'I'
+ { 973, 13, 18, 12, 1, -17 }, // 0x4A 'J'
+ { 1003, 18, 18, 16, 2, -17 }, // 0x4B 'K'
+ { 1044, 11, 18, 13, 2, -17 }, // 0x4C 'L'
+ { 1069, 20, 18, 20, 2, -17 }, // 0x4D 'M'
+ { 1114, 17, 18, 18, 2, -17 }, // 0x4E 'N'
+ { 1153, 17, 18, 18, 2, -17 }, // 0x4F 'O'
+ { 1192, 15, 18, 15, 2, -17 }, // 0x50 'P'
+ { 1226, 18, 19, 19, 2, -17 }, // 0x51 'Q'
+ { 1269, 16, 18, 17, 2, -17 }, // 0x52 'R'
+ { 1305, 15, 18, 16, 2, -17 }, // 0x53 'S'
+ { 1339, 14, 18, 15, 4, -17 }, // 0x54 'T'
+ { 1371, 16, 18, 17, 3, -17 }, // 0x55 'U'
+ { 1407, 15, 18, 15, 4, -17 }, // 0x56 'V'
+ { 1441, 22, 18, 22, 4, -17 }, // 0x57 'W'
+ { 1491, 19, 18, 16, 0, -17 }, // 0x58 'X'
+ { 1534, 16, 18, 16, 4, -17 }, // 0x59 'Y'
+ { 1570, 17, 18, 15, 1, -17 }, // 0x5A 'Z'
+ { 1609, 10, 23, 7, 0, -17 }, // 0x5B '['
+ { 1638, 3, 18, 7, 4, -17 }, // 0x5C '\'
+ { 1645, 10, 23, 7, -1, -16 }, // 0x5D ']'
+ { 1674, 10, 9, 11, 2, -16 }, // 0x5E '^'
+ { 1686, 14, 1, 13, -1, 4 }, // 0x5F '_'
+ { 1688, 4, 4, 8, 4, -17 }, // 0x60 '`'
+ { 1690, 11, 13, 13, 2, -12 }, // 0x61 'a'
+ { 1708, 13, 18, 13, 1, -17 }, // 0x62 'b'
+ { 1738, 11, 13, 12, 2, -12 }, // 0x63 'c'
+ { 1756, 14, 18, 13, 2, -17 }, // 0x64 'd'
+ { 1788, 12, 13, 13, 2, -12 }, // 0x65 'e'
+ { 1808, 8, 18, 6, 2, -17 }, // 0x66 'f'
+ { 1826, 14, 18, 13, 1, -12 }, // 0x67 'g'
+ { 1858, 12, 18, 13, 1, -17 }, // 0x68 'h'
+ { 1885, 5, 18, 5, 2, -17 }, // 0x69 'i'
+ { 1897, 9, 23, 6, -1, -17 }, // 0x6A 'j'
+ { 1923, 13, 18, 12, 1, -17 }, // 0x6B 'k'
+ { 1953, 5, 18, 5, 2, -17 }, // 0x6C 'l'
+ { 1965, 19, 13, 20, 1, -12 }, // 0x6D 'm'
+ { 1996, 12, 13, 13, 1, -12 }, // 0x6E 'n'
+ { 2016, 12, 13, 13, 2, -12 }, // 0x6F 'o'
+ { 2036, 14, 18, 14, 0, -12 }, // 0x70 'p'
+ { 2068, 13, 18, 13, 2, -12 }, // 0x71 'q'
+ { 2098, 9, 13, 8, 1, -12 }, // 0x72 'r'
+ { 2113, 12, 13, 12, 1, -12 }, // 0x73 's'
+ { 2133, 7, 16, 6, 2, -15 }, // 0x74 't'
+ { 2147, 12, 13, 13, 2, -12 }, // 0x75 'u'
+ { 2167, 11, 13, 12, 3, -12 }, // 0x76 'v'
+ { 2185, 17, 13, 17, 3, -12 }, // 0x77 'w'
+ { 2213, 14, 13, 12, 0, -12 }, // 0x78 'x'
+ { 2236, 14, 18, 11, 0, -12 }, // 0x79 'y'
+ { 2268, 12, 13, 12, 1, -12 }, // 0x7A 'z'
+ { 2288, 8, 23, 8, 3, -17 }, // 0x7B '{'
+ { 2311, 6, 23, 6, 1, -17 }, // 0x7C '|'
+ { 2329, 9, 23, 8, -1, -16 }, // 0x7D '}'
+ { 2355, 11, 5, 14, 3, -10 } }; // 0x7E '~'
+
+const GFXfont FreeSansOblique12pt7b PROGMEM = {
+ (uint8_t *)FreeSansOblique12pt7bBitmaps,
+ (GFXglyph *)FreeSansOblique12pt7bGlyphs,
+ 0x20, 0x7E, 29 };
+
+// Approx. 3034 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansOblique18pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansOblique18pt7b.h
new file mode 100644
index 000000000000..2a18a3f6aee3
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansOblique18pt7b.h
@@ -0,0 +1,518 @@
+const uint8_t FreeSansOblique18pt7bBitmaps[] PROGMEM = {
+ 0x03, 0x83, 0x81, 0xC0, 0xE0, 0x70, 0x78, 0x38, 0x1C, 0x0E, 0x07, 0x07,
+ 0x83, 0x81, 0xC0, 0xE0, 0x60, 0x30, 0x30, 0x18, 0x0C, 0x04, 0x00, 0x00,
+ 0x01, 0xC0, 0xE0, 0x70, 0x78, 0x00, 0x71, 0xDC, 0x7F, 0x3F, 0x8E, 0xE3,
+ 0xB8, 0xEC, 0x33, 0x0C, 0xC3, 0x00, 0x00, 0x38, 0x70, 0x01, 0xC3, 0x80,
+ 0x0C, 0x18, 0x00, 0xE1, 0xC0, 0x06, 0x0C, 0x00, 0x70, 0xE0, 0x03, 0x87,
+ 0x03, 0xFF, 0xFF, 0x1F, 0xFF, 0xF0, 0xFF, 0xFF, 0x80, 0x60, 0xC0, 0x07,
+ 0x0E, 0x00, 0x30, 0x60, 0x03, 0x87, 0x00, 0x18, 0x30, 0x1F, 0xFF, 0xF8,
+ 0xFF, 0xFF, 0xC7, 0xFF, 0xFC, 0x07, 0x0E, 0x00, 0x30, 0x70, 0x03, 0x87,
+ 0x00, 0x1C, 0x38, 0x00, 0xC1, 0x80, 0x0E, 0x1C, 0x00, 0x60, 0xC0, 0x00,
+ 0x00, 0x0C, 0x00, 0x07, 0xF8, 0x01, 0xFF, 0xC0, 0x3F, 0xFE, 0x07, 0x99,
+ 0xF0, 0xF1, 0x87, 0x0E, 0x18, 0x71, 0xC1, 0x87, 0x1C, 0x38, 0x01, 0xC3,
+ 0x00, 0x1C, 0x30, 0x01, 0xE3, 0x00, 0x0F, 0xB0, 0x00, 0xFF, 0x80, 0x03,
+ 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x6F, 0xC0, 0x06, 0x3C, 0x00, 0xC1, 0xCE,
+ 0x0C, 0x1C, 0xE0, 0xC1, 0xCE, 0x0C, 0x38, 0xF1, 0xC3, 0x8F, 0x98, 0xF0,
+ 0x7F, 0xFE, 0x03, 0xFF, 0xC0, 0x0F, 0xF0, 0x00, 0x30, 0x00, 0x03, 0x00,
+ 0x00, 0x30, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0xE0, 0x03,
+ 0x81, 0xFC, 0x00, 0xC0, 0xFF, 0x00, 0x60, 0x70, 0xE0, 0x38, 0x38, 0x18,
+ 0x1C, 0x0C, 0x06, 0x0E, 0x03, 0x01, 0x83, 0x00, 0xC0, 0xE1, 0x80, 0x38,
+ 0x70, 0xE0, 0x0F, 0xF8, 0x70, 0x01, 0xFC, 0x18, 0x00, 0x3E, 0x0C, 0x00,
+ 0x00, 0x06, 0x07, 0x80, 0x03, 0x87, 0xF8, 0x00, 0xC3, 0xFE, 0x00, 0x61,
+ 0xE1, 0xC0, 0x30, 0x60, 0x30, 0x1C, 0x30, 0x0C, 0x0E, 0x0C, 0x03, 0x03,
+ 0x03, 0x01, 0x81, 0x80, 0xE1, 0xE0, 0xC0, 0x1F, 0xF0, 0x70, 0x07, 0xF8,
+ 0x18, 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x07, 0xF8, 0x00, 0xFF, 0xC0,
+ 0x1E, 0x3C, 0x03, 0xC1, 0xC0, 0x38, 0x1C, 0x03, 0x81, 0xC0, 0x38, 0x38,
+ 0x03, 0xC7, 0x00, 0x1D, 0xE0, 0x01, 0xFC, 0x00, 0x1F, 0x00, 0x07, 0xF0,
+ 0x01, 0xF7, 0x87, 0x3C, 0x3C, 0xE7, 0x81, 0xCE, 0x70, 0x1F, 0xCE, 0x00,
+ 0xFC, 0xE0, 0x07, 0x8E, 0x00, 0x78, 0xF0, 0x1F, 0x8F, 0x87, 0xFC, 0x7F,
+ 0xF9, 0xC3, 0xFE, 0x1E, 0x1F, 0x80, 0xE0, 0x77, 0xFE, 0xEE, 0xCC, 0xC0,
+ 0x00, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x80, 0x30, 0x06, 0x00, 0xE0,
+ 0x0C, 0x01, 0xC0, 0x18, 0x03, 0x80, 0x38, 0x07, 0x00, 0x70, 0x07, 0x00,
+ 0x70, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00,
+ 0xE0, 0x0E, 0x00, 0xE0, 0x06, 0x00, 0x70, 0x07, 0x00, 0x30, 0x03, 0x00,
+ 0x18, 0x00, 0x01, 0x80, 0x0C, 0x00, 0xC0, 0x0E, 0x00, 0xE0, 0x06, 0x00,
+ 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00,
+ 0x70, 0x07, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x01, 0xC0, 0x1C, 0x03,
+ 0x80, 0x38, 0x03, 0x00, 0x70, 0x06, 0x00, 0xC0, 0x1C, 0x01, 0x80, 0x30,
+ 0x06, 0x00, 0xC0, 0x00, 0x06, 0x01, 0x84, 0x47, 0xF7, 0xFF, 0xCF, 0xC1,
+ 0xE0, 0xD8, 0x67, 0x18, 0xC0, 0x00, 0x70, 0x00, 0x1C, 0x00, 0x0F, 0x00,
+ 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xC0, 0x70, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0xE0,
+ 0x00, 0x38, 0x00, 0x0E, 0x00, 0x3B, 0xDC, 0x21, 0x18, 0x98, 0xFF, 0xFF,
+ 0xFF, 0xE0, 0x7F, 0xFE, 0x00, 0x06, 0x00, 0x18, 0x00, 0x30, 0x00, 0xC0,
+ 0x01, 0x80, 0x06, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x60, 0x01, 0x80, 0x03,
+ 0x00, 0x0C, 0x00, 0x18, 0x00, 0x60, 0x00, 0xC0, 0x03, 0x00, 0x06, 0x00,
+ 0x18, 0x00, 0x20, 0x00, 0xC0, 0x03, 0x00, 0x06, 0x00, 0x18, 0x00, 0x30,
+ 0x00, 0xC0, 0x01, 0x80, 0x00, 0x00, 0x7C, 0x00, 0x7F, 0xC0, 0x7F, 0xF8,
+ 0x3E, 0x1E, 0x0F, 0x03, 0xC7, 0x80, 0x71, 0xC0, 0x1C, 0xE0, 0x07, 0x38,
+ 0x01, 0xDE, 0x00, 0x77, 0x00, 0x1D, 0xC0, 0x0F, 0x70, 0x03, 0xFC, 0x00,
+ 0xEE, 0x00, 0x3B, 0x80, 0x0E, 0xE0, 0x07, 0xB8, 0x01, 0xCE, 0x00, 0xF3,
+ 0x80, 0x38, 0xF0, 0x1E, 0x1E, 0x1F, 0x07, 0xFF, 0x80, 0xFF, 0xC0, 0x0F,
+ 0x80, 0x00, 0x00, 0xC0, 0x70, 0x3C, 0x3E, 0xFF, 0xBF, 0xEF, 0xF8, 0x1E,
+ 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x0F, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x07,
+ 0x81, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0xE0, 0x38, 0x00, 0x00, 0x3F,
+ 0x00, 0x0F, 0xFC, 0x03, 0xFF, 0xE0, 0x7C, 0x1E, 0x07, 0x80, 0xF0, 0xF0,
+ 0x07, 0x0E, 0x00, 0x70, 0xE0, 0x07, 0x00, 0x00, 0x70, 0x00, 0x0E, 0x00,
+ 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x0F, 0x80, 0x03, 0xF0, 0x00, 0xFC, 0x00,
+ 0x1F, 0x00, 0x07, 0xC0, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0x80, 0x00,
+ 0x70, 0x00, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0x8F, 0xFF, 0xF0, 0xFF, 0xFF,
+ 0x00, 0x00, 0x7E, 0x00, 0x3F, 0xF0, 0x0F, 0xFF, 0x03, 0xC1, 0xF0, 0x70,
+ 0x0E, 0x1C, 0x01, 0xC3, 0x80, 0x38, 0xE0, 0x07, 0x00, 0x01, 0xC0, 0x00,
+ 0xF0, 0x03, 0xFC, 0x00, 0x7F, 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0x00, 0x00,
+ 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x9C, 0x00, 0x73, 0x80, 0x1E, 0x70, 0x03,
+ 0x8F, 0x00, 0xF1, 0xF0, 0x7C, 0x1F, 0xFF, 0x01, 0xFF, 0xC0, 0x0F, 0xC0,
+ 0x00, 0x00, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x3E, 0x00, 0x1F,
+ 0x80, 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xDC, 0x01, 0xE7, 0x00, 0x71, 0xC0,
+ 0x38, 0xF0, 0x1C, 0x38, 0x0E, 0x0E, 0x07, 0x03, 0x83, 0x80, 0xE1, 0xC0,
+ 0x70, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x70, 0x00, 0x38,
+ 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x01, 0xFF,
+ 0xF0, 0x3F, 0xFF, 0x03, 0xFF, 0xE0, 0x78, 0x00, 0x07, 0x00, 0x00, 0x70,
+ 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0xFC, 0x01, 0xFF, 0xF0, 0x1F,
+ 0xFF, 0x83, 0xE0, 0x78, 0x3C, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xC0,
+ 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x18, 0x00, 0x03, 0x8E, 0x00, 0x78,
+ 0xE0, 0x0F, 0x0F, 0x81, 0xE0, 0x7F, 0xFC, 0x03, 0xFF, 0x80, 0x0F, 0xE0,
+ 0x00, 0x00, 0x7E, 0x00, 0x3F, 0xF0, 0x0F, 0xFF, 0x03, 0xE1, 0xF0, 0xF0,
+ 0x0E, 0x1C, 0x01, 0xC7, 0x00, 0x01, 0xE0, 0x00, 0x38, 0x00, 0x07, 0x1F,
+ 0x01, 0xCF, 0xF8, 0x3B, 0xFF, 0x87, 0xE0, 0xF8, 0xF0, 0x0F, 0x3C, 0x00,
+ 0xE7, 0x80, 0x1C, 0xE0, 0x03, 0x9C, 0x00, 0x73, 0x80, 0x1C, 0x70, 0x03,
+ 0x8F, 0x00, 0xE0, 0xF0, 0x78, 0x1F, 0xFF, 0x01, 0xFF, 0x80, 0x0F, 0xC0,
+ 0x00, 0x3F, 0xFF, 0xCF, 0xFF, 0xF7, 0xFF, 0xFC, 0x00, 0x0E, 0x00, 0x07,
+ 0x00, 0x03, 0x80, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00,
+ 0x0E, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x1C,
+ 0x00, 0x0E, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xF0, 0x00, 0x38, 0x00,
+ 0x1E, 0x00, 0x07, 0x00, 0x03, 0xC0, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x7E,
+ 0x00, 0x3F, 0xF0, 0x1F, 0xFF, 0x07, 0xC1, 0xF0, 0xE0, 0x0E, 0x38, 0x01,
+ 0xC7, 0x00, 0x38, 0xE0, 0x0E, 0x1C, 0x01, 0xC3, 0xC0, 0xF0, 0x3F, 0xFC,
+ 0x03, 0xFE, 0x01, 0xFF, 0xF0, 0x7C, 0x1E, 0x1E, 0x01, 0xE3, 0x80, 0x1C,
+ 0xE0, 0x03, 0x9C, 0x00, 0x73, 0x80, 0x0E, 0x70, 0x03, 0x8F, 0x00, 0xF1,
+ 0xF0, 0x7C, 0x1F, 0xFF, 0x01, 0xFF, 0xC0, 0x0F, 0xC0, 0x00, 0x00, 0x7E,
+ 0x00, 0x3F, 0xF0, 0x1F, 0xFF, 0x07, 0xC1, 0xE0, 0xE0, 0x1E, 0x38, 0x01,
+ 0xC7, 0x00, 0x39, 0xC0, 0x07, 0x38, 0x00, 0xE7, 0x00, 0x3C, 0xE0, 0x07,
+ 0x9E, 0x01, 0xE3, 0xE0, 0xFC, 0x3F, 0xFB, 0x83, 0xFE, 0xF0, 0x3F, 0x1C,
+ 0x00, 0x03, 0x80, 0x00, 0xF0, 0x00, 0x1C, 0x70, 0x07, 0x8E, 0x01, 0xE1,
+ 0xE0, 0xF8, 0x1F, 0xFE, 0x01, 0xFF, 0x80, 0x0F, 0xC0, 0x00, 0x0E, 0x3C,
+ 0x78, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
+ 0xF1, 0xE3, 0x80, 0x07, 0x0F, 0x0F, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x78, 0x70, 0x10, 0x10,
+ 0x30, 0x20, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x1F, 0x80, 0x1F,
+ 0xC0, 0x0F, 0xC0, 0x0F, 0xE0, 0x07, 0xE0, 0x03, 0xF0, 0x00, 0xF0, 0x00,
+ 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8,
+ 0x00, 0x0F, 0xC0, 0x00, 0x78, 0x00, 0x01, 0x00, 0x7F, 0xFF, 0xDF, 0xFF,
+ 0xF7, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFB,
+ 0xFF, 0xFE, 0xFF, 0xFF, 0x80, 0x10, 0x00, 0x03, 0xC0, 0x00, 0x7E, 0x00,
+ 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F,
+ 0x00, 0x01, 0xE0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0x7E, 0x00,
+ 0x7F, 0x00, 0x3F, 0x00, 0x07, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, 0xF8,
+ 0x0F, 0xFC, 0x1F, 0xFE, 0x3C, 0x1F, 0x78, 0x07, 0x70, 0x07, 0xE0, 0x07,
+ 0xE0, 0x07, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0,
+ 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x0E, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00,
+ 0x3C, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x07,
+ 0xFF, 0xFE, 0x00, 0x0F, 0xE0, 0x3F, 0x80, 0x0F, 0x80, 0x03, 0xE0, 0x0F,
+ 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x3C, 0x0F, 0x01, 0xF0, 0x0F, 0x0F,
+ 0x03, 0xFD, 0xC7, 0x8F, 0x03, 0xFE, 0xE1, 0xC7, 0x03, 0xC3, 0x60, 0xE7,
+ 0x03, 0xC0, 0xF0, 0x77, 0x83, 0xC0, 0x70, 0x3B, 0x83, 0xC0, 0x78, 0x1D,
+ 0xC1, 0xC0, 0x38, 0x1F, 0xC1, 0xE0, 0x1C, 0x0E, 0xE0, 0xE0, 0x1C, 0x0F,
+ 0x70, 0x70, 0x0E, 0x07, 0x38, 0x38, 0x0E, 0x07, 0x9C, 0x1C, 0x0F, 0x07,
+ 0x8E, 0x0F, 0x0F, 0x8F, 0x87, 0x03, 0xFD, 0xFF, 0x83, 0xC1, 0xFC, 0xFF,
+ 0x80, 0xE0, 0x7C, 0x3F, 0x00, 0x78, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00,
+ 0x00, 0x07, 0x80, 0x00, 0x00, 0x01, 0xF8, 0x07, 0x00, 0x00, 0x7F, 0xFF,
+ 0x80, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x01,
+ 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0xFF,
+ 0x00, 0x01, 0xDE, 0x00, 0x07, 0x9C, 0x00, 0x0E, 0x38, 0x00, 0x3C, 0x70,
+ 0x00, 0x70, 0xF0, 0x01, 0xC1, 0xE0, 0x07, 0x83, 0xC0, 0x0E, 0x07, 0x80,
+ 0x38, 0x07, 0x00, 0x70, 0x0E, 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xFC, 0x0F,
+ 0xFF, 0xF8, 0x1C, 0x00, 0xF0, 0x70, 0x01, 0xE1, 0xE0, 0x01, 0xC3, 0x80,
+ 0x03, 0x8F, 0x00, 0x07, 0x1C, 0x00, 0x0E, 0x78, 0x00, 0x1E, 0xE0, 0x00,
+ 0x3C, 0x07, 0xFF, 0xC0, 0x3F, 0xFF, 0x81, 0xFF, 0xFC, 0x0E, 0x00, 0xF0,
+ 0xF0, 0x03, 0x87, 0x00, 0x1C, 0x38, 0x00, 0xE1, 0xC0, 0x07, 0x0E, 0x00,
+ 0x70, 0xF0, 0x03, 0x87, 0x00, 0x78, 0x3F, 0xFF, 0x81, 0xFF, 0xF8, 0x0F,
+ 0xFF, 0xF0, 0xE0, 0x03, 0xC7, 0x00, 0x0E, 0x38, 0x00, 0x71, 0xC0, 0x03,
+ 0x9E, 0x00, 0x1C, 0xE0, 0x00, 0xE7, 0x00, 0x0E, 0x38, 0x00, 0xF1, 0xC0,
+ 0x0F, 0x1F, 0xFF, 0xF0, 0xFF, 0xFF, 0x07, 0xFF, 0xE0, 0x00, 0x00, 0x1F,
+ 0x80, 0x03, 0xFF, 0x80, 0x1F, 0xFF, 0x01, 0xF8, 0x3E, 0x07, 0x80, 0x38,
+ 0x38, 0x00, 0xF1, 0xC0, 0x01, 0xCF, 0x00, 0x07, 0x38, 0x00, 0x01, 0xE0,
+ 0x00, 0x07, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00,
+ 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x7B, 0x80, 0x01, 0xCE,
+ 0x00, 0x0F, 0x3C, 0x00, 0x38, 0x70, 0x01, 0xE1, 0xE0, 0x0F, 0x07, 0xC0,
+ 0xF8, 0x0F, 0xFF, 0xC0, 0x1F, 0xFC, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xFF,
+ 0xC0, 0x0F, 0xFF, 0xE0, 0x1F, 0xFF, 0xE0, 0x38, 0x03, 0xE0, 0xF0, 0x03,
+ 0xC1, 0xC0, 0x03, 0x83, 0x80, 0x03, 0x87, 0x00, 0x07, 0x1E, 0x00, 0x0E,
+ 0x3C, 0x00, 0x1C, 0x70, 0x00, 0x38, 0xE0, 0x00, 0x71, 0xC0, 0x00, 0xE7,
+ 0x80, 0x03, 0x8F, 0x00, 0x07, 0x1C, 0x00, 0x0E, 0x38, 0x00, 0x3C, 0x70,
+ 0x00, 0x71, 0xE0, 0x01, 0xE3, 0x80, 0x03, 0x87, 0x00, 0x0E, 0x0E, 0x00,
+ 0x3C, 0x1C, 0x01, 0xF0, 0x7F, 0xFF, 0xC0, 0xFF, 0xFE, 0x01, 0xFF, 0xF0,
+ 0x00, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xFC, 0x1F, 0xFF, 0xF0, 0x38, 0x00,
+ 0x00, 0xF0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00,
+ 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0x81,
+ 0xFF, 0xFF, 0x07, 0xFF, 0xFE, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38,
+ 0x00, 0x00, 0x70, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00,
+ 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x7F, 0xFF, 0xF0, 0xFF, 0xFF,
+ 0xC1, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFC, 0x1F, 0xFF, 0xF0, 0x7F, 0xFF,
+ 0xC1, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03,
+ 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xC0, 0x00, 0x07, 0xFF,
+ 0xF0, 0x1F, 0xFF, 0xC0, 0xFF, 0xFF, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00,
+ 0x38, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x70,
+ 0x00, 0x01, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xE0, 0x00,
+ 0x03, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0xF8, 0x01, 0xFF,
+ 0xFC, 0x03, 0xE0, 0x3E, 0x07, 0x80, 0x0E, 0x0F, 0x00, 0x0F, 0x1E, 0x00,
+ 0x07, 0x1C, 0x00, 0x07, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00,
+ 0x00, 0x70, 0x00, 0x00, 0xF0, 0x07, 0xFE, 0xE0, 0x07, 0xFE, 0xE0, 0x07,
+ 0xFE, 0xE0, 0x00, 0x0E, 0xE0, 0x00, 0x0E, 0xE0, 0x00, 0x0E, 0xE0, 0x00,
+ 0x1C, 0xF0, 0x00, 0x3C, 0x70, 0x00, 0x7C, 0x78, 0x00, 0xFC, 0x3E, 0x03,
+ 0xDC, 0x1F, 0xFF, 0x98, 0x0F, 0xFE, 0x18, 0x03, 0xF8, 0x18, 0x07, 0x00,
+ 0x07, 0x83, 0x80, 0x03, 0xC1, 0xC0, 0x01, 0xC0, 0xE0, 0x00, 0xE0, 0xF0,
+ 0x00, 0x70, 0x70, 0x00, 0x78, 0x38, 0x00, 0x3C, 0x1C, 0x00, 0x1C, 0x1E,
+ 0x00, 0x0E, 0x0F, 0x00, 0x07, 0x07, 0x00, 0x07, 0x83, 0xFF, 0xFF, 0x81,
+ 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xE0, 0xE0, 0x00, 0x70, 0x70, 0x00, 0x78,
+ 0x38, 0x00, 0x38, 0x1C, 0x00, 0x1C, 0x1E, 0x00, 0x0E, 0x0E, 0x00, 0x0F,
+ 0x07, 0x00, 0x07, 0x83, 0x80, 0x03, 0x81, 0xC0, 0x01, 0xC1, 0xE0, 0x00,
+ 0xE0, 0xE0, 0x00, 0xF0, 0x70, 0x00, 0x78, 0x00, 0x07, 0x0F, 0x0F, 0x0E,
+ 0x0E, 0x0E, 0x0E, 0x1E, 0x1C, 0x1C, 0x1C, 0x1C, 0x3C, 0x3C, 0x38, 0x38,
+ 0x38, 0x38, 0x78, 0x70, 0x70, 0x70, 0x70, 0xF0, 0xF0, 0xE0, 0x00, 0x01,
+ 0xC0, 0x00, 0x70, 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0,
+ 0x00, 0x38, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0x70, 0x00,
+ 0x1C, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x1E,
+ 0x1C, 0x07, 0x0E, 0x01, 0xC3, 0x80, 0x70, 0xE0, 0x3C, 0x38, 0x0E, 0x0F,
+ 0x0F, 0x81, 0xFF, 0xC0, 0x7F, 0xE0, 0x07, 0xE0, 0x00, 0x07, 0x00, 0x07,
+ 0x83, 0x80, 0x07, 0x81, 0xC0, 0x0F, 0x00, 0xE0, 0x0F, 0x00, 0xF0, 0x0F,
+ 0x00, 0x70, 0x0F, 0x00, 0x38, 0x0F, 0x00, 0x1C, 0x1F, 0x00, 0x1E, 0x1E,
+ 0x00, 0x0F, 0x1E, 0x00, 0x07, 0x1E, 0x00, 0x03, 0x9F, 0x00, 0x01, 0xDF,
+ 0xC0, 0x01, 0xFC, 0xE0, 0x00, 0xFC, 0x78, 0x00, 0x7C, 0x1C, 0x00, 0x3C,
+ 0x0F, 0x00, 0x1C, 0x07, 0x80, 0x1E, 0x01, 0xE0, 0x0E, 0x00, 0xF0, 0x07,
+ 0x00, 0x38, 0x03, 0x80, 0x1E, 0x01, 0xC0, 0x07, 0x01, 0xE0, 0x03, 0xC0,
+ 0xE0, 0x00, 0xE0, 0x70, 0x00, 0x78, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07,
+ 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x1E,
+ 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x38,
+ 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x78, 0x00, 0x70, 0x00, 0x70,
+ 0x00, 0x70, 0x00, 0x70, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07,
+ 0xC0, 0x00, 0xF8, 0x3E, 0x00, 0x07, 0xC1, 0xF0, 0x00, 0x7E, 0x0F, 0x80,
+ 0x03, 0xF0, 0xFC, 0x00, 0x3F, 0x07, 0x70, 0x01, 0xF8, 0x3B, 0x80, 0x1D,
+ 0xC1, 0xDC, 0x00, 0xEE, 0x0E, 0xE0, 0x0E, 0xE0, 0xE7, 0x00, 0x77, 0x07,
+ 0x38, 0x07, 0x38, 0x39, 0xC0, 0x31, 0xC1, 0xCE, 0x03, 0x9E, 0x1E, 0x38,
+ 0x38, 0xE0, 0xE1, 0xC1, 0xC7, 0x07, 0x0E, 0x1C, 0x38, 0x38, 0x70, 0xE1,
+ 0xC1, 0xC3, 0x8E, 0x1E, 0x1E, 0x1C, 0x70, 0xE0, 0xE0, 0xE7, 0x07, 0x07,
+ 0x07, 0x38, 0x38, 0x38, 0x1F, 0x81, 0xC1, 0xC0, 0xF8, 0x1E, 0x1C, 0x07,
+ 0xC0, 0xE0, 0xE0, 0x3C, 0x07, 0x07, 0x01, 0xE0, 0x38, 0x00, 0x07, 0x80,
+ 0x03, 0x83, 0xE0, 0x01, 0xC1, 0xF0, 0x00, 0xE0, 0xF8, 0x00, 0xE0, 0xFE,
+ 0x00, 0x70, 0x7F, 0x00, 0x38, 0x3B, 0xC0, 0x1C, 0x1D, 0xE0, 0x1E, 0x0E,
+ 0x70, 0x0E, 0x0E, 0x3C, 0x07, 0x07, 0x0E, 0x03, 0x83, 0x87, 0x81, 0xC1,
+ 0xC3, 0xC1, 0xE1, 0xE0, 0xE0, 0xE0, 0xE0, 0x78, 0x70, 0x70, 0x1C, 0x38,
+ 0x38, 0x0F, 0x1C, 0x1C, 0x07, 0x9E, 0x1E, 0x01, 0xCE, 0x0E, 0x00, 0xF7,
+ 0x07, 0x00, 0x3B, 0x83, 0x80, 0x1F, 0xC1, 0xC0, 0x07, 0xC1, 0xC0, 0x03,
+ 0xE0, 0xE0, 0x01, 0xF0, 0x70, 0x00, 0x78, 0x00, 0x00, 0x1F, 0xC0, 0x00,
+ 0xFF, 0xF0, 0x01, 0xFF, 0xF8, 0x03, 0xE0, 0x7C, 0x07, 0x80, 0x1E, 0x0F,
+ 0x00, 0x0E, 0x1C, 0x00, 0x0F, 0x3C, 0x00, 0x07, 0x38, 0x00, 0x07, 0x70,
+ 0x00, 0x07, 0x70, 0x00, 0x07, 0x70, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xE0,
+ 0x00, 0x0F, 0xE0, 0x00, 0x0E, 0xE0, 0x00, 0x0E, 0xE0, 0x00, 0x0E, 0xE0,
+ 0x00, 0x1C, 0xE0, 0x00, 0x1C, 0xF0, 0x00, 0x38, 0x70, 0x00, 0x78, 0x78,
+ 0x00, 0xF0, 0x3E, 0x07, 0xE0, 0x1F, 0xFF, 0xC0, 0x0F, 0xFF, 0x00, 0x03,
+ 0xF8, 0x00, 0x07, 0xFF, 0xE0, 0x1F, 0xFF, 0xC0, 0x7F, 0xFF, 0x81, 0xC0,
+ 0x1F, 0x0F, 0x00, 0x3C, 0x38, 0x00, 0x70, 0xE0, 0x01, 0xC3, 0x80, 0x07,
+ 0x1E, 0x00, 0x1C, 0x78, 0x00, 0xE1, 0xC0, 0x07, 0x87, 0x00, 0x3C, 0x1F,
+ 0xFF, 0xE0, 0xFF, 0xFF, 0x03, 0xFF, 0xF0, 0x0E, 0x00, 0x00, 0x38, 0x00,
+ 0x00, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x70, 0x00, 0x01,
+ 0xC0, 0x00, 0x07, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80,
+ 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xFC, 0x00, 0x7F, 0xFF, 0x00,
+ 0x7C, 0x07, 0xC0, 0x78, 0x00, 0xF0, 0x78, 0x00, 0x38, 0x78, 0x00, 0x1E,
+ 0x78, 0x00, 0x07, 0x38, 0x00, 0x03, 0xBC, 0x00, 0x01, 0xDC, 0x00, 0x00,
+ 0xEE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x80, 0x00,
+ 0x1D, 0xC0, 0x00, 0x0E, 0xE0, 0x00, 0x0F, 0x70, 0x00, 0x07, 0x38, 0x00,
+ 0x87, 0x9E, 0x00, 0xE7, 0x87, 0x00, 0x7F, 0x83, 0xC0, 0x1F, 0x80, 0xF8,
+ 0x1F, 0x80, 0x3F, 0xFF, 0xE0, 0x0F, 0xFF, 0x78, 0x01, 0xFE, 0x1E, 0x00,
+ 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFF, 0xF0, 0x0F, 0xFF, 0xF8,
+ 0x1F, 0xFF, 0xF0, 0x38, 0x00, 0xF0, 0xF0, 0x00, 0xE1, 0xC0, 0x01, 0xC3,
+ 0x80, 0x03, 0x87, 0x00, 0x07, 0x1E, 0x00, 0x0E, 0x3C, 0x00, 0x38, 0x70,
+ 0x00, 0xF0, 0xE0, 0x03, 0xC1, 0xFF, 0xFE, 0x07, 0xFF, 0xF8, 0x0F, 0xFF,
+ 0xF8, 0x1C, 0x00, 0x78, 0x38, 0x00, 0x70, 0x70, 0x00, 0xE1, 0xE0, 0x01,
+ 0xC3, 0x80, 0x03, 0x87, 0x00, 0x06, 0x0E, 0x00, 0x1C, 0x1C, 0x00, 0x38,
+ 0x78, 0x00, 0x70, 0xE0, 0x00, 0xE1, 0xC0, 0x01, 0xE0, 0x00, 0x3F, 0xC0,
+ 0x07, 0xFF, 0xC0, 0x3F, 0xFF, 0x81, 0xF0, 0x1E, 0x0F, 0x00, 0x3C, 0x38,
+ 0x00, 0x71, 0xC0, 0x01, 0xC7, 0x00, 0x07, 0x1C, 0x00, 0x00, 0x78, 0x00,
+ 0x01, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xFE, 0x00, 0x07, 0xFF, 0x00,
+ 0x03, 0xFE, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xF3, 0x80, 0x01, 0xCE, 0x00,
+ 0x07, 0x38, 0x00, 0x18, 0xE0, 0x00, 0xE3, 0xC0, 0x07, 0x07, 0x80, 0x7C,
+ 0x1F, 0xFF, 0xE0, 0x3F, 0xFE, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x1E, 0x00,
+ 0x01, 0xE0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x03, 0xC0,
+ 0x00, 0x38, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x03, 0x80, 0x00, 0x78,
+ 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, 0x0F,
+ 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x1E, 0x00, 0x01,
+ 0xE0, 0x00, 0x0E, 0x00, 0x0F, 0x0E, 0x00, 0x0F, 0x0E, 0x00, 0x0E, 0x0E,
+ 0x00, 0x0E, 0x1E, 0x00, 0x0E, 0x1C, 0x00, 0x1E, 0x1C, 0x00, 0x1C, 0x1C,
+ 0x00, 0x1C, 0x3C, 0x00, 0x1C, 0x3C, 0x00, 0x1C, 0x38, 0x00, 0x3C, 0x38,
+ 0x00, 0x38, 0x38, 0x00, 0x38, 0x78, 0x00, 0x38, 0x70, 0x00, 0x78, 0x70,
+ 0x00, 0x78, 0x70, 0x00, 0x70, 0xF0, 0x00, 0x70, 0xF0, 0x00, 0x70, 0xE0,
+ 0x00, 0xF0, 0xE0, 0x00, 0xE0, 0xF0, 0x03, 0xE0, 0x78, 0x0F, 0xC0, 0x7F,
+ 0xFF, 0x80, 0x1F, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0xE0, 0x00, 0x3F, 0x80,
+ 0x03, 0xFC, 0x00, 0x1D, 0xE0, 0x01, 0xE7, 0x00, 0x0E, 0x38, 0x00, 0xE1,
+ 0xC0, 0x07, 0x0E, 0x00, 0x70, 0x70, 0x07, 0x83, 0xC0, 0x38, 0x1E, 0x03,
+ 0xC0, 0xF0, 0x1C, 0x03, 0x81, 0xE0, 0x1C, 0x0E, 0x00, 0xE0, 0xF0, 0x07,
+ 0x07, 0x00, 0x3C, 0x70, 0x01, 0xE3, 0x80, 0x0F, 0x38, 0x00, 0x39, 0xC0,
+ 0x01, 0xDC, 0x00, 0x0E, 0xE0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F,
+ 0x00, 0x00, 0xF0, 0x00, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0xE0, 0x07, 0x80,
+ 0x1E, 0xE0, 0x07, 0xC0, 0x1E, 0xE0, 0x0F, 0xC0, 0x1C, 0xE0, 0x0F, 0xC0,
+ 0x3C, 0xE0, 0x1F, 0xC0, 0x38, 0xE0, 0x1D, 0xC0, 0x78, 0xE0, 0x3D, 0xC0,
+ 0x70, 0xE0, 0x39, 0xC0, 0xF0, 0xE0, 0x79, 0xC0, 0xE0, 0xE0, 0x71, 0xC0,
+ 0xE0, 0xE0, 0xF1, 0xC1, 0xC0, 0xE0, 0xE1, 0xC1, 0xC0, 0xE1, 0xE1, 0xC3,
+ 0xC0, 0x61, 0xC1, 0xC3, 0x80, 0x63, 0xC1, 0xC7, 0x80, 0x63, 0x80, 0xE7,
+ 0x00, 0x67, 0x80, 0xEF, 0x00, 0x67, 0x00, 0xEE, 0x00, 0x7F, 0x00, 0xEE,
+ 0x00, 0x7E, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0xFC, 0x00, 0x7C, 0x00, 0xF8,
+ 0x00, 0x7C, 0x00, 0xF8, 0x00, 0x78, 0x00, 0xF8, 0x00, 0x78, 0x00, 0xF0,
+ 0x00, 0x03, 0xC0, 0x03, 0xC0, 0x78, 0x00, 0xF0, 0x07, 0x80, 0x1C, 0x00,
+ 0xF0, 0x07, 0x80, 0x0F, 0x01, 0xE0, 0x01, 0xE0, 0x78, 0x00, 0x1C, 0x1E,
+ 0x00, 0x03, 0xC7, 0x80, 0x00, 0x39, 0xE0, 0x00, 0x07, 0xB8, 0x00, 0x00,
+ 0x7E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x3E, 0x00,
+ 0x00, 0x0F, 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xF3, 0x80, 0x00, 0x3C,
+ 0x78, 0x00, 0x0F, 0x0F, 0x00, 0x03, 0xC0, 0xF0, 0x00, 0x70, 0x1E, 0x00,
+ 0x1E, 0x01, 0xE0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x03, 0xC0, 0x78, 0x00,
+ 0x78, 0x1E, 0x00, 0x0F, 0x00, 0xF0, 0x00, 0x3C, 0xE0, 0x00, 0x71, 0xE0,
+ 0x01, 0xE3, 0xC0, 0x07, 0x83, 0xC0, 0x1E, 0x07, 0x80, 0x78, 0x07, 0x00,
+ 0xE0, 0x0F, 0x03, 0xC0, 0x1E, 0x0F, 0x00, 0x1C, 0x3C, 0x00, 0x3C, 0xF0,
+ 0x00, 0x39, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFE, 0x00, 0x00, 0xF8, 0x00,
+ 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00,
+ 0x1C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xC0, 0x00, 0x03,
+ 0x80, 0x00, 0x07, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x81,
+ 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0,
+ 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0,
+ 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0,
+ 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0,
+ 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0,
+ 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xFF, 0xFF, 0xE0, 0xFF,
+ 0xFF, 0xF0, 0x7F, 0xFF, 0xF8, 0x00, 0x01, 0xF8, 0x1F, 0xC0, 0xFE, 0x07,
+ 0x00, 0x38, 0x03, 0xC0, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x03, 0xC0,
+ 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07,
+ 0x00, 0x38, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x78, 0x03, 0x80,
+ 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x70, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x00,
+ 0xCC, 0xCC, 0xCC, 0x46, 0x66, 0x66, 0x66, 0x66, 0x66, 0x62, 0x33, 0x33,
+ 0x33, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x00, 0x70, 0x07, 0x00, 0x38, 0x01,
+ 0xC0, 0x0E, 0x00, 0xF0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0xE0,
+ 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01,
+ 0xC0, 0x1E, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x1E, 0x00, 0xE0,
+ 0x07, 0x03, 0xF8, 0x1F, 0xC0, 0xFC, 0x00, 0x00, 0xF0, 0x03, 0xC0, 0x1F,
+ 0x00, 0x7C, 0x03, 0xB8, 0x1C, 0xE0, 0x63, 0x83, 0x8E, 0x1C, 0x38, 0x60,
+ 0x73, 0x81, 0xCC, 0x07, 0x70, 0x1F, 0x80, 0x70, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xC0, 0xF1, 0xC3, 0x86, 0x0C, 0x00, 0xFE, 0x01, 0xFF, 0xE0, 0xFF,
+ 0xFC, 0x3C, 0x0F, 0x1C, 0x01, 0xC0, 0x00, 0x70, 0x00, 0x1C, 0x00, 0x0E,
+ 0x00, 0x1F, 0x83, 0xFF, 0xE3, 0xFE, 0x39, 0xF0, 0x1E, 0xF0, 0x07, 0x38,
+ 0x01, 0xCE, 0x00, 0xF3, 0xC0, 0xFC, 0xFF, 0xF7, 0x9F, 0xF1, 0xE1, 0xF0,
+ 0x38, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0xF0,
+ 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x71, 0xF0, 0x0E, 0xFF, 0x83, 0xFF,
+ 0xF8, 0x7F, 0x0F, 0x0F, 0x80, 0xF1, 0xE0, 0x0E, 0x38, 0x01, 0xCF, 0x00,
+ 0x39, 0xE0, 0x07, 0x38, 0x00, 0xE7, 0x00, 0x38, 0xE0, 0x07, 0x3C, 0x00,
+ 0xE7, 0x80, 0x38, 0xF8, 0x0F, 0x1F, 0x87, 0xC3, 0xFF, 0xF0, 0xE7, 0xFC,
+ 0x1C, 0x7E, 0x00, 0x01, 0xF8, 0x07, 0xFC, 0x0F, 0xFE, 0x1E, 0x0F, 0x3C,
+ 0x07, 0x78, 0x07, 0x70, 0x07, 0x70, 0x00, 0xF0, 0x00, 0xE0, 0x00, 0xE0,
+ 0x00, 0xE0, 0x00, 0xE0, 0x0E, 0xE0, 0x1C, 0xF0, 0x3C, 0x78, 0x78, 0x7F,
+ 0xF0, 0x3F, 0xE0, 0x0F, 0x80, 0x00, 0x00, 0x70, 0x00, 0x0F, 0x00, 0x00,
+ 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x01, 0xE0, 0x1F,
+ 0x1C, 0x07, 0xFD, 0xC0, 0xFF, 0xDC, 0x1E, 0x0F, 0xC3, 0xC0, 0x7C, 0x38,
+ 0x07, 0x87, 0x00, 0x38, 0x70, 0x03, 0x8F, 0x00, 0x38, 0xE0, 0x07, 0x8E,
+ 0x00, 0x70, 0xE0, 0x07, 0x0E, 0x00, 0xF0, 0xE0, 0x0F, 0x0F, 0x01, 0xF0,
+ 0x78, 0x7E, 0x07, 0xFF, 0xE0, 0x3F, 0xEE, 0x01, 0xF8, 0xE0, 0x01, 0xF8,
+ 0x03, 0xFF, 0x03, 0xFF, 0xC3, 0xC1, 0xF3, 0xC0, 0x79, 0xC0, 0x1D, 0xC0,
+ 0x0E, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x1C, 0x00, 0x0E,
+ 0x00, 0x07, 0x00, 0x73, 0xC0, 0x78, 0xF0, 0x78, 0x7F, 0xF8, 0x1F, 0xF8,
+ 0x03, 0xF0, 0x00, 0x01, 0xE0, 0x7C, 0x1F, 0x83, 0x80, 0x70, 0x1C, 0x03,
+ 0x83, 0xFC, 0x7F, 0x8F, 0xF0, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x0F, 0x01,
+ 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80,
+ 0xE0, 0x1C, 0x00, 0x00, 0xFC, 0x60, 0x7F, 0xCC, 0x1F, 0xFF, 0x87, 0xC3,
+ 0xF1, 0xE0, 0x3E, 0x38, 0x03, 0x8E, 0x00, 0x71, 0xC0, 0x0E, 0x38, 0x01,
+ 0xCE, 0x00, 0x79, 0xC0, 0x0E, 0x38, 0x01, 0xC7, 0x00, 0x78, 0xE0, 0x0F,
+ 0x1E, 0x03, 0xC1, 0xE1, 0xF8, 0x3F, 0xFF, 0x03, 0xFE, 0xE0, 0x1F, 0x1C,
+ 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x18, 0x38, 0x07, 0x07, 0x83, 0xC0,
+ 0x7F, 0xF8, 0x0F, 0xFC, 0x00, 0x7E, 0x00, 0x00, 0x07, 0x00, 0x01, 0xC0,
+ 0x00, 0x70, 0x00, 0x1C, 0x00, 0x0F, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00,
+ 0x38, 0xFC, 0x0E, 0xFF, 0x87, 0xFF, 0xF1, 0xF8, 0x3C, 0x7C, 0x07, 0x1E,
+ 0x01, 0xC7, 0x00, 0x73, 0xC0, 0x1C, 0xE0, 0x0F, 0x38, 0x03, 0x8E, 0x00,
+ 0xE3, 0x80, 0x39, 0xE0, 0x0E, 0x70, 0x07, 0x9C, 0x01, 0xC7, 0x00, 0x71,
+ 0xC0, 0x1C, 0xE0, 0x07, 0x38, 0x03, 0x80, 0x07, 0x07, 0x0F, 0x0E, 0x00,
+ 0x00, 0x00, 0x1E, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x38, 0x38, 0x38, 0x38,
+ 0x38, 0x78, 0x70, 0x70, 0x70, 0x70, 0xF0, 0xE0, 0xE0, 0x00, 0x3C, 0x00,
+ 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00,
+ 0x70, 0x01, 0xC0, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x1E, 0x00,
+ 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00,
+ 0x38, 0x00, 0xE0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x0F, 0x00,
+ 0x38, 0x00, 0xE0, 0x1F, 0x80, 0x7C, 0x03, 0xE0, 0x00, 0x07, 0x00, 0x00,
+ 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0xF0, 0x00, 0x1C, 0x00, 0x03,
+ 0x80, 0x00, 0x70, 0x1E, 0x0E, 0x07, 0x83, 0xC1, 0xE0, 0x70, 0x70, 0x0E,
+ 0x1C, 0x01, 0xCF, 0x00, 0x3B, 0xC0, 0x0F, 0xF8, 0x01, 0xFF, 0x80, 0x3E,
+ 0x70, 0x07, 0x8E, 0x00, 0xE0, 0xE0, 0x38, 0x1C, 0x07, 0x03, 0xC0, 0xE0,
+ 0x38, 0x1C, 0x07, 0x03, 0x80, 0xF0, 0xE0, 0x0E, 0x1C, 0x01, 0xE0, 0x07,
+ 0x07, 0x0F, 0x0E, 0x0E, 0x0E, 0x0E, 0x1E, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
+ 0x38, 0x38, 0x38, 0x38, 0x38, 0x78, 0x70, 0x70, 0x70, 0x70, 0xF0, 0xE0,
+ 0xE0, 0x1E, 0x7C, 0x0F, 0x83, 0xBF, 0xE7, 0xF8, 0x7F, 0xFD, 0xFF, 0x8F,
+ 0xC3, 0xF0, 0xF1, 0xE0, 0x3C, 0x0E, 0x38, 0x07, 0x01, 0xCF, 0x01, 0xE0,
+ 0x39, 0xC0, 0x38, 0x07, 0x38, 0x07, 0x00, 0xE7, 0x00, 0xE0, 0x1C, 0xE0,
+ 0x1C, 0x07, 0x3C, 0x07, 0x00, 0xE7, 0x00, 0xE0, 0x1C, 0xE0, 0x1C, 0x03,
+ 0x9C, 0x03, 0x80, 0xF3, 0x80, 0x70, 0x1C, 0x70, 0x1C, 0x03, 0x9C, 0x03,
+ 0x80, 0x73, 0x80, 0x70, 0x0E, 0x00, 0x1E, 0x3E, 0x07, 0x7F, 0xE1, 0xFF,
+ 0xF8, 0x7E, 0x0F, 0x1F, 0x01, 0xC7, 0x80, 0x73, 0xC0, 0x1C, 0xE0, 0x07,
+ 0x38, 0x03, 0xCE, 0x00, 0xE3, 0x80, 0x39, 0xE0, 0x0E, 0x70, 0x03, 0x9C,
+ 0x01, 0xC7, 0x00, 0x71, 0xC0, 0x1C, 0x70, 0x07, 0x38, 0x01, 0xCE, 0x00,
+ 0xE0, 0x01, 0xF8, 0x03, 0xFF, 0x03, 0xFF, 0xC3, 0xE1, 0xE3, 0xC0, 0x79,
+ 0xC0, 0x1D, 0xC0, 0x0E, 0xE0, 0x07, 0x70, 0x03, 0xF0, 0x01, 0xF8, 0x01,
+ 0xDC, 0x00, 0xEE, 0x00, 0x77, 0x00, 0x73, 0xC0, 0x78, 0xF0, 0xF8, 0x7F,
+ 0xF8, 0x1F, 0xF8, 0x03, 0xF0, 0x00, 0x03, 0x8F, 0x80, 0x1D, 0xFF, 0x01,
+ 0xFF, 0xFC, 0x0F, 0xC1, 0xE0, 0x7C, 0x07, 0x83, 0xC0, 0x1C, 0x1C, 0x00,
+ 0xE1, 0xE0, 0x07, 0x0E, 0x00, 0x38, 0x70, 0x01, 0xC3, 0x80, 0x1E, 0x1C,
+ 0x00, 0xE1, 0xE0, 0x07, 0x0F, 0x00, 0x70, 0x78, 0x07, 0x83, 0xF0, 0xF8,
+ 0x3F, 0xFF, 0x81, 0xDF, 0xF8, 0x0E, 0x3F, 0x00, 0x70, 0x00, 0x03, 0x80,
+ 0x00, 0x3C, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x03,
+ 0x80, 0x00, 0x00, 0x00, 0xF8, 0xF0, 0x7F, 0xEE, 0x0F, 0xFF, 0xE1, 0xF0,
+ 0xFE, 0x3C, 0x07, 0xE3, 0x80, 0x3E, 0x70, 0x03, 0xC7, 0x00, 0x3C, 0x70,
+ 0x03, 0xCE, 0x00, 0x3C, 0xE0, 0x07, 0x8E, 0x00, 0x78, 0xE0, 0x07, 0x8E,
+ 0x00, 0xF8, 0xF0, 0x1F, 0x87, 0x87, 0xF0, 0x7F, 0xF7, 0x03, 0xFE, 0x70,
+ 0x0F, 0x8F, 0x00, 0x00, 0xF0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E,
+ 0x00, 0x01, 0xE0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x04, 0x00, 0x1E,
+ 0x78, 0xE7, 0xC7, 0x7C, 0x3F, 0x01, 0xF0, 0x0F, 0x00, 0xF0, 0x07, 0x00,
+ 0x38, 0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E,
+ 0x00, 0x70, 0x07, 0x00, 0x38, 0x00, 0x01, 0xF8, 0x07, 0xFE, 0x0F, 0xFF,
+ 0x1E, 0x0F, 0x3C, 0x07, 0x38, 0x07, 0x38, 0x00, 0x3C, 0x00, 0x3F, 0x80,
+ 0x1F, 0xF8, 0x07, 0xFC, 0x00, 0x7E, 0x00, 0x0E, 0xE0, 0x0E, 0xE0, 0x1E,
+ 0xF0, 0x3C, 0x7F, 0xF8, 0x7F, 0xF0, 0x1F, 0xC0, 0x0E, 0x03, 0x80, 0xE0,
+ 0x38, 0x7F, 0xDF, 0xEF, 0xF8, 0x70, 0x1C, 0x0E, 0x03, 0x80, 0xE0, 0x38,
+ 0x1E, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x0F, 0x03, 0x80, 0xFC, 0x3F, 0x07,
+ 0x80, 0x1C, 0x03, 0xC7, 0x00, 0xE1, 0xC0, 0x38, 0xF0, 0x0E, 0x38, 0x03,
+ 0x8E, 0x00, 0xE3, 0x80, 0x70, 0xE0, 0x1C, 0x78, 0x07, 0x1C, 0x01, 0xC7,
+ 0x00, 0x71, 0xC0, 0x3C, 0x70, 0x0E, 0x38, 0x07, 0x8E, 0x03, 0xE3, 0x81,
+ 0xF8, 0xFF, 0xFE, 0x1F, 0xFF, 0x03, 0xF1, 0xC0, 0xE0, 0x07, 0xE0, 0x0F,
+ 0xE0, 0x0E, 0xE0, 0x1C, 0x70, 0x1C, 0x70, 0x38, 0x70, 0x38, 0x70, 0x70,
+ 0x70, 0xF0, 0x70, 0xE0, 0x71, 0xC0, 0x71, 0xC0, 0x33, 0x80, 0x3B, 0x80,
+ 0x3F, 0x00, 0x3F, 0x00, 0x3E, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0xE0, 0x1C,
+ 0x07, 0xE0, 0x3C, 0x0E, 0xE0, 0x3C, 0x0E, 0xE0, 0x7C, 0x1C, 0xE0, 0x7C,
+ 0x1C, 0xE0, 0xEC, 0x38, 0xE0, 0xEC, 0x38, 0x61, 0xCC, 0x70, 0x61, 0xCC,
+ 0x70, 0x63, 0x8C, 0xE0, 0x73, 0x8C, 0xE0, 0x77, 0x0C, 0xC0, 0x77, 0x0D,
+ 0xC0, 0x7E, 0x0D, 0x80, 0x7E, 0x0F, 0x80, 0x7C, 0x0F, 0x80, 0x7C, 0x0F,
+ 0x00, 0x78, 0x0F, 0x00, 0x78, 0x0E, 0x00, 0x0E, 0x00, 0xE1, 0xE0, 0x38,
+ 0x1C, 0x0E, 0x03, 0xC3, 0x80, 0x38, 0xE0, 0x07, 0xBC, 0x00, 0x77, 0x00,
+ 0x0F, 0xC0, 0x00, 0xF0, 0x00, 0x1C, 0x00, 0x07, 0xC0, 0x01, 0xF8, 0x00,
+ 0x77, 0x80, 0x1E, 0x70, 0x07, 0x8F, 0x00, 0xE0, 0xE0, 0x38, 0x1C, 0x0E,
+ 0x01, 0xC3, 0x80, 0x38, 0x00, 0x0E, 0x00, 0x70, 0xF0, 0x0F, 0x07, 0x00,
+ 0xE0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x38, 0x07, 0x03, 0x80, 0x70,
+ 0x70, 0x07, 0x07, 0x00, 0x70, 0xE0, 0x03, 0x9E, 0x00, 0x39, 0xC0, 0x03,
+ 0xB8, 0x00, 0x3B, 0x80, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xE0, 0x00,
+ 0x1E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00,
+ 0x07, 0x00, 0x00, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xC0, 0x00, 0xF0, 0x00,
+ 0x00, 0x07, 0xFF, 0xC0, 0xFF, 0xF8, 0x3F, 0xFF, 0x00, 0x01, 0xC0, 0x00,
+ 0x70, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0x70, 0x00, 0x1C,
+ 0x00, 0x07, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00,
+ 0x03, 0xC0, 0x00, 0x7F, 0xFE, 0x1F, 0xFF, 0xC3, 0xFF, 0xF8, 0x00, 0x00,
+ 0x70, 0x1F, 0x01, 0xF0, 0x3C, 0x03, 0x80, 0x38, 0x07, 0x00, 0x70, 0x07,
+ 0x00, 0x70, 0x07, 0x00, 0xE0, 0x0E, 0x01, 0xE0, 0x3C, 0x0F, 0x80, 0xE0,
+ 0x0F, 0x00, 0x78, 0x03, 0x80, 0x38, 0x03, 0x80, 0x38, 0x03, 0x80, 0x38,
+ 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x0E, 0x00, 0xF8, 0x0F, 0x80, 0x78,
+ 0x00, 0x01, 0x80, 0xC0, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x0C, 0x06, 0x03,
+ 0x01, 0x81, 0xC0, 0xC0, 0x60, 0x30, 0x18, 0x18, 0x0C, 0x06, 0x03, 0x01,
+ 0x81, 0x80, 0xC0, 0x60, 0x30, 0x38, 0x18, 0x0C, 0x06, 0x03, 0x03, 0x01,
+ 0x80, 0xC0, 0x00, 0x01, 0xE0, 0x1F, 0x01, 0xF0, 0x07, 0x00, 0xE0, 0x0E,
+ 0x00, 0xE0, 0x0E, 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x1C,
+ 0x01, 0xE0, 0x0F, 0x00, 0x70, 0x1F, 0x03, 0xC0, 0x78, 0x07, 0x00, 0x70,
+ 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x01, 0xC0, 0x1C, 0x03, 0xC0,
+ 0xF8, 0x0F, 0x80, 0xE0, 0x00, 0x1C, 0x00, 0x3F, 0x00, 0x7F, 0x83, 0x63,
+ 0xC7, 0xC1, 0xFE, 0x00, 0xFC, 0x00, 0x78 };
+
+const GFXglyph FreeSansOblique18pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 10, 0, 1 }, // 0x20 ' '
+ { 0, 9, 26, 10, 4, -25 }, // 0x21 '!'
+ { 30, 10, 9, 12, 6, -24 }, // 0x22 '"'
+ { 42, 21, 25, 19, 2, -24 }, // 0x23 '#'
+ { 108, 20, 31, 19, 2, -26 }, // 0x24 '$'
+ { 186, 26, 25, 31, 5, -24 }, // 0x25 '%'
+ { 268, 20, 25, 23, 3, -24 }, // 0x26 '&'
+ { 331, 4, 9, 7, 6, -24 }, // 0x27 '''
+ { 336, 12, 33, 12, 4, -25 }, // 0x28 '('
+ { 386, 12, 33, 12, -1, -24 }, // 0x29 ')'
+ { 436, 10, 10, 14, 6, -25 }, // 0x2A '*'
+ { 449, 18, 16, 20, 3, -15 }, // 0x2B '+'
+ { 485, 5, 8, 10, 2, -2 }, // 0x2C ','
+ { 490, 9, 3, 12, 3, -10 }, // 0x2D '-'
+ { 494, 4, 4, 10, 3, -3 }, // 0x2E '.'
+ { 496, 15, 26, 10, 0, -25 }, // 0x2F '/'
+ { 545, 18, 25, 19, 3, -24 }, // 0x30 '0'
+ { 602, 10, 25, 19, 7, -24 }, // 0x31 '1'
+ { 634, 20, 25, 19, 2, -24 }, // 0x32 '2'
+ { 697, 19, 25, 19, 2, -24 }, // 0x33 '3'
+ { 757, 18, 25, 19, 2, -24 }, // 0x34 '4'
+ { 814, 20, 25, 19, 2, -24 }, // 0x35 '5'
+ { 877, 19, 25, 19, 3, -24 }, // 0x36 '6'
+ { 937, 18, 25, 19, 5, -24 }, // 0x37 '7'
+ { 994, 19, 25, 19, 3, -24 }, // 0x38 '8'
+ { 1054, 19, 25, 19, 2, -24 }, // 0x39 '9'
+ { 1114, 7, 19, 10, 4, -18 }, // 0x3A ':'
+ { 1131, 8, 24, 10, 3, -18 }, // 0x3B ';'
+ { 1155, 19, 17, 20, 3, -16 }, // 0x3C '<'
+ { 1196, 18, 9, 20, 3, -12 }, // 0x3D '='
+ { 1217, 19, 17, 20, 2, -15 }, // 0x3E '>'
+ { 1258, 16, 26, 19, 6, -25 }, // 0x3F '?'
+ { 1310, 33, 31, 36, 3, -25 }, // 0x40 '@'
+ { 1438, 23, 26, 23, 0, -25 }, // 0x41 'A'
+ { 1513, 21, 26, 23, 3, -25 }, // 0x42 'B'
+ { 1582, 22, 26, 25, 4, -25 }, // 0x43 'C'
+ { 1654, 23, 26, 25, 3, -25 }, // 0x44 'D'
+ { 1729, 23, 26, 23, 3, -25 }, // 0x45 'E'
+ { 1804, 22, 26, 21, 3, -25 }, // 0x46 'F'
+ { 1876, 24, 26, 27, 4, -25 }, // 0x47 'G'
+ { 1954, 25, 26, 25, 3, -25 }, // 0x48 'H'
+ { 2036, 8, 26, 10, 4, -25 }, // 0x49 'I'
+ { 2062, 18, 26, 18, 2, -25 }, // 0x4A 'J'
+ { 2121, 25, 26, 23, 3, -25 }, // 0x4B 'K'
+ { 2203, 16, 26, 19, 3, -25 }, // 0x4C 'L'
+ { 2255, 29, 26, 30, 3, -25 }, // 0x4D 'M'
+ { 2350, 25, 26, 26, 3, -25 }, // 0x4E 'N'
+ { 2432, 24, 26, 27, 4, -25 }, // 0x4F 'O'
+ { 2510, 22, 26, 23, 3, -25 }, // 0x50 'P'
+ { 2582, 25, 28, 27, 4, -25 }, // 0x51 'Q'
+ { 2670, 23, 26, 25, 3, -25 }, // 0x52 'R'
+ { 2745, 22, 26, 23, 3, -25 }, // 0x53 'S'
+ { 2817, 20, 26, 21, 6, -25 }, // 0x54 'T'
+ { 2882, 24, 26, 25, 4, -25 }, // 0x55 'U'
+ { 2960, 21, 26, 23, 6, -25 }, // 0x56 'V'
+ { 3029, 32, 26, 33, 6, -25 }, // 0x57 'W'
+ { 3133, 27, 26, 23, 1, -25 }, // 0x58 'X'
+ { 3221, 23, 26, 24, 6, -25 }, // 0x59 'Y'
+ { 3296, 25, 26, 21, 1, -25 }, // 0x5A 'Z'
+ { 3378, 13, 33, 10, 1, -25 }, // 0x5B '['
+ { 3432, 4, 26, 10, 5, -25 }, // 0x5C '\'
+ { 3445, 13, 33, 10, -1, -24 }, // 0x5D ']'
+ { 3499, 14, 14, 16, 3, -24 }, // 0x5E '^'
+ { 3524, 21, 2, 19, -2, 5 }, // 0x5F '_'
+ { 3530, 6, 5, 12, 6, -25 }, // 0x60 '`'
+ { 3534, 18, 19, 19, 2, -18 }, // 0x61 'a'
+ { 3577, 19, 26, 20, 2, -25 }, // 0x62 'b'
+ { 3639, 16, 19, 18, 3, -18 }, // 0x63 'c'
+ { 3677, 20, 26, 20, 3, -25 }, // 0x64 'd'
+ { 3742, 17, 19, 19, 3, -18 }, // 0x65 'e'
+ { 3783, 11, 26, 9, 2, -25 }, // 0x66 'f'
+ { 3819, 19, 27, 19, 2, -18 }, // 0x67 'g'
+ { 3884, 18, 26, 19, 2, -25 }, // 0x68 'h'
+ { 3943, 8, 26, 8, 2, -25 }, // 0x69 'i'
+ { 3969, 14, 34, 8, -2, -25 }, // 0x6A 'j'
+ { 4029, 19, 26, 18, 2, -25 }, // 0x6B 'k'
+ { 4091, 8, 26, 8, 2, -25 }, // 0x6C 'l'
+ { 4117, 27, 19, 29, 2, -18 }, // 0x6D 'm'
+ { 4182, 18, 19, 19, 2, -18 }, // 0x6E 'n'
+ { 4225, 17, 19, 19, 3, -18 }, // 0x6F 'o'
+ { 4266, 21, 26, 20, 0, -18 }, // 0x70 'p'
+ { 4335, 20, 27, 19, 2, -18 }, // 0x71 'q'
+ { 4403, 13, 19, 11, 2, -18 }, // 0x72 'r'
+ { 4434, 16, 19, 18, 2, -18 }, // 0x73 's'
+ { 4472, 10, 23, 9, 3, -22 }, // 0x74 't'
+ { 4501, 18, 19, 19, 3, -18 }, // 0x75 'u'
+ { 4544, 16, 19, 17, 4, -18 }, // 0x76 'v'
+ { 4582, 24, 19, 25, 4, -18 }, // 0x77 'w'
+ { 4639, 19, 19, 17, 1, -18 }, // 0x78 'x'
+ { 4685, 20, 27, 17, 0, -18 }, // 0x79 'y'
+ { 4753, 19, 19, 17, 1, -18 }, // 0x7A 'z'
+ { 4799, 12, 33, 12, 3, -25 }, // 0x7B '{'
+ { 4849, 9, 33, 9, 2, -25 }, // 0x7C '|'
+ { 4887, 12, 33, 12, 0, -24 }, // 0x7D '}'
+ { 4937, 16, 7, 20, 5, -15 } }; // 0x7E '~'
+
+const GFXfont FreeSansOblique18pt7b PROGMEM = {
+ (uint8_t *)FreeSansOblique18pt7bBitmaps,
+ (GFXglyph *)FreeSansOblique18pt7bGlyphs,
+ 0x20, 0x7E, 42 };
+
+// Approx. 5623 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansOblique24pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansOblique24pt7b.h
new file mode 100644
index 000000000000..4c8c8ab024cc
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansOblique24pt7b.h
@@ -0,0 +1,840 @@
+const uint8_t FreeSansOblique24pt7bBitmaps[] PROGMEM = {
+ 0x01, 0xE0, 0x3C, 0x0F, 0x81, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x3C, 0x07,
+ 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x03,
+ 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x38, 0x07, 0x00, 0xE0, 0x18, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xF0, 0x1E, 0x07, 0x80, 0xF0, 0x1E, 0x00, 0x78,
+ 0x7B, 0xC3, 0xDE, 0x1F, 0xE1, 0xEF, 0x0F, 0x78, 0x7B, 0xC3, 0xDC, 0x1C,
+ 0xE0, 0xE7, 0x07, 0x30, 0x31, 0x81, 0x80, 0x00, 0x07, 0x81, 0xC0, 0x00,
+ 0x78, 0x3C, 0x00, 0x07, 0x03, 0xC0, 0x00, 0xF0, 0x38, 0x00, 0x0E, 0x07,
+ 0x80, 0x01, 0xE0, 0x70, 0x00, 0x1E, 0x0F, 0x00, 0x01, 0xC0, 0xF0, 0x00,
+ 0x3C, 0x0E, 0x00, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF,
+ 0xFE, 0x00, 0x70, 0x3C, 0x00, 0x0F, 0x03, 0x80, 0x00, 0xF0, 0x78, 0x00,
+ 0x0E, 0x07, 0x80, 0x01, 0xE0, 0x70, 0x00, 0x1C, 0x0F, 0x00, 0x03, 0xC0,
+ 0xE0, 0x00, 0x3C, 0x1E, 0x00, 0x03, 0x81, 0xE0, 0x0F, 0xFF, 0xFF, 0xE0,
+ 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xE0, 0x0F, 0x03, 0x80, 0x00, 0xE0,
+ 0x78, 0x00, 0x1E, 0x07, 0x00, 0x01, 0xC0, 0xF0, 0x00, 0x1C, 0x0F, 0x00,
+ 0x03, 0xC0, 0xE0, 0x00, 0x38, 0x1E, 0x00, 0x07, 0x81, 0xC0, 0x00, 0x78,
+ 0x3C, 0x00, 0x07, 0x03, 0xC0, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x30,
+ 0x00, 0x00, 0x7F, 0x80, 0x00, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0x00, 0x7F,
+ 0xFF, 0xE0, 0x1F, 0x18, 0xF8, 0x0F, 0x8E, 0x1F, 0x07, 0xC3, 0x83, 0xC1,
+ 0xE0, 0xE0, 0xF0, 0x70, 0x38, 0x3C, 0x3C, 0x0C, 0x0F, 0x0F, 0x07, 0x00,
+ 0x03, 0xC1, 0xC0, 0x00, 0xF0, 0x70, 0x00, 0x3E, 0x1C, 0x00, 0x0F, 0xE6,
+ 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x3F, 0xFE, 0x00, 0x03, 0xFF, 0xE0, 0x00,
+ 0x3F, 0xFC, 0x00, 0x03, 0xFF, 0x80, 0x01, 0xC7, 0xF0, 0x00, 0x70, 0x7C,
+ 0x00, 0x1C, 0x0F, 0x00, 0x06, 0x03, 0xCF, 0x03, 0x80, 0xF3, 0xC0, 0xE0,
+ 0x3C, 0xF0, 0x38, 0x0E, 0x3C, 0x0E, 0x07, 0x8F, 0x03, 0x01, 0xE3, 0xE1,
+ 0xC0, 0xF0, 0xF8, 0x70, 0x78, 0x1F, 0x9C, 0xFC, 0x03, 0xFF, 0xFE, 0x00,
+ 0x7F, 0xFF, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0E, 0x00,
+ 0x00, 0x03, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x07, 0x80, 0x1F, 0x00, 0x00, 0x70, 0x07, 0xFC, 0x00, 0x0E,
+ 0x00, 0xFF, 0xE0, 0x01, 0xC0, 0x1E, 0x1E, 0x00, 0x3C, 0x03, 0x80, 0xF0,
+ 0x03, 0x80, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x0E, 0x00, 0xE0,
+ 0x07, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x3C, 0x00, 0xE0, 0x0E, 0x03, 0x80,
+ 0x0E, 0x00, 0xE0, 0x70, 0x00, 0xF0, 0x1C, 0x0E, 0x00, 0x07, 0x87, 0xC1,
+ 0xE0, 0x00, 0x7F, 0xF8, 0x1C, 0x00, 0x03, 0xFE, 0x03, 0x80, 0x00, 0x0F,
+ 0x80, 0x70, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x1F,
+ 0x00, 0x00, 0x1C, 0x07, 0xFC, 0x00, 0x03, 0x80, 0xFF, 0xE0, 0x00, 0x70,
+ 0x1E, 0x1E, 0x00, 0x0F, 0x03, 0x80, 0xF0, 0x00, 0xE0, 0x70, 0x07, 0x00,
+ 0x1C, 0x07, 0x00, 0x70, 0x03, 0x80, 0xE0, 0x07, 0x00, 0x70, 0x0E, 0x00,
+ 0x70, 0x0F, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x1C, 0x00,
+ 0xF0, 0x1C, 0x03, 0x80, 0x07, 0x87, 0xC0, 0x70, 0x00, 0x7F, 0xF8, 0x07,
+ 0x00, 0x03, 0xFE, 0x00, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF8, 0x00,
+ 0x03, 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0xF8, 0x7C, 0x00, 0x78, 0x0F,
+ 0x00, 0x1E, 0x03, 0xC0, 0x0F, 0x00, 0xF0, 0x03, 0xC0, 0x3C, 0x00, 0xF0,
+ 0x1E, 0x00, 0x3C, 0x07, 0x80, 0x0F, 0x87, 0xC0, 0x01, 0xE3, 0xE0, 0x00,
+ 0x7F, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x03, 0xFC, 0x00,
+ 0x03, 0xFF, 0x00, 0x01, 0xFB, 0xE0, 0x70, 0xF8, 0x7C, 0x1C, 0x7C, 0x1F,
+ 0x0E, 0x3C, 0x03, 0xE3, 0x9E, 0x00, 0x79, 0xE7, 0x80, 0x1F, 0xF3, 0xC0,
+ 0x03, 0xF8, 0xF0, 0x00, 0xFE, 0x3C, 0x00, 0x1F, 0x0F, 0x00, 0x07, 0xC3,
+ 0xE0, 0x03, 0xF8, 0xF8, 0x03, 0xFE, 0x3F, 0x83, 0xF7, 0xC7, 0xFF, 0xF8,
+ 0xF0, 0xFF, 0xFC, 0x3E, 0x1F, 0xFC, 0x07, 0x81, 0xFC, 0x00, 0x00, 0x7B,
+ 0xDF, 0xEF, 0x7B, 0xDC, 0xE7, 0x31, 0x80, 0x00, 0x0E, 0x00, 0x38, 0x00,
+ 0xE0, 0x03, 0x80, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xE0, 0x03, 0x80,
+ 0x0F, 0x00, 0x1C, 0x00, 0x78, 0x00, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x0E,
+ 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00,
+ 0x1C, 0x00, 0x78, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E,
+ 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80,
+ 0x07, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x30, 0x00,
+ 0x70, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, 0x30, 0x00, 0x70, 0x00, 0xE0,
+ 0x00, 0xC0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x0E, 0x00,
+ 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07,
+ 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x01, 0xE0, 0x03, 0x80,
+ 0x07, 0x00, 0x0E, 0x00, 0x3C, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x07,
+ 0x00, 0x0E, 0x00, 0x3C, 0x00, 0x70, 0x01, 0xE0, 0x03, 0x80, 0x0F, 0x00,
+ 0x1C, 0x00, 0x78, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x1C, 0x00, 0x70,
+ 0x01, 0xC0, 0x07, 0x00, 0x00, 0x01, 0xC0, 0x07, 0x00, 0x38, 0x18, 0xE3,
+ 0x7B, 0xBF, 0xFF, 0xF3, 0xFF, 0x01, 0xE0, 0x1F, 0xC0, 0xF7, 0x07, 0x9E,
+ 0x1C, 0x38, 0x20, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x78,
+ 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00,
+ 0x00, 0x1C, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xE0, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00,
+ 0x78, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07,
+ 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x3E, 0x7C, 0xF9, 0xE7,
+ 0xC1, 0x83, 0x0C, 0x18, 0x63, 0xC6, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFE, 0x7D, 0xF7, 0xBE, 0xF8, 0x00, 0x00, 0x18, 0x00, 0x01, 0xC0, 0x00,
+ 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00,
+ 0x00, 0x30, 0x00, 0x03, 0x80, 0x00, 0x18, 0x00, 0x01, 0xC0, 0x00, 0x0C,
+ 0x00, 0x00, 0xE0, 0x00, 0x06, 0x00, 0x00, 0x70, 0x00, 0x03, 0x00, 0x00,
+ 0x38, 0x00, 0x01, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xC0, 0x00, 0x0E, 0x00,
+ 0x00, 0x60, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x38,
+ 0x00, 0x01, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xC0, 0x00, 0x0E, 0x00, 0x00,
+ 0x60, 0x00, 0x07, 0x00, 0x00, 0x30, 0x00, 0x03, 0x80, 0x00, 0x18, 0x00,
+ 0x00, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0xE0, 0x03, 0xFF, 0xE0, 0x0F, 0xFF,
+ 0xE0, 0x3F, 0x0F, 0xC0, 0xF8, 0x07, 0x81, 0xE0, 0x0F, 0x87, 0x80, 0x0F,
+ 0x1F, 0x00, 0x1E, 0x3C, 0x00, 0x3C, 0x78, 0x00, 0x79, 0xE0, 0x00, 0xF3,
+ 0xC0, 0x01, 0xE7, 0x80, 0x07, 0xDE, 0x00, 0x0F, 0xBC, 0x00, 0x1E, 0x78,
+ 0x00, 0x3C, 0xF0, 0x00, 0x79, 0xE0, 0x00, 0xF7, 0x80, 0x03, 0xEF, 0x00,
+ 0x07, 0xDE, 0x00, 0x0F, 0x3C, 0x00, 0x1E, 0x78, 0x00, 0x7C, 0xF0, 0x00,
+ 0xF1, 0xE0, 0x03, 0xE3, 0xC0, 0x07, 0x87, 0xC0, 0x1F, 0x0F, 0x80, 0x7C,
+ 0x0F, 0xC3, 0xF0, 0x1F, 0xFF, 0xC0, 0x1F, 0xFF, 0x00, 0x1F, 0xFC, 0x00,
+ 0x0F, 0xC0, 0x00, 0x00, 0x18, 0x01, 0xC0, 0x1C, 0x01, 0xE0, 0x1F, 0x0F,
+ 0xFB, 0xFF, 0xDF, 0xFC, 0xFF, 0xE0, 0x0F, 0x00, 0x78, 0x07, 0xC0, 0x3C,
+ 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x07, 0xC0, 0x3C, 0x01, 0xE0, 0x0F, 0x00,
+ 0x78, 0x07, 0xC0, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x07, 0xC0, 0x3C,
+ 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x07, 0xC0, 0x3C, 0x00, 0x00, 0x03, 0xFC,
+ 0x00, 0x03, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xE0, 0x0F,
+ 0xC0, 0xFC, 0x03, 0xE0, 0x07, 0xC0, 0xF8, 0x00, 0xF8, 0x1F, 0x00, 0x0F,
+ 0x03, 0xC0, 0x01, 0xE0, 0xF8, 0x00, 0x3C, 0x1E, 0x00, 0x07, 0x80, 0x00,
+ 0x01, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xE0,
+ 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F,
+ 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x00,
+ 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xE0, 0x00,
+ 0x00, 0xF8, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xFF,
+ 0xFF, 0xFC, 0x3F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFC,
+ 0x00, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x3F,
+ 0xFF, 0xE0, 0x1F, 0x81, 0xF8, 0x1F, 0x00, 0x7C, 0x1F, 0x00, 0x1E, 0x0F,
+ 0x00, 0x0F, 0x0F, 0x80, 0x07, 0x87, 0x80, 0x03, 0xC0, 0x00, 0x03, 0xC0,
+ 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0xE0,
+ 0x00, 0x3F, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x3F,
+ 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00,
+ 0x79, 0xE0, 0x00, 0x3C, 0xF0, 0x00, 0x1E, 0x78, 0x00, 0x1E, 0x3C, 0x00,
+ 0x0F, 0x1E, 0x00, 0x0F, 0x0F, 0x80, 0x1F, 0x83, 0xF0, 0x3F, 0x81, 0xFF,
+ 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x1F, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x00,
+ 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7E,
+ 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xBC,
+ 0x00, 0x0F, 0xBC, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x78, 0x00, 0x7C, 0x78,
+ 0x00, 0xF8, 0x78, 0x00, 0xF0, 0x78, 0x01, 0xE0, 0xF0, 0x03, 0xC0, 0xF0,
+ 0x07, 0x80, 0xF0, 0x0F, 0x00, 0xF0, 0x1E, 0x01, 0xF0, 0x3C, 0x01, 0xE0,
+ 0x78, 0x01, 0xE0, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
+ 0xFF, 0xFF, 0xFE, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0,
+ 0x00, 0x07, 0x80, 0x00, 0x07, 0x80, 0x00, 0x07, 0x80, 0x00, 0x07, 0x80,
+ 0x00, 0x0F, 0x80, 0x00, 0x7F, 0xFF, 0xC0, 0x1F, 0xFF, 0xF8, 0x03, 0xFF,
+ 0xFF, 0x00, 0x7F, 0xFF, 0xE0, 0x1E, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00,
+ 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x78, 0x00,
+ 0x00, 0x1E, 0x00, 0x00, 0x03, 0xC7, 0xE0, 0x00, 0xF7, 0xFF, 0x80, 0x1F,
+ 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0x80, 0xFE, 0x03, 0xF0, 0x1F, 0x00, 0x3F,
+ 0x03, 0xC0, 0x03, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x07, 0x80, 0x00,
+ 0x00, 0xF0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x70,
+ 0x00, 0x00, 0x1E, 0x1E, 0x00, 0x03, 0xC3, 0xC0, 0x00, 0xF0, 0x7C, 0x00,
+ 0x3C, 0x0F, 0x80, 0x0F, 0x80, 0xFC, 0x07, 0xE0, 0x1F, 0xFF, 0xF8, 0x01,
+ 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x07,
+ 0xE0, 0x00, 0x3F, 0xF8, 0x00, 0x7F, 0xFC, 0x00, 0xFF, 0xFE, 0x01, 0xF8,
+ 0x3E, 0x03, 0xE0, 0x1F, 0x07, 0xC0, 0x1F, 0x0F, 0x80, 0x0F, 0x0F, 0x00,
+ 0x0F, 0x1F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x1F,
+ 0x80, 0x3C, 0x7F, 0xE0, 0x3D, 0xFF, 0xF0, 0x7B, 0xFF, 0xF8, 0x7F, 0xC1,
+ 0xF8, 0x7F, 0x00, 0x7C, 0x7E, 0x00, 0x7C, 0xFC, 0x00, 0x3C, 0xF8, 0x00,
+ 0x3C, 0xF8, 0x00, 0x3C, 0xF0, 0x00, 0x3C, 0xF0, 0x00, 0x38, 0xF0, 0x00,
+ 0x78, 0xF0, 0x00, 0x78, 0xF0, 0x00, 0xF0, 0xF8, 0x01, 0xF0, 0x7C, 0x03,
+ 0xE0, 0x7E, 0x0F, 0xC0, 0x3F, 0xFF, 0xC0, 0x3F, 0xFF, 0x80, 0x0F, 0xFE,
+ 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xE1, 0xFF,
+ 0xFF, 0xF8, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0x80,
+ 0x00, 0x03, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78,
+ 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0x80, 0x00, 0x03,
+ 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3C, 0x00, 0x00,
+ 0x1E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xE0, 0x00,
+ 0x00, 0xF8, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0x80,
+ 0x00, 0x03, 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E,
+ 0x00, 0x00, 0x0F, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00,
+ 0x78, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xFE, 0x00, 0x1F,
+ 0xFF, 0x80, 0x1F, 0xFF, 0xE0, 0x1F, 0x81, 0xF8, 0x1F, 0x00, 0x7C, 0x0F,
+ 0x00, 0x1E, 0x0F, 0x00, 0x0F, 0x07, 0x80, 0x07, 0x83, 0xC0, 0x03, 0xC1,
+ 0xE0, 0x03, 0xC0, 0xF8, 0x03, 0xC0, 0x7E, 0x07, 0xC0, 0x1F, 0xFF, 0xC0,
+ 0x07, 0xFF, 0xC0, 0x03, 0xFF, 0xE0, 0x07, 0xFF, 0xF8, 0x07, 0xE0, 0x7E,
+ 0x07, 0xC0, 0x0F, 0x07, 0x80, 0x07, 0xC7, 0xC0, 0x01, 0xE3, 0xC0, 0x00,
+ 0xF3, 0xC0, 0x00, 0x79, 0xE0, 0x00, 0x3C, 0xF0, 0x00, 0x1C, 0x78, 0x00,
+ 0x1E, 0x3C, 0x00, 0x0F, 0x1F, 0x00, 0x0F, 0x0F, 0xC0, 0x0F, 0x83, 0xF0,
+ 0x3F, 0x81, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x01,
+ 0xFE, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0xF0, 0x01, 0xFF, 0xFC,
+ 0x03, 0xFF, 0xFC, 0x07, 0xF0, 0x7E, 0x07, 0xC0, 0x3E, 0x0F, 0x80, 0x1F,
+ 0x0F, 0x00, 0x0F, 0x1E, 0x00, 0x0F, 0x1E, 0x00, 0x0F, 0x3C, 0x00, 0x0F,
+ 0x3C, 0x00, 0x0F, 0x3C, 0x00, 0x1F, 0x3C, 0x00, 0x1F, 0x3C, 0x00, 0x3F,
+ 0x3E, 0x00, 0x7E, 0x3E, 0x00, 0xFE, 0x1F, 0x83, 0xFE, 0x1F, 0xFF, 0xFE,
+ 0x0F, 0xFF, 0xBC, 0x07, 0xFE, 0x3C, 0x01, 0xF8, 0x7C, 0x00, 0x00, 0x7C,
+ 0x00, 0x00, 0x78, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF0, 0xF0, 0x01, 0xF0,
+ 0xF0, 0x03, 0xE0, 0xF8, 0x07, 0xC0, 0xFC, 0x1F, 0xC0, 0x7F, 0xFF, 0x80,
+ 0x3F, 0xFE, 0x00, 0x1F, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xC1, 0xF0,
+ 0x78, 0x3E, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x1F,
+ 0x07, 0x83, 0xE0, 0xF8, 0x00, 0x03, 0xE0, 0x7C, 0x0F, 0x03, 0xE0, 0x7C,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x7C, 0x0F,
+ 0x81, 0xE0, 0x7C, 0x01, 0x80, 0x30, 0x0C, 0x01, 0x80, 0x60, 0x3C, 0x06,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x70, 0x00, 0x00, 0xF8, 0x00,
+ 0x00, 0xFE, 0x00, 0x01, 0xFF, 0x00, 0x03, 0xFE, 0x00, 0x03, 0xFE, 0x00,
+ 0x07, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0x07, 0xF0, 0x00,
+ 0x03, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE,
+ 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x1F, 0xF0, 0x00,
+ 0x01, 0xFF, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0E,
+ 0x00, 0x00, 0x00, 0x80, 0x1F, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xE3, 0xFF,
+ 0xFF, 0xF8, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF,
+ 0xC7, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xF8, 0x04, 0x00, 0x00, 0x01, 0xC0,
+ 0x00, 0x00, 0xFC, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x03, 0xFE, 0x00, 0x00,
+ 0x3F, 0xE0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE,
+ 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00,
+ 0x3F, 0x80, 0x00, 0x7F, 0xC0, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x01,
+ 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x00,
+ 0x7C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xFE,
+ 0x00, 0x3F, 0xF8, 0x0F, 0xFF, 0xC1, 0xFF, 0xFE, 0x1F, 0x03, 0xE3, 0xE0,
+ 0x1F, 0x7C, 0x00, 0xF7, 0x80, 0x0F, 0x78, 0x00, 0xFF, 0x00, 0x0F, 0xF0,
+ 0x01, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80,
+ 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x1F, 0x00,
+ 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x0F, 0x80,
+ 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x3E,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF,
+ 0x80, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFE,
+ 0x00, 0x00, 0x7F, 0xE0, 0x0F, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0xE0,
+ 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x0F, 0xC0, 0x00, 0x00, 0xFC, 0x00,
+ 0xFC, 0x00, 0x00, 0x01, 0xF0, 0x0F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0xF8,
+ 0x00, 0xFC, 0x00, 0x3E, 0x0F, 0x80, 0x1F, 0xF9, 0xE1, 0xF0, 0x78, 0x03,
+ 0xFF, 0xCF, 0x07, 0x87, 0xC0, 0x3F, 0x0F, 0xF0, 0x3C, 0x7C, 0x03, 0xE0,
+ 0x3F, 0x01, 0xE3, 0xC0, 0x3E, 0x01, 0xF8, 0x0F, 0x3E, 0x03, 0xE0, 0x0F,
+ 0x80, 0x79, 0xE0, 0x1E, 0x00, 0x7C, 0x03, 0xDF, 0x01, 0xE0, 0x03, 0xC0,
+ 0x3E, 0xF0, 0x1F, 0x00, 0x3E, 0x01, 0xE7, 0x80, 0xF0, 0x01, 0xE0, 0x0F,
+ 0x38, 0x07, 0x80, 0x0F, 0x00, 0xFB, 0xC0, 0x78, 0x00, 0xF0, 0x07, 0x9E,
+ 0x03, 0xC0, 0x07, 0x80, 0x7C, 0xF0, 0x1E, 0x00, 0x78, 0x07, 0xC7, 0x80,
+ 0xF0, 0x07, 0xC0, 0x7E, 0x3C, 0x07, 0x80, 0x7C, 0x07, 0xE1, 0xE0, 0x3E,
+ 0x07, 0xE0, 0x7E, 0x0F, 0x00, 0xF8, 0x7F, 0x8F, 0xC0, 0x7C, 0x07, 0xFF,
+ 0x7F, 0xFC, 0x01, 0xE0, 0x1F, 0xF1, 0xFF, 0x80, 0x0F, 0x00, 0x7E, 0x0F,
+ 0xF0, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00,
+ 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0xF8, 0x00, 0x00,
+ 0x0F, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x00, 0x00, 0x00,
+ 0x3F, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1F, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00,
+ 0x1F, 0xE0, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xDF, 0x00, 0x00, 0x1E,
+ 0x7C, 0x00, 0x00, 0x79, 0xF0, 0x00, 0x03, 0xC7, 0xC0, 0x00, 0x0F, 0x1F,
+ 0x00, 0x00, 0x78, 0x3C, 0x00, 0x03, 0xE0, 0xF0, 0x00, 0x0F, 0x03, 0xE0,
+ 0x00, 0x78, 0x0F, 0x80, 0x01, 0xE0, 0x3E, 0x00, 0x0F, 0x00, 0xF8, 0x00,
+ 0x3C, 0x03, 0xE0, 0x01, 0xE0, 0x0F, 0x80, 0x0F, 0x80, 0x1E, 0x00, 0x3C,
+ 0x00, 0x7C, 0x01, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF,
+ 0xFF, 0x00, 0xFF, 0xFF, 0xFC, 0x07, 0xC0, 0x01, 0xF0, 0x3E, 0x00, 0x03,
+ 0xC0, 0xF8, 0x00, 0x0F, 0x87, 0xC0, 0x00, 0x3E, 0x1E, 0x00, 0x00, 0xF8,
+ 0xF8, 0x00, 0x03, 0xE3, 0xC0, 0x00, 0x0F, 0x9F, 0x00, 0x00, 0x3E, 0xF8,
+ 0x00, 0x00, 0x7B, 0xE0, 0x00, 0x01, 0xF0, 0x01, 0xFF, 0xFF, 0x00, 0x0F,
+ 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0xE0, 0x3E, 0x00,
+ 0x1F, 0x81, 0xE0, 0x00, 0x7C, 0x0F, 0x00, 0x01, 0xE0, 0x78, 0x00, 0x0F,
+ 0x03, 0xC0, 0x00, 0x78, 0x3C, 0x00, 0x03, 0xC1, 0xE0, 0x00, 0x3C, 0x0F,
+ 0x00, 0x01, 0xE0, 0x78, 0x00, 0x1E, 0x07, 0xC0, 0x03, 0xE0, 0x3F, 0xFF,
+ 0xFC, 0x01, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFE,
+ 0x07, 0x80, 0x01, 0xF0, 0x3C, 0x00, 0x07, 0xC1, 0xE0, 0x00, 0x1E, 0x0F,
+ 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x07, 0x87, 0x80, 0x00, 0x3C, 0x3C, 0x00,
+ 0x01, 0xE1, 0xE0, 0x00, 0x1E, 0x1F, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x0F,
+ 0x87, 0x80, 0x00, 0xF8, 0x3C, 0x00, 0x1F, 0x81, 0xFF, 0xFF, 0xF8, 0x1F,
+ 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0x00, 0x00, 0x00,
+ 0x01, 0xFE, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x1F,
+ 0xFF, 0xFC, 0x00, 0xFE, 0x03, 0xF0, 0x07, 0xE0, 0x03, 0xE0, 0x3E, 0x00,
+ 0x07, 0x81, 0xF0, 0x00, 0x1E, 0x07, 0x80, 0x00, 0x3C, 0x3C, 0x00, 0x00,
+ 0xF1, 0xF0, 0x00, 0x03, 0xC7, 0x80, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00,
+ 0xF0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x78,
+ 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x3C, 0x00,
+ 0x00, 0x00, 0xF0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x0F, 0x00, 0x00,
+ 0x00, 0x3C, 0x00, 0x00, 0x3C, 0xF0, 0x00, 0x01, 0xF3, 0xC0, 0x00, 0x07,
+ 0x8F, 0x80, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0xF0, 0x7C, 0x00, 0x07, 0xC1,
+ 0xF0, 0x00, 0x3E, 0x03, 0xE0, 0x03, 0xF0, 0x0F, 0xE0, 0x3F, 0x80, 0x1F,
+ 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x3F,
+ 0xC0, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x07, 0xFF,
+ 0xFF, 0x80, 0x1F, 0xFF, 0xFF, 0x80, 0x3E, 0x00, 0x3F, 0x80, 0x78, 0x00,
+ 0x1F, 0x80, 0xF0, 0x00, 0x1F, 0x03, 0xE0, 0x00, 0x1E, 0x07, 0xC0, 0x00,
+ 0x3E, 0x0F, 0x00, 0x00, 0x3C, 0x1E, 0x00, 0x00, 0x78, 0x3C, 0x00, 0x00,
+ 0xF0, 0xF8, 0x00, 0x01, 0xE1, 0xF0, 0x00, 0x03, 0xC3, 0xC0, 0x00, 0x07,
+ 0x87, 0x80, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x3C, 0x3E, 0x00, 0x00, 0x78,
+ 0x7C, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x01, 0xE1, 0xE0, 0x00, 0x07, 0x87,
+ 0xC0, 0x00, 0x0F, 0x0F, 0x80, 0x00, 0x3E, 0x1E, 0x00, 0x00, 0x78, 0x3C,
+ 0x00, 0x01, 0xF0, 0x78, 0x00, 0x03, 0xC1, 0xF0, 0x00, 0x0F, 0x03, 0xE0,
+ 0x00, 0x3E, 0x07, 0x80, 0x01, 0xF8, 0x0F, 0x00, 0x0F, 0xE0, 0x1F, 0xFF,
+ 0xFF, 0x80, 0x7F, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF,
+ 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xFC, 0x07, 0xFF,
+ 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xE0, 0x3E, 0x00, 0x00, 0x00, 0x78, 0x00,
+ 0x00, 0x00, 0xF0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xC0, 0x00,
+ 0x00, 0x0F, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00,
+ 0x00, 0xF8, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00,
+ 0x07, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0x80,
+ 0x7F, 0xFF, 0xFF, 0x00, 0xF0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07,
+ 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x3C,
+ 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x03, 0xE0,
+ 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0xFF,
+ 0xFF, 0xE0, 0x7F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0xFF,
+ 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFC, 0x07, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF,
+ 0xFF, 0xC0, 0xFF, 0xFF, 0xFE, 0x03, 0xE0, 0x00, 0x00, 0x0F, 0x00, 0x00,
+ 0x00, 0x3C, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00,
+ 0x1E, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x0F,
+ 0x80, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x03, 0xFF,
+ 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFC, 0x01, 0xFF, 0xFF,
+ 0xF0, 0x07, 0x80, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00,
+ 0x03, 0xE0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00,
+ 0xF0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x78,
+ 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x3E, 0x00,
+ 0x00, 0x00, 0xF0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x7F, 0xC0, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x07,
+ 0xFF, 0xFF, 0xC0, 0x07, 0xF0, 0x0F, 0xF0, 0x0F, 0xC0, 0x00, 0xF8, 0x0F,
+ 0xC0, 0x00, 0x3E, 0x07, 0x80, 0x00, 0x1F, 0x07, 0x80, 0x00, 0x07, 0x87,
+ 0xC0, 0x00, 0x03, 0xC3, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03,
+ 0xE0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00,
+ 0xF0, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x1F, 0xFF,
+ 0xBC, 0x00, 0x0F, 0xFF, 0xDE, 0x00, 0x0F, 0xFF, 0xEF, 0x00, 0x07, 0xFF,
+ 0xF7, 0x80, 0x00, 0x00, 0x73, 0xC0, 0x00, 0x00, 0x39, 0xE0, 0x00, 0x00,
+ 0x3C, 0xF0, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x00,
+ 0x0F, 0x8F, 0x00, 0x00, 0x0F, 0x87, 0xC0, 0x00, 0x0F, 0xC3, 0xF0, 0x00,
+ 0x0F, 0xE0, 0xFC, 0x00, 0x1F, 0xF0, 0x7F, 0x80, 0x7F, 0x78, 0x1F, 0xFF,
+ 0xFE, 0x38, 0x03, 0xFF, 0xFE, 0x1C, 0x00, 0xFF, 0xFC, 0x0E, 0x00, 0x0F,
+ 0xF0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0xF0, 0x00, 0x03, 0xC0,
+ 0x78, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x01, 0xF0, 0x3E, 0x00, 0x00, 0xF0,
+ 0x1E, 0x00, 0x00, 0x78, 0x0F, 0x00, 0x00, 0x3C, 0x0F, 0x80, 0x00, 0x3E,
+ 0x07, 0xC0, 0x00, 0x1F, 0x03, 0xC0, 0x00, 0x0F, 0x01, 0xE0, 0x00, 0x07,
+ 0x80, 0xF0, 0x00, 0x03, 0xC0, 0xF8, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x01,
+ 0xF0, 0x3C, 0x00, 0x00, 0xF0, 0x1F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF,
+ 0xFC, 0x0F, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xFE, 0x03, 0xC0, 0x00,
+ 0x0F, 0x01, 0xE0, 0x00, 0x07, 0x81, 0xF0, 0x00, 0x07, 0xC0, 0xF8, 0x00,
+ 0x03, 0xE0, 0x78, 0x00, 0x01, 0xE0, 0x3C, 0x00, 0x00, 0xF0, 0x1E, 0x00,
+ 0x00, 0x78, 0x1F, 0x00, 0x00, 0x7C, 0x0F, 0x80, 0x00, 0x3C, 0x07, 0x80,
+ 0x00, 0x1E, 0x03, 0xC0, 0x00, 0x0F, 0x01, 0xE0, 0x00, 0x0F, 0x81, 0xF0,
+ 0x00, 0x07, 0xC0, 0xF0, 0x00, 0x03, 0xC0, 0x78, 0x00, 0x01, 0xE0, 0x00,
+ 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xE0, 0x3C, 0x07, 0x81, 0xF0, 0x3E, 0x07,
+ 0x80, 0xF0, 0x1E, 0x07, 0xC0, 0xF8, 0x1E, 0x03, 0xC0, 0x78, 0x1F, 0x03,
+ 0xE0, 0x78, 0x0F, 0x01, 0xE0, 0x7C, 0x0F, 0x81, 0xE0, 0x3C, 0x07, 0x81,
+ 0xF0, 0x3E, 0x07, 0x80, 0xF0, 0x1E, 0x07, 0xC0, 0xF8, 0x1E, 0x00, 0x00,
+ 0x00, 0x07, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xE0,
+ 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3C,
+ 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0x80, 0x00, 0x07,
+ 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00,
+ 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00,
+ 0x0F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0x80, 0x00, 0x03, 0xC0, 0xF0,
+ 0x01, 0xE0, 0x78, 0x00, 0xF0, 0x78, 0x00, 0xF8, 0x3C, 0x00, 0x78, 0x1E,
+ 0x00, 0x3C, 0x0F, 0x00, 0x3E, 0x07, 0xC0, 0x3E, 0x03, 0xF0, 0x7E, 0x00,
+ 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0xFC, 0x00,
+ 0x00, 0x01, 0xE0, 0x00, 0x0F, 0xC0, 0x78, 0x00, 0x07, 0xC0, 0x1E, 0x00,
+ 0x03, 0xE0, 0x0F, 0x80, 0x03, 0xF0, 0x03, 0xE0, 0x01, 0xF8, 0x00, 0xF0,
+ 0x00, 0xFC, 0x00, 0x3C, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0x07,
+ 0xC0, 0x3F, 0x00, 0x01, 0xE0, 0x1F, 0x80, 0x00, 0x78, 0x0F, 0x80, 0x00,
+ 0x1E, 0x07, 0xC0, 0x00, 0x0F, 0x83, 0xE0, 0x00, 0x03, 0xE3, 0xF0, 0x00,
+ 0x00, 0xF1, 0xFC, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x0F, 0x7F, 0xE0,
+ 0x00, 0x07, 0xFE, 0xF8, 0x00, 0x01, 0xFE, 0x1E, 0x00, 0x00, 0x7F, 0x07,
+ 0xC0, 0x00, 0x1F, 0x80, 0xF0, 0x00, 0x0F, 0xC0, 0x3E, 0x00, 0x03, 0xE0,
+ 0x07, 0x80, 0x00, 0xF0, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x7C, 0x00, 0x0F,
+ 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0x7C, 0x00,
+ 0x78, 0x00, 0x1F, 0x00, 0x1E, 0x00, 0x03, 0xE0, 0x07, 0x80, 0x00, 0xF8,
+ 0x03, 0xE0, 0x00, 0x1F, 0x00, 0xF0, 0x00, 0x07, 0xC0, 0x3C, 0x00, 0x00,
+ 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0xF8,
+ 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x01, 0xF0, 0x00,
+ 0x07, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x0F,
+ 0x80, 0x00, 0x3E, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00,
+ 0x00, 0x7C, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00,
+ 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0,
+ 0x00, 0x07, 0xC0, 0x00, 0x1F, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00,
+ 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xE0,
+ 0x01, 0xF8, 0x00, 0x00, 0x7E, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x0F, 0xF0,
+ 0x00, 0x03, 0xF8, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x3F, 0xC0, 0x00, 0x1F,
+ 0xC0, 0x7F, 0x80, 0x00, 0x7F, 0x80, 0xFF, 0x00, 0x00, 0xEF, 0x03, 0xFE,
+ 0x00, 0x03, 0xFE, 0x07, 0xBC, 0x00, 0x0F, 0x78, 0x0F, 0x3C, 0x00, 0x1E,
+ 0xF0, 0x1E, 0x78, 0x00, 0x79, 0xE0, 0x3C, 0xF0, 0x00, 0xF3, 0xC0, 0xF9,
+ 0xE0, 0x03, 0xCF, 0x81, 0xE3, 0xC0, 0x07, 0x9E, 0x03, 0xC7, 0x80, 0x1E,
+ 0x3C, 0x07, 0x8F, 0x00, 0x38, 0x78, 0x1F, 0x1E, 0x00, 0xF0, 0xF0, 0x3C,
+ 0x1E, 0x03, 0xC3, 0xE0, 0x78, 0x3C, 0x07, 0x87, 0x80, 0xF0, 0x78, 0x1E,
+ 0x0F, 0x01, 0xE0, 0xF0, 0x3C, 0x1E, 0x07, 0xC1, 0xE0, 0xF0, 0x7C, 0x0F,
+ 0x03, 0xC1, 0xE0, 0xF0, 0x1E, 0x07, 0x87, 0x81, 0xE0, 0x3C, 0x0F, 0x0E,
+ 0x03, 0xC0, 0x78, 0x0F, 0x3C, 0x07, 0x81, 0xF0, 0x1E, 0x70, 0x1F, 0x03,
+ 0xC0, 0x3D, 0xE0, 0x3C, 0x07, 0x80, 0x7F, 0x80, 0x78, 0x0F, 0x00, 0xFF,
+ 0x00, 0xF0, 0x3E, 0x01, 0xFC, 0x01, 0xE0, 0x78, 0x03, 0xF8, 0x07, 0xC0,
+ 0xF0, 0x07, 0xE0, 0x0F, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x01, 0xF0,
+ 0x00, 0x03, 0xC0, 0x7E, 0x00, 0x01, 0xF0, 0x3F, 0x80, 0x00, 0x78, 0x0F,
+ 0xE0, 0x00, 0x1E, 0x03, 0xFC, 0x00, 0x07, 0x80, 0xFF, 0x00, 0x03, 0xE0,
+ 0x3F, 0xE0, 0x00, 0xF0, 0x1F, 0xF8, 0x00, 0x3C, 0x07, 0x9E, 0x00, 0x0F,
+ 0x01, 0xE7, 0xC0, 0x03, 0xC0, 0x78, 0xF0, 0x01, 0xF0, 0x1E, 0x3E, 0x00,
+ 0x78, 0x0F, 0x87, 0x80, 0x1E, 0x03, 0xC1, 0xF0, 0x07, 0x80, 0xF0, 0x7C,
+ 0x01, 0xE0, 0x3C, 0x0F, 0x00, 0xF8, 0x1F, 0x03, 0xE0, 0x3C, 0x07, 0x80,
+ 0x78, 0x0F, 0x01, 0xE0, 0x1F, 0x03, 0xC0, 0x78, 0x07, 0xC1, 0xF0, 0x1E,
+ 0x00, 0xF8, 0x78, 0x0F, 0x80, 0x3E, 0x1E, 0x03, 0xC0, 0x07, 0x87, 0x80,
+ 0xF0, 0x01, 0xF1, 0xE0, 0x3C, 0x00, 0x3C, 0xF8, 0x0F, 0x00, 0x0F, 0xBC,
+ 0x07, 0xC0, 0x03, 0xEF, 0x01, 0xE0, 0x00, 0x7F, 0xC0, 0x78, 0x00, 0x1F,
+ 0xF0, 0x1E, 0x00, 0x03, 0xFC, 0x0F, 0x80, 0x00, 0xFE, 0x03, 0xC0, 0x00,
+ 0x1F, 0x80, 0xF0, 0x00, 0x07, 0xE0, 0x3C, 0x00, 0x01, 0xF8, 0x00, 0x00,
+ 0x00, 0xFF, 0x00, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFC, 0x00,
+ 0x0F, 0xFF, 0xFF, 0x80, 0x0F, 0xF0, 0x1F, 0xC0, 0x0F, 0xC0, 0x03, 0xF0,
+ 0x0F, 0x80, 0x00, 0xFC, 0x0F, 0x80, 0x00, 0x3E, 0x0F, 0x80, 0x00, 0x0F,
+ 0x07, 0x80, 0x00, 0x07, 0xC7, 0xC0, 0x00, 0x01, 0xE3, 0xC0, 0x00, 0x00,
+ 0xF3, 0xC0, 0x00, 0x00, 0x79, 0xE0, 0x00, 0x00, 0x3D, 0xE0, 0x00, 0x00,
+ 0x1E, 0xF0, 0x00, 0x00, 0x0F, 0x78, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00,
+ 0x07, 0xFC, 0x00, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x01, 0xEF, 0x00, 0x00,
+ 0x00, 0xF7, 0x80, 0x00, 0x00, 0xFB, 0xC0, 0x00, 0x00, 0x79, 0xE0, 0x00,
+ 0x00, 0x3C, 0xF0, 0x00, 0x00, 0x3E, 0x78, 0x00, 0x00, 0x1E, 0x3E, 0x00,
+ 0x00, 0x1F, 0x0F, 0x00, 0x00, 0x1F, 0x07, 0xC0, 0x00, 0x1F, 0x03, 0xF0,
+ 0x00, 0x1F, 0x00, 0xFC, 0x00, 0x3F, 0x80, 0x3F, 0x80, 0x7F, 0x80, 0x1F,
+ 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00,
+ 0x0F, 0xF8, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xFE, 0x00,
+ 0x7F, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0xE0, 0x3E, 0x00, 0x3F, 0x81, 0xE0,
+ 0x00, 0x7C, 0x0F, 0x00, 0x01, 0xE0, 0xF8, 0x00, 0x0F, 0x07, 0xC0, 0x00,
+ 0x78, 0x3C, 0x00, 0x03, 0xC1, 0xE0, 0x00, 0x1E, 0x0F, 0x00, 0x01, 0xE0,
+ 0xF8, 0x00, 0x0F, 0x07, 0xC0, 0x00, 0xF8, 0x3C, 0x00, 0x0F, 0x81, 0xE0,
+ 0x01, 0xF8, 0x0F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFC, 0x07, 0xFF, 0xFF,
+ 0x80, 0x3F, 0xFF, 0xF0, 0x01, 0xE0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00,
+ 0xF8, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x01, 0xE0,
+ 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x07, 0x80, 0x00,
+ 0x00, 0x3C, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00,
+ 0xF0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
+ 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0xFF,
+ 0x80, 0x0F, 0xF0, 0x1F, 0xC0, 0x0F, 0xC0, 0x03, 0xF0, 0x0F, 0xC0, 0x00,
+ 0xFC, 0x0F, 0x80, 0x00, 0x3E, 0x0F, 0x80, 0x00, 0x0F, 0x07, 0x80, 0x00,
+ 0x07, 0xC7, 0xC0, 0x00, 0x01, 0xE3, 0xC0, 0x00, 0x00, 0xF3, 0xC0, 0x00,
+ 0x00, 0x79, 0xE0, 0x00, 0x00, 0x3D, 0xE0, 0x00, 0x00, 0x1E, 0xF0, 0x00,
+ 0x00, 0x0F, 0x78, 0x00, 0x00, 0x07, 0xB8, 0x00, 0x00, 0x03, 0xFC, 0x00,
+ 0x00, 0x03, 0xDE, 0x00, 0x00, 0x01, 0xEF, 0x00, 0x00, 0x00, 0xF7, 0x80,
+ 0x00, 0x00, 0x7B, 0xC0, 0x00, 0x00, 0x79, 0xE0, 0x00, 0x00, 0x3C, 0xF0,
+ 0x00, 0x00, 0x3C, 0x78, 0x00, 0x08, 0x3E, 0x3E, 0x00, 0x0E, 0x1E, 0x0F,
+ 0x00, 0x0F, 0x9F, 0x07, 0xC0, 0x07, 0xFF, 0x03, 0xF0, 0x01, 0xFF, 0x00,
+ 0xFC, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0xFF, 0x80, 0x1F, 0xFF, 0xFF, 0xE0,
+ 0x03, 0xFF, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x7E, 0x00, 0x0F, 0xF0, 0x1F,
+ 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF,
+ 0xC0, 0x07, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFE,
+ 0x03, 0xE0, 0x00, 0xFC, 0x0F, 0x00, 0x01, 0xF0, 0x3C, 0x00, 0x03, 0xC1,
+ 0xF0, 0x00, 0x0F, 0x07, 0xC0, 0x00, 0x3C, 0x1E, 0x00, 0x00, 0xF0, 0x78,
+ 0x00, 0x03, 0xC1, 0xE0, 0x00, 0x1E, 0x0F, 0x80, 0x00, 0x78, 0x3E, 0x00,
+ 0x03, 0xE0, 0xF0, 0x00, 0x1F, 0x03, 0xC0, 0x01, 0xF8, 0x0F, 0xFF, 0xFF,
+ 0xC0, 0x7F, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0xF0,
+ 0x1E, 0x00, 0x07, 0xE0, 0xF8, 0x00, 0x0F, 0x83, 0xE0, 0x00, 0x1E, 0x0F,
+ 0x00, 0x00, 0x78, 0x3C, 0x00, 0x01, 0xE0, 0xF0, 0x00, 0x07, 0x87, 0xC0,
+ 0x00, 0x1E, 0x1F, 0x00, 0x00, 0xF0, 0x78, 0x00, 0x03, 0xC1, 0xE0, 0x00,
+ 0x0F, 0x07, 0x80, 0x00, 0x3C, 0x3E, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x03,
+ 0xC3, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0xFC,
+ 0x00, 0x1F, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xC0, 0x1F, 0xC0, 0x7F, 0x01,
+ 0xF0, 0x00, 0xFC, 0x0F, 0x00, 0x03, 0xE0, 0xF0, 0x00, 0x0F, 0x07, 0x00,
+ 0x00, 0x78, 0x78, 0x00, 0x03, 0xC3, 0xC0, 0x00, 0x1E, 0x1E, 0x00, 0x00,
+ 0x00, 0xF8, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00,
+ 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x0F,
+ 0xFF, 0xC0, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x07,
+ 0xF0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x3C, 0xF0, 0x00, 0x01, 0xE7,
+ 0x80, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x71, 0xE0, 0x00, 0x07, 0x8F, 0x00,
+ 0x00, 0x3C, 0x7C, 0x00, 0x03, 0xC1, 0xF0, 0x00, 0x7C, 0x0F, 0xE0, 0x1F,
+ 0xC0, 0x3F, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xF8, 0x00,
+ 0x03, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0x7F,
+ 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFE, 0x00, 0x0F, 0x00, 0x00, 0x01, 0xF0,
+ 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x1E, 0x00, 0x00,
+ 0x01, 0xE0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x3C,
+ 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0, 0x00,
+ 0x00, 0x78, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x78, 0x00, 0x00, 0x0F,
+ 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0x00,
+ 0x00, 0x0F, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01,
+ 0xE0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x3E, 0x00,
+ 0x00, 0x03, 0xC0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00,
+ 0x7C, 0x00, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x0F, 0x00, 0x00, 0x3C, 0x1E,
+ 0x00, 0x00, 0xF8, 0x7C, 0x00, 0x01, 0xF0, 0xF8, 0x00, 0x03, 0xC1, 0xE0,
+ 0x00, 0x07, 0x83, 0xC0, 0x00, 0x0F, 0x0F, 0x80, 0x00, 0x3E, 0x1F, 0x00,
+ 0x00, 0x7C, 0x3C, 0x00, 0x00, 0xF0, 0x78, 0x00, 0x01, 0xE0, 0xF0, 0x00,
+ 0x03, 0xC3, 0xE0, 0x00, 0x0F, 0x87, 0xC0, 0x00, 0x1F, 0x0F, 0x00, 0x00,
+ 0x3C, 0x1E, 0x00, 0x00, 0x78, 0x3C, 0x00, 0x01, 0xF0, 0xF8, 0x00, 0x03,
+ 0xE1, 0xF0, 0x00, 0x07, 0x83, 0xC0, 0x00, 0x0F, 0x07, 0x80, 0x00, 0x1E,
+ 0x1F, 0x00, 0x00, 0x7C, 0x3E, 0x00, 0x00, 0xF8, 0x78, 0x00, 0x01, 0xE0,
+ 0xF0, 0x00, 0x03, 0xC1, 0xE0, 0x00, 0x0F, 0x83, 0xC0, 0x00, 0x1E, 0x07,
+ 0x80, 0x00, 0x7C, 0x0F, 0x80, 0x01, 0xF0, 0x0F, 0x80, 0x07, 0xE0, 0x1F,
+ 0xC0, 0x7F, 0x80, 0x1F, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x1F,
+ 0xFF, 0xC0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFF, 0xC0,
+ 0x00, 0x0F, 0xBE, 0x00, 0x00, 0x79, 0xF0, 0x00, 0x07, 0xC7, 0x80, 0x00,
+ 0x3C, 0x3C, 0x00, 0x03, 0xE1, 0xE0, 0x00, 0x1E, 0x0F, 0x80, 0x01, 0xF0,
+ 0x7C, 0x00, 0x0F, 0x03, 0xE0, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x80, 0x78,
+ 0x00, 0x78, 0x03, 0xC0, 0x07, 0xC0, 0x1E, 0x00, 0x3C, 0x00, 0xF0, 0x03,
+ 0xE0, 0x07, 0xC0, 0x1E, 0x00, 0x3E, 0x01, 0xF0, 0x01, 0xF0, 0x0F, 0x00,
+ 0x07, 0x80, 0xF0, 0x00, 0x3C, 0x07, 0x80, 0x01, 0xE0, 0x78, 0x00, 0x0F,
+ 0x07, 0xC0, 0x00, 0x7C, 0x3C, 0x00, 0x03, 0xE3, 0xE0, 0x00, 0x1F, 0x1E,
+ 0x00, 0x00, 0xF9, 0xF0, 0x00, 0x03, 0xCF, 0x00, 0x00, 0x1E, 0xF0, 0x00,
+ 0x00, 0xF7, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x01,
+ 0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xF0,
+ 0x00, 0x1F, 0x00, 0x03, 0xDE, 0x00, 0x07, 0xE0, 0x00, 0xFB, 0xC0, 0x00,
+ 0xFC, 0x00, 0x1E, 0x78, 0x00, 0x3F, 0x80, 0x07, 0xCF, 0x00, 0x07, 0xF0,
+ 0x00, 0xF9, 0xE0, 0x01, 0xFE, 0x00, 0x3E, 0x3C, 0x00, 0x7F, 0xC0, 0x07,
+ 0xC7, 0x80, 0x0F, 0x78, 0x01, 0xF0, 0xF0, 0x03, 0xEF, 0x00, 0x3E, 0x1E,
+ 0x00, 0x79, 0xE0, 0x0F, 0x83, 0xC0, 0x1F, 0x3C, 0x01, 0xF0, 0x78, 0x03,
+ 0xC7, 0x80, 0x3C, 0x0F, 0x00, 0xF8, 0xF0, 0x0F, 0x80, 0xE0, 0x1E, 0x1E,
+ 0x01, 0xE0, 0x1C, 0x07, 0xC1, 0xC0, 0x7C, 0x03, 0x80, 0xF0, 0x3C, 0x0F,
+ 0x00, 0x70, 0x3E, 0x07, 0x83, 0xE0, 0x0E, 0x07, 0x80, 0xF0, 0x78, 0x01,
+ 0xC1, 0xF0, 0x1E, 0x1F, 0x00, 0x3C, 0x3C, 0x03, 0xC3, 0xE0, 0x07, 0x8F,
+ 0x80, 0x78, 0x78, 0x00, 0xF1, 0xE0, 0x0F, 0x1F, 0x00, 0x1E, 0x7C, 0x01,
+ 0xE3, 0xC0, 0x03, 0xCF, 0x00, 0x3C, 0xF8, 0x00, 0x7B, 0xE0, 0x07, 0x9E,
+ 0x00, 0x0F, 0x78, 0x00, 0xF7, 0xC0, 0x01, 0xFF, 0x00, 0x1E, 0xF0, 0x00,
+ 0x3F, 0xC0, 0x03, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x7F, 0x80, 0x00, 0xFE,
+ 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00,
+ 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x7C,
+ 0x00, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x07, 0xC0, 0x00, 0x3E, 0x00,
+ 0x7C, 0x00, 0x07, 0xC0, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x1F,
+ 0x00, 0x01, 0xF0, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x7C, 0x00, 0x00, 0xF8,
+ 0x0F, 0x80, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0x00, 0x7C, 0x1F, 0x00, 0x00,
+ 0x07, 0xC3, 0xE0, 0x00, 0x00, 0x7C, 0x7C, 0x00, 0x00, 0x03, 0xEF, 0x80,
+ 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x1F,
+ 0xC0, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00,
+ 0x03, 0xFC, 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x0F, 0xBE, 0x00,
+ 0x00, 0x01, 0xF3, 0xE0, 0x00, 0x00, 0x3E, 0x1F, 0x00, 0x00, 0x03, 0xE1,
+ 0xF0, 0x00, 0x00, 0x7C, 0x0F, 0x80, 0x00, 0x0F, 0x80, 0xF8, 0x00, 0x01,
+ 0xF0, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x03, 0xE0,
+ 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x03, 0xF0, 0x03, 0xF0, 0x00,
+ 0x1F, 0x00, 0x7E, 0x00, 0x01, 0xF8, 0x0F, 0xC0, 0x00, 0x0F, 0x80, 0xF8,
+ 0x00, 0x00, 0x7D, 0xF0, 0x00, 0x03, 0xE7, 0xC0, 0x00, 0x1F, 0x1F, 0x80,
+ 0x00, 0xF8, 0x3E, 0x00, 0x03, 0xE0, 0xF8, 0x00, 0x1F, 0x01, 0xF0, 0x00,
+ 0xF8, 0x07, 0xC0, 0x07, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0x3E, 0x01, 0xF0,
+ 0x00, 0xF8, 0x07, 0xC0, 0x01, 0xF0, 0x3E, 0x00, 0x07, 0xC1, 0xF0, 0x00,
+ 0x0F, 0x0F, 0x80, 0x00, 0x3E, 0x7C, 0x00, 0x00, 0x79, 0xE0, 0x00, 0x01,
+ 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x3F,
+ 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x0F, 0x80,
+ 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x03, 0xC0, 0x00,
+ 0x00, 0x1F, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00,
+ 0x07, 0x80, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x03,
+ 0xE0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xC0,
+ 0x1F, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0xFE,
+ 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07,
+ 0xC0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00,
+ 0xF8, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00,
+ 0x1F, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00,
+ 0x03, 0xE0, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00,
+ 0x00, 0x7C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00,
+ 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x03, 0xE0, 0x00,
+ 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x7C, 0x00,
+ 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x0F, 0x80,
+ 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xFF, 0x80, 0x7F,
+ 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xC0, 0x1F,
+ 0xF0, 0x07, 0xFC, 0x01, 0xFE, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00,
+ 0x03, 0xC0, 0x01, 0xF0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01,
+ 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0,
+ 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF8, 0x00,
+ 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x7C, 0x00, 0x1E,
+ 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x0F, 0x00,
+ 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x7C, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01,
+ 0xE0, 0x00, 0x7F, 0xC0, 0x3F, 0xE0, 0x0F, 0xF8, 0x03, 0xFE, 0x00, 0xE3,
+ 0x8E, 0x38, 0xE1, 0x86, 0x18, 0x61, 0x87, 0x1C, 0x71, 0xC7, 0x0C, 0x30,
+ 0xC3, 0x0C, 0x38, 0xE3, 0x8E, 0x38, 0x61, 0x86, 0x18, 0x61, 0xC7, 0x1C,
+ 0x71, 0xC0, 0x00, 0x7F, 0xC0, 0x1F, 0xF0, 0x07, 0xFC, 0x03, 0xFE, 0x00,
+ 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x03,
+ 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0,
+ 0x00, 0x78, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00,
+ 0x3C, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E,
+ 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x00,
+ 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x0F, 0x80, 0x03,
+ 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x7F, 0x80, 0x3F, 0xE0,
+ 0x0F, 0xF8, 0x03, 0xFE, 0x00, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x1F, 0x00,
+ 0x1F, 0xC0, 0x0E, 0xE0, 0x0E, 0x70, 0x0F, 0x38, 0x07, 0x1C, 0x07, 0x0E,
+ 0x03, 0x83, 0x83, 0x81, 0xC3, 0xC0, 0xE1, 0xC0, 0x71, 0xC0, 0x39, 0xE0,
+ 0x0E, 0xE0, 0x07, 0xF0, 0x03, 0xF0, 0x01, 0xC0, 0x7F, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xC0, 0xF8, 0x78, 0x3C, 0x1C, 0x0E, 0x0E, 0x07, 0x00,
+ 0x1F, 0xE0, 0x01, 0xFF, 0xF0, 0x07, 0xFF, 0xF0, 0x1F, 0xFF, 0xF0, 0x7E,
+ 0x07, 0xE1, 0xF0, 0x07, 0xC3, 0xC0, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00,
+ 0x1E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xF0, 0x00, 0x07, 0xE0, 0x0F, 0xFF,
+ 0xC0, 0xFF, 0xFF, 0x07, 0xFF, 0x9E, 0x1F, 0xC0, 0x3C, 0x7C, 0x00, 0x78,
+ 0xF0, 0x00, 0xF3, 0xC0, 0x03, 0xC7, 0x80, 0x07, 0x8F, 0x00, 0x1F, 0x1E,
+ 0x00, 0x7E, 0x3F, 0x07, 0xFC, 0x3F, 0xFF, 0x7E, 0x7F, 0xFC, 0xFC, 0x7F,
+ 0xF0, 0xF8, 0x3F, 0x00, 0xF0, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00,
+ 0xF8, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00,
+ 0x0F, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0x83, 0xE0, 0x03, 0xC7, 0xFC,
+ 0x01, 0xEF, 0xFF, 0x00, 0xFF, 0xFF, 0xC0, 0xF7, 0x83, 0xF0, 0x7F, 0x00,
+ 0xF8, 0x3F, 0x00, 0x3E, 0x1F, 0x00, 0x0F, 0x1F, 0x80, 0x07, 0x8F, 0x80,
+ 0x03, 0xC7, 0x80, 0x01, 0xE3, 0xC0, 0x00, 0xF1, 0xE0, 0x00, 0x79, 0xF0,
+ 0x00, 0x3C, 0xF0, 0x00, 0x3C, 0x78, 0x00, 0x1E, 0x3C, 0x00, 0x0F, 0x1E,
+ 0x00, 0x0F, 0x9F, 0x00, 0x07, 0x8F, 0xC0, 0x07, 0xC7, 0xE0, 0x07, 0xC3,
+ 0xF8, 0x07, 0xC1, 0xFE, 0x0F, 0xC1, 0xEF, 0xFF, 0xE0, 0xF3, 0xFF, 0xC0,
+ 0x78, 0xFF, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x03, 0xFF,
+ 0x80, 0x3F, 0xFF, 0x01, 0xFF, 0xFE, 0x0F, 0xE0, 0xF8, 0x7E, 0x01, 0xF1,
+ 0xF0, 0x03, 0xCF, 0x80, 0x0F, 0x3C, 0x00, 0x3D, 0xF0, 0x00, 0x07, 0x80,
+ 0x00, 0x1E, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00,
+ 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x0F, 0x3C,
+ 0x00, 0x3C, 0xF8, 0x01, 0xE1, 0xF0, 0x0F, 0x87, 0xE0, 0xFC, 0x0F, 0xFF,
+ 0xE0, 0x3F, 0xFF, 0x00, 0x7F, 0xF8, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x01, 0xE0,
+ 0x00, 0x00, 0x3C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00,
+ 0x3C, 0x00, 0x3F, 0x07, 0x80, 0x1F, 0xF8, 0xF0, 0x0F, 0xFF, 0x3E, 0x03,
+ 0xFF, 0xF7, 0x80, 0xFC, 0x1F, 0xF0, 0x3F, 0x00, 0xFE, 0x07, 0xC0, 0x0F,
+ 0xC1, 0xF0, 0x01, 0xF0, 0x3C, 0x00, 0x3E, 0x0F, 0x80, 0x07, 0xC1, 0xE0,
+ 0x00, 0x78, 0x3C, 0x00, 0x1F, 0x0F, 0x80, 0x03, 0xC1, 0xE0, 0x00, 0x78,
+ 0x3C, 0x00, 0x0F, 0x07, 0x80, 0x01, 0xE0, 0xF0, 0x00, 0x7C, 0x1E, 0x00,
+ 0x0F, 0x03, 0xC0, 0x03, 0xE0, 0x78, 0x00, 0x7C, 0x0F, 0x80, 0x1F, 0x80,
+ 0xF8, 0x07, 0xF0, 0x1F, 0x83, 0xFC, 0x03, 0xFF, 0xFF, 0x80, 0x3F, 0xFE,
+ 0xF0, 0x03, 0xFF, 0x1E, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x80,
+ 0x01, 0xFF, 0xC0, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0xC0, 0xFE, 0x0F, 0xC1,
+ 0xF0, 0x07, 0xC7, 0xC0, 0x0F, 0x8F, 0x00, 0x0F, 0x3C, 0x00, 0x1E, 0x78,
+ 0x00, 0x3D, 0xE0, 0x00, 0x7B, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xBF, 0xFF, 0xFF, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00,
+ 0x03, 0xC0, 0x00, 0x07, 0x80, 0x03, 0xCF, 0x80, 0x0F, 0x0F, 0x80, 0x3E,
+ 0x1F, 0x81, 0xF8, 0x1F, 0xFF, 0xE0, 0x1F, 0xFF, 0x80, 0x1F, 0xFC, 0x00,
+ 0x0F, 0xE0, 0x00, 0x00, 0x3E, 0x01, 0xFC, 0x07, 0xF8, 0x0F, 0xE0, 0x3E,
+ 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x07, 0xC0, 0x7F, 0xF0, 0xFF, 0xE3,
+ 0xFF, 0xC0, 0x78, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x3E,
+ 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x0F, 0x80, 0x1E, 0x00,
+ 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E,
+ 0x00, 0x3C, 0x00, 0xF0, 0x01, 0xE0, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x07,
+ 0xFE, 0x3C, 0x01, 0xFF, 0xE7, 0x00, 0xFF, 0xFE, 0xE0, 0x1F, 0x83, 0xFC,
+ 0x07, 0xC0, 0x3F, 0x81, 0xF0, 0x03, 0xF0, 0x3C, 0x00, 0x7C, 0x0F, 0x00,
+ 0x0F, 0x81, 0xE0, 0x01, 0xF0, 0x78, 0x00, 0x3E, 0x0F, 0x00, 0x07, 0xC1,
+ 0xE0, 0x00, 0xF0, 0x38, 0x00, 0x1E, 0x0F, 0x00, 0x03, 0xC1, 0xE0, 0x00,
+ 0xF8, 0x3C, 0x00, 0x1F, 0x07, 0x80, 0x03, 0xC0, 0xF0, 0x00, 0xF8, 0x1E,
+ 0x00, 0x3F, 0x03, 0xE0, 0x07, 0xE0, 0x3E, 0x01, 0xF8, 0x07, 0xE0, 0xFF,
+ 0x00, 0x7F, 0xFD, 0xE0, 0x0F, 0xFF, 0x3C, 0x00, 0xFF, 0xCF, 0x00, 0x07,
+ 0xE1, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x0F, 0x01, 0xE0, 0x03, 0xE0,
+ 0x3C, 0x00, 0xF8, 0x07, 0xE0, 0x7F, 0x00, 0x7F, 0xFF, 0xC0, 0x0F, 0xFF,
+ 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x01, 0xE0, 0x00,
+ 0x03, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00,
+ 0x78, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x83, 0xF0, 0x0F,
+ 0x1F, 0xF0, 0x1E, 0xFF, 0xF0, 0x3F, 0xFF, 0xE0, 0xFF, 0x87, 0xE1, 0xFC,
+ 0x07, 0xC3, 0xF0, 0x07, 0x87, 0xC0, 0x0F, 0x1F, 0x00, 0x1E, 0x3E, 0x00,
+ 0x3C, 0x78, 0x00, 0x78, 0xF0, 0x01, 0xE1, 0xE0, 0x03, 0xC7, 0xC0, 0x07,
+ 0x8F, 0x00, 0x0F, 0x1E, 0x00, 0x1E, 0x3C, 0x00, 0x78, 0x78, 0x00, 0xF1,
+ 0xE0, 0x01, 0xE3, 0xC0, 0x03, 0xC7, 0x80, 0x0F, 0x8F, 0x00, 0x1E, 0x1E,
+ 0x00, 0x3C, 0x78, 0x00, 0x78, 0xF0, 0x00, 0xF1, 0xE0, 0x03, 0xC0, 0x01,
+ 0xE0, 0x3C, 0x0F, 0x01, 0xE0, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xF0, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x03, 0xC0,
+ 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0,
+ 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x00, 0x00, 0x07,
+ 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x01, 0xE0, 0x00,
+ 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C,
+ 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00,
+ 0x07, 0x80, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03,
+ 0xC0, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0,
+ 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x01, 0xF0, 0x00,
+ 0x78, 0x00, 0x3E, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x0F, 0xE0, 0x03, 0xE0,
+ 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x78,
+ 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0F,
+ 0x00, 0x00, 0x07, 0x80, 0x00, 0x03, 0xC0, 0x0F, 0x81, 0xE0, 0x0F, 0x80,
+ 0xF0, 0x0F, 0x80, 0xF0, 0x1F, 0x00, 0x78, 0x1F, 0x00, 0x3C, 0x1F, 0x00,
+ 0x1E, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x0F, 0x1E, 0x00, 0x07, 0xBF, 0x80,
+ 0x03, 0xFF, 0xC0, 0x01, 0xFD, 0xE0, 0x01, 0xFC, 0xF8, 0x00, 0xFC, 0x3C,
+ 0x00, 0x7C, 0x1F, 0x00, 0x3C, 0x07, 0x80, 0x1E, 0x03, 0xC0, 0x1F, 0x01,
+ 0xF0, 0x0F, 0x00, 0x78, 0x07, 0x80, 0x3E, 0x03, 0xC0, 0x0F, 0x01, 0xE0,
+ 0x07, 0x81, 0xE0, 0x03, 0xE0, 0xF0, 0x00, 0xF0, 0x78, 0x00, 0x7C, 0x00,
+ 0x01, 0xE0, 0x3C, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x3C, 0x07,
+ 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x03,
+ 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80,
+ 0xF0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x00, 0x00,
+ 0x07, 0xE0, 0x1F, 0x80, 0xF9, 0xFF, 0x07, 0xFC, 0x0F, 0x3F, 0xF8, 0xFF,
+ 0xE0, 0xF7, 0xFF, 0x9F, 0xFF, 0x0F, 0xF0, 0xFF, 0xC3, 0xF0, 0xFC, 0x07,
+ 0xF8, 0x1F, 0x1F, 0x80, 0x3F, 0x00, 0xF1, 0xF0, 0x03, 0xE0, 0x0F, 0x1E,
+ 0x00, 0x3C, 0x00, 0xF1, 0xE0, 0x03, 0xC0, 0x0F, 0x1E, 0x00, 0x3C, 0x00,
+ 0xF1, 0xE0, 0x07, 0x80, 0x0F, 0x3C, 0x00, 0x78, 0x01, 0xF3, 0xC0, 0x07,
+ 0x80, 0x1E, 0x3C, 0x00, 0x78, 0x01, 0xE3, 0xC0, 0x0F, 0x80, 0x1E, 0x3C,
+ 0x00, 0xF0, 0x01, 0xE7, 0xC0, 0x0F, 0x00, 0x3C, 0x78, 0x00, 0xF0, 0x03,
+ 0xC7, 0x80, 0x0F, 0x00, 0x3C, 0x78, 0x01, 0xE0, 0x03, 0xC7, 0x80, 0x1E,
+ 0x00, 0x3C, 0xF8, 0x01, 0xE0, 0x07, 0x8F, 0x00, 0x1E, 0x00, 0x78, 0xF0,
+ 0x01, 0xE0, 0x07, 0x8F, 0x00, 0x3C, 0x00, 0x78, 0x00, 0x07, 0xE0, 0x1F,
+ 0x3F, 0xF0, 0x3C, 0xFF, 0xF0, 0x7B, 0xFF, 0xE0, 0xFF, 0x07, 0xE1, 0xF8,
+ 0x07, 0xC7, 0xE0, 0x07, 0x8F, 0x80, 0x0F, 0x1F, 0x00, 0x1E, 0x3C, 0x00,
+ 0x3C, 0x78, 0x00, 0x78, 0xF0, 0x01, 0xE3, 0xC0, 0x03, 0xC7, 0x80, 0x07,
+ 0x8F, 0x00, 0x0F, 0x1E, 0x00, 0x3E, 0x3C, 0x00, 0x78, 0xF0, 0x00, 0xF1,
+ 0xE0, 0x01, 0xE3, 0xC0, 0x03, 0xC7, 0x80, 0x0F, 0x8F, 0x00, 0x1E, 0x3E,
+ 0x00, 0x3C, 0x78, 0x00, 0x78, 0xF0, 0x00, 0xF1, 0xE0, 0x03, 0xC0, 0x00,
+ 0x1F, 0x80, 0x01, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x3F, 0xFF, 0xC0, 0xFE,
+ 0x0F, 0xC1, 0xF0, 0x0F, 0x87, 0xC0, 0x0F, 0x8F, 0x00, 0x0F, 0x3C, 0x00,
+ 0x1E, 0x78, 0x00, 0x3D, 0xE0, 0x00, 0x7B, 0xC0, 0x00, 0xF7, 0x80, 0x01,
+ 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0x78, 0x00, 0x1E, 0xF0, 0x00, 0x3D,
+ 0xE0, 0x00, 0xF3, 0xC0, 0x01, 0xE7, 0x80, 0x07, 0x8F, 0x80, 0x1F, 0x0F,
+ 0x80, 0x7C, 0x1F, 0x83, 0xF8, 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, 0x00, 0x1F,
+ 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x3C, 0x7F, 0xE0,
+ 0x07, 0xBF, 0xFE, 0x01, 0xFF, 0xFF, 0xC0, 0x3D, 0xE0, 0xFC, 0x07, 0xF0,
+ 0x0F, 0x80, 0xFC, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x07, 0xC0, 0x01, 0xE0,
+ 0xF8, 0x00, 0x3C, 0x1F, 0x00, 0x07, 0x83, 0xC0, 0x00, 0xF0, 0x78, 0x00,
+ 0x1E, 0x1F, 0x00, 0x03, 0xC3, 0xC0, 0x00, 0xF0, 0x78, 0x00, 0x1E, 0x0F,
+ 0x00, 0x03, 0xC3, 0xE0, 0x00, 0xF8, 0x7C, 0x00, 0x1E, 0x0F, 0x80, 0x07,
+ 0xC1, 0xF8, 0x01, 0xF0, 0x3F, 0x80, 0x7C, 0x0F, 0xF8, 0x3F, 0x81, 0xEF,
+ 0xFF, 0xE0, 0x3C, 0xFF, 0xF8, 0x07, 0x8F, 0xFC, 0x00, 0xF0, 0xFE, 0x00,
+ 0x3E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x1E, 0x00,
+ 0x00, 0x03, 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x03,
+ 0xC0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x3F,
+ 0xF8, 0xF0, 0x1F, 0xFF, 0x3C, 0x0F, 0xFF, 0xDF, 0x07, 0xE0, 0xFF, 0x83,
+ 0xE0, 0x1F, 0xE1, 0xF0, 0x03, 0xF8, 0x78, 0x00, 0xFE, 0x3C, 0x00, 0x1F,
+ 0x8F, 0x00, 0x07, 0xC7, 0x80, 0x01, 0xF1, 0xE0, 0x00, 0x7C, 0x78, 0x00,
+ 0x1F, 0x3C, 0x00, 0x0F, 0x8F, 0x00, 0x03, 0xE3, 0xC0, 0x00, 0xF8, 0xF0,
+ 0x00, 0x3E, 0x3C, 0x00, 0x1F, 0x8F, 0x00, 0x0F, 0xC3, 0xC0, 0x03, 0xF0,
+ 0xF8, 0x01, 0xFC, 0x1F, 0x00, 0xFF, 0x07, 0xE0, 0xFF, 0xC0, 0xFF, 0xFD,
+ 0xE0, 0x1F, 0xFE, 0x78, 0x03, 0xFF, 0x3E, 0x00, 0x3F, 0x0F, 0x80, 0x00,
+ 0x03, 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1F, 0x00,
+ 0x00, 0x07, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3E,
+ 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0x87, 0xCF, 0xC3, 0xCF, 0xE1, 0xEF,
+ 0xE0, 0xFF, 0x80, 0x7F, 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x0F,
+ 0x00, 0x07, 0x80, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00,
+ 0x78, 0x00, 0x3C, 0x00, 0x3E, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80,
+ 0x03, 0xC0, 0x03, 0xE0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x00,
+ 0x00, 0x3F, 0x80, 0x07, 0xFF, 0x00, 0xFF, 0xFC, 0x0F, 0xFF, 0xE0, 0xFC,
+ 0x1F, 0x87, 0x80, 0x3C, 0x7C, 0x01, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x00,
+ 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0xE0, 0x03, 0xFF,
+ 0xC0, 0x07, 0xFF, 0x80, 0x07, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x07, 0xBC,
+ 0x00, 0x3D, 0xE0, 0x01, 0xEF, 0x00, 0x1F, 0x7C, 0x01, 0xF3, 0xF0, 0x1F,
+ 0x8F, 0xFF, 0xF8, 0x7F, 0xFF, 0x80, 0xFF, 0xF0, 0x01, 0xFE, 0x00, 0x03,
+ 0xC0, 0x1E, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC1, 0xFF, 0xEF, 0xFF,
+ 0x7F, 0xF0, 0x78, 0x03, 0xC0, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03,
+ 0xC0, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x3C, 0x01, 0xE0,
+ 0x0F, 0x00, 0x78, 0x07, 0xC0, 0x3C, 0x01, 0xE0, 0x0F, 0xF0, 0x7F, 0x81,
+ 0xF8, 0x07, 0xC0, 0x0F, 0x00, 0x0F, 0x0F, 0x00, 0x1E, 0x0F, 0x00, 0x1E,
+ 0x1F, 0x00, 0x1E, 0x1E, 0x00, 0x1E, 0x1E, 0x00, 0x1E, 0x1E, 0x00, 0x3C,
+ 0x1E, 0x00, 0x3C, 0x3E, 0x00, 0x3C, 0x3C, 0x00, 0x3C, 0x3C, 0x00, 0x3C,
+ 0x3C, 0x00, 0x7C, 0x3C, 0x00, 0x78, 0x78, 0x00, 0x78, 0x78, 0x00, 0x78,
+ 0x78, 0x00, 0x78, 0x78, 0x00, 0xF8, 0x78, 0x00, 0xF0, 0xF0, 0x01, 0xF0,
+ 0xF0, 0x03, 0xF0, 0xF0, 0x07, 0xF0, 0xF8, 0x1F, 0xF0, 0xFF, 0xFF, 0xE0,
+ 0x7F, 0xFD, 0xE0, 0x3F, 0xF1, 0xE0, 0x1F, 0xC0, 0x00, 0xF0, 0x00, 0x7F,
+ 0xC0, 0x01, 0xEF, 0x00, 0x0F, 0xBC, 0x00, 0x3C, 0x78, 0x01, 0xE1, 0xE0,
+ 0x07, 0x87, 0x80, 0x3C, 0x1E, 0x01, 0xF0, 0x78, 0x07, 0x81, 0xE0, 0x3E,
+ 0x07, 0x80, 0xF0, 0x1E, 0x07, 0x80, 0x38, 0x1E, 0x00, 0xF0, 0xF0, 0x03,
+ 0xC7, 0xC0, 0x0F, 0x1E, 0x00, 0x3C, 0xF0, 0x00, 0xF3, 0xC0, 0x03, 0xDE,
+ 0x00, 0x07, 0x78, 0x00, 0x1F, 0xC0, 0x00, 0x7E, 0x00, 0x01, 0xF8, 0x00,
+ 0x07, 0xC0, 0x00, 0x1F, 0x00, 0x00, 0xF0, 0x07, 0xC0, 0x0F, 0x78, 0x03,
+ 0xE0, 0x0F, 0xBC, 0x03, 0xF0, 0x07, 0x9E, 0x01, 0xF8, 0x03, 0xCF, 0x00,
+ 0xFC, 0x03, 0xC7, 0x80, 0xFE, 0x01, 0xE3, 0xC0, 0x77, 0x01, 0xE0, 0xE0,
+ 0x7B, 0x80, 0xF0, 0x70, 0x39, 0xC0, 0xF0, 0x38, 0x3C, 0xE0, 0x78, 0x1C,
+ 0x1E, 0x78, 0x78, 0x0F, 0x1E, 0x3C, 0x3C, 0x07, 0x8F, 0x1E, 0x3C, 0x03,
+ 0xC7, 0x0F, 0x1E, 0x01, 0xE7, 0x87, 0x9E, 0x00, 0xF3, 0x81, 0xCF, 0x00,
+ 0x7B, 0xC0, 0xEF, 0x00, 0x3D, 0xC0, 0x77, 0x80, 0x1F, 0xE0, 0x3F, 0x80,
+ 0x0F, 0xF0, 0x1F, 0xC0, 0x07, 0xF0, 0x0F, 0xC0, 0x01, 0xF8, 0x07, 0xE0,
+ 0x00, 0xF8, 0x03, 0xE0, 0x00, 0x7C, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0xF0,
+ 0x00, 0x00, 0x03, 0xC0, 0x07, 0xC0, 0xF8, 0x01, 0xE0, 0x1E, 0x00, 0xF0,
+ 0x07, 0x80, 0x78, 0x00, 0xF0, 0x3C, 0x00, 0x3C, 0x1F, 0x00, 0x0F, 0x8F,
+ 0x80, 0x01, 0xE7, 0xC0, 0x00, 0x7D, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x03,
+ 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0xC0, 0x00,
+ 0x07, 0xF0, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xF7, 0x80, 0x00, 0xF9, 0xF0,
+ 0x00, 0x3C, 0x3C, 0x00, 0x1E, 0x0F, 0x80, 0x0F, 0x01, 0xE0, 0x07, 0x80,
+ 0x7C, 0x03, 0xE0, 0x0F, 0x01, 0xF0, 0x03, 0xE0, 0xF8, 0x00, 0x78, 0x00,
+ 0x03, 0xC0, 0x01, 0xE0, 0x78, 0x00, 0x78, 0x0F, 0x00, 0x0F, 0x01, 0xE0,
+ 0x03, 0xC0, 0x3C, 0x00, 0x78, 0x07, 0xC0, 0x1E, 0x00, 0x78, 0x07, 0xC0,
+ 0x0F, 0x00, 0xF0, 0x01, 0xE0, 0x3C, 0x00, 0x3C, 0x07, 0x80, 0x07, 0x81,
+ 0xE0, 0x00, 0xF0, 0x3C, 0x00, 0x1E, 0x0F, 0x00, 0x03, 0xC1, 0xC0, 0x00,
+ 0x3C, 0x78, 0x00, 0x07, 0x9E, 0x00, 0x00, 0xF3, 0xC0, 0x00, 0x1E, 0xF0,
+ 0x00, 0x03, 0xDE, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x01,
+ 0xFC, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x78, 0x00,
+ 0x00, 0x0F, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x1E,
+ 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00,
+ 0xFF, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x01,
+ 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xE0,
+ 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0,
+ 0x00, 0x01, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0,
+ 0x00, 0x01, 0xE0, 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0,
+ 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0,
+ 0x00, 0x03, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xE0, 0xFF,
+ 0xFF, 0xF0, 0x7F, 0xFF, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x7E, 0x00, 0xFE,
+ 0x00, 0xF0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x03, 0xC0, 0x03, 0xC0,
+ 0x03, 0xC0, 0x03, 0xC0, 0x07, 0xC0, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80,
+ 0x07, 0x80, 0x0F, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0xF8, 0x00,
+ 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00,
+ 0x38, 0x00, 0x38, 0x00, 0x3C, 0x00, 0x7C, 0x00, 0x78, 0x00, 0x78, 0x00,
+ 0x78, 0x00, 0x78, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xE0, 0x00,
+ 0xE0, 0x00, 0xF0, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0x7C, 0x00, 0x00, 0x70,
+ 0x07, 0x00, 0x60, 0x06, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0C, 0x01, 0xC0,
+ 0x1C, 0x01, 0xC0, 0x1C, 0x01, 0x80, 0x38, 0x03, 0x80, 0x38, 0x03, 0x00,
+ 0x30, 0x07, 0x00, 0x70, 0x07, 0x00, 0x60, 0x0E, 0x00, 0xE0, 0x0E, 0x00,
+ 0xE0, 0x0C, 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x1C, 0x01, 0x80, 0x38, 0x03,
+ 0x80, 0x38, 0x03, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x60, 0x0E,
+ 0x00, 0xE0, 0x06, 0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3F, 0x00, 0x0F,
+ 0x00, 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x1E,
+ 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x3E, 0x00, 0x3C, 0x00, 0x1C,
+ 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x0F,
+ 0x00, 0x07, 0x00, 0x1F, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x00, 0xF0,
+ 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x03, 0xE0, 0x03, 0xC0,
+ 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80,
+ 0x0F, 0x00, 0x7F, 0x00, 0x7E, 0x00, 0xF8, 0x00, 0x0F, 0x00, 0x01, 0xFE,
+ 0x00, 0xCF, 0xFC, 0x0E, 0xE3, 0xF0, 0xE6, 0x07, 0xFF, 0x60, 0x0F, 0xF0,
+ 0x00, 0x1E, 0x00 };
+
+const GFXglyph FreeSansOblique24pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 13, 0, 1 }, // 0x20 ' '
+ { 0, 11, 34, 13, 6, -33 }, // 0x21 '!'
+ { 47, 13, 12, 17, 8, -32 }, // 0x22 '"'
+ { 67, 28, 34, 26, 3, -32 }, // 0x23 '#'
+ { 186, 26, 42, 26, 3, -35 }, // 0x24 '$'
+ { 323, 36, 34, 42, 6, -32 }, // 0x25 '%'
+ { 476, 26, 34, 31, 4, -32 }, // 0x26 '&'
+ { 587, 5, 12, 9, 8, -32 }, // 0x27 '''
+ { 595, 15, 44, 16, 5, -33 }, // 0x28 '('
+ { 678, 15, 44, 16, 1, -33 }, // 0x29 ')'
+ { 761, 14, 13, 18, 8, -33 }, // 0x2A '*'
+ { 784, 23, 22, 27, 5, -20 }, // 0x2B '+'
+ { 848, 7, 12, 13, 3, -4 }, // 0x2C ','
+ { 859, 12, 4, 16, 5, -14 }, // 0x2D '-'
+ { 865, 6, 5, 13, 4, -4 }, // 0x2E '.'
+ { 869, 21, 35, 13, -1, -33 }, // 0x2F '/'
+ { 961, 23, 34, 26, 5, -32 }, // 0x30 '0'
+ { 1059, 13, 33, 26, 10, -32 }, // 0x31 '1'
+ { 1113, 27, 33, 26, 2, -32 }, // 0x32 '2'
+ { 1225, 25, 34, 26, 3, -32 }, // 0x33 '3'
+ { 1332, 24, 33, 26, 3, -32 }, // 0x34 '4'
+ { 1431, 27, 34, 26, 3, -32 }, // 0x35 '5'
+ { 1546, 24, 34, 26, 4, -32 }, // 0x36 '6'
+ { 1648, 26, 33, 26, 6, -32 }, // 0x37 '7'
+ { 1756, 25, 34, 26, 3, -32 }, // 0x38 '8'
+ { 1863, 24, 34, 26, 4, -32 }, // 0x39 '9'
+ { 1965, 10, 25, 13, 5, -24 }, // 0x3A ':'
+ { 1997, 11, 32, 13, 4, -24 }, // 0x3B ';'
+ { 2041, 26, 23, 27, 4, -22 }, // 0x3C '<'
+ { 2116, 26, 12, 27, 3, -16 }, // 0x3D '='
+ { 2155, 26, 23, 27, 2, -21 }, // 0x3E '>'
+ { 2230, 20, 35, 26, 9, -34 }, // 0x3F '?'
+ { 2318, 45, 42, 48, 4, -34 }, // 0x40 '@'
+ { 2555, 30, 34, 31, 1, -33 }, // 0x41 'A'
+ { 2683, 29, 34, 31, 4, -33 }, // 0x42 'B'
+ { 2807, 30, 36, 33, 5, -34 }, // 0x43 'C'
+ { 2942, 31, 34, 33, 4, -33 }, // 0x44 'D'
+ { 3074, 31, 34, 31, 4, -33 }, // 0x45 'E'
+ { 3206, 30, 34, 28, 4, -33 }, // 0x46 'F'
+ { 3334, 33, 36, 37, 5, -34 }, // 0x47 'G'
+ { 3483, 33, 34, 34, 4, -33 }, // 0x48 'H'
+ { 3624, 11, 34, 13, 5, -33 }, // 0x49 'I'
+ { 3671, 25, 35, 24, 2, -33 }, // 0x4A 'J'
+ { 3781, 34, 34, 31, 4, -33 }, // 0x4B 'K'
+ { 3926, 22, 34, 26, 4, -33 }, // 0x4C 'L'
+ { 4020, 39, 34, 40, 4, -33 }, // 0x4D 'M'
+ { 4186, 34, 34, 34, 4, -33 }, // 0x4E 'N'
+ { 4331, 33, 36, 36, 5, -34 }, // 0x4F 'O'
+ { 4480, 29, 34, 30, 4, -33 }, // 0x50 'P'
+ { 4604, 33, 38, 36, 5, -34 }, // 0x51 'Q'
+ { 4761, 30, 34, 33, 4, -33 }, // 0x52 'R'
+ { 4889, 29, 36, 31, 4, -34 }, // 0x53 'S'
+ { 5020, 28, 34, 29, 7, -33 }, // 0x54 'T'
+ { 5139, 31, 35, 34, 6, -33 }, // 0x55 'U'
+ { 5275, 29, 34, 30, 8, -33 }, // 0x56 'V'
+ { 5399, 43, 34, 44, 8, -33 }, // 0x57 'W'
+ { 5582, 36, 34, 31, 1, -33 }, // 0x58 'X'
+ { 5735, 30, 34, 32, 8, -33 }, // 0x59 'Y'
+ { 5863, 34, 34, 29, 1, -33 }, // 0x5A 'Z'
+ { 6008, 18, 44, 13, 1, -33 }, // 0x5B '['
+ { 6107, 6, 35, 13, 7, -33 }, // 0x5C '\'
+ { 6134, 18, 44, 13, -1, -33 }, // 0x5D ']'
+ { 6233, 17, 18, 22, 6, -32 }, // 0x5E '^'
+ { 6272, 29, 2, 26, -3, 7 }, // 0x5F '_'
+ { 6280, 8, 7, 16, 8, -34 }, // 0x60 '`'
+ { 6287, 23, 27, 26, 3, -25 }, // 0x61 'a'
+ { 6365, 25, 35, 26, 3, -33 }, // 0x62 'b'
+ { 6475, 22, 27, 24, 4, -25 }, // 0x63 'c'
+ { 6550, 27, 35, 26, 4, -33 }, // 0x64 'd'
+ { 6669, 23, 27, 26, 4, -25 }, // 0x65 'e'
+ { 6747, 15, 34, 12, 3, -33 }, // 0x66 'f'
+ { 6811, 27, 36, 26, 2, -25 }, // 0x67 'g'
+ { 6933, 23, 34, 25, 3, -33 }, // 0x68 'h'
+ { 7031, 11, 34, 10, 3, -33 }, // 0x69 'i'
+ { 7078, 18, 44, 11, -2, -33 }, // 0x6A 'j'
+ { 7177, 25, 34, 24, 3, -33 }, // 0x6B 'k'
+ { 7284, 11, 34, 10, 3, -33 }, // 0x6C 'l'
+ { 7331, 36, 26, 38, 3, -25 }, // 0x6D 'm'
+ { 7448, 23, 26, 25, 3, -25 }, // 0x6E 'n'
+ { 7523, 23, 27, 26, 4, -25 }, // 0x6F 'o'
+ { 7601, 27, 36, 26, 1, -25 }, // 0x70 'p'
+ { 7723, 26, 36, 26, 3, -25 }, // 0x71 'q'
+ { 7840, 17, 26, 15, 3, -25 }, // 0x72 'r'
+ { 7896, 21, 27, 24, 3, -25 }, // 0x73 's'
+ { 7967, 13, 32, 12, 4, -30 }, // 0x74 't'
+ { 8019, 24, 26, 25, 4, -24 }, // 0x75 'u'
+ { 8097, 22, 25, 23, 6, -24 }, // 0x76 'v'
+ { 8166, 33, 25, 34, 6, -24 }, // 0x77 'w'
+ { 8270, 26, 25, 23, 1, -24 }, // 0x78 'x'
+ { 8352, 27, 35, 23, 0, -24 }, // 0x79 'y'
+ { 8471, 25, 25, 23, 1, -24 }, // 0x7A 'z'
+ { 8550, 16, 44, 16, 5, -33 }, // 0x7B '{'
+ { 8638, 12, 44, 12, 3, -33 }, // 0x7C '|'
+ { 8704, 16, 44, 16, -1, -33 }, // 0x7D '}'
+ { 8792, 21, 7, 27, 6, -19 } }; // 0x7E '~'
+
+const GFXfont FreeSansOblique24pt7b PROGMEM = {
+ (uint8_t *)FreeSansOblique24pt7bBitmaps,
+ (GFXglyph *)FreeSansOblique24pt7bGlyphs,
+ 0x20, 0x7E, 56 };
+
+// Approx. 9483 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansOblique9pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansOblique9pt7b.h
new file mode 100644
index 000000000000..18a6cbe1e340
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSansOblique9pt7b.h
@@ -0,0 +1,220 @@
+const uint8_t FreeSansOblique9pt7bBitmaps[] PROGMEM = {
+ 0x10, 0x84, 0x22, 0x10, 0x84, 0x42, 0x10, 0x08, 0x00, 0xDE, 0xE5, 0x20,
+ 0x06, 0x40, 0x88, 0x13, 0x06, 0x43, 0xFE, 0x32, 0x04, 0x40, 0x98, 0x32,
+ 0x1F, 0xF0, 0x98, 0x22, 0x04, 0xC0, 0x02, 0x01, 0xF8, 0x6B, 0x99, 0x33,
+ 0x40, 0x68, 0x0F, 0x00, 0xF8, 0x07, 0xC1, 0x1B, 0x23, 0x64, 0x4E, 0x98,
+ 0xFC, 0x04, 0x00, 0x80, 0x3C, 0x08, 0xCC, 0x23, 0x18, 0x86, 0x32, 0x0C,
+ 0x64, 0x19, 0x90, 0x1E, 0x40, 0x01, 0x1E, 0x02, 0x66, 0x09, 0x8C, 0x23,
+ 0x18, 0x86, 0x62, 0x07, 0x80, 0x0F, 0x06, 0x63, 0x18, 0xC6, 0x3F, 0x07,
+ 0x03, 0xC1, 0xB3, 0xC7, 0xB0, 0xCC, 0x33, 0x3E, 0x79, 0x80, 0xFA, 0x04,
+ 0x10, 0x60, 0x83, 0x04, 0x18, 0x30, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x10,
+ 0x30, 0x20, 0x08, 0x18, 0x10, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x18, 0x30,
+ 0x41, 0x82, 0x0C, 0x10, 0x40, 0x19, 0x73, 0x16, 0x48, 0x04, 0x04, 0x02,
+ 0x1F, 0xF0, 0x80, 0x80, 0x40, 0x20, 0x6D, 0x28, 0xF0, 0xC0, 0x01, 0x02,
+ 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x0F,
+ 0x19, 0xC8, 0x6C, 0x36, 0x1A, 0x0F, 0x05, 0x86, 0xC3, 0x61, 0xB1, 0x9C,
+ 0x87, 0x80, 0x08, 0xCD, 0xE3, 0x18, 0xC4, 0x23, 0x18, 0xC4, 0x00, 0x07,
+ 0x83, 0x1C, 0x41, 0x98, 0x30, 0x06, 0x01, 0x80, 0x60, 0x38, 0x1C, 0x06,
+ 0x01, 0x80, 0x20, 0x0F, 0xF8, 0x0F, 0x86, 0x73, 0x0C, 0x83, 0x00, 0xC0,
+ 0x60, 0xE0, 0x06, 0x01, 0xB0, 0x6C, 0x13, 0x8C, 0x7C, 0x00, 0x00, 0x80,
+ 0xC0, 0xE0, 0xA0, 0x90, 0x98, 0x8C, 0x86, 0xFF, 0x81, 0x01, 0x80, 0xC0,
+ 0x60, 0x0F, 0xC3, 0x00, 0x40, 0x08, 0x03, 0x00, 0x7F, 0x1C, 0x70, 0x06,
+ 0x00, 0xC0, 0x1B, 0x06, 0x71, 0x87, 0xE0, 0x0F, 0x86, 0x73, 0x0D, 0x80,
+ 0x60, 0x1F, 0xCF, 0x3B, 0x86, 0xC1, 0xB0, 0x6C, 0x33, 0x98, 0x3C, 0x00,
+ 0x7F, 0xC0, 0x20, 0x10, 0x0C, 0x06, 0x01, 0x00, 0x80, 0x60, 0x10, 0x0C,
+ 0x02, 0x01, 0x80, 0x40, 0x00, 0x0F, 0x86, 0x73, 0x0C, 0xC3, 0x30, 0xCC,
+ 0x61, 0xE1, 0x86, 0x41, 0xB0, 0x6C, 0x13, 0x8C, 0x3E, 0x00, 0x0F, 0x06,
+ 0x73, 0x0D, 0x83, 0x60, 0xD8, 0x77, 0x3C, 0xFE, 0x01, 0x80, 0x6C, 0x33,
+ 0x98, 0x7C, 0x00, 0x30, 0x00, 0x00, 0x00, 0xC0, 0x18, 0x00, 0x00, 0x00,
+ 0x0C, 0x62, 0x11, 0x00, 0x00, 0x01, 0xC3, 0x8F, 0x0C, 0x07, 0x00, 0xE0,
+ 0x1E, 0x01, 0x00, 0x7F, 0xC0, 0x00, 0x03, 0xFE, 0x40, 0x3C, 0x03, 0x80,
+ 0x70, 0x18, 0x78, 0xE1, 0xC0, 0x00, 0x00, 0x1F, 0x30, 0xD0, 0x78, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xFE,
+ 0x00, 0xC0, 0xE0, 0xC0, 0x18, 0x61, 0xD3, 0x31, 0x9C, 0xD8, 0xC2, 0x36,
+ 0x31, 0x8F, 0x18, 0x67, 0xC6, 0x11, 0xB1, 0x8C, 0xCC, 0x67, 0x63, 0x0E,
+ 0xF0, 0x60, 0x00, 0x1C, 0x00, 0x01, 0x81, 0x00, 0x1F, 0xC0, 0x01, 0xC0,
+ 0x1C, 0x03, 0xC0, 0x24, 0x06, 0x60, 0x46, 0x0C, 0x61, 0x86, 0x1F, 0xE3,
+ 0x06, 0x20, 0x26, 0x03, 0x40, 0x30, 0x1F, 0xE1, 0x87, 0x30, 0x33, 0x03,
+ 0x30, 0x23, 0x06, 0x3F, 0xC6, 0x06, 0x60, 0x66, 0x06, 0x60, 0x66, 0x0C,
+ 0x7F, 0x80, 0x07, 0xC1, 0x86, 0x30, 0x32, 0x03, 0x60, 0x04, 0x00, 0xC0,
+ 0x0C, 0x00, 0xC0, 0x6C, 0x06, 0xC0, 0xC6, 0x18, 0x3E, 0x00, 0x1F, 0xE0,
+ 0xC1, 0x84, 0x06, 0x60, 0x33, 0x01, 0x98, 0x0C, 0x80, 0x64, 0x02, 0x60,
+ 0x33, 0x01, 0x98, 0x18, 0x81, 0x87, 0xF0, 0x00, 0x1F, 0xF1, 0x80, 0x10,
+ 0x03, 0x00, 0x30, 0x03, 0x00, 0x3F, 0xE2, 0x00, 0x60, 0x06, 0x00, 0x60,
+ 0x04, 0x00, 0x7F, 0xC0, 0x1F, 0xF1, 0x80, 0x10, 0x03, 0x00, 0x30, 0x03,
+ 0x00, 0x3F, 0xC2, 0x00, 0x60, 0x06, 0x00, 0x60, 0x04, 0x00, 0x40, 0x00,
+ 0x07, 0xE0, 0xE1, 0x8C, 0x06, 0xC0, 0x36, 0x00, 0x60, 0x03, 0x07, 0xF8,
+ 0x02, 0xC0, 0x36, 0x01, 0x98, 0x1C, 0xE1, 0xC1, 0xF2, 0x00, 0x18, 0x08,
+ 0xC0, 0xC4, 0x06, 0x60, 0x33, 0x01, 0x18, 0x18, 0xFF, 0xC4, 0x06, 0x60,
+ 0x23, 0x01, 0x18, 0x18, 0x80, 0xC4, 0x06, 0x00, 0x33, 0x32, 0x26, 0x66,
+ 0x44, 0xCC, 0xC0, 0x00, 0xC0, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x30,
+ 0x0C, 0x03, 0x30, 0xCC, 0x63, 0x18, 0x7C, 0x00, 0x18, 0x18, 0x60, 0xC1,
+ 0x0E, 0x0C, 0x60, 0x33, 0x00, 0xD8, 0x03, 0xF0, 0x0C, 0xC0, 0x61, 0x81,
+ 0x86, 0x06, 0x0C, 0x10, 0x30, 0x40, 0x60, 0x18, 0x0C, 0x04, 0x06, 0x03,
+ 0x01, 0x80, 0xC0, 0x40, 0x60, 0x30, 0x18, 0x08, 0x07, 0xF8, 0x18, 0x06,
+ 0x18, 0x0E, 0x18, 0x0E, 0x34, 0x1E, 0x34, 0x36, 0x34, 0x34, 0x24, 0x64,
+ 0x24, 0x6C, 0x64, 0xCC, 0x64, 0x8C, 0x65, 0x88, 0x43, 0x08, 0x43, 0x18,
+ 0x18, 0x08, 0xE0, 0x47, 0x06, 0x6C, 0x33, 0x61, 0x99, 0x08, 0x8C, 0xC4,
+ 0x66, 0x61, 0xB3, 0x0D, 0x18, 0x38, 0x81, 0xC4, 0x06, 0x00, 0x07, 0xC0,
+ 0xC3, 0x8C, 0x0E, 0xC0, 0x36, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0,
+ 0x36, 0x01, 0xB8, 0x18, 0xE1, 0x81, 0xF0, 0x00, 0x1F, 0xE1, 0x83, 0x10,
+ 0x33, 0x03, 0x30, 0x33, 0x06, 0x3F, 0xC2, 0x00, 0x60, 0x06, 0x00, 0x60,
+ 0x04, 0x00, 0x40, 0x00, 0x07, 0xC0, 0xC3, 0x8C, 0x0E, 0xC0, 0x36, 0x01,
+ 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x36, 0x09, 0xB8, 0x78, 0xE3, 0x81,
+ 0xF6, 0x00, 0x10, 0x1F, 0xF0, 0xC0, 0xC4, 0x06, 0x60, 0x33, 0x01, 0x18,
+ 0x18, 0xFF, 0x04, 0x0C, 0x60, 0x63, 0x03, 0x18, 0x18, 0x80, 0xC4, 0x06,
+ 0x00, 0x07, 0xC1, 0x87, 0x30, 0x33, 0x03, 0x30, 0x03, 0xC0, 0x0F, 0xC0,
+ 0x1E, 0x00, 0x6C, 0x06, 0xC0, 0x46, 0x0C, 0x3F, 0x00, 0xFF, 0xC3, 0x00,
+ 0xC0, 0x20, 0x18, 0x06, 0x01, 0x80, 0x60, 0x10, 0x0C, 0x03, 0x00, 0xC0,
+ 0x20, 0x00, 0x30, 0x13, 0x03, 0x20, 0x36, 0x03, 0x60, 0x26, 0x06, 0x60,
+ 0x64, 0x06, 0xC0, 0x6C, 0x04, 0xC0, 0xCE, 0x18, 0x3E, 0x00, 0xC0, 0x78,
+ 0x0B, 0x03, 0x20, 0xC4, 0x18, 0xC6, 0x18, 0x83, 0x30, 0x64, 0x0D, 0x80,
+ 0xA0, 0x1C, 0x03, 0x00, 0xC1, 0x83, 0xC1, 0x83, 0xC3, 0x86, 0xC2, 0x86,
+ 0xC6, 0x84, 0xC4, 0x8C, 0xCC, 0xC8, 0xC8, 0xD8, 0xD8, 0xD0, 0xD0, 0xF0,
+ 0x70, 0xE0, 0x60, 0xE0, 0x60, 0xE0, 0x0C, 0x0C, 0x30, 0x60, 0x63, 0x01,
+ 0x98, 0x02, 0xC0, 0x0E, 0x00, 0x38, 0x01, 0xE0, 0x0C, 0x80, 0x33, 0x01,
+ 0x8C, 0x0C, 0x18, 0x60, 0x60, 0xC0, 0x66, 0x0C, 0x60, 0xC2, 0x18, 0x33,
+ 0x03, 0x60, 0x1C, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x00, 0x30,
+ 0x00, 0x1F, 0xF0, 0x07, 0x00, 0xE0, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00,
+ 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x00, 0xFF, 0xC0, 0x0E, 0x10, 0x20,
+ 0x41, 0x02, 0x04, 0x08, 0x20, 0x40, 0x81, 0x04, 0x08, 0x10, 0x20, 0xE0,
+ 0xAA, 0xA9, 0x55, 0x40, 0x0E, 0x08, 0x10, 0x20, 0x41, 0x02, 0x04, 0x08,
+ 0x20, 0x40, 0x81, 0x04, 0x08, 0x10, 0xE0, 0x0C, 0x18, 0x51, 0xA2, 0x4C,
+ 0x50, 0x80, 0xFF, 0xE0, 0xC8, 0x80, 0x0F, 0x86, 0x33, 0x0C, 0x03, 0x03,
+ 0xDF, 0xEE, 0x0B, 0x02, 0xC1, 0x9F, 0xE0, 0x10, 0x04, 0x01, 0x00, 0xDC,
+ 0x39, 0x88, 0x32, 0x0D, 0x83, 0x40, 0xD0, 0x64, 0x1B, 0x8C, 0xBC, 0x00,
+ 0x1F, 0x18, 0xD8, 0x6C, 0x0C, 0x06, 0x03, 0x01, 0x86, 0x66, 0x3E, 0x00,
+ 0x00, 0x20, 0x08, 0x01, 0x0F, 0x23, 0x14, 0xC1, 0x18, 0x26, 0x04, 0xC0,
+ 0x98, 0x23, 0x04, 0x71, 0x87, 0xD0, 0x0F, 0x0C, 0x76, 0x0D, 0x83, 0xFF,
+ 0xF0, 0x0C, 0x03, 0x06, 0x63, 0x0F, 0x80, 0x1C, 0xC2, 0x1E, 0x20, 0x84,
+ 0x10, 0x41, 0x04, 0x20, 0x80, 0x0F, 0x46, 0x33, 0x0C, 0xC1, 0x60, 0xD8,
+ 0x26, 0x09, 0x86, 0x71, 0x8F, 0xE0, 0x10, 0x04, 0xC2, 0x1F, 0x00, 0x10,
+ 0x04, 0x01, 0x00, 0x9F, 0x39, 0x88, 0x22, 0x09, 0x02, 0x40, 0x90, 0x44,
+ 0x12, 0x04, 0x81, 0x00, 0x10, 0x02, 0x22, 0x64, 0x44, 0x48, 0x80, 0x04,
+ 0x00, 0x01, 0x08, 0x20, 0x82, 0x08, 0x41, 0x04, 0x10, 0x42, 0x08, 0xE0,
+ 0x10, 0x08, 0x04, 0x04, 0x32, 0x31, 0x20, 0xA0, 0xB8, 0x6C, 0x22, 0x11,
+ 0x90, 0xC8, 0x30, 0x11, 0x22, 0x22, 0x64, 0x44, 0x48, 0x80, 0x2F, 0x3C,
+ 0x63, 0x8C, 0x86, 0x19, 0x08, 0x44, 0x10, 0x88, 0x21, 0x10, 0x82, 0x21,
+ 0x04, 0x82, 0x11, 0x04, 0x20, 0x00, 0x0B, 0xF3, 0x18, 0x82, 0x20, 0x90,
+ 0x24, 0x09, 0x04, 0x41, 0x20, 0x48, 0x10, 0x0F, 0x0C, 0x76, 0x0D, 0x83,
+ 0xC0, 0xF0, 0x3C, 0x1B, 0x06, 0xE3, 0x0F, 0x00, 0x17, 0xC3, 0x1C, 0x41,
+ 0x98, 0x32, 0x06, 0x40, 0xC8, 0x33, 0x06, 0x71, 0x8B, 0xC1, 0x00, 0x20,
+ 0x08, 0x01, 0x00, 0x00, 0x1E, 0xCC, 0x66, 0x09, 0x82, 0xC0, 0xB0, 0x4C,
+ 0x13, 0x04, 0x63, 0x0F, 0xC0, 0x20, 0x08, 0x02, 0x00, 0x80, 0x2C, 0x60,
+ 0x81, 0x04, 0x08, 0x10, 0x20, 0x81, 0x00, 0x1E, 0x33, 0x63, 0x60, 0x70,
+ 0x1E, 0x03, 0xC3, 0xC6, 0x7C, 0x22, 0xF2, 0x44, 0x44, 0xCC, 0xCE, 0x21,
+ 0x20, 0x90, 0x48, 0x24, 0x12, 0x13, 0x09, 0x84, 0xE6, 0x3E, 0x00, 0xC1,
+ 0xE1, 0xB0, 0xC8, 0xC4, 0x43, 0x61, 0xA0, 0xF0, 0x70, 0x18, 0x00, 0xC7,
+ 0x1E, 0x38, 0xB3, 0xCD, 0x96, 0x4C, 0xB6, 0x6D, 0xB1, 0x4D, 0x0E, 0x78,
+ 0x63, 0x83, 0x1C, 0x00, 0x10, 0xC3, 0x10, 0x24, 0x07, 0x80, 0xE0, 0x1C,
+ 0x07, 0x81, 0x90, 0x23, 0x08, 0x20, 0x30, 0x46, 0x18, 0x42, 0x08, 0xC1,
+ 0x10, 0x24, 0x07, 0x80, 0xE0, 0x1C, 0x03, 0x00, 0x60, 0x08, 0x03, 0x01,
+ 0xC0, 0x00, 0x3F, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
+ 0x7F, 0x00, 0x18, 0x88, 0x42, 0x10, 0x88, 0xC3, 0x18, 0x88, 0x42, 0x18,
+ 0xE0, 0x11, 0x22, 0x22, 0x24, 0x44, 0x4C, 0x88, 0x88, 0x00, 0x38, 0xC2,
+ 0x10, 0x88, 0xC6, 0x18, 0x88, 0x42, 0x10, 0x88, 0xC0, 0x70, 0x4E, 0x41,
+ 0xC0 };
+
+const GFXglyph FreeSansOblique9pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 5, 0, 1 }, // 0x20 ' '
+ { 0, 5, 13, 5, 2, -12 }, // 0x21 '!'
+ { 9, 5, 4, 6, 3, -12 }, // 0x22 '"'
+ { 12, 11, 13, 10, 1, -12 }, // 0x23 '#'
+ { 30, 11, 16, 10, 1, -13 }, // 0x24 '$'
+ { 52, 15, 13, 16, 2, -12 }, // 0x25 '%'
+ { 77, 10, 13, 12, 2, -12 }, // 0x26 '&'
+ { 94, 2, 4, 3, 3, -12 }, // 0x27 '''
+ { 95, 7, 17, 6, 2, -12 }, // 0x28 '('
+ { 110, 7, 17, 6, -1, -12 }, // 0x29 ')'
+ { 125, 6, 5, 7, 3, -12 }, // 0x2A '*'
+ { 129, 9, 8, 11, 2, -7 }, // 0x2B '+'
+ { 138, 3, 5, 5, 1, -1 }, // 0x2C ','
+ { 140, 4, 1, 6, 2, -4 }, // 0x2D '-'
+ { 141, 2, 1, 5, 2, 0 }, // 0x2E '.'
+ { 142, 8, 13, 5, 0, -12 }, // 0x2F '/'
+ { 155, 9, 13, 10, 2, -12 }, // 0x30 '0'
+ { 170, 5, 13, 10, 4, -12 }, // 0x31 '1'
+ { 179, 11, 13, 10, 1, -12 }, // 0x32 '2'
+ { 197, 10, 13, 10, 1, -12 }, // 0x33 '3'
+ { 214, 9, 13, 10, 1, -12 }, // 0x34 '4'
+ { 229, 11, 13, 10, 1, -12 }, // 0x35 '5'
+ { 247, 10, 13, 10, 2, -12 }, // 0x36 '6'
+ { 264, 10, 13, 10, 2, -12 }, // 0x37 '7'
+ { 281, 10, 13, 10, 1, -12 }, // 0x38 '8'
+ { 298, 10, 13, 10, 1, -12 }, // 0x39 '9'
+ { 315, 4, 9, 5, 2, -8 }, // 0x3A ':'
+ { 320, 5, 12, 5, 1, -8 }, // 0x3B ';'
+ { 328, 9, 9, 11, 2, -8 }, // 0x3C '<'
+ { 339, 10, 4, 11, 1, -5 }, // 0x3D '='
+ { 344, 9, 9, 11, 1, -7 }, // 0x3E '>'
+ { 355, 9, 13, 10, 3, -12 }, // 0x3F '?'
+ { 370, 18, 16, 18, 1, -12 }, // 0x40 '@'
+ { 406, 12, 13, 12, 0, -12 }, // 0x41 'A'
+ { 426, 12, 13, 12, 1, -12 }, // 0x42 'B'
+ { 446, 12, 13, 13, 2, -12 }, // 0x43 'C'
+ { 466, 13, 13, 13, 1, -12 }, // 0x44 'D'
+ { 488, 12, 13, 12, 1, -12 }, // 0x45 'E'
+ { 508, 12, 13, 11, 1, -12 }, // 0x46 'F'
+ { 528, 13, 13, 14, 2, -12 }, // 0x47 'G'
+ { 550, 13, 13, 13, 1, -12 }, // 0x48 'H'
+ { 572, 4, 13, 5, 2, -12 }, // 0x49 'I'
+ { 579, 10, 13, 9, 1, -12 }, // 0x4A 'J'
+ { 596, 14, 13, 12, 1, -12 }, // 0x4B 'K'
+ { 619, 9, 13, 10, 1, -12 }, // 0x4C 'L'
+ { 634, 16, 13, 15, 1, -12 }, // 0x4D 'M'
+ { 660, 13, 13, 13, 1, -12 }, // 0x4E 'N'
+ { 682, 13, 13, 14, 2, -12 }, // 0x4F 'O'
+ { 704, 12, 13, 12, 1, -12 }, // 0x50 'P'
+ { 724, 13, 14, 14, 2, -12 }, // 0x51 'Q'
+ { 747, 13, 13, 13, 1, -12 }, // 0x52 'R'
+ { 769, 12, 13, 12, 1, -12 }, // 0x53 'S'
+ { 789, 10, 13, 11, 3, -12 }, // 0x54 'T'
+ { 806, 12, 13, 13, 2, -12 }, // 0x55 'U'
+ { 826, 11, 13, 12, 3, -12 }, // 0x56 'V'
+ { 844, 16, 13, 17, 3, -12 }, // 0x57 'W'
+ { 870, 14, 13, 12, 0, -12 }, // 0x58 'X'
+ { 893, 12, 13, 12, 3, -12 }, // 0x59 'Y'
+ { 913, 12, 13, 11, 1, -12 }, // 0x5A 'Z'
+ { 933, 7, 17, 5, 0, -12 }, // 0x5B '['
+ { 948, 2, 13, 5, 3, -12 }, // 0x5C '\'
+ { 952, 7, 17, 5, 0, -12 }, // 0x5D ']'
+ { 967, 7, 7, 8, 2, -12 }, // 0x5E '^'
+ { 974, 11, 1, 10, -1, 3 }, // 0x5F '_'
+ { 976, 3, 3, 6, 3, -12 }, // 0x60 '`'
+ { 978, 10, 10, 10, 1, -9 }, // 0x61 'a'
+ { 991, 10, 13, 10, 1, -12 }, // 0x62 'b'
+ { 1008, 9, 10, 9, 1, -9 }, // 0x63 'c'
+ { 1020, 11, 13, 10, 1, -12 }, // 0x64 'd'
+ { 1038, 10, 10, 10, 1, -9 }, // 0x65 'e'
+ { 1051, 6, 13, 5, 1, -12 }, // 0x66 'f'
+ { 1061, 10, 14, 10, 0, -9 }, // 0x67 'g'
+ { 1079, 10, 13, 10, 1, -12 }, // 0x68 'h'
+ { 1096, 4, 13, 4, 1, -12 }, // 0x69 'i'
+ { 1103, 6, 17, 4, -1, -12 }, // 0x6A 'j'
+ { 1116, 9, 13, 9, 1, -12 }, // 0x6B 'k'
+ { 1131, 4, 13, 4, 1, -12 }, // 0x6C 'l'
+ { 1138, 15, 10, 15, 1, -9 }, // 0x6D 'm'
+ { 1157, 10, 11, 10, 1, -10 }, // 0x6E 'n'
+ { 1171, 10, 10, 10, 1, -9 }, // 0x6F 'o'
+ { 1184, 11, 14, 10, 0, -9 }, // 0x70 'p'
+ { 1204, 10, 14, 10, 1, -9 }, // 0x71 'q'
+ { 1222, 7, 10, 6, 1, -9 }, // 0x72 'r'
+ { 1231, 8, 10, 9, 1, -9 }, // 0x73 's'
+ { 1241, 4, 12, 5, 2, -11 }, // 0x74 't'
+ { 1247, 9, 10, 10, 2, -9 }, // 0x75 'u'
+ { 1259, 9, 10, 9, 2, -9 }, // 0x76 'v'
+ { 1271, 13, 10, 13, 2, -9 }, // 0x77 'w'
+ { 1288, 11, 10, 9, 0, -9 }, // 0x78 'x'
+ { 1302, 11, 14, 9, 0, -9 }, // 0x79 'y'
+ { 1322, 9, 10, 9, 1, -9 }, // 0x7A 'z'
+ { 1334, 5, 17, 6, 2, -12 }, // 0x7B '{'
+ { 1345, 4, 17, 5, 1, -12 }, // 0x7C '|'
+ { 1354, 5, 17, 6, 0, -12 }, // 0x7D '}'
+ { 1365, 9, 3, 11, 2, -7 } }; // 0x7E '~'
+
+const GFXfont FreeSansOblique9pt7b PROGMEM = {
+ (uint8_t *)FreeSansOblique9pt7bBitmaps,
+ (GFXglyph *)FreeSansOblique9pt7bGlyphs,
+ 0x20, 0x7E, 22 };
+
+// Approx. 2041 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerif12pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerif12pt7b.h
new file mode 100644
index 000000000000..48ad3da69bc6
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerif12pt7b.h
@@ -0,0 +1,259 @@
+const uint8_t FreeSerif12pt7bBitmaps[] PROGMEM = {
+ 0xFF, 0xFE, 0xA8, 0x3F, 0xCF, 0x3C, 0xF3, 0x8A, 0x20, 0x0C, 0x40, 0xC4,
+ 0x08, 0x40, 0x8C, 0x08, 0xC7, 0xFF, 0x18, 0x81, 0x88, 0x10, 0x81, 0x08,
+ 0xFF, 0xE1, 0x18, 0x31, 0x03, 0x10, 0x31, 0x02, 0x10, 0x04, 0x07, 0xC6,
+ 0x5B, 0x12, 0xC4, 0xB1, 0x0F, 0x41, 0xF0, 0x1E, 0x01, 0xE0, 0x58, 0x13,
+ 0x84, 0xE1, 0x3C, 0x4F, 0x96, 0x3F, 0x01, 0x00, 0x00, 0x04, 0x03, 0x83,
+ 0x03, 0x9F, 0x81, 0xC2, 0x20, 0x60, 0x90, 0x38, 0x24, 0x0C, 0x12, 0x03,
+ 0x0D, 0x00, 0xC6, 0x47, 0x9E, 0x23, 0x10, 0x09, 0x84, 0x04, 0xE1, 0x03,
+ 0x30, 0x40, 0x8C, 0x20, 0x43, 0x08, 0x10, 0xC4, 0x08, 0x1E, 0x00, 0x03,
+ 0xC0, 0x02, 0x30, 0x03, 0x08, 0x01, 0x84, 0x00, 0xC4, 0x00, 0x7C, 0xF8,
+ 0x1C, 0x38, 0x1E, 0x08, 0x33, 0x0C, 0x31, 0xC4, 0x10, 0x74, 0x18, 0x3A,
+ 0x0C, 0x0E, 0x07, 0x03, 0x83, 0xC3, 0xE2, 0x7E, 0x3E, 0xFF, 0xA0, 0x04,
+ 0x21, 0x08, 0x61, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC1, 0x04, 0x18, 0x20,
+ 0x40, 0x81, 0x81, 0x02, 0x04, 0x18, 0x20, 0x83, 0x0C, 0x30, 0xC3, 0x0C,
+ 0x30, 0x86, 0x10, 0x84, 0x20, 0x30, 0xB3, 0xD7, 0x54, 0x38, 0x7C, 0xD3,
+ 0x30, 0x30, 0x10, 0x04, 0x00, 0x80, 0x10, 0x02, 0x00, 0x41, 0xFF, 0xC1,
+ 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, 0x00, 0xDF, 0x95, 0x00, 0xFC, 0xFC,
+ 0x06, 0x0C, 0x10, 0x60, 0xC1, 0x06, 0x0C, 0x10, 0x60, 0xC1, 0x06, 0x0C,
+ 0x10, 0x60, 0xC0, 0x1E, 0x0C, 0xC6, 0x19, 0x86, 0xC0, 0xB0, 0x3C, 0x0F,
+ 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xD8, 0x66, 0x18, 0xCC, 0x1E,
+ 0x00, 0x11, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3,
+ 0x0C, 0xFC, 0x1E, 0x18, 0xC4, 0x1A, 0x06, 0x01, 0x80, 0x60, 0x10, 0x0C,
+ 0x02, 0x01, 0x00, 0xC0, 0x60, 0x30, 0x18, 0x1F, 0xF8, 0x1E, 0x18, 0xE8,
+ 0x18, 0x06, 0x01, 0x00, 0x80, 0xF0, 0x7E, 0x03, 0xC0, 0x70, 0x0C, 0x03,
+ 0x00, 0xC0, 0x6E, 0x11, 0xF8, 0x01, 0x00, 0xC0, 0x70, 0x2C, 0x0B, 0x04,
+ 0xC2, 0x30, 0x8C, 0x43, 0x20, 0xC8, 0x33, 0xFF, 0x03, 0x00, 0xC0, 0x30,
+ 0x0C, 0x00, 0x03, 0xF1, 0x00, 0x40, 0x18, 0x0F, 0x80, 0xF8, 0x0E, 0x01,
+ 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x20, 0x1B, 0x8C, 0x7C, 0x00, 0x01,
+ 0xC3, 0xC1, 0xC0, 0xC0, 0x70, 0x18, 0x0E, 0xF3, 0xCE, 0xC1, 0xF0, 0x3C,
+ 0x0F, 0x03, 0xC0, 0xD8, 0x36, 0x08, 0xC6, 0x1E, 0x00, 0x3F, 0xD0, 0x38,
+ 0x08, 0x06, 0x01, 0x80, 0x40, 0x10, 0x0C, 0x02, 0x00, 0x80, 0x20, 0x10,
+ 0x04, 0x01, 0x00, 0x80, 0x20, 0x1F, 0x18, 0x6C, 0x0F, 0x03, 0xC0, 0xF8,
+ 0x67, 0x30, 0xF0, 0x1E, 0x09, 0xE6, 0x3B, 0x07, 0xC0, 0xF0, 0x3C, 0x0D,
+ 0x86, 0x1F, 0x00, 0x1E, 0x08, 0xC6, 0x1B, 0x02, 0xC0, 0xF0, 0x3C, 0x0F,
+ 0x03, 0xE0, 0xDC, 0x73, 0xEC, 0x06, 0x01, 0x80, 0xC0, 0x70, 0x38, 0x38,
+ 0x18, 0x00, 0xFC, 0x00, 0x3F, 0xCC, 0xC0, 0x00, 0x00, 0x06, 0x77, 0x12,
+ 0x40, 0x00, 0x00, 0x07, 0x01, 0xE0, 0x78, 0x1E, 0x07, 0x00, 0xC0, 0x0F,
+ 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x07, 0x00, 0x10, 0xFF, 0xF0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x0E, 0x00, 0x3C, 0x00, 0xF0,
+ 0x03, 0xC0, 0x0F, 0x00, 0x30, 0x0E, 0x07, 0x81, 0xE0, 0x78, 0x0E, 0x00,
+ 0x00, 0x00, 0x7C, 0x86, 0x83, 0xC3, 0x03, 0x03, 0x06, 0x0C, 0x08, 0x08,
+ 0x10, 0x10, 0x00, 0x00, 0x30, 0x30, 0x30, 0x03, 0xF0, 0x06, 0x06, 0x06,
+ 0x00, 0x86, 0x00, 0x26, 0x0E, 0xD3, 0x0C, 0xC7, 0x0C, 0x63, 0x84, 0x31,
+ 0xC6, 0x18, 0xE3, 0x08, 0x71, 0x8C, 0x4C, 0xC6, 0x46, 0x3D, 0xC1, 0x80,
+ 0x00, 0x30, 0x10, 0x07, 0xF0, 0x00, 0x80, 0x00, 0x60, 0x00, 0x70, 0x00,
+ 0x38, 0x00, 0x2E, 0x00, 0x13, 0x00, 0x19, 0xC0, 0x08, 0x60, 0x04, 0x38,
+ 0x04, 0x0C, 0x03, 0xFF, 0x03, 0x03, 0x81, 0x00, 0xE1, 0x80, 0x70, 0xC0,
+ 0x3D, 0xF0, 0x3F, 0xFF, 0x83, 0x0C, 0x30, 0x63, 0x06, 0x30, 0x63, 0x06,
+ 0x30, 0xC3, 0xF0, 0x30, 0xE3, 0x06, 0x30, 0x33, 0x03, 0x30, 0x33, 0x07,
+ 0x30, 0xEF, 0xFC, 0x07, 0xE2, 0x38, 0x3C, 0xC0, 0x3B, 0x00, 0x36, 0x00,
+ 0x38, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x03,
+ 0x00, 0x06, 0x00, 0x06, 0x00, 0x47, 0x03, 0x03, 0xF8, 0xFF, 0xC0, 0x30,
+ 0x78, 0x30, 0x1C, 0x30, 0x0E, 0x30, 0x06, 0x30, 0x03, 0x30, 0x03, 0x30,
+ 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x06, 0x30, 0x06, 0x30,
+ 0x0C, 0x30, 0x78, 0xFF, 0xC0, 0xFF, 0xFC, 0xC0, 0x33, 0x00, 0x4C, 0x00,
+ 0x30, 0x00, 0xC0, 0x43, 0x03, 0x0F, 0xFC, 0x30, 0x30, 0xC0, 0x43, 0x00,
+ 0x0C, 0x00, 0x30, 0x08, 0xC0, 0x23, 0x03, 0xBF, 0xFE, 0xFF, 0xFC, 0xC0,
+ 0x33, 0x00, 0x4C, 0x00, 0x30, 0x00, 0xC0, 0x43, 0x03, 0x0F, 0xFC, 0x30,
+ 0x30, 0xC0, 0x43, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x3F,
+ 0x00, 0x07, 0xE4, 0x1C, 0x3C, 0x30, 0x0C, 0x60, 0x0C, 0x60, 0x04, 0xC0,
+ 0x00, 0xC0, 0x00, 0xC0, 0x3F, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0x60,
+ 0x0C, 0x60, 0x0C, 0x30, 0x0C, 0x1C, 0x1C, 0x07, 0xE0, 0xFC, 0x3F, 0x30,
+ 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x3F,
+ 0xFC, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30,
+ 0x0C, 0x30, 0x0C, 0xFC, 0x3F, 0xFC, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30,
+ 0xC3, 0x0C, 0x30, 0xC3, 0x3F, 0x3F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
+ 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xC8, 0xF0, 0xFC, 0xFE, 0x30,
+ 0x38, 0x30, 0x20, 0x30, 0x40, 0x30, 0x80, 0x33, 0x00, 0x36, 0x00, 0x3E,
+ 0x00, 0x37, 0x00, 0x33, 0x80, 0x31, 0xC0, 0x30, 0xE0, 0x30, 0x70, 0x30,
+ 0x38, 0x30, 0x3C, 0xFC, 0x7F, 0xFC, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80,
+ 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00,
+ 0xC0, 0x01, 0x80, 0x03, 0x00, 0x26, 0x00, 0x8C, 0x07, 0x7F, 0xFE, 0xF8,
+ 0x01, 0xE7, 0x00, 0x70, 0xE0, 0x0E, 0x1E, 0x03, 0xC2, 0xC0, 0x58, 0x5C,
+ 0x1B, 0x09, 0x82, 0x61, 0x38, 0x4C, 0x27, 0x11, 0x84, 0x72, 0x30, 0x8E,
+ 0xC6, 0x10, 0xD0, 0xC2, 0x1E, 0x18, 0x41, 0x83, 0x1C, 0x30, 0x67, 0xC4,
+ 0x3F, 0xF0, 0x1F, 0x78, 0x0E, 0x3C, 0x04, 0x3E, 0x04, 0x2E, 0x04, 0x27,
+ 0x04, 0x23, 0x84, 0x23, 0xC4, 0x21, 0xE4, 0x20, 0xE4, 0x20, 0x74, 0x20,
+ 0x3C, 0x20, 0x1C, 0x20, 0x0C, 0x70, 0x0C, 0xF8, 0x04, 0x07, 0xC0, 0x30,
+ 0x60, 0xC0, 0x63, 0x00, 0x66, 0x00, 0xD8, 0x00, 0xF0, 0x01, 0xE0, 0x03,
+ 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1B, 0x00, 0x66, 0x00, 0xC6, 0x03, 0x06,
+ 0x0C, 0x03, 0xE0, 0xFF, 0x83, 0x0E, 0x30, 0x73, 0x03, 0x30, 0x33, 0x03,
+ 0x30, 0x63, 0x0E, 0x3F, 0x83, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00,
+ 0x30, 0x0F, 0xC0, 0x0F, 0xE0, 0x18, 0x30, 0x30, 0x18, 0x60, 0x0C, 0x60,
+ 0x0C, 0xC0, 0x06, 0xC0, 0x06, 0xC0, 0x06, 0xC0, 0x06, 0xC0, 0x06, 0xC0,
+ 0x06, 0x60, 0x0C, 0x60, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x07, 0xC0, 0x03,
+ 0xC0, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1F, 0xFF, 0x80, 0x61, 0xC0, 0xC1,
+ 0xC1, 0x81, 0x83, 0x03, 0x06, 0x06, 0x0C, 0x1C, 0x18, 0x70, 0x3F, 0x80,
+ 0x67, 0x00, 0xC7, 0x01, 0x8F, 0x03, 0x0F, 0x06, 0x0E, 0x0C, 0x0E, 0x7E,
+ 0x0F, 0x1F, 0x46, 0x19, 0x81, 0x30, 0x27, 0x02, 0xF0, 0x0F, 0x00, 0xF8,
+ 0x07, 0xC0, 0x38, 0x03, 0xC0, 0x34, 0x06, 0x80, 0xDC, 0x32, 0x7C, 0xFF,
+ 0xFF, 0x86, 0x0E, 0x0C, 0x1C, 0x18, 0x10, 0x30, 0x00, 0x60, 0x00, 0xC0,
+ 0x01, 0x80, 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00,
+ 0x60, 0x00, 0xC0, 0x07, 0xE0, 0xFC, 0x1F, 0x30, 0x0E, 0x30, 0x04, 0x30,
+ 0x04, 0x30, 0x04, 0x30, 0x04, 0x30, 0x04, 0x30, 0x04, 0x30, 0x04, 0x30,
+ 0x04, 0x30, 0x04, 0x30, 0x04, 0x30, 0x04, 0x18, 0x08, 0x1C, 0x18, 0x07,
+ 0xE0, 0xFE, 0x0F, 0x9C, 0x03, 0x0E, 0x01, 0x83, 0x00, 0x81, 0xC0, 0x40,
+ 0x60, 0x40, 0x38, 0x20, 0x0C, 0x30, 0x07, 0x10, 0x01, 0x98, 0x00, 0xE8,
+ 0x00, 0x34, 0x00, 0x1E, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x00, 0xFC,
+ 0xFC, 0x3D, 0xE1, 0xC0, 0x63, 0x83, 0x01, 0x86, 0x0E, 0x04, 0x1C, 0x18,
+ 0x10, 0x70, 0x70, 0x80, 0xC3, 0xC2, 0x03, 0x8B, 0x08, 0x06, 0x6E, 0x40,
+ 0x1D, 0x19, 0x00, 0x74, 0x78, 0x00, 0xE1, 0xE0, 0x03, 0x83, 0x80, 0x0E,
+ 0x0C, 0x00, 0x10, 0x10, 0x00, 0x40, 0x40, 0x7F, 0x1F, 0x9E, 0x03, 0x07,
+ 0x03, 0x01, 0xC3, 0x00, 0x71, 0x00, 0x19, 0x00, 0x0F, 0x00, 0x03, 0x80,
+ 0x01, 0xE0, 0x01, 0xB0, 0x01, 0x9C, 0x00, 0x87, 0x00, 0x81, 0xC0, 0x80,
+ 0xE0, 0xC0, 0x79, 0xF8, 0x7F, 0xFE, 0x1F, 0x78, 0x0C, 0x38, 0x08, 0x1C,
+ 0x18, 0x0E, 0x10, 0x06, 0x20, 0x07, 0x60, 0x03, 0xC0, 0x01, 0x80, 0x01,
+ 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x07,
+ 0xE0, 0x7F, 0xFB, 0x00, 0xC8, 0x07, 0x20, 0x38, 0x01, 0xC0, 0x07, 0x00,
+ 0x38, 0x01, 0xC0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x38, 0x05,
+ 0xC0, 0x3E, 0x01, 0xBF, 0xFE, 0xFE, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31,
+ 0x8C, 0x63, 0x18, 0xC6, 0x31, 0xF0, 0xC1, 0x81, 0x03, 0x06, 0x04, 0x0C,
+ 0x18, 0x10, 0x30, 0x60, 0x40, 0xC1, 0x81, 0x03, 0x06, 0xF8, 0xC6, 0x31,
+ 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC7, 0xF0, 0x0C, 0x07,
+ 0x01, 0x60, 0xD8, 0x23, 0x18, 0xC4, 0x1B, 0x06, 0x80, 0xC0, 0xFF, 0xF0,
+ 0xC7, 0x0C, 0x30, 0x3E, 0x31, 0x8C, 0x30, 0x0C, 0x03, 0x07, 0xC6, 0x33,
+ 0x0C, 0xC3, 0x31, 0xC7, 0xB8, 0x20, 0x38, 0x06, 0x01, 0x80, 0x60, 0x18,
+ 0x06, 0xF1, 0xC6, 0x61, 0xD8, 0x36, 0x0D, 0x83, 0x60, 0xD8, 0x26, 0x19,
+ 0x84, 0x3E, 0x00, 0x1E, 0x23, 0x63, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE1,
+ 0x72, 0x3C, 0x00, 0x80, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x61, 0xD8, 0x8E,
+ 0x61, 0xB0, 0x6C, 0x1B, 0x06, 0xC1, 0xB0, 0x6E, 0x19, 0xCE, 0x3D, 0xC0,
+ 0x1E, 0x08, 0xE4, 0x1B, 0xFE, 0xC0, 0x30, 0x0C, 0x03, 0x81, 0x60, 0x9C,
+ 0x41, 0xE0, 0x0F, 0x08, 0xC4, 0x06, 0x03, 0x01, 0x81, 0xF0, 0x60, 0x30,
+ 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0xFC, 0x00, 0x1F, 0x03,
+ 0x1F, 0x60, 0xC6, 0x0C, 0x60, 0xC3, 0x18, 0x1F, 0x02, 0x00, 0x40, 0x07,
+ 0xFC, 0x40, 0x24, 0x02, 0xC0, 0x2C, 0x04, 0xE0, 0x83, 0xF0, 0x30, 0x1E,
+ 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0D, 0xE1, 0xCE, 0x30, 0xC6, 0x18,
+ 0xC3, 0x18, 0x63, 0x0C, 0x61, 0x8C, 0x31, 0x86, 0x79, 0xE0, 0x31, 0x80,
+ 0x00, 0x09, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xDF, 0x0C, 0x30, 0x00, 0x00,
+ 0x31, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xF2, 0xF0,
+ 0x20, 0x1C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0xFB, 0x08, 0x62,
+ 0x0C, 0x81, 0xE0, 0x3E, 0x06, 0xE0, 0xCE, 0x18, 0xC3, 0x0E, 0xF3, 0xE0,
+ 0x13, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0xF8, 0xF7,
+ 0x8F, 0x0E, 0x3C, 0xE3, 0x0C, 0x18, 0xC3, 0x06, 0x30, 0xC1, 0x8C, 0x30,
+ 0x63, 0x0C, 0x18, 0xC3, 0x06, 0x30, 0xC1, 0x8C, 0x30, 0x67, 0x9E, 0x3C,
+ 0xF7, 0x87, 0x18, 0xC3, 0x18, 0x63, 0x0C, 0x61, 0x8C, 0x31, 0x86, 0x30,
+ 0xC6, 0x19, 0xE7, 0x80, 0x1E, 0x18, 0xE4, 0x1B, 0x03, 0xC0, 0xF0, 0x3C,
+ 0x0F, 0x03, 0x60, 0x9C, 0x41, 0xE0, 0x77, 0x87, 0x18, 0xC3, 0x98, 0x33,
+ 0x06, 0x60, 0xCC, 0x19, 0x83, 0x30, 0xC7, 0x10, 0xDC, 0x18, 0x03, 0x00,
+ 0x60, 0x0C, 0x07, 0xE0, 0x1E, 0x8C, 0xE6, 0x1B, 0x06, 0xC1, 0xB0, 0x6C,
+ 0x1B, 0x06, 0xE1, 0x98, 0xE3, 0xD8, 0x06, 0x01, 0x80, 0x60, 0x18, 0x1F,
+ 0x37, 0x7B, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x7C, 0x7B,
+ 0x0E, 0x1C, 0x1E, 0x0F, 0x07, 0xC3, 0x87, 0x8A, 0xE0, 0x21, 0x8F, 0x98,
+ 0x61, 0x86, 0x18, 0x61, 0x86, 0x19, 0x38, 0xE3, 0x98, 0x66, 0x19, 0x86,
+ 0x61, 0x98, 0x66, 0x19, 0x86, 0x61, 0x9C, 0xE3, 0xDC, 0xF8, 0xEE, 0x08,
+ 0xC1, 0x18, 0x41, 0x88, 0x32, 0x03, 0x40, 0x68, 0x06, 0x00, 0xC0, 0x10,
+ 0x00, 0xF3, 0xE7, 0x61, 0x83, 0x70, 0xC2, 0x30, 0xC2, 0x30, 0xC4, 0x19,
+ 0x64, 0x19, 0x68, 0x0E, 0x38, 0x0E, 0x38, 0x0C, 0x30, 0x04, 0x10, 0xFB,
+ 0xC6, 0x30, 0x64, 0x0F, 0x00, 0xC0, 0x0C, 0x03, 0xC0, 0x98, 0x21, 0x8C,
+ 0x3B, 0xCF, 0x80, 0xF8, 0xEE, 0x08, 0xC1, 0x18, 0x41, 0x88, 0x31, 0x03,
+ 0x40, 0x68, 0x06, 0x00, 0xC0, 0x08, 0x02, 0x00, 0x40, 0x10, 0x1E, 0x03,
+ 0x80, 0x7F, 0x90, 0xE0, 0x30, 0x18, 0x0E, 0x03, 0x01, 0xC0, 0xE0, 0x30,
+ 0x5C, 0x3F, 0xF8, 0x19, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0xB0, 0x63, 0x18,
+ 0xC6, 0x31, 0x8C, 0x61, 0x80, 0xFF, 0xFF, 0x80, 0xC3, 0x18, 0xC6, 0x31,
+ 0x8C, 0x63, 0x06, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xCC, 0x00, 0x38, 0x06,
+ 0x62, 0x41, 0xC0 };
+
+const GFXglyph FreeSerif12pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 6, 0, 1 }, // 0x20 ' '
+ { 0, 2, 16, 8, 3, -15 }, // 0x21 '!'
+ { 4, 6, 6, 10, 1, -15 }, // 0x22 '"'
+ { 9, 12, 16, 12, 0, -15 }, // 0x23 '#'
+ { 33, 10, 18, 12, 1, -16 }, // 0x24 '$'
+ { 56, 18, 17, 20, 1, -16 }, // 0x25 '%'
+ { 95, 17, 16, 19, 1, -15 }, // 0x26 '&'
+ { 129, 2, 6, 5, 1, -15 }, // 0x27 '''
+ { 131, 6, 20, 8, 1, -15 }, // 0x28 '('
+ { 146, 6, 20, 8, 1, -15 }, // 0x29 ')'
+ { 161, 8, 10, 12, 3, -14 }, // 0x2A '*'
+ { 171, 11, 11, 14, 1, -10 }, // 0x2B '+'
+ { 187, 3, 6, 6, 2, -2 }, // 0x2C ','
+ { 190, 6, 1, 8, 1, -5 }, // 0x2D '-'
+ { 191, 2, 3, 6, 2, -2 }, // 0x2E '.'
+ { 192, 7, 17, 7, 0, -16 }, // 0x2F '/'
+ { 207, 10, 17, 12, 1, -16 }, // 0x30 '0'
+ { 229, 6, 17, 12, 3, -16 }, // 0x31 '1'
+ { 242, 10, 15, 12, 1, -14 }, // 0x32 '2'
+ { 261, 10, 16, 12, 1, -15 }, // 0x33 '3'
+ { 281, 10, 16, 12, 1, -15 }, // 0x34 '4'
+ { 301, 10, 17, 12, 1, -16 }, // 0x35 '5'
+ { 323, 10, 17, 12, 1, -16 }, // 0x36 '6'
+ { 345, 10, 16, 12, 0, -15 }, // 0x37 '7'
+ { 365, 10, 17, 12, 1, -16 }, // 0x38 '8'
+ { 387, 10, 18, 12, 1, -16 }, // 0x39 '9'
+ { 410, 2, 12, 6, 2, -11 }, // 0x3A ':'
+ { 413, 4, 15, 6, 2, -11 }, // 0x3B ';'
+ { 421, 12, 13, 14, 1, -12 }, // 0x3C '<'
+ { 441, 12, 6, 14, 1, -8 }, // 0x3D '='
+ { 450, 12, 13, 14, 1, -11 }, // 0x3E '>'
+ { 470, 8, 17, 11, 2, -16 }, // 0x3F '?'
+ { 487, 17, 16, 21, 2, -15 }, // 0x40 '@'
+ { 521, 17, 16, 17, 0, -15 }, // 0x41 'A'
+ { 555, 12, 16, 15, 1, -15 }, // 0x42 'B'
+ { 579, 15, 16, 16, 1, -15 }, // 0x43 'C'
+ { 609, 16, 16, 17, 0, -15 }, // 0x44 'D'
+ { 641, 14, 16, 15, 0, -15 }, // 0x45 'E'
+ { 669, 14, 16, 14, 0, -15 }, // 0x46 'F'
+ { 697, 16, 16, 17, 1, -15 }, // 0x47 'G'
+ { 729, 16, 16, 17, 0, -15 }, // 0x48 'H'
+ { 761, 6, 16, 8, 1, -15 }, // 0x49 'I'
+ { 773, 8, 16, 9, 0, -15 }, // 0x4A 'J'
+ { 789, 16, 16, 17, 1, -15 }, // 0x4B 'K'
+ { 821, 15, 16, 15, 0, -15 }, // 0x4C 'L'
+ { 851, 19, 16, 21, 1, -15 }, // 0x4D 'M'
+ { 889, 16, 16, 17, 1, -15 }, // 0x4E 'N'
+ { 921, 15, 16, 17, 1, -15 }, // 0x4F 'O'
+ { 951, 12, 16, 14, 0, -15 }, // 0x50 'P'
+ { 975, 16, 20, 17, 1, -15 }, // 0x51 'Q'
+ { 1015, 15, 16, 16, 0, -15 }, // 0x52 'R'
+ { 1045, 11, 16, 13, 0, -15 }, // 0x53 'S'
+ { 1067, 15, 16, 15, 0, -15 }, // 0x54 'T'
+ { 1097, 16, 16, 17, 1, -15 }, // 0x55 'U'
+ { 1129, 17, 16, 17, 0, -15 }, // 0x56 'V'
+ { 1163, 22, 16, 23, 0, -15 }, // 0x57 'W'
+ { 1207, 17, 16, 17, 0, -15 }, // 0x58 'X'
+ { 1241, 16, 16, 17, 0, -15 }, // 0x59 'Y'
+ { 1273, 14, 16, 15, 1, -15 }, // 0x5A 'Z'
+ { 1301, 5, 20, 8, 2, -15 }, // 0x5B '['
+ { 1314, 7, 17, 7, 0, -16 }, // 0x5C '\'
+ { 1329, 5, 20, 8, 1, -15 }, // 0x5D ']'
+ { 1342, 10, 9, 11, 1, -15 }, // 0x5E '^'
+ { 1354, 12, 1, 12, 0, 3 }, // 0x5F '_'
+ { 1356, 5, 4, 6, 0, -15 }, // 0x60 '`'
+ { 1359, 10, 11, 10, 1, -10 }, // 0x61 'a'
+ { 1373, 10, 17, 12, 1, -16 }, // 0x62 'b'
+ { 1395, 8, 11, 11, 1, -10 }, // 0x63 'c'
+ { 1406, 10, 17, 12, 1, -16 }, // 0x64 'd'
+ { 1428, 10, 11, 11, 1, -10 }, // 0x65 'e'
+ { 1442, 9, 17, 9, 0, -16 }, // 0x66 'f'
+ { 1462, 12, 16, 11, 0, -10 }, // 0x67 'g'
+ { 1486, 11, 17, 12, 0, -16 }, // 0x68 'h'
+ { 1510, 5, 16, 7, 0, -15 }, // 0x69 'i'
+ { 1520, 6, 21, 8, 0, -15 }, // 0x6A 'j'
+ { 1536, 11, 17, 12, 1, -16 }, // 0x6B 'k'
+ { 1560, 5, 17, 6, 0, -16 }, // 0x6C 'l'
+ { 1571, 18, 11, 19, 0, -10 }, // 0x6D 'm'
+ { 1596, 11, 11, 12, 0, -10 }, // 0x6E 'n'
+ { 1612, 10, 11, 12, 1, -10 }, // 0x6F 'o'
+ { 1626, 11, 16, 12, 0, -10 }, // 0x70 'p'
+ { 1648, 10, 16, 12, 1, -10 }, // 0x71 'q'
+ { 1668, 8, 11, 8, 0, -10 }, // 0x72 'r'
+ { 1679, 7, 11, 9, 1, -10 }, // 0x73 's'
+ { 1689, 6, 13, 7, 1, -12 }, // 0x74 't'
+ { 1699, 10, 11, 12, 1, -10 }, // 0x75 'u'
+ { 1713, 11, 11, 11, 0, -10 }, // 0x76 'v'
+ { 1729, 16, 11, 16, 0, -10 }, // 0x77 'w'
+ { 1751, 11, 11, 12, 0, -10 }, // 0x78 'x'
+ { 1767, 11, 16, 11, 0, -10 }, // 0x79 'y'
+ { 1789, 10, 11, 10, 0, -10 }, // 0x7A 'z'
+ { 1803, 5, 21, 12, 2, -16 }, // 0x7B '{'
+ { 1817, 1, 17, 5, 2, -16 }, // 0x7C '|'
+ { 1820, 5, 21, 12, 5, -15 }, // 0x7D '}'
+ { 1834, 12, 3, 12, 0, -6 } }; // 0x7E '~'
+
+const GFXfont FreeSerif12pt7b PROGMEM = {
+ (uint8_t *)FreeSerif12pt7bBitmaps,
+ (GFXglyph *)FreeSerif12pt7bGlyphs,
+ 0x20, 0x7E, 29 };
+
+// Approx. 2511 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerif18pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerif18pt7b.h
new file mode 100644
index 000000000000..7d19dd183903
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerif18pt7b.h
@@ -0,0 +1,429 @@
+const uint8_t FreeSerif18pt7bBitmaps[] PROGMEM = {
+ 0x6F, 0xFF, 0xFF, 0xFE, 0x66, 0x66, 0x66, 0x64, 0x40, 0x00, 0x6F, 0xF6,
+ 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0x46, 0x42, 0x42, 0x42, 0x03, 0x06, 0x01,
+ 0x83, 0x00, 0xC1, 0x80, 0x61, 0xC0, 0x30, 0xC0, 0x38, 0x60, 0x18, 0x30,
+ 0xFF, 0xFF, 0x7F, 0xFF, 0x83, 0x06, 0x01, 0x86, 0x00, 0xC3, 0x00, 0xC1,
+ 0x87, 0xFF, 0xFF, 0xFF, 0xFE, 0x18, 0x30, 0x0C, 0x18, 0x06, 0x18, 0x06,
+ 0x0C, 0x03, 0x06, 0x01, 0x83, 0x00, 0xC1, 0x80, 0x60, 0xC0, 0x02, 0x00,
+ 0x10, 0x03, 0xE0, 0x64, 0xE6, 0x23, 0x61, 0x1B, 0x08, 0x58, 0x42, 0xE2,
+ 0x03, 0x90, 0x1F, 0x80, 0x7E, 0x00, 0xFC, 0x01, 0xF0, 0x0F, 0xC0, 0x4E,
+ 0x02, 0x38, 0x10, 0xE0, 0x87, 0x04, 0x3C, 0x21, 0xE1, 0x1B, 0xC9, 0xCF,
+ 0xFC, 0x1F, 0x80, 0x10, 0x00, 0x80, 0x07, 0x80, 0x20, 0x0F, 0xF0, 0x70,
+ 0x0F, 0x07, 0xD0, 0x0F, 0x02, 0x18, 0x07, 0x01, 0x18, 0x07, 0x00, 0x8C,
+ 0x03, 0x80, 0x4C, 0x01, 0x80, 0x44, 0x00, 0xC0, 0x26, 0x00, 0x60, 0x22,
+ 0x0F, 0x30, 0x33, 0x1F, 0xCC, 0x73, 0x1E, 0x37, 0xF1, 0x8E, 0x19, 0xE1,
+ 0x8E, 0x04, 0x00, 0x86, 0x02, 0x00, 0xC7, 0x01, 0x00, 0xC3, 0x80, 0x80,
+ 0x61, 0x80, 0x80, 0x60, 0xC0, 0x40, 0x30, 0x60, 0x40, 0x30, 0x38, 0xE0,
+ 0x30, 0x0F, 0xE0, 0x18, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x00, 0x7E, 0x00,
+ 0x00, 0x61, 0x80, 0x00, 0x60, 0x60, 0x00, 0x30, 0x30, 0x00, 0x18, 0x18,
+ 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x03, 0x8E, 0x00, 0x01, 0xCE,
+ 0x00, 0x00, 0x7C, 0x3F, 0xC0, 0x38, 0x07, 0x80, 0x3E, 0x03, 0x80, 0x77,
+ 0x01, 0x80, 0x73, 0xC0, 0x80, 0xF0, 0xF0, 0xC0, 0x70, 0x7C, 0xC0, 0x78,
+ 0x1E, 0x40, 0x3C, 0x07, 0xC0, 0x1E, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x0F,
+ 0xC0, 0xFF, 0x0D, 0xF0, 0xC7, 0xFC, 0x7F, 0xC1, 0xFC, 0x1F, 0x80, 0x3C,
+ 0x00, 0xFF, 0xFE, 0x92, 0x40, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0,
+ 0xC0, 0x60, 0x70, 0x30, 0x18, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0,
+ 0x70, 0x38, 0x0C, 0x06, 0x03, 0x80, 0xC0, 0x60, 0x18, 0x0C, 0x03, 0x00,
+ 0xC0, 0x30, 0x0C, 0x80, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x60, 0x18, 0x0C,
+ 0x07, 0x01, 0x80, 0xC0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0,
+ 0xE0, 0x60, 0x30, 0x38, 0x18, 0x0C, 0x0C, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x00, 0x0C, 0x00, 0xC0, 0x0C, 0x0C, 0x46, 0xE4, 0xF7, 0x5E, 0x1F, 0x00,
+ 0xC0, 0x17, 0x8E, 0x4E, 0xE4, 0xFC, 0xC6, 0x0C, 0x00, 0xC0, 0x01, 0x80,
+ 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
+ 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
+ 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x6F, 0xFF,
+ 0x11, 0x24, 0x80, 0xFF, 0xFF, 0x6F, 0xF6, 0x00, 0xC0, 0x60, 0x18, 0x06,
+ 0x03, 0x80, 0xC0, 0x30, 0x1C, 0x06, 0x01, 0x80, 0xE0, 0x30, 0x0C, 0x07,
+ 0x01, 0x80, 0x60, 0x38, 0x0C, 0x03, 0x01, 0xC0, 0x60, 0x18, 0x0E, 0x03,
+ 0x00, 0x03, 0xE0, 0x0E, 0x70, 0x1C, 0x38, 0x38, 0x1C, 0x38, 0x1C, 0x78,
+ 0x1E, 0x70, 0x0E, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0,
+ 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0x70, 0x0E, 0x70,
+ 0x0E, 0x78, 0x1E, 0x38, 0x1C, 0x38, 0x1C, 0x1C, 0x38, 0x0C, 0x30, 0x03,
+ 0xC0, 0x06, 0x03, 0x83, 0xE3, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E,
+ 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80,
+ 0xE0, 0x38, 0x0E, 0x03, 0x81, 0xE1, 0xFF, 0x07, 0xC0, 0x1F, 0xF0, 0x3F,
+ 0xF8, 0x70, 0xF8, 0x60, 0x3C, 0xC0, 0x3C, 0x80, 0x1C, 0x00, 0x1C, 0x00,
+ 0x1C, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x30, 0x00, 0x60, 0x00,
+ 0xC0, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x01, 0x10,
+ 0x02, 0x3F, 0xFE, 0x7F, 0xFC, 0xFF, 0xFC, 0x0F, 0xC0, 0xFF, 0x0C, 0x3C,
+ 0x80, 0xE4, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x04, 0x00, 0x40, 0x04, 0x00,
+ 0xF8, 0x1F, 0xE0, 0x0F, 0x00, 0x1C, 0x00, 0xE0, 0x03, 0x00, 0x18, 0x00,
+ 0xC0, 0x06, 0x00, 0x60, 0x03, 0x78, 0x73, 0xFF, 0x0F, 0xC0, 0x00, 0x30,
+ 0x00, 0x30, 0x00, 0x70, 0x00, 0xF0, 0x00, 0xB0, 0x01, 0x30, 0x03, 0x30,
+ 0x06, 0x30, 0x04, 0x30, 0x08, 0x30, 0x18, 0x30, 0x10, 0x30, 0x20, 0x30,
+ 0x60, 0x30, 0xC0, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x30, 0x00, 0x30,
+ 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x7F, 0xC3,
+ 0xFE, 0x1F, 0xE1, 0x80, 0x08, 0x00, 0xC0, 0x07, 0xC0, 0x7F, 0x81, 0xFF,
+ 0x00, 0xFC, 0x01, 0xE0, 0x07, 0x80, 0x1C, 0x00, 0x60, 0x03, 0x00, 0x18,
+ 0x00, 0xC0, 0x06, 0x00, 0x60, 0x07, 0x78, 0x73, 0xFF, 0x0F, 0xC0, 0x00,
+ 0x0E, 0x00, 0xF8, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x3C,
+ 0x00, 0x7C, 0x00, 0x79, 0xF0, 0x7F, 0xFC, 0xF8, 0x3C, 0xF0, 0x1E, 0xF0,
+ 0x1F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0x70, 0x0F, 0x78,
+ 0x0F, 0x78, 0x0E, 0x3C, 0x1E, 0x1E, 0x3C, 0x0F, 0xF8, 0x07, 0xE0, 0x3F,
+ 0xFD, 0xFF, 0xF7, 0xFF, 0xF0, 0x06, 0x80, 0x18, 0x00, 0x60, 0x03, 0x00,
+ 0x0C, 0x00, 0x30, 0x01, 0x80, 0x06, 0x00, 0x18, 0x00, 0xE0, 0x03, 0x00,
+ 0x0C, 0x00, 0x70, 0x01, 0x80, 0x06, 0x00, 0x38, 0x00, 0xC0, 0x03, 0x00,
+ 0x1C, 0x00, 0x60, 0x00, 0x0F, 0x83, 0xFC, 0x70, 0xE6, 0x07, 0xC0, 0x3C,
+ 0x03, 0xC0, 0x3E, 0x03, 0x70, 0x67, 0x8C, 0x3D, 0x81, 0xF0, 0x0F, 0x81,
+ 0x7C, 0x21, 0xE6, 0x0E, 0xC0, 0x7C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x36,
+ 0x06, 0x70, 0xE3, 0xFC, 0x0F, 0x80, 0x07, 0xC0, 0x1F, 0xF0, 0x3C, 0x78,
+ 0x38, 0x3C, 0x78, 0x1E, 0x70, 0x1E, 0xF0, 0x0E, 0xF0, 0x0F, 0xF0, 0x0F,
+ 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF8, 0x0F, 0x78, 0x0F, 0x3C, 0x3F,
+ 0x1F, 0xEE, 0x0F, 0x9E, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x78,
+ 0x00, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x70, 0x00, 0x6F, 0xF6,
+ 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0x60, 0x67, 0xBC, 0xC0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x19, 0xEF, 0x78, 0x42, 0x22, 0x20, 0x00, 0x00, 0xC0,
+ 0x00, 0xF0, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF0, 0x03, 0xF0,
+ 0x03, 0xF0, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00,
+ 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xC0,
+ 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x80,
+ 0x00, 0x3C, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x07, 0xC0, 0x00, 0x7C,
+ 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xC0, 0x00, 0xF0, 0x00, 0xFC,
+ 0x00, 0xFC, 0x00, 0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x00, 0xF0,
+ 0x00, 0x30, 0x00, 0x00, 0x1F, 0x81, 0xFF, 0x18, 0x7D, 0x81, 0xEC, 0x07,
+ 0xF0, 0x3F, 0x81, 0xE0, 0x0F, 0x00, 0x70, 0x03, 0x80, 0x38, 0x01, 0x80,
+ 0x08, 0x00, 0xC0, 0x04, 0x00, 0x20, 0x02, 0x00, 0x10, 0x00, 0x80, 0x00,
+ 0x00, 0x00, 0x03, 0x00, 0x3C, 0x01, 0xE0, 0x07, 0x00, 0x00, 0x7F, 0x00,
+ 0x01, 0xFF, 0xC0, 0x07, 0x80, 0xF0, 0x0F, 0x00, 0x38, 0x1C, 0x00, 0x1C,
+ 0x38, 0x00, 0x0C, 0x38, 0x00, 0x06, 0x70, 0x1E, 0x02, 0x70, 0x3F, 0xE3,
+ 0xF0, 0x71, 0xE1, 0xE0, 0xE0, 0xC1, 0xE0, 0xC0, 0xC1, 0xE0, 0xC1, 0xC1,
+ 0xE1, 0x81, 0xC1, 0xE1, 0x81, 0x83, 0xE1, 0x83, 0x82, 0xE1, 0x83, 0x86,
+ 0x71, 0xC7, 0x8C, 0x70, 0xF9, 0xF8, 0x38, 0xF0, 0xF0, 0x3C, 0x00, 0x00,
+ 0x1E, 0x00, 0x00, 0x07, 0x80, 0x70, 0x03, 0xFF, 0xE0, 0x00, 0x7F, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00,
+ 0x00, 0x7C, 0x00, 0x00, 0x5C, 0x00, 0x00, 0xDE, 0x00, 0x00, 0x8E, 0x00,
+ 0x01, 0x8F, 0x00, 0x01, 0x87, 0x00, 0x03, 0x07, 0x80, 0x03, 0x03, 0x80,
+ 0x02, 0x03, 0xC0, 0x06, 0x03, 0xC0, 0x07, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0,
+ 0x0C, 0x01, 0xE0, 0x18, 0x00, 0xF0, 0x18, 0x00, 0xF0, 0x30, 0x00, 0x78,
+ 0x30, 0x00, 0x78, 0x70, 0x00, 0x7C, 0xFC, 0x01, 0xFF, 0xFF, 0xFC, 0x03,
+ 0xFF, 0xF8, 0x1E, 0x0F, 0xC1, 0xE0, 0x3C, 0x1E, 0x01, 0xE1, 0xE0, 0x1E,
+ 0x1E, 0x01, 0xE1, 0xE0, 0x1E, 0x1E, 0x03, 0xC1, 0xE0, 0x78, 0x1F, 0xFE,
+ 0x01, 0xFF, 0xF0, 0x1E, 0x07, 0xC1, 0xE0, 0x1E, 0x1E, 0x00, 0xF1, 0xE0,
+ 0x0F, 0x1E, 0x00, 0xF1, 0xE0, 0x0F, 0x1E, 0x00, 0xF1, 0xE0, 0x1E, 0x1E,
+ 0x07, 0xE3, 0xFF, 0xF8, 0xFF, 0xFE, 0x00, 0x00, 0xFE, 0x08, 0x0F, 0xFF,
+ 0x60, 0xFC, 0x1F, 0x87, 0xC0, 0x1E, 0x3C, 0x00, 0x38, 0xF0, 0x00, 0x67,
+ 0x80, 0x01, 0x9E, 0x00, 0x02, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00,
+ 0x00, 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00,
+ 0x3C, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x0F,
+ 0x00, 0x02, 0x1F, 0x00, 0x38, 0x3F, 0x03, 0x80, 0x7F, 0xFC, 0x00, 0x3F,
+ 0x80, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x78, 0x3F, 0x80, 0xF0, 0x0F,
+ 0x81, 0xE0, 0x0F, 0x83, 0xC0, 0x0F, 0x07, 0x80, 0x0F, 0x0F, 0x00, 0x1E,
+ 0x1E, 0x00, 0x1E, 0x3C, 0x00, 0x3C, 0x78, 0x00, 0x78, 0xF0, 0x00, 0xF1,
+ 0xE0, 0x01, 0xE3, 0xC0, 0x03, 0xC7, 0x80, 0x07, 0x8F, 0x00, 0x1E, 0x1E,
+ 0x00, 0x3C, 0x3C, 0x00, 0xF0, 0x78, 0x01, 0xE0, 0xF0, 0x0F, 0x81, 0xE0,
+ 0x7E, 0x07, 0xFF, 0xF0, 0x3F, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x87, 0xFF,
+ 0xF8, 0x3C, 0x01, 0x83, 0xC0, 0x08, 0x3C, 0x00, 0x83, 0xC0, 0x00, 0x3C,
+ 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x02, 0x03, 0xC0, 0x60, 0x3F, 0xFE, 0x03,
+ 0xFF, 0xE0, 0x3C, 0x06, 0x03, 0xC0, 0x20, 0x3C, 0x00, 0x03, 0xC0, 0x00,
+ 0x3C, 0x00, 0x03, 0xC0, 0x01, 0x3C, 0x00, 0x23, 0xC0, 0x06, 0x3C, 0x01,
+ 0xE7, 0xFF, 0xFE, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xBF, 0xFF, 0xCF, 0x00,
+ 0x67, 0x80, 0x13, 0xC0, 0x09, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C,
+ 0x02, 0x1E, 0x03, 0x0F, 0xFF, 0x87, 0xFF, 0xC3, 0xC0, 0x61, 0xE0, 0x10,
+ 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80,
+ 0x03, 0xC0, 0x03, 0xF0, 0x03, 0xFC, 0x00, 0x00, 0xFE, 0x04, 0x07, 0xFF,
+ 0xB8, 0x1F, 0x03, 0xF0, 0xF8, 0x01, 0xE3, 0xE0, 0x01, 0xC7, 0x80, 0x01,
+ 0x9E, 0x00, 0x01, 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x03,
+ 0xC0, 0x00, 0x07, 0x80, 0x07, 0xFF, 0x00, 0x07, 0xDE, 0x00, 0x07, 0xBC,
+ 0x00, 0x0F, 0x78, 0x00, 0x1E, 0x78, 0x00, 0x3C, 0xF0, 0x00, 0x78, 0xF0,
+ 0x00, 0xF1, 0xF0, 0x01, 0xE1, 0xF0, 0x03, 0xC1, 0xF8, 0x1F, 0x00, 0xFF,
+ 0xFC, 0x00, 0x3F, 0x80, 0xFF, 0x03, 0xFD, 0xF8, 0x07, 0xE3, 0xC0, 0x0F,
+ 0x0F, 0x00, 0x3C, 0x3C, 0x00, 0xF0, 0xF0, 0x03, 0xC3, 0xC0, 0x0F, 0x0F,
+ 0x00, 0x3C, 0x3C, 0x00, 0xF0, 0xF0, 0x03, 0xC3, 0xFF, 0xFF, 0x0F, 0xFF,
+ 0xFC, 0x3C, 0x00, 0xF0, 0xF0, 0x03, 0xC3, 0xC0, 0x0F, 0x0F, 0x00, 0x3C,
+ 0x3C, 0x00, 0xF0, 0xF0, 0x03, 0xC3, 0xC0, 0x0F, 0x0F, 0x00, 0x3C, 0x3C,
+ 0x00, 0xF1, 0xF8, 0x07, 0xEF, 0xF0, 0x3F, 0xC0, 0xFF, 0xBF, 0x0F, 0x07,
+ 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0,
+ 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC3, 0xF3, 0xFE, 0x0F, 0xF0,
+ 0x7E, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0,
+ 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0,
+ 0x3C, 0x03, 0xC6, 0x38, 0xF3, 0x8F, 0xF0, 0x7C, 0x00, 0xFF, 0x07, 0xFC,
+ 0xFC, 0x03, 0xC0, 0xF0, 0x07, 0x01, 0xE0, 0x1C, 0x03, 0xC0, 0x60, 0x07,
+ 0x81, 0x80, 0x0F, 0x06, 0x00, 0x1E, 0x18, 0x00, 0x3C, 0x60, 0x00, 0x79,
+ 0x80, 0x00, 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x03, 0xDF, 0x00, 0x07, 0x8F,
+ 0x00, 0x0F, 0x0F, 0x00, 0x1E, 0x0F, 0x00, 0x3C, 0x0F, 0x00, 0x78, 0x0F,
+ 0x00, 0xF0, 0x1F, 0x01, 0xE0, 0x1F, 0x03, 0xC0, 0x1F, 0x0F, 0xC0, 0x3F,
+ 0x3F, 0xC1, 0xFF, 0x80, 0xFF, 0x00, 0x0F, 0xC0, 0x00, 0xF0, 0x00, 0x1E,
+ 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C,
+ 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78,
+ 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x04, 0xF0,
+ 0x01, 0x1E, 0x00, 0x63, 0xC0, 0x3C, 0xFF, 0xFF, 0xBF, 0xFF, 0xE0, 0xFC,
+ 0x00, 0x03, 0xF9, 0xF0, 0x00, 0x1F, 0x87, 0x80, 0x01, 0xF8, 0x3E, 0x00,
+ 0x0F, 0xC1, 0xF0, 0x00, 0x5E, 0x0B, 0xC0, 0x06, 0xF0, 0x5E, 0x00, 0x37,
+ 0x82, 0x78, 0x03, 0x3C, 0x13, 0xC0, 0x19, 0xE0, 0x8F, 0x01, 0x8F, 0x04,
+ 0x78, 0x0C, 0x78, 0x21, 0xE0, 0xC3, 0xC1, 0x0F, 0x06, 0x1E, 0x08, 0x3C,
+ 0x60, 0xF0, 0x41, 0xE3, 0x07, 0x82, 0x07, 0xB0, 0x3C, 0x10, 0x3D, 0x81,
+ 0xE0, 0x81, 0xF8, 0x0F, 0x04, 0x07, 0xC0, 0x78, 0x20, 0x3C, 0x03, 0xC1,
+ 0x00, 0xE0, 0x1E, 0x1C, 0x06, 0x01, 0xFB, 0xF8, 0x10, 0x1F, 0xE0, 0xFC,
+ 0x00, 0xFE, 0x78, 0x00, 0x70, 0x78, 0x00, 0x40, 0xF8, 0x00, 0x81, 0xF8,
+ 0x01, 0x02, 0xF8, 0x02, 0x04, 0xF8, 0x04, 0x08, 0xF0, 0x08, 0x11, 0xF0,
+ 0x10, 0x21, 0xF0, 0x20, 0x41, 0xF0, 0x40, 0x81, 0xF0, 0x81, 0x01, 0xF1,
+ 0x02, 0x01, 0xE2, 0x04, 0x03, 0xE4, 0x08, 0x03, 0xE8, 0x10, 0x03, 0xF0,
+ 0x20, 0x03, 0xE0, 0x40, 0x03, 0xC0, 0x80, 0x03, 0x81, 0x00, 0x07, 0x07,
+ 0x00, 0x06, 0x3F, 0x80, 0x04, 0x00, 0x00, 0xFE, 0x00, 0x07, 0xFF, 0x00,
+ 0x3E, 0x0F, 0x80, 0xF0, 0x07, 0x83, 0xC0, 0x07, 0x87, 0x80, 0x07, 0x1E,
+ 0x00, 0x0F, 0x3C, 0x00, 0x1E, 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xC0,
+ 0x00, 0x7F, 0x80, 0x00, 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x03, 0xFC, 0x00,
+ 0x07, 0xF8, 0x00, 0x0F, 0x78, 0x00, 0x3C, 0xF0, 0x00, 0x78, 0xE0, 0x01,
+ 0xE1, 0xE0, 0x03, 0xC1, 0xE0, 0x0F, 0x01, 0xF0, 0x7C, 0x00, 0xFF, 0xE0,
+ 0x00, 0x7F, 0x00, 0xFF, 0xF8, 0x1F, 0xFF, 0x83, 0xC1, 0xF0, 0xF0, 0x1E,
+ 0x3C, 0x07, 0xCF, 0x00, 0xF3, 0xC0, 0x3C, 0xF0, 0x0F, 0x3C, 0x03, 0xCF,
+ 0x01, 0xF3, 0xC0, 0x78, 0xF0, 0x7C, 0x3F, 0xFE, 0x0F, 0xFE, 0x03, 0xC0,
+ 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00,
+ 0x3C, 0x00, 0x1F, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x07, 0xFF,
+ 0x00, 0x3E, 0x0F, 0x80, 0xF0, 0x07, 0x83, 0xC0, 0x07, 0x87, 0x80, 0x0F,
+ 0x1E, 0x00, 0x0F, 0x3C, 0x00, 0x1E, 0xF0, 0x00, 0x1D, 0xE0, 0x00, 0x3F,
+ 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x03, 0xFC,
+ 0x00, 0x07, 0xF8, 0x00, 0x0F, 0x70, 0x00, 0x1C, 0xF0, 0x00, 0x79, 0xE0,
+ 0x00, 0xF1, 0xE0, 0x03, 0xC1, 0xC0, 0x07, 0x01, 0xC0, 0x1C, 0x01, 0xE0,
+ 0xF0, 0x00, 0x7F, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C,
+ 0x00, 0x00, 0x7E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0xC0, 0xFF, 0xF0,
+ 0x03, 0xFF, 0xF0, 0x0F, 0x07, 0xC0, 0x78, 0x1E, 0x03, 0xC0, 0x78, 0x1E,
+ 0x03, 0xC0, 0xF0, 0x1E, 0x07, 0x80, 0xF0, 0x3C, 0x07, 0x81, 0xE0, 0x78,
+ 0x0F, 0x0F, 0x80, 0x7F, 0xF8, 0x03, 0xFE, 0x00, 0x1E, 0x78, 0x00, 0xF1,
+ 0xE0, 0x07, 0x87, 0x80, 0x3C, 0x3C, 0x01, 0xE0, 0xF0, 0x0F, 0x03, 0xC0,
+ 0x78, 0x0F, 0x03, 0xC0, 0x7C, 0x3F, 0x01, 0xF3, 0xFC, 0x07, 0xE0, 0x07,
+ 0x84, 0x1F, 0xFC, 0x3C, 0x3E, 0x30, 0x0E, 0x70, 0x06, 0x70, 0x06, 0x70,
+ 0x02, 0x78, 0x00, 0x7C, 0x00, 0x3F, 0x00, 0x1F, 0xC0, 0x0F, 0xE0, 0x03,
+ 0xF8, 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x80, 0x0F, 0x80, 0x0F, 0xC0,
+ 0x0F, 0xE0, 0x0F, 0x70, 0x1E, 0x78, 0x3C, 0x4F, 0xF8, 0x43, 0xF0, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xF0, 0x7C, 0x0F, 0x03, 0x80, 0xF0, 0x10,
+ 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00,
+ 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0,
+ 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F,
+ 0x00, 0x00, 0xF0, 0x00, 0x1F, 0x80, 0x03, 0xFC, 0x00, 0xFF, 0x01, 0xFD,
+ 0xF8, 0x01, 0xC3, 0xC0, 0x02, 0x0F, 0x00, 0x08, 0x3C, 0x00, 0x20, 0xF0,
+ 0x00, 0x83, 0xC0, 0x02, 0x0F, 0x00, 0x08, 0x3C, 0x00, 0x20, 0xF0, 0x00,
+ 0x83, 0xC0, 0x02, 0x0F, 0x00, 0x08, 0x3C, 0x00, 0x20, 0xF0, 0x00, 0x83,
+ 0xC0, 0x02, 0x0F, 0x00, 0x08, 0x3C, 0x00, 0x20, 0xF0, 0x00, 0x81, 0xE0,
+ 0x04, 0x07, 0x80, 0x30, 0x0F, 0x81, 0x80, 0x1F, 0xFC, 0x00, 0x1F, 0xC0,
+ 0x00, 0xFF, 0xC0, 0x7F, 0x3E, 0x00, 0x1E, 0x1E, 0x00, 0x0C, 0x0E, 0x00,
+ 0x18, 0x0F, 0x00, 0x18, 0x07, 0x00, 0x10, 0x07, 0x80, 0x30, 0x07, 0x80,
+ 0x30, 0x03, 0xC0, 0x60, 0x03, 0xC0, 0x60, 0x01, 0xE0, 0x40, 0x01, 0xE0,
+ 0xC0, 0x00, 0xF0, 0xC0, 0x00, 0xF1, 0x80, 0x00, 0x71, 0x80, 0x00, 0x7B,
+ 0x00, 0x00, 0x3B, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E,
+ 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0xFF, 0x9F,
+ 0xF0, 0x3F, 0x9F, 0x03, 0xE0, 0x07, 0x07, 0x80, 0xF0, 0x03, 0x03, 0xC0,
+ 0x78, 0x01, 0x80, 0xE0, 0x1E, 0x00, 0x80, 0x78, 0x0F, 0x00, 0xC0, 0x1C,
+ 0x03, 0x80, 0x60, 0x0F, 0x01, 0xE0, 0x20, 0x07, 0x81, 0xF0, 0x30, 0x01,
+ 0xC0, 0xBC, 0x18, 0x00, 0xF0, 0xDE, 0x08, 0x00, 0x78, 0x67, 0x0C, 0x00,
+ 0x1E, 0x23, 0xC4, 0x00, 0x0F, 0x31, 0xE6, 0x00, 0x03, 0x90, 0x7B, 0x00,
+ 0x01, 0xF8, 0x3D, 0x00, 0x00, 0xFC, 0x0F, 0x80, 0x00, 0x3C, 0x07, 0xC0,
+ 0x00, 0x1E, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0xE0, 0x00, 0x03, 0x00, 0x70,
+ 0x00, 0x01, 0x80, 0x10, 0x00, 0x00, 0x80, 0x08, 0x00, 0x7F, 0xE0, 0xFF,
+ 0x0F, 0xC0, 0x1E, 0x03, 0xE0, 0x0E, 0x00, 0xF0, 0x06, 0x00, 0x3C, 0x06,
+ 0x00, 0x0F, 0x06, 0x00, 0x07, 0x86, 0x00, 0x01, 0xE6, 0x00, 0x00, 0x7B,
+ 0x00, 0x00, 0x3F, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x03,
+ 0xF0, 0x00, 0x03, 0x78, 0x00, 0x01, 0x9E, 0x00, 0x01, 0x87, 0x80, 0x01,
+ 0x83, 0xE0, 0x01, 0x80, 0xF0, 0x01, 0x80, 0x3C, 0x01, 0x80, 0x1F, 0x01,
+ 0xC0, 0x07, 0xC1, 0xE0, 0x03, 0xF3, 0xFE, 0x0F, 0xFE, 0xFF, 0xC0, 0xFF,
+ 0x7E, 0x00, 0x1C, 0x1E, 0x00, 0x18, 0x1F, 0x00, 0x30, 0x0F, 0x00, 0x60,
+ 0x07, 0x80, 0x60, 0x03, 0xC0, 0xC0, 0x03, 0xE1, 0x80, 0x01, 0xE1, 0x80,
+ 0x00, 0xF3, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3C, 0x00,
+ 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00,
+ 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00,
+ 0x00, 0x7E, 0x00, 0x01, 0xFF, 0x80, 0x3F, 0xFF, 0xF1, 0xFF, 0xFF, 0x9C,
+ 0x00, 0x78, 0xC0, 0x07, 0x84, 0x00, 0x38, 0x00, 0x03, 0xC0, 0x00, 0x3C,
+ 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01,
+ 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00,
+ 0x07, 0x00, 0x00, 0x78, 0x00, 0x47, 0x80, 0x06, 0x78, 0x00, 0x33, 0x80,
+ 0x07, 0x3F, 0xFF, 0xFB, 0xFF, 0xFF, 0xC0, 0xFF, 0x83, 0x06, 0x0C, 0x18,
+ 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06,
+ 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x07, 0xF0, 0xC0, 0x18, 0x06, 0x01,
+ 0x80, 0x70, 0x0C, 0x03, 0x00, 0xE0, 0x18, 0x06, 0x01, 0xC0, 0x30, 0x0C,
+ 0x03, 0x80, 0x60, 0x18, 0x07, 0x00, 0xC0, 0x30, 0x0E, 0x01, 0x80, 0x60,
+ 0x1C, 0x03, 0xFE, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18,
+ 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06,
+ 0x0C, 0x1F, 0xF0, 0x03, 0x80, 0x0F, 0x00, 0x1F, 0x00, 0x76, 0x00, 0xCE,
+ 0x03, 0x8C, 0x06, 0x1C, 0x1C, 0x18, 0x30, 0x30, 0xE0, 0x31, 0x80, 0x67,
+ 0x00, 0x6C, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xC0, 0xE0, 0x70,
+ 0x18, 0x0C, 0x03, 0x1F, 0x03, 0x8C, 0x38, 0x31, 0xC1, 0x8E, 0x0C, 0x00,
+ 0x60, 0x0F, 0x01, 0x98, 0x30, 0xC3, 0x86, 0x38, 0x31, 0xC1, 0x8E, 0x0C,
+ 0x78, 0xE5, 0xFB, 0xCF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0xF8, 0x00, 0x38,
+ 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x39,
+ 0xF0, 0x3B, 0xFC, 0x3C, 0x3E, 0x38, 0x0E, 0x38, 0x0F, 0x38, 0x07, 0x38,
+ 0x07, 0x38, 0x07, 0x38, 0x07, 0x38, 0x07, 0x38, 0x06, 0x38, 0x0E, 0x38,
+ 0x0C, 0x3C, 0x1C, 0x1F, 0xF0, 0x07, 0xE0, 0x07, 0xE0, 0x7F, 0xE3, 0x87,
+ 0xD8, 0x0F, 0x60, 0x1B, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00,
+ 0x0E, 0x00, 0x3C, 0x01, 0x78, 0x19, 0xFF, 0xC3, 0xFE, 0x03, 0xE0, 0x00,
+ 0x00, 0x00, 0x1C, 0x00, 0x7C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00,
+ 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x07, 0x9C, 0x1F, 0xDC, 0x38, 0x7C, 0x70,
+ 0x3C, 0x70, 0x1C, 0x60, 0x1C, 0xE0, 0x1C, 0xE0, 0x1C, 0xE0, 0x1C, 0xE0,
+ 0x1C, 0xE0, 0x1C, 0xF0, 0x1C, 0x70, 0x1C, 0x7C, 0x3E, 0x3F, 0xDF, 0x0F,
+ 0x90, 0x0F, 0x81, 0xFF, 0x08, 0x3C, 0x80, 0xE7, 0xFF, 0x7F, 0xFF, 0x00,
+ 0x18, 0x00, 0xC0, 0x07, 0x00, 0x38, 0x03, 0xE0, 0x37, 0x83, 0x3F, 0xF0,
+ 0xFF, 0x03, 0xF0, 0x01, 0xF0, 0x3F, 0xC3, 0x8E, 0x18, 0x00, 0xC0, 0x0E,
+ 0x00, 0x70, 0x03, 0x80, 0x1C, 0x03, 0xFE, 0x1F, 0xF0, 0x38, 0x01, 0xC0,
+ 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01,
+ 0xC0, 0x0E, 0x00, 0x70, 0x07, 0xC0, 0xFF, 0x80, 0x0F, 0xC0, 0x1F, 0xFF,
+ 0x38, 0xFF, 0x70, 0x70, 0x70, 0x70, 0x70, 0x30, 0x70, 0x30, 0x70, 0x30,
+ 0x38, 0x20, 0x1C, 0x60, 0x0F, 0x80, 0x10, 0x00, 0x20, 0x00, 0x60, 0x00,
+ 0x7F, 0xE0, 0x3F, 0xFC, 0x1F, 0xFE, 0x20, 0x06, 0x40, 0x02, 0xC0, 0x02,
+ 0xC0, 0x04, 0xF0, 0x18, 0x7F, 0xF0, 0x1F, 0x80, 0x00, 0x00, 0x38, 0x00,
+ 0xF8, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00,
+ 0x38, 0x00, 0x38, 0xF0, 0x3B, 0xF8, 0x3E, 0x3C, 0x3C, 0x1C, 0x38, 0x1C,
+ 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C,
+ 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x7C, 0x3E, 0xFE, 0x7F, 0x18, 0x3C,
+ 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3C, 0x7C, 0x1C, 0x1C, 0x1C,
+ 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x3C, 0xFF, 0x03, 0x03,
+ 0xC1, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xC3, 0xE0, 0x70,
+ 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E,
+ 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x37, 0x3B, 0xF8, 0xF8, 0x00, 0x00,
+ 0x1C, 0x00, 0x3E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0,
+ 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x3F, 0x8E, 0x0F, 0x07, 0x06, 0x03,
+ 0x86, 0x01, 0xC4, 0x00, 0xE4, 0x00, 0x7E, 0x00, 0x3F, 0x80, 0x1D, 0xC0,
+ 0x0E, 0x70, 0x07, 0x1C, 0x03, 0x8F, 0x01, 0xC3, 0xC0, 0xE0, 0xF0, 0xF8,
+ 0x3C, 0xFE, 0x7F, 0x80, 0x00, 0x1C, 0x7C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
+ 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
+ 0x1C, 0x1C, 0x1C, 0x3C, 0xFF, 0x38, 0xF0, 0x7C, 0x3E, 0xFE, 0x7F, 0x83,
+ 0xE3, 0xF0, 0xE0, 0xE0, 0x70, 0x1C, 0x38, 0x1C, 0x07, 0x0E, 0x07, 0x01,
+ 0xC3, 0x81, 0xC0, 0x70, 0xE0, 0x70, 0x1C, 0x38, 0x1C, 0x07, 0x0E, 0x07,
+ 0x01, 0xC3, 0x81, 0xC0, 0x70, 0xE0, 0x70, 0x1C, 0x38, 0x1C, 0x07, 0x0E,
+ 0x07, 0x01, 0xC3, 0x81, 0xE0, 0x73, 0xF9, 0xFC, 0x7F, 0x38, 0xF0, 0xFB,
+ 0xF8, 0x3E, 0x3C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38,
+ 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38,
+ 0x1C, 0x78, 0x3C, 0xFE, 0x7F, 0x07, 0xE0, 0x1F, 0xF8, 0x3C, 0x7C, 0x78,
+ 0x3E, 0x70, 0x1E, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0,
+ 0x0F, 0xF8, 0x0F, 0x78, 0x0E, 0x7C, 0x1C, 0x3E, 0x3C, 0x0F, 0xF0, 0x07,
+ 0xC0, 0x18, 0xF0, 0xFB, 0xFC, 0x3E, 0x1E, 0x38, 0x0E, 0x38, 0x0F, 0x38,
+ 0x07, 0x38, 0x07, 0x38, 0x07, 0x38, 0x07, 0x38, 0x07, 0x38, 0x06, 0x38,
+ 0x0E, 0x38, 0x0C, 0x3E, 0x1C, 0x3B, 0xF8, 0x39, 0xE0, 0x38, 0x00, 0x38,
+ 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x7C, 0x00, 0xFF,
+ 0x00, 0x07, 0xC4, 0x1F, 0xEC, 0x3C, 0x3C, 0x70, 0x1C, 0x70, 0x1C, 0x60,
+ 0x1C, 0xE0, 0x1C, 0xE0, 0x1C, 0xE0, 0x1C, 0xE0, 0x1C, 0xE0, 0x1C, 0xF0,
+ 0x1C, 0x70, 0x1C, 0x78, 0x3C, 0x3F, 0xDC, 0x1F, 0x1C, 0x00, 0x1C, 0x00,
+ 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x3E, 0x00,
+ 0xFF, 0x19, 0xFF, 0x7C, 0xF3, 0x9C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0,
+ 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x1F, 0x07, 0xF0, 0x3E,
+ 0x58, 0x7C, 0x0F, 0x03, 0xC0, 0x7C, 0x07, 0x80, 0xF8, 0x1F, 0x81, 0xF8,
+ 0x1E, 0x03, 0xC0, 0xF0, 0x3E, 0x1A, 0x7C, 0x10, 0x30, 0x70, 0xFE, 0xFE,
+ 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x79,
+ 0x7E, 0x3C, 0xF8, 0x7C, 0x38, 0x3C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C,
+ 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C,
+ 0x38, 0x1C, 0x38, 0x1C, 0x3C, 0x7C, 0x1F, 0xDF, 0x0F, 0x18, 0xFE, 0x1F,
+ 0x7C, 0x06, 0x38, 0x04, 0x1C, 0x04, 0x1C, 0x0C, 0x0E, 0x08, 0x0E, 0x18,
+ 0x07, 0x10, 0x07, 0x10, 0x07, 0x20, 0x03, 0xA0, 0x03, 0xE0, 0x01, 0xC0,
+ 0x01, 0xC0, 0x00, 0x80, 0x00, 0x80, 0xFC, 0x7F, 0x1F, 0x78, 0x3C, 0x06,
+ 0x38, 0x1C, 0x04, 0x38, 0x1C, 0x04, 0x1C, 0x1C, 0x0C, 0x1C, 0x0E, 0x08,
+ 0x1C, 0x1E, 0x18, 0x0E, 0x17, 0x10, 0x0E, 0x37, 0x10, 0x07, 0x23, 0x30,
+ 0x07, 0x63, 0xA0, 0x07, 0x43, 0xE0, 0x03, 0xC1, 0xC0, 0x03, 0x81, 0xC0,
+ 0x01, 0x80, 0x80, 0x01, 0x00, 0x80, 0x7F, 0x7E, 0x1E, 0x0C, 0x07, 0x8C,
+ 0x01, 0xC4, 0x00, 0x76, 0x00, 0x3E, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x03,
+ 0xE0, 0x01, 0x70, 0x01, 0x1C, 0x01, 0x8F, 0x01, 0x83, 0x80, 0x80, 0xE0,
+ 0xC0, 0x79, 0xF0, 0xFF, 0xFE, 0x0F, 0x7C, 0x06, 0x38, 0x06, 0x1C, 0x04,
+ 0x1C, 0x0C, 0x0E, 0x0C, 0x0E, 0x08, 0x0F, 0x18, 0x07, 0x10, 0x07, 0x90,
+ 0x03, 0xB0, 0x03, 0xA0, 0x01, 0xE0, 0x01, 0xE0, 0x00, 0xC0, 0x00, 0xC0,
+ 0x00, 0x80, 0x00, 0x80, 0x01, 0x80, 0x01, 0x00, 0x03, 0x00, 0x7E, 0x00,
+ 0x7C, 0x00, 0x78, 0x00, 0x7F, 0xF9, 0xFF, 0xE6, 0x07, 0x10, 0x38, 0x00,
+ 0xE0, 0x07, 0x00, 0x38, 0x01, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xE0, 0x07,
+ 0x01, 0x38, 0x0D, 0xC0, 0x3F, 0xFF, 0xBF, 0xFE, 0x07, 0x0E, 0x1C, 0x18,
+ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0x60, 0x60,
+ 0x10, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C,
+ 0x0E, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x70, 0x38, 0x18,
+ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x08, 0x06, 0x06,
+ 0x08, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x38,
+ 0x70, 0xE0, 0x3E, 0x00, 0x7F, 0x87, 0xE3, 0xFE, 0x00, 0x7C };
+
+const GFXglyph FreeSerif18pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 9, 0, 1 }, // 0x20 ' '
+ { 0, 4, 24, 12, 5, -23 }, // 0x21 '!'
+ { 12, 8, 9, 14, 3, -23 }, // 0x22 '"'
+ { 21, 17, 23, 17, 0, -22 }, // 0x23 '#'
+ { 70, 13, 27, 17, 2, -24 }, // 0x24 '$'
+ { 114, 25, 23, 29, 2, -22 }, // 0x25 '%'
+ { 186, 25, 25, 27, 1, -24 }, // 0x26 '&'
+ { 265, 3, 9, 7, 2, -23 }, // 0x27 '''
+ { 269, 9, 30, 12, 2, -23 }, // 0x28 '('
+ { 303, 9, 30, 12, 1, -22 }, // 0x29 ')'
+ { 337, 12, 14, 18, 3, -23 }, // 0x2A '*'
+ { 358, 16, 18, 20, 2, -17 }, // 0x2B '+'
+ { 394, 4, 9, 9, 2, -3 }, // 0x2C ','
+ { 399, 8, 2, 12, 1, -8 }, // 0x2D '-'
+ { 401, 4, 4, 9, 2, -3 }, // 0x2E '.'
+ { 403, 10, 24, 10, 0, -23 }, // 0x2F '/'
+ { 433, 16, 24, 18, 1, -23 }, // 0x30 '0'
+ { 481, 10, 24, 18, 3, -23 }, // 0x31 '1'
+ { 511, 16, 24, 17, 1, -23 }, // 0x32 '2'
+ { 559, 13, 24, 17, 2, -23 }, // 0x33 '3'
+ { 598, 16, 23, 18, 0, -22 }, // 0x34 '4'
+ { 644, 13, 24, 17, 2, -23 }, // 0x35 '5'
+ { 683, 16, 24, 18, 1, -23 }, // 0x36 '6'
+ { 731, 14, 23, 18, 1, -22 }, // 0x37 '7'
+ { 772, 12, 25, 18, 2, -24 }, // 0x38 '8'
+ { 810, 16, 26, 17, 1, -24 }, // 0x39 '9'
+ { 862, 4, 17, 9, 2, -16 }, // 0x3A ':'
+ { 871, 5, 22, 9, 2, -16 }, // 0x3B ';'
+ { 885, 18, 18, 20, 1, -17 }, // 0x3C '<'
+ { 926, 18, 9, 20, 1, -12 }, // 0x3D '='
+ { 947, 18, 18, 20, 1, -17 }, // 0x3E '>'
+ { 988, 13, 25, 16, 2, -24 }, // 0x3F '?'
+ { 1029, 24, 25, 30, 3, -24 }, // 0x40 '@'
+ { 1104, 24, 23, 25, 1, -22 }, // 0x41 'A'
+ { 1173, 20, 23, 22, 1, -22 }, // 0x42 'B'
+ { 1231, 22, 24, 23, 1, -23 }, // 0x43 'C'
+ { 1297, 23, 23, 25, 1, -22 }, // 0x44 'D'
+ { 1364, 20, 23, 21, 2, -22 }, // 0x45 'E'
+ { 1422, 17, 23, 20, 2, -22 }, // 0x46 'F'
+ { 1471, 23, 24, 25, 1, -23 }, // 0x47 'G'
+ { 1540, 22, 23, 25, 2, -22 }, // 0x48 'H'
+ { 1604, 9, 23, 11, 2, -22 }, // 0x49 'I'
+ { 1630, 12, 23, 13, 0, -22 }, // 0x4A 'J'
+ { 1665, 23, 23, 25, 2, -22 }, // 0x4B 'K'
+ { 1732, 19, 23, 21, 2, -22 }, // 0x4C 'L'
+ { 1787, 29, 23, 31, 1, -22 }, // 0x4D 'M'
+ { 1871, 23, 23, 25, 1, -22 }, // 0x4E 'N'
+ { 1938, 23, 24, 25, 1, -23 }, // 0x4F 'O'
+ { 2007, 18, 23, 20, 1, -22 }, // 0x50 'P'
+ { 2059, 23, 30, 25, 1, -23 }, // 0x51 'Q'
+ { 2146, 21, 23, 23, 2, -22 }, // 0x52 'R'
+ { 2207, 16, 24, 19, 1, -23 }, // 0x53 'S'
+ { 2255, 20, 23, 21, 1, -22 }, // 0x54 'T'
+ { 2313, 22, 23, 25, 2, -22 }, // 0x55 'U'
+ { 2377, 24, 23, 25, 0, -22 }, // 0x56 'V'
+ { 2446, 33, 23, 33, 0, -22 }, // 0x57 'W'
+ { 2541, 25, 23, 25, 0, -22 }, // 0x58 'X'
+ { 2613, 24, 23, 25, 1, -22 }, // 0x59 'Y'
+ { 2682, 21, 23, 21, 0, -22 }, // 0x5A 'Z'
+ { 2743, 7, 28, 12, 3, -22 }, // 0x5B '['
+ { 2768, 10, 24, 10, 0, -23 }, // 0x5C '\'
+ { 2798, 7, 28, 12, 2, -22 }, // 0x5D ']'
+ { 2823, 15, 13, 16, 1, -22 }, // 0x5E '^'
+ { 2848, 18, 2, 17, 0, 3 }, // 0x5F '_'
+ { 2853, 8, 6, 9, 1, -23 }, // 0x60 '`'
+ { 2859, 13, 16, 15, 2, -15 }, // 0x61 'a'
+ { 2885, 16, 25, 17, 1, -24 }, // 0x62 'b'
+ { 2935, 14, 16, 16, 1, -15 }, // 0x63 'c'
+ { 2963, 16, 25, 17, 1, -24 }, // 0x64 'd'
+ { 3013, 13, 16, 16, 1, -15 }, // 0x65 'e'
+ { 3039, 13, 25, 13, 0, -24 }, // 0x66 'f'
+ { 3080, 16, 24, 16, 1, -15 }, // 0x67 'g'
+ { 3128, 16, 25, 17, 1, -24 }, // 0x68 'h'
+ { 3178, 8, 24, 10, 0, -23 }, // 0x69 'i'
+ { 3202, 9, 32, 12, 0, -23 }, // 0x6A 'j'
+ { 3238, 17, 25, 18, 1, -24 }, // 0x6B 'k'
+ { 3292, 8, 25, 9, 0, -24 }, // 0x6C 'l'
+ { 3317, 26, 16, 27, 1, -15 }, // 0x6D 'm'
+ { 3369, 16, 16, 17, 1, -15 }, // 0x6E 'n'
+ { 3401, 16, 16, 17, 1, -15 }, // 0x6F 'o'
+ { 3433, 16, 24, 17, 1, -15 }, // 0x70 'p'
+ { 3481, 16, 24, 17, 1, -15 }, // 0x71 'q'
+ { 3529, 11, 16, 12, 1, -15 }, // 0x72 'r'
+ { 3551, 10, 16, 13, 1, -15 }, // 0x73 's'
+ { 3571, 8, 19, 10, 2, -18 }, // 0x74 't'
+ { 3590, 16, 16, 17, 1, -15 }, // 0x75 'u'
+ { 3622, 16, 16, 16, 0, -15 }, // 0x76 'v'
+ { 3654, 24, 16, 24, 0, -15 }, // 0x77 'w'
+ { 3702, 17, 16, 17, 0, -15 }, // 0x78 'x'
+ { 3736, 16, 24, 16, 0, -15 }, // 0x79 'y'
+ { 3784, 14, 16, 15, 0, -15 }, // 0x7A 'z'
+ { 3812, 8, 30, 17, 3, -23 }, // 0x7B '{'
+ { 3842, 2, 24, 7, 2, -23 }, // 0x7C '|'
+ { 3848, 8, 30, 17, 6, -22 }, // 0x7D '}'
+ { 3878, 16, 4, 17, 1, -10 } }; // 0x7E '~'
+
+const GFXfont FreeSerif18pt7b PROGMEM = {
+ (uint8_t *)FreeSerif18pt7bBitmaps,
+ (GFXglyph *)FreeSerif18pt7bGlyphs,
+ 0x20, 0x7E, 42 };
+
+// Approx. 4558 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerif24pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerif24pt7b.h
new file mode 100644
index 000000000000..99ff3f4971f9
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerif24pt7b.h
@@ -0,0 +1,690 @@
+const uint8_t FreeSerif24pt7bBitmaps[] PROGMEM = {
+ 0x77, 0xBF, 0xFF, 0xFF, 0xFF, 0xFB, 0x9C, 0xE7, 0x39, 0xCE, 0x61, 0x08,
+ 0x42, 0x10, 0x84, 0x00, 0x00, 0xEF, 0xFF, 0xEE, 0x60, 0x6F, 0x0F, 0xF0,
+ 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0x60, 0x66, 0x06, 0x60, 0x66, 0x06, 0x60,
+ 0x66, 0x06, 0x00, 0xE0, 0x70, 0x01, 0xC0, 0xE0, 0x03, 0x81, 0xC0, 0x07,
+ 0x03, 0x80, 0x0E, 0x06, 0x00, 0x18, 0x0C, 0x00, 0x30, 0x38, 0x00, 0xE0,
+ 0x70, 0x01, 0xC0, 0xE0, 0x03, 0x81, 0xC1, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF,
+ 0xF0, 0x18, 0x0C, 0x00, 0x70, 0x38, 0x00, 0xE0, 0x70, 0x01, 0xC0, 0xE0,
+ 0x03, 0x81, 0xC0, 0x07, 0x03, 0x80, 0x0C, 0x06, 0x07, 0xFF, 0xFF, 0xEF,
+ 0xFF, 0xFF, 0xC0, 0xE0, 0x70, 0x01, 0xC0, 0xE0, 0x03, 0x81, 0xC0, 0x06,
+ 0x03, 0x80, 0x0C, 0x06, 0x00, 0x38, 0x1C, 0x00, 0x70, 0x38, 0x00, 0xE0,
+ 0x70, 0x01, 0xC0, 0xE0, 0x03, 0x81, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x08,
+ 0x00, 0x01, 0x00, 0x01, 0xFC, 0x01, 0xE4, 0xF8, 0x70, 0x87, 0x9C, 0x10,
+ 0x77, 0x02, 0x06, 0xE0, 0x40, 0xDC, 0x08, 0x0B, 0x81, 0x00, 0x78, 0x20,
+ 0x07, 0x84, 0x00, 0xFC, 0x80, 0x0F, 0xF0, 0x00, 0xFE, 0x00, 0x07, 0xF0,
+ 0x00, 0x7F, 0x80, 0x03, 0xFC, 0x00, 0x3F, 0xC0, 0x05, 0xFC, 0x00, 0x8F,
+ 0x80, 0x10, 0xF8, 0x02, 0x0F, 0x00, 0x40, 0xF0, 0x08, 0x1E, 0x01, 0x03,
+ 0xE0, 0x20, 0x7C, 0x04, 0x0F, 0xC0, 0x83, 0xBC, 0x10, 0xE3, 0xE2, 0x78,
+ 0x3F, 0xFE, 0x00, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
+ 0x01, 0xF0, 0x00, 0xC0, 0x03, 0xFC, 0x01, 0xE0, 0x03, 0xC7, 0x81, 0xE0,
+ 0x03, 0xC0, 0x7F, 0x60, 0x03, 0xC0, 0x20, 0x70, 0x01, 0xE0, 0x10, 0x30,
+ 0x01, 0xE0, 0x08, 0x38, 0x00, 0xE0, 0x04, 0x18, 0x00, 0xF0, 0x02, 0x1C,
+ 0x00, 0x78, 0x02, 0x0C, 0x00, 0x38, 0x01, 0x0E, 0x00, 0x1C, 0x01, 0x86,
+ 0x00, 0x0E, 0x00, 0x86, 0x00, 0x07, 0x00, 0x87, 0x03, 0xE1, 0x80, 0xC3,
+ 0x07, 0xFC, 0xE1, 0xC3, 0x87, 0xC6, 0x3F, 0xC1, 0x87, 0x81, 0x8F, 0x81,
+ 0xC7, 0x80, 0x40, 0x00, 0xC3, 0xC0, 0x20, 0x00, 0xE3, 0xC0, 0x10, 0x00,
+ 0x61, 0xC0, 0x08, 0x00, 0x61, 0xE0, 0x04, 0x00, 0x70, 0xF0, 0x06, 0x00,
+ 0x30, 0x70, 0x02, 0x00, 0x38, 0x38, 0x03, 0x00, 0x18, 0x1C, 0x01, 0x00,
+ 0x1C, 0x0E, 0x01, 0x80, 0x0C, 0x07, 0x01, 0x80, 0x0E, 0x01, 0xC3, 0x80,
+ 0x06, 0x00, 0x7F, 0x80, 0x06, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x70, 0xE0, 0x00,
+ 0x00, 0xE0, 0x60, 0x00, 0x00, 0xC0, 0x30, 0x00, 0x01, 0xC0, 0x30, 0x00,
+ 0x01, 0xC0, 0x30, 0x00, 0x01, 0xC0, 0x30, 0x00, 0x01, 0xC0, 0x70, 0x00,
+ 0x01, 0xE0, 0xE0, 0x00, 0x01, 0xE1, 0xC0, 0x00, 0x00, 0xF3, 0x80, 0x00,
+ 0x00, 0xFF, 0x0F, 0xFC, 0x00, 0xFC, 0x03, 0xF0, 0x00, 0xF8, 0x01, 0xE0,
+ 0x01, 0xFC, 0x01, 0xC0, 0x07, 0x7C, 0x01, 0xC0, 0x0F, 0x3E, 0x01, 0x80,
+ 0x1E, 0x3E, 0x03, 0x00, 0x3C, 0x1F, 0x03, 0x00, 0x7C, 0x1F, 0x06, 0x00,
+ 0x78, 0x0F, 0x86, 0x00, 0x78, 0x07, 0xCC, 0x00, 0xF8, 0x07, 0xE8, 0x00,
+ 0xF8, 0x03, 0xF8, 0x00, 0xF8, 0x01, 0xF0, 0x00, 0xF8, 0x01, 0xF8, 0x00,
+ 0xFC, 0x00, 0xFC, 0x01, 0xFC, 0x01, 0xFE, 0x01, 0x7E, 0x03, 0xBF, 0x86,
+ 0x7F, 0x0F, 0x1F, 0xFE, 0x3F, 0xFC, 0x0F, 0xF8, 0x0F, 0xE0, 0x03, 0xF0,
+ 0x6F, 0xFF, 0xFF, 0x66, 0x66, 0x66, 0x00, 0x10, 0x02, 0x00, 0xC0, 0x18,
+ 0x03, 0x00, 0x60, 0x0E, 0x00, 0xC0, 0x1C, 0x03, 0x80, 0x38, 0x03, 0x80,
+ 0x78, 0x07, 0x00, 0x70, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00,
+ 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x07, 0x00, 0x70, 0x07, 0x80,
+ 0x38, 0x03, 0x80, 0x38, 0x01, 0xC0, 0x0C, 0x00, 0xC0, 0x06, 0x00, 0x30,
+ 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80,
+ 0x0C, 0x00, 0x60, 0x07, 0x00, 0x30, 0x03, 0x80, 0x1C, 0x01, 0xC0, 0x1C,
+ 0x01, 0xE0, 0x0E, 0x00, 0xE0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F,
+ 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0E, 0x00, 0xE0, 0x1E,
+ 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x38, 0x03, 0x00, 0x70, 0x0E, 0x00, 0xC0,
+ 0x18, 0x03, 0x00, 0x40, 0x08, 0x00, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80,
+ 0x43, 0x86, 0xE1, 0x0F, 0xF1, 0x1F, 0xF9, 0x3E, 0x3D, 0x78, 0x07, 0xC0,
+ 0x01, 0x00, 0x07, 0xC0, 0x19, 0x30, 0xF9, 0x1E, 0xF1, 0x0F, 0xE1, 0x07,
+ 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x00, 0x38, 0x00, 0x00,
+ 0x70, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07,
+ 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70,
+ 0x00, 0x00, 0xE0, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x07, 0x00,
+ 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00,
+ 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00,
+ 0x0E, 0x00, 0x00, 0x73, 0xEF, 0xFF, 0x7C, 0x10, 0x42, 0x08, 0xC6, 0x00,
+ 0xFF, 0xFF, 0xFC, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x1C, 0x00, 0xE0, 0x03,
+ 0x80, 0x0E, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x38, 0x00, 0xE0, 0x03,
+ 0x80, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x0E, 0x00, 0x38, 0x01, 0xE0, 0x07,
+ 0x00, 0x1C, 0x00, 0xF0, 0x03, 0x80, 0x0E, 0x00, 0x78, 0x01, 0xC0, 0x07,
+ 0x00, 0x3C, 0x00, 0xE0, 0x03, 0x80, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x0F,
+ 0x00, 0x38, 0x00, 0x00, 0xFC, 0x00, 0x0E, 0x1C, 0x00, 0x70, 0x38, 0x03,
+ 0x80, 0x70, 0x1E, 0x01, 0xE0, 0xF0, 0x03, 0x83, 0xC0, 0x0F, 0x0F, 0x00,
+ 0x3C, 0x7C, 0x00, 0xF9, 0xE0, 0x01, 0xE7, 0x80, 0x07, 0xBE, 0x00, 0x1F,
+ 0xF8, 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0x80, 0x07, 0xFE, 0x00, 0x1F, 0xF8,
+ 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0x80, 0x07, 0xFE, 0x00, 0x1F, 0xF8, 0x00,
+ 0x7F, 0xE0, 0x01, 0xF7, 0x80, 0x07, 0x9E, 0x00, 0x1E, 0x7C, 0x00, 0xF8,
+ 0xF0, 0x03, 0xC3, 0xC0, 0x0F, 0x07, 0x00, 0x38, 0x1E, 0x01, 0xE0, 0x38,
+ 0x07, 0x00, 0x70, 0x38, 0x00, 0xE1, 0xC0, 0x00, 0xFC, 0x00, 0x00, 0x80,
+ 0x1C, 0x03, 0xE0, 0x7F, 0x0C, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07,
+ 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0,
+ 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00,
+ 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x3F,
+ 0x0F, 0xFF, 0x01, 0xF8, 0x00, 0x3F, 0xF0, 0x07, 0xFF, 0xE0, 0x70, 0x3F,
+ 0x83, 0x00, 0x7C, 0x30, 0x01, 0xF1, 0x00, 0x0F, 0x98, 0x00, 0x3C, 0x80,
+ 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0x80, 0x00, 0x1C,
+ 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00,
+ 0x70, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00,
+ 0x03, 0x00, 0x00, 0x30, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x43, 0x00,
+ 0x02, 0x30, 0x00, 0x23, 0xFF, 0xFF, 0x3F, 0xFF, 0xF3, 0xFF, 0xFF, 0x80,
+ 0x03, 0xF8, 0x03, 0xFF, 0x01, 0x83, 0xE0, 0x80, 0x3C, 0x40, 0x0F, 0x10,
+ 0x01, 0xC8, 0x00, 0x70, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x00,
+ 0x80, 0x00, 0xC0, 0x00, 0x78, 0x00, 0x7F, 0x80, 0x7F, 0xF0, 0x01, 0xFE,
+ 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x01, 0xC0,
+ 0x00, 0x70, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00,
+ 0x30, 0x00, 0x0C, 0x70, 0x06, 0x3F, 0x07, 0x0F, 0xFF, 0x00, 0xFF, 0x00,
+ 0x00, 0x03, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, 0x1E, 0x00, 0x01,
+ 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xDC, 0x00, 0x0C, 0xE0, 0x00, 0x47, 0x00,
+ 0x06, 0x38, 0x00, 0x61, 0xC0, 0x06, 0x0E, 0x00, 0x30, 0x70, 0x03, 0x03,
+ 0x80, 0x30, 0x1C, 0x01, 0x80, 0xE0, 0x18, 0x07, 0x01, 0x80, 0x38, 0x08,
+ 0x01, 0xC0, 0xC0, 0x0E, 0x0C, 0x00, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xE0, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00,
+ 0x0E, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x00,
+ 0x40, 0x7F, 0xF8, 0x1F, 0xFE, 0x03, 0xFF, 0xC0, 0xC0, 0x00, 0x18, 0x00,
+ 0x06, 0x00, 0x00, 0xC0, 0x00, 0x1C, 0x00, 0x07, 0xF8, 0x00, 0xFF, 0xC0,
+ 0x3F, 0xFE, 0x00, 0xFF, 0xE0, 0x01, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0x7C,
+ 0x00, 0x07, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x1C,
+ 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x30,
+ 0x00, 0x0E, 0x00, 0x01, 0x80, 0x00, 0x71, 0xE0, 0x1C, 0x3F, 0x07, 0x07,
+ 0xFF, 0x80, 0x3F, 0x80, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x0F,
+ 0x80, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01,
+ 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00,
+ 0x07, 0xC7, 0xE0, 0x3E, 0xFF, 0xC3, 0xF8, 0x3F, 0x1F, 0x80, 0x7C, 0xF8,
+ 0x03, 0xF7, 0xC0, 0x0F, 0xBE, 0x00, 0x7F, 0xF0, 0x01, 0xFF, 0x80, 0x0F,
+ 0xFC, 0x00, 0x7F, 0xE0, 0x03, 0xFF, 0x00, 0x1F, 0x78, 0x00, 0xFB, 0xE0,
+ 0x07, 0x9F, 0x00, 0x3C, 0x78, 0x03, 0xE3, 0xE0, 0x1E, 0x0F, 0x81, 0xE0,
+ 0x3E, 0x1E, 0x00, 0xFF, 0xE0, 0x00, 0xFC, 0x00, 0x3F, 0xFF, 0xF3, 0xFF,
+ 0xFF, 0x3F, 0xFF, 0xE7, 0x00, 0x0E, 0x40, 0x00, 0xEC, 0x00, 0x1C, 0x80,
+ 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x03, 0x80,
+ 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x00, 0xE0,
+ 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x38,
+ 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07,
+ 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x1E, 0x00, 0x01,
+ 0xC0, 0x00, 0x03, 0xF0, 0x03, 0xFF, 0x03, 0xC1, 0xE0, 0xC0, 0x1C, 0x70,
+ 0x07, 0x18, 0x00, 0xEE, 0x00, 0x3B, 0x80, 0x0E, 0xF0, 0x03, 0xBC, 0x00,
+ 0xE7, 0x80, 0x71, 0xF0, 0x38, 0x3E, 0x1C, 0x07, 0xEE, 0x00, 0xFE, 0x00,
+ 0x1F, 0xC0, 0x03, 0xF8, 0x03, 0xFF, 0x01, 0xC7, 0xE0, 0xE0, 0xFC, 0x70,
+ 0x0F, 0x98, 0x01, 0xEE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x01, 0xF8, 0x00,
+ 0x7E, 0x00, 0x1F, 0xC0, 0x07, 0x70, 0x03, 0x9E, 0x00, 0xE3, 0xE0, 0xF0,
+ 0x7F, 0xF0, 0x07, 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x3F, 0xF0, 0x03, 0xC3,
+ 0xE0, 0x3C, 0x0F, 0x83, 0xC0, 0x3C, 0x3E, 0x00, 0xF1, 0xE0, 0x07, 0xCF,
+ 0x00, 0x3E, 0xF8, 0x00, 0xF7, 0xC0, 0x07, 0xFE, 0x00, 0x3F, 0xF0, 0x01,
+ 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0xF0, 0x03, 0xEF, 0x80, 0x1F, 0x7C,
+ 0x00, 0xF9, 0xF0, 0x0F, 0xC7, 0xE1, 0xFC, 0x1F, 0xF9, 0xE0, 0x3F, 0x1F,
+ 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x78, 0x00, 0x07, 0xC0, 0x00,
+ 0x7C, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00,
+ 0x0F, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x00, 0x77, 0xFF, 0xF7, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xBF, 0xFF, 0xB8, 0x39, 0xF7,
+ 0xDF, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0xEF,
+ 0xFF, 0x7C, 0x10, 0x42, 0x08, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07,
+ 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xE0,
+ 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFC, 0x00,
+ 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xFE,
+ 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00,
+ 0xFF, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0xE0, 0x00,
+ 0x00, 0xF8, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0,
+ 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x07,
+ 0xF8, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x00, 0x00,
+ 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF,
+ 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00,
+ 0x00, 0xF8, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0,
+ 0x0F, 0xFE, 0x0C, 0x1F, 0x88, 0x03, 0xEC, 0x01, 0xF7, 0x00, 0x7F, 0xC0,
+ 0x3F, 0xE0, 0x1F, 0x70, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xC0, 0x01, 0xE0,
+ 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x70, 0x00, 0x70, 0x00, 0x30, 0x00, 0x10,
+ 0x00, 0x18, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x02, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x3E, 0x00,
+ 0x1F, 0x00, 0x0F, 0x80, 0x03, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x3F,
+ 0xFF, 0x00, 0x00, 0xFC, 0x07, 0xC0, 0x01, 0xE0, 0x00, 0xE0, 0x07, 0xC0,
+ 0x00, 0x30, 0x0F, 0x00, 0x00, 0x18, 0x1E, 0x00, 0x00, 0x0C, 0x1E, 0x00,
+ 0x00, 0x04, 0x3C, 0x00, 0xF8, 0x06, 0x3C, 0x01, 0xFD, 0xC2, 0x78, 0x03,
+ 0xC7, 0xC3, 0x78, 0x07, 0x07, 0x81, 0xF0, 0x0E, 0x03, 0x81, 0xF0, 0x0E,
+ 0x03, 0x81, 0xF0, 0x1C, 0x07, 0x81, 0xF0, 0x1C, 0x07, 0x01, 0xF0, 0x38,
+ 0x07, 0x01, 0xF0, 0x38, 0x07, 0x03, 0xF0, 0x38, 0x0F, 0x02, 0xF0, 0x38,
+ 0x0E, 0x02, 0xF0, 0x38, 0x1E, 0x04, 0x78, 0x38, 0x1E, 0x0C, 0x78, 0x1C,
+ 0x6E, 0x18, 0x38, 0x1F, 0xC7, 0xF0, 0x3C, 0x0F, 0x03, 0xE0, 0x1E, 0x00,
+ 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x07, 0xC0,
+ 0x00, 0x00, 0x03, 0xE0, 0x00, 0x60, 0x00, 0xFC, 0x03, 0xE0, 0x00, 0x3F,
+ 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
+ 0x80, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x07,
+ 0xC0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x0D,
+ 0xF0, 0x00, 0x00, 0x0D, 0xF0, 0x00, 0x00, 0x18, 0xF0, 0x00, 0x00, 0x18,
+ 0xF8, 0x00, 0x00, 0x38, 0x78, 0x00, 0x00, 0x30, 0x7C, 0x00, 0x00, 0x30,
+ 0x7C, 0x00, 0x00, 0x60, 0x3E, 0x00, 0x00, 0x60, 0x3E, 0x00, 0x00, 0xE0,
+ 0x1E, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x01, 0x80,
+ 0x0F, 0x80, 0x01, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFF, 0xC0, 0x03, 0x00,
+ 0x07, 0xC0, 0x07, 0x00, 0x07, 0xC0, 0x06, 0x00, 0x03, 0xE0, 0x06, 0x00,
+ 0x03, 0xE0, 0x0E, 0x00, 0x01, 0xF0, 0x0C, 0x00, 0x01, 0xF0, 0x1C, 0x00,
+ 0x01, 0xF8, 0x3C, 0x00, 0x01, 0xF8, 0x7E, 0x00, 0x01, 0xFC, 0xFF, 0x80,
+ 0x0F, 0xFF, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0x80, 0x1F, 0x01, 0xF8,
+ 0x03, 0xE0, 0x0F, 0x80, 0x7C, 0x00, 0xF8, 0x0F, 0x80, 0x1F, 0x81, 0xF0,
+ 0x01, 0xF0, 0x3E, 0x00, 0x3E, 0x07, 0xC0, 0x07, 0xC0, 0xF8, 0x00, 0xF8,
+ 0x1F, 0x00, 0x1F, 0x03, 0xE0, 0x07, 0xC0, 0x7C, 0x01, 0xF0, 0x0F, 0x80,
+ 0xFC, 0x01, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xC0, 0x07, 0xC0, 0x7F, 0x00,
+ 0xF8, 0x01, 0xF0, 0x1F, 0x00, 0x1F, 0x03, 0xE0, 0x03, 0xE0, 0x7C, 0x00,
+ 0x3E, 0x0F, 0x80, 0x07, 0xC1, 0xF0, 0x00, 0xF8, 0x3E, 0x00, 0x1F, 0x07,
+ 0xC0, 0x03, 0xE0, 0xF8, 0x00, 0xF8, 0x1F, 0x00, 0x1F, 0x03, 0xE0, 0x07,
+ 0xC0, 0x7C, 0x07, 0xF0, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x00, 0x00,
+ 0x1F, 0xF0, 0x20, 0x07, 0xFF, 0xEE, 0x01, 0xF8, 0x1F, 0xE0, 0x3E, 0x00,
+ 0x7E, 0x07, 0x80, 0x01, 0xE0, 0xF0, 0x00, 0x1E, 0x1F, 0x00, 0x00, 0xE3,
+ 0xE0, 0x00, 0x06, 0x3C, 0x00, 0x00, 0x67, 0xC0, 0x00, 0x02, 0x7C, 0x00,
+ 0x00, 0x27, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00,
+ 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80,
+ 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00,
+ 0x0F, 0x80, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x7C,
+ 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x01, 0xF0, 0x00,
+ 0x02, 0x0F, 0x80, 0x00, 0xE0, 0x7E, 0x00, 0x1C, 0x03, 0xF8, 0x0F, 0x00,
+ 0x0F, 0xFF, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x7F,
+ 0xFF, 0xF8, 0x00, 0x3E, 0x03, 0xFC, 0x00, 0x7C, 0x00, 0xFC, 0x00, 0xF8,
+ 0x00, 0x7E, 0x01, 0xF0, 0x00, 0x7E, 0x03, 0xE0, 0x00, 0x7C, 0x07, 0xC0,
+ 0x00, 0x7C, 0x0F, 0x80, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0xF8, 0x3E, 0x00,
+ 0x01, 0xF0, 0x7C, 0x00, 0x03, 0xF0, 0xF8, 0x00, 0x03, 0xE1, 0xF0, 0x00,
+ 0x07, 0xC3, 0xE0, 0x00, 0x0F, 0x87, 0xC0, 0x00, 0x1F, 0x0F, 0x80, 0x00,
+ 0x3E, 0x1F, 0x00, 0x00, 0x7C, 0x3E, 0x00, 0x00, 0xF8, 0x7C, 0x00, 0x01,
+ 0xF0, 0xF8, 0x00, 0x07, 0xC1, 0xF0, 0x00, 0x0F, 0x83, 0xE0, 0x00, 0x1E,
+ 0x07, 0xC0, 0x00, 0x7C, 0x0F, 0x80, 0x01, 0xF0, 0x1F, 0x00, 0x03, 0xE0,
+ 0x3E, 0x00, 0x1F, 0x80, 0x7C, 0x00, 0x7C, 0x00, 0xF8, 0x0F, 0xF0, 0x07,
+ 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x07,
+ 0xFF, 0xFF, 0xE0, 0x7C, 0x00, 0x1C, 0x0F, 0x80, 0x01, 0x81, 0xF0, 0x00,
+ 0x30, 0x3E, 0x00, 0x02, 0x07, 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1F,
+ 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x20, 0x0F, 0x80, 0x04,
+ 0x01, 0xF0, 0x01, 0x80, 0x3E, 0x00, 0x70, 0x07, 0xFF, 0xFE, 0x00, 0xFF,
+ 0xFF, 0xC0, 0x1F, 0x00, 0x38, 0x03, 0xE0, 0x03, 0x00, 0x7C, 0x00, 0x20,
+ 0x0F, 0x80, 0x04, 0x01, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x07, 0xC0,
+ 0x00, 0x00, 0xF8, 0x00, 0x03, 0x1F, 0x00, 0x00, 0x43, 0xE0, 0x00, 0x18,
+ 0x7C, 0x00, 0x07, 0x0F, 0x80, 0x01, 0xC1, 0xF0, 0x00, 0xF8, 0x7F, 0xFF,
+ 0xFF, 0x3F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x1F,
+ 0x00, 0x07, 0x1F, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x1F, 0x00, 0x01, 0x1F,
+ 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F,
+ 0x00, 0x08, 0x1F, 0x00, 0x08, 0x1F, 0x00, 0x18, 0x1F, 0x00, 0x38, 0x1F,
+ 0xFF, 0xF8, 0x1F, 0xFF, 0xF8, 0x1F, 0x00, 0x38, 0x1F, 0x00, 0x18, 0x1F,
+ 0x00, 0x08, 0x1F, 0x00, 0x08, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F,
+ 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F,
+ 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0xFF,
+ 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x08, 0x00, 0xFF, 0xFE, 0x70, 0x07, 0xE0,
+ 0x1F, 0xE0, 0x1F, 0x00, 0x0F, 0xC0, 0x78, 0x00, 0x07, 0x81, 0xE0, 0x00,
+ 0x07, 0x07, 0xC0, 0x00, 0x0E, 0x1F, 0x00, 0x00, 0x0C, 0x3E, 0x00, 0x00,
+ 0x08, 0xF8, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00,
+ 0x0F, 0x80, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00,
+ 0x7C, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x01, 0xFD, 0xF0, 0x00, 0x01, 0xF3,
+ 0xE0, 0x00, 0x03, 0xE7, 0xC0, 0x00, 0x07, 0xCF, 0x80, 0x00, 0x0F, 0x8F,
+ 0x80, 0x00, 0x1F, 0x1F, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x7C, 0x3E,
+ 0x00, 0x00, 0xF8, 0x7C, 0x00, 0x01, 0xF0, 0x7C, 0x00, 0x03, 0xE0, 0xFC,
+ 0x00, 0x07, 0xC0, 0xFC, 0x00, 0x0F, 0x80, 0x7C, 0x00, 0x3F, 0x00, 0x7F,
+ 0x01, 0xFC, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x0F, 0xF8, 0x00, 0xFF, 0xE0,
+ 0x1F, 0xFC, 0xFE, 0x00, 0x1F, 0xC1, 0xF0, 0x00, 0x3E, 0x07, 0xC0, 0x00,
+ 0xF8, 0x1F, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0x3E,
+ 0x07, 0xC0, 0x00, 0xF8, 0x1F, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x0F, 0x81,
+ 0xF0, 0x00, 0x3E, 0x07, 0xC0, 0x00, 0xF8, 0x1F, 0x00, 0x03, 0xE0, 0x7C,
+ 0x00, 0x0F, 0x81, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xF8, 0x1F, 0x00,
+ 0x03, 0xE0, 0x7C, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0x3E, 0x07, 0xC0, 0x00,
+ 0xF8, 0x1F, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0x3E,
+ 0x07, 0xC0, 0x00, 0xF8, 0x1F, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x0F, 0x81,
+ 0xF0, 0x00, 0x3E, 0x07, 0xC0, 0x00, 0xF8, 0x1F, 0x00, 0x03, 0xE0, 0xFE,
+ 0x00, 0x1F, 0xCF, 0xFE, 0x01, 0xFF, 0xC0, 0xFF, 0xF8, 0xFE, 0x03, 0xE0,
+ 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03,
+ 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C,
+ 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80,
+ 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x0F, 0xE3, 0xFF, 0xE0, 0x0F, 0xFF,
+ 0x80, 0xFE, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03,
+ 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00,
+ 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C,
+ 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01,
+ 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3C, 0x0E, 0x1E, 0x0F, 0x8F, 0x07,
+ 0xCF, 0x01, 0xFF, 0x00, 0x7E, 0x00, 0xFF, 0xF8, 0x3F, 0xFC, 0x3F, 0xC0,
+ 0x07, 0xE0, 0x0F, 0x80, 0x07, 0x80, 0x0F, 0x80, 0x07, 0x00, 0x0F, 0x80,
+ 0x0E, 0x00, 0x0F, 0x80, 0x1C, 0x00, 0x0F, 0x80, 0x38, 0x00, 0x0F, 0x80,
+ 0x70, 0x00, 0x0F, 0x80, 0xE0, 0x00, 0x0F, 0x81, 0xC0, 0x00, 0x0F, 0x83,
+ 0x80, 0x00, 0x0F, 0x87, 0x00, 0x00, 0x0F, 0x9E, 0x00, 0x00, 0x0F, 0xBC,
+ 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x0F, 0xDF,
+ 0x80, 0x00, 0x0F, 0x8F, 0xC0, 0x00, 0x0F, 0x87, 0xE0, 0x00, 0x0F, 0x83,
+ 0xF0, 0x00, 0x0F, 0x81, 0xF8, 0x00, 0x0F, 0x80, 0xFC, 0x00, 0x0F, 0x80,
+ 0x7E, 0x00, 0x0F, 0x80, 0x3F, 0x00, 0x0F, 0x80, 0x3F, 0x80, 0x0F, 0x80,
+ 0x1F, 0x80, 0x0F, 0x80, 0x0F, 0xC0, 0x0F, 0x80, 0x07, 0xE0, 0x0F, 0x80,
+ 0x07, 0xF0, 0x1F, 0xC0, 0x07, 0xFC, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0xF0,
+ 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F,
+ 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7C, 0x00, 0x00,
+ 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7C, 0x00,
+ 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7C,
+ 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00,
+ 0x7C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00,
+ 0x00, 0x7C, 0x00, 0x01, 0x1F, 0x00, 0x00, 0xC7, 0xC0, 0x00, 0x21, 0xF0,
+ 0x00, 0x18, 0x7C, 0x00, 0x0E, 0x1F, 0x00, 0x1F, 0x8F, 0xFF, 0xFF, 0xCF,
+ 0xFF, 0xFF, 0xF0, 0xFF, 0x80, 0x00, 0x03, 0xFE, 0x7F, 0x80, 0x00, 0x07,
+ 0xF0, 0x3F, 0x00, 0x00, 0x1F, 0xC0, 0x7E, 0x00, 0x00, 0x3F, 0x80, 0xFE,
+ 0x00, 0x00, 0xFF, 0x01, 0xFC, 0x00, 0x01, 0xBE, 0x03, 0x7C, 0x00, 0x03,
+ 0x7C, 0x06, 0xF8, 0x00, 0x0E, 0xF8, 0x0D, 0xF8, 0x00, 0x19, 0xF0, 0x19,
+ 0xF0, 0x00, 0x73, 0xE0, 0x33, 0xF0, 0x00, 0xC7, 0xC0, 0x63, 0xE0, 0x03,
+ 0x8F, 0x80, 0xC7, 0xE0, 0x06, 0x1F, 0x01, 0x87, 0xC0, 0x1C, 0x3E, 0x03,
+ 0x0F, 0xC0, 0x30, 0x7C, 0x06, 0x0F, 0x80, 0x60, 0xF8, 0x0C, 0x1F, 0x81,
+ 0x81, 0xF0, 0x18, 0x1F, 0x03, 0x03, 0xE0, 0x30, 0x3F, 0x0C, 0x07, 0xC0,
+ 0x60, 0x3E, 0x18, 0x0F, 0x80, 0xC0, 0x7C, 0x70, 0x1F, 0x01, 0x80, 0x7C,
+ 0xC0, 0x3E, 0x03, 0x00, 0xFB, 0x80, 0x7C, 0x06, 0x00, 0xFE, 0x00, 0xF8,
+ 0x0C, 0x01, 0xFC, 0x01, 0xF0, 0x18, 0x03, 0xF0, 0x03, 0xE0, 0x30, 0x03,
+ 0xE0, 0x07, 0xC0, 0x60, 0x07, 0x80, 0x0F, 0x81, 0xE0, 0x07, 0x00, 0x1F,
+ 0x07, 0xE0, 0x0C, 0x00, 0xFF, 0x3F, 0xF0, 0x08, 0x07, 0xFF, 0x80, 0xFF,
+ 0x00, 0x03, 0xFF, 0x3F, 0x80, 0x00, 0xFC, 0x1F, 0xC0, 0x00, 0x78, 0x0F,
+ 0xC0, 0x00, 0x30, 0x0F, 0xE0, 0x00, 0x30, 0x0F, 0xF0, 0x00, 0x30, 0x0D,
+ 0xF8, 0x00, 0x30, 0x0D, 0xFC, 0x00, 0x30, 0x0C, 0xFC, 0x00, 0x30, 0x0C,
+ 0x7E, 0x00, 0x30, 0x0C, 0x3F, 0x00, 0x30, 0x0C, 0x1F, 0x80, 0x30, 0x0C,
+ 0x1F, 0xC0, 0x30, 0x0C, 0x0F, 0xE0, 0x30, 0x0C, 0x07, 0xE0, 0x30, 0x0C,
+ 0x03, 0xF0, 0x30, 0x0C, 0x01, 0xF8, 0x30, 0x0C, 0x01, 0xFC, 0x30, 0x0C,
+ 0x00, 0xFE, 0x30, 0x0C, 0x00, 0x7E, 0x30, 0x0C, 0x00, 0x3F, 0x30, 0x0C,
+ 0x00, 0x1F, 0xB0, 0x0C, 0x00, 0x0F, 0xF0, 0x0C, 0x00, 0x0F, 0xF0, 0x0C,
+ 0x00, 0x07, 0xF0, 0x0C, 0x00, 0x03, 0xF0, 0x0C, 0x00, 0x01, 0xF0, 0x0C,
+ 0x00, 0x00, 0xF0, 0x1E, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x70, 0xFF,
+ 0xC0, 0x00, 0x30, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1F, 0xE0, 0x00, 0x03,
+ 0xFF, 0xF0, 0x00, 0x1F, 0x03, 0xE0, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0x80,
+ 0x07, 0xC0, 0x7C, 0x00, 0x0F, 0x01, 0xE0, 0x00, 0x1E, 0x0F, 0x80, 0x00,
+ 0x7C, 0x3C, 0x00, 0x00, 0xF1, 0xF0, 0x00, 0x03, 0xE7, 0xC0, 0x00, 0x0F,
+ 0x9E, 0x00, 0x00, 0x1E, 0xF8, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x01, 0xFF,
+ 0x80, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x7F, 0xE0,
+ 0x00, 0x01, 0xFF, 0x80, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x1F, 0xF8, 0x00,
+ 0x00, 0x7D, 0xF0, 0x00, 0x03, 0xE7, 0xC0, 0x00, 0x0F, 0x9F, 0x00, 0x00,
+ 0x3E, 0x3C, 0x00, 0x00, 0xF0, 0xF8, 0x00, 0x07, 0xC1, 0xE0, 0x00, 0x1E,
+ 0x07, 0xC0, 0x00, 0xF8, 0x0F, 0x80, 0x07, 0xC0, 0x1F, 0x00, 0x3E, 0x00,
+ 0x1F, 0x03, 0xE0, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0xFF,
+ 0xFF, 0x00, 0x7F, 0xFF, 0x80, 0x7C, 0x1F, 0xC0, 0xF8, 0x07, 0xC1, 0xF0,
+ 0x07, 0xC3, 0xE0, 0x0F, 0x87, 0xC0, 0x0F, 0x8F, 0x80, 0x1F, 0x1F, 0x00,
+ 0x3E, 0x3E, 0x00, 0x7C, 0x7C, 0x00, 0xF8, 0xF8, 0x01, 0xF1, 0xF0, 0x07,
+ 0xC3, 0xE0, 0x0F, 0x87, 0xC0, 0x3E, 0x0F, 0x81, 0xF8, 0x1F, 0xFF, 0xC0,
+ 0x3F, 0xFE, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03,
+ 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E,
+ 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xF0,
+ 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFF, 0xF8,
+ 0x00, 0x07, 0xC0, 0xF8, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x00, 0x7C,
+ 0x03, 0xE0, 0x00, 0x7C, 0x07, 0x80, 0x00, 0x78, 0x1F, 0x00, 0x00, 0xF8,
+ 0x3C, 0x00, 0x00, 0xF0, 0xF8, 0x00, 0x01, 0xF1, 0xF0, 0x00, 0x03, 0xE3,
+ 0xC0, 0x00, 0x03, 0xCF, 0x80, 0x00, 0x07, 0xDF, 0x00, 0x00, 0x0F, 0xBE,
+ 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x3E, 0xF8, 0x00, 0x00, 0x7D, 0xF0,
+ 0x00, 0x00, 0xFB, 0xE0, 0x00, 0x01, 0xF7, 0xC0, 0x00, 0x03, 0xEF, 0x80,
+ 0x00, 0x07, 0xCF, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x00, 0x3E, 0x3E, 0x00,
+ 0x00, 0x7C, 0x3C, 0x00, 0x01, 0xF0, 0x7C, 0x00, 0x03, 0xE0, 0x78, 0x00,
+ 0x0F, 0x80, 0x78, 0x00, 0x1E, 0x00, 0x78, 0x00, 0x78, 0x00, 0x7C, 0x03,
+ 0xE0, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x1F, 0xC0,
+ 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x1F, 0xC0,
+ 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x03, 0xF8,
+ 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x1F,
+ 0x03, 0xF8, 0x01, 0xF0, 0x0F, 0x80, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x03,
+ 0xE0, 0x1F, 0x00, 0x3E, 0x01, 0xF0, 0x03, 0xE0, 0x1F, 0x00, 0x3E, 0x01,
+ 0xF0, 0x03, 0xE0, 0x1F, 0x00, 0x3E, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00,
+ 0x7C, 0x01, 0xF0, 0x0F, 0x80, 0x1F, 0x07, 0xF0, 0x01, 0xFF, 0xFC, 0x00,
+ 0x1F, 0xFE, 0x00, 0x01, 0xF1, 0xF0, 0x00, 0x1F, 0x1F, 0x80, 0x01, 0xF0,
+ 0xF8, 0x00, 0x1F, 0x07, 0xC0, 0x01, 0xF0, 0x3E, 0x00, 0x1F, 0x03, 0xF0,
+ 0x01, 0xF0, 0x1F, 0x80, 0x1F, 0x00, 0xFC, 0x01, 0xF0, 0x07, 0xC0, 0x1F,
+ 0x00, 0x7E, 0x01, 0xF0, 0x03, 0xF0, 0x1F, 0x00, 0x1F, 0x83, 0xF8, 0x00,
+ 0xFC, 0xFF, 0xF0, 0x0F, 0xF0, 0x03, 0xF0, 0x20, 0x7F, 0xF3, 0x07, 0xC1,
+ 0xF8, 0x78, 0x03, 0xC3, 0x80, 0x0E, 0x3C, 0x00, 0x31, 0xE0, 0x01, 0xCF,
+ 0x00, 0x06, 0x7C, 0x00, 0x33, 0xE0, 0x01, 0x9F, 0x80, 0x00, 0x7E, 0x00,
+ 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0xC0, 0x01,
+ 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0x7F,
+ 0x00, 0x01, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00,
+ 0x07, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xEF, 0x00, 0x1F, 0x3C, 0x01, 0xF1,
+ 0xF8, 0x1F, 0x0C, 0xFF, 0xF0, 0x40, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xC0, 0x7C, 0x07, 0xF0, 0x0F, 0x80, 0x3C, 0x01, 0xF0,
+ 0x07, 0x00, 0x3E, 0x00, 0x60, 0x07, 0xC0, 0x08, 0x00, 0xF8, 0x00, 0x00,
+ 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80,
+ 0x00, 0x01, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00,
+ 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00,
+ 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x07,
+ 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00,
+ 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7F,
+ 0x00, 0x00, 0x7F, 0xFC, 0x00, 0xFF, 0xF8, 0x03, 0xFF, 0x3F, 0xE0, 0x00,
+ 0xFC, 0x0F, 0x80, 0x00, 0x78, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00,
+ 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00,
+ 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00,
+ 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00,
+ 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00,
+ 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00,
+ 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00,
+ 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x20, 0x07, 0xC0, 0x00,
+ 0x60, 0x07, 0xC0, 0x00, 0x60, 0x03, 0xE0, 0x00, 0xC0, 0x03, 0xF0, 0x01,
+ 0xC0, 0x01, 0xFC, 0x07, 0x80, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x0F, 0xF8,
+ 0x00, 0xFF, 0xF8, 0x01, 0xFF, 0x3F, 0xC0, 0x00, 0x7E, 0x0F, 0x80, 0x00,
+ 0x3C, 0x0F, 0xC0, 0x00, 0x38, 0x07, 0xC0, 0x00, 0x38, 0x07, 0xC0, 0x00,
+ 0x30, 0x03, 0xE0, 0x00, 0x70, 0x03, 0xE0, 0x00, 0x60, 0x01, 0xF0, 0x00,
+ 0x60, 0x01, 0xF0, 0x00, 0xE0, 0x01, 0xF8, 0x00, 0xC0, 0x00, 0xF8, 0x01,
+ 0xC0, 0x00, 0xF8, 0x01, 0x80, 0x00, 0x7C, 0x01, 0x80, 0x00, 0x7C, 0x03,
+ 0x80, 0x00, 0x3E, 0x03, 0x00, 0x00, 0x3E, 0x07, 0x00, 0x00, 0x1F, 0x06,
+ 0x00, 0x00, 0x1F, 0x06, 0x00, 0x00, 0x1F, 0x8E, 0x00, 0x00, 0x0F, 0x8C,
+ 0x00, 0x00, 0x0F, 0x9C, 0x00, 0x00, 0x07, 0xD8, 0x00, 0x00, 0x07, 0xD8,
+ 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x01, 0xF0,
+ 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0xE0,
+ 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xF1, 0xFF,
+ 0xF0, 0x1F, 0xF3, 0xF8, 0x07, 0xF8, 0x00, 0x7C, 0x1F, 0x80, 0x3F, 0x00,
+ 0x03, 0x80, 0xF8, 0x01, 0xF0, 0x00, 0x30, 0x0F, 0x80, 0x1F, 0x00, 0x03,
+ 0x00, 0x7C, 0x00, 0xF8, 0x00, 0x30, 0x07, 0xC0, 0x0F, 0x80, 0x06, 0x00,
+ 0x3E, 0x00, 0x7C, 0x00, 0x60, 0x03, 0xE0, 0x07, 0xC0, 0x06, 0x00, 0x3E,
+ 0x00, 0x7C, 0x00, 0xC0, 0x01, 0xF0, 0x07, 0xE0, 0x0C, 0x00, 0x1F, 0x00,
+ 0xFE, 0x01, 0xC0, 0x01, 0xF0, 0x0D, 0xE0, 0x18, 0x00, 0x0F, 0x80, 0xDF,
+ 0x01, 0x80, 0x00, 0xF8, 0x19, 0xF0, 0x30, 0x00, 0x07, 0xC1, 0x8F, 0x83,
+ 0x00, 0x00, 0x7C, 0x38, 0xF8, 0x30, 0x00, 0x07, 0xC3, 0x0F, 0x86, 0x00,
+ 0x00, 0x3E, 0x30, 0x7C, 0x60, 0x00, 0x03, 0xE7, 0x07, 0xCE, 0x00, 0x00,
+ 0x3E, 0x60, 0x3E, 0xC0, 0x00, 0x01, 0xF6, 0x03, 0xEC, 0x00, 0x00, 0x1F,
+ 0xE0, 0x3F, 0xC0, 0x00, 0x01, 0xFC, 0x01, 0xF8, 0x00, 0x00, 0x0F, 0xC0,
+ 0x1F, 0x80, 0x00, 0x00, 0xF8, 0x01, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x0F,
+ 0x00, 0x00, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00,
+ 0x00, 0x00, 0x70, 0x00, 0x60, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00,
+ 0x00, 0x20, 0x00, 0x20, 0x00, 0x7F, 0xFE, 0x03, 0xFF, 0x8F, 0xF8, 0x00,
+ 0x7E, 0x01, 0xFC, 0x00, 0x1C, 0x00, 0x7E, 0x00, 0x1C, 0x00, 0x1F, 0x00,
+ 0x0C, 0x00, 0x07, 0xC0, 0x0E, 0x00, 0x03, 0xF0, 0x0E, 0x00, 0x00, 0xF8,
+ 0x0E, 0x00, 0x00, 0x3E, 0x06, 0x00, 0x00, 0x1F, 0x86, 0x00, 0x00, 0x07,
+ 0xC7, 0x00, 0x00, 0x01, 0xF7, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
+ 0x3F, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00,
+ 0x03, 0xF8, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x03, 0x9F, 0x00, 0x00,
+ 0x01, 0x8F, 0xC0, 0x00, 0x01, 0x83, 0xF0, 0x00, 0x01, 0xC0, 0xF8, 0x00,
+ 0x01, 0xC0, 0x7E, 0x00, 0x01, 0xC0, 0x1F, 0x80, 0x01, 0xC0, 0x07, 0xC0,
+ 0x00, 0xC0, 0x03, 0xF0, 0x00, 0xE0, 0x00, 0xFC, 0x00, 0xE0, 0x00, 0x7F,
+ 0x00, 0xF0, 0x00, 0x1F, 0x80, 0xFC, 0x00, 0x1F, 0xF3, 0xFF, 0x80, 0x7F,
+ 0xFE, 0xFF, 0xF8, 0x03, 0xFF, 0x3F, 0xE0, 0x00, 0x7C, 0x1F, 0xC0, 0x00,
+ 0x78, 0x0F, 0xC0, 0x00, 0x70, 0x07, 0xE0, 0x00, 0x60, 0x03, 0xF0, 0x00,
+ 0xE0, 0x01, 0xF0, 0x01, 0xC0, 0x01, 0xF8, 0x01, 0x80, 0x00, 0xFC, 0x03,
+ 0x80, 0x00, 0x7C, 0x07, 0x00, 0x00, 0x7E, 0x06, 0x00, 0x00, 0x3F, 0x0E,
+ 0x00, 0x00, 0x1F, 0x1C, 0x00, 0x00, 0x1F, 0x98, 0x00, 0x00, 0x0F, 0xF8,
+ 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x03, 0xE0,
+ 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0,
+ 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0,
+ 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0,
+ 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xF0,
+ 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xF8,
+ 0xF0, 0x00, 0x3E, 0x38, 0x00, 0x0F, 0x86, 0x00, 0x03, 0xF0, 0xC0, 0x00,
+ 0x7C, 0x10, 0x00, 0x1F, 0x02, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF8, 0x00,
+ 0x00, 0x3E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xFC,
+ 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00,
+ 0x7E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xFC, 0x00,
+ 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x7E,
+ 0x00, 0x01, 0x0F, 0x80, 0x00, 0x63, 0xF0, 0x00, 0x0C, 0xFC, 0x00, 0x03,
+ 0xBF, 0x00, 0x00, 0xE7, 0xC0, 0x00, 0x7D, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF,
+ 0xFF, 0xF0, 0xFF, 0xF0, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0,
+ 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C,
+ 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03,
+ 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0F, 0x07, 0xFC, 0xE0, 0x01, 0xC0,
+ 0x07, 0x00, 0x1C, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x07, 0x00, 0x1C,
+ 0x00, 0x70, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x1C, 0x00, 0x70, 0x01,
+ 0xC0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00,
+ 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x01, 0xC0, 0x07, 0x00, 0x1E, 0x00, 0x38,
+ 0x00, 0xE0, 0x03, 0xC0, 0x07, 0xFF, 0x83, 0xC0, 0xE0, 0x70, 0x38, 0x1C,
+ 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03,
+ 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0,
+ 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x3F, 0xFC,
+ 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x03, 0xDC,
+ 0x00, 0x39, 0xC0, 0x07, 0x9E, 0x00, 0x70, 0xE0, 0x0F, 0x0F, 0x00, 0xE0,
+ 0x70, 0x1E, 0x07, 0x81, 0xC0, 0x38, 0x3C, 0x03, 0xC3, 0x80, 0x1C, 0x78,
+ 0x01, 0xE7, 0x00, 0x0E, 0xF0, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xE0, 0x3C, 0x0F, 0x81, 0xF0, 0x1E, 0x03, 0xC0, 0x38, 0x07, 0x03,
+ 0xF0, 0x07, 0x0E, 0x03, 0x81, 0xC1, 0xE0, 0x30, 0x78, 0x0E, 0x1E, 0x03,
+ 0x83, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x73, 0x80, 0x70, 0xE0,
+ 0x70, 0x38, 0x38, 0x0E, 0x1C, 0x03, 0x8F, 0x00, 0xE3, 0xC0, 0x38, 0xF0,
+ 0x0E, 0x3E, 0x07, 0x8F, 0xC3, 0xE1, 0xFF, 0x3F, 0x1F, 0x07, 0x80, 0x06,
+ 0x00, 0x01, 0xF0, 0x00, 0x3F, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00,
+ 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0,
+ 0x00, 0x07, 0x80, 0x00, 0x3C, 0x7E, 0x01, 0xEF, 0xFC, 0x0F, 0xC3, 0xF0,
+ 0x7C, 0x07, 0x83, 0xC0, 0x3E, 0x1E, 0x00, 0xF0, 0xF0, 0x07, 0xC7, 0x80,
+ 0x1E, 0x3C, 0x00, 0xF1, 0xE0, 0x07, 0x8F, 0x00, 0x3C, 0x78, 0x01, 0xE3,
+ 0xC0, 0x0F, 0x1E, 0x00, 0x70, 0xF0, 0x03, 0x87, 0x80, 0x38, 0x3C, 0x01,
+ 0xC1, 0xE0, 0x1C, 0x0F, 0xC1, 0xC0, 0x1F, 0xFC, 0x00, 0x3F, 0x80, 0x01,
+ 0xFC, 0x00, 0xFF, 0xE0, 0x38, 0x3E, 0x0E, 0x03, 0xE3, 0x80, 0x7C, 0xE0,
+ 0x07, 0x18, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80,
+ 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x1B, 0xC0,
+ 0x02, 0x7C, 0x01, 0x87, 0xE0, 0x60, 0x7F, 0xF8, 0x07, 0xFE, 0x00, 0x3F,
+ 0x00, 0x00, 0x00, 0x60, 0x00, 0x0F, 0x80, 0x00, 0xFE, 0x00, 0x00, 0x78,
+ 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00,
+ 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x7C, 0x78, 0x07, 0xFD,
+ 0xE0, 0x3C, 0x3F, 0x81, 0xC0, 0x3E, 0x0E, 0x00, 0xF8, 0x38, 0x01, 0xE1,
+ 0xE0, 0x07, 0x87, 0x00, 0x1E, 0x3C, 0x00, 0x78, 0xF0, 0x01, 0xE3, 0xC0,
+ 0x07, 0x8F, 0x00, 0x1E, 0x3C, 0x00, 0x78, 0xF0, 0x01, 0xE3, 0xE0, 0x07,
+ 0x87, 0x80, 0x1E, 0x1F, 0x00, 0x78, 0x3E, 0x03, 0xE0, 0xFC, 0x1F, 0xF0,
+ 0xFF, 0xDF, 0x00, 0xFC, 0x60, 0x03, 0xF8, 0x03, 0xFF, 0x01, 0xC1, 0xE0,
+ 0xC0, 0x3C, 0x70, 0x0F, 0x98, 0x01, 0xE7, 0xFF, 0xFB, 0xFF, 0xFE, 0xE0,
+ 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xF0, 0x00, 0x3C, 0x00,
+ 0x1F, 0x00, 0x05, 0xE0, 0x02, 0x7C, 0x01, 0x8F, 0xC1, 0xC3, 0xFF, 0xE0,
+ 0x7F, 0xF0, 0x07, 0xF0, 0x00, 0x00, 0x7E, 0x00, 0xFF, 0xC0, 0xE3, 0xE0,
+ 0x60, 0x70, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x0F, 0x00,
+ 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x07, 0xFF, 0x83, 0xFF, 0xC0, 0x3C,
+ 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00,
+ 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80,
+ 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x3F,
+ 0x00, 0xFF, 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x3F, 0xF0, 0x03, 0xC7, 0xFE,
+ 0x3C, 0x1F, 0xF1, 0xC0, 0x70, 0x1E, 0x03, 0xC0, 0xF0, 0x0E, 0x07, 0x80,
+ 0x70, 0x3C, 0x03, 0x81, 0xE0, 0x1C, 0x07, 0x80, 0xC0, 0x3E, 0x0E, 0x00,
+ 0x78, 0xE0, 0x01, 0xFC, 0x00, 0x18, 0x00, 0x01, 0x80, 0x00, 0x18, 0x00,
+ 0x01, 0xE0, 0x00, 0x0F, 0xFF, 0xC0, 0x3F, 0xFF, 0x80, 0xFF, 0xFE, 0x0C,
+ 0x00, 0x38, 0xC0, 0x00, 0x4C, 0x00, 0x02, 0x60, 0x00, 0x17, 0x00, 0x01,
+ 0x38, 0x00, 0x09, 0xE0, 0x00, 0x87, 0xC0, 0x38, 0x1F, 0xFF, 0x00, 0x3F,
+ 0xC0, 0x00, 0x06, 0x00, 0x00, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0x80,
+ 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00,
+ 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x87, 0xE0, 0x1E,
+ 0x7F, 0xC0, 0x7B, 0x0F, 0x81, 0xF8, 0x1E, 0x07, 0x80, 0x3C, 0x1E, 0x00,
+ 0xF0, 0x78, 0x03, 0xC1, 0xE0, 0x0F, 0x07, 0x80, 0x3C, 0x1E, 0x00, 0xF0,
+ 0x78, 0x03, 0xC1, 0xE0, 0x0F, 0x07, 0x80, 0x3C, 0x1E, 0x00, 0xF0, 0x78,
+ 0x03, 0xC1, 0xE0, 0x0F, 0x07, 0x80, 0x3C, 0x1E, 0x00, 0xF0, 0x78, 0x03,
+ 0xC3, 0xF0, 0x1F, 0x9F, 0xF1, 0xFF, 0x0E, 0x03, 0xE0, 0x7C, 0x0F, 0x80,
+ 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x70,
+ 0x7E, 0x1F, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E,
+ 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x07,
+ 0xE7, 0xFF, 0x00, 0xE0, 0x1F, 0x01, 0xF0, 0x1F, 0x00, 0xE0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x70, 0x3F, 0x07,
+ 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00,
+ 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00,
+ 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xE0, 0x0E, 0xE0,
+ 0xEF, 0x1C, 0xFF, 0x87, 0xE0, 0x06, 0x00, 0x00, 0x7C, 0x00, 0x03, 0xF8,
+ 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80,
+ 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00,
+ 0x00, 0xF0, 0x7F, 0xE1, 0xE0, 0x3E, 0x03, 0xC0, 0x70, 0x07, 0x81, 0x80,
+ 0x0F, 0x06, 0x00, 0x1E, 0x18, 0x00, 0x3C, 0x60, 0x00, 0x79, 0x80, 0x00,
+ 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x03, 0xDE, 0x00, 0x07, 0x9E, 0x00, 0x0F,
+ 0x3E, 0x00, 0x1E, 0x3E, 0x00, 0x3C, 0x3E, 0x00, 0x78, 0x3C, 0x00, 0xF0,
+ 0x3C, 0x01, 0xE0, 0x7C, 0x03, 0xC0, 0x7C, 0x0F, 0xC0, 0xFE, 0x7F, 0xE3,
+ 0xFF, 0x03, 0x03, 0xE1, 0xFC, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78,
+ 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F,
+ 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01,
+ 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x07, 0xE7, 0xFF, 0x1E, 0x1F, 0x01,
+ 0xF8, 0x1F, 0xCF, 0xF0, 0xFF, 0x80, 0xFF, 0x0F, 0x70, 0xF8, 0x0F, 0x81,
+ 0xF8, 0x0F, 0x01, 0xE0, 0x1E, 0x00, 0xF0, 0x3C, 0x03, 0xC0, 0x1E, 0x07,
+ 0x80, 0x78, 0x03, 0xC0, 0xF0, 0x0F, 0x00, 0x78, 0x1E, 0x01, 0xE0, 0x0F,
+ 0x03, 0xC0, 0x3C, 0x01, 0xE0, 0x78, 0x07, 0x80, 0x3C, 0x0F, 0x00, 0xF0,
+ 0x07, 0x81, 0xE0, 0x1E, 0x00, 0xF0, 0x3C, 0x03, 0xC0, 0x1E, 0x07, 0x80,
+ 0x78, 0x03, 0xC0, 0xF0, 0x0F, 0x00, 0x78, 0x1E, 0x01, 0xE0, 0x0F, 0x03,
+ 0xC0, 0x3C, 0x01, 0xE0, 0x78, 0x07, 0x80, 0x3C, 0x1F, 0x81, 0xF8, 0x0F,
+ 0xCF, 0xFC, 0xFF, 0xC7, 0xFE, 0x1E, 0x1F, 0x83, 0xF9, 0xFF, 0x03, 0xFC,
+ 0x3E, 0x07, 0xC0, 0x7C, 0x1E, 0x00, 0xF0, 0x78, 0x03, 0xC1, 0xE0, 0x0F,
+ 0x07, 0x80, 0x3C, 0x1E, 0x00, 0xF0, 0x78, 0x03, 0xC1, 0xE0, 0x0F, 0x07,
+ 0x80, 0x3C, 0x1E, 0x00, 0xF0, 0x78, 0x03, 0xC1, 0xE0, 0x0F, 0x07, 0x80,
+ 0x3C, 0x1E, 0x00, 0xF0, 0x78, 0x03, 0xC1, 0xE0, 0x0F, 0x0F, 0xC0, 0x7E,
+ 0x7F, 0xC3, 0xFC, 0x01, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0xF0, 0x7C, 0x0F,
+ 0x80, 0xF8, 0x3C, 0x01, 0xF1, 0xE0, 0x03, 0xE7, 0x80, 0x0F, 0xBE, 0x00,
+ 0x3F, 0xF8, 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0x80, 0x07, 0xFE, 0x00, 0x1F,
+ 0xF8, 0x00, 0x7F, 0xF0, 0x01, 0xE7, 0xC0, 0x07, 0x9F, 0x80, 0x3E, 0x3E,
+ 0x00, 0xF0, 0x7C, 0x07, 0x80, 0xF8, 0x3C, 0x01, 0xFF, 0xE0, 0x00, 0xFC,
+ 0x00, 0x0E, 0x3F, 0x07, 0xF7, 0xFE, 0x07, 0xE0, 0xF8, 0x3E, 0x03, 0xE1,
+ 0xE0, 0x0F, 0x0F, 0x00, 0x7C, 0x78, 0x03, 0xE3, 0xC0, 0x0F, 0x1E, 0x00,
+ 0x78, 0xF0, 0x03, 0xC7, 0x80, 0x1E, 0x3C, 0x00, 0xF1, 0xE0, 0x07, 0x8F,
+ 0x00, 0x38, 0x78, 0x03, 0xC3, 0xC0, 0x1E, 0x1E, 0x00, 0xE0, 0xF8, 0x0E,
+ 0x07, 0xE0, 0xE0, 0x3D, 0xFE, 0x01, 0xE7, 0xC0, 0x0F, 0x00, 0x00, 0x78,
+ 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00,
+ 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x1F, 0x80, 0x03, 0xFF, 0x80, 0x00, 0x01,
+ 0xF8, 0x20, 0x3F, 0xF3, 0x03, 0xC1, 0xF8, 0x3C, 0x07, 0xC3, 0xC0, 0x1E,
+ 0x1C, 0x00, 0xF1, 0xE0, 0x07, 0x8E, 0x00, 0x3C, 0xF0, 0x01, 0xE7, 0x80,
+ 0x0F, 0x3C, 0x00, 0x79, 0xE0, 0x03, 0xCF, 0x00, 0x1E, 0x78, 0x00, 0xF3,
+ 0xE0, 0x07, 0x9F, 0x00, 0x3C, 0x7C, 0x01, 0xE3, 0xE0, 0x1F, 0x0F, 0xC1,
+ 0xF8, 0x3F, 0xF3, 0xC0, 0x7E, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80,
+ 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03,
+ 0xC0, 0x00, 0x1E, 0x00, 0x03, 0xF8, 0x00, 0x7F, 0xE0, 0x06, 0x3C, 0xFC,
+ 0xFE, 0xFA, 0x78, 0xF8, 0x71, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00,
+ 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07,
+ 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x01, 0xF8, 0x0F, 0xFC,
+ 0x00, 0x1F, 0x91, 0x87, 0x98, 0x1D, 0xC0, 0x6E, 0x03, 0x70, 0x0B, 0xC0,
+ 0x5F, 0x80, 0x7E, 0x01, 0xFC, 0x07, 0xF0, 0x0F, 0xE0, 0x3F, 0x00, 0x7E,
+ 0x01, 0xF0, 0x07, 0xC0, 0x3E, 0x01, 0xF8, 0x0D, 0xE0, 0xC8, 0xF8, 0x00,
+ 0x04, 0x00, 0xC0, 0x0C, 0x01, 0xC0, 0x3C, 0x07, 0xFC, 0xFF, 0xC3, 0xC0,
+ 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0,
+ 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xE2,
+ 0x1F, 0xC0, 0xF8, 0xFC, 0x0F, 0xE1, 0xF0, 0x0F, 0x83, 0xC0, 0x1E, 0x0F,
+ 0x00, 0x78, 0x3C, 0x01, 0xE0, 0xF0, 0x07, 0x83, 0xC0, 0x1E, 0x0F, 0x00,
+ 0x78, 0x3C, 0x01, 0xE0, 0xF0, 0x07, 0x83, 0xC0, 0x1E, 0x0F, 0x00, 0x78,
+ 0x3C, 0x01, 0xE0, 0xF0, 0x07, 0x83, 0xC0, 0x1E, 0x0F, 0x00, 0x78, 0x3C,
+ 0x01, 0xE0, 0xF8, 0x0F, 0x81, 0xF0, 0xFF, 0x03, 0xFE, 0x7F, 0x07, 0xE1,
+ 0xC0, 0xFF, 0x81, 0xFC, 0xFC, 0x01, 0xC1, 0xE0, 0x07, 0x07, 0x80, 0x18,
+ 0x0F, 0x00, 0x60, 0x3C, 0x01, 0x00, 0x78, 0x0C, 0x01, 0xE0, 0x30, 0x07,
+ 0x81, 0x80, 0x0F, 0x06, 0x00, 0x3C, 0x10, 0x00, 0x78, 0xC0, 0x01, 0xE3,
+ 0x00, 0x03, 0x98, 0x00, 0x0F, 0x60, 0x00, 0x3D, 0x00, 0x00, 0x7C, 0x00,
+ 0x01, 0xF0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x30, 0x00, 0x00,
+ 0x40, 0x00, 0xFF, 0x8F, 0xF8, 0x3F, 0x7E, 0x07, 0xE0, 0x0E, 0x3E, 0x03,
+ 0xC0, 0x0C, 0x1E, 0x03, 0xE0, 0x0C, 0x1E, 0x01, 0xE0, 0x0C, 0x1E, 0x01,
+ 0xE0, 0x18, 0x0F, 0x00, 0xF0, 0x18, 0x0F, 0x01, 0xF0, 0x10, 0x07, 0x81,
+ 0xF0, 0x30, 0x07, 0x81, 0x78, 0x30, 0x07, 0x83, 0x78, 0x60, 0x03, 0xC3,
+ 0x38, 0x60, 0x03, 0xC6, 0x3C, 0x40, 0x01, 0xC6, 0x3C, 0xC0, 0x01, 0xEC,
+ 0x1E, 0xC0, 0x01, 0xEC, 0x1F, 0x80, 0x00, 0xF8, 0x0F, 0x80, 0x00, 0xF8,
+ 0x0F, 0x00, 0x00, 0x70, 0x0F, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x60,
+ 0x06, 0x00, 0x00, 0x20, 0x02, 0x00, 0x7F, 0xE7, 0xF0, 0x7E, 0x0F, 0x00,
+ 0xF8, 0x38, 0x01, 0xE0, 0xC0, 0x07, 0xC6, 0x00, 0x0F, 0x30, 0x00, 0x1E,
+ 0xC0, 0x00, 0x7E, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x07, 0xC0,
+ 0x00, 0x3F, 0x00, 0x00, 0xDE, 0x00, 0x06, 0x7C, 0x00, 0x30, 0xF0, 0x01,
+ 0xC1, 0xE0, 0x06, 0x07, 0xC0, 0x30, 0x0F, 0x01, 0xC0, 0x1E, 0x0F, 0x00,
+ 0xFC, 0xFE, 0x07, 0xFC, 0xFF, 0xC0, 0xFC, 0xFC, 0x01, 0xE1, 0xE0, 0x03,
+ 0x07, 0x80, 0x18, 0x0F, 0x00, 0x60, 0x3C, 0x01, 0x80, 0x78, 0x0C, 0x01,
+ 0xE0, 0x30, 0x03, 0xC0, 0xC0, 0x0F, 0x06, 0x00, 0x3E, 0x18, 0x00, 0x78,
+ 0x40, 0x01, 0xF3, 0x00, 0x03, 0xCC, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0x80,
+ 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x06, 0x00, 0x00,
+ 0x18, 0x00, 0x00, 0x40, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x60,
+ 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x80, 0x01,
+ 0xFC, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7F, 0xFF, 0x9F, 0xFF, 0xE6, 0x00,
+ 0xF1, 0x00, 0x78, 0x40, 0x3E, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03, 0xE0,
+ 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03,
+ 0xE0, 0x01, 0xF0, 0x04, 0x78, 0x01, 0x3E, 0x00, 0xDF, 0x00, 0x37, 0x80,
+ 0x1F, 0xFF, 0xFE, 0xFF, 0xFF, 0x80, 0x01, 0xE0, 0x78, 0x1C, 0x07, 0x80,
+ 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0,
+ 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x70, 0x1C, 0x0E, 0x00, 0x70,
+ 0x07, 0x00, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03,
+ 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x01, 0xC0,
+ 0x1E, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xE0, 0x0F, 0x00, 0x70, 0x0F, 0x00, 0xE0, 0x1C, 0x03,
+ 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80,
+ 0x70, 0x0E, 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x0E, 0x07, 0x01, 0xC0, 0x70,
+ 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E,
+ 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x3C, 0x07, 0x03, 0xC0, 0xF0, 0x00,
+ 0x1F, 0x80, 0x00, 0xFF, 0x80, 0xC7, 0x0F, 0x87, 0xB8, 0x0F, 0xFC, 0x00,
+ 0x07, 0xC0 };
+
+const GFXglyph FreeSerif24pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 12, 0, 1 }, // 0x20 ' '
+ { 0, 5, 32, 16, 6, -31 }, // 0x21 '!'
+ { 20, 12, 12, 19, 4, -31 }, // 0x22 '"'
+ { 38, 23, 31, 23, 0, -30 }, // 0x23 '#'
+ { 128, 19, 37, 24, 2, -33 }, // 0x24 '$'
+ { 216, 33, 32, 39, 3, -30 }, // 0x25 '%'
+ { 348, 32, 33, 37, 2, -31 }, // 0x26 '&'
+ { 480, 4, 12, 9, 3, -31 }, // 0x27 '''
+ { 486, 12, 40, 16, 2, -31 }, // 0x28 '('
+ { 546, 12, 40, 16, 2, -30 }, // 0x29 ')'
+ { 606, 16, 19, 24, 4, -30 }, // 0x2A '*'
+ { 644, 23, 23, 27, 2, -22 }, // 0x2B '+'
+ { 711, 6, 11, 12, 2, -4 }, // 0x2C ','
+ { 720, 11, 2, 16, 2, -10 }, // 0x2D '-'
+ { 723, 5, 5, 12, 3, -3 }, // 0x2E '.'
+ { 727, 14, 32, 14, 0, -30 }, // 0x2F '/'
+ { 783, 22, 33, 23, 1, -31 }, // 0x30 '0'
+ { 874, 13, 32, 24, 5, -31 }, // 0x31 '1'
+ { 926, 21, 31, 23, 1, -30 }, // 0x32 '2'
+ { 1008, 18, 32, 23, 2, -30 }, // 0x33 '3'
+ { 1080, 21, 31, 24, 1, -30 }, // 0x34 '4'
+ { 1162, 19, 33, 24, 2, -31 }, // 0x35 '5'
+ { 1241, 21, 33, 23, 2, -31 }, // 0x36 '6'
+ { 1328, 20, 31, 24, 1, -30 }, // 0x37 '7'
+ { 1406, 18, 33, 23, 3, -31 }, // 0x38 '8'
+ { 1481, 21, 33, 24, 1, -31 }, // 0x39 '9'
+ { 1568, 5, 22, 12, 4, -20 }, // 0x3A ':'
+ { 1582, 6, 27, 12, 3, -20 }, // 0x3B ';'
+ { 1603, 24, 25, 27, 1, -24 }, // 0x3C '<'
+ { 1678, 24, 11, 27, 1, -16 }, // 0x3D '='
+ { 1711, 24, 25, 27, 2, -23 }, // 0x3E '>'
+ { 1786, 17, 32, 21, 3, -31 }, // 0x3F '?'
+ { 1854, 32, 33, 41, 4, -31 }, // 0x40 '@'
+ { 1986, 32, 32, 34, 1, -31 }, // 0x41 'A'
+ { 2114, 27, 31, 30, 0, -30 }, // 0x42 'B'
+ { 2219, 28, 33, 31, 2, -31 }, // 0x43 'C'
+ { 2335, 31, 31, 34, 1, -30 }, // 0x44 'D'
+ { 2456, 27, 31, 29, 2, -30 }, // 0x45 'E'
+ { 2561, 24, 31, 27, 2, -30 }, // 0x46 'F'
+ { 2654, 31, 33, 35, 2, -31 }, // 0x47 'G'
+ { 2782, 30, 31, 34, 2, -30 }, // 0x48 'H'
+ { 2899, 13, 31, 15, 1, -30 }, // 0x49 'I'
+ { 2950, 17, 32, 18, 0, -30 }, // 0x4A 'J'
+ { 3018, 32, 31, 33, 1, -30 }, // 0x4B 'K'
+ { 3142, 26, 31, 29, 2, -30 }, // 0x4C 'L'
+ { 3243, 39, 31, 41, 1, -30 }, // 0x4D 'M'
+ { 3395, 32, 32, 34, 1, -30 }, // 0x4E 'N'
+ { 3523, 30, 33, 34, 2, -31 }, // 0x4F 'O'
+ { 3647, 23, 31, 27, 2, -30 }, // 0x50 'P'
+ { 3737, 31, 40, 34, 2, -31 }, // 0x51 'Q'
+ { 3892, 28, 31, 31, 2, -30 }, // 0x52 'R'
+ { 4001, 21, 33, 25, 2, -31 }, // 0x53 'S'
+ { 4088, 27, 31, 28, 1, -30 }, // 0x54 'T'
+ { 4193, 32, 32, 34, 1, -30 }, // 0x55 'U'
+ { 4321, 32, 32, 33, 0, -30 }, // 0x56 'V'
+ { 4449, 44, 32, 45, 0, -30 }, // 0x57 'W'
+ { 4625, 33, 31, 34, 0, -30 }, // 0x58 'X'
+ { 4753, 32, 31, 33, 0, -30 }, // 0x59 'Y'
+ { 4877, 27, 31, 29, 1, -30 }, // 0x5A 'Z'
+ { 4982, 9, 38, 16, 4, -30 }, // 0x5B '['
+ { 5025, 14, 32, 14, 0, -30 }, // 0x5C '\'
+ { 5081, 9, 38, 16, 3, -30 }, // 0x5D ']'
+ { 5124, 20, 17, 22, 1, -30 }, // 0x5E '^'
+ { 5167, 24, 2, 23, 0, 5 }, // 0x5F '_'
+ { 5173, 10, 8, 12, 1, -31 }, // 0x60 '`'
+ { 5183, 18, 21, 20, 1, -20 }, // 0x61 'a'
+ { 5231, 21, 32, 24, 1, -31 }, // 0x62 'b'
+ { 5315, 19, 21, 21, 1, -20 }, // 0x63 'c'
+ { 5365, 22, 32, 23, 1, -31 }, // 0x64 'd'
+ { 5453, 18, 21, 21, 1, -20 }, // 0x65 'e'
+ { 5501, 17, 33, 18, 0, -32 }, // 0x66 'f'
+ { 5572, 21, 31, 22, 1, -20 }, // 0x67 'g'
+ { 5654, 22, 32, 23, 0, -31 }, // 0x68 'h'
+ { 5742, 11, 32, 13, 0, -31 }, // 0x69 'i'
+ { 5786, 12, 42, 16, 0, -31 }, // 0x6A 'j'
+ { 5849, 23, 32, 24, 1, -31 }, // 0x6B 'k'
+ { 5941, 11, 32, 12, 0, -31 }, // 0x6C 'l'
+ { 5985, 35, 21, 37, 1, -20 }, // 0x6D 'm'
+ { 6077, 22, 21, 23, 0, -20 }, // 0x6E 'n'
+ { 6135, 22, 21, 23, 1, -20 }, // 0x6F 'o'
+ { 6193, 21, 31, 24, 1, -20 }, // 0x70 'p'
+ { 6275, 21, 31, 23, 1, -20 }, // 0x71 'q'
+ { 6357, 15, 21, 16, 1, -20 }, // 0x72 'r'
+ { 6397, 13, 21, 17, 2, -20 }, // 0x73 's'
+ { 6432, 12, 26, 13, 1, -25 }, // 0x74 't'
+ { 6471, 22, 21, 23, 1, -20 }, // 0x75 'u'
+ { 6529, 22, 22, 22, 0, -20 }, // 0x76 'v'
+ { 6590, 32, 22, 32, 0, -20 }, // 0x77 'w'
+ { 6678, 22, 21, 23, 0, -20 }, // 0x78 'x'
+ { 6736, 22, 31, 22, 0, -20 }, // 0x79 'y'
+ { 6822, 18, 21, 20, 1, -20 }, // 0x7A 'z'
+ { 6870, 11, 41, 23, 5, -31 }, // 0x7B '{'
+ { 6927, 3, 32, 9, 3, -30 }, // 0x7C '|'
+ { 6939, 11, 41, 23, 7, -31 }, // 0x7D '}'
+ { 6996, 22, 5, 23, 1, -13 } }; // 0x7E '~'
+
+const GFXfont FreeSerif24pt7b PROGMEM = {
+ (uint8_t *)FreeSerif24pt7bBitmaps,
+ (GFXglyph *)FreeSerif24pt7bGlyphs,
+ 0x20, 0x7E, 56 };
+
+// Approx. 7682 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerif9pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerif9pt7b.h
new file mode 100644
index 000000000000..cdb20c77b8bf
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerif9pt7b.h
@@ -0,0 +1,195 @@
+const uint8_t FreeSerif9pt7bBitmaps[] PROGMEM = {
+ 0xFF, 0xEA, 0x03, 0xDE, 0xF7, 0x20, 0x11, 0x09, 0x04, 0x82, 0x4F, 0xF9,
+ 0x10, 0x89, 0xFF, 0x24, 0x12, 0x09, 0x0C, 0x80, 0x10, 0x7C, 0xD6, 0xD2,
+ 0xD0, 0xF0, 0x38, 0x1E, 0x17, 0x93, 0x93, 0xD6, 0x7C, 0x10, 0x38, 0x43,
+ 0x3C, 0x39, 0x21, 0x8A, 0x0C, 0x50, 0x65, 0x39, 0xCB, 0x20, 0xB9, 0x05,
+ 0x88, 0x4C, 0x44, 0x64, 0x21, 0xC0, 0x0E, 0x00, 0xC8, 0x06, 0x40, 0x32,
+ 0x01, 0xA0, 0x07, 0x78, 0x31, 0x87, 0x88, 0x46, 0x86, 0x34, 0x30, 0xC1,
+ 0xC7, 0x17, 0xCF, 0x00, 0xFE, 0x08, 0x88, 0x84, 0x63, 0x18, 0xC6, 0x10,
+ 0x82, 0x08, 0x20, 0x82, 0x08, 0x21, 0x0C, 0x63, 0x18, 0xC4, 0x22, 0x22,
+ 0x00, 0x63, 0x9A, 0xDC, 0x72, 0xB6, 0x08, 0x08, 0x04, 0x02, 0x01, 0x0F,
+ 0xF8, 0x40, 0x20, 0x10, 0x08, 0x00, 0xD8, 0xF0, 0xF0, 0x08, 0x84, 0x22,
+ 0x10, 0x8C, 0x42, 0x31, 0x00, 0x1C, 0x31, 0x98, 0xD8, 0x3C, 0x1E, 0x0F,
+ 0x07, 0x83, 0xC1, 0xE0, 0xD8, 0xC4, 0x61, 0xC0, 0x13, 0x8C, 0x63, 0x18,
+ 0xC6, 0x31, 0x8C, 0x67, 0x80, 0x3C, 0x4E, 0x86, 0x06, 0x06, 0x04, 0x0C,
+ 0x08, 0x10, 0x20, 0x41, 0xFE, 0x3C, 0xC6, 0x06, 0x04, 0x1C, 0x3E, 0x07,
+ 0x03, 0x03, 0x03, 0x06, 0xF8, 0x04, 0x18, 0x71, 0x64, 0xC9, 0xA3, 0x46,
+ 0xFE, 0x18, 0x30, 0x60, 0x0F, 0x10, 0x20, 0x3C, 0x0E, 0x07, 0x03, 0x03,
+ 0x03, 0x02, 0x04, 0xF8, 0x07, 0x1C, 0x30, 0x60, 0x60, 0xDC, 0xE6, 0xC3,
+ 0xC3, 0xC3, 0x43, 0x66, 0x3C, 0x7F, 0x82, 0x02, 0x02, 0x04, 0x04, 0x04,
+ 0x08, 0x08, 0x08, 0x10, 0x10, 0x3C, 0x8F, 0x1E, 0x3E, 0x4F, 0x06, 0x36,
+ 0xC7, 0x8F, 0x1B, 0x33, 0xC0, 0x3C, 0x66, 0xC2, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0x63, 0x3F, 0x06, 0x06, 0x0C, 0x38, 0x60, 0xF0, 0x0F, 0xD8, 0x00, 0x03,
+ 0x28, 0x01, 0x87, 0x0E, 0x1C, 0x0C, 0x03, 0x80, 0x70, 0x0E, 0x00, 0x80,
+ 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xF8, 0x80, 0x1C, 0x01, 0xC0, 0x1C, 0x01,
+ 0xC0, 0xE0, 0xE0, 0xE0, 0xC0, 0x00, 0x79, 0x1A, 0x18, 0x30, 0x60, 0x83,
+ 0x04, 0x10, 0x20, 0x40, 0x03, 0x00, 0x0F, 0x83, 0x8C, 0x60, 0x26, 0x02,
+ 0xC7, 0x9C, 0xC9, 0xD8, 0x9D, 0x99, 0xD9, 0x26, 0xEC, 0x60, 0x03, 0x04,
+ 0x0F, 0x80, 0x02, 0x00, 0x10, 0x01, 0xC0, 0x16, 0x00, 0x98, 0x04, 0xC0,
+ 0x43, 0x03, 0xF8, 0x20, 0x61, 0x03, 0x18, 0x1D, 0xE1, 0xF0, 0xFF, 0x86,
+ 0x1C, 0xC1, 0x98, 0x33, 0x0C, 0x7E, 0x0C, 0x31, 0x83, 0x30, 0x66, 0x0C,
+ 0xC3, 0x7F, 0xC0, 0x1F, 0x26, 0x1D, 0x81, 0xE0, 0x1C, 0x01, 0x80, 0x30,
+ 0x06, 0x00, 0xC0, 0x0C, 0x00, 0xC1, 0x8F, 0xC0, 0xFF, 0x03, 0x1C, 0x30,
+ 0x63, 0x07, 0x30, 0x33, 0x03, 0x30, 0x33, 0x03, 0x30, 0x33, 0x06, 0x30,
+ 0xCF, 0xF0, 0xFF, 0x98, 0x26, 0x01, 0x80, 0x61, 0x1F, 0xC6, 0x11, 0x80,
+ 0x60, 0x18, 0x16, 0x0F, 0xFE, 0xFF, 0xB0, 0x58, 0x0C, 0x06, 0x13, 0xF9,
+ 0x84, 0xC0, 0x60, 0x30, 0x18, 0x1E, 0x00, 0x1F, 0x23, 0x0E, 0x60, 0x26,
+ 0x00, 0xC0, 0x0C, 0x0F, 0xC0, 0x6C, 0x06, 0xC0, 0x66, 0x06, 0x30, 0x60,
+ 0xF8, 0xF1, 0xEC, 0x19, 0x83, 0x30, 0x66, 0x0C, 0xFF, 0x98, 0x33, 0x06,
+ 0x60, 0xCC, 0x19, 0x83, 0x78, 0xF0, 0xF6, 0x66, 0x66, 0x66, 0x66, 0x6F,
+ 0x3C, 0x61, 0x86, 0x18, 0x61, 0x86, 0x18, 0x6D, 0xBC, 0xF3, 0xE6, 0x08,
+ 0x61, 0x06, 0x20, 0x64, 0x07, 0x80, 0x6C, 0x06, 0x60, 0x63, 0x06, 0x18,
+ 0x60, 0xCF, 0x3F, 0xF0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01,
+ 0x80, 0x60, 0x18, 0x16, 0x0B, 0xFE, 0xF0, 0x0E, 0x70, 0x38, 0xE0, 0x71,
+ 0xE1, 0x62, 0xC2, 0xC5, 0xC9, 0x89, 0x93, 0x13, 0x26, 0x23, 0x8C, 0x47,
+ 0x18, 0x84, 0x33, 0x88, 0xF0, 0xE0, 0xEE, 0x09, 0xC1, 0x2C, 0x25, 0xC4,
+ 0x9C, 0x91, 0x92, 0x1A, 0x41, 0xC8, 0x19, 0x03, 0x70, 0x20, 0x1F, 0x06,
+ 0x31, 0x83, 0x20, 0x2C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x68, 0x09,
+ 0x83, 0x18, 0xC1, 0xF0, 0xFE, 0x31, 0x98, 0x6C, 0x36, 0x1B, 0x19, 0xF8,
+ 0xC0, 0x60, 0x30, 0x18, 0x1E, 0x00, 0x1F, 0x06, 0x31, 0x83, 0x20, 0x2C,
+ 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x68, 0x19, 0x83, 0x18, 0xC0, 0xE0,
+ 0x0E, 0x00, 0xE0, 0x07, 0xFE, 0x0C, 0x61, 0x86, 0x30, 0xC6, 0x18, 0xC6,
+ 0x1F, 0x83, 0x70, 0x67, 0x0C, 0x71, 0x87, 0x78, 0x70, 0x1D, 0x31, 0x98,
+ 0x4C, 0x07, 0x80, 0xE0, 0x1C, 0x07, 0x01, 0xA0, 0xD8, 0xCB, 0xC0, 0xFF,
+ 0xF8, 0xCE, 0x18, 0x83, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00,
+ 0xC0, 0x18, 0x07, 0x80, 0xF0, 0xEC, 0x09, 0x81, 0x30, 0x26, 0x04, 0xC0,
+ 0x98, 0x13, 0x02, 0x60, 0x4C, 0x08, 0xC2, 0x0F, 0x80, 0xF8, 0x77, 0x02,
+ 0x30, 0x23, 0x04, 0x18, 0x41, 0x84, 0x0C, 0x80, 0xC8, 0x07, 0x00, 0x70,
+ 0x02, 0x00, 0x20, 0xFB, 0xE7, 0xB0, 0xC0, 0x8C, 0x20, 0x86, 0x18, 0x41,
+ 0x8C, 0x40, 0xCB, 0x20, 0x65, 0x90, 0x1A, 0x70, 0x0E, 0x38, 0x03, 0x1C,
+ 0x01, 0x04, 0x00, 0x82, 0x00, 0xFC, 0xF9, 0x83, 0x06, 0x10, 0x19, 0x00,
+ 0xD0, 0x03, 0x00, 0x1C, 0x01, 0x30, 0x11, 0xC1, 0x86, 0x08, 0x19, 0xE3,
+ 0xF0, 0xF8, 0xF6, 0x06, 0x30, 0x41, 0x88, 0x1D, 0x00, 0xD0, 0x06, 0x00,
+ 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0xF0, 0x3F, 0xCC, 0x11, 0x06, 0x01,
+ 0x80, 0x70, 0x0C, 0x03, 0x00, 0xE0, 0x38, 0x06, 0x05, 0xC1, 0x7F, 0xE0,
+ 0xFB, 0x6D, 0xB6, 0xDB, 0x6D, 0xB8, 0x82, 0x10, 0x82, 0x10, 0x86, 0x10,
+ 0x86, 0x10, 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xF8, 0x18, 0x1C, 0x34, 0x26,
+ 0x62, 0x42, 0xC1, 0xFF, 0x80, 0x84, 0x20, 0x79, 0x98, 0x30, 0xE6, 0xD9,
+ 0xB3, 0x3F, 0x20, 0x70, 0x18, 0x0C, 0x06, 0x03, 0x71, 0xCC, 0xC3, 0x61,
+ 0xB0, 0xD8, 0x6C, 0x63, 0xE0, 0x3C, 0xCF, 0x06, 0x0C, 0x18, 0x18, 0x9E,
+ 0x01, 0x03, 0x80, 0xC0, 0x60, 0x31, 0xD9, 0x9D, 0x86, 0xC3, 0x61, 0xB0,
+ 0xCC, 0x63, 0xF0, 0x3C, 0x46, 0xFE, 0xC0, 0xC0, 0xE1, 0x62, 0x3C, 0x1E,
+ 0x41, 0x83, 0x06, 0x1E, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x0F, 0x00, 0x3C,
+ 0x19, 0xF6, 0x31, 0x8C, 0x1E, 0x08, 0x04, 0x01, 0xFC, 0x40, 0xB0, 0x2E,
+ 0x11, 0xF8, 0x20, 0x70, 0x18, 0x0C, 0x06, 0x03, 0x71, 0xCC, 0xC6, 0x63,
+ 0x31, 0x98, 0xCC, 0x6F, 0x78, 0x60, 0x02, 0xE6, 0x66, 0x66, 0xF0, 0x18,
+ 0x00, 0x33, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8B, 0x80, 0x20, 0x70, 0x18,
+ 0x0C, 0x06, 0x03, 0x3D, 0x88, 0xD8, 0x78, 0x36, 0x19, 0x8C, 0x6F, 0x78,
+ 0x2E, 0x66, 0x66, 0x66, 0x66, 0x66, 0xF0, 0xEE, 0x71, 0xCE, 0x66, 0x31,
+ 0x98, 0xC6, 0x63, 0x19, 0x8C, 0x66, 0x31, 0xBD, 0xEF, 0xEE, 0x39, 0x98,
+ 0xCC, 0x66, 0x33, 0x19, 0x8D, 0xEF, 0x3E, 0x31, 0xB0, 0x78, 0x3C, 0x1E,
+ 0x0D, 0x8C, 0x7C, 0xEE, 0x39, 0x98, 0x6C, 0x36, 0x1B, 0x0D, 0x8C, 0xFC,
+ 0x60, 0x30, 0x18, 0x1E, 0x00, 0x3D, 0x31, 0xB0, 0xD8, 0x6C, 0x36, 0x1B,
+ 0x8C, 0xFE, 0x03, 0x01, 0x80, 0xC0, 0xF0, 0x6D, 0xC6, 0x18, 0x61, 0x86,
+ 0x3C, 0x76, 0x38, 0x58, 0x3E, 0x38, 0xFE, 0x27, 0x98, 0xC6, 0x31, 0x8C,
+ 0x38, 0xE7, 0x31, 0x98, 0xCC, 0x66, 0x33, 0x19, 0x8C, 0x7F, 0xF3, 0x61,
+ 0x22, 0x32, 0x14, 0x1C, 0x08, 0x08, 0xEF, 0x36, 0x61, 0x62, 0x22, 0x32,
+ 0x35, 0x41, 0x9C, 0x18, 0x81, 0x08, 0xF7, 0x12, 0x0E, 0x03, 0x01, 0xC1,
+ 0x21, 0x09, 0xCF, 0xF3, 0x61, 0x62, 0x32, 0x34, 0x14, 0x1C, 0x08, 0x08,
+ 0x08, 0x10, 0xE0, 0xFD, 0x18, 0x60, 0x83, 0x0C, 0x70, 0xFE, 0x19, 0x8C,
+ 0x63, 0x18, 0xC4, 0x61, 0x8C, 0x63, 0x18, 0xC3, 0xFF, 0xF0, 0xC3, 0x18,
+ 0xC6, 0x31, 0x84, 0x33, 0x18, 0xC6, 0x31, 0x98, 0x70, 0x24, 0xC1, 0xC0 };
+
+const GFXglyph FreeSerif9pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 5, 0, 1 }, // 0x20 ' '
+ { 0, 2, 12, 6, 2, -11 }, // 0x21 '!'
+ { 3, 5, 4, 7, 1, -11 }, // 0x22 '"'
+ { 6, 9, 12, 9, 0, -11 }, // 0x23 '#'
+ { 20, 8, 14, 9, 1, -12 }, // 0x24 '$'
+ { 34, 13, 12, 15, 1, -11 }, // 0x25 '%'
+ { 54, 13, 13, 14, 1, -12 }, // 0x26 '&'
+ { 76, 2, 4, 4, 1, -11 }, // 0x27 '''
+ { 77, 5, 15, 6, 1, -11 }, // 0x28 '('
+ { 87, 5, 15, 6, 0, -11 }, // 0x29 ')'
+ { 97, 6, 8, 9, 3, -11 }, // 0x2A '*'
+ { 103, 9, 9, 10, 0, -8 }, // 0x2B '+'
+ { 114, 2, 3, 4, 2, 0 }, // 0x2C ','
+ { 115, 4, 1, 6, 1, -3 }, // 0x2D '-'
+ { 116, 2, 2, 5, 1, -1 }, // 0x2E '.'
+ { 117, 5, 12, 5, 0, -11 }, // 0x2F '/'
+ { 125, 9, 13, 9, 0, -12 }, // 0x30 '0'
+ { 140, 5, 13, 9, 2, -12 }, // 0x31 '1'
+ { 149, 8, 12, 9, 1, -11 }, // 0x32 '2'
+ { 161, 8, 12, 9, 0, -11 }, // 0x33 '3'
+ { 173, 7, 12, 9, 1, -11 }, // 0x34 '4'
+ { 184, 8, 12, 9, 0, -11 }, // 0x35 '5'
+ { 196, 8, 13, 9, 1, -12 }, // 0x36 '6'
+ { 209, 8, 12, 9, 0, -11 }, // 0x37 '7'
+ { 221, 7, 13, 9, 1, -12 }, // 0x38 '8'
+ { 233, 8, 14, 9, 1, -12 }, // 0x39 '9'
+ { 247, 2, 8, 5, 1, -7 }, // 0x3A ':'
+ { 249, 3, 10, 5, 1, -7 }, // 0x3B ';'
+ { 253, 9, 9, 10, 1, -8 }, // 0x3C '<'
+ { 264, 9, 5, 10, 1, -6 }, // 0x3D '='
+ { 270, 10, 9, 10, 0, -8 }, // 0x3E '>'
+ { 282, 7, 13, 8, 1, -12 }, // 0x3F '?'
+ { 294, 12, 13, 16, 2, -12 }, // 0x40 '@'
+ { 314, 13, 12, 13, 0, -11 }, // 0x41 'A'
+ { 334, 11, 12, 11, 0, -11 }, // 0x42 'B'
+ { 351, 11, 12, 12, 1, -11 }, // 0x43 'C'
+ { 368, 12, 12, 13, 0, -11 }, // 0x44 'D'
+ { 386, 10, 12, 11, 1, -11 }, // 0x45 'E'
+ { 401, 9, 12, 10, 1, -11 }, // 0x46 'F'
+ { 415, 12, 12, 13, 1, -11 }, // 0x47 'G'
+ { 433, 11, 12, 13, 1, -11 }, // 0x48 'H'
+ { 450, 4, 12, 6, 1, -11 }, // 0x49 'I'
+ { 456, 6, 12, 7, 0, -11 }, // 0x4A 'J'
+ { 465, 12, 12, 13, 1, -11 }, // 0x4B 'K'
+ { 483, 10, 12, 11, 1, -11 }, // 0x4C 'L'
+ { 498, 15, 12, 16, 0, -11 }, // 0x4D 'M'
+ { 521, 11, 12, 13, 1, -11 }, // 0x4E 'N'
+ { 538, 11, 13, 13, 1, -12 }, // 0x4F 'O'
+ { 556, 9, 12, 10, 1, -11 }, // 0x50 'P'
+ { 570, 11, 16, 13, 1, -12 }, // 0x51 'Q'
+ { 592, 11, 12, 12, 1, -11 }, // 0x52 'R'
+ { 609, 9, 12, 10, 0, -11 }, // 0x53 'S'
+ { 623, 11, 12, 11, 0, -11 }, // 0x54 'T'
+ { 640, 11, 12, 13, 1, -11 }, // 0x55 'U'
+ { 657, 12, 12, 13, 0, -11 }, // 0x56 'V'
+ { 675, 17, 12, 17, 0, -11 }, // 0x57 'W'
+ { 701, 13, 12, 13, 0, -11 }, // 0x58 'X'
+ { 721, 12, 12, 13, 0, -11 }, // 0x59 'Y'
+ { 739, 11, 12, 11, 0, -11 }, // 0x5A 'Z'
+ { 756, 3, 15, 6, 2, -11 }, // 0x5B '['
+ { 762, 5, 12, 5, 0, -11 }, // 0x5C '\'
+ { 770, 3, 15, 6, 1, -11 }, // 0x5D ']'
+ { 776, 8, 7, 8, 0, -11 }, // 0x5E '^'
+ { 783, 9, 1, 9, 0, 2 }, // 0x5F '_'
+ { 785, 4, 3, 5, 0, -11 }, // 0x60 '`'
+ { 787, 7, 8, 8, 1, -7 }, // 0x61 'a'
+ { 794, 9, 13, 9, 0, -12 }, // 0x62 'b'
+ { 809, 7, 8, 8, 0, -7 }, // 0x63 'c'
+ { 816, 9, 13, 9, 0, -12 }, // 0x64 'd'
+ { 831, 8, 8, 8, 0, -7 }, // 0x65 'e'
+ { 839, 7, 13, 7, 1, -12 }, // 0x66 'f'
+ { 851, 10, 12, 8, 0, -7 }, // 0x67 'g'
+ { 866, 9, 13, 9, 0, -12 }, // 0x68 'h'
+ { 881, 4, 11, 5, 1, -10 }, // 0x69 'i'
+ { 887, 5, 15, 6, 0, -10 }, // 0x6A 'j'
+ { 897, 9, 13, 9, 1, -12 }, // 0x6B 'k'
+ { 912, 4, 13, 5, 1, -12 }, // 0x6C 'l'
+ { 919, 14, 8, 14, 0, -7 }, // 0x6D 'm'
+ { 933, 9, 8, 9, 0, -7 }, // 0x6E 'n'
+ { 942, 9, 8, 9, 0, -7 }, // 0x6F 'o'
+ { 951, 9, 12, 9, 0, -7 }, // 0x70 'p'
+ { 965, 9, 12, 9, 0, -7 }, // 0x71 'q'
+ { 979, 6, 8, 6, 0, -7 }, // 0x72 'r'
+ { 985, 6, 8, 7, 1, -7 }, // 0x73 's'
+ { 991, 5, 9, 5, 0, -8 }, // 0x74 't'
+ { 997, 9, 8, 9, 0, -7 }, // 0x75 'u'
+ { 1006, 8, 8, 8, 0, -7 }, // 0x76 'v'
+ { 1014, 12, 8, 12, 0, -7 }, // 0x77 'w'
+ { 1026, 9, 8, 9, 0, -7 }, // 0x78 'x'
+ { 1035, 8, 12, 8, 0, -7 }, // 0x79 'y'
+ { 1047, 7, 8, 7, 1, -7 }, // 0x7A 'z'
+ { 1054, 5, 16, 9, 1, -12 }, // 0x7B '{'
+ { 1064, 1, 12, 4, 1, -11 }, // 0x7C '|'
+ { 1066, 5, 16, 9, 3, -11 }, // 0x7D '}'
+ { 1076, 9, 3, 9, 0, -5 } }; // 0x7E '~'
+
+const GFXfont FreeSerif9pt7b PROGMEM = {
+ (uint8_t *)FreeSerif9pt7bBitmaps,
+ (GFXglyph *)FreeSerif9pt7bGlyphs,
+ 0x20, 0x7E, 22 };
+
+// Approx. 1752 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBold12pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBold12pt7b.h
new file mode 100644
index 000000000000..1d499811fae4
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBold12pt7b.h
@@ -0,0 +1,271 @@
+const uint8_t FreeSerifBold12pt7bBitmaps[] PROGMEM = {
+ 0x7F, 0xFF, 0x77, 0x66, 0x22, 0x00, 0x6F, 0xF7, 0xE3, 0xF1, 0xF8, 0xFC,
+ 0x7E, 0x3A, 0x09, 0x04, 0x0C, 0x40, 0xCC, 0x0C, 0xC0, 0x8C, 0x18, 0xC7,
+ 0xFF, 0x18, 0xC1, 0x88, 0x19, 0x81, 0x98, 0xFF, 0xE3, 0x18, 0x31, 0x83,
+ 0x18, 0x33, 0x03, 0x30, 0x08, 0x01, 0x00, 0xFC, 0x24, 0xEC, 0x8D, 0x90,
+ 0xBA, 0x07, 0xC0, 0x7E, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x9F, 0x11, 0xE2,
+ 0x3E, 0x46, 0xE9, 0xC7, 0xC0, 0x20, 0x04, 0x00, 0x1E, 0x0C, 0x0E, 0x7F,
+ 0x07, 0x10, 0x83, 0xC4, 0x40, 0xE1, 0x30, 0x38, 0x88, 0x0E, 0x26, 0x03,
+ 0x91, 0x1E, 0x78, 0x8E, 0x40, 0x27, 0x10, 0x11, 0xC4, 0x0C, 0xE1, 0x02,
+ 0x38, 0x81, 0x0E, 0x20, 0x43, 0x90, 0x20, 0x78, 0x03, 0xE0, 0x01, 0x9E,
+ 0x00, 0xE3, 0x80, 0x38, 0xE0, 0x0F, 0x30, 0x03, 0xF0, 0x00, 0x78, 0x7C,
+ 0x1F, 0x06, 0x1B, 0xE1, 0x1C, 0x7C, 0x8F, 0x1F, 0x23, 0xC3, 0xF0, 0xF8,
+ 0x7C, 0x3E, 0x0F, 0x97, 0xC7, 0xFC, 0xFE, 0x3E, 0xFF, 0xFE, 0x90, 0x00,
+ 0x31, 0x0C, 0x31, 0x86, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x86, 0x18, 0x60,
+ 0xC1, 0x02, 0x04, 0x03, 0x06, 0x0C, 0x30, 0x61, 0x87, 0x1C, 0x71, 0xC7,
+ 0x1C, 0x71, 0x86, 0x38, 0xC2, 0x10, 0x80, 0x1C, 0x6E, 0xFA, 0xEF, 0xF1,
+ 0xC7, 0xFF, 0xAF, 0xBB, 0x1C, 0x04, 0x00, 0x06, 0x00, 0x60, 0x06, 0x00,
+ 0x60, 0x06, 0x0F, 0xFF, 0xFF, 0xF0, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00,
+ 0x60, 0x6F, 0xF7, 0x11, 0x24, 0xFF, 0xFF, 0xC0, 0x6F, 0xF6, 0x03, 0x07,
+ 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x30, 0x30, 0x60,
+ 0x60, 0x60, 0xC0, 0x0E, 0x07, 0x71, 0xC7, 0x38, 0xEF, 0x1D, 0xE3, 0xFC,
+ 0x7F, 0x8F, 0xF1, 0xFE, 0x3F, 0xC7, 0xF8, 0xF7, 0x1C, 0xE3, 0x8E, 0xE0,
+ 0xF8, 0x06, 0x0F, 0x1F, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F,
+ 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0xF9, 0xFF, 0x0F, 0x03, 0xFC, 0x7F, 0xC4,
+ 0x3E, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x1C, 0x03, 0x80, 0x30, 0x06, 0x00,
+ 0xC1, 0x18, 0x13, 0xFE, 0x7F, 0xEF, 0xFE, 0x1F, 0x0C, 0xFA, 0x0F, 0x01,
+ 0xE0, 0x38, 0x0E, 0x03, 0xE0, 0x3E, 0x03, 0xE0, 0x3C, 0x03, 0x80, 0x70,
+ 0x0D, 0xC1, 0xBC, 0x43, 0xF0, 0x03, 0x80, 0xE0, 0x78, 0x3E, 0x17, 0x89,
+ 0xE2, 0x79, 0x1E, 0x87, 0xA1, 0xEF, 0xFF, 0xFF, 0xFF, 0xC1, 0xE0, 0x78,
+ 0x1E, 0x3F, 0xE7, 0xF8, 0xFF, 0x10, 0x04, 0x00, 0xF8, 0x1F, 0xC7, 0xFC,
+ 0x1F, 0xC0, 0x78, 0x07, 0x00, 0x60, 0x0D, 0xC1, 0x3C, 0x43, 0xF0, 0x00,
+ 0xE0, 0xF0, 0x38, 0x1E, 0x07, 0x80, 0xF0, 0x3F, 0xE7, 0x9E, 0xF1, 0xFE,
+ 0x3F, 0xC7, 0xF8, 0xF7, 0x1E, 0xE3, 0x8E, 0x60, 0xF8, 0x7F, 0xEF, 0xFD,
+ 0xFF, 0xA0, 0x68, 0x0C, 0x03, 0x80, 0x60, 0x0C, 0x03, 0x00, 0x60, 0x0C,
+ 0x03, 0x00, 0x60, 0x1C, 0x03, 0x00, 0x60, 0x1F, 0x0E, 0x73, 0x87, 0x70,
+ 0xEF, 0x1D, 0xF3, 0x1F, 0x81, 0xF8, 0x1F, 0xCC, 0xFB, 0x8F, 0xF0, 0xFE,
+ 0x1F, 0xC3, 0x9C, 0xF1, 0xF8, 0x1F, 0x06, 0x71, 0xC7, 0x78, 0xEF, 0x1F,
+ 0xE3, 0xFC, 0x7F, 0x8F, 0x79, 0xE7, 0xFC, 0x0F, 0x01, 0xC0, 0x78, 0x1C,
+ 0x0F, 0x07, 0x00, 0x6F, 0xF6, 0x00, 0x06, 0xFF, 0x60, 0x6F, 0xF6, 0x00,
+ 0x06, 0xFF, 0x71, 0x22, 0xC0, 0x00, 0x04, 0x00, 0x70, 0x07, 0xC0, 0xFC,
+ 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F,
+ 0x00, 0x1F, 0x00, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0x00, 0x03, 0x80, 0x0F,
+ 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x1F, 0x01, 0xF0,
+ 0x1F, 0x03, 0xF0, 0x3E, 0x00, 0xE0, 0x02, 0x00, 0x00, 0x3E, 0x11, 0xEC,
+ 0x3F, 0x8F, 0xE3, 0xC0, 0xF0, 0x78, 0x18, 0x08, 0x02, 0x00, 0x00, 0x00,
+ 0x1C, 0x07, 0x81, 0xE0, 0x30, 0x03, 0xF0, 0x0E, 0x18, 0x18, 0x04, 0x30,
+ 0x66, 0x70, 0xDB, 0x61, 0x99, 0xE3, 0x19, 0xE3, 0x31, 0xE6, 0x31, 0xE6,
+ 0x31, 0xE6, 0xF2, 0x66, 0xB2, 0x73, 0x3C, 0x38, 0x00, 0x1E, 0x04, 0x03,
+ 0xF8, 0x00, 0x80, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x3E, 0x00,
+ 0x1F, 0x00, 0x1B, 0xC0, 0x09, 0xE0, 0x0C, 0xF8, 0x04, 0x3C, 0x02, 0x1F,
+ 0x03, 0xFF, 0x81, 0x03, 0xC1, 0x80, 0xF0, 0x80, 0x7D, 0xF0, 0xFF, 0xFF,
+ 0xC0, 0xF3, 0xC3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xCE, 0x0F,
+ 0xF0, 0x3C, 0x70, 0xF0, 0xE3, 0xC3, 0xCF, 0x0F, 0x3C, 0x3C, 0xF0, 0xE3,
+ 0xC7, 0xBF, 0xF8, 0x07, 0xE2, 0x38, 0x7C, 0xE0, 0x3B, 0xC0, 0x37, 0x00,
+ 0x7E, 0x00, 0x7C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x03,
+ 0x80, 0x07, 0x80, 0x27, 0x00, 0xC7, 0x86, 0x03, 0xF0, 0xFF, 0xE0, 0x1E,
+ 0x1E, 0x0F, 0x07, 0x87, 0x81, 0xE3, 0xC0, 0xF1, 0xE0, 0x3C, 0xF0, 0x1E,
+ 0x78, 0x0F, 0x3C, 0x07, 0x9E, 0x03, 0xCF, 0x01, 0xE7, 0x80, 0xE3, 0xC0,
+ 0xF1, 0xE0, 0xF0, 0xF0, 0xE1, 0xFF, 0xC0, 0xFF, 0xFC, 0x78, 0x38, 0xF0,
+ 0x31, 0xE0, 0x23, 0xC4, 0x07, 0x88, 0x0F, 0x30, 0x1F, 0xE0, 0x3C, 0xC0,
+ 0x78, 0x80, 0xF1, 0x01, 0xE0, 0x23, 0xC0, 0x47, 0x81, 0x8F, 0x07, 0x7F,
+ 0xFE, 0xFF, 0xFC, 0xF0, 0x73, 0xC0, 0xCF, 0x01, 0x3C, 0x40, 0xF1, 0x03,
+ 0xCC, 0x0F, 0xF0, 0x3C, 0xC0, 0xF1, 0x03, 0xC4, 0x0F, 0x00, 0x3C, 0x00,
+ 0xF0, 0x03, 0xC0, 0x3F, 0xC0, 0x07, 0xE2, 0x1C, 0x3E, 0x38, 0x0E, 0x78,
+ 0x06, 0x70, 0x06, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0,
+ 0x7F, 0xF0, 0x1E, 0x70, 0x1E, 0x78, 0x1E, 0x38, 0x1E, 0x1E, 0x1E, 0x07,
+ 0xF0, 0xFE, 0xFF, 0x78, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0x78,
+ 0x3C, 0x78, 0x3C, 0x7F, 0xFC, 0x78, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0x78,
+ 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0xFE, 0xFF, 0xFF, 0x3C, 0x3C,
+ 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C,
+ 0xFF, 0x0F, 0xF0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0,
+ 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0xE3, 0xCE,
+ 0x38, 0xE3, 0x83, 0xE0, 0xFE, 0x7F, 0x3C, 0x0E, 0x1E, 0x04, 0x0F, 0x04,
+ 0x07, 0x84, 0x03, 0xCC, 0x01, 0xEE, 0x00, 0xFF, 0x00, 0x7F, 0xC0, 0x3C,
+ 0xF0, 0x1E, 0x7C, 0x0F, 0x1F, 0x07, 0x87, 0xC3, 0xC1, 0xF1, 0xE0, 0x7D,
+ 0xFC, 0xFF, 0xFE, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0,
+ 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x01, 0x78,
+ 0x0D, 0xE0, 0x67, 0x83, 0xBF, 0xFE, 0xFC, 0x01, 0xF3, 0xC0, 0x3E, 0x3E,
+ 0x03, 0xE2, 0xE0, 0x5E, 0x2F, 0x05, 0xE2, 0xF0, 0x5E, 0x27, 0x09, 0xE2,
+ 0x78, 0x9E, 0x23, 0x91, 0xE2, 0x3D, 0x1E, 0x23, 0xF1, 0xE2, 0x1E, 0x1E,
+ 0x21, 0xE1, 0xE2, 0x0C, 0x1E, 0x20, 0xC1, 0xEF, 0x88, 0x3F, 0xF8, 0x1E,
+ 0xF8, 0x18, 0xF8, 0x11, 0xF8, 0x22, 0xF8, 0x45, 0xF0, 0x89, 0xF1, 0x11,
+ 0xF2, 0x21, 0xF4, 0x41, 0xF8, 0x81, 0xF1, 0x01, 0xE2, 0x03, 0xC4, 0x03,
+ 0x8C, 0x03, 0x7C, 0x02, 0x07, 0xF0, 0x0F, 0x1E, 0x0E, 0x03, 0x8F, 0x01,
+ 0xE7, 0x00, 0x77, 0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8,
+ 0x03, 0xFC, 0x01, 0xEE, 0x00, 0xE7, 0x80, 0xF1, 0xC0, 0x70, 0x70, 0x70,
+ 0x0F, 0xE0, 0xFF, 0x87, 0x9E, 0x78, 0xF7, 0x8F, 0x78, 0xF7, 0x8F, 0x78,
+ 0xF7, 0x9E, 0x7F, 0x87, 0x80, 0x78, 0x07, 0x80, 0x78, 0x07, 0x80, 0x78,
+ 0x0F, 0xE0, 0x07, 0xF0, 0x0F, 0x1E, 0x0E, 0x07, 0x8F, 0x01, 0xE7, 0x00,
+ 0xF7, 0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC,
+ 0x01, 0xEE, 0x00, 0xE7, 0x00, 0xF1, 0xC0, 0x70, 0x70, 0x70, 0x1C, 0xF0,
+ 0x03, 0xE0, 0x01, 0xF8, 0x00, 0x3E, 0x00, 0x07, 0xE0, 0xFF, 0xE0, 0x3C,
+ 0x78, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x38, 0x3C,
+ 0x70, 0x3F, 0xC0, 0x3D, 0xE0, 0x3C, 0xF0, 0x3C, 0xF8, 0x3C, 0x78, 0x3C,
+ 0x3C, 0x3C, 0x3E, 0xFF, 0x1F, 0x1F, 0x27, 0x0E, 0x60, 0x6E, 0x06, 0xF0,
+ 0x2F, 0x80, 0x7F, 0x07, 0xFC, 0x1F, 0xE0, 0x7E, 0x01, 0xF8, 0x07, 0xC0,
+ 0x7C, 0x06, 0xF0, 0xC9, 0xF8, 0xFF, 0xFF, 0xC7, 0x9F, 0x0F, 0x1C, 0x1E,
+ 0x10, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80,
+ 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x07, 0xF8, 0xFE,
+ 0x1E, 0xF0, 0x09, 0xE0, 0x13, 0xC0, 0x27, 0x80, 0x4F, 0x00, 0x9E, 0x01,
+ 0x3C, 0x02, 0x78, 0x04, 0xF0, 0x09, 0xE0, 0x13, 0xC0, 0x27, 0x80, 0x47,
+ 0x81, 0x07, 0x84, 0x07, 0xF0, 0xFF, 0x0F, 0x9E, 0x03, 0x0F, 0x00, 0x83,
+ 0xC0, 0x81, 0xE0, 0x40, 0xF8, 0x60, 0x3C, 0x20, 0x1E, 0x10, 0x07, 0x90,
+ 0x03, 0xC8, 0x00, 0xF4, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x0E, 0x00, 0x07,
+ 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, 0xFE, 0x7F, 0x9E, 0xF8, 0x3C, 0x08,
+ 0xF0, 0x78, 0x31, 0xE0, 0xF0, 0x41, 0xE0, 0xF0, 0x83, 0xC3, 0xE3, 0x07,
+ 0x85, 0xC4, 0x07, 0x93, 0xC8, 0x0F, 0x27, 0xB0, 0x0E, 0x47, 0x40, 0x1F,
+ 0x0F, 0x80, 0x3E, 0x1F, 0x00, 0x38, 0x1C, 0x00, 0x70, 0x38, 0x00, 0xE0,
+ 0x30, 0x00, 0x80, 0x40, 0xFF, 0x9F, 0x9F, 0x07, 0x07, 0x83, 0x03, 0xE3,
+ 0x00, 0xF9, 0x00, 0x3D, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xE0, 0x00,
+ 0xF8, 0x00, 0xBE, 0x00, 0x8F, 0x00, 0x83, 0xC0, 0xC1, 0xF0, 0xE0, 0xFD,
+ 0xF8, 0xFF, 0xFF, 0x1F, 0x7C, 0x06, 0x3C, 0x04, 0x3E, 0x0C, 0x1E, 0x08,
+ 0x0F, 0x10, 0x0F, 0x30, 0x07, 0xA0, 0x07, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
+ 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x0F, 0xF0, 0x7F, 0xFC,
+ 0xE0, 0xF1, 0x83, 0xE2, 0x07, 0x84, 0x1E, 0x00, 0x7C, 0x00, 0xF0, 0x03,
+ 0xC0, 0x0F, 0x80, 0x1E, 0x00, 0x7C, 0x08, 0xF0, 0x13, 0xC0, 0x6F, 0x81,
+ 0x9E, 0x07, 0x7F, 0xFE, 0xFF, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE,
+ 0x73, 0x9C, 0xE7, 0x39, 0xF0, 0xC0, 0x60, 0x60, 0x60, 0x30, 0x30, 0x30,
+ 0x18, 0x18, 0x18, 0x0C, 0x0C, 0x0C, 0x06, 0x06, 0x06, 0x03, 0xF9, 0xCE,
+ 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCF, 0xF0, 0x0C,
+ 0x07, 0x81, 0xE0, 0xCC, 0x33, 0x18, 0x66, 0x1B, 0x87, 0xC0, 0xC0, 0xFF,
+ 0xF0, 0xC7, 0x1C, 0x30, 0x1F, 0x0E, 0x71, 0xCF, 0x39, 0xE0, 0x3C, 0x1F,
+ 0x8E, 0xF3, 0x9E, 0xF3, 0xDE, 0x79, 0xFF, 0x80, 0xF8, 0x07, 0x80, 0x78,
+ 0x07, 0x80, 0x78, 0x07, 0xB8, 0x7D, 0xE7, 0x8E, 0x78, 0xF7, 0x8F, 0x78,
+ 0xF7, 0x8F, 0x78, 0xF7, 0x8E, 0x79, 0xC4, 0x78, 0x1F, 0x1D, 0xDC, 0xFE,
+ 0x7F, 0x07, 0x83, 0xC1, 0xE0, 0x78, 0x3C, 0x47, 0xC0, 0x03, 0xE0, 0x1E,
+ 0x01, 0xE0, 0x1E, 0x01, 0xE1, 0xDE, 0x7B, 0xE7, 0x1E, 0xF1, 0xEF, 0x1E,
+ 0xF1, 0xEF, 0x1E, 0xF1, 0xE7, 0x1E, 0x7B, 0xE1, 0xDF, 0x1F, 0x0C, 0x67,
+ 0x1B, 0xC7, 0xFF, 0xFC, 0x0F, 0x03, 0xC0, 0x78, 0x4E, 0x21, 0xF0, 0x1E,
+ 0x3B, 0x7B, 0x78, 0x78, 0xFC, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
+ 0x78, 0x78, 0xFC, 0x3E, 0x0E, 0x7F, 0xCE, 0x79, 0xEF, 0x3C, 0xE7, 0x0F,
+ 0xC1, 0x00, 0x60, 0x1C, 0x03, 0xFE, 0x7F, 0xE3, 0xFF, 0x80, 0xF0, 0x33,
+ 0xFC, 0xF8, 0x07, 0x80, 0x78, 0x07, 0x80, 0x78, 0x07, 0xB8, 0x7D, 0xE7,
+ 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xEF,
+ 0xFF, 0x31, 0xE7, 0x8C, 0x03, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7,
+ 0xBF, 0x06, 0x0F, 0x0F, 0x06, 0x00, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
+ 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0xCF, 0xCE, 0x7C, 0xF8, 0x03,
+ 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0xF9, 0xE1, 0x8F, 0x10, 0x79,
+ 0x03, 0xD8, 0x1F, 0xE0, 0xF7, 0x87, 0x9E, 0x3C, 0x71, 0xE3, 0xDF, 0xBF,
+ 0xF9, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0xBF,
+ 0xFB, 0xCF, 0x0F, 0xBE, 0x79, 0xE7, 0x8F, 0x3C, 0xF1, 0xE7, 0x9E, 0x3C,
+ 0xF3, 0xC7, 0x9E, 0x78, 0xF3, 0xCF, 0x1E, 0x79, 0xE3, 0xCF, 0x3C, 0x7B,
+ 0xFF, 0xDF, 0x80, 0xFB, 0x87, 0xDE, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E,
+ 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0xFF, 0xF0, 0x1F, 0x07, 0x71, 0xC7,
+ 0x78, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0x71, 0xC7, 0x70, 0x7C, 0x00,
+ 0xFB, 0x87, 0xDE, 0x78, 0xE7, 0x8F, 0x78, 0xF7, 0x8F, 0x78, 0xF7, 0x8F,
+ 0x78, 0xE7, 0x9E, 0x7F, 0x87, 0x80, 0x78, 0x07, 0x80, 0x78, 0x0F, 0xC0,
+ 0x1E, 0x23, 0x9E, 0x71, 0xEF, 0x1E, 0xF1, 0xEF, 0x1E, 0xF1, 0xEF, 0x1E,
+ 0x71, 0xE7, 0x9E, 0x1F, 0xE0, 0x1E, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x3F,
+ 0xF9, 0xDF, 0xF7, 0xDD, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E,
+ 0x0F, 0xC0, 0x3D, 0x43, 0xC3, 0xE0, 0xFC, 0x7E, 0x1F, 0x87, 0x83, 0xC2,
+ 0xBC, 0x08, 0x18, 0x38, 0x78, 0xFC, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
+ 0x78, 0x78, 0x79, 0x3E, 0xFB, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7,
+ 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x3F, 0xF0, 0xFC, 0xEF, 0x08,
+ 0xE1, 0x1E, 0x41, 0xC8, 0x3D, 0x03, 0xC0, 0x78, 0x0E, 0x00, 0xC0, 0x10,
+ 0x00, 0xFD, 0xF7, 0xBC, 0x71, 0x9E, 0x38, 0x87, 0x1E, 0x43, 0xCF, 0x40,
+ 0xEB, 0xA0, 0x7C, 0xF0, 0x1C, 0x70, 0x0E, 0x38, 0x06, 0x08, 0x01, 0x04,
+ 0x00, 0xFC, 0xF7, 0x84, 0x3C, 0x81, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x80,
+ 0xBC, 0x13, 0xC2, 0x1E, 0xFB, 0xF0, 0xFC, 0xEF, 0x08, 0xE1, 0x1E, 0x43,
+ 0xC8, 0x3A, 0x07, 0xC0, 0x78, 0x0E, 0x01, 0xC0, 0x18, 0x02, 0x00, 0x41,
+ 0xC8, 0x3A, 0x03, 0x80, 0xFF, 0xB1, 0xE8, 0x70, 0x3C, 0x1E, 0x07, 0x83,
+ 0xC1, 0xE0, 0x78, 0xBC, 0x2F, 0xF8, 0x07, 0x0E, 0x1C, 0x1C, 0x1C, 0x1C,
+ 0x1C, 0x1C, 0x1C, 0x1C, 0xE0, 0x18, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
+ 0x1C, 0x1E, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xE0, 0x70, 0x38, 0x38,
+ 0x38, 0x38, 0x38, 0x38, 0x38, 0x18, 0x07, 0x38, 0x38, 0x38, 0x38, 0x38,
+ 0x38, 0x38, 0x38, 0x70, 0xE0, 0x70, 0x1F, 0x8B, 0x3F, 0x01, 0xC0 };
+
+const GFXglyph FreeSerifBold12pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 6, 0, 1 }, // 0x20 ' '
+ { 0, 4, 16, 8, 2, -15 }, // 0x21 '!'
+ { 8, 9, 7, 13, 2, -15 }, // 0x22 '"'
+ { 16, 12, 16, 12, 0, -15 }, // 0x23 '#'
+ { 40, 11, 20, 12, 1, -17 }, // 0x24 '$'
+ { 68, 18, 16, 24, 3, -15 }, // 0x25 '%'
+ { 104, 18, 16, 20, 1, -15 }, // 0x26 '&'
+ { 140, 3, 7, 7, 2, -15 }, // 0x27 '''
+ { 143, 6, 21, 8, 1, -16 }, // 0x28 '('
+ { 159, 6, 21, 8, 1, -16 }, // 0x29 ')'
+ { 175, 9, 10, 12, 2, -15 }, // 0x2A '*'
+ { 187, 12, 12, 16, 2, -11 }, // 0x2B '+'
+ { 205, 4, 8, 6, 1, -3 }, // 0x2C ','
+ { 209, 6, 3, 8, 1, -6 }, // 0x2D '-'
+ { 212, 4, 4, 6, 1, -3 }, // 0x2E '.'
+ { 214, 8, 17, 7, -1, -15 }, // 0x2F '/'
+ { 231, 11, 16, 12, 1, -15 }, // 0x30 '0'
+ { 253, 9, 16, 12, 1, -15 }, // 0x31 '1'
+ { 271, 12, 16, 12, 0, -15 }, // 0x32 '2'
+ { 295, 11, 16, 12, 1, -15 }, // 0x33 '3'
+ { 317, 10, 16, 12, 1, -15 }, // 0x34 '4'
+ { 337, 11, 16, 12, 1, -15 }, // 0x35 '5'
+ { 359, 11, 16, 12, 1, -15 }, // 0x36 '6'
+ { 381, 11, 16, 12, 0, -15 }, // 0x37 '7'
+ { 403, 11, 16, 12, 1, -15 }, // 0x38 '8'
+ { 425, 11, 16, 12, 1, -15 }, // 0x39 '9'
+ { 447, 4, 11, 8, 2, -10 }, // 0x3A ':'
+ { 453, 4, 15, 8, 2, -10 }, // 0x3B ';'
+ { 461, 14, 14, 16, 1, -12 }, // 0x3C '<'
+ { 486, 14, 8, 16, 1, -9 }, // 0x3D '='
+ { 500, 14, 14, 16, 1, -12 }, // 0x3E '>'
+ { 525, 10, 16, 12, 1, -15 }, // 0x3F '?'
+ { 545, 16, 16, 22, 3, -15 }, // 0x40 '@'
+ { 577, 17, 16, 17, 0, -15 }, // 0x41 'A'
+ { 611, 14, 16, 16, 1, -15 }, // 0x42 'B'
+ { 639, 15, 16, 17, 1, -15 }, // 0x43 'C'
+ { 669, 17, 16, 18, 0, -15 }, // 0x44 'D'
+ { 703, 15, 16, 16, 1, -15 }, // 0x45 'E'
+ { 733, 14, 16, 15, 1, -15 }, // 0x46 'F'
+ { 761, 16, 16, 19, 1, -15 }, // 0x47 'G'
+ { 793, 16, 16, 19, 2, -15 }, // 0x48 'H'
+ { 825, 8, 16, 9, 1, -15 }, // 0x49 'I'
+ { 841, 12, 18, 12, 0, -15 }, // 0x4A 'J'
+ { 868, 17, 16, 19, 2, -15 }, // 0x4B 'K'
+ { 902, 14, 16, 16, 2, -15 }, // 0x4C 'L'
+ { 930, 20, 16, 23, 1, -15 }, // 0x4D 'M'
+ { 970, 15, 16, 17, 1, -15 }, // 0x4E 'N'
+ { 1000, 17, 16, 19, 1, -15 }, // 0x4F 'O'
+ { 1034, 12, 16, 15, 2, -15 }, // 0x50 'P'
+ { 1058, 17, 20, 19, 1, -15 }, // 0x51 'Q'
+ { 1101, 16, 16, 17, 1, -15 }, // 0x52 'R'
+ { 1133, 12, 16, 14, 1, -15 }, // 0x53 'S'
+ { 1157, 15, 16, 15, 0, -15 }, // 0x54 'T'
+ { 1187, 15, 16, 17, 1, -15 }, // 0x55 'U'
+ { 1217, 17, 17, 17, 0, -15 }, // 0x56 'V'
+ { 1254, 23, 16, 24, 0, -15 }, // 0x57 'W'
+ { 1300, 17, 16, 17, 0, -15 }, // 0x58 'X'
+ { 1334, 16, 16, 17, 1, -15 }, // 0x59 'Y'
+ { 1366, 15, 16, 16, 0, -15 }, // 0x5A 'Z'
+ { 1396, 5, 20, 8, 2, -15 }, // 0x5B '['
+ { 1409, 8, 17, 7, -1, -15 }, // 0x5C '\'
+ { 1426, 5, 20, 8, 2, -15 }, // 0x5D ']'
+ { 1439, 10, 9, 14, 2, -15 }, // 0x5E '^'
+ { 1451, 12, 1, 12, 0, 4 }, // 0x5F '_'
+ { 1453, 5, 4, 8, 0, -16 }, // 0x60 '`'
+ { 1456, 11, 11, 12, 1, -10 }, // 0x61 'a'
+ { 1472, 12, 16, 13, 1, -15 }, // 0x62 'b'
+ { 1496, 9, 11, 10, 1, -10 }, // 0x63 'c'
+ { 1509, 12, 16, 13, 1, -15 }, // 0x64 'd'
+ { 1533, 10, 11, 11, 1, -10 }, // 0x65 'e'
+ { 1547, 8, 16, 9, 1, -15 }, // 0x66 'f'
+ { 1563, 11, 16, 12, 1, -10 }, // 0x67 'g'
+ { 1585, 12, 16, 13, 1, -15 }, // 0x68 'h'
+ { 1609, 6, 16, 7, 1, -15 }, // 0x69 'i'
+ { 1621, 8, 21, 10, 0, -15 }, // 0x6A 'j'
+ { 1642, 13, 16, 13, 1, -15 }, // 0x6B 'k'
+ { 1668, 6, 16, 7, 1, -15 }, // 0x6C 'l'
+ { 1680, 19, 11, 20, 1, -10 }, // 0x6D 'm'
+ { 1707, 12, 11, 13, 1, -10 }, // 0x6E 'n'
+ { 1724, 11, 11, 12, 1, -10 }, // 0x6F 'o'
+ { 1740, 12, 16, 13, 1, -10 }, // 0x70 'p'
+ { 1764, 12, 16, 13, 1, -10 }, // 0x71 'q'
+ { 1788, 10, 11, 10, 1, -10 }, // 0x72 'r'
+ { 1802, 8, 11, 10, 1, -10 }, // 0x73 's'
+ { 1813, 8, 15, 8, 1, -14 }, // 0x74 't'
+ { 1828, 12, 11, 14, 1, -10 }, // 0x75 'u'
+ { 1845, 11, 11, 12, 0, -10 }, // 0x76 'v'
+ { 1861, 17, 11, 17, 0, -10 }, // 0x77 'w'
+ { 1885, 12, 11, 12, 0, -10 }, // 0x78 'x'
+ { 1902, 11, 16, 12, 0, -10 }, // 0x79 'y'
+ { 1924, 10, 11, 11, 1, -10 }, // 0x7A 'z'
+ { 1938, 8, 21, 9, 0, -16 }, // 0x7B '{'
+ { 1959, 2, 17, 5, 2, -15 }, // 0x7C '|'
+ { 1964, 8, 21, 9, 2, -16 }, // 0x7D '}'
+ { 1985, 11, 4, 12, 1, -7 } }; // 0x7E '~'
+
+const GFXfont FreeSerifBold12pt7b PROGMEM = {
+ (uint8_t *)FreeSerifBold12pt7bBitmaps,
+ (GFXglyph *)FreeSerifBold12pt7bGlyphs,
+ 0x20, 0x7E, 29 };
+
+// Approx. 2663 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBold18pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBold18pt7b.h
new file mode 100644
index 000000000000..11d3c7ea2de4
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBold18pt7b.h
@@ -0,0 +1,462 @@
+const uint8_t FreeSerifBold18pt7bBitmaps[] PROGMEM = {
+ 0x7B, 0xEF, 0xFF, 0xFF, 0xF7, 0x9E, 0x71, 0xC7, 0x0C, 0x20, 0x82, 0x00,
+ 0x00, 0x07, 0x3E, 0xFF, 0xFF, 0xDC, 0x60, 0x37, 0x83, 0xFC, 0x1F, 0xE0,
+ 0xFF, 0x07, 0xB8, 0x3D, 0xC0, 0xCC, 0x06, 0x20, 0x31, 0x01, 0x80, 0x03,
+ 0x8E, 0x00, 0xC3, 0x80, 0x30, 0xE0, 0x1C, 0x38, 0x07, 0x0E, 0x01, 0xC3,
+ 0x87, 0xFF, 0xFD, 0xFF, 0xFF, 0x7F, 0xFF, 0xC1, 0x87, 0x00, 0xE1, 0xC0,
+ 0x38, 0x70, 0x0E, 0x1C, 0x03, 0x86, 0x0F, 0xFF, 0xF3, 0xFF, 0xFC, 0xFF,
+ 0xFF, 0x07, 0x0E, 0x01, 0xC3, 0x80, 0x70, 0xE0, 0x1C, 0x30, 0x07, 0x0C,
+ 0x01, 0x87, 0x00, 0x61, 0xC0, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0xFF,
+ 0x03, 0x27, 0x8C, 0x47, 0x38, 0x86, 0x71, 0x0C, 0xF2, 0x09, 0xF4, 0x03,
+ 0xF8, 0x03, 0xF8, 0x07, 0xFC, 0x03, 0xFC, 0x03, 0xFE, 0x01, 0xFE, 0x03,
+ 0xFC, 0x04, 0xFC, 0x08, 0xFA, 0x10, 0xF4, 0x21, 0xEC, 0x43, 0xD8, 0x8F,
+ 0x3D, 0x3C, 0x3F, 0xF0, 0x1F, 0x00, 0x08, 0x00, 0x10, 0x00, 0x03, 0xC0,
+ 0x18, 0x01, 0xFE, 0x0F, 0x00, 0x7C, 0xFF, 0xC0, 0x1F, 0x0F, 0x90, 0x07,
+ 0xC1, 0x06, 0x00, 0xF0, 0x21, 0x80, 0x3E, 0x04, 0x30, 0x07, 0x81, 0x8C,
+ 0x00, 0xF0, 0x21, 0x80, 0x1E, 0x0C, 0x60, 0x03, 0xC1, 0x18, 0x1E, 0x3C,
+ 0xE3, 0x0F, 0xE7, 0xF8, 0xC3, 0xE6, 0x3C, 0x18, 0xF8, 0x40, 0x06, 0x3E,
+ 0x08, 0x01, 0x87, 0x81, 0x00, 0x31, 0xF0, 0x20, 0x0C, 0x3E, 0x04, 0x01,
+ 0x87, 0x81, 0x00, 0x60, 0xF0, 0x60, 0x18, 0x1E, 0x08, 0x03, 0x03, 0xC7,
+ 0x00, 0xC0, 0x3F, 0xC0, 0x18, 0x03, 0xE0, 0x00, 0x7E, 0x00, 0x00, 0x7F,
+ 0xE0, 0x00, 0x38, 0xF8, 0x00, 0x1E, 0x1F, 0x00, 0x07, 0x83, 0xC0, 0x01,
+ 0xF0, 0xF0, 0x00, 0x7C, 0x38, 0x00, 0x1F, 0x9C, 0x00, 0x03, 0xFC, 0x00,
+ 0x00, 0xFE, 0x0F, 0xF0, 0x3F, 0x80, 0xF0, 0x1F, 0xF0, 0x18, 0x1C, 0xFE,
+ 0x0C, 0x0E, 0x1F, 0xC3, 0x07, 0x87, 0xF1, 0x81, 0xE0, 0xFE, 0x40, 0xF8,
+ 0x1F, 0xF0, 0x3F, 0x07, 0xF8, 0x0F, 0xC0, 0xFE, 0x03, 0xF8, 0x1F, 0xC0,
+ 0xFE, 0x07, 0xF8, 0x9F, 0xE3, 0xFF, 0xE7, 0xFF, 0x9F, 0xF0, 0xFF, 0xC3,
+ 0xF8, 0x0F, 0x80, 0x3C, 0x00, 0x6F, 0xFF, 0xFF, 0x66, 0x66, 0x00, 0x81,
+ 0x81, 0x81, 0x81, 0x80, 0xC0, 0xE0, 0x70, 0x70, 0x38, 0x3C, 0x1E, 0x0F,
+ 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x0E, 0x07, 0x03, 0x80, 0xE0,
+ 0x70, 0x18, 0x06, 0x01, 0x00, 0x40, 0x10, 0x04, 0x80, 0x30, 0x0C, 0x03,
+ 0x00, 0xC0, 0x60, 0x38, 0x1C, 0x07, 0x03, 0x81, 0xC0, 0xF0, 0x78, 0x3C,
+ 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xE0, 0x70, 0x38, 0x38, 0x1C, 0x0C,
+ 0x0C, 0x06, 0x04, 0x04, 0x04, 0x00, 0x03, 0x00, 0x1E, 0x00, 0x78, 0x1D,
+ 0xE6, 0xFB, 0x3D, 0xED, 0xF3, 0xFF, 0x01, 0xC0, 0x7F, 0xF3, 0xED, 0xFF,
+ 0x33, 0xD9, 0xE6, 0x07, 0x80, 0x1E, 0x00, 0x30, 0x00, 0x00, 0xE0, 0x00,
+ 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00,
+ 0x38, 0x00, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80,
+ 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00,
+ 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x73, 0xEF, 0xFF, 0xFD, 0xF0,
+ 0xC2, 0x18, 0xC6, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0x7B, 0xFF, 0xFF, 0xFD,
+ 0xE0, 0x00, 0xE0, 0x3C, 0x07, 0x00, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x1C,
+ 0x07, 0x00, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x1C,
+ 0x07, 0x00, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x00,
+ 0x03, 0xC0, 0x0E, 0x70, 0x1E, 0x78, 0x3C, 0x3C, 0x3C, 0x3C, 0x7C, 0x3E,
+ 0x7C, 0x3E, 0x7C, 0x3E, 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F,
+ 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3E, 0x7C, 0x3E,
+ 0x7C, 0x3E, 0x3C, 0x3C, 0x3C, 0x3C, 0x1E, 0x78, 0x0E, 0x70, 0x03, 0xC0,
+ 0x00, 0xC0, 0x3C, 0x0F, 0xC3, 0xFC, 0x4F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC,
+ 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC,
+ 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x1F, 0xEF, 0xFF,
+ 0x03, 0xE0, 0x0F, 0xF8, 0x1F, 0xFC, 0x3F, 0xFC, 0x30, 0xFE, 0x60, 0x7E,
+ 0x40, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x78,
+ 0x00, 0x70, 0x00, 0xE0, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x06, 0x01,
+ 0x0C, 0x03, 0x1F, 0xFF, 0x1F, 0xFF, 0x3F, 0xFE, 0x7F, 0xFE, 0xFF, 0xFE,
+ 0x03, 0xF0, 0x0F, 0xF8, 0x3F, 0xFC, 0x21, 0xFE, 0x40, 0xFE, 0x00, 0x7E,
+ 0x00, 0x7E, 0x00, 0x7C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xFC, 0x03, 0xFE,
+ 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F,
+ 0x00, 0x0E, 0x70, 0x0E, 0xFC, 0x1C, 0xFE, 0x38, 0x7F, 0xE0, 0x3F, 0x80,
+ 0x00, 0x38, 0x00, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x1F, 0x80, 0x5F, 0x00,
+ 0xBE, 0x02, 0x7C, 0x08, 0xF8, 0x31, 0xF0, 0x43, 0xE1, 0x07, 0xC4, 0x0F,
+ 0x88, 0x1F, 0x20, 0x3E, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
+ 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x0F, 0xFE, 0x1F,
+ 0xF8, 0x7F, 0xF0, 0xFF, 0xE1, 0x80, 0x03, 0x00, 0x0C, 0x00, 0x18, 0x00,
+ 0x3F, 0x80, 0xFF, 0xC1, 0xFF, 0xC3, 0xFF, 0xC3, 0xFF, 0x80, 0x3F, 0x80,
+ 0x0F, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x37, 0x80, 0x4F, 0x81,
+ 0x9F, 0xC6, 0x3F, 0xF8, 0x1F, 0x80, 0x00, 0x07, 0x00, 0x7C, 0x01, 0xF0,
+ 0x03, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0x7E, 0x00,
+ 0x7F, 0xF0, 0x7F, 0xFC, 0xFC, 0x7E, 0xFC, 0x7E, 0xFC, 0x3F, 0xFC, 0x3F,
+ 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F, 0x7C, 0x3F, 0x7C, 0x3E, 0x3C, 0x3E,
+ 0x3E, 0x3C, 0x1E, 0x78, 0x07, 0xE0, 0x7F, 0xFF, 0x7F, 0xFE, 0x7F, 0xFE,
+ 0xFF, 0xFE, 0xFF, 0xFC, 0xC0, 0x1C, 0x80, 0x18, 0x80, 0x38, 0x00, 0x38,
+ 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0,
+ 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x03, 0x80, 0x03, 0x80, 0x07, 0x80,
+ 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0F, 0xE0, 0x38, 0x78, 0x70, 0x3C,
+ 0xF0, 0x1E, 0xF0, 0x1E, 0xF8, 0x1E, 0xF8, 0x1E, 0xFE, 0x3C, 0x7F, 0xB0,
+ 0x7F, 0xE0, 0x3F, 0xF0, 0x0F, 0xF8, 0x1F, 0xFC, 0x39, 0xFE, 0x70, 0xFF,
+ 0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0x1F, 0xF0, 0x1F, 0xF0, 0x1E, 0x78, 0x3E,
+ 0x7C, 0x7C, 0x3F, 0xF8, 0x0F, 0xE0, 0x07, 0xE0, 0x1E, 0x78, 0x3C, 0x7C,
+ 0x7C, 0x3C, 0x7C, 0x3E, 0xFC, 0x3E, 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F,
+ 0xFC, 0x3F, 0xFC, 0x3F, 0x7E, 0x3F, 0x7E, 0x3F, 0x3F, 0xFE, 0x0F, 0xFE,
+ 0x00, 0x7E, 0x00, 0x7C, 0x00, 0xF8, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xC0,
+ 0x0F, 0x80, 0x3E, 0x00, 0xE0, 0x00, 0x7B, 0xFF, 0xFF, 0xFD, 0xE0, 0x00,
+ 0x00, 0x07, 0xBF, 0xFF, 0xFF, 0xDE, 0x39, 0xFB, 0xF7, 0xEF, 0xC7, 0x00,
+ 0x00, 0x00, 0x01, 0xE7, 0xEF, 0xFF, 0xFF, 0xBF, 0x06, 0x08, 0x30, 0xC2,
+ 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0F, 0x80, 0x07, 0xF0,
+ 0x03, 0xFC, 0x01, 0xFE, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x1F,
+ 0xC0, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00,
+ 0x3F, 0x80, 0x01, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0x7C, 0x00, 0x01, 0x80,
+ 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x18, 0x00, 0x03,
+ 0xE0, 0x00, 0x7F, 0x00, 0x07, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00,
+ 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x1F, 0xC0,
+ 0x0F, 0xE0, 0x07, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x00, 0xFE, 0x00, 0x1F,
+ 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0xFF, 0xC7, 0x1F,
+ 0xB8, 0x3E, 0xF0, 0xFF, 0xC3, 0xFF, 0x0F, 0xD8, 0x3F, 0x00, 0xF8, 0x07,
+ 0xC0, 0x1E, 0x00, 0x60, 0x03, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x00,
+ 0x00, 0x00, 0x00, 0x70, 0x03, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xF8, 0x01,
+ 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFF, 0xE0, 0x07, 0xC0, 0xF0, 0x0F, 0x00,
+ 0x38, 0x1E, 0x00, 0x0C, 0x3C, 0x07, 0x06, 0x38, 0x1F, 0x72, 0x78, 0x3C,
+ 0xF3, 0x78, 0x78, 0xE1, 0xF0, 0x70, 0xE1, 0xF0, 0xF0, 0xE1, 0xF0, 0xE0,
+ 0xC1, 0xF1, 0xE1, 0xC1, 0xF1, 0xC1, 0xC1, 0xF1, 0xC3, 0x82, 0xF1, 0xC3,
+ 0x86, 0x71, 0xC7, 0x8C, 0x79, 0xFB, 0xF8, 0x78, 0xF1, 0xF0, 0x3C, 0x00,
+ 0x00, 0x1E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0xC0, 0x78, 0x03, 0xFF,
+ 0xE0, 0x00, 0x7F, 0x80, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38,
+ 0x00, 0x00, 0x78, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFE,
+ 0x00, 0x00, 0xFE, 0x00, 0x01, 0xBF, 0x00, 0x01, 0xBF, 0x00, 0x01, 0x1F,
+ 0x00, 0x03, 0x1F, 0x80, 0x02, 0x1F, 0x80, 0x06, 0x0F, 0xC0, 0x06, 0x0F,
+ 0xC0, 0x04, 0x07, 0xE0, 0x0F, 0xFF, 0xE0, 0x0F, 0xFF, 0xE0, 0x18, 0x03,
+ 0xF0, 0x18, 0x03, 0xF0, 0x30, 0x01, 0xF8, 0x30, 0x01, 0xF8, 0x70, 0x01,
+ 0xFC, 0xFE, 0x0F, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xFE, 0x0F, 0xE1, 0xF8,
+ 0x3F, 0x07, 0xC1, 0xF8, 0x3F, 0x0F, 0xC1, 0xF8, 0x7E, 0x0F, 0xC3, 0xF0,
+ 0x7E, 0x1F, 0x87, 0xE0, 0xFC, 0x7C, 0x07, 0xFF, 0x00, 0x3F, 0xFF, 0x01,
+ 0xF8, 0xFE, 0x0F, 0xC1, 0xF8, 0x7E, 0x0F, 0xC3, 0xF0, 0x3F, 0x1F, 0x81,
+ 0xF8, 0xFC, 0x0F, 0xC7, 0xE0, 0x7E, 0x3F, 0x03, 0xF1, 0xF8, 0x3F, 0x0F,
+ 0xC3, 0xF0, 0xFF, 0xFF, 0x1F, 0xFF, 0xC0, 0x00, 0x7E, 0x04, 0x07, 0xFF,
+ 0x18, 0x1F, 0x07, 0xF0, 0x7C, 0x03, 0xE1, 0xF0, 0x03, 0xC7, 0xC0, 0x03,
+ 0x9F, 0x80, 0x03, 0x3F, 0x00, 0x06, 0x7C, 0x00, 0x05, 0xF8, 0x00, 0x03,
+ 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F,
+ 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8,
+ 0x00, 0x01, 0xF0, 0x00, 0x23, 0xF0, 0x00, 0xC3, 0xF0, 0x07, 0x03, 0xF0,
+ 0x3C, 0x01, 0xFF, 0xE0, 0x00, 0xFF, 0x00, 0xFF, 0xFE, 0x00, 0x7F, 0xFF,
+ 0x00, 0x7E, 0x1F, 0x80, 0xFC, 0x1F, 0x81, 0xF8, 0x1F, 0x83, 0xF0, 0x1F,
+ 0x07, 0xE0, 0x3F, 0x0F, 0xC0, 0x7E, 0x1F, 0x80, 0x7E, 0x3F, 0x00, 0xFC,
+ 0x7E, 0x01, 0xF8, 0xFC, 0x03, 0xF1, 0xF8, 0x07, 0xE3, 0xF0, 0x0F, 0xC7,
+ 0xE0, 0x1F, 0x8F, 0xC0, 0x3F, 0x1F, 0x80, 0x7C, 0x3F, 0x01, 0xF8, 0x7E,
+ 0x03, 0xE0, 0xFC, 0x0F, 0x81, 0xF8, 0x1F, 0x03, 0xF0, 0xFC, 0x0F, 0xFF,
+ 0xE0, 0x7F, 0xFF, 0x00, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0x0F, 0xC0, 0x78,
+ 0x7E, 0x01, 0xC3, 0xF0, 0x06, 0x1F, 0x80, 0x10, 0xFC, 0x10, 0x87, 0xE0,
+ 0x80, 0x3F, 0x0C, 0x01, 0xF8, 0xE0, 0x0F, 0xFF, 0x00, 0x7F, 0xF8, 0x03,
+ 0xF1, 0xC0, 0x1F, 0x86, 0x00, 0xFC, 0x10, 0x07, 0xE0, 0x80, 0x3F, 0x00,
+ 0x09, 0xF8, 0x00, 0xCF, 0xC0, 0x0C, 0x7E, 0x00, 0x63, 0xF0, 0x0F, 0x1F,
+ 0x81, 0xFB, 0xFF, 0xFF, 0xDF, 0xFF, 0xFC, 0xFF, 0xFF, 0xEF, 0xFF, 0xFC,
+ 0xFC, 0x0F, 0x9F, 0x80, 0x73, 0xF0, 0x06, 0x7E, 0x00, 0x4F, 0xC1, 0x09,
+ 0xF8, 0x20, 0x3F, 0x0C, 0x07, 0xE3, 0x80, 0xFF, 0xF0, 0x1F, 0xFE, 0x03,
+ 0xF1, 0xC0, 0x7E, 0x18, 0x0F, 0xC1, 0x01, 0xF8, 0x20, 0x3F, 0x00, 0x07,
+ 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x1F,
+ 0xE0, 0x07, 0xFF, 0x00, 0x00, 0x7E, 0x02, 0x01, 0xFF, 0xE3, 0x01, 0xF0,
+ 0x3F, 0x81, 0xF0, 0x07, 0xC1, 0xF0, 0x01, 0xE1, 0xF0, 0x00, 0x71, 0xF8,
+ 0x00, 0x18, 0xFC, 0x00, 0x0C, 0x7C, 0x00, 0x02, 0x7E, 0x00, 0x00, 0x3F,
+ 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03,
+ 0xF0, 0x0F, 0xFF, 0xF8, 0x01, 0xFE, 0x7C, 0x00, 0x7E, 0x3F, 0x00, 0x3F,
+ 0x1F, 0x80, 0x1F, 0x87, 0xC0, 0x0F, 0xC1, 0xF0, 0x07, 0xE0, 0xFC, 0x03,
+ 0xF0, 0x1F, 0x83, 0xF0, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0x80, 0x00, 0xFF,
+ 0xC3, 0xFF, 0x7F, 0x81, 0xFE, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F,
+ 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F,
+ 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x3F,
+ 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F,
+ 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F,
+ 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x7F, 0x81, 0xFE, 0xFF, 0xC3, 0xFF, 0xFF,
+ 0xEF, 0xF0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07,
+ 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0,
+ 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x1F, 0xE7, 0xFF, 0x07, 0xFF, 0x01, 0xFE,
+ 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC,
+ 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC,
+ 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC,
+ 0x70, 0xFC, 0xF8, 0xFC, 0xF8, 0xF8, 0xF0, 0xF8, 0x71, 0xF0, 0x7F, 0xE0,
+ 0x1F, 0x80, 0xFF, 0xC3, 0xFF, 0x3F, 0xC0, 0x3E, 0x0F, 0xC0, 0x1C, 0x07,
+ 0xE0, 0x18, 0x03, 0xF0, 0x18, 0x01, 0xF8, 0x18, 0x00, 0xFC, 0x18, 0x00,
+ 0x7E, 0x18, 0x00, 0x3F, 0x18, 0x00, 0x1F, 0x9C, 0x00, 0x0F, 0xDF, 0x00,
+ 0x07, 0xFF, 0xC0, 0x03, 0xFF, 0xF0, 0x01, 0xF9, 0xF8, 0x00, 0xFC, 0xFE,
+ 0x00, 0x7E, 0x3F, 0x80, 0x3F, 0x0F, 0xE0, 0x1F, 0x83, 0xF8, 0x0F, 0xC0,
+ 0xFC, 0x07, 0xE0, 0x7F, 0x03, 0xF0, 0x1F, 0xC1, 0xF8, 0x07, 0xF1, 0xFE,
+ 0x03, 0xFD, 0xFF, 0x8F, 0xFF, 0xFF, 0xE0, 0x03, 0xFC, 0x00, 0x0F, 0xC0,
+ 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07,
+ 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00,
+ 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x01, 0x3F,
+ 0x00, 0x19, 0xF8, 0x00, 0xCF, 0xC0, 0x0C, 0x7E, 0x00, 0x63, 0xF0, 0x0F,
+ 0x1F, 0x81, 0xFB, 0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFF, 0x80, 0x03, 0xFE,
+ 0x7F, 0x00, 0x07, 0xF8, 0x7E, 0x00, 0x0F, 0xE0, 0xFE, 0x00, 0x3F, 0xC1,
+ 0x7C, 0x00, 0x5F, 0x82, 0xFC, 0x01, 0xBF, 0x05, 0xF8, 0x02, 0x7E, 0x09,
+ 0xF8, 0x0C, 0xFC, 0x13, 0xF0, 0x11, 0xF8, 0x23, 0xE0, 0x23, 0xF0, 0x47,
+ 0xE0, 0xC7, 0xE0, 0x87, 0xC1, 0x0F, 0xC1, 0x0F, 0xC6, 0x1F, 0x82, 0x0F,
+ 0x88, 0x3F, 0x04, 0x1F, 0xB0, 0x7E, 0x08, 0x3F, 0x60, 0xFC, 0x10, 0x3E,
+ 0x81, 0xF8, 0x20, 0x7F, 0x03, 0xF0, 0x40, 0x7C, 0x07, 0xE0, 0x80, 0xF8,
+ 0x0F, 0xC1, 0x00, 0xE0, 0x1F, 0x82, 0x01, 0xC0, 0x3F, 0x0E, 0x03, 0x80,
+ 0xFF, 0x7F, 0x82, 0x03, 0xFF, 0xFE, 0x00, 0xFE, 0xFE, 0x00, 0x70, 0xFE,
+ 0x00, 0x40, 0xFE, 0x00, 0x81, 0xFC, 0x01, 0x03, 0xFC, 0x02, 0x05, 0xFC,
+ 0x04, 0x09, 0xFC, 0x08, 0x11, 0xFC, 0x10, 0x23, 0xF8, 0x20, 0x43, 0xF8,
+ 0x40, 0x83, 0xF8, 0x81, 0x03, 0xF9, 0x02, 0x03, 0xFA, 0x04, 0x03, 0xF4,
+ 0x08, 0x07, 0xF8, 0x10, 0x07, 0xF0, 0x20, 0x07, 0xE0, 0x40, 0x07, 0xC0,
+ 0x80, 0x07, 0x81, 0x00, 0x0F, 0x02, 0x00, 0x0E, 0x0E, 0x00, 0x0C, 0x7F,
+ 0x00, 0x08, 0x00, 0x7F, 0x00, 0x01, 0xFF, 0xF0, 0x01, 0xF0, 0x7C, 0x01,
+ 0xF0, 0x1F, 0x01, 0xF0, 0x07, 0xC1, 0xF0, 0x01, 0xF1, 0xF8, 0x00, 0xFC,
+ 0xFC, 0x00, 0x7E, 0x7C, 0x00, 0x1F, 0x7E, 0x00, 0x0F, 0xFF, 0x00, 0x07,
+ 0xFF, 0x80, 0x03, 0xFF, 0xC0, 0x01, 0xFF, 0xE0, 0x00, 0xFF, 0xF0, 0x00,
+ 0x7F, 0xF8, 0x00, 0x3F, 0x7C, 0x00, 0x1F, 0x3E, 0x00, 0x1F, 0x9F, 0x80,
+ 0x0F, 0xC7, 0xC0, 0x07, 0xC1, 0xF0, 0x07, 0xC0, 0xFC, 0x07, 0xE0, 0x3F,
+ 0x07, 0xC0, 0x07, 0xFF, 0xC0, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0xFC, 0x0F,
+ 0xFF, 0xE0, 0xFC, 0x7E, 0x1F, 0x87, 0xE3, 0xF0, 0x7E, 0x7E, 0x0F, 0xCF,
+ 0xC1, 0xF9, 0xF8, 0x3F, 0x3F, 0x07, 0xE7, 0xE0, 0xFC, 0xFC, 0x3F, 0x1F,
+ 0x8F, 0xC3, 0xFF, 0xF0, 0x7F, 0xF8, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F,
+ 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E,
+ 0x00, 0x1F, 0xE0, 0x07, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x01, 0xFF, 0xF0,
+ 0x01, 0xF0, 0x7C, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x07, 0xC1, 0xF0, 0x01,
+ 0xF1, 0xF8, 0x00, 0xFC, 0xFC, 0x00, 0x7E, 0x7C, 0x00, 0x1F, 0x7E, 0x00,
+ 0x0F, 0xFF, 0x00, 0x07, 0xFF, 0x80, 0x03, 0xFF, 0xC0, 0x01, 0xFF, 0xE0,
+ 0x00, 0xFF, 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0x7C, 0x00, 0x1F, 0x3E,
+ 0x00, 0x0F, 0x9F, 0x80, 0x0F, 0xC7, 0xC0, 0x07, 0xC1, 0xF0, 0x07, 0xC0,
+ 0x78, 0x03, 0xC0, 0x1E, 0x07, 0xC0, 0x03, 0xFF, 0x80, 0x00, 0x7F, 0x00,
+ 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF,
+ 0xF8, 0x00, 0x0F, 0xE0, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0x00, 0xFC, 0x3F,
+ 0x01, 0xF8, 0x3F, 0x03, 0xF0, 0x3F, 0x07, 0xE0, 0x7E, 0x0F, 0xC0, 0xFC,
+ 0x1F, 0x81, 0xF8, 0x3F, 0x03, 0xF0, 0x7E, 0x07, 0xC0, 0xFC, 0x1F, 0x81,
+ 0xF8, 0x7E, 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xC0, 0x0F, 0xDF, 0xC0, 0x1F,
+ 0x9F, 0x80, 0x3F, 0x1F, 0x80, 0x7E, 0x3F, 0x80, 0xFC, 0x3F, 0x81, 0xF8,
+ 0x3F, 0x03, 0xF0, 0x7F, 0x07, 0xE0, 0x7F, 0x1F, 0xE0, 0x7F, 0x7F, 0xE0,
+ 0xFF, 0x07, 0xC2, 0x1F, 0xF2, 0x3C, 0x3E, 0x70, 0x0E, 0xF0, 0x06, 0xF0,
+ 0x06, 0xF0, 0x02, 0xF8, 0x00, 0xFE, 0x00, 0xFF, 0x80, 0x7F, 0xE0, 0x3F,
+ 0xF8, 0x1F, 0xFC, 0x0F, 0xFE, 0x03, 0xFE, 0x00, 0xFF, 0x00, 0x3F, 0x80,
+ 0x1F, 0xC0, 0x0F, 0xC0, 0x0F, 0xE0, 0x0E, 0xF0, 0x1E, 0xF8, 0x3C, 0x9F,
+ 0xF8, 0x87, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7E, 0x3F, 0x83,
+ 0xF0, 0x7C, 0x1F, 0x81, 0xC0, 0xFC, 0x06, 0x07, 0xE0, 0x20, 0x3F, 0x00,
+ 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F,
+ 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00,
+ 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC,
+ 0x00, 0x0F, 0xF0, 0x01, 0xFF, 0xE0, 0xFF, 0xC1, 0xFD, 0xFE, 0x01, 0xC3,
+ 0xF0, 0x02, 0x0F, 0xC0, 0x08, 0x3F, 0x00, 0x20, 0xFC, 0x00, 0x83, 0xF0,
+ 0x02, 0x0F, 0xC0, 0x08, 0x3F, 0x00, 0x20, 0xFC, 0x00, 0x83, 0xF0, 0x02,
+ 0x0F, 0xC0, 0x08, 0x3F, 0x00, 0x20, 0xFC, 0x00, 0x83, 0xF0, 0x02, 0x0F,
+ 0xC0, 0x08, 0x3F, 0x00, 0x20, 0xFC, 0x00, 0x83, 0xF0, 0x02, 0x0F, 0xC0,
+ 0x18, 0x1F, 0x80, 0x40, 0x7E, 0x03, 0x00, 0xFC, 0x18, 0x01, 0xFF, 0xC0,
+ 0x00, 0xFC, 0x00, 0xFF, 0xF0, 0x7F, 0x3F, 0xC0, 0x1E, 0x1F, 0x80, 0x0C,
+ 0x1F, 0x80, 0x08, 0x0F, 0xC0, 0x18, 0x0F, 0xC0, 0x18, 0x07, 0xE0, 0x10,
+ 0x07, 0xE0, 0x30, 0x07, 0xE0, 0x20, 0x03, 0xF0, 0x60, 0x03, 0xF0, 0x60,
+ 0x01, 0xF8, 0x40, 0x01, 0xF8, 0xC0, 0x00, 0xF8, 0x80, 0x00, 0xFC, 0x80,
+ 0x00, 0xFD, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3E, 0x00,
+ 0x00, 0x3E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x1C, 0x00,
+ 0x00, 0x0C, 0x00, 0xFF, 0xE7, 0xFF, 0x0F, 0xCF, 0xE0, 0x7F, 0x00, 0xE1,
+ 0xF8, 0x0F, 0xC0, 0x30, 0x7E, 0x03, 0xF0, 0x0C, 0x1F, 0x80, 0x7C, 0x02,
+ 0x03, 0xE0, 0x1F, 0x81, 0x80, 0xFC, 0x07, 0xE0, 0x60, 0x3F, 0x03, 0xF8,
+ 0x10, 0x07, 0xC0, 0xBF, 0x0C, 0x01, 0xF8, 0x2F, 0xC3, 0x00, 0x7E, 0x19,
+ 0xF0, 0x80, 0x0F, 0x84, 0x7C, 0x60, 0x03, 0xF3, 0x0F, 0x98, 0x00, 0xFC,
+ 0xC3, 0xE4, 0x00, 0x1F, 0x20, 0xFB, 0x00, 0x07, 0xF8, 0x1F, 0xC0, 0x00,
+ 0xFC, 0x07, 0xE0, 0x00, 0x3F, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x3E, 0x00,
+ 0x01, 0xE0, 0x0F, 0x00, 0x00, 0x78, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x70,
+ 0x00, 0x03, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x06, 0x00, 0x00, 0x20, 0x00,
+ 0x80, 0x00, 0xFF, 0xF3, 0xFE, 0x7F, 0x80, 0x78, 0x3F, 0x80, 0x70, 0x1F,
+ 0xC0, 0x60, 0x0F, 0xC0, 0xC0, 0x0F, 0xE1, 0x80, 0x07, 0xF1, 0x00, 0x03,
+ 0xF3, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00,
+ 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x80, 0x00,
+ 0x9F, 0x80, 0x01, 0x8F, 0xC0, 0x03, 0x0F, 0xE0, 0x06, 0x07, 0xE0, 0x06,
+ 0x07, 0xF0, 0x0C, 0x03, 0xF8, 0x1C, 0x03, 0xF8, 0x3C, 0x03, 0xFC, 0xFF,
+ 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, 0x7F, 0x80, 0x1E, 0x3F, 0x80, 0x1C, 0x1F,
+ 0x80, 0x18, 0x1F, 0xC0, 0x10, 0x0F, 0xC0, 0x30, 0x07, 0xE0, 0x20, 0x07,
+ 0xE0, 0x60, 0x03, 0xF0, 0xC0, 0x03, 0xF0, 0x80, 0x01, 0xF9, 0x80, 0x01,
+ 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00,
+ 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00,
+ 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFF, 0x00, 0x01,
+ 0xFF, 0x80, 0x7F, 0xFF, 0xF3, 0xFF, 0xFF, 0x9F, 0x01, 0xF8, 0xE0, 0x1F,
+ 0x86, 0x01, 0xFC, 0x20, 0x0F, 0xC1, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00,
+ 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x80,
+ 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xFC, 0x01, 0x0F, 0xC0, 0x18, 0xFC,
+ 0x00, 0xC7, 0xE0, 0x06, 0x7E, 0x00, 0x77, 0xF0, 0x07, 0x3F, 0x00, 0xFB,
+ 0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
+ 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
+ 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xE0, 0x1E,
+ 0x01, 0xC0, 0x38, 0x07, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x1C, 0x03, 0x80,
+ 0x70, 0x07, 0x00, 0xE0, 0x1C, 0x01, 0xC0, 0x38, 0x07, 0x00, 0x70, 0x0E,
+ 0x01, 0xC0, 0x1C, 0x03, 0x80, 0x70, 0x0F, 0x00, 0xE0, 0xFF, 0xFF, 0x0F,
+ 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
+ 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
+ 0xFF, 0xFF, 0x03, 0x80, 0x0F, 0x00, 0x1F, 0x00, 0x7E, 0x00, 0xEE, 0x03,
+ 0x9C, 0x07, 0x1C, 0x1C, 0x38, 0x38, 0x38, 0xE0, 0x71, 0xC0, 0x77, 0x00,
+ 0xEE, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xE0, 0xF0,
+ 0x78, 0x3C, 0x0E, 0x07, 0x0F, 0xE0, 0x3F, 0xF0, 0x78, 0xF8, 0x78, 0x7C,
+ 0x78, 0x7C, 0x38, 0x7C, 0x00, 0x7C, 0x03, 0xFC, 0x1E, 0x7C, 0x7C, 0x7C,
+ 0xFC, 0x7C, 0xFC, 0x7C, 0xFC, 0xFC, 0xFF, 0xFD, 0x7F, 0x7F, 0x3C, 0x3C,
+ 0xFC, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F,
+ 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0xF8, 0x1F, 0x7F, 0x87, 0xE3,
+ 0xF1, 0xF0, 0x7E, 0x7C, 0x0F, 0x9F, 0x03, 0xF7, 0xC0, 0xFD, 0xF0, 0x3F,
+ 0x7C, 0x0F, 0xDF, 0x03, 0xF7, 0xC0, 0xFD, 0xF0, 0x3E, 0x7C, 0x1F, 0x1F,
+ 0x8F, 0xC6, 0x7F, 0xC1, 0x07, 0xC0, 0x07, 0xC0, 0x7F, 0xC3, 0xC7, 0x9F,
+ 0x1E, 0x78, 0x7B, 0xE1, 0xCF, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F,
+ 0x80, 0x3F, 0x00, 0x7C, 0x00, 0xFC, 0x61, 0xFF, 0x03, 0xF0, 0x00, 0x7F,
+ 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0,
+ 0x01, 0xF0, 0x00, 0x7C, 0x07, 0x9F, 0x07, 0xF7, 0xC3, 0xE3, 0xF1, 0xF8,
+ 0x7C, 0x7C, 0x1F, 0x3F, 0x07, 0xCF, 0xC1, 0xF3, 0xF0, 0x7C, 0xFC, 0x1F,
+ 0x3F, 0x07, 0xCF, 0xC1, 0xF1, 0xF0, 0x7C, 0x7E, 0x1F, 0x0F, 0x8F, 0xC1,
+ 0xFD, 0xFC, 0x3E, 0x70, 0x0F, 0xC0, 0x7F, 0xC3, 0xC7, 0x1E, 0x1E, 0xF8,
+ 0x7B, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0xC0, 0x1F,
+ 0x03, 0x7E, 0x18, 0xFF, 0xC1, 0xFE, 0x03, 0xF0, 0x0F, 0x83, 0xF8, 0xF3,
+ 0xBE, 0xF7, 0xDC, 0xF8, 0x1F, 0x03, 0xE0, 0xFF, 0x1F, 0xE1, 0xF0, 0x3E,
+ 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07,
+ 0xC0, 0xF8, 0x1F, 0x07, 0xF8, 0x0F, 0xC0, 0x1F, 0xFF, 0xDF, 0x1F, 0xFF,
+ 0x07, 0x8F, 0x83, 0xE7, 0xC1, 0xF3, 0xE0, 0xF9, 0xF0, 0x7C, 0x78, 0x3C,
+ 0x1E, 0x3E, 0x03, 0xFC, 0x03, 0x00, 0x07, 0x00, 0x07, 0x80, 0x03, 0xFF,
+ 0xF1, 0xFF, 0xFE, 0x7F, 0xFF, 0x8F, 0xFF, 0xF8, 0x01, 0xFC, 0x00, 0x7F,
+ 0x00, 0x73, 0xFF, 0xF0, 0x7F, 0xC0, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x00,
+ 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C,
+ 0x7C, 0x3E, 0xFF, 0x1F, 0xCF, 0xCF, 0x83, 0xE7, 0xC1, 0xF3, 0xE0, 0xF9,
+ 0xF0, 0x7C, 0xF8, 0x3E, 0x7C, 0x1F, 0x3E, 0x0F, 0x9F, 0x07, 0xCF, 0x83,
+ 0xE7, 0xC1, 0xF3, 0xE0, 0xF9, 0xF0, 0x7D, 0xFC, 0x7F, 0x39, 0xFB, 0xF7,
+ 0xE7, 0x80, 0x00, 0x00, 0xFC, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C,
+ 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x7F, 0x03, 0xC0, 0xFC, 0x1F, 0x83, 0xF0,
+ 0x3C, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E,
+ 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07,
+ 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7D, 0xCF, 0xF9, 0xEE, 0x7C, 0xFF, 0x0F,
+ 0x80, 0xFC, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00,
+ 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x7F, 0x9F, 0x07, 0x87,
+ 0xC1, 0x81, 0xF0, 0xC0, 0x7C, 0x60, 0x1F, 0x30, 0x07, 0xDE, 0x01, 0xFF,
+ 0xC0, 0x7F, 0xF0, 0x1F, 0x3E, 0x07, 0xCF, 0xC1, 0xF1, 0xF8, 0x7C, 0x3E,
+ 0x1F, 0x07, 0xC7, 0xC1, 0xFB, 0xF9, 0xFF, 0xFC, 0xF9, 0xF3, 0xE7, 0xCF,
+ 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3,
+ 0xE7, 0xCF, 0x9F, 0x7F, 0xFC, 0x7C, 0x1F, 0x0F, 0xBF, 0xCF, 0xF1, 0xF8,
+ 0xFF, 0x3F, 0x3E, 0x0F, 0x83, 0xE7, 0xC1, 0xF0, 0x7C, 0xF8, 0x3E, 0x0F,
+ 0x9F, 0x07, 0xC1, 0xF3, 0xE0, 0xF8, 0x3E, 0x7C, 0x1F, 0x07, 0xCF, 0x83,
+ 0xE0, 0xF9, 0xF0, 0x7C, 0x1F, 0x3E, 0x0F, 0x83, 0xE7, 0xC1, 0xF0, 0x7C,
+ 0xF8, 0x3E, 0x0F, 0x9F, 0x07, 0xC1, 0xF7, 0xF1, 0xFC, 0x7F, 0xFC, 0x7C,
+ 0x3E, 0xFF, 0x1F, 0xCF, 0xCF, 0x83, 0xE7, 0xC1, 0xF3, 0xE0, 0xF9, 0xF0,
+ 0x7C, 0xF8, 0x3E, 0x7C, 0x1F, 0x3E, 0x0F, 0x9F, 0x07, 0xCF, 0x83, 0xE7,
+ 0xC1, 0xF3, 0xE0, 0xF9, 0xF0, 0x7D, 0xFC, 0x7F, 0x07, 0xF0, 0x0F, 0xFE,
+ 0x0F, 0x8F, 0x8F, 0x87, 0xE7, 0xC1, 0xF7, 0xE0, 0xFF, 0xF0, 0x7F, 0xF8,
+ 0x3F, 0xFC, 0x1F, 0xFE, 0x0F, 0xFF, 0x07, 0xEF, 0x83, 0xE7, 0xC1, 0xF1,
+ 0xF1, 0xF0, 0x7F, 0xF0, 0x0F, 0xE0, 0xFE, 0x7C, 0x07, 0xDF, 0xE0, 0xFE,
+ 0x3E, 0x1F, 0x07, 0xE3, 0xE0, 0x7C, 0x7C, 0x0F, 0xCF, 0x81, 0xF9, 0xF0,
+ 0x3F, 0x3E, 0x07, 0xE7, 0xC0, 0xFC, 0xF8, 0x1F, 0x9F, 0x03, 0xE3, 0xE0,
+ 0xFC, 0x7E, 0x3F, 0x0F, 0xBF, 0xC1, 0xF3, 0xE0, 0x3E, 0x00, 0x07, 0xC0,
+ 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7E, 0x00, 0x1F, 0xE0,
+ 0x00, 0x07, 0xC1, 0x0F, 0xF9, 0x8F, 0xCD, 0xCF, 0xC3, 0xE7, 0xC1, 0xF7,
+ 0xE0, 0xFB, 0xF0, 0x7D, 0xF8, 0x3E, 0xFC, 0x1F, 0x7E, 0x0F, 0xBF, 0x07,
+ 0xDF, 0x83, 0xE7, 0xE1, 0xF1, 0xF1, 0xF8, 0x7F, 0x7C, 0x1F, 0x3E, 0x00,
+ 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x01, 0xF8,
+ 0x01, 0xFE, 0xFC, 0x73, 0xEF, 0xDF, 0xFE, 0xFC, 0xF7, 0xC3, 0xBE, 0x01,
+ 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E,
+ 0x01, 0xF0, 0x1F, 0xE0, 0x1E, 0x23, 0xFE, 0x70, 0xEE, 0x06, 0xE0, 0x2F,
+ 0x80, 0xFF, 0x07, 0xFC, 0x3F, 0xE0, 0xFF, 0x81, 0xF8, 0x07, 0xC0, 0x7E,
+ 0x0E, 0xBF, 0xC8, 0xF8, 0x04, 0x03, 0x01, 0xC0, 0xF0, 0x7C, 0x3F, 0xEF,
+ 0xF9, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0,
+ 0x7C, 0x5F, 0x37, 0xF8, 0xFE, 0x1E, 0x00, 0xFC, 0x7F, 0x1F, 0x07, 0xC7,
+ 0xC1, 0xF1, 0xF0, 0x7C, 0x7C, 0x1F, 0x1F, 0x07, 0xC7, 0xC1, 0xF1, 0xF0,
+ 0x7C, 0x7C, 0x1F, 0x1F, 0x07, 0xC7, 0xC1, 0xF1, 0xF0, 0x7C, 0x7C, 0x1F,
+ 0x1F, 0x8F, 0xC3, 0xFD, 0xFC, 0x7C, 0x60, 0xFF, 0x9F, 0xBF, 0x83, 0x0F,
+ 0x81, 0x87, 0xE0, 0x81, 0xF0, 0x40, 0xF8, 0x40, 0x3E, 0x20, 0x1F, 0x30,
+ 0x07, 0xD0, 0x03, 0xF8, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3C, 0x00, 0x0E,
+ 0x00, 0x07, 0x00, 0x01, 0x00, 0xFF, 0x3F, 0xCF, 0x7E, 0x1F, 0x06, 0x3E,
+ 0x0F, 0x06, 0x3E, 0x0F, 0x84, 0x1F, 0x0F, 0x8C, 0x1F, 0x1F, 0x88, 0x0F,
+ 0x17, 0xC8, 0x0F, 0x97, 0xD8, 0x0F, 0xB3, 0xD0, 0x07, 0xE3, 0xF0, 0x07,
+ 0xE3, 0xE0, 0x03, 0xC1, 0xE0, 0x03, 0xC1, 0xE0, 0x03, 0x81, 0xC0, 0x01,
+ 0x80, 0xC0, 0x01, 0x80, 0x80, 0xFF, 0x3F, 0x7E, 0x0C, 0x3E, 0x08, 0x3F,
+ 0x18, 0x1F, 0x30, 0x0F, 0xE0, 0x0F, 0xC0, 0x07, 0xE0, 0x03, 0xE0, 0x03,
+ 0xF0, 0x05, 0xF8, 0x0C, 0xF8, 0x18, 0xFC, 0x30, 0x7E, 0x70, 0x7E, 0xFC,
+ 0xFF, 0xFF, 0x3F, 0x7E, 0x0C, 0x7C, 0x0C, 0x3E, 0x08, 0x3E, 0x08, 0x1E,
+ 0x18, 0x1F, 0x10, 0x0F, 0x30, 0x0F, 0xA0, 0x0F, 0xA0, 0x07, 0xE0, 0x07,
+ 0xC0, 0x03, 0xC0, 0x03, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x01,
+ 0x00, 0x61, 0x00, 0xF2, 0x00, 0xF6, 0x00, 0xFC, 0x00, 0x78, 0x00, 0x7F,
+ 0xFD, 0xFF, 0xF7, 0x0F, 0xD0, 0x3E, 0x01, 0xF0, 0x0F, 0xC0, 0x3E, 0x01,
+ 0xF0, 0x0F, 0xC0, 0x3E, 0x01, 0xF8, 0x0F, 0xC1, 0x3E, 0x05, 0xF8, 0x7F,
+ 0xFF, 0xFF, 0xFF, 0x01, 0xE0, 0xF8, 0x3E, 0x07, 0x80, 0xF0, 0x1E, 0x03,
+ 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x07, 0x87,
+ 0x80, 0x1E, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78,
+ 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF8, 0x0F, 0x80, 0x78, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xF0, 0x0F, 0x80, 0xF0,
+ 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F,
+ 0x01, 0xE0, 0x3C, 0x03, 0xC0, 0x0F, 0x0F, 0x03, 0xC0, 0x78, 0x0F, 0x01,
+ 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x03, 0xE0,
+ 0xF8, 0x3C, 0x00, 0x3E, 0x00, 0x7F, 0xC6, 0xFF, 0xFF, 0x61, 0xFE, 0x00,
+ 0x7C };
+
+const GFXglyph FreeSerifBold18pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 9, 0, 1 }, // 0x20 ' '
+ { 0, 6, 24, 12, 3, -23 }, // 0x21 '!'
+ { 18, 13, 10, 19, 3, -23 }, // 0x22 '"'
+ { 35, 18, 24, 17, 0, -23 }, // 0x23 '#'
+ { 89, 15, 28, 17, 1, -25 }, // 0x24 '$'
+ { 142, 27, 24, 35, 4, -23 }, // 0x25 '%'
+ { 223, 26, 25, 29, 2, -23 }, // 0x26 '&'
+ { 305, 4, 10, 10, 3, -23 }, // 0x27 '''
+ { 310, 9, 30, 12, 2, -23 }, // 0x28 '('
+ { 344, 9, 30, 12, 1, -23 }, // 0x29 ')'
+ { 378, 14, 15, 18, 2, -23 }, // 0x2A '*'
+ { 405, 19, 19, 24, 2, -17 }, // 0x2B '+'
+ { 451, 6, 12, 9, 1, -5 }, // 0x2C ','
+ { 460, 8, 4, 12, 2, -9 }, // 0x2D '-'
+ { 464, 6, 6, 9, 1, -5 }, // 0x2E '.'
+ { 469, 11, 25, 10, -1, -23 }, // 0x2F '/'
+ { 504, 16, 24, 18, 1, -23 }, // 0x30 '0'
+ { 552, 12, 24, 18, 3, -23 }, // 0x31 '1'
+ { 588, 16, 24, 17, 1, -23 }, // 0x32 '2'
+ { 636, 16, 24, 18, 0, -23 }, // 0x33 '3'
+ { 684, 15, 24, 18, 1, -23 }, // 0x34 '4'
+ { 729, 15, 24, 18, 1, -23 }, // 0x35 '5'
+ { 774, 16, 24, 18, 1, -23 }, // 0x36 '6'
+ { 822, 16, 24, 17, 1, -23 }, // 0x37 '7'
+ { 870, 16, 24, 17, 1, -23 }, // 0x38 '8'
+ { 918, 16, 24, 18, 1, -23 }, // 0x39 '9'
+ { 966, 6, 16, 12, 3, -15 }, // 0x3A ':'
+ { 978, 7, 22, 12, 2, -15 }, // 0x3B ';'
+ { 998, 19, 20, 24, 2, -18 }, // 0x3C '<'
+ { 1046, 19, 12, 24, 2, -14 }, // 0x3D '='
+ { 1075, 19, 20, 24, 3, -18 }, // 0x3E '>'
+ { 1123, 14, 24, 18, 2, -23 }, // 0x3F '?'
+ { 1165, 24, 25, 33, 4, -23 }, // 0x40 '@'
+ { 1240, 24, 24, 25, 1, -23 }, // 0x41 'A'
+ { 1312, 21, 24, 23, 1, -23 }, // 0x42 'B'
+ { 1375, 23, 25, 25, 1, -23 }, // 0x43 'C'
+ { 1447, 23, 24, 26, 1, -23 }, // 0x44 'D'
+ { 1516, 21, 24, 23, 2, -23 }, // 0x45 'E'
+ { 1579, 19, 24, 22, 2, -23 }, // 0x46 'F'
+ { 1636, 25, 25, 27, 1, -23 }, // 0x47 'G'
+ { 1715, 24, 24, 27, 2, -23 }, // 0x48 'H'
+ { 1787, 11, 24, 14, 2, -23 }, // 0x49 'I'
+ { 1820, 16, 27, 18, 0, -23 }, // 0x4A 'J'
+ { 1874, 25, 24, 27, 2, -23 }, // 0x4B 'K'
+ { 1949, 21, 24, 23, 2, -23 }, // 0x4C 'L'
+ { 2012, 31, 24, 33, 1, -23 }, // 0x4D 'M'
+ { 2105, 23, 24, 25, 1, -23 }, // 0x4E 'N'
+ { 2174, 25, 25, 27, 1, -23 }, // 0x4F 'O'
+ { 2253, 19, 24, 22, 2, -23 }, // 0x50 'P'
+ { 2310, 25, 30, 27, 1, -23 }, // 0x51 'Q'
+ { 2404, 23, 24, 25, 2, -23 }, // 0x52 'R'
+ { 2473, 16, 25, 20, 2, -23 }, // 0x53 'S'
+ { 2523, 21, 24, 23, 1, -23 }, // 0x54 'T'
+ { 2586, 22, 25, 25, 2, -23 }, // 0x55 'U'
+ { 2655, 24, 24, 25, 0, -23 }, // 0x56 'V'
+ { 2727, 34, 25, 34, 0, -23 }, // 0x57 'W'
+ { 2834, 24, 24, 25, 1, -23 }, // 0x58 'X'
+ { 2906, 24, 24, 25, 1, -23 }, // 0x59 'Y'
+ { 2978, 21, 24, 23, 1, -23 }, // 0x5A 'Z'
+ { 3041, 8, 29, 12, 2, -23 }, // 0x5B '['
+ { 3070, 11, 25, 10, -1, -23 }, // 0x5C '\'
+ { 3105, 8, 29, 12, 2, -23 }, // 0x5D ']'
+ { 3134, 15, 13, 20, 3, -23 }, // 0x5E '^'
+ { 3159, 18, 3, 17, 0, 3 }, // 0x5F '_'
+ { 3166, 8, 6, 12, 0, -23 }, // 0x60 '`'
+ { 3172, 16, 16, 18, 1, -15 }, // 0x61 'a'
+ { 3204, 18, 24, 19, 1, -23 }, // 0x62 'b'
+ { 3258, 14, 16, 15, 1, -15 }, // 0x63 'c'
+ { 3286, 18, 24, 19, 1, -23 }, // 0x64 'd'
+ { 3340, 14, 16, 16, 1, -15 }, // 0x65 'e'
+ { 3368, 11, 24, 14, 2, -23 }, // 0x66 'f'
+ { 3401, 17, 23, 17, 1, -15 }, // 0x67 'g'
+ { 3450, 17, 24, 19, 1, -23 }, // 0x68 'h'
+ { 3501, 7, 24, 10, 2, -23 }, // 0x69 'i'
+ { 3522, 11, 31, 14, 0, -23 }, // 0x6A 'j'
+ { 3565, 18, 24, 19, 1, -23 }, // 0x6B 'k'
+ { 3619, 7, 24, 10, 1, -23 }, // 0x6C 'l'
+ { 3640, 27, 16, 29, 1, -15 }, // 0x6D 'm'
+ { 3694, 17, 16, 19, 1, -15 }, // 0x6E 'n'
+ { 3728, 17, 16, 18, 1, -15 }, // 0x6F 'o'
+ { 3762, 19, 23, 19, 0, -15 }, // 0x70 'p'
+ { 3817, 17, 23, 19, 1, -15 }, // 0x71 'q'
+ { 3866, 13, 16, 15, 1, -15 }, // 0x72 'r'
+ { 3892, 12, 16, 14, 1, -15 }, // 0x73 's'
+ { 3916, 10, 21, 12, 1, -20 }, // 0x74 't'
+ { 3943, 18, 16, 20, 1, -15 }, // 0x75 'u'
+ { 3979, 17, 16, 17, 0, -15 }, // 0x76 'v'
+ { 4013, 24, 16, 25, 0, -15 }, // 0x77 'w'
+ { 4061, 16, 16, 18, 1, -15 }, // 0x78 'x'
+ { 4093, 16, 23, 17, 0, -15 }, // 0x79 'y'
+ { 4139, 14, 16, 16, 0, -15 }, // 0x7A 'z'
+ { 4167, 11, 31, 14, 1, -24 }, // 0x7B '{'
+ { 4210, 3, 25, 8, 2, -23 }, // 0x7C '|'
+ { 4220, 11, 31, 14, 3, -24 }, // 0x7D '}'
+ { 4263, 16, 5, 18, 1, -11 } }; // 0x7E '~'
+
+const GFXfont FreeSerifBold18pt7b PROGMEM = {
+ (uint8_t *)FreeSerifBold18pt7bBitmaps,
+ (GFXglyph *)FreeSerifBold18pt7bGlyphs,
+ 0x20, 0x7E, 42 };
+
+// Approx. 4945 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBold24pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBold24pt7b.h
new file mode 100644
index 000000000000..0eb2d0b1a810
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBold24pt7b.h
@@ -0,0 +1,759 @@
+const uint8_t FreeSerifBold24pt7bBitmaps[] PROGMEM = {
+ 0x3C, 0x7E, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x7E, 0x7C, 0x7C,
+ 0x3C, 0x3C, 0x38, 0x38, 0x38, 0x38, 0x18, 0x10, 0x10, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x3C, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C, 0x70, 0x07,
+ 0x7C, 0x07, 0xFE, 0x03, 0xFF, 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0x7F, 0xC0,
+ 0x3E, 0xE0, 0x0E, 0x70, 0x07, 0x38, 0x03, 0x9C, 0x01, 0xC4, 0x00, 0xE2,
+ 0x00, 0x20, 0x00, 0xF0, 0x70, 0x01, 0xC0, 0xE0, 0x03, 0x81, 0xC0, 0x0F,
+ 0x07, 0x80, 0x1E, 0x0F, 0x00, 0x3C, 0x1E, 0x00, 0x78, 0x3C, 0x00, 0xF0,
+ 0x78, 0x01, 0xC0, 0xE0, 0x03, 0x81, 0xC0, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF,
+ 0xF3, 0xFF, 0xFF, 0xE0, 0x78, 0x3C, 0x00, 0xF0, 0x78, 0x01, 0xC0, 0xE0,
+ 0x03, 0x81, 0xC0, 0x0F, 0x07, 0x80, 0x1E, 0x0F, 0x00, 0x3C, 0x1E, 0x0F,
+ 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0x03, 0x81, 0xC0, 0x0F,
+ 0x07, 0x80, 0x1E, 0x0F, 0x00, 0x3C, 0x1E, 0x00, 0x78, 0x3C, 0x00, 0xF0,
+ 0x78, 0x01, 0xE0, 0xE0, 0x03, 0x81, 0xC0, 0x07, 0x07, 0x80, 0x1E, 0x0F,
+ 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00,
+ 0x7F, 0xF0, 0x0F, 0x37, 0xE0, 0xE1, 0x8F, 0x8E, 0x0C, 0x3C, 0x70, 0x60,
+ 0xE7, 0x83, 0x03, 0x3C, 0x18, 0x19, 0xF0, 0xC0, 0x4F, 0xC6, 0x02, 0x7F,
+ 0xF0, 0x03, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x3F, 0xFC, 0x00, 0xFF, 0xF0,
+ 0x03, 0xFF, 0xE0, 0x0F, 0xFF, 0x80, 0x1F, 0xFE, 0x00, 0x3F, 0xF8, 0x01,
+ 0xFF, 0xC0, 0x0C, 0xFF, 0x00, 0x63, 0xFA, 0x03, 0x0F, 0xD0, 0x18, 0x3E,
+ 0x80, 0xC1, 0xF6, 0x06, 0x0F, 0xB8, 0x30, 0x79, 0xC1, 0x87, 0xCF, 0x0C,
+ 0x3C, 0x7E, 0x67, 0xC0, 0xFF, 0xF8, 0x00, 0xFE, 0x00, 0x00, 0xC0, 0x00,
+ 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x30,
+ 0x00, 0x3E, 0x00, 0x0C, 0x00, 0x0F, 0xF0, 0x03, 0x80, 0x07, 0xE7, 0x03,
+ 0xE0, 0x01, 0xF8, 0x7F, 0xFC, 0x00, 0x3E, 0x07, 0xF7, 0x00, 0x0F, 0xC0,
+ 0x80, 0xE0, 0x03, 0xF0, 0x10, 0x38, 0x00, 0x7E, 0x02, 0x07, 0x00, 0x0F,
+ 0x80, 0x41, 0xC0, 0x03, 0xF0, 0x10, 0x30, 0x00, 0x7E, 0x02, 0x0E, 0x00,
+ 0x0F, 0x80, 0xC1, 0x80, 0x01, 0xF0, 0x10, 0x70, 0x00, 0x3E, 0x06, 0x1C,
+ 0x00, 0x07, 0xC1, 0x83, 0x80, 0x00, 0x7C, 0x60, 0xE0, 0x1F, 0x07, 0xF8,
+ 0x18, 0x0F, 0xF8, 0x7C, 0x07, 0x07, 0xF1, 0x00, 0x00, 0xC1, 0xF8, 0x10,
+ 0x00, 0x38, 0x3F, 0x02, 0x00, 0x06, 0x0F, 0xC0, 0x40, 0x01, 0xC3, 0xF0,
+ 0x08, 0x00, 0x30, 0x7E, 0x01, 0x00, 0x0E, 0x1F, 0x80, 0x40, 0x03, 0x83,
+ 0xF0, 0x08, 0x00, 0x60, 0x7E, 0x01, 0x00, 0x1C, 0x0F, 0x80, 0x40, 0x03,
+ 0x01, 0xF0, 0x18, 0x00, 0xE0, 0x3E, 0x02, 0x00, 0x18, 0x03, 0xC0, 0xC0,
+ 0x07, 0x00, 0x7C, 0x70, 0x00, 0xC0, 0x07, 0xFC, 0x00, 0x38, 0x00, 0x7E,
+ 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x07, 0x8F,
+ 0xE0, 0x00, 0x03, 0xC1, 0xF8, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x7C,
+ 0x07, 0xC0, 0x00, 0x1F, 0x01, 0xF0, 0x00, 0x07, 0xE0, 0x7C, 0x00, 0x01,
+ 0xF8, 0x1E, 0x00, 0x00, 0x7F, 0x07, 0x80, 0x00, 0x1F, 0xE3, 0x80, 0x00,
+ 0x03, 0xFF, 0xC0, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x1F, 0xE0, 0x3F,
+ 0xF0, 0x07, 0xFC, 0x01, 0xF0, 0x07, 0xFF, 0x00, 0x78, 0x07, 0xBF, 0xE0,
+ 0x1C, 0x03, 0x87, 0xFC, 0x07, 0x01, 0xE0, 0xFF, 0x81, 0x80, 0xF0, 0x3F,
+ 0xE0, 0xC0, 0x7C, 0x07, 0xFC, 0x30, 0x1F, 0x00, 0xFF, 0x98, 0x0F, 0xC0,
+ 0x3F, 0xFC, 0x03, 0xF0, 0x07, 0xFF, 0x00, 0xFE, 0x00, 0xFF, 0x80, 0x3F,
+ 0x80, 0x3F, 0xF0, 0x0F, 0xF0, 0x07, 0xFE, 0x03, 0xFC, 0x00, 0xFF, 0x81,
+ 0x7F, 0x80, 0x3F, 0xF8, 0xDF, 0xF0, 0x1F, 0xFF, 0xE3, 0xFF, 0x0E, 0xFF,
+ 0xF8, 0xFF, 0xFE, 0x1F, 0xFC, 0x0F, 0xFE, 0x03, 0xFE, 0x00, 0xFE, 0x00,
+ 0x3E, 0x00, 0x77, 0xFF, 0xFF, 0xFF, 0xEE, 0x73, 0x9C, 0xE2, 0x00, 0x00,
+ 0x00, 0x03, 0x00, 0x60, 0x1C, 0x03, 0x80, 0x70, 0x06, 0x00, 0xE0, 0x1C,
+ 0x01, 0xC0, 0x3C, 0x03, 0xC0, 0x78, 0x07, 0x80, 0x78, 0x07, 0x80, 0xF8,
+ 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8,
+ 0x0F, 0x80, 0x78, 0x07, 0x80, 0x78, 0x03, 0xC0, 0x3C, 0x01, 0xC0, 0x1C,
+ 0x00, 0xE0, 0x0E, 0x00, 0x70, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x03, 0x00,
+ 0x10, 0x00, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00,
+ 0x70, 0x03, 0x80, 0x38, 0x03, 0xC0, 0x3C, 0x03, 0xE0, 0x1E, 0x01, 0xE0,
+ 0x1E, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0,
+ 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x3C, 0x03, 0xC0,
+ 0x38, 0x03, 0x80, 0x70, 0x07, 0x00, 0xE0, 0x0C, 0x01, 0x80, 0x30, 0x0C,
+ 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80,
+ 0x03, 0xE0, 0x3C, 0x78, 0xEF, 0x9C, 0x7B, 0xF7, 0x3F, 0xFE, 0xDF, 0x8F,
+ 0xFF, 0xC0, 0x7F, 0x00, 0x3F, 0xC0, 0x7E, 0xBF, 0x3F, 0x77, 0xEF, 0x9C,
+ 0xFF, 0xC7, 0x1E, 0x63, 0xE3, 0x80, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80,
+ 0x01, 0xC0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0,
+ 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01,
+ 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x0F,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07,
+ 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00,
+ 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00,
+ 0x00, 0x3C, 0x7E, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0x07, 0x06, 0x06, 0x0C,
+ 0x18, 0x30, 0x60, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3C,
+ 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C, 0x00, 0x1E, 0x00, 0x7C, 0x00,
+ 0xF0, 0x01, 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x7C, 0x00, 0xF0,
+ 0x01, 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x7C, 0x00, 0xF0, 0x01,
+ 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x7C, 0x00, 0xF0, 0x01, 0xE0,
+ 0x03, 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0xF0, 0x01, 0xE0, 0x03,
+ 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0xF0, 0x00, 0x00, 0xFC, 0x00,
+ 0x0F, 0x3C, 0x00, 0x78, 0x78, 0x03, 0xE1, 0xF0, 0x1F, 0x03, 0xE0, 0x7C,
+ 0x0F, 0x83, 0xF0, 0x3F, 0x0F, 0xC0, 0xFC, 0x7F, 0x03, 0xF9, 0xFC, 0x0F,
+ 0xE7, 0xF0, 0x3F, 0xBF, 0xC0, 0xFE, 0xFF, 0x03, 0xFF, 0xFC, 0x0F, 0xFF,
+ 0xF0, 0x3F, 0xFF, 0xC0, 0xFF, 0xFF, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0,
+ 0x3F, 0xFF, 0xC0, 0xFF, 0xFF, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, 0x3F,
+ 0x9F, 0xC0, 0xFE, 0x7F, 0x03, 0xF9, 0xFC, 0x0F, 0xE3, 0xF0, 0x3F, 0x0F,
+ 0xC0, 0xFC, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x80, 0xF8, 0x7C, 0x01, 0xE1,
+ 0xE0, 0x03, 0xCF, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x18, 0x00, 0x1E, 0x00,
+ 0x1F, 0x80, 0x1F, 0xE0, 0x1F, 0xF8, 0x1D, 0xFE, 0x00, 0x3F, 0x80, 0x0F,
+ 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8,
+ 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00,
+ 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F,
+ 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8,
+ 0x00, 0xFE, 0x00, 0x7F, 0x80, 0x3F, 0xF8, 0xFF, 0xFF, 0xC0, 0x00, 0xFC,
+ 0x00, 0x1F, 0xF8, 0x03, 0xFF, 0xE0, 0x3F, 0xFF, 0x81, 0xFF, 0xFC, 0x1C,
+ 0x1F, 0xF1, 0xC0, 0x7F, 0x8C, 0x01, 0xFC, 0x40, 0x0F, 0xE0, 0x00, 0x3F,
+ 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00,
+ 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x00,
+ 0x00, 0x70, 0x00, 0x07, 0x80, 0x00, 0x38, 0x00, 0x03, 0x80, 0x00, 0x38,
+ 0x01, 0x03, 0x80, 0x18, 0x38, 0x00, 0x81, 0x80, 0x1C, 0x1F, 0xFF, 0xE1,
+ 0xFF, 0xFF, 0x1F, 0xFF, 0xF9, 0xFF, 0xFF, 0x9F, 0xFF, 0xFC, 0xFF, 0xFF,
+ 0xE0, 0x00, 0xFE, 0x00, 0x3F, 0xFC, 0x03, 0xFF, 0xF0, 0x30, 0xFF, 0xC2,
+ 0x01, 0xFE, 0x30, 0x0F, 0xF1, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x0F,
+ 0xE0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xF0, 0x00,
+ 0x1F, 0xC0, 0x03, 0xFF, 0x00, 0x3F, 0xFC, 0x00, 0x7F, 0xF0, 0x00, 0xFF,
+ 0x80, 0x03, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0x80, 0x00, 0xFC, 0x00,
+ 0x07, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0x80, 0x00, 0x3C,
+ 0x00, 0x01, 0xC7, 0x80, 0x0E, 0x7F, 0x00, 0xE3, 0xFC, 0x06, 0x1F, 0xF8,
+ 0xE0, 0x7F, 0xFC, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x1E,
+ 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00,
+ 0xFF, 0x00, 0x0D, 0xF8, 0x00, 0xEF, 0xC0, 0x06, 0x7E, 0x00, 0x63, 0xF0,
+ 0x07, 0x1F, 0x80, 0x30, 0xFC, 0x03, 0x07, 0xE0, 0x38, 0x3F, 0x03, 0x81,
+ 0xF8, 0x18, 0x0F, 0xC1, 0xC0, 0x7E, 0x1C, 0x03, 0xF0, 0xC0, 0x1F, 0x8E,
+ 0x00, 0xFC, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00,
+ 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x07, 0xFF,
+ 0xF0, 0x7F, 0xFF, 0x0F, 0xFF, 0xE0, 0xFF, 0xFE, 0x0F, 0xFF, 0xE1, 0xFF,
+ 0xFC, 0x18, 0x00, 0x01, 0x80, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0x3F,
+ 0x80, 0x03, 0xFF, 0x80, 0x7F, 0xFE, 0x07, 0xFF, 0xF0, 0x7F, 0xFF, 0x87,
+ 0xFF, 0xFC, 0x7F, 0xFF, 0xC0, 0x07, 0xFC, 0x00, 0x1F, 0xE0, 0x00, 0x7E,
+ 0x00, 0x03, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00,
+ 0xC0, 0x00, 0x0C, 0x78, 0x00, 0x8F, 0xE0, 0x18, 0xFF, 0x87, 0x0F, 0xFF,
+ 0xE0, 0x7F, 0xF8, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x38, 0x00, 0x1F, 0x00,
+ 0x07, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0,
+ 0x00, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x7F,
+ 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xFF, 0x01, 0xFF, 0xFE, 0x1F, 0xF1, 0xFC,
+ 0xFF, 0x07, 0xE7, 0xF8, 0x3F, 0xBF, 0xC1, 0xFD, 0xFE, 0x07, 0xFF, 0xF0,
+ 0x3F, 0xFF, 0x81, 0xFF, 0xFC, 0x0F, 0xFF, 0xE0, 0x7F, 0xFF, 0x03, 0xFB,
+ 0xF8, 0x1F, 0xDF, 0xC0, 0xFE, 0xFE, 0x07, 0xE3, 0xF0, 0x3F, 0x1F, 0xC1,
+ 0xF0, 0x7E, 0x0F, 0x01, 0xF0, 0xF8, 0x03, 0xC7, 0x00, 0x07, 0xE0, 0x00,
+ 0x3F, 0xFF, 0xF9, 0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFF, 0xFF, 0xE7, 0xFF,
+ 0xFF, 0x3F, 0xFF, 0xF9, 0x80, 0x07, 0x98, 0x00, 0x3C, 0xC0, 0x03, 0xE4,
+ 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03,
+ 0xC0, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00,
+ 0x07, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x01, 0xF0,
+ 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x07, 0xC0, 0x00, 0x3C, 0x00, 0x01,
+ 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00,
+ 0x01, 0xFE, 0x00, 0x38, 0x7C, 0x07, 0x80, 0xF0, 0x78, 0x07, 0xC3, 0xC0,
+ 0x1F, 0x3E, 0x00, 0xF9, 0xF0, 0x07, 0xCF, 0xC0, 0x3E, 0x7E, 0x01, 0xF3,
+ 0xF8, 0x0F, 0x1F, 0xE0, 0xF8, 0x7F, 0xC7, 0x83, 0xFF, 0xF0, 0x0F, 0xFE,
+ 0x00, 0x7F, 0xFC, 0x01, 0xFF, 0xF0, 0x03, 0xFF, 0xC0, 0x1F, 0xFF, 0x03,
+ 0xBF, 0xFC, 0x7C, 0x7F, 0xE7, 0xC1, 0xFF, 0x3E, 0x07, 0xFF, 0xE0, 0x1F,
+ 0xFF, 0x00, 0x7F, 0xF8, 0x03, 0xFF, 0xC0, 0x0F, 0xFE, 0x00, 0x7F, 0xF0,
+ 0x03, 0xE7, 0x80, 0x1F, 0x3E, 0x01, 0xF0, 0xF8, 0x0F, 0x83, 0xE1, 0xF8,
+ 0x0F, 0xFF, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x1C, 0x3C, 0x00,
+ 0xF0, 0x78, 0x07, 0x81, 0xF8, 0x3E, 0x07, 0xE1, 0xF8, 0x0F, 0xC7, 0xE0,
+ 0x3F, 0x3F, 0x80, 0xFE, 0xFE, 0x03, 0xFB, 0xF8, 0x0F, 0xFF, 0xE0, 0x3F,
+ 0xFF, 0x80, 0xFF, 0xFE, 0x03, 0xFF, 0xF8, 0x0F, 0xFF, 0xE0, 0x3F, 0xDF,
+ 0xC0, 0xFF, 0x7F, 0x03, 0xFC, 0xFC, 0x0F, 0xF3, 0xFC, 0x7F, 0x83, 0xFF,
+ 0xFE, 0x07, 0xF7, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xF8,
+ 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xC0, 0x00,
+ 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xF0, 0x00, 0x3F, 0x00,
+ 0x03, 0x80, 0x00, 0x00, 0x3C, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x7E, 0x3C, 0x3C, 0x3F, 0x3F, 0xDF, 0xEF, 0xF7, 0xF9, 0xF8,
+ 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x7F, 0x7F,
+ 0xBF, 0xFF, 0xFF, 0xFB, 0xFC, 0xFE, 0x07, 0x03, 0x01, 0x81, 0x81, 0x81,
+ 0x83, 0x81, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x00,
+ 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0x01,
+ 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01,
+ 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x3F, 0xE0, 0x00,
+ 0x07, 0xFE, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x7F,
+ 0xE0, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x03, 0xFF, 0x00,
+ 0x00, 0x3F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x03,
+ 0xC0, 0x00, 0x00, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0,
+ 0xC0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x03, 0xFC, 0x00,
+ 0x00, 0xFF, 0xC0, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x0F,
+ 0xFE, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x7F, 0xE0,
+ 0x00, 0x07, 0xFE, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x1F, 0xF0, 0x00, 0x1F,
+ 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x1F,
+ 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x0F,
+ 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x30, 0x00, 0x00,
+ 0x00, 0x07, 0xF0, 0x07, 0xFF, 0x03, 0x87, 0xE1, 0xC0, 0xFC, 0xF0, 0x3F,
+ 0xBE, 0x07, 0xEF, 0xC1, 0xFF, 0xF0, 0x7F, 0xFC, 0x1F, 0xDF, 0x07, 0xF7,
+ 0x81, 0xFC, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x07, 0xE0, 0x03,
+ 0xE0, 0x00, 0xF0, 0x00, 0x70, 0x00, 0x18, 0x00, 0x04, 0x00, 0x01, 0x00,
+ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3C, 0x00, 0x1F, 0x80, 0x0F, 0xF0, 0x03, 0xFC, 0x00, 0xFF, 0x00, 0x3F,
+ 0xC0, 0x07, 0xE0, 0x00, 0xF0, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x1F,
+ 0xFF, 0xC0, 0x00, 0x1F, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x1E, 0x00, 0x3C,
+ 0x00, 0x03, 0x80, 0x3C, 0x00, 0x00, 0xE0, 0x3C, 0x00, 0x00, 0x30, 0x3E,
+ 0x00, 0x00, 0x0C, 0x3E, 0x00, 0x3C, 0x37, 0x1F, 0x00, 0x7E, 0xF1, 0x9F,
+ 0x00, 0x7C, 0xF8, 0xCF, 0x80, 0x78, 0x7C, 0x37, 0xC0, 0x7C, 0x3C, 0x1F,
+ 0xC0, 0x3C, 0x1E, 0x0F, 0xE0, 0x3C, 0x0F, 0x07, 0xF0, 0x3E, 0x0F, 0x03,
+ 0xF8, 0x1E, 0x07, 0x81, 0xFC, 0x0F, 0x03, 0xC0, 0xFE, 0x0F, 0x03, 0xE0,
+ 0x7F, 0x07, 0x81, 0xE0, 0x6F, 0x83, 0xC1, 0xF0, 0x37, 0xC1, 0xE1, 0x78,
+ 0x31, 0xF0, 0xF9, 0xBC, 0x18, 0xF8, 0x3F, 0x9E, 0x38, 0x3C, 0x0F, 0x0F,
+ 0xF8, 0x1F, 0x00, 0x01, 0xF0, 0x07, 0x80, 0x00, 0x00, 0x03, 0xE0, 0x00,
+ 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x07, 0xC0,
+ 0x00, 0xC0, 0x01, 0xF8, 0x03, 0xE0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x03,
+ 0xFF, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00,
+ 0x03, 0x80, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00,
+ 0x07, 0xE0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00,
+ 0x0F, 0xF0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00,
+ 0x37, 0xF8, 0x00, 0x00, 0x33, 0xF8, 0x00, 0x00, 0x33, 0xFC, 0x00, 0x00,
+ 0x61, 0xFC, 0x00, 0x00, 0x61, 0xFE, 0x00, 0x00, 0xC1, 0xFE, 0x00, 0x00,
+ 0xC0, 0xFF, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x01, 0x80, 0x7F, 0x00, 0x01,
+ 0x80, 0x7F, 0x80, 0x03, 0x80, 0x7F, 0x80, 0x03, 0xFF, 0xFF, 0xC0, 0x03,
+ 0xFF, 0xFF, 0xC0, 0x07, 0x00, 0x3F, 0xC0, 0x06, 0x00, 0x1F, 0xE0, 0x0E,
+ 0x00, 0x1F, 0xE0, 0x0C, 0x00, 0x0F, 0xF0, 0x0C, 0x00, 0x0F, 0xF0, 0x1C,
+ 0x00, 0x0F, 0xF8, 0x1C, 0x00, 0x0F, 0xF8, 0x7E, 0x00, 0x0F, 0xFC, 0xFF,
+ 0x80, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xE0, 0x1F, 0xF8,
+ 0x7F, 0x00, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x01, 0xFE,
+ 0x0F, 0xF0, 0x1F, 0xE0, 0xFF, 0x01, 0xFE, 0x0F, 0xF0, 0x1F, 0xE0, 0xFF,
+ 0x01, 0xFE, 0x0F, 0xF0, 0x1F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F,
+ 0x00, 0xFF, 0x0F, 0xC0, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xC0, 0x0F,
+ 0xF0, 0xFF, 0x00, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x1F, 0xE0, 0xFF, 0x01,
+ 0xFE, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x00, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0,
+ 0xFF, 0x00, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x00, 0xFF, 0x0F, 0xF0,
+ 0x0F, 0xE0, 0xFF, 0x01, 0xFE, 0x0F, 0xF0, 0x1F, 0xC0, 0xFF, 0x87, 0xF0,
+ 0x3F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x08, 0x01,
+ 0xFF, 0xF0, 0x60, 0x0F, 0xC1, 0xF9, 0x80, 0xFC, 0x01, 0xFE, 0x07, 0xE0,
+ 0x01, 0xF8, 0x3F, 0x00, 0x03, 0xE1, 0xFC, 0x00, 0x07, 0x87, 0xE0, 0x00,
+ 0x1E, 0x3F, 0x80, 0x00, 0x38, 0xFE, 0x00, 0x00, 0x67, 0xF8, 0x00, 0x01,
+ 0x9F, 0xC0, 0x00, 0x02, 0x7F, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x0F,
+ 0xF0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x03, 0xFC,
+ 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0xFF, 0x00,
+ 0x00, 0x03, 0xFC, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x1F, 0xE0, 0x00,
+ 0x00, 0x7F, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00,
+ 0x87, 0xF0, 0x00, 0x07, 0x0F, 0xE0, 0x00, 0x38, 0x1F, 0x80, 0x01, 0xC0,
+ 0x3F, 0x00, 0x1E, 0x00, 0x7F, 0x01, 0xE0, 0x00, 0x7F, 0xFF, 0x00, 0x00,
+ 0x3F, 0xE0, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0xFE, 0x00, 0x0F,
+ 0xF8, 0x7F, 0x80, 0x0F, 0xF0, 0x1F, 0xC0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F,
+ 0xF0, 0x07, 0xF0, 0x0F, 0xF0, 0x03, 0xF8, 0x0F, 0xF0, 0x03, 0xFC, 0x0F,
+ 0xF0, 0x01, 0xFC, 0x0F, 0xF0, 0x01, 0xFE, 0x0F, 0xF0, 0x01, 0xFE, 0x0F,
+ 0xF0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F,
+ 0xF0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F,
+ 0xF0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F,
+ 0xF0, 0x00, 0xFE, 0x0F, 0xF0, 0x00, 0xFE, 0x0F, 0xF0, 0x01, 0xFE, 0x0F,
+ 0xF0, 0x01, 0xFC, 0x0F, 0xF0, 0x01, 0xFC, 0x0F, 0xF0, 0x03, 0xF8, 0x0F,
+ 0xF0, 0x03, 0xF0, 0x0F, 0xF0, 0x07, 0xE0, 0x0F, 0xF0, 0x0F, 0xC0, 0x0F,
+ 0xF8, 0x3F, 0x80, 0x1F, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0xFF,
+ 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFC, 0x1F, 0xE0, 0x1F, 0xC1, 0xFE, 0x00,
+ 0x3C, 0x1F, 0xE0, 0x01, 0xC1, 0xFE, 0x00, 0x0C, 0x1F, 0xE0, 0x00, 0xC1,
+ 0xFE, 0x00, 0x04, 0x1F, 0xE0, 0x20, 0x41, 0xFE, 0x02, 0x00, 0x1F, 0xE0,
+ 0x60, 0x01, 0xFE, 0x06, 0x00, 0x1F, 0xE0, 0xE0, 0x01, 0xFE, 0x1E, 0x00,
+ 0x1F, 0xFF, 0xE0, 0x01, 0xFF, 0xFE, 0x00, 0x1F, 0xE3, 0xE0, 0x01, 0xFE,
+ 0x0E, 0x00, 0x1F, 0xE0, 0x60, 0x01, 0xFE, 0x06, 0x00, 0x1F, 0xE0, 0x20,
+ 0x01, 0xFE, 0x02, 0x00, 0x1F, 0xE0, 0x00, 0x11, 0xFE, 0x00, 0x03, 0x1F,
+ 0xE0, 0x00, 0x71, 0xFE, 0x00, 0x07, 0x1F, 0xE0, 0x00, 0xE1, 0xFE, 0x00,
+ 0x1E, 0x1F, 0xE0, 0x03, 0xE3, 0xFF, 0x01, 0xFE, 0xFF, 0xFF, 0xFF, 0xEF,
+ 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xC7, 0xFC, 0x07,
+ 0xE3, 0xFC, 0x00, 0xF1, 0xFE, 0x00, 0x38, 0xFF, 0x00, 0x0C, 0x7F, 0x80,
+ 0x06, 0x3F, 0xC0, 0x01, 0x1F, 0xE0, 0x20, 0x8F, 0xF0, 0x10, 0x07, 0xF8,
+ 0x18, 0x03, 0xFC, 0x0C, 0x01, 0xFE, 0x0E, 0x00, 0xFF, 0x1F, 0x00, 0x7F,
+ 0xFF, 0x80, 0x3F, 0xFF, 0xC0, 0x1F, 0xE3, 0xE0, 0x0F, 0xF0, 0x70, 0x07,
+ 0xF8, 0x18, 0x03, 0xFC, 0x0C, 0x01, 0xFE, 0x02, 0x00, 0xFF, 0x01, 0x00,
+ 0x7F, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00,
+ 0x07, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00,
+ 0x00, 0xFF, 0xC0, 0x01, 0xFF, 0xFC, 0x00, 0x00, 0x0F, 0xF0, 0x08, 0x00,
+ 0x3F, 0xFE, 0x0C, 0x00, 0x3F, 0x07, 0xC6, 0x00, 0x7E, 0x00, 0xFF, 0x00,
+ 0x7E, 0x00, 0x1F, 0x80, 0x7E, 0x00, 0x07, 0xC0, 0x7F, 0x00, 0x01, 0xE0,
+ 0x3F, 0x00, 0x00, 0x70, 0x3F, 0x80, 0x00, 0x38, 0x1F, 0xC0, 0x00, 0x0C,
+ 0x1F, 0xE0, 0x00, 0x06, 0x0F, 0xE0, 0x00, 0x01, 0x07, 0xF0, 0x00, 0x00,
+ 0x07, 0xF8, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00,
+ 0x00, 0xFF, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x3F, 0xC0, 0x00,
+ 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x0F, 0xF0, 0x03, 0xFF, 0xFF, 0xF8, 0x00,
+ 0x3F, 0xF1, 0xFC, 0x00, 0x0F, 0xF0, 0xFF, 0x00, 0x07, 0xF8, 0x7F, 0x80,
+ 0x03, 0xFC, 0x1F, 0xC0, 0x01, 0xFE, 0x0F, 0xE0, 0x00, 0xFF, 0x03, 0xF8,
+ 0x00, 0x7F, 0x80, 0xFC, 0x00, 0x3F, 0xC0, 0x3F, 0x00, 0x1F, 0xE0, 0x0F,
+ 0xC0, 0x0F, 0xF0, 0x03, 0xF8, 0x1F, 0xF0, 0x00, 0x7F, 0xFF, 0xC0, 0x00,
+ 0x07, 0xFE, 0x00, 0x00, 0xFF, 0xFC, 0x1F, 0xFF, 0x9F, 0xF8, 0x03, 0xFF,
+ 0x07, 0xF8, 0x00, 0xFF, 0x03, 0xFC, 0x00, 0x7F, 0x81, 0xFE, 0x00, 0x3F,
+ 0xC0, 0xFF, 0x00, 0x1F, 0xE0, 0x7F, 0x80, 0x0F, 0xF0, 0x3F, 0xC0, 0x07,
+ 0xF8, 0x1F, 0xE0, 0x03, 0xFC, 0x0F, 0xF0, 0x01, 0xFE, 0x07, 0xF8, 0x00,
+ 0xFF, 0x03, 0xFC, 0x00, 0x7F, 0x81, 0xFE, 0x00, 0x3F, 0xC0, 0xFF, 0x00,
+ 0x1F, 0xE0, 0x7F, 0x80, 0x0F, 0xF0, 0x3F, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF,
+ 0xFF, 0xFC, 0x0F, 0xF0, 0x01, 0xFE, 0x07, 0xF8, 0x00, 0xFF, 0x03, 0xFC,
+ 0x00, 0x7F, 0x81, 0xFE, 0x00, 0x3F, 0xC0, 0xFF, 0x00, 0x1F, 0xE0, 0x7F,
+ 0x80, 0x0F, 0xF0, 0x3F, 0xC0, 0x07, 0xF8, 0x1F, 0xE0, 0x03, 0xFC, 0x0F,
+ 0xF0, 0x01, 0xFE, 0x07, 0xF8, 0x00, 0xFF, 0x03, 0xFC, 0x00, 0x7F, 0x81,
+ 0xFE, 0x00, 0x3F, 0xC0, 0xFF, 0x00, 0x1F, 0xE0, 0xFF, 0xC0, 0x1F, 0xF9,
+ 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0xFE, 0x7F, 0xE0, 0x7F, 0x80, 0xFF, 0x01,
+ 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F,
+ 0x80, 0xFF, 0x01, 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0,
+ 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x01, 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x0F,
+ 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x01, 0xFE, 0x03, 0xFC,
+ 0x0F, 0xFC, 0x7F, 0xFF, 0x01, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x01, 0xFE,
+ 0x00, 0x07, 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00,
+ 0x07, 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x07,
+ 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xF8,
+ 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xF8, 0x00,
+ 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x1F,
+ 0xE0, 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xF8, 0x78, 0x1F, 0xE3,
+ 0xF0, 0x7F, 0x8F, 0xC1, 0xFC, 0x3F, 0x07, 0xF0, 0xFC, 0x1F, 0xC1, 0xE0,
+ 0xFE, 0x07, 0xC3, 0xF0, 0x0F, 0xFF, 0x80, 0x07, 0xF0, 0x00, 0xFF, 0xFC,
+ 0x1F, 0xFF, 0x0F, 0xFC, 0x00, 0xFF, 0x01, 0xFE, 0x00, 0x1E, 0x00, 0x7F,
+ 0x80, 0x07, 0x00, 0x1F, 0xE0, 0x03, 0x80, 0x07, 0xF8, 0x01, 0xC0, 0x01,
+ 0xFE, 0x00, 0xE0, 0x00, 0x7F, 0x80, 0x70, 0x00, 0x1F, 0xE0, 0x38, 0x00,
+ 0x07, 0xF8, 0x1C, 0x00, 0x01, 0xFE, 0x0E, 0x00, 0x00, 0x7F, 0x87, 0x00,
+ 0x00, 0x1F, 0xE3, 0xC0, 0x00, 0x07, 0xF9, 0xF8, 0x00, 0x01, 0xFE, 0xFE,
+ 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x07, 0xFD,
+ 0xFF, 0x00, 0x01, 0xFE, 0x7F, 0xE0, 0x00, 0x7F, 0x8F, 0xF8, 0x00, 0x1F,
+ 0xE1, 0xFF, 0x00, 0x07, 0xF8, 0x3F, 0xE0, 0x01, 0xFE, 0x07, 0xFC, 0x00,
+ 0x7F, 0x81, 0xFF, 0x80, 0x1F, 0xE0, 0x3F, 0xE0, 0x07, 0xF8, 0x07, 0xFC,
+ 0x01, 0xFE, 0x00, 0xFF, 0x80, 0x7F, 0x80, 0x1F, 0xF0, 0x1F, 0xE0, 0x07,
+ 0xFE, 0x07, 0xF8, 0x00, 0xFF, 0x83, 0xFF, 0x00, 0x3F, 0xF3, 0xFF, 0xF0,
+ 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00,
+ 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x1F,
+ 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00,
+ 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01,
+ 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xE0,
+ 0x00, 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00,
+ 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x01, 0x1F, 0xE0, 0x00, 0x31, 0xFE,
+ 0x00, 0x03, 0x1F, 0xE0, 0x00, 0x71, 0xFE, 0x00, 0x07, 0x1F, 0xE0, 0x00,
+ 0xE1, 0xFE, 0x00, 0x1E, 0x1F, 0xE0, 0x07, 0xE3, 0xFF, 0x01, 0xFE, 0xFF,
+ 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFE, 0x7F, 0xF0, 0x00, 0x01, 0xFF, 0xE1,
+ 0xFF, 0x00, 0x00, 0x3F, 0xF0, 0x1F, 0xE0, 0x00, 0x0F, 0xFC, 0x03, 0xFC,
+ 0x00, 0x01, 0xFF, 0x80, 0x7F, 0xC0, 0x00, 0x2F, 0xF0, 0x0B, 0xF8, 0x00,
+ 0x0D, 0xFE, 0x01, 0x7F, 0x80, 0x01, 0xBF, 0xC0, 0x27, 0xF0, 0x00, 0x67,
+ 0xF8, 0x04, 0xFF, 0x00, 0x0C, 0xFF, 0x00, 0x8F, 0xE0, 0x03, 0x1F, 0xE0,
+ 0x11, 0xFE, 0x00, 0x63, 0xFC, 0x02, 0x3F, 0xC0, 0x08, 0x7F, 0x80, 0x43,
+ 0xF8, 0x03, 0x0F, 0xF0, 0x08, 0x7F, 0x80, 0x61, 0xFE, 0x01, 0x07, 0xF0,
+ 0x18, 0x3F, 0xC0, 0x20, 0xFF, 0x03, 0x07, 0xF8, 0x04, 0x0F, 0xE0, 0xC0,
+ 0xFF, 0x00, 0x81, 0xFE, 0x18, 0x1F, 0xE0, 0x10, 0x3F, 0xC6, 0x03, 0xFC,
+ 0x02, 0x03, 0xF8, 0xC0, 0x7F, 0x80, 0x40, 0x7F, 0x98, 0x0F, 0xF0, 0x08,
+ 0x07, 0xF6, 0x01, 0xFE, 0x01, 0x00, 0xFF, 0xC0, 0x3F, 0xC0, 0x20, 0x0F,
+ 0xF0, 0x07, 0xF8, 0x04, 0x01, 0xFE, 0x00, 0xFF, 0x00, 0x80, 0x1F, 0x80,
+ 0x1F, 0xE0, 0x10, 0x03, 0xF0, 0x03, 0xFC, 0x02, 0x00, 0x7E, 0x00, 0x7F,
+ 0x80, 0x40, 0x07, 0x80, 0x0F, 0xF0, 0x0C, 0x00, 0xF0, 0x01, 0xFE, 0x07,
+ 0xC0, 0x0C, 0x00, 0x7F, 0xE7, 0xFF, 0x01, 0x80, 0x3F, 0xFF, 0xFF, 0xC0,
+ 0x03, 0xFE, 0xFF, 0xC0, 0x01, 0xF0, 0xFF, 0xC0, 0x01, 0xC0, 0xFF, 0xC0,
+ 0x01, 0x80, 0xFF, 0x80, 0x03, 0x01, 0xFF, 0x80, 0x06, 0x03, 0xFF, 0x80,
+ 0x0C, 0x07, 0xFF, 0x80, 0x18, 0x0D, 0xFF, 0x80, 0x30, 0x19, 0xFF, 0x00,
+ 0x60, 0x31, 0xFF, 0x00, 0xC0, 0x61, 0xFF, 0x01, 0x80, 0xC1, 0xFF, 0x03,
+ 0x01, 0x83, 0xFF, 0x06, 0x03, 0x03, 0xFE, 0x0C, 0x06, 0x03, 0xFE, 0x18,
+ 0x0C, 0x03, 0xFE, 0x30, 0x18, 0x03, 0xFE, 0x60, 0x30, 0x03, 0xFE, 0xC0,
+ 0x60, 0x07, 0xFD, 0x80, 0xC0, 0x07, 0xFF, 0x01, 0x80, 0x07, 0xFE, 0x03,
+ 0x00, 0x07, 0xFC, 0x06, 0x00, 0x07, 0xF8, 0x0C, 0x00, 0x07, 0xF0, 0x18,
+ 0x00, 0x0F, 0xE0, 0x30, 0x00, 0x0F, 0xC0, 0x60, 0x00, 0x0F, 0x80, 0xC0,
+ 0x00, 0x0F, 0x01, 0xC0, 0x00, 0x0E, 0x0F, 0xC0, 0x00, 0x1C, 0x7F, 0xE0,
+ 0x00, 0x18, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x3F,
+ 0x07, 0xF0, 0x00, 0x7E, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x7E,
+ 0x00, 0x1F, 0xC0, 0x7F, 0x00, 0x07, 0xF0, 0x3F, 0x00, 0x03, 0xF8, 0x3F,
+ 0x80, 0x00, 0xFE, 0x3F, 0xC0, 0x00, 0x7F, 0x1F, 0xE0, 0x00, 0x3F, 0xCF,
+ 0xE0, 0x00, 0x0F, 0xEF, 0xF0, 0x00, 0x07, 0xF7, 0xF8, 0x00, 0x03, 0xFF,
+ 0xFC, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x7F,
+ 0xFF, 0x80, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0x0F,
+ 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x03, 0xFD, 0xFC, 0x00, 0x01,
+ 0xFC, 0xFE, 0x00, 0x01, 0xFE, 0x7F, 0x80, 0x00, 0xFF, 0x1F, 0xC0, 0x00,
+ 0x7F, 0x0F, 0xE0, 0x00, 0x3F, 0x83, 0xF8, 0x00, 0x3F, 0x80, 0xFC, 0x00,
+ 0x1F, 0x80, 0x3F, 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x1F, 0x80, 0x03, 0xF8,
+ 0x3F, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xFF,
+ 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0x01, 0xFE, 0x1F, 0xE0, 0x7F, 0x81, 0xFC,
+ 0x1F, 0xE0, 0x7F, 0x87, 0xF8, 0x0F, 0xE1, 0xFE, 0x03, 0xFC, 0x7F, 0x80,
+ 0xFF, 0x1F, 0xE0, 0x3F, 0xC7, 0xF8, 0x0F, 0xF1, 0xFE, 0x03, 0xFC, 0x7F,
+ 0x80, 0xFF, 0x1F, 0xE0, 0x3F, 0x87, 0xF8, 0x1F, 0xE1, 0xFE, 0x07, 0xF0,
+ 0x7F, 0x87, 0xF8, 0x1F, 0xFF, 0xF8, 0x07, 0xFF, 0xF8, 0x01, 0xFE, 0x00,
+ 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0x01, 0xFE,
+ 0x00, 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0x01,
+ 0xFE, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF8, 0x00,
+ 0x03, 0xFF, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00,
+ 0x3F, 0xFF, 0x80, 0x00, 0x3F, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0xFC, 0x00,
+ 0x7E, 0x00, 0x3F, 0x00, 0x7E, 0x00, 0x1F, 0xC0, 0x7F, 0x00, 0x07, 0xF0,
+ 0x3F, 0x00, 0x03, 0xF8, 0x3F, 0x80, 0x00, 0xFE, 0x1F, 0xC0, 0x00, 0x7F,
+ 0x1F, 0xE0, 0x00, 0x3F, 0xCF, 0xE0, 0x00, 0x0F, 0xE7, 0xF0, 0x00, 0x07,
+ 0xF7, 0xF8, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x3F, 0xFF, 0xC0, 0x00,
+ 0x1F, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xF8, 0x00,
+ 0x03, 0xFD, 0xFC, 0x00, 0x01, 0xFC, 0xFE, 0x00, 0x01, 0xFE, 0x7F, 0x80,
+ 0x00, 0xFF, 0x1F, 0xC0, 0x00, 0x7F, 0x0F, 0xE0, 0x00, 0x3F, 0x83, 0xF8,
+ 0x00, 0x3F, 0x80, 0xFC, 0x00, 0x1F, 0x80, 0x3F, 0x00, 0x1F, 0x80, 0x0F,
+ 0xC0, 0x1F, 0x80, 0x03, 0xF0, 0x1F, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00,
+ 0x0F, 0xFC, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x01, 0xFF, 0xC0, 0x00,
+ 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x07, 0xFF, 0x80,
+ 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0xFF, 0xFF, 0xE0,
+ 0x00, 0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0xC3, 0xFC, 0x00, 0xFF, 0x01, 0xFC,
+ 0x01, 0xFE, 0x03, 0xFC, 0x03, 0xFC, 0x03, 0xF8, 0x07, 0xF8, 0x07, 0xF8,
+ 0x0F, 0xF0, 0x0F, 0xF0, 0x1F, 0xE0, 0x1F, 0xE0, 0x3F, 0xC0, 0x3F, 0xC0,
+ 0x7F, 0x80, 0x7F, 0x80, 0xFF, 0x00, 0xFF, 0x01, 0xFE, 0x01, 0xFC, 0x03,
+ 0xFC, 0x07, 0xF8, 0x07, 0xF8, 0x1F, 0xE0, 0x0F, 0xF0, 0xFF, 0x00, 0x1F,
+ 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x7F, 0x9F, 0xE0, 0x00, 0xFF,
+ 0x3F, 0xC0, 0x01, 0xFE, 0x3F, 0xC0, 0x03, 0xFC, 0x7F, 0xC0, 0x07, 0xF8,
+ 0x7F, 0xC0, 0x0F, 0xF0, 0x7F, 0x80, 0x1F, 0xE0, 0xFF, 0x80, 0x3F, 0xC0,
+ 0xFF, 0x80, 0x7F, 0x80, 0xFF, 0x00, 0xFF, 0x01, 0xFF, 0x01, 0xFE, 0x01,
+ 0xFF, 0x03, 0xFC, 0x01, 0xFF, 0x0F, 0xFC, 0x03, 0xFE, 0x7F, 0xFE, 0x03,
+ 0xFF, 0x03, 0xF8, 0x10, 0x7F, 0xF9, 0x87, 0xC1, 0xFC, 0x78, 0x03, 0xE7,
+ 0x80, 0x0F, 0x3C, 0x00, 0x3B, 0xE0, 0x01, 0xDF, 0x00, 0x06, 0xF8, 0x00,
+ 0x37, 0xE0, 0x00, 0xBF, 0x80, 0x01, 0xFF, 0x00, 0x0F, 0xFE, 0x00, 0x3F,
+ 0xFC, 0x01, 0xFF, 0xF8, 0x07, 0xFF, 0xF0, 0x1F, 0xFF, 0xC0, 0x7F, 0xFF,
+ 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xE0, 0x03, 0xFF, 0x80, 0x07, 0xFC, 0x00,
+ 0x1F, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F,
+ 0xC0, 0x01, 0xEE, 0x00, 0x0F, 0x78, 0x00, 0xF3, 0xE0, 0x0F, 0x9F, 0xC0,
+ 0xF8, 0x8F, 0xFF, 0x04, 0x0F, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFC, 0x3F, 0xC3, 0xFF, 0x03, 0xFC, 0x0F, 0xE0, 0x3F, 0xC0,
+ 0x7C, 0x03, 0xFC, 0x03, 0xC0, 0x3F, 0xC0, 0x38, 0x03, 0xFC, 0x01, 0x80,
+ 0x3F, 0xC0, 0x10, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC,
+ 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00,
+ 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F,
+ 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC, 0x00,
+ 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03,
+ 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0,
+ 0x00, 0x03, 0xFC, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xFF, 0xC0, 0xFF,
+ 0xFE, 0x07, 0xFC, 0xFF, 0xC0, 0x07, 0xC1, 0xFE, 0x00, 0x0E, 0x07, 0xF8,
+ 0x00, 0x18, 0x1F, 0xE0, 0x00, 0x60, 0x7F, 0x80, 0x01, 0x81, 0xFE, 0x00,
+ 0x06, 0x07, 0xF8, 0x00, 0x18, 0x1F, 0xE0, 0x00, 0x60, 0x7F, 0x80, 0x01,
+ 0x81, 0xFE, 0x00, 0x06, 0x07, 0xF8, 0x00, 0x18, 0x1F, 0xE0, 0x00, 0x60,
+ 0x7F, 0x80, 0x01, 0x81, 0xFE, 0x00, 0x06, 0x07, 0xF8, 0x00, 0x18, 0x1F,
+ 0xE0, 0x00, 0x60, 0x7F, 0x80, 0x01, 0x81, 0xFE, 0x00, 0x06, 0x07, 0xF8,
+ 0x00, 0x18, 0x1F, 0xE0, 0x00, 0x60, 0x7F, 0x80, 0x01, 0x81, 0xFE, 0x00,
+ 0x06, 0x07, 0xF8, 0x00, 0x18, 0x1F, 0xE0, 0x00, 0x60, 0x7F, 0x80, 0x03,
+ 0x00, 0xFF, 0x00, 0x0C, 0x03, 0xFC, 0x00, 0x30, 0x07, 0xF0, 0x01, 0x80,
+ 0x0F, 0xE0, 0x0E, 0x00, 0x1F, 0xE0, 0xF0, 0x00, 0x1F, 0xFF, 0x00, 0x00,
+ 0x1F, 0xF0, 0x00, 0xFF, 0xFF, 0x01, 0xFF, 0x9F, 0xFC, 0x00, 0x1F, 0x07,
+ 0xFC, 0x00, 0x07, 0x01, 0xFE, 0x00, 0x03, 0x00, 0x7F, 0x80, 0x03, 0x80,
+ 0x3F, 0xC0, 0x01, 0x80, 0x1F, 0xE0, 0x00, 0xC0, 0x07, 0xF8, 0x00, 0xC0,
+ 0x03, 0xFC, 0x00, 0x60, 0x00, 0xFF, 0x00, 0x30, 0x00, 0x7F, 0x80, 0x30,
+ 0x00, 0x1F, 0xE0, 0x18, 0x00, 0x0F, 0xF0, 0x18, 0x00, 0x07, 0xF8, 0x0C,
+ 0x00, 0x01, 0xFE, 0x06, 0x00, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x3F, 0xC3,
+ 0x00, 0x00, 0x1F, 0xE3, 0x80, 0x00, 0x0F, 0xF1, 0x80, 0x00, 0x03, 0xFC,
+ 0xC0, 0x00, 0x01, 0xFE, 0xC0, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x00, 0x3F,
+ 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x03,
+ 0xF8, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00,
+ 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x01, 0x80, 0x00, 0xFF, 0xF8, 0x7F, 0xFF, 0x0F, 0xFB, 0xFF, 0x00, 0xFF,
+ 0xC0, 0x1F, 0x0F, 0xF0, 0x03, 0xFC, 0x00, 0x70, 0x3F, 0x80, 0x0F, 0xE0,
+ 0x03, 0x81, 0xFE, 0x00, 0x7F, 0x80, 0x1C, 0x0F, 0xF0, 0x03, 0xFC, 0x00,
+ 0xC0, 0x3F, 0x80, 0x0F, 0xE0, 0x06, 0x01, 0xFE, 0x00, 0x7F, 0x00, 0x70,
+ 0x0F, 0xF0, 0x07, 0xFC, 0x03, 0x00, 0x3F, 0x80, 0x3F, 0xE0, 0x18, 0x01,
+ 0xFE, 0x01, 0xFF, 0x01, 0xC0, 0x0F, 0xF0, 0x1B, 0xFC, 0x0C, 0x00, 0x3F,
+ 0x80, 0xCF, 0xE0, 0x60, 0x01, 0xFE, 0x06, 0x7F, 0x07, 0x00, 0x0F, 0xF0,
+ 0x63, 0xFC, 0x30, 0x00, 0x3F, 0x83, 0x0F, 0xE1, 0x80, 0x01, 0xFE, 0x30,
+ 0x7F, 0x1C, 0x00, 0x07, 0xF1, 0x81, 0xFC, 0xC0, 0x00, 0x3F, 0x8C, 0x0F,
+ 0xE6, 0x00, 0x01, 0xFE, 0xC0, 0x7F, 0x70, 0x00, 0x07, 0xF6, 0x01, 0xFB,
+ 0x00, 0x00, 0x3F, 0xE0, 0x0F, 0xF8, 0x00, 0x01, 0xFF, 0x00, 0x7F, 0xC0,
+ 0x00, 0x07, 0xF8, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x00,
+ 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x00, 0x07, 0xE0, 0x01, 0xF0, 0x00, 0x00,
+ 0x3E, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x00, 0x07,
+ 0x00, 0x01, 0xC0, 0x00, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x00, 0x01, 0xC0,
+ 0x00, 0x70, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0x0F,
+ 0xFF, 0x3F, 0xF8, 0x01, 0xF8, 0x1F, 0xF8, 0x01, 0xE0, 0x0F, 0xF8, 0x01,
+ 0xC0, 0x0F, 0xF8, 0x01, 0x80, 0x07, 0xFC, 0x03, 0x80, 0x03, 0xFE, 0x07,
+ 0x00, 0x03, 0xFE, 0x06, 0x00, 0x01, 0xFF, 0x0C, 0x00, 0x00, 0xFF, 0x9C,
+ 0x00, 0x00, 0xFF, 0x98, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x3F, 0xF0,
+ 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x0F, 0xF0,
+ 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x0F, 0xFC,
+ 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x19, 0xFE, 0x00, 0x00, 0x31, 0xFF,
+ 0x00, 0x00, 0x70, 0xFF, 0x80, 0x00, 0x60, 0x7F, 0x80, 0x00, 0xC0, 0x7F,
+ 0xC0, 0x01, 0xC0, 0x3F, 0xE0, 0x03, 0x80, 0x1F, 0xE0, 0x07, 0x00, 0x1F,
+ 0xF0, 0x07, 0x00, 0x0F, 0xF8, 0x0F, 0x00, 0x0F, 0xF8, 0x3F, 0x80, 0x1F,
+ 0xFC, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0x7F, 0xF0, 0x00,
+ 0x7E, 0x1F, 0xF0, 0x00, 0x38, 0x1F, 0xF0, 0x00, 0x38, 0x0F, 0xF0, 0x00,
+ 0x70, 0x0F, 0xF8, 0x00, 0x60, 0x07, 0xF8, 0x00, 0x60, 0x07, 0xFC, 0x00,
+ 0xC0, 0x03, 0xFC, 0x01, 0xC0, 0x01, 0xFE, 0x01, 0x80, 0x01, 0xFE, 0x03,
+ 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0xFF, 0x86, 0x00, 0x00, 0x7F, 0x8E,
+ 0x00, 0x00, 0x7F, 0xCC, 0x00, 0x00, 0x3F, 0xD8, 0x00, 0x00, 0x3F, 0xF8,
+ 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x0F, 0xF0,
+ 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0,
+ 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0,
+ 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0,
+ 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x7F, 0xFE,
+ 0x00, 0x3F, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xFC, 0x3F, 0x80, 0x7F, 0xC3,
+ 0xE0, 0x07, 0xF8, 0x38, 0x00, 0xFF, 0x83, 0x80, 0x0F, 0xF0, 0x30, 0x01,
+ 0xFE, 0x07, 0x00, 0x3F, 0xE0, 0x60, 0x03, 0xFC, 0x06, 0x00, 0x7F, 0xC0,
+ 0x00, 0x0F, 0xF8, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x01,
+ 0xFE, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x7F, 0x80,
+ 0x00, 0x0F, 0xF8, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x03,
+ 0xFE, 0x00, 0x00, 0x3F, 0xC0, 0x01, 0x07, 0xFC, 0x00, 0x30, 0xFF, 0x80,
+ 0x03, 0x0F, 0xF0, 0x00, 0x31, 0xFF, 0x00, 0x07, 0x1F, 0xE0, 0x00, 0xF3,
+ 0xFE, 0x00, 0x1E, 0x7F, 0xC0, 0x03, 0xE7, 0xF8, 0x01, 0xFE, 0xFF, 0xFF,
+ 0xFF, 0xEF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xF0, 0x7C, 0x0F, 0x81,
+ 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0,
+ 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E,
+ 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07,
+ 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xFF, 0xFF, 0xF8, 0xF0,
+ 0x01, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0xC0, 0x07, 0x80, 0x0F, 0x00,
+ 0x1F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x7C, 0x00, 0x78, 0x00, 0xF0, 0x01,
+ 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1F,
+ 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0,
+ 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00,
+ 0x1E, 0xFF, 0xFF, 0xFC, 0x1F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F,
+ 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03,
+ 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0,
+ 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C,
+ 0x0F, 0x81, 0xF0, 0x3F, 0xFF, 0xFF, 0xF8, 0x00, 0x78, 0x00, 0x07, 0xC0,
+ 0x00, 0x3F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xE0, 0x01, 0xEF, 0x00, 0x0F,
+ 0x3C, 0x00, 0xF1, 0xE0, 0x07, 0x87, 0x80, 0x78, 0x3C, 0x03, 0xC0, 0xF0,
+ 0x3C, 0x07, 0x81, 0xE0, 0x1E, 0x1E, 0x00, 0xF0, 0xF0, 0x07, 0xCF, 0x00,
+ 0x1E, 0x78, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x70, 0x1F, 0x03, 0xF0, 0x7E, 0x03, 0xE0, 0x3E, 0x01, 0xE0, 0x1E,
+ 0x00, 0xE0, 0x03, 0xFC, 0x00, 0x3F, 0xFC, 0x03, 0xE1, 0xF8, 0x0F, 0x03,
+ 0xF0, 0x7C, 0x07, 0xC1, 0xF8, 0x1F, 0x87, 0xE0, 0x7E, 0x1F, 0x81, 0xF8,
+ 0x3C, 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x01, 0xFE, 0x00, 0x3F, 0xF8, 0x03,
+ 0xE7, 0xE0, 0x3E, 0x1F, 0x83, 0xF0, 0x7E, 0x1F, 0x81, 0xF8, 0x7E, 0x07,
+ 0xE3, 0xF8, 0x1F, 0x8F, 0xE0, 0x7E, 0x3F, 0x83, 0xF8, 0xFF, 0x1F, 0xE1,
+ 0xFF, 0xDF, 0xF7, 0xFE, 0x3F, 0x07, 0xE0, 0xF8, 0xFF, 0x80, 0x00, 0x1F,
+ 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x00,
+ 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x80, 0x00,
+ 0x0F, 0xC7, 0xF0, 0x07, 0xEF, 0xFE, 0x03, 0xFC, 0x3F, 0x81, 0xFC, 0x0F,
+ 0xE0, 0xFC, 0x03, 0xF0, 0x7E, 0x01, 0xFC, 0x3F, 0x00, 0xFE, 0x1F, 0x80,
+ 0x3F, 0x8F, 0xC0, 0x1F, 0xC7, 0xE0, 0x0F, 0xE3, 0xF0, 0x07, 0xF1, 0xF8,
+ 0x03, 0xF8, 0xFC, 0x01, 0xFC, 0x7E, 0x00, 0xFE, 0x3F, 0x00, 0x7F, 0x1F,
+ 0x80, 0x3F, 0x0F, 0xC0, 0x1F, 0x87, 0xE0, 0x1F, 0xC3, 0xF0, 0x0F, 0xC1,
+ 0xF8, 0x07, 0xE0, 0xFE, 0x07, 0xE0, 0x73, 0x87, 0xE0, 0x30, 0xFF, 0xC0,
+ 0x10, 0x1F, 0x80, 0x00, 0x00, 0xFC, 0x00, 0x7F, 0xE0, 0x3E, 0x3E, 0x0F,
+ 0x83, 0xE3, 0xE0, 0x7C, 0x7C, 0x0F, 0x9F, 0x01, 0xF3, 0xE0, 0x1C, 0x7C,
+ 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8,
+ 0x00, 0x3F, 0x00, 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x01, 0xFC,
+ 0x00, 0x1F, 0xC0, 0x21, 0xFE, 0x0C, 0x3F, 0xFF, 0x01, 0xFF, 0x80, 0x0F,
+ 0xC0, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01,
+ 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01,
+ 0xF8, 0x00, 0x01, 0xF8, 0x03, 0xF1, 0xF8, 0x07, 0xFD, 0xF8, 0x1F, 0xC7,
+ 0xF8, 0x1F, 0x83, 0xF8, 0x3F, 0x01, 0xF8, 0x7F, 0x01, 0xF8, 0x7E, 0x01,
+ 0xF8, 0x7E, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01,
+ 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01,
+ 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0x7E, 0x01, 0xF8, 0x7F, 0x01,
+ 0xF8, 0x3F, 0x03, 0xF8, 0x3F, 0x03, 0xF8, 0x1F, 0x87, 0xFC, 0x0F, 0xFD,
+ 0xFF, 0x03, 0xF1, 0xC0, 0x03, 0xF0, 0x03, 0xFF, 0x01, 0xE1, 0xE0, 0xF8,
+ 0x7C, 0x3C, 0x0F, 0x1F, 0x03, 0xE7, 0xC0, 0xFB, 0xF0, 0x3E, 0xFC, 0x0F,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F,
+ 0xC0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x1F, 0x80, 0x07, 0xF0, 0x0C, 0xFC,
+ 0x06, 0x3F, 0xC3, 0x07, 0xFF, 0x80, 0xFF, 0xC0, 0x0F, 0xC0, 0x00, 0xFC,
+ 0x01, 0xFF, 0x81, 0xF1, 0xC1, 0xF0, 0xF0, 0xF8, 0xF8, 0xFC, 0x7C, 0x7E,
+ 0x1C, 0x3F, 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0x1F, 0xFF, 0x0F,
+ 0xFF, 0x80, 0xFC, 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x1F, 0x80, 0x0F, 0xC0,
+ 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x3F,
+ 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00,
+ 0xFC, 0x00, 0x7E, 0x00, 0x7F, 0x80, 0xFF, 0xF8, 0x00, 0x07, 0xF0, 0x03,
+ 0xFF, 0xFC, 0xF8, 0x7F, 0xBE, 0x07, 0x87, 0xC0, 0xF9, 0xF8, 0x1F, 0xBF,
+ 0x03, 0xF7, 0xE0, 0x7E, 0xFC, 0x0F, 0xDF, 0x81, 0xF9, 0xF0, 0x3F, 0x3E,
+ 0x07, 0xC3, 0xE1, 0xF8, 0x3C, 0x7E, 0x01, 0xFF, 0x00, 0x60, 0x00, 0x38,
+ 0x00, 0x0F, 0x00, 0x01, 0xF0, 0x00, 0x7F, 0xFF, 0x0F, 0xFF, 0xF9, 0xFF,
+ 0xFF, 0x9F, 0xFF, 0xF9, 0xFF, 0xFF, 0x0F, 0xFF, 0xEF, 0x00, 0x3F, 0xC0,
+ 0x03, 0xF8, 0x00, 0x7F, 0x00, 0x1C, 0xF8, 0x07, 0x0F, 0xFF, 0xC0, 0x7F,
+ 0xC0, 0xFF, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80,
+ 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80,
+ 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x87, 0xE0, 0x1F, 0x9F, 0xF0, 0x1F, 0xBF,
+ 0xF8, 0x1F, 0xF1, 0xF8, 0x1F, 0xC0, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80,
+ 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80,
+ 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80,
+ 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80,
+ 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x3F, 0xC1, 0xFE, 0xFF, 0xE3,
+ 0xFF, 0x0F, 0x07, 0xE1, 0xFE, 0x3F, 0xC7, 0xF8, 0x7F, 0x03, 0xC0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7F, 0xC3, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F,
+ 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83,
+ 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE1, 0xFE, 0xFF, 0xE0, 0x00,
+ 0x70, 0x07, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x07, 0xF0, 0x0F, 0x80,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0xFC, 0x03, 0xF0,
+ 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC,
+ 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F,
+ 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F,
+ 0xDC, 0x3F, 0xF8, 0xFB, 0xE3, 0xEF, 0x0F, 0xBC, 0x7C, 0x7F, 0xE0, 0x7E,
+ 0x00, 0xFF, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xF0,
+ 0x00, 0x01, 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F,
+ 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xE1, 0xFF, 0x83,
+ 0xF0, 0x3F, 0x01, 0xF8, 0x0E, 0x00, 0xFC, 0x06, 0x00, 0x7E, 0x06, 0x00,
+ 0x3F, 0x06, 0x00, 0x1F, 0x86, 0x00, 0x0F, 0xC7, 0x00, 0x07, 0xE7, 0x80,
+ 0x03, 0xF7, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7E, 0x7F,
+ 0x00, 0x3F, 0x1F, 0xC0, 0x1F, 0x8F, 0xE0, 0x0F, 0xC3, 0xF8, 0x07, 0xE0,
+ 0xFE, 0x03, 0xF0, 0x7F, 0x81, 0xF8, 0x1F, 0xC0, 0xFC, 0x0F, 0xF0, 0xFF,
+ 0x07, 0xFD, 0xFF, 0xC7, 0xFF, 0xFF, 0x87, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8,
+ 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F,
+ 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07,
+ 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x0F, 0xF7,
+ 0xFF, 0x00, 0x07, 0xE0, 0x3F, 0x07, 0xFC, 0xFF, 0x87, 0xFC, 0x0F, 0xEF,
+ 0xFE, 0x7F, 0xF0, 0x3F, 0xC3, 0xFF, 0x1F, 0x81, 0xFC, 0x0F, 0xE0, 0x7E,
+ 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x7E, 0x03, 0xF0, 0x1F, 0x83, 0xF0, 0x1F,
+ 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0xFC, 0x07, 0xE0, 0x3F, 0x07,
+ 0xE0, 0x3F, 0x01, 0xF8, 0x3F, 0x01, 0xF8, 0x0F, 0xC1, 0xF8, 0x0F, 0xC0,
+ 0x7E, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x7E, 0x03, 0xF0, 0x1F, 0x83, 0xF0,
+ 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0xFC, 0x07, 0xE0, 0x3F,
+ 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x3F, 0x01, 0xF8, 0x0F, 0xC1, 0xF8, 0x0F,
+ 0xC0, 0x7E, 0x1F, 0xE0, 0xFF, 0x07, 0xFB, 0xFF, 0x8F, 0xFC, 0x7F, 0xE0,
+ 0x00, 0x07, 0xE0, 0xFF, 0x9F, 0xF0, 0x3F, 0xBF, 0xF8, 0x1F, 0xF1, 0xF8,
+ 0x1F, 0xC0, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC,
+ 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC,
+ 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC,
+ 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC,
+ 0x1F, 0x80, 0xFC, 0x3F, 0xC1, 0xFE, 0xFF, 0xE3, 0xFF, 0x01, 0xFC, 0x00,
+ 0x3F, 0xF8, 0x03, 0xE3, 0xE0, 0x3E, 0x0F, 0x83, 0xF0, 0x7E, 0x1F, 0x01,
+ 0xF1, 0xF8, 0x0F, 0xCF, 0xC0, 0x7E, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF,
+ 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F,
+ 0xFF, 0xC0, 0x7F, 0x7E, 0x03, 0xF3, 0xF0, 0x1F, 0x8F, 0x80, 0xF8, 0x7E,
+ 0x0F, 0xC1, 0xF0, 0x7C, 0x07, 0xC7, 0xC0, 0x1F, 0xFC, 0x00, 0x3F, 0x80,
+ 0x00, 0x0F, 0xC0, 0xFF, 0xBF, 0xF0, 0x3F, 0xF1, 0xF8, 0x1F, 0xC0, 0xFC,
+ 0x1F, 0xC0, 0xFC, 0x1F, 0x80, 0xFE, 0x1F, 0x80, 0x7E, 0x1F, 0x80, 0x7F,
+ 0x1F, 0x80, 0x7F, 0x1F, 0x80, 0x7F, 0x1F, 0x80, 0x7F, 0x1F, 0x80, 0x7F,
+ 0x1F, 0x80, 0x7F, 0x1F, 0x80, 0x7F, 0x1F, 0x80, 0x7F, 0x1F, 0x80, 0x7F,
+ 0x1F, 0x80, 0x7E, 0x1F, 0x80, 0x7E, 0x1F, 0x80, 0xFE, 0x1F, 0x80, 0xFC,
+ 0x1F, 0xC1, 0xF8, 0x1F, 0xE3, 0xF8, 0x1F, 0xBF, 0xE0, 0x1F, 0x8F, 0xC0,
+ 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00,
+ 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0xF8, 0x00,
+ 0x00, 0xF8, 0x08, 0x07, 0xFE, 0x18, 0x0F, 0xC7, 0x38, 0x1F, 0x83, 0xF8,
+ 0x3F, 0x01, 0xF8, 0x3F, 0x01, 0xF8, 0x7F, 0x01, 0xF8, 0x7E, 0x01, 0xF8,
+ 0x7E, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8,
+ 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8,
+ 0xFE, 0x01, 0xF8, 0x7E, 0x01, 0xF8, 0x7F, 0x01, 0xF8, 0x7F, 0x01, 0xF8,
+ 0x3F, 0x83, 0xF8, 0x1F, 0xC7, 0xF8, 0x0F, 0xFD, 0xF8, 0x03, 0xF1, 0xF8,
+ 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8,
+ 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xFF,
+ 0x00, 0x07, 0x9F, 0xF3, 0xF8, 0xFE, 0xFF, 0x8F, 0xFF, 0xF1, 0xFE, 0x7E,
+ 0x3F, 0x87, 0x87, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00,
+ 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00,
+ 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01,
+ 0xF8, 0x00, 0x7F, 0x80, 0x3F, 0xFC, 0x00, 0x0F, 0x84, 0x3F, 0xF8, 0xE1,
+ 0xF3, 0x80, 0xEF, 0x00, 0xDE, 0x01, 0xBE, 0x01, 0x7E, 0x00, 0xFF, 0x01,
+ 0xFF, 0x81, 0xFF, 0xC3, 0xFF, 0xC3, 0xFF, 0xC1, 0xFF, 0x80, 0xFF, 0x80,
+ 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x00, 0x7E, 0x00, 0xFE, 0x01, 0xDF, 0x0F,
+ 0x37, 0xFC, 0x43, 0xF0, 0x01, 0x00, 0x0C, 0x00, 0x70, 0x01, 0xC0, 0x0F,
+ 0x00, 0x7C, 0x03, 0xF0, 0x1F, 0xC0, 0xFF, 0xF3, 0xFF, 0xC3, 0xF0, 0x0F,
+ 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03,
+ 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00,
+ 0xFC, 0x23, 0xF0, 0x8F, 0xE6, 0x1F, 0xF0, 0x7F, 0x80, 0xF8, 0x00, 0xFF,
+ 0x87, 0xFC, 0x1F, 0xC0, 0xFE, 0x07, 0xE0, 0x3F, 0x03, 0xF0, 0x1F, 0x81,
+ 0xF8, 0x0F, 0xC0, 0xFC, 0x07, 0xE0, 0x7E, 0x03, 0xF0, 0x3F, 0x01, 0xF8,
+ 0x1F, 0x80, 0xFC, 0x0F, 0xC0, 0x7E, 0x07, 0xE0, 0x3F, 0x03, 0xF0, 0x1F,
+ 0x81, 0xF8, 0x0F, 0xC0, 0xFC, 0x07, 0xE0, 0x7E, 0x03, 0xF0, 0x3F, 0x01,
+ 0xF8, 0x1F, 0x80, 0xFC, 0x0F, 0xC0, 0x7E, 0x07, 0xE0, 0x7F, 0x03, 0xF8,
+ 0x7F, 0xC0, 0xFF, 0xEF, 0xF8, 0x3F, 0xE7, 0xC0, 0x0F, 0xC2, 0x00, 0xFF,
+ 0xF1, 0xFC, 0xFF, 0x01, 0xE3, 0xFC, 0x03, 0x07, 0xF0, 0x0C, 0x1F, 0xC0,
+ 0x60, 0x3F, 0x81, 0x80, 0xFE, 0x04, 0x01, 0xF8, 0x30, 0x07, 0xF0, 0xC0,
+ 0x1F, 0xC6, 0x00, 0x3F, 0x98, 0x00, 0xFE, 0x40, 0x01, 0xFB, 0x00, 0x07,
+ 0xFC, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x01, 0xF0,
+ 0x00, 0x07, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00,
+ 0x01, 0x00, 0x00, 0xFF, 0xE7, 0xFF, 0x3F, 0xBF, 0xE0, 0xFE, 0x07, 0x0F,
+ 0xE0, 0x7F, 0x03, 0x83, 0xF0, 0x1F, 0x81, 0x81, 0xFC, 0x0F, 0xC0, 0xC0,
+ 0xFE, 0x07, 0xF0, 0x40, 0x3F, 0x03, 0xF8, 0x60, 0x1F, 0xC3, 0xFC, 0x30,
+ 0x07, 0xE1, 0xFE, 0x10, 0x03, 0xF0, 0x9F, 0x98, 0x01, 0xFC, 0xCF, 0xCC,
+ 0x00, 0x7E, 0x67, 0xEC, 0x00, 0x3F, 0xE1, 0xFE, 0x00, 0x1F, 0xF0, 0xFE,
+ 0x00, 0x07, 0xF0, 0x7F, 0x00, 0x03, 0xF8, 0x3F, 0x80, 0x00, 0xFC, 0x0F,
+ 0x80, 0x00, 0x7C, 0x07, 0xC0, 0x00, 0x3E, 0x03, 0xE0, 0x00, 0x0F, 0x00,
+ 0xE0, 0x00, 0x07, 0x00, 0x70, 0x00, 0x03, 0x80, 0x38, 0x00, 0x00, 0x80,
+ 0x08, 0x00, 0xFF, 0xF3, 0xFD, 0xFF, 0x03, 0xC3, 0xFC, 0x0E, 0x07, 0xF0,
+ 0x30, 0x1F, 0xE1, 0x80, 0x3F, 0x8C, 0x00, 0x7F, 0x70, 0x01, 0xFF, 0x80,
+ 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0x80, 0x00,
+ 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x1B, 0xF8, 0x00, 0xCF, 0xF0, 0x06, 0x1F,
+ 0xC0, 0x38, 0x3F, 0x80, 0xC0, 0xFF, 0x07, 0x01, 0xFC, 0x3C, 0x07, 0xFB,
+ 0xFC, 0x7F, 0xF0, 0xFF, 0xE3, 0xFB, 0xFC, 0x07, 0x8F, 0xE0, 0x18, 0x7F,
+ 0x01, 0x81, 0xF8, 0x0C, 0x0F, 0xE0, 0x60, 0x7F, 0x06, 0x01, 0xF8, 0x30,
+ 0x0F, 0xE1, 0x80, 0x7F, 0x18, 0x01, 0xF8, 0xC0, 0x0F, 0xE6, 0x00, 0x3F,
+ 0x60, 0x01, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00,
+ 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x07, 0x00, 0x00, 0x38,
+ 0x00, 0x00, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x03, 0x82, 0x00, 0x3E,
+ 0x30, 0x01, 0xF1, 0x00, 0x0F, 0x98, 0x00, 0x3F, 0x80, 0x00, 0xF0, 0x00,
+ 0x00, 0x7F, 0xFF, 0xEF, 0xFF, 0xFD, 0xE0, 0x7F, 0x30, 0x1F, 0xC6, 0x07,
+ 0xF8, 0x80, 0xFE, 0x00, 0x3F, 0xC0, 0x07, 0xF0, 0x01, 0xFC, 0x00, 0x3F,
+ 0x80, 0x0F, 0xE0, 0x03, 0xFC, 0x00, 0x7F, 0x00, 0x1F, 0xE0, 0x03, 0xF8,
+ 0x00, 0xFE, 0x03, 0x3F, 0xC0, 0x67, 0xF0, 0x19, 0xFE, 0x07, 0x3F, 0x83,
+ 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0x80, 0x00, 0x7C, 0x07, 0xE0, 0x3E, 0x00,
+ 0xF8, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00,
+ 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0,
+ 0x1F, 0x00, 0xF8, 0x03, 0xC0, 0x3C, 0x01, 0xF0, 0x00, 0xF0, 0x03, 0xE0,
+ 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C,
+ 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F,
+ 0x00, 0x3E, 0x00, 0xF8, 0x01, 0xF8, 0x01, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xF0, 0xF8, 0x01, 0xF8, 0x01, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x3E, 0x00,
+ 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80,
+ 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0x7C, 0x00, 0xF0,
+ 0x00, 0xF0, 0x03, 0xE0, 0x3C, 0x01, 0xF0, 0x0F, 0x80, 0x3E, 0x00, 0xF8,
+ 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E,
+ 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x01, 0xF0, 0x07, 0xC0, 0x7E,
+ 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0xFF, 0xC0, 0x47, 0xFF, 0xC3, 0x9F,
+ 0xFF, 0xFF, 0x70, 0x7F, 0xF8, 0x80, 0x7F, 0xC0, 0x00, 0x3E, 0x00 };
+
+const GFXglyph FreeSerifBold24pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 12, 0, 1 }, // 0x20 ' '
+ { 0, 8, 34, 16, 4, -32 }, // 0x21 '!'
+ { 34, 17, 13, 26, 4, -32 }, // 0x22 '"'
+ { 62, 23, 33, 23, 0, -32 }, // 0x23 '#'
+ { 157, 21, 39, 24, 1, -34 }, // 0x24 '$'
+ { 260, 35, 34, 47, 6, -32 }, // 0x25 '%'
+ { 409, 34, 34, 39, 3, -32 }, // 0x26 '&'
+ { 554, 5, 13, 13, 4, -32 }, // 0x27 '''
+ { 563, 12, 41, 16, 2, -32 }, // 0x28 '('
+ { 625, 12, 41, 16, 1, -32 }, // 0x29 ')'
+ { 687, 18, 21, 24, 3, -32 }, // 0x2A '*'
+ { 735, 26, 25, 32, 3, -24 }, // 0x2B '+'
+ { 817, 8, 15, 12, 2, -6 }, // 0x2C ','
+ { 832, 11, 5, 16, 2, -12 }, // 0x2D '-'
+ { 839, 8, 8, 12, 2, -6 }, // 0x2E '.'
+ { 847, 15, 33, 13, -1, -32 }, // 0x2F '/'
+ { 909, 22, 34, 23, 1, -32 }, // 0x30 '0'
+ { 1003, 18, 33, 23, 3, -32 }, // 0x31 '1'
+ { 1078, 21, 33, 24, 1, -32 }, // 0x32 '2'
+ { 1165, 21, 34, 24, 1, -32 }, // 0x33 '3'
+ { 1255, 21, 33, 24, 1, -32 }, // 0x34 '4'
+ { 1342, 20, 32, 23, 2, -31 }, // 0x35 '5'
+ { 1422, 21, 34, 24, 1, -32 }, // 0x36 '6'
+ { 1512, 21, 32, 23, 1, -31 }, // 0x37 '7'
+ { 1596, 21, 34, 23, 1, -32 }, // 0x38 '8'
+ { 1686, 22, 34, 23, 1, -32 }, // 0x39 '9'
+ { 1780, 8, 24, 16, 4, -22 }, // 0x3A ':'
+ { 1804, 9, 31, 16, 3, -22 }, // 0x3B ';'
+ { 1839, 26, 26, 32, 3, -24 }, // 0x3C '<'
+ { 1924, 26, 17, 32, 3, -20 }, // 0x3D '='
+ { 1980, 26, 26, 32, 3, -24 }, // 0x3E '>'
+ { 2065, 18, 34, 24, 3, -32 }, // 0x3F '?'
+ { 2142, 33, 34, 44, 5, -32 }, // 0x40 '@'
+ { 2283, 32, 33, 34, 1, -32 }, // 0x41 'A'
+ { 2415, 28, 32, 31, 1, -31 }, // 0x42 'B'
+ { 2527, 30, 34, 33, 2, -32 }, // 0x43 'C'
+ { 2655, 32, 32, 34, 1, -31 }, // 0x44 'D'
+ { 2783, 28, 32, 32, 2, -31 }, // 0x45 'E'
+ { 2895, 25, 32, 29, 2, -31 }, // 0x46 'F'
+ { 2995, 33, 34, 36, 2, -32 }, // 0x47 'G'
+ { 3136, 33, 32, 37, 2, -31 }, // 0x48 'H'
+ { 3268, 15, 32, 18, 2, -31 }, // 0x49 'I'
+ { 3328, 22, 37, 24, 0, -31 }, // 0x4A 'J'
+ { 3430, 34, 32, 36, 2, -31 }, // 0x4B 'K'
+ { 3566, 28, 32, 31, 2, -31 }, // 0x4C 'L'
+ { 3678, 43, 32, 45, 0, -31 }, // 0x4D 'M'
+ { 3850, 31, 32, 34, 1, -31 }, // 0x4E 'N'
+ { 3974, 33, 34, 37, 2, -32 }, // 0x4F 'O'
+ { 4115, 26, 32, 30, 2, -31 }, // 0x50 'P'
+ { 4219, 33, 41, 37, 2, -32 }, // 0x51 'Q'
+ { 4389, 31, 32, 34, 2, -31 }, // 0x52 'R'
+ { 4513, 21, 34, 27, 3, -32 }, // 0x53 'S'
+ { 4603, 28, 32, 30, 1, -31 }, // 0x54 'T'
+ { 4715, 30, 33, 34, 2, -31 }, // 0x55 'U'
+ { 4839, 33, 32, 33, 0, -31 }, // 0x56 'V'
+ { 4971, 45, 33, 46, 1, -31 }, // 0x57 'W'
+ { 5157, 32, 32, 34, 1, -31 }, // 0x58 'X'
+ { 5285, 32, 32, 33, 1, -31 }, // 0x59 'Y'
+ { 5413, 28, 32, 30, 1, -31 }, // 0x5A 'Z'
+ { 5525, 11, 39, 16, 3, -31 }, // 0x5B '['
+ { 5579, 15, 33, 13, -1, -32 }, // 0x5C '\'
+ { 5641, 11, 39, 16, 2, -31 }, // 0x5D ']'
+ { 5695, 21, 17, 27, 3, -31 }, // 0x5E '^'
+ { 5740, 24, 3, 23, 0, 5 }, // 0x5F '_'
+ { 5749, 11, 9, 16, 0, -33 }, // 0x60 '`'
+ { 5762, 22, 24, 23, 1, -22 }, // 0x61 'a'
+ { 5828, 25, 33, 26, 0, -31 }, // 0x62 'b'
+ { 5932, 19, 24, 20, 1, -22 }, // 0x63 'c'
+ { 5989, 24, 33, 26, 1, -31 }, // 0x64 'd'
+ { 6088, 18, 24, 21, 1, -22 }, // 0x65 'e'
+ { 6142, 17, 33, 18, 1, -32 }, // 0x66 'f'
+ { 6213, 19, 32, 24, 2, -22 }, // 0x67 'g'
+ { 6289, 24, 32, 26, 0, -31 }, // 0x68 'h'
+ { 6385, 11, 33, 14, 1, -32 }, // 0x69 'i'
+ { 6431, 14, 42, 18, 0, -32 }, // 0x6A 'j'
+ { 6505, 25, 32, 26, 0, -31 }, // 0x6B 'k'
+ { 6605, 11, 32, 13, 0, -31 }, // 0x6C 'l'
+ { 6649, 37, 23, 39, 0, -22 }, // 0x6D 'm'
+ { 6756, 24, 23, 26, 0, -22 }, // 0x6E 'n'
+ { 6825, 21, 24, 24, 1, -22 }, // 0x6F 'o'
+ { 6888, 24, 32, 26, 0, -22 }, // 0x70 'p'
+ { 6984, 24, 32, 26, 1, -22 }, // 0x71 'q'
+ { 7080, 19, 23, 20, 0, -22 }, // 0x72 'r'
+ { 7135, 15, 24, 19, 2, -22 }, // 0x73 's'
+ { 7180, 14, 31, 16, 1, -29 }, // 0x74 't'
+ { 7235, 25, 23, 27, 0, -21 }, // 0x75 'u'
+ { 7307, 22, 23, 23, 0, -21 }, // 0x76 'v'
+ { 7371, 33, 23, 33, 0, -21 }, // 0x77 'w'
+ { 7466, 22, 22, 24, 1, -21 }, // 0x78 'x'
+ { 7527, 21, 31, 23, 0, -21 }, // 0x79 'y'
+ { 7609, 19, 22, 21, 1, -21 }, // 0x7A 'z'
+ { 7662, 14, 42, 19, 1, -33 }, // 0x7B '{'
+ { 7736, 4, 33, 10, 3, -32 }, // 0x7C '|'
+ { 7753, 14, 42, 19, 4, -33 }, // 0x7D '}'
+ { 7827, 22, 7, 24, 1, -14 } }; // 0x7E '~'
+
+const GFXfont FreeSerifBold24pt7b PROGMEM = {
+ (uint8_t *)FreeSerifBold24pt7bBitmaps,
+ (GFXglyph *)FreeSerifBold24pt7bGlyphs,
+ 0x20, 0x7E, 56 };
+
+// Approx. 8519 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBold9pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBold9pt7b.h
new file mode 100644
index 000000000000..52dbe36e1009
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBold9pt7b.h
@@ -0,0 +1,202 @@
+const uint8_t FreeSerifBold9pt7bBitmaps[] PROGMEM = {
+ 0xFF, 0xF4, 0x92, 0x1F, 0xF0, 0xCF, 0x3C, 0xE3, 0x88, 0x13, 0x09, 0x84,
+ 0xC2, 0x47, 0xF9, 0x90, 0xC8, 0x4C, 0xFF, 0x13, 0x09, 0x0C, 0x86, 0x40,
+ 0x10, 0x38, 0xD6, 0x92, 0xD2, 0xF0, 0x7C, 0x3E, 0x17, 0x93, 0x93, 0xD6,
+ 0x7C, 0x10, 0x3C, 0x21, 0xCF, 0x0E, 0x24, 0x30, 0xA0, 0xC5, 0x03, 0x34,
+ 0xE7, 0x26, 0x40, 0xB9, 0x04, 0xC4, 0x23, 0x30, 0x8C, 0x84, 0x1C, 0x0F,
+ 0x00, 0xCC, 0x06, 0x60, 0x3E, 0x00, 0xE7, 0x8F, 0x18, 0x9C, 0x8C, 0xE4,
+ 0xE3, 0xC7, 0x9E, 0x3C, 0x72, 0xFD, 0xE0, 0xFF, 0x80, 0x32, 0x44, 0xCC,
+ 0xCC, 0xCC, 0xC4, 0x62, 0x10, 0x84, 0x22, 0x33, 0x33, 0x33, 0x32, 0x64,
+ 0x80, 0x31, 0x6B, 0xB1, 0x8E, 0xD6, 0x8C, 0x00, 0x08, 0x04, 0x02, 0x01,
+ 0x0F, 0xF8, 0x40, 0x20, 0x10, 0x08, 0x00, 0xDF, 0x95, 0x00, 0xFF, 0xFF,
+ 0x80, 0x0C, 0x21, 0x86, 0x10, 0xC3, 0x08, 0x61, 0x84, 0x30, 0xC0, 0x1C,
+ 0x33, 0x98, 0xDC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0xB1, 0x98, 0xC3,
+ 0x80, 0x08, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0xBF, 0x3C, 0x3F,
+ 0x23, 0xC0, 0xE0, 0x70, 0x30, 0x38, 0x18, 0x18, 0x18, 0x5F, 0xDF, 0xE0,
+ 0x7C, 0x8E, 0x0E, 0x0E, 0x0C, 0x1E, 0x07, 0x03, 0x03, 0x02, 0xE6, 0xF8,
+ 0x06, 0x0E, 0x0E, 0x3E, 0x2E, 0x4E, 0x8E, 0x8E, 0xFF, 0xFF, 0x0E, 0x0E,
+ 0x3F, 0x7E, 0x40, 0x40, 0xF8, 0xFC, 0x1E, 0x06, 0x02, 0x02, 0xE4, 0xF8,
+ 0x07, 0x1C, 0x30, 0x70, 0xFC, 0xE6, 0xE7, 0xE7, 0xE7, 0x67, 0x66, 0x3C,
+ 0x7F, 0x3F, 0xA0, 0xD0, 0x40, 0x60, 0x30, 0x10, 0x18, 0x0C, 0x04, 0x06,
+ 0x03, 0x00, 0x3C, 0xC6, 0xC6, 0xC6, 0xFC, 0x7C, 0x3E, 0xCF, 0xC7, 0xC7,
+ 0xC6, 0x7C, 0x3E, 0x33, 0xB8, 0xDC, 0x7E, 0x3F, 0x1D, 0xCE, 0x7F, 0x07,
+ 0x07, 0x0F, 0x1C, 0x00, 0xFF, 0x80, 0x3F, 0xE0, 0xFF, 0x80, 0x37, 0xE5,
+ 0x40, 0x00, 0x00, 0x70, 0x78, 0x78, 0x78, 0x38, 0x03, 0x80, 0x3C, 0x03,
+ 0xC0, 0x30, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0xC0, 0x3C, 0x03,
+ 0xC0, 0x1C, 0x01, 0xC1, 0xE1, 0xE1, 0xE0, 0xE0, 0x00, 0x00, 0x3D, 0x9F,
+ 0x3E, 0x70, 0xE1, 0x04, 0x08, 0x00, 0x70, 0xE1, 0xC0, 0x0F, 0x81, 0x83,
+ 0x18, 0xC4, 0x89, 0x9C, 0x4C, 0xE4, 0x67, 0x22, 0x39, 0x22, 0x4F, 0xE3,
+ 0x00, 0x0C, 0x10, 0x1F, 0x00, 0x02, 0x00, 0x30, 0x01, 0xC0, 0x0E, 0x00,
+ 0xB8, 0x05, 0xC0, 0x4F, 0x02, 0x38, 0x3F, 0xE1, 0x07, 0x18, 0x3D, 0xE3,
+ 0xF0, 0xFF, 0x87, 0x1C, 0xE3, 0x9C, 0x73, 0x9C, 0x7F, 0x0E, 0x71, 0xC7,
+ 0x38, 0xE7, 0x1C, 0xE7, 0x7F, 0xC0, 0x1F, 0x26, 0x1D, 0xC1, 0xB0, 0x1E,
+ 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x0E, 0x04, 0xE1, 0x0F, 0xC0, 0xFF,
+ 0x0E, 0x71, 0xC7, 0x38, 0x77, 0x0E, 0xE1, 0xDC, 0x3B, 0x87, 0x70, 0xCE,
+ 0x39, 0xC6, 0x7F, 0x80, 0xFF, 0xCE, 0x19, 0xC1, 0x38, 0x87, 0x30, 0xFE,
+ 0x1C, 0xC3, 0x88, 0x70, 0x2E, 0x0D, 0xC3, 0x7F, 0xE0, 0xFF, 0xDC, 0x37,
+ 0x05, 0xC4, 0x73, 0x1F, 0xC7, 0x31, 0xC4, 0x70, 0x1C, 0x07, 0x03, 0xE0,
+ 0x1F, 0x23, 0x0E, 0x70, 0x6E, 0x02, 0xE0, 0x0E, 0x00, 0xE1, 0xFE, 0x0E,
+ 0x60, 0xE7, 0x0E, 0x38, 0xE0, 0xF8, 0xF9, 0xF7, 0x0E, 0x70, 0xE7, 0x0E,
+ 0x70, 0xE7, 0xFE, 0x70, 0xE7, 0x0E, 0x70, 0xE7, 0x0E, 0x70, 0xEF, 0x9F,
+ 0xFB, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9D, 0xF0, 0x1F, 0x0E, 0x0E, 0x0E,
+ 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0xCE, 0xCC, 0x78, 0xF9, 0xF3,
+ 0x82, 0x1C, 0x20, 0xE2, 0x07, 0x20, 0x3F, 0x01, 0xDC, 0x0E, 0x70, 0x73,
+ 0xC3, 0x8F, 0x1C, 0x3D, 0xF3, 0xF0, 0xF8, 0x0E, 0x01, 0xC0, 0x38, 0x07,
+ 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x2E, 0x09, 0xC3, 0x7F, 0xE0, 0xF8,
+ 0x0F, 0x3C, 0x1E, 0x3C, 0x1E, 0x2E, 0x2E, 0x2E, 0x2E, 0x26, 0x4E, 0x27,
+ 0x4E, 0x27, 0x4E, 0x23, 0x8E, 0x23, 0x8E, 0x21, 0x0E, 0x71, 0x1F, 0xF0,
+ 0xEE, 0x09, 0xE1, 0x3E, 0x25, 0xE4, 0x9E, 0x91, 0xD2, 0x1E, 0x43, 0xC8,
+ 0x39, 0x03, 0x70, 0x20, 0x1F, 0x83, 0x0C, 0x70, 0xEE, 0x07, 0xE0, 0x7E,
+ 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x77, 0x0E, 0x30, 0xC1, 0xF8, 0xFF, 0x1C,
+ 0xE7, 0x1D, 0xC7, 0x71, 0xDC, 0xE7, 0xF1, 0xC0, 0x70, 0x1C, 0x07, 0x03,
+ 0xE0, 0x0F, 0x83, 0x9C, 0x70, 0xE6, 0x06, 0xE0, 0x7E, 0x07, 0xE0, 0x7E,
+ 0x07, 0xE0, 0x76, 0x06, 0x30, 0xC1, 0x98, 0x0F, 0x00, 0x78, 0x03, 0xE0,
+ 0xFF, 0x07, 0x38, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x38, 0x7E, 0x07, 0x70,
+ 0x77, 0x87, 0x3C, 0x71, 0xEF, 0x8F, 0x39, 0x47, 0xC1, 0xC0, 0xF0, 0x7C,
+ 0x3E, 0x0F, 0x83, 0xC3, 0xC6, 0xBC, 0xFF, 0xFC, 0xE3, 0x8E, 0x10, 0xE0,
+ 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x01, 0xF0,
+ 0xF8, 0xEE, 0x09, 0xC1, 0x38, 0x27, 0x04, 0xE0, 0x9C, 0x13, 0x82, 0x70,
+ 0x4E, 0x08, 0xE2, 0x0F, 0x80, 0xFC, 0x7B, 0xC1, 0x0E, 0x08, 0x70, 0x81,
+ 0xC4, 0x0E, 0x20, 0x7A, 0x01, 0xD0, 0x0E, 0x80, 0x38, 0x01, 0xC0, 0x04,
+ 0x00, 0x20, 0x00, 0xFD, 0xFB, 0xDC, 0x38, 0x43, 0x87, 0x10, 0xE1, 0xC4,
+ 0x38, 0xF2, 0x07, 0x2E, 0x81, 0xD3, 0xA0, 0x34, 0x70, 0x0E, 0x1C, 0x03,
+ 0x87, 0x00, 0x60, 0x80, 0x10, 0x20, 0xFE, 0xF3, 0xC3, 0x0F, 0x10, 0x39,
+ 0x00, 0xF0, 0x03, 0x80, 0x1E, 0x01, 0x70, 0x09, 0xC0, 0x8F, 0x08, 0x3D,
+ 0xF3, 0xF0, 0xFC, 0x7B, 0xC1, 0x8E, 0x08, 0x38, 0x81, 0xE8, 0x07, 0x40,
+ 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x1F, 0x00, 0xFF, 0xD8,
+ 0x72, 0x1E, 0x43, 0x80, 0xE0, 0x1C, 0x07, 0x01, 0xC0, 0x38, 0x2E, 0x0F,
+ 0x83, 0x7F, 0xE0, 0xFC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xF0, 0xC1,
+ 0x06, 0x18, 0x20, 0xC3, 0x04, 0x18, 0x60, 0x83, 0x0C, 0xF3, 0x33, 0x33,
+ 0x33, 0x33, 0x33, 0x33, 0xF0, 0x18, 0x1C, 0x34, 0x26, 0x62, 0x43, 0xC1,
+ 0xFF, 0x80, 0xC6, 0x30, 0x7C, 0x63, 0xB1, 0xC0, 0xE1, 0xF3, 0x3B, 0x9D,
+ 0xCE, 0xFF, 0x80, 0xF0, 0x1C, 0x07, 0x01, 0xDC, 0x7B, 0x9C, 0x77, 0x1D,
+ 0xC7, 0x71, 0xDC, 0x77, 0x39, 0x3C, 0x3C, 0xED, 0x9F, 0x0E, 0x1C, 0x38,
+ 0x39, 0x3C, 0x07, 0x80, 0xE0, 0x38, 0xEE, 0x77, 0xB8, 0xEE, 0x3B, 0x8E,
+ 0xE3, 0xB8, 0xE7, 0x78, 0xEF, 0x3C, 0x66, 0xE6, 0xFE, 0xE0, 0xE0, 0xE0,
+ 0x72, 0x3C, 0x3E, 0xED, 0xC7, 0xC7, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC7,
+ 0xC0, 0x31, 0xDF, 0xBF, 0x7E, 0xE7, 0x90, 0x60, 0xFC, 0xFE, 0x0C, 0x17,
+ 0xC0, 0xF0, 0x1C, 0x07, 0x01, 0xDC, 0x7B, 0x9C, 0xE7, 0x39, 0xCE, 0x73,
+ 0x9C, 0xE7, 0x3B, 0xFF, 0x73, 0x9D, 0xE7, 0x39, 0xCE, 0x73, 0x9D, 0xF0,
+ 0x1C, 0x71, 0xCF, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x7D, 0xBE,
+ 0xF0, 0x1C, 0x07, 0x01, 0xCE, 0x71, 0x1C, 0x87, 0x41, 0xF8, 0x77, 0x1C,
+ 0xE7, 0x1B, 0xEF, 0xF3, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9D, 0xF0, 0xF7,
+ 0x38, 0xF7, 0xB9, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7,
+ 0x39, 0xCE, 0xFF, 0xFE, 0xF7, 0x1E, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7,
+ 0x39, 0xCE, 0xFF, 0xC0, 0x3E, 0x31, 0xB8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8E,
+ 0xC6, 0x3E, 0x00, 0xF7, 0x1E, 0xE7, 0x1D, 0xC7, 0x71, 0xDC, 0x77, 0x1D,
+ 0xCE, 0x7F, 0x1C, 0x07, 0x01, 0xC0, 0xF8, 0x00, 0x3C, 0x9C, 0xEE, 0x3B,
+ 0x8E, 0xE3, 0xB8, 0xEE, 0x39, 0xCE, 0x3F, 0x80, 0xE0, 0x38, 0x0E, 0x07,
+ 0xC0, 0xF7, 0x7B, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0xF8, 0x7E, 0x73,
+ 0xC7, 0x8E, 0x39, 0xB0, 0x10, 0xCF, 0x9C, 0x71, 0xC7, 0x1C, 0x71, 0xD3,
+ 0x80, 0xF7, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x3F,
+ 0xC0, 0xFB, 0xB8, 0x8C, 0x87, 0x43, 0xC0, 0xE0, 0x70, 0x10, 0x08, 0x00,
+ 0xF7, 0xB6, 0x31, 0x73, 0xA3, 0x3A, 0x3D, 0xA3, 0xDC, 0x18, 0xC1, 0x88,
+ 0x10, 0x80, 0xFB, 0xB8, 0x8E, 0x83, 0x81, 0xC0, 0xF0, 0x98, 0xCE, 0xEF,
+ 0x80, 0xF7, 0x62, 0x72, 0x34, 0x34, 0x3C, 0x18, 0x18, 0x10, 0x10, 0x10,
+ 0xE0, 0xE0, 0xFF, 0x1C, 0x70, 0xE3, 0x87, 0x1C, 0x71, 0xFE, 0x19, 0x8C,
+ 0x63, 0x18, 0xCC, 0x61, 0x8C, 0x63, 0x18, 0xC3, 0xFF, 0xF8, 0xC3, 0x18,
+ 0xC6, 0x31, 0x86, 0x33, 0x18, 0xC6, 0x31, 0x98, 0xF0, 0x8E };
+
+const GFXglyph FreeSerifBold9pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 5, 0, 1 }, // 0x20 ' '
+ { 0, 3, 12, 6, 1, -11 }, // 0x21 '!'
+ { 5, 6, 5, 10, 2, -11 }, // 0x22 '"'
+ { 9, 9, 13, 9, 0, -12 }, // 0x23 '#'
+ { 24, 8, 14, 9, 1, -12 }, // 0x24 '$'
+ { 38, 14, 12, 18, 2, -11 }, // 0x25 '%'
+ { 59, 13, 12, 15, 1, -11 }, // 0x26 '&'
+ { 79, 2, 5, 5, 1, -11 }, // 0x27 '''
+ { 81, 4, 15, 6, 1, -11 }, // 0x28 '('
+ { 89, 4, 15, 6, 1, -11 }, // 0x29 ')'
+ { 97, 7, 7, 9, 2, -11 }, // 0x2A '*'
+ { 104, 9, 9, 12, 1, -8 }, // 0x2B '+'
+ { 115, 3, 6, 4, 1, -2 }, // 0x2C ','
+ { 118, 4, 2, 6, 1, -4 }, // 0x2D '-'
+ { 119, 3, 3, 4, 1, -2 }, // 0x2E '.'
+ { 121, 6, 13, 5, 0, -11 }, // 0x2F '/'
+ { 131, 9, 12, 9, 0, -11 }, // 0x30 '0'
+ { 145, 6, 12, 9, 1, -11 }, // 0x31 '1'
+ { 154, 9, 12, 9, 0, -11 }, // 0x32 '2'
+ { 168, 8, 12, 9, 0, -11 }, // 0x33 '3'
+ { 180, 8, 12, 9, 1, -11 }, // 0x34 '4'
+ { 192, 8, 12, 9, 1, -11 }, // 0x35 '5'
+ { 204, 8, 12, 9, 1, -11 }, // 0x36 '6'
+ { 216, 9, 12, 9, 0, -11 }, // 0x37 '7'
+ { 230, 8, 12, 9, 1, -11 }, // 0x38 '8'
+ { 242, 9, 12, 9, 0, -11 }, // 0x39 '9'
+ { 256, 3, 9, 6, 1, -8 }, // 0x3A ':'
+ { 260, 3, 12, 6, 2, -8 }, // 0x3B ';'
+ { 265, 10, 10, 12, 1, -9 }, // 0x3C '<'
+ { 278, 10, 5, 12, 1, -6 }, // 0x3D '='
+ { 285, 10, 10, 12, 1, -8 }, // 0x3E '>'
+ { 298, 7, 12, 9, 1, -11 }, // 0x3F '?'
+ { 309, 13, 12, 17, 2, -11 }, // 0x40 '@'
+ { 329, 13, 12, 13, 0, -11 }, // 0x41 'A'
+ { 349, 11, 12, 12, 0, -11 }, // 0x42 'B'
+ { 366, 11, 12, 13, 1, -11 }, // 0x43 'C'
+ { 383, 11, 12, 13, 1, -11 }, // 0x44 'D'
+ { 400, 11, 12, 12, 1, -11 }, // 0x45 'E'
+ { 417, 10, 12, 11, 1, -11 }, // 0x46 'F'
+ { 432, 12, 12, 14, 1, -11 }, // 0x47 'G'
+ { 450, 12, 12, 14, 1, -11 }, // 0x48 'H'
+ { 468, 5, 12, 7, 1, -11 }, // 0x49 'I'
+ { 476, 8, 14, 9, 0, -11 }, // 0x4A 'J'
+ { 490, 13, 12, 14, 1, -11 }, // 0x4B 'K'
+ { 510, 11, 12, 12, 1, -11 }, // 0x4C 'L'
+ { 527, 16, 12, 17, 0, -11 }, // 0x4D 'M'
+ { 551, 11, 12, 13, 1, -11 }, // 0x4E 'N'
+ { 568, 12, 12, 14, 1, -11 }, // 0x4F 'O'
+ { 586, 10, 12, 11, 1, -11 }, // 0x50 'P'
+ { 601, 12, 15, 14, 1, -11 }, // 0x51 'Q'
+ { 624, 12, 12, 13, 1, -11 }, // 0x52 'R'
+ { 642, 8, 12, 10, 1, -11 }, // 0x53 'S'
+ { 654, 12, 12, 12, 0, -11 }, // 0x54 'T'
+ { 672, 11, 12, 13, 1, -11 }, // 0x55 'U'
+ { 689, 13, 13, 13, 0, -11 }, // 0x56 'V'
+ { 711, 18, 12, 18, 0, -11 }, // 0x57 'W'
+ { 738, 13, 12, 13, 0, -11 }, // 0x58 'X'
+ { 758, 13, 12, 13, 0, -11 }, // 0x59 'Y'
+ { 778, 11, 12, 12, 1, -11 }, // 0x5A 'Z'
+ { 795, 4, 15, 6, 1, -11 }, // 0x5B '['
+ { 803, 6, 13, 5, 0, -11 }, // 0x5C '\'
+ { 813, 4, 15, 6, 1, -11 }, // 0x5D ']'
+ { 821, 8, 7, 10, 1, -11 }, // 0x5E '^'
+ { 828, 9, 1, 9, 0, 3 }, // 0x5F '_'
+ { 830, 4, 3, 6, 0, -12 }, // 0x60 '`'
+ { 832, 9, 9, 9, 0, -8 }, // 0x61 'a'
+ { 843, 10, 12, 10, 0, -11 }, // 0x62 'b'
+ { 858, 7, 9, 8, 0, -8 }, // 0x63 'c'
+ { 866, 10, 12, 10, 0, -11 }, // 0x64 'd'
+ { 881, 8, 9, 8, 0, -8 }, // 0x65 'e'
+ { 890, 7, 12, 7, 0, -11 }, // 0x66 'f'
+ { 901, 7, 13, 9, 1, -8 }, // 0x67 'g'
+ { 913, 10, 12, 10, 0, -11 }, // 0x68 'h'
+ { 928, 5, 12, 5, 0, -11 }, // 0x69 'i'
+ { 936, 6, 16, 7, 0, -11 }, // 0x6A 'j'
+ { 948, 10, 12, 10, 0, -11 }, // 0x6B 'k'
+ { 963, 5, 12, 5, 0, -11 }, // 0x6C 'l'
+ { 971, 15, 9, 15, 0, -8 }, // 0x6D 'm'
+ { 988, 10, 9, 10, 0, -8 }, // 0x6E 'n'
+ { 1000, 9, 9, 9, 0, -8 }, // 0x6F 'o'
+ { 1011, 10, 13, 10, 0, -8 }, // 0x70 'p'
+ { 1028, 10, 13, 10, 0, -8 }, // 0x71 'q'
+ { 1045, 8, 9, 8, 0, -8 }, // 0x72 'r'
+ { 1054, 5, 9, 7, 1, -8 }, // 0x73 's'
+ { 1060, 6, 11, 6, 0, -10 }, // 0x74 't'
+ { 1069, 10, 9, 10, 0, -8 }, // 0x75 'u'
+ { 1081, 9, 9, 9, 0, -8 }, // 0x76 'v'
+ { 1092, 12, 9, 13, 0, -8 }, // 0x77 'w'
+ { 1106, 9, 9, 9, 0, -8 }, // 0x78 'x'
+ { 1117, 8, 13, 9, 0, -8 }, // 0x79 'y'
+ { 1130, 7, 9, 8, 1, -8 }, // 0x7A 'z'
+ { 1138, 5, 16, 7, 0, -12 }, // 0x7B '{'
+ { 1148, 1, 13, 4, 1, -11 }, // 0x7C '|'
+ { 1150, 5, 16, 7, 2, -12 }, // 0x7D '}'
+ { 1160, 8, 2, 9, 1, -4 } }; // 0x7E '~'
+
+const GFXfont FreeSerifBold9pt7b PROGMEM = {
+ (uint8_t *)FreeSerifBold9pt7bBitmaps,
+ (GFXglyph *)FreeSerifBold9pt7bGlyphs,
+ 0x20, 0x7E, 22 };
+
+// Approx. 1834 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBoldItalic12pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBoldItalic12pt7b.h
new file mode 100644
index 000000000000..1f674e98dbc8
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBoldItalic12pt7b.h
@@ -0,0 +1,292 @@
+const uint8_t FreeSerifBoldItalic12pt7bBitmaps[] PROGMEM = {
+ 0x07, 0x07, 0x07, 0x0F, 0x0E, 0x0E, 0x0C, 0x0C, 0x08, 0x18, 0x10, 0x00,
+ 0x00, 0x60, 0xF0, 0xF0, 0x60, 0x61, 0xF1, 0xF8, 0xF8, 0x6C, 0x34, 0x12,
+ 0x08, 0x01, 0x8C, 0x06, 0x60, 0x31, 0x80, 0xCC, 0x06, 0x30, 0xFF, 0xF0,
+ 0xC6, 0x03, 0x18, 0x0C, 0xC0, 0x63, 0x0F, 0xFF, 0x0C, 0x60, 0x33, 0x01,
+ 0x8C, 0x06, 0x30, 0x19, 0x80, 0x00, 0x80, 0x08, 0x07, 0xC1, 0x96, 0x31,
+ 0x33, 0x13, 0x3A, 0x23, 0xE0, 0x1E, 0x01, 0xF0, 0x07, 0x80, 0x7C, 0x05,
+ 0xC4, 0xCC, 0x48, 0xCC, 0x8C, 0xF8, 0x83, 0x30, 0x1E, 0x01, 0x00, 0x00,
+ 0x02, 0x07, 0x83, 0x03, 0x9F, 0x81, 0xC4, 0x20, 0x71, 0x10, 0x3C, 0x44,
+ 0x0E, 0x22, 0x03, 0x88, 0x80, 0xE4, 0x40, 0x1E, 0x31, 0xE0, 0x08, 0xE4,
+ 0x06, 0x71, 0x01, 0x3C, 0x40, 0x8E, 0x10, 0x23, 0x88, 0x10, 0xE2, 0x04,
+ 0x39, 0x02, 0x07, 0x80, 0x00, 0xF0, 0x01, 0x98, 0x03, 0x98, 0x03, 0x98,
+ 0x03, 0xB0, 0x03, 0xE0, 0x03, 0x80, 0x0F, 0x9F, 0x19, 0xCE, 0x31, 0xCC,
+ 0x61, 0xC8, 0xE1, 0xC8, 0xE0, 0xF0, 0xE0, 0xE0, 0xF0, 0x70, 0x78, 0x79,
+ 0x3F, 0xBE, 0x7F, 0xED, 0x20, 0x02, 0x08, 0x20, 0xC3, 0x0E, 0x18, 0x30,
+ 0xE1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x20, 0x40, 0x80, 0x81, 0x01, 0x00,
+ 0x10, 0x10, 0x20, 0x20, 0x40, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x70, 0xE1,
+ 0x83, 0x0C, 0x18, 0x61, 0x86, 0x00, 0x00, 0x0C, 0x33, 0x6C, 0x9B, 0xAE,
+ 0x1C, 0x3F, 0xEC, 0x9B, 0x36, 0x0C, 0x02, 0x00, 0x06, 0x00, 0x60, 0x06,
+ 0x00, 0x60, 0x06, 0x0F, 0xFF, 0xFF, 0xF0, 0x60, 0x06, 0x00, 0x60, 0x06,
+ 0x00, 0x60, 0x31, 0xCE, 0x31, 0x08, 0x98, 0xFF, 0xFF, 0xC0, 0x6F, 0xF6,
+ 0x01, 0x80, 0x60, 0x30, 0x0C, 0x07, 0x01, 0x80, 0xE0, 0x30, 0x1C, 0x06,
+ 0x01, 0x80, 0xC0, 0x30, 0x18, 0x06, 0x03, 0x00, 0x03, 0x81, 0xC8, 0x71,
+ 0x1C, 0x33, 0x86, 0xE1, 0xDC, 0x3B, 0x87, 0xE0, 0xFC, 0x3B, 0x87, 0x70,
+ 0xEC, 0x39, 0x87, 0x31, 0xC2, 0x30, 0x3C, 0x00, 0x01, 0xC3, 0xF0, 0x38,
+ 0x0E, 0x03, 0x81, 0xE0, 0x70, 0x1C, 0x0F, 0x03, 0x80, 0xE0, 0x38, 0x1E,
+ 0x07, 0x01, 0xC0, 0xF0, 0xFF, 0x80, 0x07, 0x81, 0xF8, 0x47, 0x90, 0x70,
+ 0x0E, 0x01, 0xC0, 0x30, 0x0E, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80,
+ 0x40, 0x8F, 0xF3, 0xFC, 0xFF, 0x80, 0x07, 0xC3, 0x3C, 0x03, 0x80, 0x70,
+ 0x0C, 0x03, 0x81, 0xC0, 0xFC, 0x07, 0xC0, 0x78, 0x07, 0x00, 0xE0, 0x1C,
+ 0x03, 0x30, 0xE7, 0x10, 0x7C, 0x00, 0x00, 0x10, 0x01, 0x80, 0x3C, 0x03,
+ 0xE0, 0x2E, 0x02, 0x70, 0x23, 0x82, 0x38, 0x21, 0xC2, 0x0E, 0x1F, 0xF9,
+ 0xFF, 0xC0, 0x38, 0x01, 0xC0, 0x1C, 0x00, 0xE0, 0x07, 0xF0, 0x7E, 0x0F,
+ 0xE0, 0x80, 0x08, 0x01, 0xE0, 0x1F, 0x83, 0xF8, 0x03, 0xC0, 0x1C, 0x00,
+ 0xC0, 0x0C, 0x00, 0xC0, 0x08, 0x61, 0x8F, 0x30, 0x7C, 0x00, 0x00, 0x60,
+ 0x78, 0x1C, 0x0F, 0x01, 0xC0, 0x70, 0x1F, 0xC3, 0x8C, 0xE1, 0xDC, 0x3B,
+ 0x87, 0x61, 0xEC, 0x3D, 0x87, 0x31, 0xE2, 0x38, 0x3C, 0x00, 0x3F, 0xEF,
+ 0xF9, 0xFF, 0x60, 0xC8, 0x18, 0x06, 0x00, 0x80, 0x30, 0x0C, 0x01, 0x80,
+ 0x60, 0x1C, 0x03, 0x00, 0xC0, 0x18, 0x06, 0x00, 0x03, 0x81, 0x88, 0x61,
+ 0x8C, 0x31, 0x86, 0x38, 0xC7, 0xB0, 0x78, 0x0F, 0x86, 0x71, 0x87, 0x60,
+ 0x6C, 0x0D, 0x81, 0xB0, 0x63, 0x18, 0x3E, 0x00, 0x07, 0x81, 0xC8, 0x71,
+ 0x8E, 0x33, 0xC6, 0x70, 0xCE, 0x39, 0xC7, 0x38, 0xE3, 0x38, 0x3F, 0x01,
+ 0xC0, 0x38, 0x0E, 0x03, 0x81, 0xC0, 0xE0, 0x00, 0x0C, 0x3C, 0x78, 0x60,
+ 0x00, 0x00, 0x00, 0x61, 0xE3, 0xC3, 0x00, 0x0E, 0x0F, 0x0F, 0x0E, 0x00,
+ 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x18, 0x10, 0x20, 0x40, 0x00, 0x10,
+ 0x07, 0x01, 0xF0, 0x7C, 0x3F, 0x0F, 0x80, 0xE0, 0x0F, 0x80, 0x3E, 0x00,
+ 0xF8, 0x03, 0xE0, 0x07, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0x80, 0x07, 0x00, 0x3F, 0x00, 0x3E, 0x00, 0x7C, 0x00,
+ 0xF8, 0x01, 0xE0, 0x1F, 0x07, 0xE0, 0xF8, 0x1F, 0x01, 0xE0, 0x0C, 0x00,
+ 0x00, 0x1E, 0x19, 0x8C, 0xE6, 0x70, 0x38, 0x38, 0x1C, 0x18, 0x18, 0x08,
+ 0x08, 0x00, 0x00, 0x03, 0x03, 0xC1, 0xE0, 0x60, 0x00, 0x03, 0xF0, 0x07,
+ 0x06, 0x06, 0x00, 0x86, 0x0E, 0x66, 0x0D, 0xDB, 0x0C, 0xE7, 0x06, 0x33,
+ 0x83, 0x31, 0xC3, 0x18, 0xE1, 0x8C, 0x70, 0xCC, 0x4C, 0x66, 0x46, 0x1F,
+ 0xC1, 0x80, 0x00, 0x30, 0x10, 0x07, 0xF0, 0x00, 0x10, 0x00, 0x30, 0x00,
+ 0x70, 0x00, 0x70, 0x00, 0xF0, 0x01, 0xF0, 0x01, 0x78, 0x03, 0x78, 0x02,
+ 0x38, 0x04, 0x38, 0x0C, 0x38, 0x0F, 0xF8, 0x18, 0x3C, 0x30, 0x3C, 0x20,
+ 0x3C, 0x60, 0x3C, 0xF8, 0x7F, 0x1F, 0xFC, 0x07, 0x9E, 0x07, 0x0F, 0x07,
+ 0x0F, 0x0F, 0x0F, 0x0F, 0x1E, 0x0E, 0x3C, 0x0F, 0xE0, 0x1E, 0x3C, 0x1E,
+ 0x1E, 0x1C, 0x1E, 0x3C, 0x1E, 0x3C, 0x1E, 0x3C, 0x3E, 0x38, 0x3C, 0x7C,
+ 0x78, 0xFF, 0xE0, 0x01, 0xF2, 0x0E, 0x1C, 0x38, 0x18, 0xE0, 0x33, 0xC0,
+ 0x4F, 0x00, 0x9E, 0x00, 0x7C, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07,
+ 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x1E, 0x04, 0x1E, 0x30, 0x0F, 0x80, 0x1F,
+ 0xFC, 0x01, 0xE3, 0xC0, 0x70, 0x78, 0x1C, 0x0E, 0x0F, 0x03, 0xC3, 0xC0,
+ 0xF0, 0xE0, 0x3C, 0x38, 0x0F, 0x1E, 0x03, 0xC7, 0x81, 0xF1, 0xC0, 0x78,
+ 0xF0, 0x1E, 0x3C, 0x0F, 0x0F, 0x03, 0xC3, 0x81, 0xC1, 0xE1, 0xE0, 0xFF,
+ 0xE0, 0x00, 0x1F, 0xFF, 0x83, 0xC1, 0xC1, 0xC0, 0x40, 0xE0, 0x20, 0xF0,
+ 0x00, 0x78, 0xC0, 0x38, 0x40, 0x1F, 0xE0, 0x1E, 0x70, 0x0F, 0x18, 0x07,
+ 0x08, 0x03, 0x84, 0x03, 0xC0, 0x61, 0xE0, 0x20, 0xE0, 0x30, 0xF8, 0x78,
+ 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0x07, 0x87, 0x07, 0x02, 0x07, 0x02, 0x0F,
+ 0x00, 0x0F, 0x18, 0x0E, 0x10, 0x0F, 0xF0, 0x1E, 0x70, 0x1E, 0x30, 0x1C,
+ 0x20, 0x1C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x7C, 0x00, 0xFE,
+ 0x00, 0x01, 0xF9, 0x03, 0xC3, 0x83, 0x81, 0xC3, 0x80, 0x43, 0xC0, 0x23,
+ 0xC0, 0x01, 0xE0, 0x01, 0xF0, 0x00, 0xF0, 0x3F, 0xF8, 0x0F, 0x3C, 0x07,
+ 0x9E, 0x03, 0xCF, 0x01, 0xC3, 0x80, 0xE1, 0xE0, 0xF0, 0x78, 0x70, 0x0F,
+ 0xE0, 0x00, 0x1F, 0xE7, 0xF0, 0x78, 0x3C, 0x07, 0x83, 0xC0, 0x70, 0x3C,
+ 0x0F, 0x03, 0x80, 0xF0, 0x78, 0x0E, 0x07, 0x80, 0xE0, 0x70, 0x1F, 0xFF,
+ 0x01, 0xE0, 0xF0, 0x1C, 0x0F, 0x03, 0xC0, 0xE0, 0x3C, 0x1E, 0x03, 0xC1,
+ 0xE0, 0x38, 0x1E, 0x07, 0xC3, 0xE0, 0xFE, 0x7F, 0x00, 0x1F, 0xC1, 0xE0,
+ 0x70, 0x1C, 0x0F, 0x03, 0xC0, 0xE0, 0x38, 0x1E, 0x07, 0x81, 0xC0, 0x70,
+ 0x3C, 0x0F, 0x03, 0x81, 0xF0, 0xFE, 0x00, 0x01, 0xFC, 0x03, 0xC0, 0x0F,
+ 0x00, 0x38, 0x00, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x0F,
+ 0x00, 0x3C, 0x00, 0xE0, 0x07, 0x80, 0x1E, 0x0E, 0x70, 0x3B, 0xC0, 0xCE,
+ 0x01, 0xF0, 0x00, 0x1F, 0xEF, 0x83, 0xC1, 0x81, 0xC1, 0x80, 0xE1, 0x80,
+ 0xF1, 0x80, 0x79, 0x00, 0x39, 0x00, 0x1F, 0x80, 0x1F, 0xE0, 0x0F, 0x70,
+ 0x07, 0x3C, 0x07, 0x8E, 0x03, 0xC7, 0x01, 0xE3, 0xC0, 0xE0, 0xE0, 0xF8,
+ 0x78, 0xFE, 0xFE, 0x00, 0x1F, 0xE0, 0x0F, 0x00, 0x1C, 0x00, 0x38, 0x00,
+ 0xF0, 0x01, 0xE0, 0x03, 0x80, 0x07, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x70,
+ 0x00, 0xE0, 0x03, 0xC0, 0x27, 0x00, 0xCE, 0x03, 0x3C, 0x1E, 0xFF, 0xFC,
+ 0x0F, 0x80, 0x7E, 0x0F, 0x00, 0xF0, 0x1E, 0x03, 0xE0, 0x3C, 0x0F, 0x80,
+ 0xB8, 0x17, 0x01, 0x70, 0x5E, 0x02, 0xF1, 0xBC, 0x05, 0xE2, 0x70, 0x11,
+ 0xC8, 0xE0, 0x23, 0xB3, 0xC0, 0x47, 0x47, 0x81, 0x0F, 0x8E, 0x02, 0x1E,
+ 0x1C, 0x04, 0x38, 0x78, 0x08, 0x70, 0xF0, 0x30, 0xC3, 0xE0, 0xF9, 0x8F,
+ 0xE0, 0x1F, 0x03, 0xE0, 0xF0, 0x38, 0x1E, 0x02, 0x03, 0xE0, 0xC0, 0xBC,
+ 0x10, 0x13, 0xC2, 0x02, 0x78, 0x40, 0x47, 0x90, 0x10, 0xF2, 0x02, 0x0F,
+ 0x40, 0x41, 0xE8, 0x18, 0x1E, 0x02, 0x03, 0xC0, 0x40, 0x38, 0x08, 0x06,
+ 0x03, 0x00, 0x40, 0x10, 0x08, 0x00, 0x01, 0xF8, 0x07, 0x1C, 0x0E, 0x0E,
+ 0x1E, 0x0F, 0x3C, 0x0F, 0x3C, 0x0F, 0x78, 0x0F, 0x78, 0x0F, 0xF8, 0x1F,
+ 0xF0, 0x1E, 0xF0, 0x1E, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x78, 0x70, 0x70,
+ 0x38, 0xE0, 0x1F, 0x80, 0x1F, 0xFC, 0x07, 0x9E, 0x07, 0x0F, 0x07, 0x0F,
+ 0x0F, 0x0F, 0x0F, 0x0F, 0x0E, 0x1E, 0x0E, 0x3C, 0x1F, 0xF0, 0x1E, 0x00,
+ 0x1C, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x38, 0x00, 0x7C, 0x00,
+ 0xFE, 0x00, 0x01, 0xF8, 0x07, 0x1C, 0x0E, 0x0E, 0x1E, 0x0F, 0x3C, 0x0F,
+ 0x3C, 0x0F, 0x78, 0x0F, 0x78, 0x1F, 0xF8, 0x1F, 0xF0, 0x1E, 0xF0, 0x1E,
+ 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x78, 0x70, 0x70, 0x39, 0xC0, 0x0E, 0x00,
+ 0x08, 0x02, 0x3F, 0x04, 0x7F, 0xF8, 0x83, 0xF0, 0x1F, 0xF8, 0x07, 0x9E,
+ 0x07, 0x8F, 0x07, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x1E, 0x0E, 0x3C,
+ 0x1F, 0xF0, 0x1E, 0xF0, 0x1C, 0xF0, 0x3C, 0xF0, 0x3C, 0x78, 0x3C, 0x78,
+ 0x3C, 0x78, 0x7C, 0x3C, 0xFE, 0x3E, 0x07, 0x91, 0xC7, 0x18, 0x73, 0x82,
+ 0x38, 0x23, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x01, 0xE0, 0x1E,
+ 0x40, 0xE4, 0x0E, 0x60, 0xCE, 0x1C, 0x9F, 0x00, 0x7F, 0xFE, 0xE7, 0x9D,
+ 0x0E, 0x16, 0x3C, 0x20, 0x78, 0x40, 0xE0, 0x01, 0xC0, 0x07, 0x80, 0x0F,
+ 0x00, 0x1C, 0x00, 0x38, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0x80, 0x0F, 0x00,
+ 0x1E, 0x00, 0xFF, 0x00, 0x7F, 0x1F, 0x3C, 0x0E, 0x38, 0x04, 0x38, 0x0C,
+ 0x78, 0x08, 0x78, 0x08, 0x70, 0x08, 0x70, 0x10, 0xF0, 0x10, 0xF0, 0x10,
+ 0xF0, 0x10, 0xF0, 0x20, 0xF0, 0x20, 0xF0, 0x20, 0xF0, 0x40, 0x78, 0xC0,
+ 0x3F, 0x00, 0xFF, 0x1F, 0x3C, 0x06, 0x3C, 0x04, 0x3C, 0x08, 0x3C, 0x08,
+ 0x3C, 0x10, 0x1C, 0x20, 0x1C, 0x20, 0x1E, 0x40, 0x1E, 0x80, 0x1E, 0x80,
+ 0x1F, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x08, 0x00, 0xFE, 0x7C,
+ 0x79, 0xE1, 0xC1, 0x8F, 0x0E, 0x08, 0x78, 0x70, 0x43, 0xC7, 0x84, 0x1E,
+ 0x3E, 0x20, 0x72, 0xF2, 0x03, 0x97, 0x90, 0x1D, 0x1D, 0x00, 0xE8, 0xE8,
+ 0x07, 0x87, 0x80, 0x3C, 0x3C, 0x01, 0xC1, 0xC0, 0x0E, 0x0E, 0x00, 0x20,
+ 0x60, 0x01, 0x02, 0x00, 0x1F, 0xCF, 0x83, 0xC1, 0x81, 0xE1, 0x80, 0x71,
+ 0x80, 0x39, 0x80, 0x1F, 0x80, 0x07, 0x80, 0x03, 0x80, 0x01, 0xE0, 0x01,
+ 0xF0, 0x00, 0xB8, 0x00, 0x9C, 0x00, 0x8F, 0x00, 0x83, 0x80, 0xC1, 0xC0,
+ 0xE0, 0xF0, 0xF9, 0xFE, 0x00, 0xFE, 0x7C, 0xE0, 0x63, 0x81, 0x0F, 0x08,
+ 0x1C, 0x40, 0x71, 0x01, 0xE8, 0x03, 0xC0, 0x0E, 0x00, 0x38, 0x01, 0xE0,
+ 0x07, 0x80, 0x1C, 0x00, 0x70, 0x03, 0xC0, 0x0F, 0x00, 0xFF, 0x00, 0x1F,
+ 0xFE, 0x38, 0x78, 0x60, 0xF1, 0x83, 0xC2, 0x0F, 0x00, 0x1E, 0x00, 0x78,
+ 0x01, 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xE0, 0x47,
+ 0x81, 0x1F, 0x06, 0x3C, 0x3C, 0xFF, 0xF0, 0x07, 0xC1, 0x80, 0xE0, 0x30,
+ 0x0C, 0x03, 0x01, 0xC0, 0x60, 0x18, 0x06, 0x03, 0x80, 0xC0, 0x30, 0x0C,
+ 0x07, 0x01, 0xC0, 0x60, 0x18, 0x0E, 0x03, 0xE0, 0xC3, 0x06, 0x18, 0x61,
+ 0x83, 0x0C, 0x30, 0xC1, 0x86, 0x18, 0x60, 0xC3, 0x0F, 0x81, 0xC0, 0xE0,
+ 0x60, 0x30, 0x18, 0x1C, 0x0C, 0x06, 0x03, 0x03, 0x81, 0x80, 0xC0, 0x60,
+ 0x70, 0x38, 0x18, 0x0C, 0x0E, 0x1F, 0x00, 0x0C, 0x07, 0x81, 0xE0, 0xDC,
+ 0x33, 0x18, 0xC6, 0x1B, 0x06, 0xC0, 0xC0, 0xFF, 0xF0, 0xC7, 0x0C, 0x30,
+ 0x07, 0x70, 0xCE, 0x1C, 0xE3, 0x8E, 0x70, 0xC7, 0x0C, 0x71, 0xCE, 0x1C,
+ 0xE1, 0x8E, 0x79, 0xE9, 0xA7, 0x1C, 0x02, 0x07, 0xC0, 0x38, 0x06, 0x01,
+ 0xC0, 0x38, 0x06, 0x71, 0xF7, 0x38, 0xE7, 0x1C, 0xC3, 0xB8, 0x77, 0x1C,
+ 0xE3, 0xB8, 0xE7, 0x18, 0xE6, 0x0F, 0x80, 0x07, 0x0C, 0xCE, 0x66, 0x07,
+ 0x03, 0x83, 0x81, 0xC0, 0xE0, 0x70, 0xBC, 0x87, 0x80, 0x00, 0x08, 0x03,
+ 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x70, 0x01, 0xC0, 0x77, 0x03, 0x3C, 0x18,
+ 0xE0, 0xE3, 0x87, 0x0E, 0x1C, 0x70, 0x71, 0xC3, 0x87, 0x0E, 0x3C, 0x38,
+ 0xE8, 0xE5, 0xA1, 0xE7, 0x00, 0x07, 0x0C, 0xCE, 0x66, 0x37, 0x33, 0xBB,
+ 0xB1, 0xE0, 0xE0, 0x70, 0xB8, 0x87, 0x80, 0x00, 0x38, 0x01, 0xB0, 0x0C,
+ 0xC0, 0x30, 0x01, 0xC0, 0x07, 0x00, 0x7E, 0x00, 0xE0, 0x03, 0x80, 0x0E,
+ 0x00, 0x30, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x03, 0x80, 0x0E,
+ 0x00, 0x38, 0x00, 0xC0, 0x33, 0x00, 0xD8, 0x01, 0xC0, 0x00, 0x03, 0x80,
+ 0x73, 0xC7, 0x1C, 0x38, 0xE1, 0xCF, 0x06, 0x70, 0x1E, 0x01, 0x00, 0x1C,
+ 0x00, 0xF8, 0x07, 0xF0, 0xC7, 0x8C, 0x0C, 0x60, 0x63, 0x86, 0x07, 0xE0,
+ 0x01, 0x00, 0xF8, 0x01, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x31, 0xC3,
+ 0xBE, 0x1E, 0x70, 0xE3, 0x8F, 0x38, 0x71, 0xC3, 0x8E, 0x1C, 0xE1, 0xC7,
+ 0x0E, 0x3A, 0x71, 0xD3, 0x0F, 0x00, 0x1C, 0x71, 0xC0, 0x00, 0x6F, 0x8E,
+ 0x31, 0xC7, 0x18, 0x63, 0x8E, 0xBC, 0xE0, 0x00, 0xE0, 0x1C, 0x03, 0x80,
+ 0x00, 0x00, 0x0F, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x70, 0x0E, 0x01, 0xC0,
+ 0x38, 0x0E, 0x01, 0xC0, 0x38, 0x06, 0x01, 0xC3, 0x38, 0x6E, 0x07, 0x80,
+ 0x01, 0x00, 0xF8, 0x01, 0xC0, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x33, 0xE3,
+ 0x8C, 0x1C, 0xC0, 0xE4, 0x06, 0x40, 0x7E, 0x03, 0xF0, 0x1D, 0x81, 0xCE,
+ 0x0E, 0x72, 0x71, 0xA3, 0x8E, 0x00, 0x06, 0x7C, 0x70, 0xE1, 0xC3, 0x0E,
+ 0x1C, 0x38, 0x61, 0xC3, 0x87, 0x0C, 0x38, 0x72, 0xE9, 0xE0, 0x3C, 0x73,
+ 0xC7, 0x7D, 0x71, 0xE7, 0x9C, 0xF1, 0xCE, 0x3C, 0xF3, 0x8E, 0x39, 0xC3,
+ 0x8E, 0x71, 0xC3, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xD7, 0x1C, 0x7B, 0x8E,
+ 0x1C, 0x3C, 0xF1, 0xD7, 0x1E, 0x73, 0xCE, 0x3C, 0xE3, 0x8E, 0x39, 0xC7,
+ 0x9C, 0x71, 0xC7, 0x1D, 0x71, 0xEE, 0x1C, 0x0F, 0x06, 0x63, 0x9D, 0xC7,
+ 0x71, 0xF8, 0x7E, 0x3F, 0x8E, 0xE3, 0xB9, 0xC6, 0x60, 0xF0, 0x0F, 0x38,
+ 0x1F, 0x70, 0x71, 0xC1, 0xC7, 0x0E, 0x1C, 0x38, 0xF0, 0xE3, 0x83, 0x8E,
+ 0x1C, 0x70, 0x71, 0xC1, 0xCE, 0x07, 0xE0, 0x38, 0x00, 0xE0, 0x03, 0x80,
+ 0x3F, 0x00, 0x07, 0x70, 0xCE, 0x18, 0xE3, 0x8E, 0x70, 0xE7, 0x1C, 0xF1,
+ 0xCE, 0x1C, 0xE3, 0x8E, 0x38, 0xE7, 0x87, 0xB0, 0x07, 0x00, 0x70, 0x0F,
+ 0x03, 0xF8, 0x0D, 0xDF, 0x71, 0xAC, 0xF0, 0x38, 0x0E, 0x03, 0x81, 0xC0,
+ 0x70, 0x1C, 0x0E, 0x00, 0x1D, 0x99, 0x8C, 0x46, 0x23, 0x80, 0xE0, 0x70,
+ 0x1C, 0x06, 0x23, 0x19, 0x17, 0x00, 0x0C, 0x10, 0xE3, 0xF3, 0x86, 0x1C,
+ 0x38, 0x71, 0xC3, 0x87, 0x0E, 0x9E, 0x38, 0x00, 0xF8, 0xE3, 0x8E, 0x38,
+ 0xC3, 0x9C, 0x71, 0xC7, 0x18, 0x71, 0x87, 0x38, 0xE3, 0x8E, 0xFA, 0xF3,
+ 0xAE, 0x3C, 0xF0, 0xDC, 0x33, 0x0C, 0xC2, 0x31, 0x8C, 0xC3, 0x60, 0xF0,
+ 0x38, 0x0C, 0x02, 0x00, 0xE0, 0x86, 0xE3, 0x0C, 0xC6, 0x19, 0x9C, 0x23,
+ 0x78, 0xC7, 0xF9, 0x0E, 0x74, 0x1C, 0xF0, 0x31, 0xC0, 0x43, 0x00, 0x84,
+ 0x00, 0x0E, 0x31, 0xF3, 0x83, 0xA0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C,
+ 0x00, 0xE0, 0x0B, 0x02, 0x5D, 0x3C, 0xF1, 0xC3, 0x00, 0x04, 0x67, 0x8C,
+ 0x79, 0x87, 0x10, 0xE2, 0x1C, 0x81, 0x90, 0x3A, 0x07, 0x80, 0xF0, 0x1C,
+ 0x03, 0x00, 0x40, 0x08, 0x32, 0x07, 0x80, 0x3F, 0xCF, 0xE6, 0x30, 0x08,
+ 0x04, 0x02, 0x01, 0x00, 0xC0, 0x30, 0x1E, 0x0F, 0x98, 0x76, 0x07, 0x00,
+ 0x01, 0xE0, 0x70, 0x1C, 0x03, 0x80, 0x60, 0x1C, 0x03, 0x80, 0x60, 0x0C,
+ 0x03, 0x80, 0xF0, 0x3C, 0x07, 0x00, 0x40, 0x0C, 0x01, 0x80, 0x70, 0x0E,
+ 0x01, 0xC0, 0x30, 0x03, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0xE0,
+ 0x18, 0x06, 0x01, 0x80, 0xE0, 0x38, 0x0C, 0x03, 0x00, 0xC0, 0x10, 0x1F,
+ 0x07, 0x03, 0x80, 0xE0, 0x30, 0x0C, 0x07, 0x01, 0x80, 0xE0, 0xE0, 0x00,
+ 0x38, 0x0F, 0xCD, 0x1F, 0x80, 0xE0 };
+
+const GFXglyph FreeSerifBoldItalic12pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 6, 0, 1 }, // 0x20 ' '
+ { 0, 8, 17, 9, 2, -15 }, // 0x21 '!'
+ { 17, 9, 7, 13, 4, -15 }, // 0x22 '"'
+ { 25, 14, 16, 12, -1, -15 }, // 0x23 '#'
+ { 53, 12, 20, 12, 0, -17 }, // 0x24 '$'
+ { 83, 18, 18, 20, 1, -16 }, // 0x25 '%'
+ { 124, 16, 17, 19, 0, -15 }, // 0x26 '&'
+ { 158, 3, 7, 7, 3, -15 }, // 0x27 '''
+ { 161, 7, 21, 8, 1, -15 }, // 0x28 '('
+ { 180, 7, 21, 8, -1, -15 }, // 0x29 ')'
+ { 199, 10, 10, 12, 1, -15 }, // 0x2A '*'
+ { 212, 12, 12, 14, 1, -11 }, // 0x2B '+'
+ { 230, 5, 8, 6, -2, -3 }, // 0x2C ','
+ { 235, 6, 3, 8, 0, -6 }, // 0x2D '-'
+ { 238, 4, 4, 6, 0, -2 }, // 0x2E '.'
+ { 240, 10, 16, 8, 0, -15 }, // 0x2F '/'
+ { 260, 11, 17, 12, 0, -15 }, // 0x30 '0'
+ { 284, 10, 17, 12, 0, -15 }, // 0x31 '1'
+ { 306, 11, 17, 12, 0, -15 }, // 0x32 '2'
+ { 330, 11, 17, 12, 0, -15 }, // 0x33 '3'
+ { 354, 13, 16, 12, 0, -15 }, // 0x34 '4'
+ { 380, 12, 17, 12, 0, -15 }, // 0x35 '5'
+ { 406, 11, 17, 12, 1, -15 }, // 0x36 '6'
+ { 430, 11, 16, 12, 2, -15 }, // 0x37 '7'
+ { 452, 11, 17, 12, 0, -15 }, // 0x38 '8'
+ { 476, 11, 17, 12, 0, -15 }, // 0x39 '9'
+ { 500, 7, 12, 6, 0, -10 }, // 0x3A ':'
+ { 511, 8, 15, 6, -1, -10 }, // 0x3B ';'
+ { 526, 12, 13, 14, 1, -12 }, // 0x3C '<'
+ { 546, 12, 6, 14, 2, -8 }, // 0x3D '='
+ { 555, 13, 13, 14, 1, -12 }, // 0x3E '>'
+ { 577, 9, 17, 12, 2, -15 }, // 0x3F '?'
+ { 597, 17, 16, 20, 1, -15 }, // 0x40 '@'
+ { 631, 16, 17, 17, 0, -15 }, // 0x41 'A'
+ { 665, 16, 17, 15, 0, -15 }, // 0x42 'B'
+ { 699, 15, 17, 15, 1, -15 }, // 0x43 'C'
+ { 731, 18, 17, 17, 0, -15 }, // 0x44 'D'
+ { 770, 17, 17, 15, 0, -15 }, // 0x45 'E'
+ { 807, 16, 17, 15, 0, -15 }, // 0x46 'F'
+ { 841, 17, 17, 17, 1, -15 }, // 0x47 'G'
+ { 878, 20, 17, 18, 0, -15 }, // 0x48 'H'
+ { 921, 10, 17, 9, 0, -15 }, // 0x49 'I'
+ { 943, 14, 18, 12, 0, -15 }, // 0x4A 'J'
+ { 975, 17, 17, 16, 0, -15 }, // 0x4B 'K'
+ { 1012, 15, 17, 15, 0, -15 }, // 0x4C 'L'
+ { 1044, 23, 17, 21, 0, -15 }, // 0x4D 'M'
+ { 1093, 19, 17, 17, 0, -15 }, // 0x4E 'N'
+ { 1134, 16, 17, 16, 1, -15 }, // 0x4F 'O'
+ { 1168, 16, 17, 14, 0, -15 }, // 0x50 'P'
+ { 1202, 16, 21, 16, 1, -15 }, // 0x51 'Q'
+ { 1244, 16, 17, 16, 0, -15 }, // 0x52 'R'
+ { 1278, 12, 17, 12, 0, -15 }, // 0x53 'S'
+ { 1304, 15, 17, 14, 2, -15 }, // 0x54 'T'
+ { 1336, 16, 17, 17, 3, -15 }, // 0x55 'U'
+ { 1370, 16, 16, 17, 3, -15 }, // 0x56 'V'
+ { 1402, 21, 16, 22, 3, -15 }, // 0x57 'W'
+ { 1444, 17, 17, 17, 0, -15 }, // 0x58 'X'
+ { 1481, 14, 17, 15, 3, -15 }, // 0x59 'Y'
+ { 1511, 15, 17, 13, 0, -15 }, // 0x5A 'Z'
+ { 1543, 10, 20, 8, -1, -15 }, // 0x5B '['
+ { 1568, 6, 16, 10, 3, -15 }, // 0x5C '\'
+ { 1580, 9, 20, 8, -1, -15 }, // 0x5D ']'
+ { 1603, 10, 9, 14, 2, -15 }, // 0x5E '^'
+ { 1615, 12, 1, 12, 0, 4 }, // 0x5F '_'
+ { 1617, 5, 4, 8, 2, -15 }, // 0x60 '`'
+ { 1620, 12, 12, 12, 0, -10 }, // 0x61 'a'
+ { 1638, 11, 18, 12, 1, -16 }, // 0x62 'b'
+ { 1663, 9, 12, 10, 1, -10 }, // 0x63 'c'
+ { 1677, 14, 18, 12, 0, -16 }, // 0x64 'd'
+ { 1709, 9, 12, 10, 1, -10 }, // 0x65 'e'
+ { 1723, 14, 22, 12, -2, -16 }, // 0x66 'f'
+ { 1762, 13, 16, 12, -1, -10 }, // 0x67 'g'
+ { 1788, 13, 18, 13, 0, -16 }, // 0x68 'h'
+ { 1818, 6, 17, 7, 1, -15 }, // 0x69 'i'
+ { 1831, 11, 21, 8, -2, -15 }, // 0x6A 'j'
+ { 1860, 13, 18, 12, 0, -16 }, // 0x6B 'k'
+ { 1890, 7, 18, 7, 1, -16 }, // 0x6C 'l'
+ { 1906, 18, 12, 18, 0, -10 }, // 0x6D 'm'
+ { 1933, 12, 12, 13, 0, -10 }, // 0x6E 'n'
+ { 1951, 10, 12, 11, 1, -10 }, // 0x6F 'o'
+ { 1966, 14, 16, 12, -2, -10 }, // 0x70 'p'
+ { 1994, 12, 16, 12, 0, -10 }, // 0x71 'q'
+ { 2018, 10, 11, 10, 0, -10 }, // 0x72 'r'
+ { 2032, 9, 12, 9, 0, -10 }, // 0x73 's'
+ { 2046, 7, 15, 7, 1, -13 }, // 0x74 't'
+ { 2060, 12, 12, 13, 1, -10 }, // 0x75 'u'
+ { 2078, 10, 11, 11, 1, -10 }, // 0x76 'v'
+ { 2092, 15, 11, 16, 1, -10 }, // 0x77 'w'
+ { 2113, 13, 12, 11, -1, -10 }, // 0x78 'x'
+ { 2133, 11, 16, 10, -1, -10 }, // 0x79 'y'
+ { 2155, 10, 13, 10, 0, -10 }, // 0x7A 'z'
+ { 2172, 11, 21, 8, 0, -16 }, // 0x7B '{'
+ { 2201, 2, 16, 6, 3, -15 }, // 0x7C '|'
+ { 2205, 10, 21, 8, -3, -16 }, // 0x7D '}'
+ { 2232, 11, 4, 14, 1, -7 } }; // 0x7E '~'
+
+const GFXfont FreeSerifBoldItalic12pt7b PROGMEM = {
+ (uint8_t *)FreeSerifBoldItalic12pt7bBitmaps,
+ (GFXglyph *)FreeSerifBoldItalic12pt7bGlyphs,
+ 0x20, 0x7E, 29 };
+
+// Approx. 2910 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBoldItalic18pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBoldItalic18pt7b.h
new file mode 100644
index 000000000000..e24eea61fef7
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBoldItalic18pt7b.h
@@ -0,0 +1,500 @@
+const uint8_t FreeSerifBoldItalic18pt7bBitmaps[] PROGMEM = {
+ 0x01, 0xC0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0x80, 0xF0, 0x3C, 0x07,
+ 0x80, 0xE0, 0x1C, 0x03, 0x00, 0x60, 0x0C, 0x03, 0x00, 0x60, 0x08, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0x81, 0xF8, 0x3F, 0x07, 0xE0, 0x78, 0x00, 0x38,
+ 0x1D, 0xE0, 0xF7, 0x83, 0xDC, 0x0E, 0x70, 0x39, 0xC0, 0xE6, 0x03, 0x18,
+ 0x0C, 0x40, 0x23, 0x01, 0x80, 0x00, 0x38, 0x60, 0x07, 0x0E, 0x00, 0x70,
+ 0xC0, 0x06, 0x1C, 0x00, 0xE1, 0xC0, 0x0E, 0x38, 0x01, 0xC3, 0x81, 0xFF,
+ 0xFF, 0x1F, 0xFF, 0xE1, 0xFF, 0xFE, 0x03, 0x86, 0x00, 0x30, 0xE0, 0x07,
+ 0x0E, 0x00, 0x71, 0xC0, 0x0E, 0x1C, 0x0F, 0xFF, 0xF8, 0xFF, 0xFF, 0x0F,
+ 0xFF, 0xF0, 0x1C, 0x30, 0x01, 0x87, 0x00, 0x38, 0x70, 0x03, 0x0E, 0x00,
+ 0x70, 0xE0, 0x07, 0x0C, 0x00, 0xE1, 0xC0, 0x00, 0x00, 0x08, 0x00, 0x0C,
+ 0x00, 0x7E, 0x00, 0xFF, 0xC0, 0xF3, 0x70, 0x71, 0x9C, 0x70, 0xC6, 0x38,
+ 0x43, 0x1C, 0x61, 0x0F, 0x30, 0x87, 0xD8, 0x03, 0xF8, 0x00, 0xFE, 0x00,
+ 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, 0x01, 0xFC, 0x00, 0xDF, 0x10, 0x47,
+ 0x88, 0x63, 0xCC, 0x31, 0xE6, 0x10, 0xF3, 0x98, 0x71, 0xCC, 0x78, 0x7E,
+ 0x78, 0x07, 0xF8, 0x03, 0xF0, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x03, 0xC0,
+ 0x18, 0x01, 0xFE, 0x0F, 0x00, 0x7C, 0xFF, 0xC0, 0x1F, 0x0F, 0x98, 0x07,
+ 0xC1, 0x06, 0x00, 0xF8, 0x21, 0x80, 0x3E, 0x04, 0x30, 0x07, 0xC1, 0x8C,
+ 0x00, 0xF0, 0x21, 0x80, 0x1E, 0x0C, 0x60, 0x03, 0xC1, 0x0C, 0x00, 0x78,
+ 0xC3, 0x03, 0xC7, 0xF8, 0x61, 0xFC, 0x7C, 0x18, 0x7C, 0xC0, 0x06, 0x1F,
+ 0x08, 0x00, 0xC7, 0xC1, 0x00, 0x30, 0xF0, 0x20, 0x06, 0x3E, 0x04, 0x01,
+ 0x87, 0xC1, 0x00, 0x30, 0xF0, 0x20, 0x0C, 0x1E, 0x0C, 0x03, 0x03, 0xC1,
+ 0x00, 0x60, 0x3C, 0xC0, 0x18, 0x07, 0xF8, 0x03, 0x00, 0x7C, 0x00, 0x00,
+ 0x0F, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x1E, 0x38, 0x00, 0x0E, 0x0E, 0x00,
+ 0x0F, 0x07, 0x00, 0x07, 0x83, 0x80, 0x03, 0xC3, 0x80, 0x01, 0xE3, 0x80,
+ 0x00, 0xF7, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7F, 0x0F,
+ 0xF0, 0xE7, 0x81, 0xE0, 0xE3, 0xE0, 0xE0, 0xE1, 0xF0, 0x60, 0xE0, 0x7C,
+ 0x60, 0xF0, 0x3E, 0x20, 0x78, 0x1F, 0xB0, 0x3C, 0x07, 0xF0, 0x1F, 0x03,
+ 0xF0, 0x0F, 0x80, 0xFC, 0x03, 0xF0, 0x7F, 0x8D, 0xFF, 0xEF, 0xFC, 0x7F,
+ 0xE3, 0xFC, 0x0F, 0xC0, 0x78, 0x00, 0x3B, 0xDE, 0xE7, 0x39, 0x8C, 0x46,
+ 0x00, 0x00, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x1C, 0x07, 0x01, 0xE0,
+ 0x38, 0x0F, 0x01, 0xC0, 0x38, 0x0F, 0x01, 0xE0, 0x38, 0x07, 0x00, 0xE0,
+ 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x06,
+ 0x00, 0xC0, 0x08, 0x00, 0x80, 0x10, 0x00, 0x06, 0x00, 0x40, 0x04, 0x00,
+ 0x80, 0x18, 0x01, 0x00, 0x30, 0x06, 0x00, 0xC0, 0x1C, 0x03, 0x80, 0x70,
+ 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x01, 0xE0, 0x3C, 0x07, 0x00, 0xE0, 0x3C,
+ 0x07, 0x00, 0xE0, 0x38, 0x06, 0x01, 0xC0, 0x70, 0x18, 0x06, 0x01, 0x80,
+ 0x00, 0x07, 0x00, 0x38, 0x01, 0xC1, 0x8E, 0x3E, 0x23, 0xF9, 0x3F, 0xEB,
+ 0xE0, 0xE0, 0xFF, 0xF7, 0x93, 0xF8, 0x9F, 0x8E, 0x60, 0x70, 0x03, 0x80,
+ 0x08, 0x00, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C,
+ 0x00, 0x0E, 0x00, 0x07, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0,
+ 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80,
+ 0x01, 0xC0, 0x00, 0x1C, 0x7C, 0xF9, 0xF1, 0xE1, 0xC3, 0x0C, 0x30, 0xC2,
+ 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xE0, 0x7B, 0xFF, 0xFF, 0x78, 0x00, 0x1C,
+ 0x00, 0xE0, 0x03, 0x80, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x0E, 0x00, 0x38,
+ 0x01, 0xC0, 0x07, 0x00, 0x38, 0x00, 0xE0, 0x07, 0x80, 0x1C, 0x00, 0x70,
+ 0x03, 0x80, 0x0E, 0x00, 0x70, 0x01, 0xC0, 0x0E, 0x00, 0x38, 0x01, 0xC0,
+ 0x07, 0x00, 0x1C, 0x00, 0xE0, 0x00, 0x00, 0xF0, 0x07, 0x30, 0x1C, 0x30,
+ 0x78, 0x60, 0xE0, 0xE3, 0xC1, 0xCF, 0x83, 0x9E, 0x0F, 0x3C, 0x1E, 0xF8,
+ 0x3D, 0xE0, 0x7B, 0xC1, 0xFF, 0x83, 0xFF, 0x07, 0xBC, 0x0F, 0x78, 0x3E,
+ 0xF0, 0x7D, 0xE0, 0xF3, 0x81, 0xE7, 0x07, 0x8E, 0x0F, 0x0C, 0x3C, 0x18,
+ 0x70, 0x19, 0xC0, 0x1E, 0x00, 0x00, 0x06, 0x01, 0xF8, 0x1F, 0xF0, 0x03,
+ 0xE0, 0x07, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF0, 0x03, 0xE0,
+ 0x07, 0xC0, 0x0F, 0x80, 0x1E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xE0, 0x07,
+ 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0,
+ 0x0F, 0xC0, 0xFF, 0xF0, 0x00, 0xF8, 0x01, 0xFC, 0x03, 0xFE, 0x06, 0x3F,
+ 0x08, 0x1F, 0x18, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0E,
+ 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x30, 0x00, 0x70, 0x00, 0xC0,
+ 0x01, 0x80, 0x03, 0x00, 0x06, 0x02, 0x0C, 0x06, 0x08, 0x0C, 0x1F, 0xFC,
+ 0x3F, 0xFC, 0x7F, 0xF8, 0xFF, 0xF8, 0x00, 0xF0, 0x07, 0xF8, 0x1F, 0xF0,
+ 0x61, 0xF0, 0x81, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0E, 0x00, 0x3C, 0x00,
+ 0xE0, 0x07, 0xC0, 0x3F, 0xC0, 0x1F, 0x80, 0x0F, 0x80, 0x1F, 0x00, 0x1E,
+ 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xC0, 0x07, 0x9C, 0x0E, 0x3C,
+ 0x38, 0x7F, 0xE0, 0x7E, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x3C,
+ 0x00, 0x1E, 0x00, 0x0F, 0x80, 0x07, 0xE0, 0x02, 0xF8, 0x01, 0x3C, 0x00,
+ 0x9F, 0x00, 0x47, 0xC0, 0x31, 0xE0, 0x18, 0x78, 0x0C, 0x3E, 0x06, 0x0F,
+ 0x83, 0x03, 0xC1, 0x80, 0xF0, 0x7F, 0xFF, 0x1F, 0xFF, 0xCF, 0xFF, 0xF0,
+ 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x07, 0xC0, 0x01,
+ 0xFF, 0x00, 0xFF, 0x80, 0xFF, 0xC0, 0x7F, 0xE0, 0x60, 0x00, 0x30, 0x00,
+ 0x10, 0x00, 0x1F, 0x00, 0x0F, 0xE0, 0x0F, 0xF8, 0x07, 0xFE, 0x00, 0x3F,
+ 0x00, 0x07, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x38, 0x00, 0x1C, 0x00,
+ 0x0E, 0x00, 0x06, 0x00, 0x03, 0x00, 0x03, 0x87, 0x83, 0x83, 0xE3, 0x81,
+ 0xFF, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x03, 0x80, 0x0F, 0x80, 0x1F, 0x00,
+ 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x1F, 0x00,
+ 0x1F, 0xF0, 0x1F, 0xFE, 0x0F, 0xCF, 0x07, 0xC3, 0xC7, 0xE1, 0xE3, 0xE0,
+ 0xF1, 0xF0, 0x78, 0xF8, 0x3C, 0x78, 0x3E, 0x3C, 0x1F, 0x1E, 0x0F, 0x0F,
+ 0x0F, 0x83, 0x87, 0x81, 0xE7, 0x80, 0x7F, 0x80, 0x0F, 0x80, 0x00, 0x3F,
+ 0xFF, 0x3F, 0xFE, 0x3F, 0xFE, 0x7F, 0xFC, 0x60, 0x1C, 0x80, 0x38, 0x80,
+ 0x30, 0x00, 0x70, 0x00, 0x60, 0x00, 0xE0, 0x01, 0xC0, 0x01, 0xC0, 0x03,
+ 0x80, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x1C,
+ 0x00, 0x38, 0x00, 0x38, 0x00, 0x70, 0x00, 0xF0, 0x00, 0xE0, 0x00, 0x00,
+ 0xF8, 0x00, 0xFF, 0x00, 0xE1, 0xC0, 0xE0, 0xF0, 0xF0, 0x38, 0x78, 0x1C,
+ 0x3C, 0x0E, 0x1F, 0x07, 0x0F, 0x87, 0x07, 0xE7, 0x01, 0xFF, 0x00, 0x7E,
+ 0x00, 0x1F, 0x80, 0x3F, 0xE0, 0x73, 0xF0, 0x70, 0xFC, 0x70, 0x3E, 0x70,
+ 0x0F, 0x38, 0x07, 0x9C, 0x03, 0xCE, 0x01, 0xE7, 0x00, 0xE1, 0xC0, 0xE0,
+ 0x70, 0xE0, 0x0F, 0xC0, 0x00, 0x00, 0xF8, 0x01, 0xFF, 0x01, 0xF3, 0xC1,
+ 0xF0, 0xE1, 0xF0, 0x70, 0xF0, 0x3C, 0xF8, 0x1E, 0x7C, 0x0F, 0x3C, 0x0F,
+ 0x9E, 0x07, 0xCF, 0x03, 0xE7, 0x83, 0xF3, 0xC1, 0xF0, 0xF1, 0xF8, 0x3F,
+ 0xF8, 0x0F, 0xFC, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x7E, 0x00, 0x3E, 0x00,
+ 0x3C, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0xF0, 0x00, 0xC0, 0x00, 0x00, 0x07,
+ 0x83, 0xF0, 0xFC, 0x3F, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x78, 0x3F, 0x0F, 0xC3, 0xF0, 0x78, 0x00, 0x03, 0xC0, 0xFC,
+ 0x1F, 0x83, 0xF0, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0C, 0x03, 0xC0, 0x7C, 0x0F, 0x80, 0xF0, 0x0E, 0x01, 0x80, 0x30, 0x0C,
+ 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x7C, 0x00,
+ 0x7F, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFE, 0x00,
+ 0x3E, 0x00, 0x0F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0xE0, 0x01, 0xFE, 0x00,
+ 0x0F, 0xE0, 0x00, 0xFF, 0x00, 0x0F, 0xC0, 0x00, 0xF0, 0x00, 0x04, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
+ 0x38, 0x00, 0x0F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xFC, 0x00,
+ 0x3F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xF0, 0x00, 0xFC, 0x00,
+ 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFC, 0x03, 0xFC, 0x00, 0xFC, 0x00,
+ 0x3C, 0x00, 0x08, 0x00, 0x00, 0x07, 0xC0, 0xFF, 0x0E, 0x3C, 0x70, 0xF3,
+ 0xC7, 0x8C, 0x3C, 0x01, 0xE0, 0x1F, 0x00, 0xF0, 0x07, 0x80, 0x78, 0x07,
+ 0x80, 0x30, 0x03, 0x00, 0x10, 0x01, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x07, 0x80, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0x78, 0x00, 0x00, 0x3F,
+ 0x80, 0x00, 0xFF, 0xF8, 0x01, 0xF0, 0x1E, 0x01, 0xE0, 0x03, 0x81, 0xC0,
+ 0x00, 0xE1, 0xC0, 0x18, 0x38, 0xE0, 0x3F, 0xCC, 0xE0, 0x3C, 0xE7, 0x70,
+ 0x3C, 0x71, 0xF0, 0x1C, 0x30, 0xF8, 0x1E, 0x38, 0x7C, 0x0E, 0x1C, 0x3E,
+ 0x0F, 0x0E, 0x1F, 0x07, 0x0E, 0x0F, 0x83, 0x87, 0x0D, 0xC1, 0xC7, 0x86,
+ 0x70, 0xE5, 0xC6, 0x38, 0x7C, 0xFE, 0x1C, 0x1C, 0x3E, 0x07, 0x00, 0x00,
+ 0x01, 0xC0, 0x00, 0x00, 0x78, 0x00, 0x40, 0x1F, 0x00, 0xE0, 0x03, 0xFF,
+ 0xE0, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x03, 0x00, 0x00,
+ 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x03,
+ 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x17, 0xC0, 0x00, 0x67, 0x80, 0x00, 0x8F,
+ 0x00, 0x03, 0x1F, 0x00, 0x0C, 0x3E, 0x00, 0x10, 0x7C, 0x00, 0x60, 0xF8,
+ 0x00, 0x81, 0xF0, 0x03, 0xFF, 0xE0, 0x0F, 0xFF, 0xE0, 0x18, 0x07, 0xC0,
+ 0x60, 0x0F, 0x81, 0xC0, 0x1F, 0x03, 0x00, 0x3E, 0x0E, 0x00, 0x7C, 0x3C,
+ 0x00, 0xFC, 0xFE, 0x0F, 0xFE, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xFC, 0x01,
+ 0xF8, 0x7E, 0x01, 0xF8, 0x3F, 0x01, 0xF0, 0x3F, 0x01, 0xF0, 0x3F, 0x01,
+ 0xF0, 0x3F, 0x03, 0xE0, 0x3F, 0x03, 0xE0, 0x7E, 0x03, 0xE0, 0xFC, 0x03,
+ 0xE3, 0xF0, 0x07, 0xFF, 0x80, 0x07, 0xC3, 0xE0, 0x07, 0xC1, 0xF8, 0x0F,
+ 0xC0, 0xF8, 0x0F, 0x80, 0xFC, 0x0F, 0x80, 0xFC, 0x0F, 0x80, 0xFC, 0x1F,
+ 0x80, 0xFC, 0x1F, 0x01, 0xFC, 0x1F, 0x01, 0xF8, 0x1F, 0x03, 0xF0, 0x3F,
+ 0x0F, 0xE0, 0x7F, 0xFF, 0xC0, 0xFF, 0xFE, 0x00, 0x00, 0x1F, 0x82, 0x01,
+ 0xFF, 0xE8, 0x07, 0xE0, 0xF0, 0x3F, 0x80, 0xE0, 0xFE, 0x00, 0xC1, 0xF8,
+ 0x01, 0x87, 0xE0, 0x02, 0x1F, 0x80, 0x04, 0x3F, 0x00, 0x00, 0xFC, 0x00,
+ 0x01, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0x80, 0x00,
+ 0x3F, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03,
+ 0xF0, 0x00, 0x03, 0xE0, 0x01, 0x07, 0xE0, 0x06, 0x07, 0xE0, 0x18, 0x07,
+ 0xE0, 0xE0, 0x07, 0xFF, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xFF, 0xE0, 0x01,
+ 0xFF, 0xFE, 0x00, 0x1F, 0x87, 0xE0, 0x07, 0xE0, 0x7C, 0x01, 0xF0, 0x1F,
+ 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x0F, 0x80, 0x3F, 0x03, 0xE0,
+ 0x0F, 0xC0, 0xF8, 0x03, 0xF0, 0x3E, 0x00, 0xFC, 0x1F, 0x00, 0x3F, 0x07,
+ 0xC0, 0x0F, 0xC1, 0xF0, 0x07, 0xF0, 0xFC, 0x01, 0xF8, 0x3E, 0x00, 0x7E,
+ 0x0F, 0x80, 0x3F, 0x83, 0xE0, 0x0F, 0xC1, 0xF8, 0x07, 0xF0, 0x7C, 0x01,
+ 0xF8, 0x1F, 0x00, 0xFC, 0x07, 0xC0, 0x7E, 0x03, 0xF0, 0x7E, 0x01, 0xFF,
+ 0xFF, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x07, 0xFF, 0xFE, 0x03, 0xFF, 0xFC,
+ 0x07, 0xE0, 0x78, 0x0F, 0xC0, 0x60, 0x1F, 0x00, 0x40, 0x3E, 0x00, 0x80,
+ 0x7C, 0x01, 0x01, 0xF8, 0x10, 0x03, 0xE0, 0x60, 0x07, 0xC3, 0x80, 0x0F,
+ 0xFF, 0x00, 0x3F, 0xFE, 0x00, 0x7C, 0x38, 0x00, 0xF8, 0x30, 0x03, 0xF0,
+ 0x60, 0x07, 0xC0, 0x80, 0x0F, 0x81, 0x00, 0x1F, 0x00, 0x10, 0x7E, 0x00,
+ 0x60, 0xF8, 0x01, 0xC1, 0xF0, 0x07, 0x03, 0xE0, 0x1E, 0x0F, 0xC0, 0xFC,
+ 0x3F, 0xFF, 0xF8, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFE, 0x03, 0xFF, 0xFC,
+ 0x07, 0xE0, 0x78, 0x0F, 0xC0, 0x60, 0x1F, 0x00, 0x40, 0x3E, 0x00, 0x80,
+ 0x7C, 0x01, 0x01, 0xF8, 0x20, 0x03, 0xE0, 0xC0, 0x07, 0xC3, 0x80, 0x0F,
+ 0xFE, 0x00, 0x3F, 0xFC, 0x00, 0x7C, 0x38, 0x00, 0xF8, 0x30, 0x03, 0xF0,
+ 0x60, 0x07, 0xC0, 0x80, 0x0F, 0x81, 0x00, 0x1F, 0x00, 0x00, 0x7E, 0x00,
+ 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0xC0, 0x00,
+ 0x3F, 0x80, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0xFF, 0xF6,
+ 0x01, 0xF8, 0x3C, 0x03, 0xE0, 0x1C, 0x0F, 0xC0, 0x0C, 0x0F, 0xC0, 0x08,
+ 0x1F, 0x80, 0x08, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x7E, 0x00, 0x00,
+ 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFC, 0x03, 0xFF,
+ 0xFC, 0x00, 0xFC, 0xFC, 0x00, 0xF8, 0xFC, 0x00, 0xF8, 0xFC, 0x00, 0xF8,
+ 0xFC, 0x00, 0xF0, 0x7C, 0x01, 0xF0, 0x7E, 0x01, 0xF0, 0x3E, 0x01, 0xF0,
+ 0x1F, 0x83, 0xE0, 0x0F, 0xFF, 0x80, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x3F,
+ 0xF8, 0x0F, 0xE0, 0x7F, 0x00, 0x7E, 0x01, 0xF8, 0x03, 0xF0, 0x0F, 0x80,
+ 0x1F, 0x00, 0x7C, 0x00, 0xF8, 0x07, 0xE0, 0x07, 0xC0, 0x3E, 0x00, 0x7E,
+ 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0x80, 0x1F, 0x00, 0xF8, 0x00, 0xF8, 0x07,
+ 0xC0, 0x0F, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xF0, 0x03, 0xE0, 0x1F, 0x00,
+ 0x3F, 0x00, 0xF8, 0x01, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x7E, 0x00, 0x7C,
+ 0x03, 0xE0, 0x07, 0xE0, 0x1F, 0x00, 0x3E, 0x00, 0xF8, 0x01, 0xF0, 0x0F,
+ 0xC0, 0x0F, 0x80, 0x7C, 0x00, 0xFC, 0x03, 0xE0, 0x0F, 0xE0, 0x3F, 0x80,
+ 0xFF, 0xC7, 0xFF, 0x00, 0x07, 0xFE, 0x03, 0xF8, 0x07, 0xE0, 0x0F, 0xC0,
+ 0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0F,
+ 0x80, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x03, 0xF0, 0x07, 0xC0, 0x0F, 0x80,
+ 0x1F, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x3F,
+ 0x80, 0xFF, 0xC0, 0x00, 0x3F, 0xF0, 0x01, 0xFE, 0x00, 0x0F, 0xC0, 0x00,
+ 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xF0, 0x00,
+ 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00,
+ 0x07, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x0F, 0xC0,
+ 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x61, 0xF0,
+ 0x0F, 0x3F, 0x00, 0xE7, 0xE0, 0x07, 0xFC, 0x00, 0x3F, 0x00, 0x00, 0x07,
+ 0xFF, 0x3F, 0x80, 0xFE, 0x07, 0x80, 0x7E, 0x03, 0x00, 0x3F, 0x03, 0x00,
+ 0x1F, 0x03, 0x00, 0x0F, 0x83, 0x00, 0x07, 0xC3, 0x00, 0x07, 0xE3, 0x00,
+ 0x03, 0xE3, 0x00, 0x01, 0xF3, 0x00, 0x00, 0xFB, 0x80, 0x00, 0xFB, 0xC0,
+ 0x00, 0x7F, 0xE0, 0x00, 0x3E, 0xF8, 0x00, 0x3F, 0x7C, 0x00, 0x1F, 0x1F,
+ 0x00, 0x0F, 0x8F, 0x80, 0x07, 0xC7, 0xE0, 0x07, 0xE1, 0xF0, 0x03, 0xE0,
+ 0xFC, 0x01, 0xF0, 0x3E, 0x00, 0xF8, 0x1F, 0x00, 0xFC, 0x07, 0xC0, 0xFE,
+ 0x07, 0xF0, 0xFF, 0xCF, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x07, 0xF0, 0x00,
+ 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x1F,
+ 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x00,
+ 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x1F, 0x00, 0x00, 0xFC, 0x00, 0x03,
+ 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x00, 0x11, 0xF0, 0x00, 0xC7, 0xC0,
+ 0x06, 0x1F, 0x00, 0x38, 0x7C, 0x01, 0xE3, 0xF0, 0x3F, 0x9F, 0xFF, 0xFC,
+ 0xFF, 0xFF, 0xF0, 0x07, 0xF8, 0x00, 0x7F, 0x80, 0xFC, 0x00, 0x3F, 0x80,
+ 0x3E, 0x00, 0x3F, 0x80, 0x1F, 0x00, 0x3F, 0x80, 0x1F, 0x80, 0x1F, 0xC0,
+ 0x0F, 0xE0, 0x1B, 0xE0, 0x07, 0xF0, 0x0D, 0xF0, 0x02, 0xF8, 0x0D, 0xF0,
+ 0x03, 0x7C, 0x0C, 0xF8, 0x01, 0xBE, 0x06, 0x7C, 0x00, 0xDF, 0x06, 0x7C,
+ 0x00, 0xCF, 0x83, 0x3E, 0x00, 0x67, 0xC3, 0x1F, 0x00, 0x31, 0xE3, 0x0F,
+ 0x80, 0x38, 0xF9, 0x8F, 0x80, 0x18, 0x7D, 0x87, 0xC0, 0x0C, 0x3F, 0x83,
+ 0xE0, 0x06, 0x1F, 0xC1, 0xF0, 0x06, 0x0F, 0xC1, 0xF0, 0x03, 0x07, 0xC0,
+ 0xF8, 0x01, 0x83, 0xE0, 0x7C, 0x01, 0xC0, 0xE0, 0x7E, 0x00, 0xE0, 0x70,
+ 0x3F, 0x00, 0xF8, 0x30, 0x3F, 0x80, 0xFF, 0x10, 0x7F, 0xF0, 0x00, 0x07,
+ 0xF0, 0x0F, 0xE0, 0x3E, 0x00, 0x78, 0x07, 0xE0, 0x06, 0x00, 0x7C, 0x00,
+ 0xC0, 0x1F, 0xC0, 0x10, 0x03, 0xF8, 0x06, 0x00, 0x6F, 0x80, 0xC0, 0x19,
+ 0xF0, 0x10, 0x03, 0x3F, 0x02, 0x00, 0x63, 0xE0, 0xC0, 0x0C, 0x7C, 0x18,
+ 0x03, 0x07, 0xC2, 0x00, 0x60, 0xF8, 0x40, 0x0C, 0x0F, 0x98, 0x03, 0x81,
+ 0xF3, 0x00, 0x60, 0x3F, 0x40, 0x0C, 0x03, 0xF8, 0x01, 0x80, 0x7F, 0x00,
+ 0x60, 0x07, 0xC0, 0x0C, 0x00, 0xF8, 0x01, 0x80, 0x0F, 0x00, 0x70, 0x01,
+ 0xE0, 0x0E, 0x00, 0x18, 0x03, 0xE0, 0x03, 0x00, 0x02, 0x00, 0x60, 0x00,
+ 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0xC0, 0x07, 0xC3, 0xE0, 0x1F, 0x03, 0xC0,
+ 0x7C, 0x03, 0xC1, 0xF0, 0x07, 0x87, 0xE0, 0x0F, 0x8F, 0x80, 0x1F, 0x3F,
+ 0x00, 0x3E, 0x7C, 0x00, 0x7D, 0xF8, 0x01, 0xFB, 0xE0, 0x03, 0xF7, 0xC0,
+ 0x07, 0xDF, 0x80, 0x1F, 0xBF, 0x00, 0x3F, 0x7C, 0x00, 0x7C, 0xF8, 0x01,
+ 0xF9, 0xF0, 0x03, 0xE3, 0xE0, 0x0F, 0xC7, 0xC0, 0x1F, 0x07, 0x80, 0x7C,
+ 0x0F, 0x81, 0xF0, 0x0F, 0x87, 0xC0, 0x0F, 0xFE, 0x00, 0x07, 0xF0, 0x00,
+ 0x07, 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x07, 0xE3, 0xF0, 0x0F, 0x83, 0xE0,
+ 0x1F, 0x07, 0xE0, 0x3E, 0x0F, 0xC0, 0x7C, 0x1F, 0x81, 0xF0, 0x3F, 0x03,
+ 0xE0, 0xFE, 0x07, 0xC1, 0xF8, 0x0F, 0x87, 0xF0, 0x3E, 0x1F, 0xC0, 0x7F,
+ 0xFE, 0x00, 0xFF, 0xF0, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80,
+ 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00,
+ 0x03, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0xFF, 0xC0, 0x00,
+ 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0xC0, 0x07, 0xC3, 0xE0, 0x1F, 0x03, 0xC0,
+ 0x7C, 0x03, 0xC1, 0xF0, 0x07, 0x87, 0xE0, 0x0F, 0x8F, 0x80, 0x1F, 0x3F,
+ 0x00, 0x3E, 0x7C, 0x00, 0x7D, 0xF8, 0x01, 0xFB, 0xF0, 0x03, 0xF7, 0xC0,
+ 0x07, 0xDF, 0x80, 0x0F, 0xBF, 0x00, 0x3F, 0x7C, 0x00, 0x7C, 0xF8, 0x01,
+ 0xF9, 0xF0, 0x03, 0xE3, 0xE0, 0x07, 0xC7, 0xC0, 0x1F, 0x07, 0x80, 0x7C,
+ 0x0F, 0x01, 0xF0, 0x0F, 0x07, 0x80, 0x07, 0xFE, 0x00, 0x03, 0x80, 0x00,
+ 0x0C, 0x00, 0x00, 0x3C, 0x00, 0x20, 0xFF, 0xC1, 0x87, 0xFF, 0xFE, 0x1E,
+ 0xFF, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xFC,
+ 0x01, 0xF8, 0x7E, 0x01, 0xF8, 0x3F, 0x01, 0xF8, 0x3F, 0x01, 0xF0, 0x3F,
+ 0x01, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xE0, 0x7E, 0x03, 0xE0, 0xFE,
+ 0x03, 0xE1, 0xF8, 0x07, 0xFF, 0xF0, 0x07, 0xFF, 0x80, 0x07, 0xDF, 0xC0,
+ 0x0F, 0xCF, 0xC0, 0x0F, 0xCF, 0xC0, 0x0F, 0x8F, 0xE0, 0x0F, 0x87, 0xE0,
+ 0x1F, 0x87, 0xE0, 0x1F, 0x03, 0xF0, 0x1F, 0x03, 0xF0, 0x1F, 0x03, 0xF0,
+ 0x3F, 0x01, 0xF8, 0x7F, 0x01, 0xF8, 0xFF, 0xE1, 0xFE, 0x00, 0xF8, 0x40,
+ 0xFF, 0xB0, 0x38, 0x3C, 0x1C, 0x07, 0x0F, 0x01, 0xC3, 0xC0, 0x20, 0xF0,
+ 0x08, 0x3E, 0x02, 0x0F, 0xC0, 0x03, 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xE0,
+ 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x00,
+ 0x03, 0xC4, 0x00, 0xF1, 0x00, 0x3C, 0x60, 0x0F, 0x38, 0x07, 0x8F, 0x83,
+ 0xC2, 0x3F, 0xE0, 0x83, 0xF0, 0x00, 0x3F, 0xFF, 0xF9, 0xFF, 0xFF, 0xCF,
+ 0x1F, 0x1E, 0x70, 0xF8, 0x77, 0x0F, 0x83, 0x30, 0x7C, 0x09, 0x03, 0xE0,
+ 0x40, 0x3F, 0x02, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x07,
+ 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00,
+ 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0xF8,
+ 0x00, 0x07, 0xC0, 0x00, 0x7E, 0x00, 0x07, 0xF0, 0x00, 0xFF, 0xF0, 0x00,
+ 0x7F, 0xF0, 0xFF, 0x1F, 0xC0, 0x3E, 0x1F, 0x80, 0x1C, 0x1F, 0x80, 0x18,
+ 0x1F, 0x00, 0x18, 0x1F, 0x00, 0x18, 0x1F, 0x00, 0x30, 0x3F, 0x00, 0x30,
+ 0x3E, 0x00, 0x30, 0x3E, 0x00, 0x30, 0x7E, 0x00, 0x60, 0x7C, 0x00, 0x60,
+ 0x7C, 0x00, 0x60, 0x7C, 0x00, 0xC0, 0x7C, 0x00, 0xC0, 0xF8, 0x00, 0xC0,
+ 0xF8, 0x00, 0xC0, 0xF8, 0x01, 0x80, 0xF8, 0x01, 0x80, 0xF8, 0x03, 0x80,
+ 0xF8, 0x03, 0x00, 0x7C, 0x06, 0x00, 0x7E, 0x1E, 0x00, 0x3F, 0xF8, 0x00,
+ 0x0F, 0xE0, 0x00, 0xFF, 0xE0, 0x7F, 0x3F, 0x80, 0x1C, 0x1F, 0x80, 0x18,
+ 0x1F, 0x80, 0x18, 0x1F, 0x80, 0x30, 0x1F, 0x80, 0x30, 0x0F, 0x80, 0x60,
+ 0x0F, 0x80, 0x40, 0x0F, 0x80, 0xC0, 0x0F, 0x81, 0x80, 0x0F, 0x81, 0x00,
+ 0x0F, 0xC3, 0x00, 0x0F, 0xC6, 0x00, 0x07, 0xC6, 0x00, 0x07, 0xCC, 0x00,
+ 0x07, 0xC8, 0x00, 0x07, 0xD8, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00,
+ 0x07, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0x80, 0x00,
+ 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0xFF, 0xCF, 0xF8, 0x7E, 0x7F, 0x07,
+ 0xE0, 0x38, 0x7C, 0x07, 0x80, 0x60, 0xF8, 0x0F, 0x00, 0x81, 0xF0, 0x1E,
+ 0x03, 0x03, 0xE0, 0x3E, 0x04, 0x07, 0xE0, 0xFC, 0x18, 0x07, 0xC1, 0xF8,
+ 0x20, 0x0F, 0x87, 0xF0, 0xC0, 0x1F, 0x0B, 0xE1, 0x00, 0x3E, 0x37, 0xC6,
+ 0x00, 0x7C, 0x47, 0x88, 0x00, 0xF9, 0x8F, 0x30, 0x01, 0xF2, 0x1F, 0x40,
+ 0x03, 0xEC, 0x3E, 0x80, 0x03, 0xF0, 0x7F, 0x00, 0x07, 0xE0, 0xFC, 0x00,
+ 0x0F, 0x81, 0xF8, 0x00, 0x1F, 0x03, 0xE0, 0x00, 0x3C, 0x07, 0xC0, 0x00,
+ 0x78, 0x07, 0x00, 0x00, 0xF0, 0x0E, 0x00, 0x00, 0xC0, 0x18, 0x00, 0x01,
+ 0x80, 0x30, 0x00, 0x02, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x3F, 0x81, 0xFC,
+ 0x07, 0x80, 0x7C, 0x03, 0x00, 0x3F, 0x03, 0x00, 0x0F, 0x83, 0x80, 0x07,
+ 0xC1, 0x80, 0x03, 0xE1, 0x80, 0x00, 0xF9, 0x80, 0x00, 0x7D, 0x80, 0x00,
+ 0x3F, 0x80, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00,
+ 0x01, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xBE, 0x00, 0x00, 0xCF, 0x00,
+ 0x00, 0xC7, 0xC0, 0x00, 0xC3, 0xE0, 0x00, 0xC1, 0xF0, 0x00, 0xC0, 0x7C,
+ 0x00, 0xE0, 0x3E, 0x00, 0xE0, 0x1F, 0x00, 0xF8, 0x1F, 0xE0, 0xFF, 0x1F,
+ 0xF8, 0x00, 0xFF, 0xC3, 0xF9, 0xF8, 0x07, 0x87, 0xC0, 0x38, 0x3E, 0x01,
+ 0x81, 0xF0, 0x18, 0x07, 0xC0, 0x80, 0x3E, 0x0C, 0x01, 0xF0, 0xC0, 0x07,
+ 0xC4, 0x00, 0x3E, 0x60, 0x01, 0xF6, 0x00, 0x07, 0xA0, 0x00, 0x3F, 0x00,
+ 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xC0, 0x00, 0x3E,
+ 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00,
+ 0x7E, 0x00, 0x07, 0xF0, 0x00, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xF8, 0x3F,
+ 0xFF, 0xC3, 0xE0, 0x7E, 0x1C, 0x07, 0xE0, 0xC0, 0x3E, 0x0C, 0x03, 0xF0,
+ 0x40, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x1F,
+ 0x80, 0x00, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00,
+ 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x83, 0xE0, 0x0C, 0x3F, 0x00,
+ 0xC3, 0xF0, 0x0E, 0x1F, 0x00, 0xF1, 0xF8, 0x1F, 0x9F, 0xFF, 0xF8, 0xFF,
+ 0xFF, 0xC0, 0x01, 0xFC, 0x0F, 0xE0, 0x3C, 0x00, 0xE0, 0x03, 0x80, 0x1E,
+ 0x00, 0x78, 0x01, 0xC0, 0x07, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0x80, 0x0E,
+ 0x00, 0x38, 0x01, 0xE0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x03, 0xC0, 0x0F,
+ 0x00, 0x38, 0x00, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x0F,
+ 0x00, 0x3C, 0x00, 0xFF, 0x03, 0xF8, 0x00, 0xE0, 0x38, 0x07, 0x01, 0xC0,
+ 0x70, 0x0C, 0x03, 0x80, 0xE0, 0x38, 0x07, 0x01, 0xC0, 0x70, 0x0C, 0x03,
+ 0x80, 0xE0, 0x38, 0x07, 0x01, 0xC0, 0x70, 0x0C, 0x03, 0x80, 0xE0, 0x38,
+ 0x07, 0x01, 0xC0, 0x03, 0xFC, 0x0F, 0xF0, 0x03, 0x80, 0x0E, 0x00, 0x38,
+ 0x01, 0xE0, 0x07, 0x80, 0x1C, 0x00, 0x70, 0x03, 0xC0, 0x0F, 0x00, 0x38,
+ 0x00, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x0F, 0x00, 0x3C,
+ 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x00, 0x1C,
+ 0x00, 0xF0, 0x03, 0xC0, 0xFE, 0x03, 0xF8, 0x00, 0x03, 0xC0, 0x03, 0xC0,
+ 0x07, 0xE0, 0x07, 0xE0, 0x0E, 0x70, 0x0E, 0x70, 0x1C, 0x78, 0x1C, 0x38,
+ 0x3C, 0x3C, 0x38, 0x1C, 0x78, 0x1E, 0x70, 0x0E, 0xF0, 0x0E, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xE1, 0xE3, 0xC1, 0xC1, 0xC0, 0xC0, 0x00,
+ 0xF7, 0x80, 0xFD, 0xE0, 0x7C, 0xF0, 0x3C, 0x3C, 0x1E, 0x0F, 0x0F, 0x83,
+ 0x83, 0xC1, 0xE1, 0xE0, 0x78, 0x78, 0x1C, 0x3E, 0x0F, 0x0F, 0x03, 0xC3,
+ 0xC1, 0xF0, 0xF0, 0xFC, 0xFE, 0x6F, 0x6F, 0xF3, 0xF1, 0xF8, 0xF8, 0x3C,
+ 0x1C, 0x00, 0x01, 0xE0, 0x1F, 0xC0, 0x07, 0xC0, 0x07, 0xC0, 0x07, 0x80,
+ 0x07, 0x80, 0x0F, 0x80, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x3C, 0x1E, 0xFE,
+ 0x1F, 0x9F, 0x1F, 0x0F, 0x1E, 0x0F, 0x3E, 0x0F, 0x3C, 0x0F, 0x3C, 0x1F,
+ 0x78, 0x1E, 0x78, 0x1E, 0x78, 0x3C, 0x78, 0x3C, 0xF0, 0x78, 0xF0, 0xF0,
+ 0xF1, 0xE0, 0x7F, 0xC0, 0x3F, 0x00, 0x01, 0xF0, 0x3F, 0xC3, 0xCE, 0x3C,
+ 0xF3, 0xC7, 0x1E, 0x01, 0xE0, 0x0F, 0x00, 0xF8, 0x07, 0x80, 0x3C, 0x01,
+ 0xE0, 0x0F, 0x03, 0x78, 0x31, 0xE3, 0x0F, 0xF0, 0x1E, 0x00, 0x00, 0x1F,
+ 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00, 0x0F,
+ 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x01, 0xEF, 0x00, 0x7F, 0xE0, 0x3E, 0x7C,
+ 0x07, 0x8F, 0x01, 0xE1, 0xE0, 0x78, 0x3C, 0x0F, 0x0F, 0x83, 0xC1, 0xE0,
+ 0x78, 0x3C, 0x1E, 0x0F, 0x83, 0xC1, 0xF0, 0x78, 0x7C, 0x0F, 0x0F, 0x91,
+ 0xE3, 0xF6, 0x3F, 0xDF, 0x83, 0xF3, 0xE0, 0x3C, 0x38, 0x00, 0x01, 0xE0,
+ 0x3F, 0x83, 0xCE, 0x3C, 0x73, 0xC3, 0x9E, 0x1D, 0xE1, 0xCF, 0x1C, 0xFB,
+ 0xC7, 0xF8, 0x3C, 0x01, 0xE0, 0x0F, 0x02, 0x78, 0x31, 0xE3, 0x0F, 0xF0,
+ 0x1E, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x1D, 0xC0, 0x01, 0xCE, 0x00, 0x1C,
+ 0x70, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00,
+ 0x3C, 0x00, 0x0F, 0xFC, 0x00, 0x7F, 0xE0, 0x00, 0xF0, 0x00, 0x07, 0x80,
+ 0x00, 0x3C, 0x00, 0x03, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07,
+ 0x80, 0x00, 0x7C, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00,
+ 0x07, 0x80, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0,
+ 0x00, 0x0F, 0x00, 0x0E, 0x70, 0x00, 0x77, 0x80, 0x03, 0xF8, 0x00, 0x0F,
+ 0x80, 0x00, 0x00, 0xFE, 0x00, 0x7F, 0xFC, 0x1F, 0x1F, 0x87, 0xC3, 0xC1,
+ 0xF0, 0x78, 0x3C, 0x1F, 0x07, 0x83, 0xE0, 0xF0, 0xF8, 0x0E, 0x3E, 0x01,
+ 0xFF, 0x80, 0x3F, 0xC0, 0x0C, 0x00, 0x03, 0xC0, 0x00, 0x7F, 0x80, 0x0F,
+ 0xFE, 0x00, 0x7F, 0xF0, 0x70, 0xFF, 0x1C, 0x03, 0xE3, 0x80, 0x3C, 0x70,
+ 0x07, 0x0F, 0x03, 0xE0, 0xFF, 0xF0, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x03,
+ 0xE0, 0x00, 0xF0, 0x00, 0xF8, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00,
+ 0x1F, 0x00, 0x0F, 0x0E, 0x07, 0x9F, 0x83, 0xDF, 0xC3, 0xE9, 0xE1, 0xE8,
+ 0xF0, 0xF8, 0xF8, 0x7C, 0x78, 0x7C, 0x3C, 0x3E, 0x3E, 0x1E, 0x1E, 0x1F,
+ 0x0F, 0x0F, 0x0F, 0x87, 0x87, 0xCB, 0xC3, 0xCB, 0xE1, 0xE9, 0xE0, 0xFC,
+ 0xF0, 0x38, 0x00, 0x03, 0x03, 0xC1, 0xE0, 0xF0, 0x30, 0x00, 0x00, 0x00,
+ 0x07, 0x3F, 0x87, 0x83, 0xC1, 0xE0, 0xF0, 0xF0, 0x78, 0x3C, 0x1E, 0x1E,
+ 0x0F, 0x27, 0x17, 0x93, 0xF1, 0xF8, 0x70, 0x00, 0x00, 0x06, 0x00, 0x0F,
+ 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x06, 0x00, 0xFE, 0x00, 0x3E, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C,
+ 0x00, 0x7C, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0xF8, 0x00, 0xF0,
+ 0x00, 0xF0, 0x00, 0xF0, 0x01, 0xF0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0,
+ 0x03, 0xC0, 0xE3, 0xC0, 0xE7, 0x80, 0xFF, 0x00, 0x7C, 0x00, 0x1F, 0xC0,
+ 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E,
+ 0x00, 0x1F, 0x00, 0x0F, 0x3F, 0x87, 0x87, 0x83, 0xC3, 0x03, 0xE3, 0x01,
+ 0xE3, 0x00, 0xF3, 0x00, 0x7B, 0x80, 0x7B, 0xC0, 0x3F, 0xE0, 0x1E, 0xF0,
+ 0x1F, 0x78, 0x0F, 0x1E, 0x07, 0x8F, 0x13, 0xC7, 0x93, 0xE1, 0xF9, 0xE0,
+ 0xF8, 0xF0, 0x38, 0x00, 0x1F, 0xC0, 0xF8, 0x1F, 0x03, 0xC0, 0x78, 0x1F,
+ 0x03, 0xE0, 0x78, 0x0F, 0x01, 0xE0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x0F,
+ 0x01, 0xE0, 0x3C, 0x0F, 0x81, 0xE0, 0x3C, 0x8F, 0x31, 0xEC, 0x3F, 0x07,
+ 0xC0, 0x70, 0x00, 0x01, 0x87, 0x07, 0x0F, 0xE7, 0xE7, 0xE0, 0xF3, 0xF9,
+ 0xF8, 0x3D, 0x9E, 0x9E, 0x0F, 0x47, 0xC7, 0x83, 0xE1, 0xD1, 0xE1, 0xF8,
+ 0xF8, 0xF0, 0x7C, 0x3C, 0x3C, 0x1F, 0x0F, 0x1F, 0x0F, 0x87, 0xC7, 0x83,
+ 0xE1, 0xE1, 0xE0, 0xF0, 0x78, 0x78, 0x3C, 0x1E, 0x3C, 0x1F, 0x0F, 0x0F,
+ 0x27, 0x83, 0xC3, 0xD1, 0xE0, 0xF0, 0xFC, 0xF8, 0x78, 0x1C, 0x00, 0x01,
+ 0x8F, 0x0F, 0xE7, 0xE0, 0xF3, 0xF8, 0x3C, 0x9E, 0x0F, 0x47, 0x87, 0xA3,
+ 0xC1, 0xE8, 0xF0, 0x7C, 0x3C, 0x1E, 0x1E, 0x0F, 0x87, 0x83, 0xE1, 0xE0,
+ 0xF0, 0xF8, 0x3C, 0x3C, 0x1F, 0x0F, 0x27, 0x83, 0xD1, 0xE0, 0xFC, 0x78,
+ 0x1C, 0x00, 0x01, 0xF0, 0x0E, 0x30, 0x38, 0x70, 0xF0, 0xF3, 0xC1, 0xE7,
+ 0x83, 0xDE, 0x07, 0xBC, 0x1F, 0xF8, 0x3F, 0xE0, 0x7B, 0xC0, 0xF7, 0x83,
+ 0xCF, 0x07, 0x9E, 0x1E, 0x1C, 0x38, 0x1C, 0xE0, 0x1F, 0x00, 0x00, 0xE3,
+ 0x80, 0xFD, 0xF8, 0x0F, 0xFF, 0x81, 0xE8, 0xF0, 0x3E, 0x1E, 0x07, 0x83,
+ 0xC0, 0xF0, 0x78, 0x3E, 0x1F, 0x07, 0x83, 0xC0, 0xF0, 0x78, 0x1E, 0x1F,
+ 0x07, 0x83, 0xC0, 0xF0, 0xF8, 0x1E, 0x1E, 0x03, 0xC7, 0x80, 0xFF, 0xE0,
+ 0x1E, 0xF0, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00,
+ 0xF8, 0x00, 0x3F, 0xC0, 0x00, 0x01, 0xEF, 0x07, 0xFF, 0x0F, 0x1E, 0x1E,
+ 0x1E, 0x1E, 0x1E, 0x3C, 0x1E, 0x7C, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0xF0,
+ 0x7C, 0xF0, 0x78, 0xF0, 0xF8, 0xF0, 0xF8, 0xF1, 0xF0, 0xFE, 0xF0, 0x7E,
+ 0xF0, 0x39, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x03, 0xC0, 0x03,
+ 0xC0, 0x1F, 0xF8, 0x03, 0x9C, 0x7F, 0x7C, 0x3D, 0xF8, 0x7A, 0xE0, 0xF8,
+ 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF0, 0x01,
+ 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x7C, 0x00, 0x07, 0x18, 0xFF,
+ 0xC7, 0x1C, 0x70, 0x63, 0x81, 0x1E, 0x08, 0xF8, 0x07, 0xE0, 0x1F, 0x00,
+ 0x7C, 0x01, 0xF0, 0x07, 0x84, 0x3C, 0x20, 0xE1, 0x87, 0x1C, 0x70, 0x9E,
+ 0x00, 0x00, 0x80, 0x60, 0x30, 0x1C, 0x1F, 0x1F, 0xF7, 0xFC, 0x78, 0x1E,
+ 0x07, 0x83, 0xC0, 0xF0, 0x3C, 0x1F, 0x07, 0x81, 0xE0, 0x79, 0x3C, 0x4F,
+ 0x23, 0xF0, 0xFC, 0x1C, 0x00, 0x0F, 0x0F, 0x3F, 0x87, 0x8F, 0x83, 0xC7,
+ 0xC1, 0xE3, 0xE1, 0xE1, 0xE0, 0xF0, 0xF0, 0x78, 0xF8, 0x78, 0x78, 0x3C,
+ 0x3C, 0x3E, 0x1E, 0x1F, 0x1E, 0x1F, 0x0F, 0x17, 0x97, 0x9B, 0xCB, 0xF9,
+ 0xF9, 0xF8, 0xF8, 0x78, 0x38, 0x00, 0x18, 0x37, 0xC3, 0xDE, 0x1E, 0x78,
+ 0x73, 0xC1, 0x9E, 0x08, 0xF0, 0xC7, 0x84, 0x3C, 0x41, 0xE4, 0x0F, 0x40,
+ 0x7C, 0x03, 0xC0, 0x1C, 0x00, 0xC0, 0x04, 0x00, 0x38, 0x10, 0xDF, 0x06,
+ 0x3D, 0xE0, 0xC7, 0xBC, 0x38, 0x73, 0xC7, 0x06, 0x79, 0xF0, 0x8F, 0x3E,
+ 0x11, 0xEB, 0xC4, 0x3F, 0x79, 0x07, 0xCF, 0x60, 0xF9, 0xE8, 0x1E, 0x3E,
+ 0x03, 0x87, 0x80, 0x70, 0xF0, 0x0C, 0x0C, 0x01, 0x01, 0x00, 0x03, 0x83,
+ 0x87, 0xF1, 0xF0, 0x3C, 0xF8, 0x0F, 0x60, 0x03, 0xD0, 0x00, 0xF8, 0x00,
+ 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1F, 0x00, 0x0F,
+ 0xC0, 0x02, 0xF1, 0x39, 0x3C, 0xCF, 0xCF, 0xE3, 0xE1, 0xF0, 0x70, 0x38,
+ 0x00, 0x01, 0x83, 0x07, 0xE3, 0xC1, 0xF1, 0xE0, 0x78, 0xF0, 0x3E, 0x18,
+ 0x1F, 0x08, 0x07, 0x84, 0x03, 0xC6, 0x01, 0xE2, 0x00, 0xFB, 0x00, 0x3D,
+ 0x00, 0x1F, 0x80, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xC0, 0x01, 0xE0, 0x00,
+ 0xE0, 0x00, 0x60, 0x00, 0x60, 0x0E, 0x60, 0x0F, 0xE0, 0x07, 0xE0, 0x01,
+ 0xC0, 0x00, 0x1F, 0xFC, 0x3F, 0xF8, 0x7F, 0xE1, 0x81, 0x82, 0x06, 0x00,
+ 0x08, 0x00, 0x20, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x40,
+ 0x01, 0x80, 0x07, 0xC0, 0x1F, 0x86, 0x3F, 0x8E, 0xCF, 0x9C, 0x07, 0x30,
+ 0x03, 0xC0, 0x00, 0x1E, 0x00, 0xF8, 0x03, 0xC0, 0x0F, 0x00, 0x1E, 0x00,
+ 0x38, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x1E, 0x00, 0x3C,
+ 0x00, 0x78, 0x01, 0xE0, 0x03, 0xC0, 0x1F, 0x00, 0x7E, 0x00, 0x30, 0x00,
+ 0x60, 0x00, 0xE0, 0x01, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x38,
+ 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x0E, 0x00, 0x0C, 0x00,
+ 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0,
+ 0x00, 0xF0, 0x00, 0x70, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80,
+ 0x07, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xE0, 0x03, 0xC0, 0x07,
+ 0x80, 0x0F, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x10, 0x00, 0xF0, 0x03, 0xF0,
+ 0x0F, 0x00, 0x1E, 0x00, 0x38, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07,
+ 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x70, 0x01, 0xE0, 0x0F, 0x80, 0x7C, 0x00,
+ 0x3E, 0x00, 0x7F, 0xC6, 0xFF, 0xFF, 0x61, 0xFE, 0x00, 0x7C };
+
+const GFXglyph FreeSerifBoldItalic18pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 9, 0, 1 }, // 0x20 ' '
+ { 0, 11, 25, 14, 2, -23 }, // 0x21 '!'
+ { 35, 14, 10, 19, 4, -23 }, // 0x22 '"'
+ { 53, 20, 25, 17, -1, -24 }, // 0x23 '#'
+ { 116, 17, 29, 18, 0, -25 }, // 0x24 '$'
+ { 178, 27, 25, 29, 1, -23 }, // 0x25 '%'
+ { 263, 25, 25, 27, 0, -23 }, // 0x26 '&'
+ { 342, 5, 10, 10, 4, -23 }, // 0x27 '''
+ { 349, 11, 30, 12, 1, -23 }, // 0x28 '('
+ { 391, 11, 30, 12, -2, -23 }, // 0x29 ')'
+ { 433, 13, 15, 18, 2, -23 }, // 0x2A '*'
+ { 458, 17, 17, 20, 1, -16 }, // 0x2B '+'
+ { 495, 7, 11, 9, -2, -4 }, // 0x2C ','
+ { 505, 9, 4, 12, 0, -9 }, // 0x2D '-'
+ { 510, 6, 5, 9, 0, -3 }, // 0x2E '.'
+ { 514, 14, 25, 12, 0, -23 }, // 0x2F '/'
+ { 558, 15, 25, 18, 1, -23 }, // 0x30 '0'
+ { 605, 15, 25, 17, 0, -23 }, // 0x31 '1'
+ { 652, 16, 25, 18, 0, -23 }, // 0x32 '2'
+ { 702, 15, 25, 17, 1, -23 }, // 0x33 '3'
+ { 749, 18, 24, 17, 0, -23 }, // 0x34 '4'
+ { 803, 17, 25, 18, 0, -23 }, // 0x35 '5'
+ { 857, 17, 25, 18, 1, -23 }, // 0x36 '6'
+ { 911, 16, 24, 17, 3, -23 }, // 0x37 '7'
+ { 959, 17, 25, 18, 0, -23 }, // 0x38 '8'
+ { 1013, 17, 25, 18, 0, -23 }, // 0x39 '9'
+ { 1067, 10, 17, 9, 0, -15 }, // 0x3A ':'
+ { 1089, 11, 22, 9, -1, -15 }, // 0x3B ';'
+ { 1120, 18, 19, 20, 1, -18 }, // 0x3C '<'
+ { 1163, 18, 10, 20, 2, -13 }, // 0x3D '='
+ { 1186, 18, 19, 20, 2, -18 }, // 0x3E '>'
+ { 1229, 13, 25, 17, 3, -23 }, // 0x3F '?'
+ { 1270, 25, 25, 29, 2, -23 }, // 0x40 '@'
+ { 1349, 23, 25, 24, 0, -23 }, // 0x41 'A'
+ { 1421, 24, 25, 22, 0, -23 }, // 0x42 'B'
+ { 1496, 23, 25, 22, 1, -23 }, // 0x43 'C'
+ { 1568, 26, 25, 25, 0, -23 }, // 0x44 'D'
+ { 1650, 23, 25, 22, 0, -23 }, // 0x45 'E'
+ { 1722, 23, 25, 21, 0, -23 }, // 0x46 'F'
+ { 1794, 24, 25, 25, 2, -23 }, // 0x47 'G'
+ { 1869, 29, 25, 26, 0, -23 }, // 0x48 'H'
+ { 1960, 15, 25, 13, 0, -23 }, // 0x49 'I'
+ { 2007, 20, 27, 17, 0, -23 }, // 0x4A 'J'
+ { 2075, 25, 25, 23, 0, -23 }, // 0x4B 'K'
+ { 2154, 22, 25, 21, 0, -23 }, // 0x4C 'L'
+ { 2223, 33, 25, 31, 0, -23 }, // 0x4D 'M'
+ { 2327, 27, 25, 25, 0, -23 }, // 0x4E 'N'
+ { 2412, 23, 25, 24, 1, -23 }, // 0x4F 'O'
+ { 2484, 23, 25, 21, 0, -23 }, // 0x50 'P'
+ { 2556, 23, 31, 24, 1, -23 }, // 0x51 'Q'
+ { 2646, 24, 25, 23, 0, -23 }, // 0x52 'R'
+ { 2721, 18, 25, 18, 0, -23 }, // 0x53 'S'
+ { 2778, 21, 25, 21, 3, -23 }, // 0x54 'T'
+ { 2844, 24, 25, 25, 4, -23 }, // 0x55 'U'
+ { 2919, 24, 25, 25, 4, -23 }, // 0x56 'V'
+ { 2994, 31, 25, 32, 4, -23 }, // 0x57 'W'
+ { 3091, 25, 25, 24, 0, -23 }, // 0x58 'X'
+ { 3170, 21, 25, 22, 4, -23 }, // 0x59 'Y'
+ { 3236, 21, 25, 20, 0, -23 }, // 0x5A 'Z'
+ { 3302, 14, 30, 12, -1, -23 }, // 0x5B '['
+ { 3355, 10, 25, 14, 4, -23 }, // 0x5C '\'
+ { 3387, 14, 30, 12, -2, -23 }, // 0x5D ']'
+ { 3440, 16, 13, 20, 2, -23 }, // 0x5E '^'
+ { 3466, 18, 3, 17, 0, 3 }, // 0x5F '_'
+ { 3473, 7, 6, 12, 3, -23 }, // 0x60 '`'
+ { 3479, 18, 17, 18, 0, -15 }, // 0x61 'a'
+ { 3518, 16, 26, 17, 1, -24 }, // 0x62 'b'
+ { 3570, 13, 17, 15, 1, -15 }, // 0x63 'c'
+ { 3598, 19, 25, 18, 1, -23 }, // 0x64 'd'
+ { 3658, 13, 17, 15, 1, -15 }, // 0x65 'e'
+ { 3686, 21, 32, 17, -3, -24 }, // 0x66 'f'
+ { 3770, 19, 23, 17, -1, -15 }, // 0x67 'g'
+ { 3825, 17, 25, 19, 1, -23 }, // 0x68 'h'
+ { 3879, 9, 25, 10, 1, -23 }, // 0x69 'i'
+ { 3908, 16, 31, 12, -3, -23 }, // 0x6A 'j'
+ { 3970, 17, 25, 18, 1, -23 }, // 0x6B 'k'
+ { 4024, 11, 25, 10, 1, -23 }, // 0x6C 'l'
+ { 4059, 26, 17, 27, 0, -15 }, // 0x6D 'm'
+ { 4115, 18, 17, 18, 0, -15 }, // 0x6E 'n'
+ { 4154, 15, 17, 17, 1, -15 }, // 0x6F 'o'
+ { 4186, 19, 23, 17, -2, -15 }, // 0x70 'p'
+ { 4241, 16, 23, 17, 1, -15 }, // 0x71 'q'
+ { 4287, 15, 16, 14, 0, -15 }, // 0x72 'r'
+ { 4317, 13, 17, 12, 0, -15 }, // 0x73 's'
+ { 4345, 10, 22, 10, 1, -20 }, // 0x74 't'
+ { 4373, 17, 17, 19, 1, -15 }, // 0x75 'u'
+ { 4410, 13, 16, 15, 2, -15 }, // 0x76 'v'
+ { 4436, 19, 16, 23, 3, -15 }, // 0x77 'w'
+ { 4474, 18, 17, 17, -1, -15 }, // 0x78 'x'
+ { 4513, 17, 23, 15, -2, -15 }, // 0x79 'y'
+ { 4562, 15, 19, 14, 0, -15 }, // 0x7A 'z'
+ { 4598, 15, 32, 12, 0, -24 }, // 0x7B '{'
+ { 4658, 3, 25, 9, 4, -23 }, // 0x7C '|'
+ { 4668, 15, 32, 12, -5, -24 }, // 0x7D '}'
+ { 4728, 16, 5, 20, 2, -11 } }; // 0x7E '~'
+
+const GFXfont FreeSerifBoldItalic18pt7b PROGMEM = {
+ (uint8_t *)FreeSerifBoldItalic18pt7bBitmaps,
+ (GFXglyph *)FreeSerifBoldItalic18pt7bGlyphs,
+ 0x20, 0x7E, 42 };
+
+// Approx. 5410 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBoldItalic24pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBoldItalic24pt7b.h
new file mode 100644
index 000000000000..fcb857ef9f4b
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBoldItalic24pt7b.h
@@ -0,0 +1,793 @@
+const uint8_t FreeSerifBoldItalic24pt7bBitmaps[] PROGMEM = {
+ 0x00, 0x3C, 0x00, 0xFC, 0x01, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0,
+ 0x3F, 0x00, 0x7E, 0x00, 0xF8, 0x01, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x1E,
+ 0x00, 0x3C, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x00, 0x0E, 0x00,
+ 0x18, 0x00, 0x30, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xF0, 0x03, 0xF0, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x3F, 0x00,
+ 0x3C, 0x00, 0x1C, 0x01, 0xC7, 0xC0, 0x7D, 0xF8, 0x1F, 0xBF, 0x03, 0xF7,
+ 0xC0, 0x7C, 0xF8, 0x0F, 0x9E, 0x01, 0xE3, 0xC0, 0x3C, 0x70, 0x07, 0x1E,
+ 0x00, 0xE3, 0x80, 0x38, 0x70, 0x07, 0x0C, 0x00, 0xC0, 0x00, 0x03, 0xC1,
+ 0xE0, 0x00, 0x70, 0x38, 0x00, 0x1E, 0x0F, 0x00, 0x03, 0xC1, 0xE0, 0x00,
+ 0x70, 0x38, 0x00, 0x1E, 0x0F, 0x00, 0x03, 0x81, 0xC0, 0x00, 0xF0, 0x78,
+ 0x00, 0x1E, 0x0F, 0x00, 0x07, 0x83, 0xC0, 0x1F, 0xFF, 0xFF, 0x83, 0xFF,
+ 0xFF, 0xF0, 0x7F, 0xFF, 0xFC, 0x00, 0xE0, 0x70, 0x00, 0x3C, 0x1E, 0x00,
+ 0x07, 0x83, 0xC0, 0x00, 0xE0, 0x70, 0x00, 0x3C, 0x1E, 0x00, 0x07, 0x83,
+ 0xC0, 0x00, 0xE0, 0x70, 0x07, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFC, 0x1F,
+ 0xFF, 0xFF, 0x00, 0x38, 0x1C, 0x00, 0x0F, 0x07, 0x80, 0x01, 0xE0, 0xF0,
+ 0x00, 0x38, 0x1C, 0x00, 0x0F, 0x07, 0x80, 0x01, 0xC0, 0xE0, 0x00, 0x78,
+ 0x3C, 0x00, 0x0F, 0x07, 0x80, 0x01, 0xC0, 0xE0, 0x00, 0x78, 0x3C, 0x00,
+ 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x1F,
+ 0xE0, 0x00, 0x7F, 0xF8, 0x01, 0xF1, 0x9E, 0x01, 0xC1, 0x8F, 0x03, 0x83,
+ 0x8F, 0x03, 0x83, 0x06, 0x07, 0x83, 0x06, 0x07, 0x87, 0x06, 0x07, 0xC7,
+ 0x04, 0x07, 0xE6, 0x04, 0x07, 0xFE, 0x00, 0x03, 0xFE, 0x00, 0x03, 0xFF,
+ 0x00, 0x01, 0xFF, 0x80, 0x00, 0xFF, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x1F,
+ 0xE0, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xF0, 0x00, 0x3B, 0xF8, 0x20, 0x31,
+ 0xF8, 0x20, 0x30, 0xF8, 0x60, 0x70, 0xF8, 0x60, 0x60, 0xF8, 0x60, 0x60,
+ 0xF8, 0xF0, 0xE0, 0xF0, 0xF0, 0xE1, 0xE0, 0x78, 0xC3, 0xE0, 0x3C, 0xC7,
+ 0xC0, 0x0F, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x01, 0x80, 0x00, 0x03, 0x80,
+ 0x00, 0x03, 0x80, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0xF0,
+ 0x00, 0x70, 0x00, 0xFF, 0x80, 0x1C, 0x00, 0x3F, 0x38, 0x1F, 0x00, 0x0F,
+ 0xC7, 0xFF, 0xE0, 0x03, 0xF0, 0x3F, 0xB8, 0x00, 0x7E, 0x04, 0x07, 0x00,
+ 0x1F, 0x80, 0x81, 0xC0, 0x03, 0xF0, 0x10, 0x38, 0x00, 0xFC, 0x02, 0x0E,
+ 0x00, 0x1F, 0x80, 0x81, 0x80, 0x03, 0xF0, 0x10, 0x70, 0x00, 0x7C, 0x06,
+ 0x1C, 0x00, 0x0F, 0x80, 0x83, 0x80, 0x01, 0xF0, 0x30, 0xE0, 0x00, 0x1E,
+ 0x0C, 0x1C, 0x07, 0xC3, 0xE3, 0x07, 0x03, 0xFC, 0x3F, 0xC0, 0xC0, 0xFC,
+ 0x43, 0xE0, 0x38, 0x3E, 0x0C, 0x00, 0x0E, 0x0F, 0xC0, 0x80, 0x01, 0xC3,
+ 0xF0, 0x10, 0x00, 0x70, 0xFC, 0x02, 0x00, 0x0C, 0x1F, 0x80, 0x40, 0x03,
+ 0x83, 0xE0, 0x08, 0x00, 0x60, 0xFC, 0x02, 0x00, 0x1C, 0x1F, 0x80, 0x40,
+ 0x07, 0x03, 0xE0, 0x10, 0x00, 0xE0, 0x7C, 0x02, 0x00, 0x38, 0x0F, 0x80,
+ 0xC0, 0x06, 0x01, 0xF0, 0x30, 0x01, 0xC0, 0x1F, 0x0C, 0x00, 0x30, 0x01,
+ 0xFF, 0x00, 0x0E, 0x00, 0x1F, 0x80, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00,
+ 0xFF, 0x80, 0x00, 0x01, 0xF1, 0xE0, 0x00, 0x00, 0xF0, 0x78, 0x00, 0x00,
+ 0xF0, 0x3C, 0x00, 0x00, 0x78, 0x1E, 0x00, 0x00, 0x7C, 0x0F, 0x00, 0x00,
+ 0x3E, 0x0F, 0x80, 0x00, 0x1F, 0x07, 0x80, 0x00, 0x0F, 0x87, 0x80, 0x00,
+ 0x07, 0xC7, 0x80, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00,
+ 0x00, 0xFC, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x01, 0xFF, 0x07, 0xFE,
+ 0x03, 0xCF, 0xC0, 0xFE, 0x03, 0xC7, 0xE0, 0x3C, 0x07, 0xC3, 0xF0, 0x1C,
+ 0x07, 0xC0, 0xFC, 0x0C, 0x03, 0xC0, 0x7E, 0x0E, 0x03, 0xE0, 0x3F, 0x0E,
+ 0x01, 0xF0, 0x1F, 0xC6, 0x01, 0xF8, 0x07, 0xF6, 0x00, 0xFC, 0x03, 0xFF,
+ 0x00, 0x7E, 0x00, 0xFF, 0x00, 0x3F, 0x80, 0x7F, 0x80, 0x1F, 0xC0, 0x1F,
+ 0xC0, 0x07, 0xF0, 0x0F, 0xF0, 0x13, 0xFE, 0x0F, 0xFE, 0x18, 0xFF, 0xFE,
+ 0xFF, 0xF8, 0x3F, 0xFE, 0x3F, 0xF8, 0x07, 0xF8, 0x03, 0xF0, 0x00, 0x1C,
+ 0x7D, 0xFB, 0xF7, 0xCF, 0x9E, 0x3C, 0x71, 0xE3, 0x87, 0x0C, 0x00, 0x00,
+ 0x04, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x3C, 0x01,
+ 0xE0, 0x0F, 0x00, 0x3C, 0x01, 0xE0, 0x0F, 0x80, 0x3C, 0x00, 0xF0, 0x07,
+ 0xC0, 0x1E, 0x00, 0x78, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF0, 0x03,
+ 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00,
+ 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x30, 0x00, 0xE0, 0x01, 0x80,
+ 0x06, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x60, 0x01, 0x80, 0x00, 0x00, 0x01,
+ 0x00, 0x06, 0x00, 0x08, 0x00, 0x30, 0x00, 0x40, 0x01, 0x80, 0x06, 0x00,
+ 0x1C, 0x00, 0x30, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xF0,
+ 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x7C,
+ 0x01, 0xF0, 0x07, 0xC0, 0x1E, 0x00, 0x78, 0x03, 0xE0, 0x0F, 0x80, 0x3C,
+ 0x01, 0xF0, 0x07, 0x80, 0x1E, 0x00, 0xF0, 0x03, 0x80, 0x1E, 0x00, 0xF0,
+ 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x06, 0x00, 0x30, 0x00, 0x80, 0x00, 0x00,
+ 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x07, 0x0E, 0x1D, 0xF1,
+ 0xC7, 0xFF, 0x11, 0xFF, 0xE2, 0x3F, 0x7E, 0x4F, 0xC0, 0x3E, 0x00, 0x07,
+ 0xC0, 0x3F, 0x27, 0xEF, 0xC4, 0x7F, 0xF8, 0x8F, 0xFE, 0x38, 0xFB, 0x87,
+ 0x0E, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0x70, 0x00, 0x00,
+ 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78,
+ 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x03,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x01,
+ 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0,
+ 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00,
+ 0x07, 0x80, 0x00, 0x0F, 0x07, 0xE1, 0xFC, 0x7F, 0x1F, 0xC3, 0xF0, 0x7C,
+ 0x0E, 0x03, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x1C, 0x04, 0x00, 0x7F, 0xF7,
+ 0xFF, 0x7F, 0xEF, 0xFE, 0xFF, 0xE0, 0x3C, 0x7E, 0xFF, 0xFF, 0xFF, 0x7E,
+ 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00,
+ 0x78, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x07,
+ 0xC0, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x3C,
+ 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x01, 0xE0,
+ 0x00, 0x7C, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x0F, 0x00,
+ 0x03, 0xC0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0xF8, 0x00,
+ 0x1E, 0x00, 0x07, 0xC0, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00,
+ 0xE3, 0x80, 0x0F, 0x07, 0x00, 0x7C, 0x1C, 0x03, 0xE0, 0x78, 0x0F, 0x81,
+ 0xE0, 0x7C, 0x07, 0x83, 0xF0, 0x1F, 0x0F, 0xC0, 0xFC, 0x7E, 0x03, 0xF1,
+ 0xF8, 0x0F, 0xCF, 0xE0, 0x3F, 0x3F, 0x00, 0xFD, 0xFC, 0x07, 0xF7, 0xF0,
+ 0x1F, 0xDF, 0xC0, 0x7F, 0x7E, 0x01, 0xFB, 0xF8, 0x0F, 0xEF, 0xE0, 0x3F,
+ 0xBF, 0x80, 0xFE, 0xFC, 0x03, 0xF3, 0xF0, 0x1F, 0xCF, 0xC0, 0x7F, 0x3F,
+ 0x01, 0xF8, 0xFC, 0x07, 0xE3, 0xE0, 0x3F, 0x0F, 0x80, 0xFC, 0x1E, 0x07,
+ 0xE0, 0x78, 0x1F, 0x00, 0xE0, 0x78, 0x03, 0x83, 0xC0, 0x07, 0x1E, 0x00,
+ 0x07, 0xE0, 0x00, 0x00, 0x00, 0x70, 0x01, 0xFE, 0x01, 0xFF, 0xE0, 0x00,
+ 0xFE, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x01, 0xFC, 0x00,
+ 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x00,
+ 0x03, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xE0,
+ 0x00, 0xFE, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xFC,
+ 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF0, 0x00, 0x3F,
+ 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x1F, 0xF8, 0x0F, 0xFF, 0xF0, 0x00,
+ 0x0F, 0x80, 0x01, 0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x7F, 0xFE, 0x03, 0x83,
+ 0xF8, 0x0C, 0x07, 0xF0, 0x60, 0x1F, 0xC3, 0x00, 0x3F, 0x00, 0x00, 0xFC,
+ 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF8, 0x00,
+ 0x07, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x1E,
+ 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00,
+ 0x0E, 0x00, 0x00, 0x70, 0x06, 0x03, 0x80, 0x10, 0x1C, 0x00, 0xC0, 0xE0,
+ 0x06, 0x07, 0xFF, 0xF8, 0x3F, 0xFF, 0xE1, 0xFF, 0xFF, 0x0F, 0xFF, 0xFC,
+ 0x3F, 0xFF, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0x80,
+ 0x60, 0xFE, 0x03, 0x01, 0xFC, 0x08, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00,
+ 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0xFC,
+ 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x07, 0xF8, 0x00, 0x7F, 0xF0, 0x00,
+ 0x7F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x03,
+ 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xE0,
+ 0x00, 0x0F, 0x80, 0x00, 0x3C, 0x1C, 0x01, 0xF0, 0xF8, 0x07, 0x83, 0xF0,
+ 0x3C, 0x0F, 0xE1, 0xE0, 0x1F, 0xFE, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x00,
+ 0x07, 0x00, 0x00, 0x07, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xE0, 0x00,
+ 0x07, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xFC, 0x00,
+ 0x06, 0xFC, 0x00, 0x06, 0x7E, 0x00, 0x06, 0x3F, 0x00, 0x06, 0x3F, 0x00,
+ 0x06, 0x1F, 0x80, 0x06, 0x0F, 0xC0, 0x06, 0x07, 0xE0, 0x03, 0x07, 0xE0,
+ 0x03, 0x03, 0xF0, 0x03, 0x01, 0xF8, 0x03, 0x01, 0xFC, 0x03, 0x00, 0xFC,
+ 0x03, 0x00, 0x7E, 0x03, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF,
+ 0xF0, 0xFF, 0xFF, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xE0, 0x00, 0x03,
+ 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00,
+ 0x7E, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00,
+ 0x7F, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x01,
+ 0x80, 0x00, 0x03, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x07,
+ 0xFF, 0x00, 0x07, 0xFF, 0x80, 0x0F, 0xFF, 0xC0, 0x00, 0xFF, 0xE0, 0x00,
+ 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF0, 0x00,
+ 0x03, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00,
+ 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x78, 0x03, 0xC0, 0xFC,
+ 0x07, 0x80, 0xFC, 0x0F, 0x00, 0xFE, 0x1E, 0x00, 0x7F, 0xF8, 0x00, 0x1F,
+ 0xC0, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0x80, 0x00,
+ 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x01, 0xFC,
+ 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00,
+ 0x01, 0xFF, 0xF0, 0x07, 0xFF, 0xF0, 0x0F, 0xE1, 0xF0, 0x3F, 0x81, 0xF0,
+ 0x7F, 0x03, 0xF0, 0xFC, 0x07, 0xE3, 0xF8, 0x0F, 0xC7, 0xF0, 0x1F, 0x8F,
+ 0xC0, 0x7F, 0x1F, 0x80, 0xFE, 0x3F, 0x01, 0xFC, 0x7C, 0x03, 0xF0, 0xF8,
+ 0x0F, 0xE1, 0xF0, 0x1F, 0xC1, 0xE0, 0x3F, 0x03, 0xC0, 0xFC, 0x07, 0x81,
+ 0xF0, 0x07, 0x87, 0xC0, 0x07, 0xFF, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xFF,
+ 0xFC, 0x1F, 0xFF, 0xF8, 0x3F, 0xFF, 0xE0, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF,
+ 0x07, 0x00, 0x1C, 0x08, 0x00, 0x78, 0x30, 0x01, 0xE0, 0x40, 0x03, 0xC0,
+ 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00,
+ 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01,
+ 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x78,
+ 0x00, 0x01, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00,
+ 0x00, 0x78, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x80, 0x00,
+ 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x03, 0xFE, 0x00, 0x3C, 0x78,
+ 0x03, 0xC1, 0xE0, 0x3C, 0x07, 0x81, 0xE0, 0x3C, 0x1F, 0x01, 0xE0, 0xF8,
+ 0x0F, 0x07, 0xC0, 0x78, 0x3F, 0x03, 0xC1, 0xF8, 0x3C, 0x0F, 0xE1, 0xE0,
+ 0x3F, 0x9E, 0x01, 0xFF, 0xC0, 0x07, 0xFC, 0x00, 0x3F, 0xC0, 0x00, 0xFF,
+ 0x00, 0x1F, 0xFC, 0x03, 0xCF, 0xF0, 0x3C, 0x3F, 0x83, 0xC0, 0xFC, 0x3C,
+ 0x03, 0xF1, 0xE0, 0x1F, 0x9E, 0x00, 0x7C, 0xF0, 0x03, 0xE7, 0x80, 0x1F,
+ 0x3C, 0x00, 0xF9, 0xE0, 0x07, 0x87, 0x00, 0x3C, 0x3C, 0x03, 0xC0, 0xF0,
+ 0x3C, 0x03, 0xC3, 0xC0, 0x07, 0xF0, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0xFF,
+ 0xE0, 0x03, 0xF1, 0xE0, 0x0F, 0xC1, 0xC0, 0x3F, 0x03, 0xC0, 0xFE, 0x07,
+ 0x81, 0xF8, 0x0F, 0x87, 0xF0, 0x1F, 0x0F, 0xC0, 0x3E, 0x3F, 0x80, 0xFC,
+ 0x7F, 0x01, 0xF8, 0xFC, 0x03, 0xF1, 0xF8, 0x07, 0xE3, 0xF0, 0x1F, 0xC7,
+ 0xE0, 0x3F, 0x8F, 0xC0, 0x7E, 0x0F, 0x81, 0xFC, 0x1F, 0x03, 0xF8, 0x1F,
+ 0x0F, 0xE0, 0x1F, 0xFF, 0xC0, 0x1F, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x03,
+ 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x01, 0xF8,
+ 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00,
+ 0x1F, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x01, 0xE0, 0x1F, 0x81, 0xFE, 0x0F,
+ 0xF0, 0x7F, 0x81, 0xF8, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x7E, 0x07, 0xF8, 0x3F,
+ 0xC1, 0xFE, 0x07, 0xE0, 0x1E, 0x00, 0x00, 0x78, 0x01, 0xF8, 0x07, 0xF8,
+ 0x0F, 0xF0, 0x1F, 0xE0, 0x1F, 0x80, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80,
+ 0x1F, 0x80, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x00, 0xFC, 0x00, 0xF8, 0x00,
+ 0xE0, 0x01, 0xC0, 0x07, 0x00, 0x0C, 0x00, 0x30, 0x01, 0xC0, 0x0E, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x1F,
+ 0x00, 0x00, 0x7F, 0x00, 0x03, 0xFF, 0x00, 0x0F, 0xFC, 0x00, 0x3F, 0xF0,
+ 0x01, 0xFF, 0xC0, 0x07, 0xFE, 0x00, 0x1F, 0xF8, 0x00, 0x7F, 0xE0, 0x00,
+ 0xFF, 0x80, 0x00, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xE0, 0x00,
+ 0x1F, 0xF8, 0x00, 0x07, 0xFE, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x3F, 0xF0,
+ 0x00, 0x0F, 0xFC, 0x00, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F,
+ 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x80, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFF, 0x00, 0x00,
+ 0xFF, 0xC0, 0x00, 0x3F, 0xF0, 0x00, 0x0F, 0xFC, 0x00, 0x03, 0xFF, 0x80,
+ 0x00, 0x7F, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x07, 0xFF, 0x00, 0x00, 0xFF,
+ 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFF, 0x00, 0x03, 0xFF, 0x00, 0x1F, 0xFC,
+ 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x3F, 0xF0, 0x00,
+ 0xFF, 0xC0, 0x00, 0xFF, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xE0, 0x00, 0x00,
+ 0x80, 0x00, 0x00, 0x01, 0xF8, 0x01, 0xFF, 0x80, 0xF1, 0xF0, 0x38, 0x3E,
+ 0x1E, 0x0F, 0xC7, 0xC3, 0xF1, 0xF0, 0xFC, 0x7C, 0x3F, 0x0E, 0x0F, 0xC0,
+ 0x07, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x07,
+ 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x0C, 0x00,
+ 0x06, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0xC0, 0x01, 0xF8, 0x00, 0xFF, 0x00, 0x3F, 0xC0, 0x0F, 0xF0,
+ 0x01, 0xF8, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x1F,
+ 0xFF, 0xC0, 0x00, 0x3F, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x7C,
+ 0x00, 0x03, 0x80, 0x7C, 0x00, 0x00, 0xE0, 0x7C, 0x00, 0x00, 0x38, 0x3C,
+ 0x00, 0xF0, 0x4C, 0x3E, 0x00, 0xFD, 0xE7, 0x1E, 0x00, 0xF3, 0xF1, 0x9F,
+ 0x00, 0xF1, 0xF0, 0xEF, 0x80, 0xF0, 0x78, 0x3F, 0x80, 0xF0, 0x3C, 0x1F,
+ 0xC0, 0x78, 0x1E, 0x0F, 0xE0, 0x78, 0x1E, 0x07, 0xF0, 0x3C, 0x0F, 0x03,
+ 0xF8, 0x3E, 0x07, 0x81, 0xFC, 0x1E, 0x07, 0x81, 0xFE, 0x0F, 0x03, 0xC0,
+ 0xDF, 0x07, 0x83, 0xC0, 0x6F, 0x83, 0xC3, 0xE0, 0x63, 0xE1, 0xF3, 0xF0,
+ 0x71, 0xF0, 0x7E, 0x78, 0x70, 0xF8, 0x1E, 0x3F, 0xF0, 0x3E, 0x00, 0x07,
+ 0xE0, 0x0F, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x01, 0xF0, 0x00,
+ 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x03, 0x80, 0x03, 0xF0,
+ 0x07, 0xC0, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00,
+ 0x00, 0x06, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
+ 0x00, 0xF0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00,
+ 0x1F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x03,
+ 0x7E, 0x00, 0x00, 0x06, 0xFC, 0x00, 0x00, 0x19, 0xF8, 0x00, 0x00, 0x63,
+ 0xF8, 0x00, 0x00, 0xC7, 0xF0, 0x00, 0x03, 0x07, 0xE0, 0x00, 0x06, 0x0F,
+ 0xC0, 0x00, 0x18, 0x1F, 0x80, 0x00, 0x60, 0x3F, 0x00, 0x00, 0xC0, 0x7F,
+ 0x00, 0x03, 0x00, 0xFE, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xF8,
+ 0x00, 0x60, 0x03, 0xF0, 0x00, 0xC0, 0x07, 0xE0, 0x03, 0x00, 0x0F, 0xE0,
+ 0x0E, 0x00, 0x1F, 0xC0, 0x18, 0x00, 0x3F, 0x80, 0x70, 0x00, 0x7F, 0x01,
+ 0xC0, 0x00, 0xFE, 0x03, 0x80, 0x01, 0xFE, 0x1F, 0x80, 0x07, 0xFE, 0x7F,
+ 0xC0, 0x3F, 0xFF, 0x01, 0xFF, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xE0, 0x00,
+ 0xFE, 0x1F, 0xE0, 0x01, 0xFC, 0x1F, 0xE0, 0x03, 0xF8, 0x1F, 0xE0, 0x0F,
+ 0xE0, 0x3F, 0xC0, 0x1F, 0xC0, 0x7F, 0x80, 0x3F, 0x80, 0xFF, 0x00, 0x7F,
+ 0x01, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x03, 0xF8, 0x0F, 0xF0, 0x07, 0xF0,
+ 0x1F, 0xC0, 0x0F, 0xC0, 0x7F, 0x00, 0x3F, 0x87, 0xF0, 0x00, 0x7F, 0xFF,
+ 0x00, 0x00, 0xFE, 0x1F, 0xC0, 0x03, 0xF8, 0x0F, 0xE0, 0x07, 0xF0, 0x0F,
+ 0xE0, 0x0F, 0xE0, 0x1F, 0xC0, 0x1F, 0xC0, 0x3F, 0xC0, 0x7F, 0x00, 0x7F,
+ 0x80, 0xFE, 0x00, 0xFF, 0x01, 0xFC, 0x01, 0xFE, 0x03, 0xF0, 0x07, 0xFC,
+ 0x0F, 0xE0, 0x0F, 0xF0, 0x1F, 0xC0, 0x3F, 0xE0, 0x3F, 0x80, 0x7F, 0x80,
+ 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x0F, 0xF8, 0x07, 0xFF, 0xFF, 0xC0, 0x3F,
+ 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x08, 0x00, 0x7F, 0xFE, 0xC0,
+ 0x0F, 0xF0, 0x7E, 0x00, 0xFE, 0x01, 0xF0, 0x1F, 0xE0, 0x07, 0x01, 0xFE,
+ 0x00, 0x38, 0x1F, 0xE0, 0x00, 0xC0, 0xFE, 0x00, 0x06, 0x0F, 0xF0, 0x00,
+ 0x30, 0xFF, 0x00, 0x01, 0x07, 0xF8, 0x00, 0x08, 0x7F, 0x80, 0x00, 0x03,
+ 0xFC, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x0F, 0xF0,
+ 0x00, 0x00, 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00,
+ 0x01, 0xFE, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x03,
+ 0xFC, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x03, 0xF8,
+ 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x60, 0x7F, 0x00, 0x06, 0x03, 0xFC, 0x00,
+ 0x70, 0x0F, 0xE0, 0x07, 0x00, 0x1F, 0xC0, 0xE0, 0x00, 0x7F, 0xFE, 0x00,
+ 0x00, 0x7F, 0x80, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x00, 0x3F, 0xFF, 0xFE,
+ 0x00, 0x00, 0xFE, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x3F, 0x00, 0x03, 0xF8,
+ 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x03,
+ 0xF8, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x1F, 0xC0, 0x03, 0xFC,
+ 0x03, 0xF8, 0x00, 0x7F, 0x80, 0x7F, 0x00, 0x0F, 0xF0, 0x0F, 0xC0, 0x01,
+ 0xFE, 0x03, 0xF8, 0x00, 0x3F, 0xC0, 0x7F, 0x00, 0x07, 0xF8, 0x0F, 0xE0,
+ 0x01, 0xFF, 0x03, 0xF8, 0x00, 0x3F, 0xE0, 0x7F, 0x00, 0x07, 0xF8, 0x0F,
+ 0xE0, 0x00, 0xFF, 0x01, 0xFC, 0x00, 0x3F, 0xE0, 0x7F, 0x00, 0x07, 0xF8,
+ 0x0F, 0xE0, 0x01, 0xFF, 0x01, 0xFC, 0x00, 0x3F, 0xC0, 0x3F, 0x00, 0x0F,
+ 0xF0, 0x0F, 0xE0, 0x01, 0xFC, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x3F, 0x80,
+ 0x1F, 0xC0, 0x0F, 0xE0, 0x0F, 0xF0, 0x01, 0xFE, 0x07, 0xF8, 0x00, 0x7F,
+ 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0xF8, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF,
+ 0x00, 0x7F, 0xFF, 0xFF, 0x00, 0x3F, 0xC0, 0x7E, 0x00, 0x3F, 0x80, 0x1E,
+ 0x00, 0x3F, 0x80, 0x0E, 0x00, 0x7F, 0x00, 0x06, 0x00, 0x7F, 0x00, 0x04,
+ 0x00, 0x7F, 0x00, 0x04, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x80,
+ 0x00, 0xFE, 0x01, 0x00, 0x00, 0xFE, 0x03, 0x00, 0x00, 0xFC, 0x0F, 0x00,
+ 0x01, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x01, 0xFC, 0x3E, 0x00,
+ 0x03, 0xF8, 0x1E, 0x00, 0x03, 0xF8, 0x0C, 0x00, 0x03, 0xF8, 0x0C, 0x00,
+ 0x03, 0xF8, 0x0C, 0x00, 0x07, 0xF0, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x08,
+ 0x07, 0xF0, 0x00, 0x18, 0x07, 0xE0, 0x00, 0x30, 0x0F, 0xE0, 0x00, 0x30,
+ 0x0F, 0xE0, 0x00, 0x70, 0x0F, 0xE0, 0x01, 0xE0, 0x1F, 0xC0, 0x07, 0xE0,
+ 0x1F, 0xE0, 0x3F, 0xE0, 0x3F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xC0,
+ 0x01, 0xFF, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0x03, 0xF0,
+ 0x01, 0xFC, 0x01, 0xE0, 0x03, 0xF8, 0x01, 0xC0, 0x0F, 0xE0, 0x01, 0x80,
+ 0x1F, 0xC0, 0x02, 0x00, 0x3F, 0x80, 0x04, 0x00, 0x7F, 0x00, 0x00, 0x01,
+ 0xFC, 0x03, 0x00, 0x03, 0xF8, 0x04, 0x00, 0x07, 0xF0, 0x18, 0x00, 0x0F,
+ 0xC0, 0xF0, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0xFE,
+ 0x1F, 0x00, 0x03, 0xF8, 0x1E, 0x00, 0x07, 0xF0, 0x18, 0x00, 0x0F, 0xE0,
+ 0x30, 0x00, 0x1F, 0xC0, 0x60, 0x00, 0x7F, 0x00, 0x80, 0x00, 0xFE, 0x01,
+ 0x00, 0x01, 0xFC, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00,
+ 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00,
+ 0x01, 0xFE, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xFF, 0x02, 0x00, 0x0F, 0xFF, 0xEE, 0x00, 0x3F, 0xC0,
+ 0xFC, 0x00, 0x7F, 0x00, 0x7C, 0x01, 0xFE, 0x00, 0x3C, 0x03, 0xFC, 0x00,
+ 0x38, 0x07, 0xF8, 0x00, 0x18, 0x07, 0xF0, 0x00, 0x18, 0x0F, 0xF0, 0x00,
+ 0x10, 0x1F, 0xE0, 0x00, 0x10, 0x1F, 0xE0, 0x00, 0x00, 0x3F, 0xC0, 0x00,
+ 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x7F, 0x80, 0x00,
+ 0x00, 0x7F, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x1F,
+ 0xFF, 0xFF, 0x00, 0x07, 0xFC, 0xFF, 0x00, 0x03, 0xF8, 0xFF, 0x00, 0x03,
+ 0xF8, 0xFF, 0x00, 0x03, 0xF0, 0xFF, 0x00, 0x03, 0xF0, 0xFF, 0x00, 0x07,
+ 0xF0, 0x7F, 0x00, 0x07, 0xF0, 0x7F, 0x00, 0x07, 0xE0, 0x7F, 0x80, 0x07,
+ 0xE0, 0x3F, 0x80, 0x0F, 0xE0, 0x1F, 0xC0, 0x0F, 0xC0, 0x0F, 0xE0, 0x0F,
+ 0xC0, 0x07, 0xF0, 0x3F, 0x80, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x3F, 0xE0,
+ 0x00, 0x01, 0xFF, 0xFC, 0x7F, 0xFE, 0x00, 0xFF, 0xC0, 0x3F, 0xF0, 0x00,
+ 0xFE, 0x00, 0x3F, 0xC0, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00,
+ 0xFE, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x00,
+ 0x3F, 0x80, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x01, 0xFC, 0x00,
+ 0x7F, 0x00, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x01, 0xFC, 0x00,
+ 0x0F, 0xC0, 0x03, 0xF8, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x00, 0x7F, 0xFF,
+ 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, 0x80, 0x03, 0xF8, 0x00, 0x7F, 0x00,
+ 0x07, 0xF0, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x03, 0xF8, 0x00, 0x1F, 0xC0,
+ 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x3F, 0x80,
+ 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x03, 0xF0, 0x00, 0xFE, 0x00, 0x0F, 0xE0,
+ 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x0F, 0xE0,
+ 0x00, 0xFF, 0x00, 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x7F, 0x80, 0x07, 0xFC,
+ 0x01, 0xFF, 0x00, 0x3F, 0xFF, 0x1F, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xF8,
+ 0x03, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x3F,
+ 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xF0, 0x00,
+ 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0,
+ 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07,
+ 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFC, 0x00,
+ 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xFC,
+ 0x00, 0x1F, 0xF0, 0x03, 0xFF, 0xF0, 0x00, 0x00, 0x07, 0xFF, 0xE0, 0x00,
+ 0x3F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xE0,
+ 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x01,
+ 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0xFC, 0x00,
+ 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F,
+ 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00,
+ 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0,
+ 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x00,
+ 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x07, 0x03, 0xF0, 0x01, 0xF0, 0xFE, 0x00,
+ 0x3E, 0x1F, 0xC0, 0x07, 0xC3, 0xF0, 0x00, 0xF8, 0xFC, 0x00, 0x0F, 0x3F,
+ 0x80, 0x00, 0xFF, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x01, 0xFF, 0xF8,
+ 0xFF, 0xC0, 0x1F, 0xF8, 0x0F, 0xC0, 0x03, 0xF8, 0x01, 0xC0, 0x00, 0xFE,
+ 0x00, 0xE0, 0x00, 0x3F, 0x80, 0x70, 0x00, 0x1F, 0xC0, 0x38, 0x00, 0x07,
+ 0xF0, 0x1C, 0x00, 0x01, 0xFC, 0x0E, 0x00, 0x00, 0x7F, 0x07, 0x00, 0x00,
+ 0x3F, 0x83, 0x80, 0x00, 0x0F, 0xE1, 0xC0, 0x00, 0x03, 0xF8, 0xE0, 0x00,
+ 0x00, 0xFC, 0x60, 0x00, 0x00, 0x7F, 0x7C, 0x00, 0x00, 0x1F, 0xFF, 0x00,
+ 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x03, 0xFB, 0xF8, 0x00, 0x00, 0xFE, 0x7F,
+ 0x00, 0x00, 0x3F, 0x9F, 0xC0, 0x00, 0x0F, 0xE3, 0xF8, 0x00, 0x07, 0xF0,
+ 0xFE, 0x00, 0x01, 0xFC, 0x1F, 0xC0, 0x00, 0x7F, 0x07, 0xF0, 0x00, 0x1F,
+ 0x80, 0xFE, 0x00, 0x0F, 0xE0, 0x3F, 0x80, 0x03, 0xF8, 0x0F, 0xE0, 0x00,
+ 0xFE, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x1F, 0xE0, 0x0F, 0xE0,
+ 0x0F, 0xF8, 0x07, 0xFC, 0x0F, 0xFF, 0xC7, 0xFF, 0xC0, 0x01, 0xFF, 0xF8,
+ 0x00, 0x03, 0xFF, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00,
+ 0x03, 0xF8, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x0F,
+ 0xE0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x3F, 0x80,
+ 0x00, 0x01, 0xFC, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00,
+ 0x07, 0xF0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F,
+ 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x7F, 0x00,
+ 0x00, 0x03, 0xF8, 0x00, 0x04, 0x1F, 0xC0, 0x00, 0x60, 0xFC, 0x00, 0x06,
+ 0x0F, 0xE0, 0x00, 0x30, 0x7F, 0x00, 0x03, 0x83, 0xF8, 0x00, 0x7C, 0x3F,
+ 0x80, 0x0F, 0xC1, 0xFE, 0x03, 0xFE, 0x1F, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF,
+ 0xFF, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x3F, 0xF0, 0x03, 0xFC, 0x00, 0x03,
+ 0xFC, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, 0x03, 0xFC, 0x00, 0x0F, 0xF8,
+ 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x80, 0x03, 0xFC, 0x00, 0x1F, 0xF0, 0x00,
+ 0x6F, 0xC0, 0x03, 0xFF, 0x00, 0x06, 0xFC, 0x00, 0x37, 0xF0, 0x00, 0x6F,
+ 0xE0, 0x06, 0x7E, 0x00, 0x04, 0xFE, 0x00, 0xEF, 0xE0, 0x00, 0xCF, 0xE0,
+ 0x0C, 0xFE, 0x00, 0x0C, 0xFE, 0x01, 0x8F, 0xE0, 0x00, 0xCF, 0xE0, 0x38,
+ 0xFC, 0x00, 0x18, 0x7E, 0x03, 0x1F, 0xC0, 0x01, 0x87, 0xE0, 0x61, 0xFC,
+ 0x00, 0x18, 0x7E, 0x0E, 0x1F, 0xC0, 0x01, 0x87, 0xE0, 0xC3, 0xF8, 0x00,
+ 0x30, 0x7F, 0x18, 0x3F, 0x80, 0x03, 0x07, 0xF3, 0x83, 0xF8, 0x00, 0x30,
+ 0x7F, 0x30, 0x3F, 0x00, 0x06, 0x07, 0xF7, 0x07, 0xF0, 0x00, 0x60, 0x3F,
+ 0xE0, 0x7F, 0x00, 0x06, 0x03, 0xFC, 0x07, 0xF0, 0x00, 0xE0, 0x3F, 0xC0,
+ 0x7E, 0x00, 0x0C, 0x03, 0xF8, 0x0F, 0xE0, 0x00, 0xC0, 0x3F, 0x00, 0xFE,
+ 0x00, 0x0C, 0x03, 0xF0, 0x0F, 0xE0, 0x01, 0xC0, 0x3E, 0x01, 0xFC, 0x00,
+ 0x1C, 0x03, 0xC0, 0x1F, 0xC0, 0x07, 0xE0, 0x3C, 0x03, 0xFE, 0x00, 0xFF,
+ 0xC1, 0x81, 0xFF, 0xFC, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0xFF,
+ 0x00, 0x1F, 0xF8, 0x03, 0xF8, 0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x00, 0xF0,
+ 0x00, 0x7F, 0x00, 0x07, 0x00, 0x03, 0xFC, 0x00, 0x38, 0x00, 0x1F, 0xE0,
+ 0x01, 0x80, 0x01, 0xBF, 0x80, 0x0C, 0x00, 0x0D, 0xFC, 0x00, 0x60, 0x00,
+ 0x67, 0xF0, 0x07, 0x00, 0x02, 0x3F, 0x80, 0x30, 0x00, 0x30, 0xFE, 0x01,
+ 0x80, 0x01, 0x87, 0xF0, 0x0C, 0x00, 0x0C, 0x1F, 0xC0, 0xC0, 0x00, 0xC0,
+ 0xFE, 0x06, 0x00, 0x06, 0x07, 0xF8, 0x30, 0x00, 0x30, 0x1F, 0xC1, 0x80,
+ 0x01, 0x80, 0xFF, 0x18, 0x00, 0x18, 0x03, 0xF8, 0xC0, 0x00, 0xC0, 0x1F,
+ 0xC6, 0x00, 0x06, 0x00, 0x7F, 0x60, 0x00, 0x60, 0x03, 0xFB, 0x00, 0x03,
+ 0x00, 0x0F, 0xF8, 0x00, 0x18, 0x00, 0x7F, 0xC0, 0x01, 0xC0, 0x01, 0xFC,
+ 0x00, 0x0C, 0x00, 0x0F, 0xE0, 0x00, 0x60, 0x00, 0x3F, 0x00, 0x03, 0x00,
+ 0x01, 0xF0, 0x00, 0x38, 0x00, 0x07, 0x80, 0x01, 0xC0, 0x00, 0x3C, 0x00,
+ 0x3F, 0x00, 0x01, 0xE0, 0x03, 0xFF, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x30, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x7E,
+ 0x1F, 0x80, 0x01, 0xF0, 0x0F, 0x80, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00,
+ 0x1F, 0x80, 0xFE, 0x00, 0x3F, 0x03, 0xF8, 0x00, 0x7E, 0x07, 0xF0, 0x00,
+ 0xFE, 0x1F, 0xC0, 0x01, 0xFC, 0x7F, 0x80, 0x03, 0xF8, 0xFE, 0x00, 0x07,
+ 0xF3, 0xFC, 0x00, 0x1F, 0xE7, 0xF0, 0x00, 0x3F, 0xDF, 0xE0, 0x00, 0x7F,
+ 0xBF, 0xC0, 0x00, 0xFE, 0x7F, 0x80, 0x03, 0xFC, 0xFE, 0x00, 0x07, 0xFB,
+ 0xFC, 0x00, 0x0F, 0xF7, 0xF8, 0x00, 0x3F, 0xCF, 0xF0, 0x00, 0x7F, 0x9F,
+ 0xC0, 0x00, 0xFE, 0x3F, 0x80, 0x03, 0xFC, 0x7F, 0x00, 0x07, 0xF0, 0xFE,
+ 0x00, 0x1F, 0xC0, 0xFC, 0x00, 0x3F, 0x81, 0xF8, 0x00, 0xFE, 0x03, 0xF0,
+ 0x03, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x03, 0xE0, 0x1F, 0x00, 0x03, 0xE0,
+ 0xFC, 0x00, 0x03, 0xFF, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x01, 0xFF,
+ 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0xFE, 0x1F, 0xE0, 0x01, 0xFC,
+ 0x1F, 0xE0, 0x03, 0xF0, 0x1F, 0xC0, 0x0F, 0xE0, 0x3F, 0xC0, 0x1F, 0xC0,
+ 0x7F, 0x80, 0x3F, 0x80, 0xFF, 0x00, 0x7E, 0x01, 0xFE, 0x01, 0xFC, 0x03,
+ 0xFC, 0x03, 0xF8, 0x0F, 0xF8, 0x07, 0xF0, 0x1F, 0xE0, 0x0F, 0xC0, 0x7F,
+ 0x80, 0x3F, 0x81, 0xFE, 0x00, 0x7F, 0x07, 0xF8, 0x00, 0xFF, 0xFF, 0xC0,
+ 0x03, 0xFF, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00,
+ 0x1F, 0x80, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x01,
+ 0xFC, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x1F,
+ 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x01, 0xFC,
+ 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x7E, 0x1F, 0x80, 0x01,
+ 0xF0, 0x0F, 0x80, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x80, 0x1F, 0x80, 0xFE,
+ 0x00, 0x3F, 0x03, 0xF8, 0x00, 0x7E, 0x07, 0xF0, 0x00, 0xFE, 0x1F, 0xC0,
+ 0x01, 0xFC, 0x7F, 0x80, 0x03, 0xF8, 0xFE, 0x00, 0x07, 0xF3, 0xFC, 0x00,
+ 0x1F, 0xE7, 0xF8, 0x00, 0x3F, 0xDF, 0xE0, 0x00, 0x7F, 0xBF, 0xC0, 0x00,
+ 0xFF, 0x7F, 0x80, 0x01, 0xFC, 0xFE, 0x00, 0x07, 0xFB, 0xFC, 0x00, 0x0F,
+ 0xF7, 0xF8, 0x00, 0x1F, 0xCF, 0xF0, 0x00, 0x7F, 0x9F, 0xC0, 0x00, 0xFE,
+ 0x3F, 0x80, 0x01, 0xFC, 0x7F, 0x00, 0x07, 0xF0, 0xFE, 0x00, 0x0F, 0xE1,
+ 0xFC, 0x00, 0x3F, 0x81, 0xF8, 0x00, 0x7E, 0x03, 0xF0, 0x01, 0xF8, 0x03,
+ 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x1F, 0x80, 0x03, 0xE0, 0x7E, 0x00, 0x03,
+ 0xF3, 0xF0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x06,
+ 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xC0, 0x7F, 0xE0, 0x03, 0x03, 0xFF,
+ 0xF8, 0x1C, 0x0F, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0xC0, 0xE0, 0x3F,
+ 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xFF, 0xFF, 0xC0, 0x00, 0x7F,
+ 0xFF, 0xF8, 0x00, 0x3F, 0xC3, 0xFC, 0x00, 0x3F, 0x81, 0xFE, 0x00, 0x3F,
+ 0x80, 0xFF, 0x00, 0x7F, 0x80, 0xFF, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0x7F,
+ 0x00, 0xFF, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0xFF, 0x01, 0xFE, 0x00, 0xFE,
+ 0x01, 0xFE, 0x00, 0xFE, 0x03, 0xFC, 0x00, 0xFE, 0x07, 0xF8, 0x01, 0xFC,
+ 0x1F, 0xF0, 0x01, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFE, 0x00, 0x03, 0xFD,
+ 0xFE, 0x00, 0x03, 0xF8, 0xFF, 0x00, 0x03, 0xF8, 0xFF, 0x00, 0x03, 0xF8,
+ 0xFF, 0x00, 0x07, 0xF8, 0x7F, 0x80, 0x07, 0xF0, 0x7F, 0x80, 0x07, 0xF0,
+ 0x3F, 0x80, 0x07, 0xF0, 0x3F, 0xC0, 0x0F, 0xE0, 0x3F, 0xC0, 0x0F, 0xE0,
+ 0x1F, 0xC0, 0x0F, 0xE0, 0x1F, 0xE0, 0x1F, 0xE0, 0x1F, 0xE0, 0x1F, 0xE0,
+ 0x0F, 0xF0, 0x3F, 0xF0, 0x0F, 0xF8, 0xFF, 0xFC, 0x0F, 0xFE, 0x00, 0x1F,
+ 0x83, 0x00, 0x7F, 0xF7, 0x00, 0xF8, 0x7E, 0x01, 0xE0, 0x1E, 0x03, 0xC0,
+ 0x0E, 0x03, 0xC0, 0x0E, 0x07, 0xC0, 0x0E, 0x07, 0xC0, 0x04, 0x07, 0xC0,
+ 0x04, 0x07, 0xE0, 0x04, 0x07, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFC,
+ 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x00, 0xFF, 0xC0, 0x00, 0x7F,
+ 0xE0, 0x00, 0x3F, 0xE0, 0x00, 0x1F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x07,
+ 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xF8, 0x20, 0x00, 0xF8, 0x20, 0x00,
+ 0xF8, 0x20, 0x00, 0xF8, 0x70, 0x00, 0xF8, 0x70, 0x00, 0xF0, 0x78, 0x01,
+ 0xF0, 0x78, 0x03, 0xE0, 0x7E, 0x07, 0xC0, 0x47, 0xFF, 0x80, 0xC0, 0xFC,
+ 0x00, 0x3F, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFC, 0xFE, 0x3F, 0x8F, 0x9E,
+ 0x07, 0xF0, 0xF3, 0x81, 0xFC, 0x0E, 0x60, 0x3F, 0x81, 0x98, 0x07, 0xF0,
+ 0x13, 0x00, 0xFC, 0x02, 0x00, 0x3F, 0x80, 0x40, 0x07, 0xF0, 0x00, 0x00,
+ 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00,
+ 0x00, 0x1F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F,
+ 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00,
+ 0x03, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF8,
+ 0x00, 0x00, 0x7E, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF8, 0x00, 0x00,
+ 0xFF, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x7F, 0xFF,
+ 0x03, 0xFF, 0x0F, 0xFC, 0x00, 0xFC, 0x07, 0xF0, 0x00, 0x38, 0x07, 0xF0,
+ 0x00, 0x38, 0x07, 0xF0, 0x00, 0x30, 0x0F, 0xE0, 0x00, 0x30, 0x0F, 0xE0,
+ 0x00, 0x70, 0x0F, 0xE0, 0x00, 0x60, 0x0F, 0xE0, 0x00, 0x60, 0x1F, 0xC0,
+ 0x00, 0xE0, 0x1F, 0xC0, 0x00, 0xC0, 0x1F, 0xC0, 0x00, 0xC0, 0x3F, 0x80,
+ 0x00, 0xC0, 0x3F, 0x80, 0x01, 0x80, 0x3F, 0x80, 0x01, 0x80, 0x3F, 0x80,
+ 0x01, 0x80, 0x7F, 0x00, 0x01, 0x80, 0x7F, 0x00, 0x03, 0x00, 0x7F, 0x00,
+ 0x03, 0x00, 0x7E, 0x00, 0x03, 0x00, 0xFE, 0x00, 0x06, 0x00, 0xFE, 0x00,
+ 0x06, 0x00, 0xFC, 0x00, 0x06, 0x00, 0xFC, 0x00, 0x0E, 0x00, 0xFC, 0x00,
+ 0x0C, 0x00, 0xFC, 0x00, 0x1C, 0x00, 0xFC, 0x00, 0x18, 0x00, 0x7E, 0x00,
+ 0x38, 0x00, 0x7E, 0x00, 0x70, 0x00, 0x3F, 0x81, 0xE0, 0x00, 0x0F, 0xFF,
+ 0x80, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0xFC, 0x03, 0xFE, 0x7F, 0xE0,
+ 0x01, 0xF8, 0x7F, 0x80, 0x01, 0xC0, 0xFF, 0x00, 0x03, 0x80, 0xFE, 0x00,
+ 0x0E, 0x01, 0xFC, 0x00, 0x18, 0x03, 0xF8, 0x00, 0x70, 0x07, 0xF0, 0x00,
+ 0xC0, 0x0F, 0xF0, 0x03, 0x80, 0x1F, 0xE0, 0x0E, 0x00, 0x1F, 0xC0, 0x18,
+ 0x00, 0x3F, 0x80, 0x70, 0x00, 0x7F, 0x00, 0xC0, 0x00, 0xFE, 0x03, 0x00,
+ 0x01, 0xFC, 0x0E, 0x00, 0x03, 0xF8, 0x18, 0x00, 0x07, 0xF8, 0x60, 0x00,
+ 0x07, 0xF1, 0xC0, 0x00, 0x0F, 0xE3, 0x00, 0x00, 0x1F, 0xCC, 0x00, 0x00,
+ 0x3F, 0xB8, 0x00, 0x00, 0x7F, 0x60, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00,
+ 0xFF, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x07,
+ 0xE0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3C,
+ 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xFF, 0xF8,
+ 0xFF, 0xF0, 0xFF, 0x9F, 0xF8, 0x1F, 0xE0, 0x0F, 0x87, 0xF8, 0x07, 0xE0,
+ 0x07, 0x03, 0xF8, 0x03, 0xF0, 0x03, 0x80, 0xFE, 0x01, 0xF8, 0x01, 0x80,
+ 0x7F, 0x00, 0xFC, 0x00, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xC0, 0x1F, 0xC0,
+ 0x7F, 0x80, 0x60, 0x0F, 0xE0, 0x3F, 0xC0, 0x60, 0x07, 0xF0, 0x37, 0xE0,
+ 0x30, 0x03, 0xF8, 0x1B, 0xF0, 0x30, 0x00, 0xFC, 0x19, 0xF8, 0x18, 0x00,
+ 0x7E, 0x0C, 0xFE, 0x18, 0x00, 0x3F, 0x84, 0x7F, 0x0C, 0x00, 0x1F, 0xC6,
+ 0x3F, 0x8C, 0x00, 0x0F, 0xE2, 0x1F, 0xC6, 0x00, 0x07, 0xF3, 0x07, 0xE6,
+ 0x00, 0x03, 0xF9, 0x83, 0xF3, 0x00, 0x01, 0xFD, 0x81, 0xFB, 0x00, 0x00,
+ 0x7E, 0xC0, 0xFD, 0x80, 0x00, 0x3F, 0xC0, 0x7F, 0x80, 0x00, 0x1F, 0xE0,
+ 0x3F, 0xC0, 0x00, 0x0F, 0xE0, 0x1F, 0xC0, 0x00, 0x07, 0xF0, 0x0F, 0xE0,
+ 0x00, 0x03, 0xF0, 0x07, 0xE0, 0x00, 0x01, 0xF8, 0x01, 0xF0, 0x00, 0x00,
+ 0x78, 0x00, 0xF0, 0x00, 0x00, 0x3C, 0x00, 0x78, 0x00, 0x00, 0x1C, 0x00,
+ 0x38, 0x00, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x00, 0x06, 0x00, 0x0C, 0x00,
+ 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x03, 0xFF, 0xF0, 0xFF, 0xC0, 0x3F,
+ 0xE0, 0x0F, 0xC0, 0x03, 0xF8, 0x01, 0xE0, 0x00, 0xFE, 0x00, 0xE0, 0x00,
+ 0x3F, 0x80, 0x70, 0x00, 0x07, 0xE0, 0x18, 0x00, 0x01, 0xFC, 0x0C, 0x00,
+ 0x00, 0x7F, 0x06, 0x00, 0x00, 0x0F, 0xC3, 0x00, 0x00, 0x03, 0xF9, 0x80,
+ 0x00, 0x00, 0xFE, 0xC0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x07, 0xF8,
+ 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x0F,
+ 0xC0, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00,
+ 0xFF, 0x80, 0x00, 0x00, 0x77, 0xF0, 0x00, 0x00, 0x39, 0xFC, 0x00, 0x00,
+ 0x1C, 0x3F, 0x00, 0x00, 0x06, 0x0F, 0xE0, 0x00, 0x03, 0x03, 0xF8, 0x00,
+ 0x01, 0x80, 0x7E, 0x00, 0x00, 0xE0, 0x1F, 0xC0, 0x00, 0x70, 0x07, 0xF0,
+ 0x00, 0x38, 0x01, 0xFC, 0x00, 0x1E, 0x00, 0x7F, 0x80, 0x1F, 0xC0, 0x1F,
+ 0xF0, 0x0F, 0xFC, 0x3F, 0xFF, 0x80, 0xFF, 0xF8, 0x3F, 0xF3, 0xFC, 0x00,
+ 0xFC, 0x1F, 0xC0, 0x07, 0x81, 0xFC, 0x00, 0x70, 0x0F, 0xC0, 0x0E, 0x00,
+ 0xFE, 0x00, 0xC0, 0x0F, 0xE0, 0x1C, 0x00, 0x7E, 0x03, 0x80, 0x07, 0xF0,
+ 0x30, 0x00, 0x7F, 0x06, 0x00, 0x03, 0xF0, 0xE0, 0x00, 0x3F, 0x8C, 0x00,
+ 0x03, 0xF9, 0x80, 0x00, 0x1F, 0xB0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x1F,
+ 0xE0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x01, 0xFC, 0x00,
+ 0x00, 0x1F, 0x80, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x03,
+ 0xF8, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x7F, 0x00,
+ 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x01,
+ 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF0, 0x3F,
+ 0xFF, 0xFF, 0x03, 0xF8, 0x0F, 0xF0, 0x7C, 0x01, 0xFE, 0x07, 0x80, 0x3F,
+ 0xC0, 0x70, 0x03, 0xF8, 0x06, 0x00, 0x7F, 0x80, 0xC0, 0x0F, 0xF0, 0x08,
+ 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x7F,
+ 0x80, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00,
+ 0x03, 0xFC, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xFF,
+ 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00,
+ 0x07, 0xF8, 0x00, 0xC0, 0xFF, 0x00, 0x0C, 0x1F, 0xE0, 0x01, 0x81, 0xFE,
+ 0x00, 0x38, 0x3F, 0xC0, 0x07, 0x87, 0xF8, 0x01, 0xF0, 0xFF, 0x00, 0xFF,
+ 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xE0, 0x0F,
+ 0xFC, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E,
+ 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF0,
+ 0x00, 0x1E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1E, 0x00, 0x03, 0xC0,
+ 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x1F, 0x00,
+ 0x03, 0xE0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00,
+ 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xE0, 0x00,
+ 0x3C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xFE, 0x01,
+ 0xFF, 0xC0, 0x00, 0xF0, 0x07, 0x80, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x1C,
+ 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0,
+ 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x07, 0x00, 0x3C, 0x01, 0xE0, 0x0F, 0x00,
+ 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x01,
+ 0xC0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x0F, 0x00, 0x78, 0x00, 0x7F, 0xE0,
+ 0x0F, 0xFC, 0x00, 0x0F, 0x80, 0x01, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80,
+ 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00,
+ 0x07, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF0, 0x00,
+ 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1E, 0x00, 0x07, 0xC0, 0x00,
+ 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03,
+ 0xE0, 0x00, 0x78, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F,
+ 0x00, 0x01, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xE0, 0x07, 0xFC,
+ 0x01, 0xFF, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x7F, 0x00,
+ 0x03, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xEF, 0x00, 0x1E, 0x78, 0x00, 0xF1,
+ 0xE0, 0x0F, 0x0F, 0x00, 0x78, 0x3C, 0x07, 0xC1, 0xE0, 0x3C, 0x07, 0x83,
+ 0xE0, 0x3C, 0x1E, 0x00, 0xF1, 0xF0, 0x07, 0x8F, 0x00, 0x1E, 0xF8, 0x00,
+ 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0x3E,
+ 0x0F, 0x83, 0xF0, 0x3E, 0x07, 0x80, 0xF0, 0x0E, 0x01, 0xC0, 0x00, 0x3C,
+ 0x0C, 0x03, 0xF9, 0xF0, 0x1F, 0x3F, 0x80, 0xF8, 0x7E, 0x07, 0xC1, 0xF8,
+ 0x3F, 0x07, 0xC0, 0xF8, 0x1F, 0x07, 0xE0, 0x7C, 0x3F, 0x01, 0xF0, 0xFC,
+ 0x0F, 0x87, 0xE0, 0x3E, 0x1F, 0x80, 0xF8, 0x7E, 0x03, 0xC3, 0xF8, 0x1F,
+ 0x0F, 0xC0, 0x7C, 0x3F, 0x03, 0xF0, 0xFC, 0x0F, 0x83, 0xF0, 0x7E, 0x3F,
+ 0xC2, 0xF8, 0xBF, 0x9B, 0xE4, 0x7F, 0xCF, 0xE0, 0xFE, 0x3F, 0x01, 0xE0,
+ 0x78, 0x00, 0x00, 0x7C, 0x00, 0x3F, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0x7E,
+ 0x00, 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00,
+ 0x03, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x3E, 0x01, 0xF9, 0xFC, 0x07,
+ 0xEF, 0xF8, 0x1F, 0x47, 0xF0, 0x7E, 0x0F, 0xC3, 0xF8, 0x3F, 0x0F, 0xC0,
+ 0xFC, 0x3F, 0x03, 0xF1, 0xF8, 0x0F, 0xC7, 0xE0, 0x3F, 0x1F, 0x01, 0xF8,
+ 0x7C, 0x07, 0xE3, 0xF0, 0x1F, 0x8F, 0xC0, 0xFC, 0x3E, 0x03, 0xF1, 0xF8,
+ 0x0F, 0x87, 0xE0, 0x7C, 0x1F, 0x03, 0xE0, 0xFC, 0x0F, 0x03, 0xF0, 0x78,
+ 0x0F, 0xC7, 0xC0, 0x1F, 0xFE, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x3F, 0x00,
+ 0x3F, 0xE0, 0x1E, 0x3C, 0x0F, 0x0F, 0x07, 0x87, 0xC3, 0xE1, 0xF1, 0xF0,
+ 0x38, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00,
+ 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x03, 0x3F,
+ 0x00, 0xCF, 0xE0, 0x61, 0xFC, 0x70, 0x3F, 0xF8, 0x07, 0xFC, 0x00, 0xFC,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x7F, 0xE0, 0x00,
+ 0x07, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0xFC, 0x00,
+ 0x00, 0x7C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x80,
+ 0x07, 0x9F, 0x80, 0x0F, 0xFF, 0xC0, 0x0F, 0x9F, 0xE0, 0x0F, 0x87, 0xF0,
+ 0x0F, 0x83, 0xF0, 0x0F, 0xC1, 0xF8, 0x07, 0xC0, 0xFC, 0x07, 0xE0, 0x7C,
+ 0x07, 0xE0, 0x7E, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x1F, 0x81, 0xF8, 0x0F,
+ 0x80, 0xFC, 0x0F, 0xC0, 0xFE, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x3F, 0x03,
+ 0xF0, 0x1F, 0x83, 0xF8, 0x0F, 0xC1, 0xF8, 0xC7, 0xE1, 0xFC, 0xC3, 0xF9,
+ 0xBE, 0xC0, 0xFF, 0x9F, 0xC0, 0x7F, 0x8F, 0xC0, 0x0F, 0x83, 0xC0, 0x00,
+ 0x00, 0x3F, 0x00, 0x3F, 0xE0, 0x1E, 0x3C, 0x0F, 0x0F, 0x07, 0x83, 0xC3,
+ 0xE0, 0xF1, 0xF0, 0x3C, 0xFC, 0x1E, 0x3F, 0x0F, 0x9F, 0x83, 0xC7, 0xE3,
+ 0xE1, 0xFB, 0xE0, 0xFF, 0xE0, 0x3F, 0xC0, 0x0F, 0xC0, 0x03, 0xF0, 0x00,
+ 0xFC, 0x03, 0x3F, 0x01, 0x8F, 0xC0, 0xC1, 0xF8, 0x70, 0x7F, 0xF8, 0x07,
+ 0xFC, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x03, 0xCE, 0x00,
+ 0x00, 0x78, 0xF0, 0x00, 0x0F, 0x8F, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x1F,
+ 0x06, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x03, 0xE0, 0x00,
+ 0x00, 0x3E, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x3F,
+ 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0xF8, 0x00,
+ 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x01,
+ 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x3F, 0x00,
+ 0x00, 0x03, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00,
+ 0x7E, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0,
+ 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00,
+ 0x0F, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x06, 0x1F, 0x00, 0x00, 0xF1, 0xE0,
+ 0x00, 0x0F, 0x3E, 0x00, 0x00, 0xF3, 0xC0, 0x00, 0x07, 0xF8, 0x00, 0x00,
+ 0x3E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x7F, 0xF0, 0x00, 0x7E,
+ 0x3F, 0xE0, 0x7C, 0x0F, 0xF0, 0x7E, 0x07, 0xC0, 0x7E, 0x03, 0xE0, 0x3F,
+ 0x01, 0xF0, 0x1F, 0x01, 0xF8, 0x0F, 0x80, 0xFC, 0x07, 0xC0, 0xFC, 0x01,
+ 0xE0, 0xFC, 0x00, 0x78, 0xFC, 0x00, 0x1F, 0xFC, 0x00, 0x0F, 0xF0, 0x00,
+ 0x1C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xF8, 0x00,
+ 0x07, 0xFF, 0x80, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00, 0x77, 0xFF,
+ 0x80, 0xF0, 0x7F, 0xC0, 0xF0, 0x07, 0xE0, 0xF0, 0x01, 0xF0, 0x78, 0x00,
+ 0xF8, 0x3C, 0x00, 0x78, 0x1F, 0x00, 0x7C, 0x07, 0xC0, 0x78, 0x01, 0xFF,
+ 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x1F,
+ 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x7E,
+ 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0xC0,
+ 0x00, 0x1F, 0x87, 0xC0, 0x3E, 0x1F, 0xC0, 0xFC, 0x7F, 0x81, 0xF9, 0x9F,
+ 0x03, 0xE6, 0x3E, 0x07, 0xD8, 0x7C, 0x1F, 0xA0, 0xF8, 0x3F, 0x83, 0xF0,
+ 0x7F, 0x07, 0xE0, 0xFC, 0x0F, 0xC3, 0xF8, 0x3F, 0x07, 0xE0, 0x7E, 0x0F,
+ 0xC0, 0xFC, 0x3F, 0x03, 0xF0, 0x7E, 0x07, 0xE0, 0xFC, 0x0F, 0xC1, 0xF0,
+ 0x3F, 0x17, 0xE0, 0x7E, 0x6F, 0xC0, 0xF9, 0x9F, 0x01, 0xF6, 0x3E, 0x03,
+ 0xF8, 0xFC, 0x07, 0xF1, 0xC0, 0x07, 0x80, 0x01, 0xE0, 0x3F, 0x03, 0xF0,
+ 0x3F, 0x03, 0xF0, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC7,
+ 0xFC, 0x1F, 0xC0, 0xF8, 0x0F, 0x81, 0xF8, 0x1F, 0x81, 0xF0, 0x1F, 0x03,
+ 0xF0, 0x3E, 0x03, 0xE0, 0x3E, 0x07, 0xE0, 0x7C, 0x07, 0xC0, 0xFC, 0x2F,
+ 0x84, 0xF8, 0xCF, 0x98, 0xFF, 0x0F, 0xE0, 0x78, 0x00, 0x00, 0x00, 0x78,
+ 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00,
+ 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0xFC, 0x00, 0x1F, 0xF0, 0x00, 0x1F, 0xC0,
+ 0x00, 0x3E, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00,
+ 0x7C, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xF8,
+ 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x01, 0xF0, 0x00,
+ 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xE0, 0x00, 0x1F,
+ 0x80, 0x00, 0x7E, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x3F, 0x00,
+ 0x60, 0xF8, 0x03, 0xC3, 0xC0, 0x0F, 0x1F, 0x00, 0x3C, 0xF8, 0x00, 0x7F,
+ 0xC0, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xFC, 0x00, 0x07,
+ 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x01,
+ 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x03,
+ 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xE3, 0xFF, 0x03, 0xE0, 0xFC, 0x07,
+ 0xE0, 0xF0, 0x07, 0xE0, 0xE0, 0x07, 0xC1, 0xC0, 0x0F, 0xC3, 0x80, 0x0F,
+ 0xC7, 0x00, 0x0F, 0x8E, 0x00, 0x0F, 0xBE, 0x00, 0x1F, 0xFE, 0x00, 0x1F,
+ 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0x3E, 0x00, 0x3F, 0x3F, 0x00, 0x3F,
+ 0x1F, 0x00, 0x3E, 0x1F, 0x00, 0x7E, 0x1F, 0x04, 0x7E, 0x1F, 0x8C, 0x7E,
+ 0x0F, 0x98, 0x7C, 0x0F, 0xF0, 0xFC, 0x07, 0xE0, 0xE0, 0x03, 0xC0, 0x00,
+ 0x08, 0x0F, 0xC7, 0xFE, 0x07, 0xF0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7C,
+ 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0x80, 0x7C, 0x07, 0xE0, 0x3E, 0x01,
+ 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xC0, 0x3E, 0x03, 0xF0, 0x1F, 0x80, 0xF8,
+ 0x0F, 0xC0, 0x7E, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x8F, 0x8C, 0x7C, 0x43,
+ 0xE4, 0x1F, 0xE0, 0xFE, 0x03, 0xC0, 0x00, 0x00, 0x70, 0x78, 0x0F, 0x83,
+ 0xFE, 0x3F, 0x87, 0xF8, 0x1F, 0xCF, 0xF1, 0xFF, 0x03, 0xF1, 0x3E, 0x73,
+ 0xE0, 0x7E, 0x47, 0xD8, 0x7C, 0x0F, 0xD0, 0xFB, 0x1F, 0x81, 0xF4, 0x3E,
+ 0xC3, 0xF0, 0x3E, 0x87, 0xF0, 0x7C, 0x0F, 0xE0, 0xFE, 0x1F, 0x81, 0xF4,
+ 0x1F, 0x83, 0xF0, 0x3F, 0x07, 0xE0, 0x7C, 0x07, 0xE0, 0xFC, 0x1F, 0x81,
+ 0xF8, 0x1F, 0x83, 0xF0, 0x3F, 0x07, 0xE0, 0x7C, 0x07, 0xE0, 0xFC, 0x0F,
+ 0x80, 0xF8, 0x1F, 0x03, 0xF0, 0x3F, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0xFC,
+ 0x0F, 0x88, 0xF8, 0x1F, 0x81, 0xF3, 0x3F, 0x03, 0xE0, 0x3E, 0x47, 0xE0,
+ 0xFC, 0x07, 0xF0, 0xFC, 0x1F, 0x80, 0xFE, 0x18, 0x00, 0x00, 0x0F, 0x00,
+ 0x00, 0x70, 0xF8, 0x7F, 0xC3, 0xF8, 0x1F, 0x8F, 0xF0, 0x3F, 0x33, 0xE0,
+ 0x7C, 0x87, 0xC1, 0xF9, 0x0F, 0x83, 0xF4, 0x1F, 0x07, 0xD0, 0x3E, 0x0F,
+ 0xE0, 0xFC, 0x3F, 0x81, 0xF8, 0x7F, 0x03, 0xE0, 0xFC, 0x0F, 0xC1, 0xF8,
+ 0x1F, 0x87, 0xE0, 0x3E, 0x0F, 0xC0, 0xFC, 0x1F, 0x81, 0xF0, 0x3E, 0x03,
+ 0xE0, 0xFC, 0x0F, 0xC9, 0xF8, 0x1F, 0x33, 0xE0, 0x3E, 0x47, 0xC0, 0x7F,
+ 0x1F, 0x80, 0xFE, 0x38, 0x00, 0xF0, 0x00, 0x00, 0x3F, 0x00, 0x0E, 0x38,
+ 0x03, 0xC1, 0xC0, 0x78, 0x1E, 0x0F, 0x81, 0xF0, 0xF0, 0x1F, 0x1F, 0x01,
+ 0xF3, 0xE0, 0x1F, 0x3E, 0x03, 0xF7, 0xC0, 0x3F, 0x7C, 0x03, 0xF7, 0xC0,
+ 0x3E, 0xFC, 0x03, 0xEF, 0xC0, 0x7E, 0xF8, 0x07, 0xCF, 0x80, 0x7C, 0xF8,
+ 0x0F, 0x8F, 0x80, 0xF8, 0xF8, 0x1F, 0x07, 0x81, 0xE0, 0x78, 0x3C, 0x03,
+ 0xC7, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x0F, 0x1F, 0x00, 0x3F, 0xE7, 0xF8,
+ 0x01, 0xF9, 0xFF, 0x00, 0x1F, 0x47, 0xF0, 0x07, 0xF0, 0x7E, 0x00, 0xFE,
+ 0x0F, 0xC0, 0x1F, 0x81, 0xF8, 0x03, 0xF0, 0x3F, 0x00, 0xFC, 0x07, 0xE0,
+ 0x1F, 0x81, 0xFC, 0x03, 0xE0, 0x3F, 0x00, 0x7C, 0x07, 0xE0, 0x1F, 0x81,
+ 0xFC, 0x03, 0xF0, 0x3F, 0x00, 0x7C, 0x07, 0xE0, 0x0F, 0x81, 0xF8, 0x03,
+ 0xF0, 0x3E, 0x00, 0x7E, 0x0F, 0xC0, 0x0F, 0x81, 0xF0, 0x01, 0xF0, 0x7C,
+ 0x00, 0x7F, 0x1F, 0x00, 0x0F, 0xFF, 0xC0, 0x01, 0xF3, 0xE0, 0x00, 0x3E,
+ 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3E, 0x00, 0x00,
+ 0x0F, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0xFC,
+ 0x00, 0x00, 0x00, 0x3E, 0x00, 0x03, 0xF9, 0xF0, 0x1F, 0x1F, 0xC0, 0xF8,
+ 0x7E, 0x07, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xF8, 0x1F, 0x87, 0xE0, 0x7C,
+ 0x3F, 0x01, 0xF0, 0xFC, 0x0F, 0xC7, 0xE0, 0x3E, 0x1F, 0x80, 0xF8, 0x7E,
+ 0x07, 0xE3, 0xF0, 0x1F, 0x8F, 0xC0, 0x7C, 0x3F, 0x03, 0xF0, 0xFC, 0x0F,
+ 0xC3, 0xF0, 0x7E, 0x0F, 0xC3, 0xF8, 0x3F, 0x9B, 0xE0, 0x7F, 0xDF, 0x01,
+ 0xFE, 0x7C, 0x01, 0xF1, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3E, 0x00, 0x00,
+ 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xF8,
+ 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x71, 0xE1, 0xFF, 0x3E, 0x07, 0xE7, 0xF0,
+ 0x7E, 0xFF, 0x07, 0xE9, 0xE0, 0x7D, 0x0E, 0x07, 0xD0, 0x00, 0xFE, 0x00,
+ 0x0F, 0xE0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0x80,
+ 0x01, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF0,
+ 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xC0, 0x00, 0x01,
+ 0xF1, 0x07, 0xFF, 0x0F, 0x0F, 0x0E, 0x07, 0x1E, 0x06, 0x1E, 0x06, 0x1F,
+ 0x02, 0x1F, 0x02, 0x1F, 0x80, 0x0F, 0xC0, 0x0F, 0xE0, 0x0F, 0xF0, 0x07,
+ 0xF8, 0x03, 0xF8, 0x01, 0xFC, 0x00, 0xFC, 0x40, 0x7C, 0x40, 0x7C, 0x60,
+ 0x3C, 0xE0, 0x38, 0xF0, 0x38, 0xF8, 0xF0, 0xDF, 0xC0, 0x00, 0x20, 0x03,
+ 0x00, 0x38, 0x03, 0x80, 0x3C, 0x03, 0xE0, 0x7F, 0x07, 0xFF, 0x3F, 0xF8,
+ 0x7C, 0x07, 0xE0, 0x3F, 0x01, 0xF0, 0x0F, 0x80, 0xFC, 0x07, 0xC0, 0x3E,
+ 0x03, 0xF0, 0x1F, 0x80, 0xF8, 0x07, 0xC0, 0x7E, 0x03, 0xF1, 0x1F, 0x08,
+ 0xF8, 0x87, 0xC8, 0x3F, 0xC1, 0xFC, 0x07, 0x80, 0x00, 0x00, 0x40, 0x00,
+ 0x1F, 0x03, 0xF7, 0xF8, 0x0F, 0x87, 0xE0, 0x3E, 0x1F, 0x81, 0xF8, 0x7E,
+ 0x07, 0xC1, 0xF0, 0x1F, 0x07, 0xC0, 0xFC, 0x3F, 0x03, 0xE0, 0xF8, 0x0F,
+ 0x83, 0xE0, 0x7E, 0x0F, 0x81, 0xF8, 0x7E, 0x0F, 0xC1, 0xF0, 0x3F, 0x07,
+ 0xC1, 0xFC, 0x1F, 0x07, 0xE0, 0xF8, 0x2F, 0x83, 0xE1, 0x3C, 0x6F, 0x8D,
+ 0xF1, 0x3E, 0x67, 0xC8, 0xFF, 0x1F, 0xE3, 0xF8, 0x7F, 0x07, 0xC0, 0xF0,
+ 0x00, 0x06, 0x07, 0x1F, 0x07, 0xBF, 0x83, 0xE7, 0xC1, 0xF3, 0xE0, 0xF9,
+ 0xF8, 0x3C, 0x7C, 0x0C, 0x3E, 0x06, 0x1F, 0x03, 0x0F, 0x83, 0x07, 0xC1,
+ 0x83, 0xE1, 0x81, 0xF1, 0x80, 0xF9, 0x80, 0x7C, 0xC0, 0x3E, 0xC0, 0x1F,
+ 0xC0, 0x0F, 0xC0, 0x07, 0xC0, 0x03, 0xC0, 0x01, 0xC0, 0x00, 0xC0, 0x00,
+ 0x40, 0x00, 0x06, 0x01, 0x81, 0xC7, 0xC0, 0x30, 0x7F, 0xF8, 0x0E, 0x0F,
+ 0x9F, 0x01, 0xC1, 0xF3, 0xE0, 0x78, 0x3E, 0x7C, 0x1F, 0x03, 0xCF, 0xC3,
+ 0xE0, 0x30, 0xF8, 0xFC, 0x06, 0x1F, 0x1F, 0xC0, 0x83, 0xE7, 0xF8, 0x30,
+ 0x7C, 0xFF, 0x04, 0x0F, 0xB7, 0xE1, 0x81, 0xF6, 0xFC, 0x60, 0x3F, 0x8F,
+ 0x98, 0x07, 0xE1, 0xF3, 0x00, 0xFC, 0x3E, 0xC0, 0x1F, 0x07, 0xF0, 0x03,
+ 0xE0, 0xFC, 0x00, 0x78, 0x1F, 0x80, 0x0F, 0x03, 0xE0, 0x01, 0xC0, 0x78,
+ 0x00, 0x30, 0x0E, 0x00, 0x06, 0x01, 0x80, 0x00, 0x00, 0xF0, 0x1E, 0x0F,
+ 0xF0, 0x3E, 0x01, 0xF8, 0x7F, 0x01, 0xF8, 0xFF, 0x00, 0xF9, 0x8E, 0x00,
+ 0xFB, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7C, 0x00, 0x00,
+ 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00,
+ 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xBF, 0x00, 0x01,
+ 0xBF, 0x08, 0x73, 0x1F, 0x18, 0xFF, 0x1F, 0x30, 0xFE, 0x1F, 0xE0, 0xFC,
+ 0x0F, 0xC0, 0x78, 0x07, 0x80, 0x00, 0x30, 0x1C, 0x0F, 0xF0, 0x7C, 0x07,
+ 0xE0, 0xF8, 0x0F, 0xC1, 0xF0, 0x0F, 0xC1, 0xE0, 0x1F, 0x81, 0xC0, 0x3F,
+ 0x03, 0x00, 0x3E, 0x06, 0x00, 0x7E, 0x08, 0x00, 0xFC, 0x30, 0x01, 0xF8,
+ 0x60, 0x01, 0xF1, 0x80, 0x03, 0xE3, 0x00, 0x07, 0xCC, 0x00, 0x0F, 0xD8,
+ 0x00, 0x1F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0x7E, 0x00,
+ 0x00, 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x00, 0x00,
+ 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x01, 0xC1, 0x80, 0x07, 0xE6,
+ 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x07,
+ 0xFF, 0xE1, 0xFF, 0xF8, 0x3F, 0xFF, 0x07, 0xFF, 0xC0, 0x80, 0x70, 0x30,
+ 0x1C, 0x04, 0x07, 0x00, 0x00, 0xC0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03,
+ 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0xC0, 0x00, 0x30,
+ 0x00, 0x0C, 0x00, 0x03, 0xE0, 0x00, 0xFE, 0x00, 0x1F, 0xE0, 0xC7, 0xFC,
+ 0x3D, 0xCF, 0xC7, 0x90, 0xF8, 0xF0, 0x07, 0x9C, 0x00, 0x3E, 0x00, 0x00,
+ 0x01, 0xF0, 0x00, 0xFC, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00,
+ 0x07, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80,
+ 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x03, 0xE0,
+ 0x00, 0x3E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x0F, 0xC0,
+ 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F,
+ 0x80, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x03,
+ 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00,
+ 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7E, 0x00,
+ 0x03, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00,
+ 0x3E, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0,
+ 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C,
+ 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F,
+ 0x80, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x00,
+ 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x03, 0xE0, 0x00,
+ 0x7C, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00,
+ 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00,
+ 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x0F, 0x80,
+ 0x03, 0xF0, 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x03, 0xFF, 0x01, 0x3F,
+ 0xFE, 0x1D, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0x00, 0x1F, 0xF0, 0x00, 0x1F,
+ 0x00 };
+
+const GFXglyph FreeSerifBoldItalic24pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 12, 0, 1 }, // 0x20 ' '
+ { 0, 15, 33, 18, 3, -31 }, // 0x21 '!'
+ { 62, 19, 13, 26, 6, -31 }, // 0x22 '"'
+ { 93, 27, 33, 23, -2, -32 }, // 0x23 '#'
+ { 205, 24, 39, 24, -1, -33 }, // 0x24 '$'
+ { 322, 35, 32, 39, 2, -30 }, // 0x25 '%'
+ { 462, 33, 33, 37, 0, -31 }, // 0x26 '&'
+ { 599, 7, 13, 13, 6, -31 }, // 0x27 '''
+ { 611, 14, 41, 16, 1, -31 }, // 0x28 '('
+ { 683, 14, 41, 16, -2, -31 }, // 0x29 ')'
+ { 755, 19, 20, 23, 3, -31 }, // 0x2A '*'
+ { 803, 22, 23, 27, 2, -22 }, // 0x2B '+'
+ { 867, 10, 15, 12, -3, -5 }, // 0x2C ','
+ { 886, 12, 5, 16, 0, -12 }, // 0x2D '-'
+ { 894, 8, 7, 12, 0, -5 }, // 0x2E '.'
+ { 901, 19, 33, 16, 0, -31 }, // 0x2F '/'
+ { 980, 22, 33, 23, 1, -31 }, // 0x30 '0'
+ { 1071, 20, 32, 23, 0, -31 }, // 0x31 '1'
+ { 1151, 22, 32, 23, 1, -31 }, // 0x32 '2'
+ { 1239, 22, 33, 24, 0, -31 }, // 0x33 '3'
+ { 1330, 25, 32, 23, 0, -31 }, // 0x34 '4'
+ { 1430, 24, 32, 24, 0, -30 }, // 0x35 '5'
+ { 1526, 23, 32, 24, 1, -30 }, // 0x36 '6'
+ { 1618, 23, 31, 23, 3, -30 }, // 0x37 '7'
+ { 1708, 21, 33, 23, 1, -31 }, // 0x38 '8'
+ { 1795, 23, 33, 23, 0, -31 }, // 0x39 '9'
+ { 1890, 13, 22, 12, 0, -20 }, // 0x3A ':'
+ { 1926, 15, 30, 12, -2, -20 }, // 0x3B ';'
+ { 1983, 24, 25, 27, 1, -23 }, // 0x3C '<'
+ { 2058, 24, 14, 27, 3, -18 }, // 0x3D '='
+ { 2100, 24, 25, 27, 3, -23 }, // 0x3E '>'
+ { 2175, 18, 33, 24, 4, -31 }, // 0x3F '?'
+ { 2250, 33, 33, 39, 3, -31 }, // 0x40 '@'
+ { 2387, 31, 32, 33, 0, -31 }, // 0x41 'A'
+ { 2511, 31, 31, 30, 0, -30 }, // 0x42 'B'
+ { 2632, 29, 33, 29, 2, -31 }, // 0x43 'C'
+ { 2752, 35, 31, 34, 0, -30 }, // 0x44 'D'
+ { 2888, 32, 31, 30, 0, -30 }, // 0x45 'E'
+ { 3012, 31, 31, 29, 0, -30 }, // 0x46 'F'
+ { 3133, 32, 33, 33, 2, -31 }, // 0x47 'G'
+ { 3265, 39, 31, 35, 0, -30 }, // 0x48 'H'
+ { 3417, 21, 31, 18, 0, -30 }, // 0x49 'I'
+ { 3499, 27, 36, 23, 0, -30 }, // 0x4A 'J'
+ { 3621, 34, 31, 31, 0, -30 }, // 0x4B 'K'
+ { 3753, 29, 31, 29, 0, -30 }, // 0x4C 'L'
+ { 3866, 44, 32, 41, 0, -30 }, // 0x4D 'M'
+ { 4042, 37, 32, 33, 0, -30 }, // 0x4E 'N'
+ { 4190, 31, 33, 32, 2, -31 }, // 0x4F 'O'
+ { 4318, 31, 31, 28, 0, -30 }, // 0x50 'P'
+ { 4439, 31, 42, 32, 2, -31 }, // 0x51 'Q'
+ { 4602, 32, 31, 31, 0, -30 }, // 0x52 'R'
+ { 4726, 24, 33, 24, 0, -31 }, // 0x53 'S'
+ { 4825, 27, 31, 28, 4, -30 }, // 0x54 'T'
+ { 4930, 32, 32, 34, 5, -30 }, // 0x55 'U'
+ { 5058, 31, 32, 33, 6, -30 }, // 0x56 'V'
+ { 5182, 41, 32, 44, 6, -30 }, // 0x57 'W'
+ { 5346, 34, 31, 33, 0, -30 }, // 0x58 'X'
+ { 5478, 28, 31, 30, 6, -30 }, // 0x59 'Y'
+ { 5587, 28, 31, 26, 0, -30 }, // 0x5A 'Z'
+ { 5696, 19, 38, 16, -2, -30 }, // 0x5B '['
+ { 5787, 13, 33, 19, 6, -31 }, // 0x5C '\'
+ { 5841, 19, 38, 16, -3, -30 }, // 0x5D ']'
+ { 5932, 21, 17, 27, 3, -30 }, // 0x5E '^'
+ { 5977, 24, 3, 23, 0, 5 }, // 0x5F '_'
+ { 5986, 10, 9, 16, 4, -32 }, // 0x60 '`'
+ { 5998, 22, 23, 24, 1, -21 }, // 0x61 'a'
+ { 6062, 22, 33, 23, 1, -31 }, // 0x62 'b'
+ { 6153, 18, 23, 20, 1, -21 }, // 0x63 'c'
+ { 6205, 25, 34, 24, 1, -32 }, // 0x64 'd'
+ { 6312, 18, 23, 20, 1, -21 }, // 0x65 'e'
+ { 6364, 28, 41, 23, -4, -31 }, // 0x66 'f'
+ { 6508, 25, 31, 23, -1, -21 }, // 0x67 'g'
+ { 6605, 23, 34, 26, 1, -32 }, // 0x68 'h'
+ { 6703, 12, 33, 14, 2, -31 }, // 0x69 'i'
+ { 6753, 22, 42, 16, -4, -31 }, // 0x6A 'j'
+ { 6869, 24, 34, 24, 1, -32 }, // 0x6B 'k'
+ { 6971, 13, 34, 14, 2, -32 }, // 0x6C 'l'
+ { 7027, 35, 23, 36, 0, -21 }, // 0x6D 'm'
+ { 7128, 23, 23, 25, 0, -21 }, // 0x6E 'n'
+ { 7195, 20, 23, 22, 1, -21 }, // 0x6F 'o'
+ { 7253, 27, 31, 23, -4, -21 }, // 0x70 'p'
+ { 7358, 22, 31, 23, 1, -21 }, // 0x71 'q'
+ { 7444, 20, 22, 19, 0, -21 }, // 0x72 'r'
+ { 7499, 16, 23, 17, 0, -21 }, // 0x73 's'
+ { 7545, 13, 29, 13, 2, -27 }, // 0x74 't'
+ { 7593, 22, 23, 25, 2, -21 }, // 0x75 'u'
+ { 7657, 17, 23, 21, 3, -21 }, // 0x76 'v'
+ { 7706, 27, 23, 31, 3, -21 }, // 0x77 'w'
+ { 7784, 24, 23, 22, -1, -21 }, // 0x78 'x'
+ { 7853, 23, 31, 20, -3, -21 }, // 0x79 'y'
+ { 7943, 19, 25, 19, 0, -20 }, // 0x7A 'z'
+ { 8003, 20, 41, 16, 0, -31 }, // 0x7B '{'
+ { 8106, 4, 33, 13, 5, -31 }, // 0x7C '|'
+ { 8123, 20, 41, 16, -6, -31 }, // 0x7D '}'
+ { 8226, 21, 7, 27, 3, -14 } }; // 0x7E '~'
+
+const GFXfont FreeSerifBoldItalic24pt7b PROGMEM = {
+ (uint8_t *)FreeSerifBoldItalic24pt7bBitmaps,
+ (GFXglyph *)FreeSerifBoldItalic24pt7bGlyphs,
+ 0x20, 0x7E, 56 };
+
+// Approx. 8917 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBoldItalic9pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBoldItalic9pt7b.h
new file mode 100644
index 000000000000..47711ee7ccc8
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifBoldItalic9pt7b.h
@@ -0,0 +1,215 @@
+const uint8_t FreeSerifBoldItalic9pt7bBitmaps[] PROGMEM = {
+ 0x0C, 0x31, 0xC6, 0x18, 0x41, 0x08, 0x20, 0x0E, 0x38, 0xE0, 0xCF, 0x38,
+ 0xA2, 0x88, 0x02, 0x40, 0xC8, 0x13, 0x06, 0x43, 0xFC, 0x32, 0x06, 0x40,
+ 0x98, 0x7F, 0x84, 0xC0, 0x90, 0x32, 0x04, 0xC0, 0x01, 0x01, 0xF0, 0x4B,
+ 0x99, 0x33, 0x24, 0x78, 0x07, 0x80, 0x38, 0x0B, 0x89, 0x31, 0x26, 0x64,
+ 0xC7, 0x30, 0x3C, 0x04, 0x00, 0x38, 0x41, 0x9F, 0x06, 0x48, 0x31, 0x60,
+ 0xCD, 0x03, 0x2C, 0x07, 0x27, 0x81, 0x39, 0x05, 0xC4, 0x26, 0x10, 0x98,
+ 0x84, 0x66, 0x10, 0xE0, 0x03, 0x80, 0x22, 0x03, 0x10, 0x19, 0x00, 0xF0,
+ 0x0F, 0x3C, 0xF8, 0xCC, 0xC4, 0xE7, 0x47, 0x3E, 0x38, 0xE1, 0xE7, 0x97,
+ 0xCF, 0x00, 0xFA, 0x80, 0x08, 0x88, 0x84, 0x62, 0x10, 0x84, 0x21, 0x08,
+ 0x41, 0x00, 0x20, 0x84, 0x10, 0x84, 0x21, 0x08, 0xC6, 0x23, 0x11, 0x00,
+ 0x18, 0x18, 0xD6, 0x38, 0x18, 0xF7, 0x18, 0x18, 0x08, 0x04, 0x02, 0x01,
+ 0x0F, 0xF8, 0x40, 0x20, 0x10, 0x08, 0x00, 0x6D, 0x95, 0x00, 0xFF, 0xC0,
+ 0xFF, 0x80, 0x06, 0x0C, 0x30, 0x60, 0x83, 0x04, 0x18, 0x20, 0xC1, 0x06,
+ 0x00, 0x0F, 0x0C, 0x8C, 0x6E, 0x37, 0x1B, 0x1F, 0x8F, 0xC7, 0xC7, 0x63,
+ 0xB1, 0x89, 0x83, 0x80, 0x06, 0x1E, 0x0E, 0x0E, 0x0C, 0x0C, 0x1C, 0x18,
+ 0x18, 0x18, 0x38, 0x38, 0xFC, 0x1F, 0x13, 0xD0, 0xE0, 0x70, 0x38, 0x38,
+ 0x18, 0x18, 0x18, 0x08, 0x08, 0x4F, 0xCF, 0xE0, 0x1F, 0x11, 0xC0, 0xE0,
+ 0x60, 0xC1, 0xF0, 0x38, 0x0C, 0x06, 0x03, 0x01, 0x19, 0x8F, 0x00, 0x00,
+ 0x80, 0xC0, 0xE1, 0xE0, 0xB0, 0x98, 0x9C, 0x8C, 0xFF, 0x07, 0x03, 0x01,
+ 0x80, 0x0F, 0x88, 0x08, 0x07, 0x83, 0xE0, 0x78, 0x1C, 0x06, 0x03, 0x01,
+ 0x80, 0x9C, 0x87, 0x80, 0x03, 0x87, 0x07, 0x07, 0x07, 0x03, 0xE3, 0x99,
+ 0xCC, 0xC6, 0x63, 0x33, 0x89, 0x87, 0x80, 0x3F, 0xBF, 0x90, 0x80, 0xC0,
+ 0x40, 0x60, 0x20, 0x30, 0x30, 0x10, 0x18, 0x08, 0x00, 0x1E, 0x13, 0x31,
+ 0x31, 0x3A, 0x1C, 0x1C, 0x6E, 0xC6, 0xC6, 0xC6, 0x44, 0x38, 0x0E, 0x1C,
+ 0x8C, 0x6C, 0x36, 0x3B, 0x1D, 0x8E, 0x7E, 0x0E, 0x07, 0x07, 0x0E, 0x0C,
+ 0x00, 0x39, 0xCE, 0x00, 0x03, 0x9C, 0xE0, 0x39, 0xCE, 0x00, 0x01, 0x8C,
+ 0x22, 0x20, 0x00, 0x01, 0xC3, 0xC7, 0x8E, 0x06, 0x01, 0xE0, 0x3C, 0x07,
+ 0x80, 0x40, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x60, 0x1E, 0x03,
+ 0xC0, 0x78, 0x1C, 0x3C, 0x78, 0xF0, 0x40, 0x00, 0x1C, 0x27, 0x37, 0x07,
+ 0x0E, 0x1C, 0x30, 0x60, 0x40, 0x00, 0xE0, 0xE0, 0xE0, 0x0F, 0x80, 0xC3,
+ 0x08, 0x04, 0xC3, 0x3C, 0x24, 0xE2, 0x27, 0x33, 0x39, 0x11, 0xC9, 0x93,
+ 0x77, 0x18, 0x00, 0x70, 0x40, 0xFC, 0x00, 0x00, 0x80, 0x18, 0x01, 0x80,
+ 0x38, 0x05, 0x80, 0x5C, 0x09, 0xC1, 0x1C, 0x1F, 0xC2, 0x0C, 0x20, 0xC4,
+ 0x0E, 0xF3, 0xF0, 0x3F, 0xE0, 0xC7, 0x0C, 0x71, 0xC7, 0x1C, 0xE1, 0xF0,
+ 0x39, 0xC3, 0x8E, 0x38, 0xE3, 0x0E, 0x71, 0xE7, 0x1C, 0xFF, 0x00, 0x07,
+ 0xD1, 0xC7, 0x38, 0x27, 0x02, 0x70, 0x0F, 0x00, 0xE0, 0x0E, 0x00, 0xE0,
+ 0x0E, 0x00, 0x60, 0x87, 0x18, 0x1E, 0x00, 0x3F, 0xE0, 0x30, 0xE0, 0xC1,
+ 0x87, 0x07, 0x1C, 0x1C, 0x60, 0x73, 0x81, 0xCE, 0x07, 0x38, 0x38, 0xC0,
+ 0xE7, 0x07, 0x1C, 0x78, 0xFF, 0x80, 0x1F, 0xF8, 0x61, 0xC3, 0x04, 0x38,
+ 0x81, 0xCC, 0x0F, 0xE0, 0xE2, 0x07, 0x10, 0x38, 0x81, 0x81, 0x1C, 0x18,
+ 0xE3, 0x8F, 0xFC, 0x00, 0x3F, 0xF8, 0x61, 0xC3, 0x04, 0x38, 0x81, 0xCC,
+ 0x0F, 0xE0, 0xE2, 0x07, 0x10, 0x38, 0x81, 0x80, 0x1C, 0x00, 0xE0, 0x0F,
+ 0x80, 0x00, 0x07, 0x91, 0xC7, 0x38, 0x27, 0x00, 0x70, 0x0F, 0x00, 0xE1,
+ 0xFE, 0x0E, 0xE0, 0xCE, 0x0C, 0x60, 0xC7, 0x1C, 0x1F, 0x00, 0x1F, 0x7E,
+ 0x1C, 0x38, 0x30, 0x60, 0xE1, 0xC1, 0xC3, 0x83, 0x06, 0x0F, 0xFC, 0x1C,
+ 0x38, 0x38, 0x70, 0x60, 0xC1, 0xC3, 0x83, 0x87, 0x0F, 0x9F, 0x00, 0x3F,
+ 0x0C, 0x0C, 0x1C, 0x1C, 0x18, 0x38, 0x38, 0x38, 0x30, 0x70, 0x70, 0xF8,
+ 0x07, 0xC0, 0xE0, 0x38, 0x0C, 0x07, 0x01, 0xC0, 0x70, 0x18, 0x0E, 0x03,
+ 0x80, 0xC3, 0x30, 0xDC, 0x1E, 0x00, 0x1F, 0x78, 0x71, 0x83, 0x18, 0x39,
+ 0x81, 0xD0, 0x0D, 0x00, 0xFC, 0x07, 0x60, 0x3B, 0x81, 0x8C, 0x1C, 0x70,
+ 0xE1, 0x8F, 0xBE, 0x00, 0x1F, 0x00, 0xC0, 0x0C, 0x01, 0xC0, 0x1C, 0x01,
+ 0x80, 0x38, 0x03, 0x80, 0x38, 0x03, 0x01, 0x70, 0x37, 0x0E, 0xFF, 0xE0,
+ 0x1E, 0x07, 0x87, 0x07, 0x83, 0x83, 0x82, 0xC3, 0xC1, 0x62, 0xE0, 0xB1,
+ 0x70, 0x99, 0x30, 0x4D, 0xB8, 0x27, 0x9C, 0x13, 0x8C, 0x11, 0xC6, 0x0C,
+ 0xC7, 0x0F, 0x47, 0xC0, 0x3C, 0x3C, 0x38, 0x20, 0xE0, 0x85, 0xC4, 0x13,
+ 0x10, 0x4E, 0x42, 0x3A, 0x08, 0x78, 0x21, 0xE0, 0x83, 0x84, 0x0C, 0x18,
+ 0x10, 0x00, 0x40, 0x07, 0xC1, 0xCE, 0x38, 0x73, 0x87, 0x70, 0x77, 0x07,
+ 0xF0, 0xFE, 0x0E, 0xE0, 0xEE, 0x1C, 0xE1, 0xC6, 0x38, 0x3E, 0x00, 0x3F,
+ 0xC0, 0xC7, 0x0C, 0x71, 0xC7, 0x1C, 0x71, 0x8E, 0x3F, 0xC3, 0x80, 0x30,
+ 0x03, 0x00, 0x70, 0x07, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0xCE, 0x38, 0x73,
+ 0x87, 0x70, 0x77, 0x07, 0xF0, 0x7E, 0x0E, 0xE0, 0xEE, 0x0C, 0xE1, 0xC6,
+ 0x38, 0x36, 0x01, 0x80, 0x3C, 0x2D, 0xFC, 0x3F, 0xC0, 0xE7, 0x0C, 0x71,
+ 0xC7, 0x1C, 0x71, 0x8E, 0x3F, 0x83, 0xB8, 0x3B, 0x83, 0x3C, 0x71, 0xC7,
+ 0x1C, 0xF9, 0xF0, 0x0C, 0x89, 0x8C, 0x46, 0x23, 0x80, 0xE0, 0x78, 0x0E,
+ 0x03, 0x21, 0x90, 0xCC, 0xC9, 0xC0, 0x7F, 0xE9, 0xDF, 0x31, 0x4E, 0x21,
+ 0xC0, 0x38, 0x06, 0x01, 0xC0, 0x38, 0x06, 0x00, 0xC0, 0x38, 0x0F, 0xC0,
+ 0x7C, 0xF3, 0x82, 0x30, 0x27, 0x04, 0x70, 0x46, 0x04, 0xE0, 0x4E, 0x08,
+ 0xE0, 0x8E, 0x08, 0xE1, 0x0F, 0x30, 0x3C, 0x00, 0xFC, 0x73, 0x82, 0x38,
+ 0x23, 0x84, 0x38, 0x83, 0x90, 0x39, 0x01, 0xA0, 0x1C, 0x01, 0xC0, 0x18,
+ 0x01, 0x00, 0xF9, 0xF7, 0x30, 0xE2, 0x30, 0xC2, 0x38, 0xC4, 0x3B, 0xC4,
+ 0x3A, 0xE8, 0x3C, 0xE8, 0x3C, 0xF0, 0x18, 0xF0, 0x18, 0x60, 0x10, 0x60,
+ 0x10, 0x40, 0x3F, 0x78, 0x61, 0x83, 0x98, 0x1D, 0x00, 0x70, 0x03, 0x80,
+ 0x1C, 0x01, 0x60, 0x0B, 0x80, 0x9C, 0x08, 0x60, 0xC3, 0x8F, 0x7E, 0x00,
+ 0xF9, 0xE6, 0x18, 0xC2, 0x1C, 0x81, 0xA0, 0x34, 0x07, 0x00, 0xC0, 0x18,
+ 0x07, 0x00, 0xE0, 0x1C, 0x0F, 0xC0, 0x3F, 0xE6, 0x19, 0x87, 0x21, 0xC0,
+ 0x30, 0x0E, 0x03, 0x80, 0x60, 0x1C, 0x07, 0x05, 0xC1, 0x38, 0xEF, 0xFC,
+ 0x0E, 0x08, 0x18, 0x18, 0x18, 0x10, 0x30, 0x30, 0x30, 0x20, 0x60, 0x60,
+ 0x60, 0x40, 0xF0, 0xC6, 0x10, 0xC6, 0x10, 0x86, 0x30, 0x86, 0x30, 0x1E,
+ 0x0C, 0x18, 0x20, 0xC1, 0x83, 0x04, 0x18, 0x30, 0x60, 0x83, 0x06, 0x3C,
+ 0x00, 0x18, 0x1C, 0x34, 0x26, 0x66, 0x43, 0xC3, 0xFF, 0x80, 0xC6, 0x30,
+ 0x0D, 0x9D, 0x8C, 0xCC, 0x6E, 0x26, 0x33, 0x19, 0xBE, 0x66, 0x00, 0x00,
+ 0x78, 0x18, 0x30, 0x30, 0x3E, 0x73, 0x63, 0x63, 0x63, 0xC6, 0xC6, 0xCC,
+ 0x70, 0x0F, 0x3B, 0x70, 0x70, 0xE0, 0xE0, 0xE2, 0xE4, 0x78, 0x00, 0x00,
+ 0xF0, 0x1C, 0x06, 0x01, 0x83, 0xE3, 0x30, 0xCC, 0x63, 0x19, 0xCC, 0x63,
+ 0x38, 0xCF, 0x1D, 0x80, 0x0E, 0x75, 0xCB, 0xBE, 0xDE, 0x38, 0x72, 0x78,
+ 0x00, 0xE0, 0x34, 0x0C, 0x01, 0x80, 0x30, 0x1F, 0x01, 0x80, 0x30, 0x06,
+ 0x01, 0xC0, 0x30, 0x06, 0x00, 0xC0, 0x30, 0x06, 0x04, 0x80, 0xE0, 0x00,
+ 0x1C, 0x19, 0xD8, 0xCC, 0x66, 0x60, 0xE1, 0x80, 0xF0, 0x7E, 0x43, 0x21,
+ 0x8F, 0x00, 0x00, 0x1E, 0x07, 0x03, 0x01, 0x80, 0xD8, 0xFC, 0x76, 0x33,
+ 0x19, 0x99, 0xCC, 0xD6, 0x77, 0x30, 0x39, 0xC0, 0x0F, 0x31, 0x8C, 0xC6,
+ 0x31, 0xAE, 0x00, 0x03, 0x81, 0xC0, 0x00, 0x00, 0xE0, 0x30, 0x18, 0x18,
+ 0x0C, 0x06, 0x03, 0x03, 0x01, 0x80, 0xC2, 0xC1, 0xC0, 0x00, 0x0F, 0x00,
+ 0xC0, 0x60, 0x18, 0x06, 0xF3, 0x90, 0xC8, 0x34, 0x0F, 0x06, 0xC1, 0x98,
+ 0x66, 0xB9, 0xC0, 0x03, 0xCC, 0x63, 0x39, 0x8C, 0x66, 0x31, 0x8E, 0x70,
+ 0x7B, 0x99, 0xAF, 0xCE, 0x66, 0x63, 0x67, 0x33, 0x31, 0x99, 0x8C, 0xCC,
+ 0xE7, 0xC6, 0x30, 0x73, 0x7F, 0x73, 0x73, 0x63, 0x67, 0xE6, 0xC7, 0xC6,
+ 0x1E, 0x33, 0x63, 0x63, 0xC3, 0xC6, 0xC6, 0xCC, 0x78, 0x1D, 0xC3, 0xB1,
+ 0xCC, 0x63, 0x19, 0xCE, 0x63, 0x18, 0xCC, 0x3E, 0x1C, 0x06, 0x03, 0xE0,
+ 0x0D, 0x99, 0x8C, 0xCC, 0x6E, 0x76, 0x33, 0x19, 0x9C, 0x7C, 0x06, 0x07,
+ 0x07, 0xC0, 0x76, 0x3A, 0x30, 0x70, 0x60, 0x60, 0x60, 0xE0, 0x3D, 0x14,
+ 0x58, 0x38, 0x60, 0xA2, 0xF0, 0x08, 0xCC, 0xF6, 0x31, 0x98, 0xC6, 0x35,
+ 0xC0, 0xE3, 0x63, 0x66, 0x66, 0x66, 0xCC, 0xCC, 0xFE, 0xEC, 0xE6, 0xCD,
+ 0x8B, 0x26, 0x8E, 0x18, 0x20, 0xE4, 0xD9, 0x36, 0xE5, 0xDA, 0x77, 0x19,
+ 0xC6, 0x61, 0x10, 0x39, 0xC7, 0xB0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xE1,
+ 0x5A, 0x67, 0x00, 0x39, 0x8C, 0xC3, 0x21, 0xA0, 0xD0, 0x68, 0x38, 0x0C,
+ 0x04, 0x04, 0x14, 0x0C, 0x00, 0x3E, 0x46, 0x0C, 0x08, 0x10, 0x20, 0x70,
+ 0x1A, 0x0E, 0x03, 0x0E, 0x0C, 0x0C, 0x08, 0x18, 0x18, 0x10, 0x60, 0x30,
+ 0x30, 0x30, 0x60, 0x60, 0x60, 0x30, 0xFF, 0xF0, 0x0C, 0x06, 0x06, 0x06,
+ 0x04, 0x0C, 0x0C, 0x0C, 0x06, 0x18, 0x18, 0x18, 0x30, 0x30, 0x30, 0xE0,
+ 0x71, 0x8F };
+
+const GFXglyph FreeSerifBoldItalic9pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 5, 0, 1 }, // 0x20 ' '
+ { 0, 6, 13, 7, 1, -11 }, // 0x21 '!'
+ { 10, 6, 5, 10, 3, -11 }, // 0x22 '"'
+ { 14, 11, 13, 9, -1, -12 }, // 0x23 '#'
+ { 32, 11, 15, 9, -1, -12 }, // 0x24 '$'
+ { 53, 14, 13, 15, 1, -11 }, // 0x25 '%'
+ { 76, 13, 13, 14, 0, -11 }, // 0x26 '&'
+ { 98, 2, 5, 5, 3, -11 }, // 0x27 '''
+ { 100, 5, 16, 6, 1, -11 }, // 0x28 '('
+ { 110, 5, 16, 6, -1, -11 }, // 0x29 ')'
+ { 120, 8, 8, 9, 1, -11 }, // 0x2A '*'
+ { 128, 9, 9, 10, 0, -8 }, // 0x2B '+'
+ { 139, 3, 6, 5, -1, -2 }, // 0x2C ','
+ { 142, 5, 2, 6, 0, -4 }, // 0x2D '-'
+ { 144, 3, 3, 4, 0, -1 }, // 0x2E '.'
+ { 146, 7, 12, 6, 0, -11 }, // 0x2F '/'
+ { 157, 9, 13, 9, 0, -11 }, // 0x30 '0'
+ { 172, 8, 13, 9, 0, -11 }, // 0x31 '1'
+ { 185, 9, 13, 9, 0, -11 }, // 0x32 '2'
+ { 200, 9, 13, 9, 0, -11 }, // 0x33 '3'
+ { 215, 9, 12, 9, 0, -11 }, // 0x34 '4'
+ { 229, 9, 13, 9, 0, -11 }, // 0x35 '5'
+ { 244, 9, 13, 9, 1, -11 }, // 0x36 '6'
+ { 259, 9, 12, 9, 1, -11 }, // 0x37 '7'
+ { 273, 8, 13, 9, 0, -11 }, // 0x38 '8'
+ { 286, 9, 13, 9, 0, -11 }, // 0x39 '9'
+ { 301, 5, 9, 5, 0, -7 }, // 0x3A ':'
+ { 307, 5, 11, 5, 0, -7 }, // 0x3B ';'
+ { 314, 9, 10, 10, 1, -9 }, // 0x3C '<'
+ { 326, 9, 5, 10, 1, -6 }, // 0x3D '='
+ { 332, 9, 10, 10, 1, -9 }, // 0x3E '>'
+ { 344, 8, 13, 9, 1, -11 }, // 0x3F '?'
+ { 357, 13, 13, 15, 1, -12 }, // 0x40 '@'
+ { 379, 12, 13, 13, 0, -11 }, // 0x41 'A'
+ { 399, 12, 13, 12, 0, -11 }, // 0x42 'B'
+ { 419, 12, 13, 11, 1, -11 }, // 0x43 'C'
+ { 439, 14, 13, 13, 0, -11 }, // 0x44 'D'
+ { 462, 13, 13, 11, 0, -11 }, // 0x45 'E'
+ { 484, 13, 13, 11, 0, -11 }, // 0x46 'F'
+ { 506, 12, 13, 13, 1, -11 }, // 0x47 'G'
+ { 526, 15, 13, 14, 0, -11 }, // 0x48 'H'
+ { 551, 8, 13, 7, 0, -11 }, // 0x49 'I'
+ { 564, 10, 14, 9, 0, -11 }, // 0x4A 'J'
+ { 582, 13, 13, 12, 0, -11 }, // 0x4B 'K'
+ { 604, 12, 13, 11, 0, -11 }, // 0x4C 'L'
+ { 624, 17, 13, 16, 0, -11 }, // 0x4D 'M'
+ { 652, 14, 13, 13, 0, -11 }, // 0x4E 'N'
+ { 675, 12, 13, 12, 1, -11 }, // 0x4F 'O'
+ { 695, 12, 13, 11, 0, -11 }, // 0x50 'P'
+ { 715, 12, 16, 12, 1, -11 }, // 0x51 'Q'
+ { 739, 12, 13, 12, 0, -11 }, // 0x52 'R'
+ { 759, 9, 13, 9, 0, -11 }, // 0x53 'S'
+ { 774, 11, 13, 11, 2, -11 }, // 0x54 'T'
+ { 792, 12, 13, 13, 2, -11 }, // 0x55 'U'
+ { 812, 12, 12, 13, 2, -11 }, // 0x56 'V'
+ { 830, 16, 12, 17, 2, -11 }, // 0x57 'W'
+ { 854, 13, 13, 13, 0, -11 }, // 0x58 'X'
+ { 876, 11, 13, 11, 2, -11 }, // 0x59 'Y'
+ { 894, 11, 13, 10, 0, -11 }, // 0x5A 'Z'
+ { 912, 8, 15, 6, -1, -11 }, // 0x5B '['
+ { 927, 5, 12, 7, 2, -11 }, // 0x5C '\'
+ { 935, 7, 15, 6, -1, -11 }, // 0x5D ']'
+ { 949, 8, 7, 10, 1, -11 }, // 0x5E '^'
+ { 956, 9, 1, 9, 0, 3 }, // 0x5F '_'
+ { 958, 4, 3, 6, 2, -11 }, // 0x60 '`'
+ { 960, 9, 9, 9, 0, -7 }, // 0x61 'a'
+ { 971, 8, 14, 9, 0, -12 }, // 0x62 'b'
+ { 985, 8, 9, 8, 0, -7 }, // 0x63 'c'
+ { 994, 10, 14, 9, 0, -12 }, // 0x64 'd'
+ { 1012, 7, 9, 7, 0, -7 }, // 0x65 'e'
+ { 1020, 11, 17, 9, -2, -12 }, // 0x66 'f'
+ { 1044, 9, 12, 9, 0, -7 }, // 0x67 'g'
+ { 1058, 9, 14, 10, 0, -12 }, // 0x68 'h'
+ { 1074, 5, 13, 5, 1, -11 }, // 0x69 'i'
+ { 1083, 9, 16, 6, -1, -11 }, // 0x6A 'j'
+ { 1101, 10, 14, 9, 0, -12 }, // 0x6B 'k'
+ { 1119, 5, 14, 5, 1, -12 }, // 0x6C 'l'
+ { 1128, 13, 9, 14, 0, -7 }, // 0x6D 'm'
+ { 1143, 8, 9, 9, 0, -7 }, // 0x6E 'n'
+ { 1152, 8, 9, 9, 0, -7 }, // 0x6F 'o'
+ { 1161, 10, 12, 9, -2, -7 }, // 0x70 'p'
+ { 1176, 9, 12, 9, 0, -7 }, // 0x71 'q'
+ { 1190, 8, 8, 7, 0, -7 }, // 0x72 'r'
+ { 1198, 6, 9, 6, 0, -7 }, // 0x73 's'
+ { 1205, 5, 12, 5, 1, -10 }, // 0x74 't'
+ { 1213, 8, 9, 10, 1, -7 }, // 0x75 'u'
+ { 1222, 7, 8, 8, 1, -7 }, // 0x76 'v'
+ { 1229, 10, 8, 12, 1, -7 }, // 0x77 'w'
+ { 1239, 10, 9, 9, -1, -7 }, // 0x78 'x'
+ { 1251, 9, 12, 8, -1, -7 }, // 0x79 'y'
+ { 1265, 8, 9, 7, 0, -7 }, // 0x7A 'z'
+ { 1274, 8, 16, 6, 0, -12 }, // 0x7B '{'
+ { 1290, 1, 12, 5, 2, -11 }, // 0x7C '|'
+ { 1292, 8, 16, 6, -2, -12 }, // 0x7D '}'
+ { 1308, 8, 2, 10, 1, -4 } }; // 0x7E '~'
+
+const GFXfont FreeSerifBoldItalic9pt7b PROGMEM = {
+ (uint8_t *)FreeSerifBoldItalic9pt7bBitmaps,
+ (GFXglyph *)FreeSerifBoldItalic9pt7bGlyphs,
+ 0x20, 0x7E, 22 };
+
+// Approx. 1982 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifItalic12pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifItalic12pt7b.h
new file mode 100644
index 000000000000..52332a7ad33c
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifItalic12pt7b.h
@@ -0,0 +1,271 @@
+const uint8_t FreeSerifItalic12pt7bBitmaps[] PROGMEM = {
+ 0x0C, 0x31, 0xC6, 0x18, 0x43, 0x0C, 0x20, 0x84, 0x10, 0x03, 0x0C, 0x30,
+ 0x66, 0xCD, 0x12, 0x24, 0x51, 0x00, 0x03, 0x10, 0x11, 0x80, 0x8C, 0x0C,
+ 0x40, 0x46, 0x1F, 0xFC, 0x21, 0x01, 0x18, 0x18, 0x80, 0x84, 0x3F, 0xF8,
+ 0x62, 0x02, 0x30, 0x31, 0x01, 0x08, 0x08, 0xC0, 0x00, 0x40, 0x08, 0x07,
+ 0xC0, 0xCA, 0x18, 0xA1, 0x92, 0x19, 0x01, 0xD0, 0x0F, 0x00, 0x78, 0x03,
+ 0xC0, 0x2E, 0x02, 0x64, 0x46, 0x44, 0x64, 0x46, 0x64, 0xC1, 0xF0, 0x08,
+ 0x00, 0x80, 0x00, 0x08, 0x0F, 0x0C, 0x0C, 0x7C, 0x0C, 0x22, 0x06, 0x12,
+ 0x06, 0x09, 0x03, 0x09, 0x01, 0x84, 0x80, 0xC4, 0x8F, 0x3C, 0x4C, 0x40,
+ 0x4C, 0x20, 0x4E, 0x10, 0x26, 0x08, 0x23, 0x08, 0x11, 0x84, 0x10, 0xC4,
+ 0x08, 0x3C, 0x00, 0x00, 0xE0, 0x02, 0x60, 0x0C, 0xC0, 0x19, 0x80, 0x36,
+ 0x00, 0x70, 0x00, 0xC0, 0x07, 0x9F, 0x33, 0x08, 0xC3, 0x13, 0x06, 0x46,
+ 0x0D, 0x0C, 0x0C, 0x18, 0x1C, 0x1C, 0x5C, 0x9F, 0x1E, 0xFA, 0xA0, 0x02,
+ 0x08, 0x20, 0xC3, 0x06, 0x18, 0x30, 0xE1, 0x83, 0x06, 0x0C, 0x18, 0x30,
+ 0x60, 0x40, 0x80, 0x81, 0x00, 0x08, 0x10, 0x10, 0x20, 0x40, 0xC1, 0x83,
+ 0x06, 0x0C, 0x18, 0x70, 0xC1, 0x83, 0x0C, 0x10, 0x41, 0x04, 0x00, 0x18,
+ 0x18, 0x18, 0x93, 0x74, 0x38, 0xD7, 0x93, 0x18, 0x18, 0x04, 0x00, 0x80,
+ 0x10, 0x02, 0x00, 0x41, 0xFF, 0xC1, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10,
+ 0x00, 0x6C, 0x95, 0x00, 0xF8, 0xFC, 0x00, 0x40, 0x18, 0x02, 0x00, 0xC0,
+ 0x30, 0x06, 0x01, 0x80, 0x20, 0x0C, 0x01, 0x00, 0x60, 0x18, 0x03, 0x00,
+ 0xC0, 0x10, 0x06, 0x00, 0x07, 0x81, 0x98, 0x61, 0x18, 0x33, 0x06, 0xC0,
+ 0xD8, 0x1B, 0x03, 0xE0, 0xF8, 0x1F, 0x03, 0x60, 0x6C, 0x19, 0x83, 0x10,
+ 0xC3, 0x30, 0x3C, 0x00, 0x01, 0x87, 0xC0, 0xC0, 0x60, 0x30, 0x18, 0x18,
+ 0x0C, 0x06, 0x07, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x60, 0x30, 0xFE, 0x00,
+ 0x0F, 0x0C, 0x64, 0x0C, 0x03, 0x00, 0xC0, 0x20, 0x18, 0x0C, 0x02, 0x01,
+ 0x00, 0x80, 0x40, 0x20, 0x10, 0x2F, 0xF0, 0x07, 0x86, 0x30, 0x0C, 0x03,
+ 0x01, 0x81, 0x81, 0xF0, 0x1E, 0x03, 0x80, 0x60, 0x18, 0x06, 0x01, 0x00,
+ 0xCC, 0x63, 0xE0, 0x00, 0x20, 0x0C, 0x03, 0x80, 0xA0, 0x2C, 0x09, 0x82,
+ 0x30, 0x84, 0x31, 0x8C, 0x33, 0x06, 0x7F, 0xE0, 0x30, 0x06, 0x00, 0x80,
+ 0x30, 0x03, 0xE1, 0x80, 0x20, 0x06, 0x00, 0xF0, 0x0F, 0x00, 0x60, 0x06,
+ 0x00, 0xC0, 0x18, 0x03, 0x00, 0x40, 0x18, 0x02, 0x30, 0x87, 0xE0, 0x00,
+ 0x70, 0x3C, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x7F, 0x07, 0x18, 0x60,
+ 0xCE, 0x0C, 0xC0, 0xCC, 0x0C, 0xC0, 0xCC, 0x18, 0x41, 0x86, 0x30, 0x3E,
+ 0x00, 0x7F, 0xF0, 0x18, 0x03, 0x00, 0xC0, 0x10, 0x06, 0x01, 0x80, 0x30,
+ 0x0C, 0x01, 0x00, 0x60, 0x08, 0x03, 0x00, 0xC0, 0x10, 0x06, 0x00, 0x0F,
+ 0x83, 0x18, 0xC1, 0x98, 0x33, 0x06, 0x71, 0x87, 0x60, 0x70, 0x17, 0x0C,
+ 0x71, 0x07, 0x60, 0x6C, 0x0D, 0x81, 0xB0, 0x63, 0x1C, 0x3E, 0x00, 0x07,
+ 0x83, 0x18, 0xC1, 0x18, 0x36, 0x06, 0xC0, 0xD8, 0x1B, 0x07, 0x60, 0xE6,
+ 0x38, 0x7F, 0x00, 0xC0, 0x30, 0x0C, 0x07, 0x03, 0xC0, 0xC0, 0x00, 0x33,
+ 0x30, 0x00, 0x00, 0xCC, 0xC0, 0x18, 0xC6, 0x00, 0x00, 0x00, 0x03, 0x18,
+ 0x44, 0x40, 0x00, 0x00, 0x03, 0x00, 0xF0, 0x38, 0x1E, 0x07, 0x80, 0xE0,
+ 0x0F, 0x00, 0x1C, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x00, 0x10, 0xFF, 0xF0,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x0C, 0x00, 0xF0, 0x01,
+ 0xC0, 0x07, 0x80, 0x1E, 0x00, 0x70, 0x0F, 0x03, 0xC1, 0xE0, 0x78, 0x0E,
+ 0x00, 0x80, 0x00, 0x3E, 0x21, 0x90, 0x60, 0x30, 0x38, 0x38, 0x30, 0x30,
+ 0x20, 0x20, 0x10, 0x00, 0x00, 0x06, 0x03, 0x01, 0x80, 0x07, 0xE0, 0x1C,
+ 0x18, 0x30, 0x04, 0x60, 0x02, 0x61, 0xDA, 0xC3, 0x31, 0xC6, 0x31, 0xC4,
+ 0x31, 0xCC, 0x31, 0xCC, 0x21, 0xCC, 0x62, 0x6C, 0xE4, 0x67, 0x38, 0x30,
+ 0x00, 0x1C, 0x08, 0x07, 0xF0, 0x00, 0x20, 0x00, 0xC0, 0x03, 0x80, 0x0B,
+ 0x00, 0x16, 0x00, 0x4E, 0x00, 0x9C, 0x02, 0x18, 0x08, 0x30, 0x1F, 0xE0,
+ 0x40, 0xC1, 0x81, 0xC2, 0x03, 0x8C, 0x07, 0x3C, 0x1F, 0x80, 0x1F, 0xF0,
+ 0x1C, 0x60, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x38, 0x60, 0xC3, 0x03, 0xF0,
+ 0x1C, 0x30, 0x60, 0x61, 0x81, 0x86, 0x06, 0x38, 0x18, 0xC0, 0xC3, 0x06,
+ 0x3F, 0xF0, 0x01, 0xF9, 0x06, 0x0F, 0x1C, 0x06, 0x38, 0x02, 0x30, 0x02,
+ 0x60, 0x00, 0x60, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00,
+ 0xC0, 0x00, 0xC0, 0x08, 0x60, 0x10, 0x30, 0x60, 0x1F, 0x80, 0x1F, 0xF0,
+ 0x07, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x03, 0x0E, 0x03, 0x0C, 0x03,
+ 0x0C, 0x03, 0x1C, 0x03, 0x1C, 0x07, 0x18, 0x06, 0x18, 0x06, 0x38, 0x0C,
+ 0x30, 0x18, 0x30, 0x70, 0xFF, 0x80, 0x1F, 0xFF, 0x07, 0x07, 0x06, 0x02,
+ 0x06, 0x02, 0x06, 0x00, 0x0E, 0x10, 0x0C, 0x30, 0x0F, 0xF0, 0x1C, 0x20,
+ 0x18, 0x20, 0x18, 0x00, 0x18, 0x00, 0x38, 0x04, 0x30, 0x08, 0x30, 0x38,
+ 0xFF, 0xF8, 0x1F, 0xFF, 0x07, 0x07, 0x07, 0x02, 0x06, 0x02, 0x06, 0x00,
+ 0x0E, 0x10, 0x0C, 0x30, 0x0F, 0xF0, 0x1C, 0x20, 0x1C, 0x20, 0x18, 0x00,
+ 0x18, 0x00, 0x38, 0x00, 0x30, 0x00, 0x30, 0x00, 0xFC, 0x00, 0x01, 0xF1,
+ 0x06, 0x0F, 0x18, 0x07, 0x38, 0x02, 0x30, 0x02, 0x60, 0x00, 0x60, 0x00,
+ 0xE0, 0x00, 0xC0, 0x7F, 0xC0, 0x1C, 0xC0, 0x1C, 0xC0, 0x18, 0xC0, 0x18,
+ 0x60, 0x18, 0x30, 0x38, 0x0F, 0xC0, 0x1F, 0xC7, 0xE0, 0xE0, 0x70, 0x18,
+ 0x0E, 0x03, 0x01, 0x80, 0x60, 0x30, 0x1C, 0x0E, 0x03, 0x01, 0x80, 0x7F,
+ 0xF0, 0x1C, 0x06, 0x03, 0x01, 0xC0, 0x60, 0x30, 0x0C, 0x06, 0x03, 0x81,
+ 0xC0, 0x60, 0x38, 0x0C, 0x06, 0x07, 0xE3, 0xF0, 0x1F, 0x83, 0x81, 0x80,
+ 0xC0, 0x60, 0x70, 0x30, 0x18, 0x1C, 0x0C, 0x06, 0x03, 0x03, 0x81, 0x80,
+ 0xC1, 0xF8, 0x03, 0xF0, 0x0C, 0x00, 0xC0, 0x1C, 0x01, 0x80, 0x18, 0x03,
+ 0x80, 0x30, 0x03, 0x00, 0x30, 0x07, 0x00, 0x60, 0x06, 0x0C, 0xE0, 0xCC,
+ 0x07, 0x80, 0x1F, 0xCF, 0x83, 0x83, 0x81, 0x81, 0x00, 0xC3, 0x00, 0x62,
+ 0x00, 0x72, 0x00, 0x36, 0x00, 0x1E, 0x00, 0x1D, 0x80, 0x0C, 0xE0, 0x06,
+ 0x30, 0x03, 0x1C, 0x03, 0x87, 0x01, 0x81, 0x80, 0xC0, 0xE1, 0xF9, 0xFC,
+ 0x1F, 0xC0, 0x1C, 0x00, 0x60, 0x01, 0x80, 0x06, 0x00, 0x38, 0x00, 0xC0,
+ 0x03, 0x00, 0x1C, 0x00, 0x60, 0x01, 0x80, 0x06, 0x00, 0x38, 0x0C, 0xC0,
+ 0x23, 0x03, 0xBF, 0xFE, 0x0F, 0x00, 0x78, 0x38, 0x07, 0x81, 0xC0, 0x38,
+ 0x0E, 0x02, 0xC0, 0x70, 0x3E, 0x05, 0xC1, 0x70, 0x2E, 0x13, 0x01, 0x31,
+ 0x98, 0x11, 0x89, 0xC0, 0x8C, 0x8C, 0x04, 0x6C, 0x60, 0x23, 0x43, 0x02,
+ 0x1C, 0x38, 0x10, 0xE1, 0x81, 0x86, 0x1C, 0x1F, 0x23, 0xF8, 0x1E, 0x07,
+ 0xC1, 0xC0, 0x60, 0x70, 0x10, 0x1C, 0x0C, 0x05, 0x82, 0x02, 0x60, 0x80,
+ 0x9C, 0x60, 0x23, 0x10, 0x10, 0xC4, 0x04, 0x19, 0x01, 0x06, 0xC0, 0x40,
+ 0xE0, 0x20, 0x38, 0x08, 0x0E, 0x06, 0x01, 0x03, 0xE0, 0x40, 0x01, 0xF0,
+ 0x0C, 0x10, 0x30, 0x10, 0xC0, 0x33, 0x00, 0x6E, 0x00, 0xD8, 0x01, 0xF0,
+ 0x03, 0xC0, 0x0D, 0x80, 0x1B, 0x00, 0x76, 0x00, 0xCC, 0x03, 0x08, 0x0C,
+ 0x18, 0x70, 0x0F, 0x80, 0x1F, 0xF0, 0x1C, 0x60, 0x60, 0xC1, 0x83, 0x06,
+ 0x0C, 0x38, 0x30, 0xC1, 0x83, 0x0E, 0x1F, 0xE0, 0x60, 0x01, 0x80, 0x06,
+ 0x00, 0x38, 0x00, 0xC0, 0x03, 0x00, 0x3F, 0x00, 0x01, 0xF0, 0x06, 0x10,
+ 0x30, 0x30, 0xC0, 0x33, 0x00, 0x66, 0x00, 0xD8, 0x01, 0xB0, 0x03, 0xE0,
+ 0x0F, 0x80, 0x1B, 0x00, 0x36, 0x00, 0xCC, 0x03, 0x98, 0x06, 0x18, 0x18,
+ 0x18, 0xC0, 0x0E, 0x00, 0x20, 0x01, 0xF8, 0x36, 0x7F, 0x80, 0x1F, 0xF0,
+ 0x1C, 0x60, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x38, 0x70, 0xC3, 0x83, 0xF8,
+ 0x1D, 0xC0, 0x63, 0x01, 0x8C, 0x06, 0x18, 0x38, 0x60, 0xC1, 0xC3, 0x03,
+ 0x3F, 0x0F, 0x07, 0x90, 0xC7, 0x18, 0x21, 0x82, 0x18, 0x01, 0xC0, 0x0E,
+ 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xC4, 0x0C, 0x40, 0xC6, 0x08, 0xE1,
+ 0x89, 0xE0, 0x7F, 0xFE, 0xC7, 0x1D, 0x0C, 0x14, 0x18, 0x20, 0x70, 0x00,
+ 0xE0, 0x01, 0x80, 0x03, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60,
+ 0x01, 0xC0, 0x03, 0x00, 0x0E, 0x00, 0x7F, 0x80, 0x7E, 0x1F, 0x38, 0x0C,
+ 0x38, 0x0C, 0x30, 0x08, 0x30, 0x08, 0x70, 0x08, 0x70, 0x10, 0x60, 0x10,
+ 0x60, 0x10, 0xE0, 0x10, 0xC0, 0x20, 0xC0, 0x20, 0xC0, 0x60, 0xC0, 0x40,
+ 0x61, 0x80, 0x3F, 0x00, 0xFC, 0x3E, 0xE0, 0x18, 0xC0, 0x21, 0x80, 0xC3,
+ 0x81, 0x07, 0x04, 0x0E, 0x08, 0x0C, 0x20, 0x18, 0x80, 0x31, 0x00, 0x64,
+ 0x00, 0xF0, 0x01, 0xE0, 0x01, 0x80, 0x02, 0x00, 0x04, 0x00, 0xFD, 0xF8,
+ 0xF7, 0x07, 0x06, 0x30, 0x60, 0x63, 0x07, 0x04, 0x30, 0x70, 0x83, 0x8F,
+ 0x08, 0x38, 0xB1, 0x03, 0x93, 0x10, 0x19, 0x32, 0x01, 0xA3, 0x20, 0x1A,
+ 0x34, 0x01, 0xC3, 0x40, 0x1C, 0x38, 0x01, 0x83, 0x00, 0x18, 0x30, 0x01,
+ 0x02, 0x00, 0x1F, 0x9F, 0x0E, 0x06, 0x06, 0x04, 0x07, 0x08, 0x03, 0x10,
+ 0x03, 0x20, 0x03, 0xC0, 0x01, 0x80, 0x01, 0xC0, 0x03, 0xC0, 0x06, 0xE0,
+ 0x0C, 0x60, 0x18, 0x60, 0x30, 0x70, 0x70, 0x78, 0xF8, 0xFC, 0xFC, 0xFB,
+ 0x81, 0x8C, 0x08, 0x60, 0x83, 0x8C, 0x0C, 0xC0, 0x64, 0x03, 0xC0, 0x0C,
+ 0x00, 0xE0, 0x07, 0x00, 0x30, 0x01, 0x80, 0x1C, 0x00, 0xC0, 0x1F, 0xC0,
+ 0x1F, 0xFE, 0x30, 0x38, 0xC0, 0xF1, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00,
+ 0x70, 0x01, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x01, 0xC0,
+ 0x47, 0x01, 0x1C, 0x06, 0x7F, 0xF8, 0x07, 0x04, 0x08, 0x08, 0x08, 0x18,
+ 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x40, 0x40, 0x40, 0x80, 0x80,
+ 0x80, 0xE0, 0xC0, 0xC0, 0x40, 0x60, 0x20, 0x30, 0x30, 0x18, 0x18, 0x08,
+ 0x0C, 0x04, 0x06, 0x06, 0x03, 0x03, 0x0E, 0x04, 0x08, 0x10, 0x60, 0x81,
+ 0x02, 0x04, 0x18, 0x20, 0x40, 0x81, 0x02, 0x08, 0x10, 0x20, 0x47, 0x80,
+ 0x0C, 0x03, 0x81, 0xE0, 0x4C, 0x33, 0x08, 0x66, 0x19, 0x03, 0xC0, 0xC0,
+ 0xFF, 0xF0, 0xCE, 0x63, 0x07, 0xA0, 0xCE, 0x18, 0x63, 0x04, 0x60, 0xC6,
+ 0x0C, 0xC0, 0xCC, 0x18, 0xC3, 0x8C, 0x5A, 0x79, 0xC0, 0x38, 0x06, 0x01,
+ 0x80, 0x40, 0x30, 0x0C, 0xE3, 0xCC, 0xC3, 0x70, 0xD8, 0x36, 0x19, 0x06,
+ 0xC3, 0x30, 0x8C, 0xC3, 0xE0, 0x0F, 0x0C, 0xCC, 0x6C, 0x06, 0x06, 0x03,
+ 0x01, 0x80, 0xC0, 0x73, 0x1E, 0x00, 0x00, 0x70, 0x01, 0x80, 0x0C, 0x00,
+ 0x60, 0x02, 0x03, 0xF0, 0x31, 0x83, 0x08, 0x30, 0xC3, 0x06, 0x18, 0x31,
+ 0x81, 0x8C, 0x18, 0x61, 0xCB, 0x16, 0x8F, 0x38, 0x07, 0x19, 0x31, 0x63,
+ 0x62, 0xEC, 0xD0, 0xC0, 0xC0, 0xE6, 0x78, 0x00, 0x38, 0x01, 0x30, 0x0C,
+ 0x00, 0x20, 0x01, 0x80, 0x06, 0x00, 0xFE, 0x00, 0x40, 0x03, 0x00, 0x0C,
+ 0x00, 0x30, 0x00, 0x80, 0x06, 0x00, 0x18, 0x00, 0x60, 0x01, 0x80, 0x04,
+ 0x00, 0x30, 0x00, 0xC0, 0x02, 0x00, 0x90, 0x03, 0x80, 0x00, 0x07, 0xC0,
+ 0xC7, 0x18, 0x61, 0x86, 0x18, 0xE1, 0x8C, 0x07, 0x80, 0x80, 0x1C, 0x00,
+ 0xF0, 0x33, 0x84, 0x18, 0x80, 0x88, 0x08, 0x61, 0x03, 0xE0, 0x1C, 0x00,
+ 0xC0, 0x0C, 0x00, 0xC0, 0x18, 0x01, 0x8E, 0x1B, 0x61, 0xC6, 0x38, 0x63,
+ 0x8C, 0x30, 0xC3, 0x0C, 0x60, 0xC6, 0x1A, 0x61, 0xA4, 0x1C, 0x18, 0xC6,
+ 0x00, 0x0B, 0xC6, 0x23, 0x18, 0x8C, 0x63, 0x5C, 0x01, 0x80, 0xC0, 0x60,
+ 0x00, 0x00, 0x0C, 0x1E, 0x02, 0x03, 0x01, 0x80, 0xC0, 0x40, 0x60, 0x30,
+ 0x18, 0x08, 0x0C, 0x06, 0x02, 0x1B, 0x0F, 0x00, 0x1C, 0x01, 0x80, 0x30,
+ 0x06, 0x01, 0x80, 0x33, 0xC6, 0x30, 0x88, 0x32, 0x06, 0x80, 0xF0, 0x1B,
+ 0x06, 0x60, 0xC4, 0x18, 0xD2, 0x0C, 0x3C, 0x61, 0x86, 0x18, 0xC3, 0x0C,
+ 0x21, 0x86, 0x18, 0x43, 0x2D, 0x38, 0x78, 0xE7, 0x0D, 0xB5, 0x8D, 0x1C,
+ 0xC7, 0x0C, 0x63, 0x8E, 0x31, 0x86, 0x30, 0xC3, 0x18, 0xC1, 0x0C, 0x61,
+ 0x84, 0xB0, 0xC6, 0xB0, 0x63, 0x80, 0x78, 0xE1, 0xB6, 0x14, 0x63, 0x84,
+ 0x38, 0xC3, 0x0C, 0x70, 0x86, 0x18, 0x61, 0x96, 0x1A, 0xC1, 0xC0, 0x0F,
+ 0x06, 0x63, 0x0D, 0x83, 0x60, 0xF0, 0x3C, 0x1B, 0x06, 0xC3, 0x39, 0x87,
+ 0x80, 0x1E, 0xF0, 0x39, 0xC1, 0x86, 0x0C, 0x30, 0xC1, 0x86, 0x0C, 0x30,
+ 0xC3, 0x06, 0x18, 0x60, 0xC6, 0x07, 0xC0, 0x60, 0x03, 0x00, 0x18, 0x00,
+ 0xC0, 0x1F, 0x00, 0x07, 0x81, 0x9C, 0x63, 0x98, 0x76, 0x0C, 0xC1, 0xB0,
+ 0x76, 0x0E, 0xC3, 0x98, 0xB1, 0xE6, 0x00, 0x80, 0x30, 0x06, 0x00, 0xC0,
+ 0xFC, 0x79, 0x8F, 0xC5, 0x07, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x60, 0x30,
+ 0x10, 0x00, 0x1E, 0x98, 0xCC, 0x27, 0x11, 0x80, 0xE0, 0x39, 0x0C, 0x86,
+ 0x62, 0x2E, 0x00, 0x08, 0x67, 0xCC, 0x30, 0xC6, 0x18, 0x61, 0x8C, 0x34,
+ 0xE0, 0xF0, 0xCC, 0x19, 0x83, 0x30, 0xC6, 0x18, 0x87, 0x31, 0x66, 0x3C,
+ 0xCB, 0x1A, 0x6B, 0x8E, 0x00, 0x70, 0xCC, 0x33, 0x04, 0xC2, 0x18, 0x86,
+ 0x41, 0x90, 0x68, 0x1C, 0x06, 0x01, 0x00, 0x61, 0x0F, 0x84, 0x36, 0x30,
+ 0xDC, 0xC1, 0x35, 0x08, 0xD4, 0x23, 0x91, 0x0E, 0x48, 0x30, 0xE0, 0xC3,
+ 0x02, 0x08, 0x00, 0x0C, 0x63, 0x4A, 0x07, 0x00, 0x70, 0x06, 0x00, 0x20,
+ 0x07, 0x00, 0xB0, 0x0B, 0x21, 0x14, 0xE1, 0x80, 0x38, 0x63, 0x0C, 0x30,
+ 0x86, 0x10, 0xC4, 0x0C, 0x81, 0xA0, 0x34, 0x07, 0x00, 0x60, 0x08, 0x02,
+ 0x00, 0x40, 0x10, 0x04, 0x07, 0x00, 0x1F, 0x90, 0x80, 0x80, 0xC0, 0xC0,
+ 0x40, 0x60, 0x60, 0x60, 0x38, 0x3E, 0x03, 0xA0, 0x60, 0x00, 0x83, 0x81,
+ 0x01, 0x80, 0xC0, 0x40, 0x60, 0x30, 0x10, 0x10, 0x1C, 0x06, 0x03, 0x03,
+ 0x01, 0x80, 0xC0, 0x40, 0x60, 0x30, 0x18, 0x07, 0x00, 0xFF, 0xFF, 0x07,
+ 0x00, 0xC0, 0x60, 0x30, 0x10, 0x18, 0x0C, 0x06, 0x06, 0x03, 0x01, 0x80,
+ 0x60, 0x40, 0x60, 0x30, 0x10, 0x18, 0x0C, 0x06, 0x06, 0x06, 0x00, 0x78,
+ 0x18, 0x8C, 0x0F, 0x00 };
+
+const GFXglyph FreeSerifItalic12pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 6, 0, 1 }, // 0x20 ' '
+ { 0, 6, 16, 8, 1, -15 }, // 0x21 '!'
+ { 12, 7, 6, 8, 3, -15 }, // 0x22 '"'
+ { 18, 13, 16, 12, 0, -15 }, // 0x23 '#'
+ { 44, 12, 20, 12, 0, -17 }, // 0x24 '$'
+ { 74, 17, 17, 20, 2, -16 }, // 0x25 '%'
+ { 111, 15, 16, 19, 2, -15 }, // 0x26 '&'
+ { 141, 2, 6, 5, 4, -15 }, // 0x27 '''
+ { 143, 7, 20, 8, 1, -15 }, // 0x28 '('
+ { 161, 7, 20, 8, 0, -15 }, // 0x29 ')'
+ { 179, 8, 10, 12, 4, -15 }, // 0x2A '*'
+ { 189, 11, 11, 16, 2, -10 }, // 0x2B '+'
+ { 205, 3, 6, 6, 0, -2 }, // 0x2C ','
+ { 208, 5, 1, 8, 1, -5 }, // 0x2D '-'
+ { 209, 2, 3, 6, 1, -2 }, // 0x2E '.'
+ { 210, 11, 16, 7, 0, -15 }, // 0x2F '/'
+ { 232, 11, 17, 12, 1, -16 }, // 0x30 '0'
+ { 256, 9, 17, 12, 1, -16 }, // 0x31 '1'
+ { 276, 10, 15, 12, 1, -14 }, // 0x32 '2'
+ { 295, 10, 16, 12, 1, -15 }, // 0x33 '3'
+ { 315, 11, 16, 12, 0, -15 }, // 0x34 '4'
+ { 337, 11, 16, 12, 0, -15 }, // 0x35 '5'
+ { 359, 12, 17, 12, 1, -16 }, // 0x36 '6'
+ { 385, 11, 16, 12, 2, -15 }, // 0x37 '7'
+ { 407, 11, 17, 12, 1, -16 }, // 0x38 '8'
+ { 431, 11, 17, 12, 1, -16 }, // 0x39 '9'
+ { 455, 4, 11, 6, 1, -10 }, // 0x3A ':'
+ { 461, 5, 14, 6, 0, -10 }, // 0x3B ';'
+ { 470, 12, 13, 14, 1, -12 }, // 0x3C '<'
+ { 490, 12, 6, 16, 2, -8 }, // 0x3D '='
+ { 499, 12, 13, 14, 2, -12 }, // 0x3E '>'
+ { 519, 9, 16, 11, 3, -15 }, // 0x3F '?'
+ { 537, 16, 16, 19, 2, -15 }, // 0x40 '@'
+ { 569, 15, 15, 16, 0, -14 }, // 0x41 'A'
+ { 598, 14, 16, 14, 0, -15 }, // 0x42 'B'
+ { 626, 16, 16, 15, 1, -15 }, // 0x43 'C'
+ { 658, 16, 16, 17, 0, -15 }, // 0x44 'D'
+ { 690, 16, 16, 14, 0, -15 }, // 0x45 'E'
+ { 722, 16, 16, 14, 0, -15 }, // 0x46 'F'
+ { 754, 16, 16, 17, 1, -15 }, // 0x47 'G'
+ { 786, 19, 16, 17, 0, -15 }, // 0x48 'H'
+ { 824, 9, 16, 8, 0, -15 }, // 0x49 'I'
+ { 842, 12, 16, 10, 0, -15 }, // 0x4A 'J'
+ { 866, 17, 16, 15, 0, -15 }, // 0x4B 'K'
+ { 900, 14, 16, 14, 0, -15 }, // 0x4C 'L'
+ { 928, 21, 16, 20, 0, -15 }, // 0x4D 'M'
+ { 970, 18, 16, 16, 0, -15 }, // 0x4E 'N'
+ { 1006, 15, 16, 16, 1, -15 }, // 0x4F 'O'
+ { 1036, 14, 16, 14, 0, -15 }, // 0x50 'P'
+ { 1064, 15, 20, 16, 1, -15 }, // 0x51 'Q'
+ { 1102, 14, 16, 15, 0, -15 }, // 0x52 'R'
+ { 1130, 12, 16, 11, 0, -15 }, // 0x53 'S'
+ { 1154, 15, 16, 14, 2, -15 }, // 0x54 'T'
+ { 1184, 16, 16, 17, 3, -15 }, // 0x55 'U'
+ { 1216, 15, 16, 16, 3, -15 }, // 0x56 'V'
+ { 1246, 20, 16, 21, 3, -15 }, // 0x57 'W'
+ { 1286, 16, 16, 16, 0, -15 }, // 0x58 'X'
+ { 1318, 13, 16, 14, 3, -15 }, // 0x59 'Y'
+ { 1344, 15, 16, 14, 0, -15 }, // 0x5A 'Z'
+ { 1374, 8, 20, 9, 1, -15 }, // 0x5B '['
+ { 1394, 8, 16, 12, 3, -15 }, // 0x5C '\'
+ { 1410, 7, 20, 9, 1, -15 }, // 0x5D ']'
+ { 1428, 10, 9, 10, 0, -15 }, // 0x5E '^'
+ { 1440, 12, 1, 12, 0, 3 }, // 0x5F '_'
+ { 1442, 4, 4, 6, 3, -15 }, // 0x60 '`'
+ { 1444, 12, 11, 12, 0, -10 }, // 0x61 'a'
+ { 1461, 10, 16, 11, 1, -15 }, // 0x62 'b'
+ { 1481, 9, 11, 10, 1, -10 }, // 0x63 'c'
+ { 1494, 13, 16, 12, 0, -15 }, // 0x64 'd'
+ { 1520, 8, 11, 10, 1, -10 }, // 0x65 'e'
+ { 1531, 14, 22, 10, -2, -16 }, // 0x66 'f'
+ { 1570, 12, 16, 11, -1, -10 }, // 0x67 'g'
+ { 1594, 12, 16, 12, 0, -15 }, // 0x68 'h'
+ { 1618, 5, 16, 6, 1, -15 }, // 0x69 'i'
+ { 1628, 9, 21, 7, -2, -15 }, // 0x6A 'j'
+ { 1652, 11, 16, 11, 0, -15 }, // 0x6B 'k'
+ { 1674, 6, 16, 6, 1, -15 }, // 0x6C 'l'
+ { 1686, 17, 11, 17, 0, -10 }, // 0x6D 'm'
+ { 1710, 12, 11, 12, 0, -10 }, // 0x6E 'n'
+ { 1727, 10, 11, 11, 1, -10 }, // 0x6F 'o'
+ { 1741, 13, 16, 11, -2, -10 }, // 0x70 'p'
+ { 1767, 11, 16, 12, 0, -10 }, // 0x71 'q'
+ { 1789, 9, 11, 9, 0, -10 }, // 0x72 'r'
+ { 1802, 9, 11, 8, 0, -10 }, // 0x73 's'
+ { 1815, 6, 13, 6, 1, -12 }, // 0x74 't'
+ { 1825, 11, 11, 12, 1, -10 }, // 0x75 'u'
+ { 1841, 10, 11, 11, 1, -10 }, // 0x76 'v'
+ { 1855, 14, 11, 16, 2, -10 }, // 0x77 'w'
+ { 1875, 12, 11, 10, -1, -10 }, // 0x78 'x'
+ { 1892, 11, 16, 11, 0, -10 }, // 0x79 'y'
+ { 1914, 9, 13, 9, 0, -10 }, // 0x7A 'z'
+ { 1929, 9, 21, 10, 1, -16 }, // 0x7B '{'
+ { 1953, 1, 16, 7, 3, -15 }, // 0x7C '|'
+ { 1955, 9, 21, 10, 0, -16 }, // 0x7D '}'
+ { 1979, 11, 3, 13, 1, -6 } }; // 0x7E '~'
+
+const GFXfont FreeSerifItalic12pt7b PROGMEM = {
+ (uint8_t *)FreeSerifItalic12pt7bBitmaps,
+ (GFXglyph *)FreeSerifItalic12pt7bGlyphs,
+ 0x20, 0x7E, 29 };
+
+// Approx. 2656 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifItalic18pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifItalic18pt7b.h
new file mode 100644
index 000000000000..666ae7eb27c1
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifItalic18pt7b.h
@@ -0,0 +1,450 @@
+const uint8_t FreeSerifItalic18pt7bBitmaps[] PROGMEM = {
+ 0x01, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0x81, 0xE0, 0x70, 0x1C, 0x06, 0x01,
+ 0x80, 0xC0, 0x30, 0x0C, 0x02, 0x01, 0x80, 0x40, 0x10, 0x00, 0x00, 0x01,
+ 0x80, 0xF0, 0x3C, 0x06, 0x00, 0x38, 0x77, 0x8F, 0x78, 0xF7, 0x0E, 0x60,
+ 0xE6, 0x0C, 0xC1, 0x8C, 0x18, 0x81, 0x00, 0x00, 0x60, 0xC0, 0x0C, 0x38,
+ 0x03, 0x86, 0x00, 0x60, 0xC0, 0x0C, 0x38, 0x03, 0x06, 0x00, 0x60, 0xC0,
+ 0xFF, 0xFF, 0x1F, 0xFF, 0xE0, 0x61, 0xC0, 0x1C, 0x30, 0x03, 0x06, 0x00,
+ 0x61, 0xC0, 0x18, 0x30, 0x3F, 0xFF, 0xC7, 0xFF, 0xF8, 0x18, 0x30, 0x03,
+ 0x0E, 0x00, 0xE1, 0x80, 0x18, 0x30, 0x03, 0x0C, 0x00, 0xC1, 0x80, 0x18,
+ 0x70, 0x00, 0x00, 0x08, 0x00, 0x30, 0x00, 0x40, 0x0F, 0xC0, 0x61, 0xE1,
+ 0x86, 0xC6, 0x0D, 0x8C, 0x1A, 0x18, 0x24, 0x38, 0xC0, 0x39, 0x80, 0x7F,
+ 0x00, 0x7E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xDC, 0x03, 0x38,
+ 0x06, 0x32, 0x0C, 0x64, 0x18, 0xDC, 0x71, 0xB8, 0xC6, 0x39, 0x8C, 0x3F,
+ 0x30, 0x1F, 0x80, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0x07, 0x80, 0x60,
+ 0x0F, 0xE0, 0xE0, 0x0F, 0x0F, 0xB0, 0x0E, 0x04, 0x30, 0x07, 0x02, 0x18,
+ 0x07, 0x01, 0x18, 0x03, 0x00, 0x8C, 0x01, 0x80, 0x8C, 0x00, 0xC0, 0x4C,
+ 0x00, 0x60, 0x66, 0x1F, 0x30, 0x66, 0x1F, 0xCC, 0x63, 0x1C, 0x67, 0xE3,
+ 0x1C, 0x19, 0xE1, 0x1C, 0x04, 0x01, 0x8C, 0x02, 0x00, 0x8E, 0x01, 0x00,
+ 0xC7, 0x00, 0x80, 0xC3, 0x00, 0x80, 0x61, 0x80, 0xC0, 0x60, 0xC0, 0xC0,
+ 0x20, 0x70, 0xE0, 0x30, 0x1F, 0xC0, 0x10, 0x07, 0xC0, 0x00, 0x1E, 0x00,
+ 0x00, 0xFC, 0x00, 0x07, 0x18, 0x00, 0x18, 0x60, 0x00, 0xE1, 0x80, 0x03,
+ 0x8C, 0x00, 0x0E, 0x60, 0x00, 0x3B, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80,
+ 0x00, 0x7F, 0x1F, 0xC3, 0x3C, 0x1C, 0x38, 0x70, 0x61, 0xE1, 0xE3, 0x87,
+ 0x07, 0x8C, 0x3C, 0x0F, 0x60, 0xF0, 0x3D, 0x03, 0xC0, 0x78, 0x0F, 0x01,
+ 0xE0, 0x3E, 0x07, 0xC0, 0x7C, 0x77, 0x84, 0xFF, 0x8F, 0xE1, 0xF8, 0x0F,
+ 0x00, 0x3B, 0xDE, 0xE7, 0x33, 0x18, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80,
+ 0xC0, 0xC0, 0xE0, 0x60, 0x70, 0x38, 0x18, 0x0C, 0x0E, 0x07, 0x03, 0x01,
+ 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x01, 0x00, 0x80, 0x40, 0x30,
+ 0x08, 0x04, 0x02, 0x00, 0x04, 0x01, 0x00, 0x80, 0x60, 0x10, 0x08, 0x04,
+ 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x0E, 0x07, 0x03, 0x81,
+ 0x80, 0xC0, 0xE0, 0x60, 0x30, 0x30, 0x18, 0x18, 0x08, 0x08, 0x08, 0x08,
+ 0x00, 0x06, 0x00, 0x60, 0x06, 0x0C, 0x43, 0xE4, 0xF1, 0x58, 0x0E, 0x00,
+ 0xF0, 0x74, 0xEE, 0x47, 0xC4, 0x30, 0x60, 0x06, 0x00, 0x60, 0x01, 0x80,
+ 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
+ 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
+ 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x31, 0xCE,
+ 0x31, 0x08, 0x98, 0xFF, 0xFF, 0x6F, 0xF6, 0x00, 0x06, 0x00, 0x0E, 0x00,
+ 0x0C, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x30, 0x00, 0x70, 0x00, 0x60, 0x00,
+ 0xE0, 0x00, 0xC0, 0x01, 0xC0, 0x03, 0x80, 0x03, 0x00, 0x07, 0x00, 0x06,
+ 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x30, 0x00, 0x70,
+ 0x00, 0x60, 0x00, 0xE0, 0x00, 0x00, 0x78, 0x00, 0xC3, 0x00, 0xC1, 0xC0,
+ 0xC0, 0x60, 0xE0, 0x30, 0xE0, 0x1C, 0x70, 0x0E, 0x70, 0x07, 0x38, 0x03,
+ 0xBC, 0x01, 0xDC, 0x01, 0xEE, 0x00, 0xFF, 0x00, 0x7F, 0x80, 0x3B, 0x80,
+ 0x1D, 0xC0, 0x1E, 0xE0, 0x0E, 0x70, 0x0F, 0x38, 0x07, 0x1C, 0x07, 0x06,
+ 0x03, 0x83, 0x83, 0x80, 0xC3, 0x00, 0x1F, 0x00, 0x00, 0xF0, 0x7F, 0x00,
+ 0x70, 0x07, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x01, 0xC0, 0x1C, 0x01,
+ 0xC0, 0x38, 0x03, 0x80, 0x38, 0x03, 0x80, 0x70, 0x07, 0x00, 0x70, 0x0E,
+ 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x1E, 0x0F, 0xF8, 0x01, 0xF0, 0x07, 0xFC,
+ 0x0C, 0x3E, 0x10, 0x1F, 0x20, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F,
+ 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x30, 0x00, 0x70, 0x00, 0xE0,
+ 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x04,
+ 0x30, 0x0C, 0x7F, 0xF8, 0xFF, 0xF0, 0x00, 0x7C, 0x00, 0xFF, 0x00, 0xC3,
+ 0xC0, 0x80, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1C, 0x00, 0x1C, 0x00,
+ 0x38, 0x00, 0xF0, 0x03, 0xFC, 0x00, 0x1F, 0x00, 0x03, 0xC0, 0x01, 0xE0,
+ 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x06, 0x00, 0x07,
+ 0x00, 0x03, 0x07, 0x87, 0x03, 0xFF, 0x00, 0xFC, 0x00, 0x00, 0x01, 0x80,
+ 0x01, 0x80, 0x01, 0xC0, 0x01, 0xE0, 0x01, 0xF0, 0x01, 0xB0, 0x01, 0xB8,
+ 0x01, 0x9C, 0x01, 0x8C, 0x00, 0x86, 0x00, 0x87, 0x00, 0x83, 0x80, 0x81,
+ 0x80, 0x81, 0xC0, 0xC0, 0xE0, 0xC0, 0x70, 0xFF, 0xFF, 0x7F, 0xFF, 0x00,
+ 0x1C, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0x80,
+ 0x01, 0xFF, 0x01, 0xFF, 0x02, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00,
+ 0x0F, 0xC0, 0x0F, 0xF0, 0x00, 0xF8, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x1C,
+ 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x18,
+ 0x00, 0x30, 0x00, 0x30, 0x70, 0xE0, 0xFF, 0x80, 0x7E, 0x00, 0x00, 0x03,
+ 0x80, 0x1F, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38,
+ 0x00, 0x3C, 0x00, 0x3D, 0xF0, 0x1F, 0xFE, 0x1F, 0x0F, 0x8E, 0x03, 0xC7,
+ 0x00, 0xF7, 0x00, 0x7B, 0x80, 0x3D, 0x80, 0x1E, 0xC0, 0x0F, 0x60, 0x0F,
+ 0xB0, 0x07, 0x98, 0x03, 0xC4, 0x03, 0xC3, 0x03, 0xC0, 0xC3, 0x80, 0x1F,
+ 0x00, 0x3F, 0xFF, 0x7F, 0xFE, 0x40, 0x0E, 0x80, 0x0C, 0x00, 0x18, 0x00,
+ 0x18, 0x00, 0x30, 0x00, 0x70, 0x00, 0x60, 0x00, 0xC0, 0x01, 0xC0, 0x01,
+ 0x80, 0x03, 0x80, 0x03, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x1C,
+ 0x00, 0x18, 0x00, 0x30, 0x00, 0x70, 0x00, 0x60, 0x00, 0xE0, 0x00, 0x00,
+ 0xF8, 0x03, 0x0E, 0x06, 0x06, 0x0C, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0x0C,
+ 0x03, 0x0E, 0x06, 0x07, 0x8E, 0x07, 0xD8, 0x03, 0xE0, 0x07, 0xF0, 0x1C,
+ 0xF8, 0x30, 0x3C, 0x60, 0x1C, 0x60, 0x0E, 0xC0, 0x06, 0xC0, 0x06, 0xC0,
+ 0x06, 0xC0, 0x06, 0xE0, 0x0C, 0x60, 0x18, 0x38, 0x30, 0x0F, 0xC0, 0x01,
+ 0xF8, 0x07, 0x8C, 0x0E, 0x06, 0x1E, 0x02, 0x3C, 0x03, 0x3C, 0x03, 0x78,
+ 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x07, 0x78, 0x07, 0x78, 0x07, 0x3C,
+ 0x0E, 0x3E, 0x1E, 0x1F, 0xEE, 0x07, 0x9C, 0x00, 0x38, 0x00, 0x78, 0x00,
+ 0x70, 0x01, 0xE0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xE0, 0x00, 0x0C,
+ 0x3C, 0x78, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x1E, 0x18,
+ 0x00, 0x07, 0x03, 0xC1, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x02, 0x03, 0x81, 0xC0, 0xE0, 0x30, 0x10, 0x10, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0xC0, 0x01, 0xF0, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF0, 0x01,
+ 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xE0,
+ 0x00, 0x7E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xF0, 0x00, 0x3F,
+ 0x00, 0x03, 0xC0, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xC0, 0xC0, 0x00, 0x3C, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07,
+ 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3F, 0x00, 0x03, 0xC0, 0x01,
+ 0xF0, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF0, 0x01, 0xF0, 0x03, 0xF0, 0x03,
+ 0xF0, 0x00, 0xF0, 0x00, 0x20, 0x00, 0x00, 0x0F, 0x81, 0x86, 0x30, 0x33,
+ 0x03, 0x30, 0x30, 0x03, 0x00, 0x60, 0x0E, 0x01, 0xC0, 0x38, 0x06, 0x00,
+ 0xC0, 0x08, 0x01, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+ 0x00, 0xF0, 0x0F, 0x00, 0x60, 0x00, 0x00, 0x7F, 0x00, 0x03, 0xFF, 0xE0,
+ 0x07, 0x80, 0xF0, 0x0E, 0x00, 0x38, 0x1C, 0x00, 0x0C, 0x38, 0x0E, 0x06,
+ 0x70, 0x3F, 0xE2, 0x70, 0x71, 0xE3, 0xF0, 0x60, 0xE1, 0xE0, 0xC0, 0xC1,
+ 0xE0, 0xC0, 0xC1, 0xE1, 0x81, 0xC1, 0xE1, 0x81, 0xC1, 0xE1, 0x81, 0x82,
+ 0xE1, 0x83, 0x82, 0x71, 0x83, 0x86, 0x71, 0xC7, 0x8C, 0x38, 0xF9, 0xF8,
+ 0x3C, 0xF0, 0xF0, 0x1E, 0x00, 0x00, 0x0F, 0x80, 0x30, 0x03, 0xFF, 0xE0,
+ 0x00, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x01, 0xC0, 0x00,
+ 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x5E, 0x00, 0x04, 0xF0,
+ 0x00, 0x63, 0x80, 0x02, 0x1C, 0x00, 0x20, 0xE0, 0x01, 0x07, 0x00, 0x10,
+ 0x3C, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0xC0, 0x38, 0x04, 0x01, 0xC0,
+ 0x60, 0x0E, 0x06, 0x00, 0x78, 0x30, 0x03, 0xC3, 0x00, 0x1E, 0x38, 0x00,
+ 0xFB, 0xF0, 0x1F, 0xE0, 0x07, 0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x78, 0x3C,
+ 0x03, 0xC0, 0xF0, 0x1E, 0x07, 0x80, 0xE0, 0x3C, 0x07, 0x01, 0xE0, 0x78,
+ 0x1E, 0x03, 0x83, 0xE0, 0x1F, 0xF8, 0x01, 0xFF, 0xC0, 0x0F, 0x0F, 0x00,
+ 0x70, 0x3C, 0x03, 0x80, 0xF0, 0x3C, 0x07, 0x81, 0xC0, 0x3C, 0x0E, 0x01,
+ 0xE0, 0xF0, 0x0F, 0x07, 0x80, 0xF0, 0x38, 0x0F, 0x81, 0xC1, 0xF8, 0x1F,
+ 0xFF, 0x83, 0xFF, 0xE0, 0x00, 0x00, 0x3F, 0x08, 0x07, 0xFF, 0xC0, 0xF8,
+ 0x3E, 0x0F, 0x00, 0x70, 0xF0, 0x03, 0x8F, 0x00, 0x08, 0xF0, 0x00, 0x47,
+ 0x80, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00,
+ 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0,
+ 0x00, 0x03, 0x80, 0x02, 0x1E, 0x00, 0x20, 0x78, 0x02, 0x03, 0xE0, 0x60,
+ 0x07, 0xFE, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xFF, 0xC0, 0x00, 0xFF, 0xFC,
+ 0x00, 0x78, 0x1F, 0x00, 0x3C, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x0E, 0x00,
+ 0x78, 0x07, 0x00, 0x1E, 0x07, 0x80, 0x0F, 0x03, 0x80, 0x07, 0x81, 0xC0,
+ 0x03, 0xC1, 0xE0, 0x01, 0xE0, 0xF0, 0x00, 0xF0, 0x70, 0x00, 0x78, 0x38,
+ 0x00, 0x78, 0x3C, 0x00, 0x3C, 0x1E, 0x00, 0x3E, 0x0E, 0x00, 0x1E, 0x0F,
+ 0x00, 0x1E, 0x07, 0x80, 0x1E, 0x03, 0x80, 0x3E, 0x01, 0xC0, 0x7E, 0x01,
+ 0xFF, 0xFC, 0x03, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFC, 0x07, 0xFF, 0xF0,
+ 0x1E, 0x01, 0xC0, 0x78, 0x02, 0x01, 0xE0, 0x08, 0x07, 0x00, 0x00, 0x1C,
+ 0x08, 0x00, 0xF0, 0x60, 0x03, 0x83, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0xF0,
+ 0x01, 0xE0, 0xC0, 0x07, 0x03, 0x00, 0x1C, 0x08, 0x00, 0xF0, 0x20, 0x03,
+ 0x80, 0x00, 0x0E, 0x00, 0x00, 0x78, 0x00, 0x81, 0xE0, 0x06, 0x07, 0x00,
+ 0x38, 0x1C, 0x03, 0xC0, 0xFF, 0xFF, 0x0F, 0xFF, 0xFC, 0x00, 0x07, 0xFF,
+ 0xFC, 0x07, 0xFF, 0xF0, 0x1E, 0x01, 0xC0, 0x78, 0x02, 0x01, 0xE0, 0x08,
+ 0x07, 0x00, 0x20, 0x1C, 0x00, 0x00, 0xF0, 0x20, 0x03, 0x81, 0x80, 0x0E,
+ 0x0C, 0x00, 0x7F, 0xF0, 0x01, 0xFF, 0xC0, 0x07, 0x03, 0x00, 0x1C, 0x0C,
+ 0x00, 0xF0, 0x20, 0x03, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x78, 0x00, 0x01,
+ 0xE0, 0x00, 0x07, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xF8, 0x00, 0x0F, 0xF8,
+ 0x00, 0x00, 0x00, 0x3F, 0x02, 0x01, 0xFF, 0x88, 0x0F, 0x81, 0xF0, 0x3C,
+ 0x01, 0xE0, 0xF0, 0x01, 0xC3, 0xC0, 0x01, 0x0F, 0x80, 0x02, 0x1E, 0x00,
+ 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x07, 0xC0, 0x00,
+ 0x0F, 0x00, 0x3F, 0xFE, 0x00, 0x1E, 0x3C, 0x00, 0x38, 0x78, 0x00, 0x70,
+ 0xF0, 0x00, 0xE0, 0xE0, 0x01, 0xC1, 0xE0, 0x07, 0x01, 0xE0, 0x0E, 0x01,
+ 0xF0, 0x3C, 0x01, 0xFF, 0xF0, 0x00, 0xFF, 0x00, 0x00, 0x07, 0xFC, 0x3F,
+ 0xE0, 0x3E, 0x00, 0xF0, 0x07, 0x80, 0x1C, 0x00, 0xF0, 0x03, 0x80, 0x1C,
+ 0x00, 0xF0, 0x03, 0x80, 0x1E, 0x00, 0x70, 0x03, 0x80, 0x1E, 0x00, 0x70,
+ 0x03, 0x80, 0x1E, 0x00, 0x70, 0x03, 0x80, 0x1F, 0xFF, 0xF0, 0x03, 0xFF,
+ 0xFE, 0x00, 0x70, 0x03, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0xC0, 0x0E, 0x00,
+ 0x70, 0x03, 0xC0, 0x0E, 0x00, 0x78, 0x03, 0xC0, 0x0E, 0x00, 0x78, 0x01,
+ 0xC0, 0x0E, 0x00, 0x78, 0x01, 0xC0, 0x0E, 0x00, 0x78, 0x03, 0xE0, 0x3F,
+ 0xE1, 0xFF, 0x00, 0x07, 0xFC, 0x07, 0xC0, 0x1E, 0x00, 0x78, 0x01, 0xC0,
+ 0x07, 0x00, 0x1C, 0x00, 0xF0, 0x03, 0x80, 0x0E, 0x00, 0x78, 0x01, 0xE0,
+ 0x07, 0x00, 0x1C, 0x00, 0xF0, 0x03, 0x80, 0x0E, 0x00, 0x78, 0x01, 0xE0,
+ 0x07, 0x00, 0x1C, 0x00, 0xF0, 0x0F, 0xF8, 0x00, 0x00, 0xFF, 0x80, 0x0F,
+ 0x00, 0x07, 0x80, 0x03, 0x80, 0x01, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00,
+ 0x70, 0x00, 0x38, 0x00, 0x3C, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x0F, 0x00,
+ 0x07, 0x80, 0x03, 0x80, 0x01, 0xC0, 0x01, 0xE0, 0x00, 0xE0, 0x00, 0x70,
+ 0x1E, 0x78, 0x0F, 0x38, 0x07, 0xF8, 0x01, 0xF0, 0x00, 0x07, 0xFC, 0x7F,
+ 0x80, 0xF8, 0x0F, 0x00, 0x38, 0x07, 0x00, 0x3C, 0x07, 0x00, 0x1C, 0x06,
+ 0x00, 0x0E, 0x06, 0x00, 0x07, 0x0C, 0x00, 0x07, 0x8C, 0x00, 0x03, 0x9C,
+ 0x00, 0x01, 0xD8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x73,
+ 0x80, 0x00, 0x39, 0xE0, 0x00, 0x3C, 0x78, 0x00, 0x1C, 0x1C, 0x00, 0x0E,
+ 0x0F, 0x00, 0x07, 0x03, 0x80, 0x07, 0x81, 0xE0, 0x03, 0x80, 0x70, 0x01,
+ 0xC0, 0x3C, 0x01, 0xE0, 0x1F, 0x03, 0xFE, 0x3F, 0xE0, 0x07, 0xFC, 0x00,
+ 0x1F, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00,
+ 0x01, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x07, 0x80,
+ 0x00, 0x78, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x0F, 0x00, 0x00, 0xE0,
+ 0x00, 0x0E, 0x00, 0x11, 0xE0, 0x03, 0x1E, 0x00, 0x61, 0xC0, 0x06, 0x1C,
+ 0x01, 0xE3, 0xFF, 0xFC, 0xFF, 0xFF, 0xC0, 0x07, 0xF0, 0x00, 0x7E, 0x03,
+ 0xE0, 0x01, 0xF0, 0x03, 0xC0, 0x03, 0xE0, 0x07, 0x80, 0x0F, 0x80, 0x1F,
+ 0x00, 0x37, 0x00, 0x2E, 0x00, 0x5E, 0x00, 0x5C, 0x01, 0xB8, 0x01, 0xB8,
+ 0x06, 0x70, 0x02, 0x78, 0x09, 0xE0, 0x04, 0x70, 0x33, 0xC0, 0x08, 0xE0,
+ 0xC7, 0x00, 0x31, 0xC1, 0x0E, 0x00, 0x43, 0x86, 0x3C, 0x00, 0x87, 0x18,
+ 0x70, 0x03, 0x0E, 0x20, 0xE0, 0x06, 0x1C, 0xC3, 0xC0, 0x08, 0x3B, 0x07,
+ 0x80, 0x10, 0x7C, 0x0E, 0x00, 0x60, 0x78, 0x1C, 0x00, 0x80, 0xE0, 0x78,
+ 0x03, 0x01, 0x80, 0xF0, 0x07, 0x03, 0x03, 0xE0, 0x3F, 0x84, 0x1F, 0xF0,
+ 0x00, 0x07, 0xC0, 0x3F, 0xC0, 0x78, 0x03, 0xE0, 0x0E, 0x00, 0x70, 0x03,
+ 0xC0, 0x18, 0x01, 0xF0, 0x0E, 0x00, 0x6C, 0x03, 0x00, 0x1B, 0x80, 0xC0,
+ 0x0C, 0xE0, 0x30, 0x03, 0x18, 0x1C, 0x00, 0xC7, 0x06, 0x00, 0x30, 0xC1,
+ 0x80, 0x18, 0x38, 0xE0, 0x06, 0x06, 0x30, 0x01, 0x81, 0x8C, 0x00, 0xC0,
+ 0x73, 0x00, 0x30, 0x0D, 0xC0, 0x0C, 0x03, 0xE0, 0x03, 0x00, 0x78, 0x01,
+ 0x80, 0x1E, 0x00, 0x60, 0x07, 0x00, 0x38, 0x00, 0xC0, 0x0E, 0x00, 0x30,
+ 0x0F, 0xE0, 0x04, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0xE0, 0x07, 0xC1,
+ 0xE0, 0x1E, 0x01, 0xE0, 0x78, 0x01, 0xC1, 0xE0, 0x03, 0xC7, 0x80, 0x07,
+ 0x9F, 0x00, 0x0F, 0x3C, 0x00, 0x1E, 0xF8, 0x00, 0x3D, 0xE0, 0x00, 0xFF,
+ 0xC0, 0x01, 0xEF, 0x80, 0x03, 0xDE, 0x00, 0x0F, 0xBC, 0x00, 0x1E, 0x78,
+ 0x00, 0x7C, 0xF0, 0x00, 0xF1, 0xE0, 0x03, 0xC1, 0xC0, 0x0F, 0x03, 0xC0,
+ 0x3C, 0x03, 0xC1, 0xF0, 0x03, 0xFF, 0x80, 0x01, 0xFC, 0x00, 0x00, 0x07,
+ 0xFF, 0xC0, 0x07, 0xFF, 0xC0, 0x0E, 0x0F, 0x80, 0x78, 0x1F, 0x01, 0xC0,
+ 0x3C, 0x07, 0x00, 0xF0, 0x1C, 0x03, 0xC0, 0xF0, 0x0F, 0x03, 0x80, 0x78,
+ 0x0E, 0x01, 0xE0, 0x78, 0x1F, 0x01, 0xFF, 0xF8, 0x07, 0x7F, 0x00, 0x1C,
+ 0x00, 0x00, 0xF0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x78, 0x00,
+ 0x01, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xF0, 0x00, 0x0F,
+ 0xF0, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0xE0, 0x03, 0xC1, 0xE0,
+ 0x1E, 0x01, 0xC0, 0x78, 0x03, 0xC1, 0xE0, 0x03, 0x87, 0x80, 0x07, 0x8F,
+ 0x00, 0x0F, 0x3C, 0x00, 0x1E, 0x78, 0x00, 0x3D, 0xE0, 0x00, 0x7B, 0xC0,
+ 0x01, 0xFF, 0x80, 0x03, 0xDE, 0x00, 0x07, 0xBC, 0x00, 0x1F, 0x78, 0x00,
+ 0x3C, 0xF0, 0x00, 0xF1, 0xE0, 0x01, 0xE3, 0xC0, 0x07, 0x83, 0x80, 0x1E,
+ 0x07, 0x80, 0x78, 0x07, 0x01, 0xC0, 0x03, 0xDE, 0x00, 0x01, 0xC0, 0x00,
+ 0x06, 0x00, 0x00, 0x18, 0x00, 0x10, 0x7F, 0xC0, 0xC3, 0xFF, 0xFF, 0x08,
+ 0x07, 0xF0, 0x00, 0x07, 0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x78, 0x3C, 0x03,
+ 0xC0, 0xF0, 0x1E, 0x07, 0x80, 0xE0, 0x3C, 0x07, 0x01, 0xE0, 0x78, 0x1E,
+ 0x03, 0x83, 0xF0, 0x1F, 0xFE, 0x01, 0xFF, 0xC0, 0x0F, 0x38, 0x00, 0x71,
+ 0xE0, 0x03, 0x87, 0x00, 0x3C, 0x38, 0x01, 0xC1, 0xE0, 0x0E, 0x07, 0x00,
+ 0xF0, 0x3C, 0x07, 0x81, 0xE0, 0x38, 0x07, 0x01, 0xC0, 0x3C, 0x1E, 0x00,
+ 0xF3, 0xFC, 0x07, 0xC0, 0x00, 0xF8, 0x81, 0xFF, 0xC1, 0xE1, 0xE1, 0xE0,
+ 0x70, 0xF0, 0x10, 0x78, 0x08, 0x3C, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x01,
+ 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF8,
+ 0x80, 0x3C, 0x40, 0x1E, 0x20, 0x0F, 0x38, 0x07, 0x9E, 0x07, 0x8F, 0x87,
+ 0x84, 0x7F, 0xC2, 0x0F, 0x80, 0x3F, 0xFF, 0xF7, 0xFF, 0xFF, 0x70, 0x78,
+ 0x76, 0x07, 0x02, 0xC0, 0x70, 0x28, 0x0F, 0x02, 0x00, 0xF0, 0x00, 0x0E,
+ 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x03,
+ 0xC0, 0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x07, 0x80, 0x00,
+ 0x70, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x01, 0xF0, 0x00,
+ 0xFF, 0xE0, 0x00, 0x7F, 0xE0, 0xFE, 0x3F, 0x00, 0x78, 0x3C, 0x00, 0x60,
+ 0xF0, 0x01, 0x81, 0xE0, 0x03, 0x03, 0xC0, 0x06, 0x07, 0x00, 0x08, 0x1E,
+ 0x00, 0x30, 0x3C, 0x00, 0x60, 0x70, 0x00, 0x81, 0xE0, 0x01, 0x03, 0xC0,
+ 0x06, 0x07, 0x80, 0x0C, 0x0E, 0x00, 0x10, 0x3C, 0x00, 0x60, 0x78, 0x00,
+ 0xC0, 0xF0, 0x01, 0x01, 0xE0, 0x06, 0x03, 0xC0, 0x08, 0x03, 0xC0, 0x30,
+ 0x07, 0xC1, 0xC0, 0x07, 0xFF, 0x00, 0x03, 0xF8, 0x00, 0x00, 0xFF, 0x01,
+ 0xFB, 0xE0, 0x07, 0x8E, 0x00, 0x18, 0x78, 0x01, 0x83, 0xC0, 0x0C, 0x1E,
+ 0x00, 0xC0, 0xF0, 0x06, 0x03, 0x80, 0x60, 0x1C, 0x02, 0x00, 0xE0, 0x30,
+ 0x07, 0x83, 0x00, 0x3C, 0x10, 0x01, 0xE1, 0x80, 0x07, 0x08, 0x00, 0x38,
+ 0x80, 0x01, 0xC4, 0x00, 0x0E, 0x40, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00,
+ 0x0E, 0x00, 0x00, 0x70, 0x00, 0x03, 0x00, 0x00, 0x10, 0x00, 0x00, 0xFF,
+ 0x3F, 0xC3, 0xFB, 0xE0, 0x78, 0x07, 0x8E, 0x03, 0xC0, 0x18, 0x78, 0x0E,
+ 0x01, 0x83, 0xC0, 0x70, 0x0C, 0x1E, 0x03, 0x80, 0x40, 0xF0, 0x3C, 0x06,
+ 0x03, 0x81, 0xE0, 0x60, 0x1C, 0x17, 0x83, 0x00, 0xE0, 0xBC, 0x30, 0x07,
+ 0x09, 0xE1, 0x00, 0x38, 0x47, 0x18, 0x01, 0xE4, 0x38, 0x80, 0x0F, 0x21,
+ 0xCC, 0x00, 0x7A, 0x0E, 0x40, 0x01, 0xD0, 0x76, 0x00, 0x0F, 0x03, 0xA0,
+ 0x00, 0x78, 0x1F, 0x00, 0x03, 0x80, 0xF0, 0x00, 0x1C, 0x07, 0x00, 0x00,
+ 0xC0, 0x38, 0x00, 0x06, 0x00, 0x80, 0x00, 0x20, 0x04, 0x00, 0x00, 0x0F,
+ 0xF8, 0x7F, 0x03, 0xE0, 0x3E, 0x01, 0xC0, 0x18, 0x01, 0xE0, 0x30, 0x01,
+ 0xE0, 0x60, 0x00, 0xE0, 0xC0, 0x00, 0xF1, 0xC0, 0x00, 0x71, 0x80, 0x00,
+ 0x7B, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00,
+ 0x3C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xCE, 0x00, 0x01, 0x8F, 0x00, 0x01,
+ 0x07, 0x00, 0x03, 0x07, 0x00, 0x06, 0x07, 0x80, 0x0C, 0x03, 0x80, 0x18,
+ 0x03, 0xC0, 0x78, 0x03, 0xE0, 0xFE, 0x1F, 0xF8, 0xFF, 0x87, 0xE7, 0xC0,
+ 0x38, 0x70, 0x06, 0x0E, 0x01, 0x81, 0xE0, 0x30, 0x1C, 0x0C, 0x03, 0x83,
+ 0x00, 0x78, 0xC0, 0x07, 0x30, 0x00, 0xE4, 0x00, 0x1D, 0x80, 0x03, 0xE0,
+ 0x00, 0x38, 0x00, 0x0F, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00,
+ 0x01, 0xE0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x01, 0xE0, 0x00, 0x7C, 0x00,
+ 0x3F, 0xF0, 0x00, 0x07, 0xFF, 0xFC, 0x3F, 0xFF, 0xE0, 0xE0, 0x0F, 0x82,
+ 0x00, 0x3C, 0x18, 0x01, 0xE0, 0x40, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03,
+ 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00,
+ 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xF0, 0x00, 0x07,
+ 0x80, 0x00, 0x3C, 0x00, 0xC1, 0xE0, 0x02, 0x0F, 0x00, 0x18, 0x38, 0x01,
+ 0xE1, 0xFF, 0xFF, 0x0F, 0xFF, 0xFC, 0x00, 0x01, 0xF8, 0x0C, 0x00, 0xC0,
+ 0x06, 0x00, 0x30, 0x01, 0x80, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x03,
+ 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x60, 0x03, 0x00, 0x18, 0x01, 0xC0,
+ 0x0C, 0x00, 0x60, 0x03, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x06,
+ 0x00, 0x30, 0x01, 0xF8, 0x00, 0xE0, 0x0E, 0x00, 0x60, 0x07, 0x00, 0x30,
+ 0x03, 0x80, 0x18, 0x01, 0xC0, 0x0C, 0x00, 0xC0, 0x0E, 0x00, 0x60, 0x07,
+ 0x00, 0x30, 0x03, 0x80, 0x18, 0x01, 0xC0, 0x0C, 0x00, 0xC0, 0x0E, 0x00,
+ 0x60, 0x07, 0x00, 0x30, 0x03, 0xF0, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60,
+ 0x0E, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x01, 0x80, 0x18, 0x01, 0x80,
+ 0x18, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x60, 0x06, 0x00,
+ 0x60, 0x06, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x0F, 0xC0, 0x03, 0x80,
+ 0x07, 0x00, 0x1F, 0x00, 0x36, 0x00, 0xCE, 0x01, 0x8C, 0x06, 0x1C, 0x0C,
+ 0x18, 0x38, 0x38, 0x60, 0x31, 0xC0, 0x73, 0x00, 0x6E, 0x00, 0xE0, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xF0, 0xE3, 0x8F, 0x0E, 0x18, 0x30, 0x01, 0xEC, 0x0E,
+ 0x58, 0x30, 0x70, 0xE0, 0xC3, 0x81, 0x86, 0x07, 0x1C, 0x0C, 0x38, 0x18,
+ 0xE0, 0x71, 0xC0, 0xE3, 0x83, 0x87, 0x0B, 0x2F, 0x36, 0xCF, 0xCF, 0x1F,
+ 0x1C, 0x00, 0x03, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x07, 0x00, 0x06, 0x00,
+ 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x1C, 0x7C, 0x1C, 0xFE,
+ 0x19, 0x8F, 0x1A, 0x07, 0x3C, 0x07, 0x38, 0x07, 0x38, 0x07, 0x70, 0x0E,
+ 0x70, 0x0E, 0x70, 0x1C, 0x60, 0x18, 0xE0, 0x30, 0xE0, 0x60, 0xE1, 0xC0,
+ 0x3F, 0x00, 0x01, 0xF0, 0x38, 0xC3, 0x8E, 0x78, 0x73, 0x80, 0x3C, 0x01,
+ 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x47, 0x84, 0x3F,
+ 0xC0, 0x7C, 0x00, 0x00, 0x01, 0x80, 0x07, 0xC0, 0x00, 0xE0, 0x00, 0x60,
+ 0x00, 0x30, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x06, 0x00, 0xF7,
+ 0x01, 0xC7, 0x81, 0xC3, 0x81, 0xC1, 0xC1, 0xE0, 0xE0, 0xE0, 0x60, 0xF0,
+ 0x30, 0x78, 0x38, 0x78, 0x18, 0x3C, 0x0C, 0x1E, 0x0C, 0x0F, 0x0E, 0x27,
+ 0xCB, 0x21, 0xF9, 0xE0, 0x78, 0xE0, 0x00, 0xF0, 0x1C, 0xC3, 0x86, 0x38,
+ 0x33, 0xC3, 0x1C, 0x31, 0xE3, 0x1F, 0xE0, 0xF0, 0x07, 0x80, 0x3C, 0x01,
+ 0xE0, 0x47, 0x84, 0x3F, 0xC0, 0x7C, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x33,
+ 0x00, 0x06, 0x30, 0x00, 0xC0, 0x00, 0x0C, 0x00, 0x01, 0xC0, 0x00, 0x18,
+ 0x00, 0x01, 0x80, 0x00, 0x38, 0x00, 0x3F, 0xF8, 0x03, 0xFF, 0x80, 0x03,
+ 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x06, 0x00, 0x00,
+ 0x60, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0C, 0x00, 0x00, 0xC0, 0x00,
+ 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x18, 0x00, 0x01, 0x80, 0x00, 0x18, 0x00,
+ 0x03, 0x00, 0x00, 0x30, 0x00, 0xC6, 0x00, 0x0C, 0xC0, 0x00, 0x78, 0x00,
+ 0x00, 0x01, 0xF8, 0x07, 0x1F, 0x0E, 0x0F, 0x0C, 0x0E, 0x18, 0x0E, 0x18,
+ 0x0E, 0x18, 0x1E, 0x18, 0x3C, 0x0C, 0x78, 0x07, 0xE0, 0x08, 0x00, 0x18,
+ 0x00, 0x1E, 0x00, 0x0F, 0xE0, 0x13, 0xF0, 0x60, 0x78, 0xC0, 0x38, 0xC0,
+ 0x18, 0xC0, 0x18, 0xC0, 0x30, 0x60, 0x60, 0x3F, 0x80, 0x03, 0x00, 0x1F,
+ 0x00, 0x07, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x0E,
+ 0x00, 0x0C, 0x00, 0x1C, 0x38, 0x1C, 0x7C, 0x1C, 0xCC, 0x19, 0x0C, 0x3A,
+ 0x0C, 0x3C, 0x1C, 0x3C, 0x18, 0x38, 0x18, 0x70, 0x38, 0x70, 0x38, 0x70,
+ 0x30, 0x60, 0x72, 0xE0, 0x76, 0xE0, 0x7C, 0xC0, 0x70, 0x03, 0x03, 0xC1,
+ 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x7E, 0x0F, 0x03, 0x81, 0x81,
+ 0xC0, 0xE0, 0x70, 0x30, 0x38, 0x1C, 0x1C, 0x4C, 0x47, 0xC3, 0xC0, 0x00,
+ 0x0C, 0x00, 0x3C, 0x00, 0x78, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x18, 0x03, 0xF0, 0x00, 0xE0, 0x01, 0x80, 0x03, 0x00,
+ 0x0E, 0x00, 0x1C, 0x00, 0x30, 0x00, 0x60, 0x01, 0xC0, 0x03, 0x80, 0x06,
+ 0x00, 0x0C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xC0, 0x03, 0x80, 0x06, 0x00,
+ 0x0C, 0x06, 0x30, 0x0C, 0xC0, 0x0F, 0x00, 0x00, 0x03, 0x00, 0x3E, 0x00,
+ 0x1C, 0x00, 0x38, 0x00, 0x60, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0C,
+ 0x00, 0x38, 0xFC, 0x70, 0x60, 0xE1, 0x81, 0x86, 0x07, 0x10, 0x0E, 0x40,
+ 0x1B, 0x80, 0x3F, 0x00, 0xE7, 0x01, 0xCE, 0x03, 0x0C, 0x06, 0x1C, 0x5C,
+ 0x1D, 0x38, 0x3E, 0x60, 0x38, 0x03, 0x1F, 0x07, 0x07, 0x06, 0x0E, 0x0E,
+ 0x0E, 0x0C, 0x1C, 0x1C, 0x18, 0x38, 0x38, 0x38, 0x30, 0x70, 0x70, 0x70,
+ 0x64, 0xE4, 0xE8, 0xF0, 0xE0, 0x00, 0x06, 0x18, 0x1E, 0x3E, 0x3C, 0x3F,
+ 0x0E, 0x4C, 0x47, 0x0C, 0x8C, 0x8E, 0x1D, 0x0D, 0x0E, 0x1E, 0x1A, 0x0E,
+ 0x1C, 0x1E, 0x0C, 0x3C, 0x1C, 0x1C, 0x38, 0x38, 0x1C, 0x38, 0x38, 0x1C,
+ 0x30, 0x38, 0x18, 0x70, 0x30, 0x39, 0x70, 0x70, 0x32, 0x60, 0x70, 0x3C,
+ 0x60, 0x60, 0x38, 0x06, 0x0E, 0x1F, 0x1F, 0x83, 0x99, 0xC1, 0x98, 0xC1,
+ 0xD8, 0xE0, 0xE8, 0x70, 0x78, 0x30, 0x38, 0x38, 0x3C, 0x1C, 0x1C, 0x0E,
+ 0x0E, 0x06, 0x0E, 0x03, 0x17, 0x01, 0xB3, 0x80, 0xF1, 0x80, 0x70, 0x01,
+ 0xF0, 0x0E, 0x38, 0x38, 0x30, 0xE0, 0x73, 0x80, 0xEE, 0x01, 0xDC, 0x03,
+ 0xF8, 0x0F, 0xE0, 0x1D, 0xC0, 0x3B, 0x80, 0xE7, 0x03, 0x8E, 0x06, 0x0E,
+ 0x38, 0x07, 0xC0, 0x00, 0x00, 0xE7, 0xC0, 0x7C, 0xFE, 0x01, 0xD1, 0xF0,
+ 0x1E, 0x0F, 0x01, 0xC0, 0xF0, 0x38, 0x0F, 0x03, 0x80, 0xF0, 0x38, 0x0E,
+ 0x03, 0x01, 0xE0, 0x70, 0x1C, 0x07, 0x03, 0xC0, 0x60, 0x78, 0x06, 0x0F,
+ 0x00, 0xE1, 0xC0, 0x0F, 0xF0, 0x00, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xC0,
+ 0x00, 0x1C, 0x00, 0x01, 0x80, 0x00, 0x38, 0x00, 0x0F, 0xF0, 0x00, 0x00,
+ 0xF7, 0x03, 0xCE, 0x0F, 0x06, 0x1E, 0x06, 0x1C, 0x04, 0x3C, 0x04, 0x78,
+ 0x04, 0x78, 0x0C, 0xF0, 0x08, 0xF0, 0x18, 0xF0, 0x38, 0xF0, 0xF0, 0xF9,
+ 0x70, 0x7E, 0x70, 0x3C, 0x70, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xE0, 0x00,
+ 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x0F, 0xF0, 0x7C, 0x70, 0xE7, 0xC7, 0x4C,
+ 0x34, 0x01, 0xA0, 0x1E, 0x00, 0xF0, 0x07, 0x00, 0x78, 0x03, 0x80, 0x1C,
+ 0x00, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x07, 0x88, 0x63, 0x86,
+ 0x0C, 0x30, 0x21, 0xC1, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x1C,
+ 0x10, 0x60, 0x83, 0x06, 0x18, 0x71, 0x82, 0x78, 0x00, 0x02, 0x03, 0x03,
+ 0x07, 0xF7, 0xF8, 0xE0, 0x60, 0x70, 0x38, 0x1C, 0x0C, 0x0E, 0x07, 0x03,
+ 0x01, 0x91, 0xC8, 0xF8, 0x78, 0x00, 0x1C, 0x0D, 0xF8, 0x38, 0x60, 0x70,
+ 0xC1, 0xC3, 0x83, 0x87, 0x07, 0x0C, 0x1E, 0x38, 0x78, 0x70, 0xB0, 0xE2,
+ 0x61, 0x8D, 0xC7, 0x33, 0x2C, 0xC6, 0x5F, 0x0F, 0x38, 0x1C, 0x00, 0x18,
+ 0x1B, 0xE0, 0x73, 0x81, 0xC6, 0x03, 0x18, 0x0C, 0x70, 0x21, 0xC1, 0x83,
+ 0x0C, 0x0C, 0x20, 0x31, 0x00, 0xC8, 0x03, 0x40, 0x0E, 0x00, 0x30, 0x00,
+ 0x80, 0x00, 0x18, 0x04, 0x1B, 0xE0, 0x30, 0x71, 0x80, 0xC1, 0xC6, 0x07,
+ 0x01, 0x1C, 0x2C, 0x08, 0x70, 0xB0, 0x20, 0xC4, 0xC1, 0x03, 0x21, 0x84,
+ 0x0D, 0x86, 0x20, 0x34, 0x19, 0x00, 0xE0, 0x68, 0x03, 0x81, 0xA0, 0x0C,
+ 0x07, 0x00, 0x30, 0x18, 0x00, 0x80, 0x40, 0x00, 0x03, 0x07, 0x0F, 0x8F,
+ 0x13, 0x93, 0x01, 0xB0, 0x01, 0xE0, 0x01, 0xC0, 0x00, 0xC0, 0x00, 0xC0,
+ 0x01, 0xC0, 0x03, 0xE0, 0x02, 0x60, 0x04, 0x62, 0x08, 0x64, 0xF0, 0x7C,
+ 0xE0, 0x30, 0x06, 0x06, 0x3F, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x81,
+ 0x03, 0x82, 0x01, 0x82, 0x01, 0xC4, 0x01, 0xC4, 0x01, 0xC8, 0x00, 0xC8,
+ 0x00, 0xD0, 0x00, 0xF0, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x80,
+ 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x78, 0x00, 0x70, 0x00, 0x1F, 0xFC,
+ 0x7F, 0xE1, 0x01, 0x08, 0x08, 0x00, 0x40, 0x02, 0x00, 0x10, 0x00, 0x80,
+ 0x06, 0x00, 0x10, 0x00, 0x80, 0x04, 0x00, 0x38, 0x01, 0xF0, 0x0B, 0xE0,
+ 0x01, 0xC6, 0x03, 0x98, 0x03, 0x80, 0x00, 0x70, 0x0C, 0x01, 0x80, 0x38,
+ 0x03, 0x80, 0x30, 0x07, 0x00, 0x70, 0x07, 0x00, 0x60, 0x0E, 0x00, 0xE0,
+ 0x0C, 0x01, 0xC0, 0x1C, 0x07, 0x80, 0x30, 0x04, 0x00, 0x20, 0x03, 0x00,
+ 0x30, 0x07, 0x00, 0x70, 0x06, 0x00, 0x60, 0x0E, 0x00, 0xE0, 0x0C, 0x00,
+ 0xC0, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xC0, 0x06,
+ 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x70, 0x07, 0x00, 0x70, 0x06,
+ 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0C, 0x00, 0x40, 0x04, 0x00, 0xC0, 0x1E,
+ 0x03, 0x80, 0x38, 0x03, 0x00, 0x70, 0x07, 0x00, 0x70, 0x06, 0x00, 0xE0,
+ 0x0E, 0x00, 0xC0, 0x1C, 0x01, 0x80, 0x70, 0x00, 0x1E, 0x00, 0x3F, 0xE1,
+ 0xF8, 0x7F, 0xC0, 0x07, 0x80 };
+
+const GFXglyph FreeSerifItalic18pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 9, 0, 1 }, // 0x20 ' '
+ { 0, 10, 23, 12, 1, -22 }, // 0x21 '!'
+ { 29, 12, 9, 12, 4, -22 }, // 0x22 '"'
+ { 43, 19, 23, 17, 0, -22 }, // 0x23 '#'
+ { 98, 15, 29, 17, 1, -25 }, // 0x24 '$'
+ { 153, 25, 23, 29, 3, -22 }, // 0x25 '%'
+ { 225, 22, 23, 27, 3, -22 }, // 0x26 '&'
+ { 289, 5, 9, 7, 4, -22 }, // 0x27 '''
+ { 295, 9, 29, 12, 1, -22 }, // 0x28 '('
+ { 328, 9, 29, 12, 1, -22 }, // 0x29 ')'
+ { 361, 12, 14, 18, 5, -22 }, // 0x2A '*'
+ { 382, 16, 18, 24, 4, -17 }, // 0x2B '+'
+ { 418, 5, 8, 9, -1, -2 }, // 0x2C ','
+ { 423, 8, 2, 12, 2, -8 }, // 0x2D '-'
+ { 425, 4, 4, 9, 1, -3 }, // 0x2E '.'
+ { 427, 16, 23, 10, 0, -22 }, // 0x2F '/'
+ { 473, 17, 24, 17, 1, -23 }, // 0x30 '0'
+ { 524, 12, 24, 17, 2, -23 }, // 0x31 '1'
+ { 560, 16, 23, 17, 1, -22 }, // 0x32 '2'
+ { 606, 17, 24, 18, 0, -23 }, // 0x33 '3'
+ { 657, 17, 24, 17, 0, -23 }, // 0x34 '4'
+ { 708, 16, 23, 18, 0, -22 }, // 0x35 '5'
+ { 754, 17, 24, 18, 1, -23 }, // 0x36 '6'
+ { 805, 16, 23, 17, 3, -22 }, // 0x37 '7'
+ { 851, 16, 24, 18, 1, -23 }, // 0x38 '8'
+ { 899, 16, 24, 17, 1, -23 }, // 0x39 '9'
+ { 947, 7, 15, 9, 2, -14 }, // 0x3A ':'
+ { 961, 9, 20, 9, 1, -14 }, // 0x3B ';'
+ { 984, 18, 18, 20, 2, -17 }, // 0x3C '<'
+ { 1025, 18, 9, 23, 3, -12 }, // 0x3D '='
+ { 1046, 18, 18, 20, 2, -17 }, // 0x3E '>'
+ { 1087, 12, 23, 16, 4, -22 }, // 0x3F '?'
+ { 1122, 24, 23, 27, 2, -22 }, // 0x40 '@'
+ { 1191, 21, 23, 23, 0, -22 }, // 0x41 'A'
+ { 1252, 21, 23, 21, 0, -22 }, // 0x42 'B'
+ { 1313, 21, 23, 21, 2, -22 }, // 0x43 'C'
+ { 1374, 25, 23, 25, 0, -22 }, // 0x44 'D'
+ { 1446, 22, 23, 20, 0, -22 }, // 0x45 'E'
+ { 1510, 22, 23, 20, 0, -22 }, // 0x46 'F'
+ { 1574, 23, 23, 24, 2, -22 }, // 0x47 'G'
+ { 1641, 27, 23, 25, 0, -22 }, // 0x48 'H'
+ { 1719, 14, 23, 11, 0, -22 }, // 0x49 'I'
+ { 1760, 17, 23, 15, 0, -22 }, // 0x4A 'J'
+ { 1809, 25, 23, 22, 0, -22 }, // 0x4B 'K'
+ { 1881, 20, 23, 20, 0, -22 }, // 0x4C 'L'
+ { 1939, 31, 23, 29, 0, -22 }, // 0x4D 'M'
+ { 2029, 26, 23, 24, 0, -22 }, // 0x4E 'N'
+ { 2104, 23, 23, 23, 1, -22 }, // 0x4F 'O'
+ { 2171, 22, 23, 20, 0, -22 }, // 0x50 'P'
+ { 2235, 23, 29, 23, 1, -22 }, // 0x51 'Q'
+ { 2319, 21, 23, 22, 0, -22 }, // 0x52 'R'
+ { 2380, 17, 23, 16, 0, -22 }, // 0x53 'S'
+ { 2429, 20, 23, 21, 3, -22 }, // 0x54 'T'
+ { 2487, 23, 23, 25, 4, -22 }, // 0x55 'U'
+ { 2554, 21, 23, 23, 5, -22 }, // 0x56 'V'
+ { 2615, 29, 23, 31, 5, -22 }, // 0x57 'W'
+ { 2699, 24, 23, 23, 0, -22 }, // 0x58 'X'
+ { 2768, 19, 23, 21, 4, -22 }, // 0x59 'Y'
+ { 2823, 22, 23, 20, 0, -22 }, // 0x5A 'Z'
+ { 2887, 13, 28, 14, 1, -22 }, // 0x5B '['
+ { 2933, 12, 23, 17, 4, -22 }, // 0x5C '\'
+ { 2968, 12, 28, 14, 1, -22 }, // 0x5D ']'
+ { 3010, 15, 13, 15, 0, -22 }, // 0x5E '^'
+ { 3035, 18, 2, 17, 0, 3 }, // 0x5F '_'
+ { 3040, 6, 6, 9, 5, -22 }, // 0x60 '`'
+ { 3045, 15, 15, 17, 1, -14 }, // 0x61 'a'
+ { 3074, 16, 24, 17, 1, -23 }, // 0x62 'b'
+ { 3122, 13, 15, 14, 1, -14 }, // 0x63 'c'
+ { 3147, 17, 24, 18, 1, -23 }, // 0x64 'd'
+ { 3198, 13, 15, 14, 1, -14 }, // 0x65 'e'
+ { 3223, 20, 31, 15, -3, -23 }, // 0x66 'f'
+ { 3301, 16, 22, 15, -1, -14 }, // 0x67 'g'
+ { 3345, 16, 24, 17, 1, -23 }, // 0x68 'h'
+ { 3393, 9, 23, 9, 1, -22 }, // 0x69 'i'
+ { 3419, 15, 30, 10, -3, -22 }, // 0x6A 'j'
+ { 3476, 15, 24, 16, 1, -23 }, // 0x6B 'k'
+ { 3521, 8, 25, 9, 1, -23 }, // 0x6C 'l'
+ { 3546, 24, 15, 25, 0, -14 }, // 0x6D 'm'
+ { 3591, 17, 15, 17, 0, -14 }, // 0x6E 'n'
+ { 3623, 15, 15, 17, 1, -14 }, // 0x6F 'o'
+ { 3652, 20, 22, 16, -3, -14 }, // 0x70 'p'
+ { 3707, 16, 22, 17, 1, -14 }, // 0x71 'q'
+ { 3751, 13, 15, 13, 1, -14 }, // 0x72 'r'
+ { 3776, 13, 15, 12, 0, -14 }, // 0x73 's'
+ { 3801, 9, 18, 8, 1, -17 }, // 0x74 't'
+ { 3822, 15, 15, 17, 1, -14 }, // 0x75 'u'
+ { 3851, 14, 15, 16, 2, -14 }, // 0x76 'v'
+ { 3878, 22, 15, 24, 1, -14 }, // 0x77 'w'
+ { 3920, 16, 15, 15, -1, -14 }, // 0x78 'x'
+ { 3950, 16, 22, 16, 0, -14 }, // 0x79 'y'
+ { 3994, 14, 18, 14, 0, -14 }, // 0x7A 'z'
+ { 4026, 12, 30, 14, 2, -23 }, // 0x7B '{'
+ { 4071, 2, 23, 10, 4, -22 }, // 0x7C '|'
+ { 4077, 12, 31, 14, 0, -24 }, // 0x7D '}'
+ { 4124, 17, 4, 19, 1, -10 } }; // 0x7E '~'
+
+const GFXfont FreeSerifItalic18pt7b PROGMEM = {
+ (uint8_t *)FreeSerifItalic18pt7bBitmaps,
+ (GFXglyph *)FreeSerifItalic18pt7bGlyphs,
+ 0x20, 0x7E, 42 };
+
+// Approx. 4805 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifItalic24pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifItalic24pt7b.h
new file mode 100644
index 000000000000..75da1e057f8d
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifItalic24pt7b.h
@@ -0,0 +1,737 @@
+const uint8_t FreeSerifItalic24pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x01, 0xF0, 0x1E, 0x01, 0xE0, 0x1C,
+ 0x01, 0xC0, 0x3C, 0x03, 0x80, 0x38, 0x03, 0x80, 0x30, 0x07, 0x00, 0x60,
+ 0x06, 0x00, 0x60, 0x04, 0x00, 0x40, 0x0C, 0x00, 0x80, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xF8, 0x0F, 0x80, 0xF8, 0x07, 0x00,
+ 0x38, 0x1D, 0xE0, 0x77, 0x83, 0xDC, 0x0E, 0x70, 0x39, 0xC1, 0xEE, 0x07,
+ 0x38, 0x1C, 0xC0, 0x63, 0x01, 0x8C, 0x06, 0x20, 0x10, 0x00, 0x06, 0x03,
+ 0x00, 0x07, 0x03, 0x80, 0x03, 0x81, 0xC0, 0x03, 0x81, 0xC0, 0x01, 0xC0,
+ 0xE0, 0x00, 0xE0, 0x70, 0x00, 0xE0, 0x70, 0x00, 0x70, 0x38, 0x00, 0x30,
+ 0x18, 0x00, 0x38, 0x1C, 0x03, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xF0, 0x0E,
+ 0x07, 0x00, 0x06, 0x03, 0x00, 0x07, 0x03, 0x80, 0x03, 0x81, 0xC0, 0x03,
+ 0x81, 0xC0, 0x01, 0xC0, 0xE0, 0x00, 0xE0, 0x70, 0x1F, 0xFF, 0xFF, 0x8F,
+ 0xFF, 0xFF, 0x80, 0x70, 0x38, 0x00, 0x38, 0x1C, 0x00, 0x1C, 0x0C, 0x00,
+ 0x1C, 0x0E, 0x00, 0x0E, 0x07, 0x00, 0x0E, 0x07, 0x00, 0x07, 0x03, 0x80,
+ 0x03, 0x81, 0xC0, 0x03, 0x81, 0xC0, 0x01, 0xC0, 0xE0, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0xFF, 0x80, 0x1C, 0x2F, 0x01,
+ 0x83, 0x3C, 0x1C, 0x18, 0xE1, 0xC0, 0xC3, 0x0E, 0x06, 0x18, 0x70, 0x60,
+ 0x83, 0x83, 0x04, 0x1E, 0x18, 0x00, 0xF8, 0xC0, 0x03, 0xEC, 0x00, 0x0F,
+ 0xE0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0,
+ 0x00, 0x7F, 0x00, 0x03, 0x7C, 0x00, 0x19, 0xE0, 0x01, 0x87, 0x80, 0x0C,
+ 0x3C, 0x00, 0x60, 0xE2, 0x03, 0x07, 0x10, 0x30, 0x39, 0x81, 0x81, 0xCE,
+ 0x0C, 0x0C, 0x70, 0x60, 0xE3, 0xC6, 0x06, 0x0F, 0x30, 0x60, 0x1F, 0x9E,
+ 0x00, 0x3F, 0x80, 0x00, 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01,
+ 0x80, 0x00, 0x01, 0xF0, 0x00, 0xC0, 0x03, 0xFE, 0x01, 0xE0, 0x03, 0xC7,
+ 0x83, 0xE0, 0x03, 0xC0, 0x7F, 0x60, 0x03, 0xC0, 0x20, 0x70, 0x01, 0xC0,
+ 0x10, 0x30, 0x01, 0xE0, 0x08, 0x38, 0x00, 0xE0, 0x04, 0x18, 0x00, 0xF0,
+ 0x02, 0x1C, 0x00, 0x70, 0x02, 0x0C, 0x00, 0x38, 0x01, 0x0E, 0x00, 0x1C,
+ 0x01, 0x8E, 0x00, 0x0E, 0x00, 0x86, 0x00, 0x07, 0x00, 0x87, 0x03, 0xE1,
+ 0x80, 0xC3, 0x07, 0xFC, 0xE1, 0xC3, 0x87, 0xC6, 0x3F, 0x81, 0x87, 0x81,
+ 0x8F, 0x81, 0xC7, 0x80, 0x40, 0x00, 0xC3, 0xC0, 0x20, 0x00, 0xE3, 0xC0,
+ 0x10, 0x00, 0x61, 0xC0, 0x08, 0x00, 0x61, 0xE0, 0x04, 0x00, 0x70, 0xF0,
+ 0x06, 0x00, 0x30, 0x70, 0x02, 0x00, 0x38, 0x38, 0x03, 0x00, 0x18, 0x1C,
+ 0x01, 0x00, 0x1C, 0x0E, 0x01, 0x80, 0x0C, 0x07, 0x01, 0x80, 0x0E, 0x01,
+ 0xC3, 0x80, 0x06, 0x00, 0x7F, 0x80, 0x06, 0x00, 0x1F, 0x00, 0x07, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x71,
+ 0xC0, 0x00, 0x01, 0xC3, 0x80, 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x38, 0x38,
+ 0x00, 0x01, 0xE0, 0xE0, 0x00, 0x07, 0x87, 0x00, 0x00, 0x1E, 0x18, 0x00,
+ 0x00, 0x78, 0xC0, 0x00, 0x01, 0xE6, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00,
+ 0x1F, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x7F,
+ 0xC1, 0xFE, 0x03, 0x9F, 0x03, 0xE0, 0x3C, 0x3C, 0x07, 0x01, 0xE0, 0xF8,
+ 0x1C, 0x0F, 0x03, 0xE0, 0xE0, 0x7C, 0x07, 0x83, 0x01, 0xE0, 0x1F, 0x1C,
+ 0x07, 0x80, 0x7C, 0x60, 0x3E, 0x00, 0xFB, 0x00, 0xF8, 0x03, 0xFC, 0x03,
+ 0xE0, 0x07, 0xE0, 0x0F, 0x80, 0x1F, 0x00, 0x3F, 0x00, 0x3E, 0x00, 0x7C,
+ 0x00, 0xFC, 0x01, 0xF8, 0x0F, 0xF0, 0x03, 0xF0, 0xF3, 0xF0, 0x87, 0xFF,
+ 0x07, 0xFC, 0x07, 0xF0, 0x07, 0xC0, 0x39, 0xDE, 0xE7, 0x3B, 0x9C, 0xC6,
+ 0x31, 0x00, 0x00, 0x10, 0x01, 0x00, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80,
+ 0x1C, 0x00, 0xC0, 0x0E, 0x00, 0xE0, 0x07, 0x00, 0x78, 0x03, 0x80, 0x3C,
+ 0x01, 0xE0, 0x0E, 0x00, 0x70, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0E, 0x00,
+ 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E,
+ 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x01, 0x80, 0x0C, 0x00, 0x60,
+ 0x01, 0x00, 0x0C, 0x00, 0x20, 0x00, 0x00, 0x80, 0x06, 0x00, 0x10, 0x00,
+ 0x80, 0x06, 0x00, 0x30, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C,
+ 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0,
+ 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xC0, 0x1E, 0x00, 0xF0, 0x07,
+ 0x80, 0x38, 0x03, 0xC0, 0x1C, 0x00, 0xE0, 0x0E, 0x00, 0x60, 0x07, 0x00,
+ 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x10, 0x01, 0x00, 0x00, 0x01, 0x00,
+ 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0xE1, 0x07, 0xE1, 0x0F,
+ 0xF1, 0x1F, 0x19, 0x30, 0x07, 0xC0, 0x03, 0x80, 0x0D, 0x60, 0x79, 0x3C,
+ 0xF1, 0x1F, 0xE1, 0x0F, 0xE1, 0x07, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80,
+ 0x03, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00, 0x01,
+ 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C,
+ 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xE0, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00,
+ 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00,
+ 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x7C, 0xF9,
+ 0xF1, 0xE1, 0xC3, 0x0C, 0x10, 0xC1, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x00,
+ 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x78, 0x00, 0x03, 0x80, 0x00, 0x3C,
+ 0x00, 0x01, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00,
+ 0xF0, 0x00, 0x07, 0x00, 0x00, 0x78, 0x00, 0x03, 0x80, 0x00, 0x3C, 0x00,
+ 0x01, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x70,
+ 0x00, 0x07, 0x80, 0x00, 0x38, 0x00, 0x03, 0x80, 0x00, 0x3C, 0x00, 0x01,
+ 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x70, 0x00,
+ 0x07, 0x80, 0x00, 0x38, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xE0,
+ 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x03, 0x86,
+ 0x00, 0x30, 0x18, 0x03, 0x00, 0xC0, 0x38, 0x03, 0x03, 0x80, 0x18, 0x38,
+ 0x00, 0xC1, 0xC0, 0x07, 0x1C, 0x00, 0x38, 0xE0, 0x01, 0xCF, 0x00, 0x0E,
+ 0x70, 0x00, 0x77, 0x80, 0x07, 0xBC, 0x00, 0x3D, 0xE0, 0x01, 0xEE, 0x00,
+ 0x0F, 0xF0, 0x00, 0x77, 0x80, 0x07, 0xBC, 0x00, 0x3D, 0xC0, 0x01, 0xCE,
+ 0x00, 0x1E, 0x70, 0x00, 0xF3, 0x80, 0x07, 0x1C, 0x00, 0x78, 0xE0, 0x03,
+ 0x83, 0x00, 0x38, 0x18, 0x03, 0x80, 0xE0, 0x18, 0x03, 0x01, 0x80, 0x0C,
+ 0x38, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1F, 0xC0, 0x3F, 0xE0,
+ 0x01, 0xF0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1C, 0x00, 0x1E,
+ 0x00, 0x0F, 0x00, 0x07, 0x80, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00,
+ 0xF0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x1E, 0x00,
+ 0x0F, 0x00, 0x07, 0x80, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x01, 0xE0,
+ 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3F, 0x01, 0xFF,
+ 0xF0, 0x00, 0x3F, 0x00, 0x07, 0xFE, 0x00, 0x7F, 0xF8, 0x07, 0x07, 0xE0,
+ 0x60, 0x1F, 0x06, 0x00, 0x7C, 0x20, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00,
+ 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xE0, 0x00, 0x0E, 0x00,
+ 0x00, 0xF0, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70,
+ 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x03,
+ 0x00, 0x00, 0x30, 0x00, 0x03, 0x00, 0x00, 0x30, 0x01, 0x03, 0x00, 0x08,
+ 0x30, 0x00, 0xC3, 0xFF, 0xFC, 0x3F, 0xFF, 0xE3, 0xFF, 0xFE, 0x00, 0x00,
+ 0x0F, 0xC0, 0x00, 0xFF, 0xC0, 0x06, 0x0F, 0x80, 0x30, 0x1E, 0x01, 0x80,
+ 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x78,
+ 0x00, 0x01, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x0E, 0x00, 0x01,
+ 0xF8, 0x00, 0x3F, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x0F,
+ 0x80, 0x00, 0x3E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80,
+ 0x00, 0x1E, 0x00, 0x00, 0x70, 0x00, 0x01, 0xC0, 0x00, 0x07, 0x00, 0x00,
+ 0x38, 0x00, 0x00, 0xC0, 0x70, 0x06, 0x03, 0xF8, 0x70, 0x07, 0xFF, 0x00,
+ 0x0F, 0xF0, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x00, 0x03, 0xC0,
+ 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x37, 0x80, 0x00,
+ 0xDC, 0x00, 0x06, 0x70, 0x00, 0x33, 0xC0, 0x01, 0x8F, 0x00, 0x0C, 0x38,
+ 0x00, 0x60, 0xE0, 0x03, 0x07, 0x80, 0x18, 0x1E, 0x00, 0xC0, 0x70, 0x06,
+ 0x03, 0xC0, 0x30, 0x0F, 0x01, 0x80, 0x38, 0x0C, 0x00, 0xE0, 0x70, 0x07,
+ 0x81, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFE, 0x00, 0x0F, 0x00,
+ 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00,
+ 0x70, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0xFF,
+ 0xF0, 0x07, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00,
+ 0x08, 0x00, 0x00, 0x70, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x3F,
+ 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3C,
+ 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00,
+ 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0C, 0x00, 0x00,
+ 0x70, 0x00, 0x01, 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80,
+ 0x70, 0x0E, 0x03, 0xF0, 0xE0, 0x07, 0xFF, 0x00, 0x0F, 0xE0, 0x00, 0x00,
+ 0x00, 0x0E, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x03,
+ 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xC0,
+ 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x00, 0x00, 0xF9, 0xF8, 0x01, 0xFF, 0xFC,
+ 0x07, 0xE0, 0x7C, 0x0F, 0x80, 0x7C, 0x3E, 0x00, 0x78, 0x78, 0x00, 0x78,
+ 0xF0, 0x00, 0xF3, 0xC0, 0x01, 0xE7, 0x80, 0x03, 0xCF, 0x00, 0x07, 0x9C,
+ 0x00, 0x0F, 0x38, 0x00, 0x3E, 0x70, 0x00, 0x78, 0xE0, 0x00, 0xF1, 0xC0,
+ 0x03, 0xC1, 0x80, 0x07, 0x83, 0x00, 0x1E, 0x03, 0x00, 0x38, 0x06, 0x01,
+ 0xE0, 0x03, 0x07, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0xFF, 0xF9, 0xFF, 0xFF,
+ 0xCF, 0xFF, 0xFC, 0xE0, 0x00, 0xCC, 0x00, 0x0E, 0x40, 0x00, 0x60, 0x00,
+ 0x07, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x01, 0x80,
+ 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x07,
+ 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x03, 0x80, 0x00,
+ 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00,
+ 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x78, 0x00, 0x03, 0x80, 0x00, 0x38,
+ 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x03, 0x83,
+ 0x80, 0x1C, 0x03, 0x00, 0xE0, 0x0E, 0x07, 0x00, 0x1C, 0x1C, 0x00, 0x70,
+ 0x70, 0x01, 0xC1, 0xC0, 0x07, 0x07, 0x80, 0x1C, 0x1E, 0x00, 0xE0, 0x3C,
+ 0x07, 0x80, 0xFC, 0x38, 0x01, 0xFB, 0xC0, 0x03, 0xF8, 0x00, 0x0F, 0xE0,
+ 0x00, 0x7F, 0xC0, 0x07, 0x1F, 0x80, 0x78, 0x3F, 0x03, 0x80, 0x7C, 0x1E,
+ 0x00, 0xF8, 0x70, 0x01, 0xE3, 0x80, 0x03, 0xCE, 0x00, 0x07, 0x38, 0x00,
+ 0x1C, 0xE0, 0x00, 0x73, 0x80, 0x01, 0xCE, 0x00, 0x06, 0x1C, 0x00, 0x38,
+ 0x70, 0x01, 0xC0, 0xE0, 0x0E, 0x01, 0xE0, 0xE0, 0x01, 0xFE, 0x00, 0x00,
+ 0x1F, 0x80, 0x03, 0xC3, 0x00, 0x1C, 0x02, 0x00, 0xE0, 0x0C, 0x07, 0x00,
+ 0x18, 0x3C, 0x00, 0x60, 0xE0, 0x01, 0xC7, 0x80, 0x07, 0x1E, 0x00, 0x1C,
+ 0xF0, 0x00, 0x73, 0xC0, 0x01, 0xCF, 0x00, 0x07, 0x3C, 0x00, 0x3C, 0xF0,
+ 0x00, 0xF3, 0xC0, 0x03, 0xCF, 0x00, 0x1E, 0x1E, 0x00, 0x78, 0x7C, 0x03,
+ 0xE0, 0xF8, 0x3F, 0x01, 0xFF, 0xBC, 0x03, 0xF1, 0xE0, 0x00, 0x0F, 0x80,
+ 0x00, 0x3C, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x03,
+ 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x78, 0x00,
+ 0x0F, 0x80, 0x00, 0xE0, 0x00, 0x00, 0x07, 0x07, 0xC3, 0xE1, 0xF0, 0x70,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x38, 0x3E, 0x1F, 0x0F, 0x83, 0x80, 0x01, 0xC0, 0x7C, 0x0F, 0x81,
+ 0xF0, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x07, 0x80, 0xF8, 0x1F, 0x01, 0xE0,
+ 0x1C, 0x03, 0x00, 0xC0, 0x18, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0C, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0xC0,
+ 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F,
+ 0xC0, 0x01, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x1F, 0x80,
+ 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8,
+ 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x1F,
+ 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x07, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00,
+ 0xE0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00,
+ 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F, 0xC0,
+ 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x1F,
+ 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x1F, 0xE0,
+ 0x00, 0x7F, 0x80, 0x01, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0xC0, 0x00,
+ 0xFF, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00,
+ 0x03, 0xF0, 0x06, 0x1C, 0x0C, 0x0E, 0x1C, 0x06, 0x1C, 0x07, 0x1C, 0x07,
+ 0x1C, 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x3C,
+ 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x03, 0x00,
+ 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0xF8, 0x00,
+ 0xF8, 0x00, 0xF8, 0x00, 0x70, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x1F,
+ 0xFF, 0x80, 0x00, 0x3F, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x7C,
+ 0x00, 0x07, 0x80, 0x7C, 0x00, 0x00, 0xE0, 0x3C, 0x00, 0x00, 0x38, 0x3C,
+ 0x00, 0x00, 0x0C, 0x3C, 0x00, 0x78, 0x07, 0x1E, 0x00, 0xFE, 0xE1, 0x9E,
+ 0x00, 0xF1, 0xF0, 0xEF, 0x00, 0xE0, 0xF0, 0x37, 0x80, 0xE0, 0x38, 0x1F,
+ 0x80, 0x70, 0x1C, 0x0F, 0xC0, 0x70, 0x1E, 0x07, 0xE0, 0x38, 0x0F, 0x03,
+ 0xF0, 0x18, 0x07, 0x01, 0xF8, 0x1C, 0x03, 0x80, 0xFC, 0x0E, 0x01, 0xC0,
+ 0xDE, 0x07, 0x01, 0xE0, 0x6F, 0x03, 0x80, 0xE0, 0x73, 0xC1, 0xC0, 0xF0,
+ 0x31, 0xE0, 0xF0, 0xF8, 0x30, 0xF0, 0x38, 0xDC, 0x30, 0x3C, 0x1F, 0xC7,
+ 0xF0, 0x0E, 0x07, 0x81, 0xF0, 0x07, 0x80, 0x00, 0x00, 0x01, 0xE0, 0x00,
+ 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x01, 0x00, 0x03, 0xF0,
+ 0x0F, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00,
+ 0xF0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x03, 0xF0,
+ 0x00, 0x00, 0x37, 0x80, 0x00, 0x03, 0x3C, 0x00, 0x00, 0x19, 0xE0, 0x00,
+ 0x01, 0x8F, 0x80, 0x00, 0x08, 0x7C, 0x00, 0x00, 0xC3, 0xE0, 0x00, 0x0C,
+ 0x0F, 0x00, 0x00, 0x60, 0x78, 0x00, 0x06, 0x03, 0xC0, 0x00, 0x20, 0x1F,
+ 0x00, 0x03, 0x00, 0xF8, 0x00, 0x3F, 0xFF, 0xC0, 0x01, 0xFF, 0xFE, 0x00,
+ 0x18, 0x00, 0xF0, 0x00, 0xC0, 0x07, 0x80, 0x0C, 0x00, 0x3E, 0x00, 0xE0,
+ 0x01, 0xF0, 0x06, 0x00, 0x0F, 0x80, 0x70, 0x00, 0x3C, 0x03, 0x00, 0x01,
+ 0xE0, 0x38, 0x00, 0x0F, 0x83, 0xC0, 0x00, 0x7C, 0x3E, 0x00, 0x07, 0xF3,
+ 0xFC, 0x01, 0xFF, 0xE0, 0x03, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xF8, 0x00,
+ 0x3E, 0x07, 0xC0, 0x03, 0xE0, 0x3E, 0x00, 0x3E, 0x01, 0xF0, 0x03, 0xC0,
+ 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x78, 0x01, 0xF0,
+ 0x07, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x7C, 0x00, 0xF0,
+ 0x3F, 0x00, 0x1F, 0xFF, 0x80, 0x01, 0xFF, 0xFC, 0x00, 0x1F, 0x07, 0xE0,
+ 0x01, 0xE0, 0x1F, 0x00, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x07, 0xC0, 0x3C,
+ 0x00, 0x7C, 0x03, 0xC0, 0x07, 0xC0, 0x7C, 0x00, 0x7C, 0x07, 0xC0, 0x07,
+ 0xC0, 0x78, 0x00, 0x7C, 0x0F, 0x80, 0x0F, 0x80, 0xF8, 0x00, 0xF8, 0x0F,
+ 0x00, 0x1F, 0x00, 0xF0, 0x03, 0xE0, 0x1F, 0x81, 0xFC, 0x03, 0xFF, 0xFF,
+ 0x80, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x01, 0xFE, 0x04, 0x00, 0x3F, 0xFF,
+ 0xE0, 0x03, 0xF0, 0x1F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0xF0, 0x00, 0x78,
+ 0x0F, 0x80, 0x00, 0xE0, 0x3C, 0x00, 0x03, 0x81, 0xF0, 0x00, 0x04, 0x0F,
+ 0x80, 0x00, 0x10, 0x7C, 0x00, 0x00, 0x41, 0xF0, 0x00, 0x00, 0x0F, 0x80,
+ 0x00, 0x00, 0x3E, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x07, 0xC0, 0x00,
+ 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00,
+ 0x0F, 0x80, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x03,
+ 0xE0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xF8,
+ 0x00, 0x00, 0x01, 0xF0, 0x00, 0x02, 0x07, 0xC0, 0x00, 0x18, 0x0F, 0x80,
+ 0x00, 0xC0, 0x3E, 0x00, 0x06, 0x00, 0x7C, 0x00, 0x70, 0x00, 0xFC, 0x07,
+ 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x03, 0xFF, 0xFF,
+ 0x00, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x0F, 0xC0, 0xFC, 0x00, 0x07, 0xC0,
+ 0x1F, 0x00, 0x03, 0xE0, 0x07, 0xC0, 0x01, 0xE0, 0x01, 0xF0, 0x01, 0xF0,
+ 0x00, 0x7C, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0x0F, 0x00, 0x3C,
+ 0x00, 0x07, 0xC0, 0x3E, 0x00, 0x03, 0xE0, 0x1F, 0x00, 0x01, 0xF0, 0x0F,
+ 0x00, 0x00, 0xF8, 0x0F, 0x80, 0x00, 0x7C, 0x07, 0xC0, 0x00, 0x3E, 0x03,
+ 0xE0, 0x00, 0x1F, 0x01, 0xE0, 0x00, 0x1F, 0x81, 0xF0, 0x00, 0x0F, 0x80,
+ 0xF8, 0x00, 0x07, 0xC0, 0x78, 0x00, 0x03, 0xE0, 0x3C, 0x00, 0x03, 0xE0,
+ 0x3E, 0x00, 0x01, 0xF0, 0x1F, 0x00, 0x01, 0xF0, 0x0F, 0x00, 0x01, 0xF0,
+ 0x0F, 0x80, 0x01, 0xF8, 0x07, 0xC0, 0x01, 0xF0, 0x03, 0xE0, 0x01, 0xF0,
+ 0x01, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x0F, 0xE0, 0x01, 0xFF, 0xFF, 0xC0,
+ 0x03, 0xFF, 0xFE, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF8, 0x03, 0xFF, 0xFF,
+ 0xC0, 0x0F, 0x80, 0x1E, 0x00, 0x7C, 0x00, 0x30, 0x03, 0xE0, 0x01, 0x00,
+ 0x1E, 0x00, 0x08, 0x01, 0xF0, 0x00, 0x40, 0x0F, 0x80, 0x00, 0x00, 0x78,
+ 0x00, 0x00, 0x03, 0xC0, 0x10, 0x00, 0x3E, 0x01, 0x80, 0x01, 0xF0, 0x08,
+ 0x00, 0x0F, 0x01, 0xC0, 0x00, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xF0, 0x00,
+ 0x3E, 0x07, 0x00, 0x01, 0xE0, 0x18, 0x00, 0x1F, 0x00, 0xC0, 0x00, 0xF8,
+ 0x04, 0x00, 0x07, 0x80, 0x20, 0x00, 0x3C, 0x00, 0x00, 0x03, 0xE0, 0x00,
+ 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x08, 0x0F, 0x80, 0x00, 0xC0,
+ 0x7C, 0x00, 0x0E, 0x03, 0xC0, 0x00, 0xE0, 0x1E, 0x00, 0x0F, 0x01, 0xF8,
+ 0x03, 0xF8, 0x1F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x00, 0x03, 0xFF,
+ 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0xC0, 0x0F, 0x80, 0x1E, 0x00, 0x7C, 0x00,
+ 0x30, 0x03, 0xE0, 0x01, 0x00, 0x1E, 0x00, 0x08, 0x01, 0xF0, 0x00, 0x40,
+ 0x0F, 0x80, 0x02, 0x00, 0x7C, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x3E,
+ 0x00, 0x80, 0x01, 0xF0, 0x0C, 0x00, 0x0F, 0x00, 0xC0, 0x00, 0xF8, 0x0E,
+ 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0xE0, 0x18, 0x00,
+ 0x1F, 0x00, 0xC0, 0x00, 0xF8, 0x06, 0x00, 0x07, 0xC0, 0x20, 0x00, 0x3C,
+ 0x01, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0x00,
+ 0x00, 0x0F, 0x80, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00,
+ 0x1E, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xFF,
+ 0xC0, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x02, 0x00, 0x1F, 0xFF, 0x8C, 0x00,
+ 0xFC, 0x07, 0xF8, 0x03, 0xE0, 0x03, 0xF0, 0x0F, 0x00, 0x03, 0xC0, 0x3C,
+ 0x00, 0x03, 0x80, 0xF0, 0x00, 0x07, 0x03, 0xC0, 0x00, 0x0E, 0x0F, 0x80,
+ 0x00, 0x08, 0x3E, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x00, 0x01, 0xF0, 0x00,
+ 0x00, 0x03, 0xE0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x1F, 0x00, 0x00,
+ 0x00, 0x3E, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x3F,
+ 0xFF, 0xE0, 0x00, 0x0F, 0xE7, 0xC0, 0x00, 0x0F, 0x0F, 0x80, 0x00, 0x1E,
+ 0x1F, 0x00, 0x00, 0x7C, 0x3E, 0x00, 0x00, 0xF0, 0x7C, 0x00, 0x01, 0xE0,
+ 0x78, 0x00, 0x03, 0xC0, 0xF8, 0x00, 0x0F, 0x01, 0xF0, 0x00, 0x1E, 0x01,
+ 0xF0, 0x00, 0x3C, 0x01, 0xE0, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x01,
+ 0xF8, 0x0F, 0x80, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x03,
+ 0xFF, 0xE0, 0x7F, 0xF0, 0x07, 0xF8, 0x01, 0xFC, 0x00, 0x3E, 0x00, 0x0F,
+ 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0,
+ 0x00, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00,
+ 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF8, 0x00, 0x3E,
+ 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x00,
+ 0x03, 0xC0, 0x01, 0xFF, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xFF, 0x80, 0x01,
+ 0xE0, 0x00, 0x78, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF8,
+ 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x7C, 0x00,
+ 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x0F,
+ 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x03, 0xC0,
+ 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x03, 0xF8, 0x00,
+ 0xFE, 0x00, 0xFF, 0xE0, 0x7F, 0xFC, 0x00, 0x01, 0xFF, 0xC0, 0x1F, 0xE0,
+ 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x07, 0xC0, 0x01,
+ 0xF0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF0,
+ 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xE0, 0x00, 0xF8, 0x00,
+ 0x3E, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1E,
+ 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x00,
+ 0x0F, 0xE0, 0x0F, 0xFE, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x07, 0xF0, 0x00,
+ 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00,
+ 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F,
+ 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0,
+ 0x00, 0x07, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x78, 0x00,
+ 0x00, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x00, 0x00,
+ 0x1E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x01, 0xC1, 0xE0, 0x07, 0xC7,
+ 0x80, 0x0F, 0x8F, 0x00, 0x1F, 0x3C, 0x00, 0x1F, 0xF0, 0x00, 0x0F, 0x80,
+ 0x00, 0x01, 0xFF, 0xE1, 0xFF, 0x80, 0x3F, 0xC0, 0x1F, 0x80, 0x0F, 0x80,
+ 0x0F, 0x00, 0x07, 0xC0, 0x0F, 0x00, 0x03, 0xC0, 0x0F, 0x00, 0x01, 0xE0,
+ 0x0E, 0x00, 0x01, 0xF0, 0x0E, 0x00, 0x00, 0xF8, 0x0E, 0x00, 0x00, 0x78,
+ 0x1C, 0x00, 0x00, 0x3C, 0x1C, 0x00, 0x00, 0x3E, 0x3C, 0x00, 0x00, 0x1F,
+ 0x38, 0x00, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x07,
+ 0xFE, 0x00, 0x00, 0x03, 0xDF, 0x00, 0x00, 0x01, 0xE7, 0xC0, 0x00, 0x01,
+ 0xF3, 0xE0, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x78, 0x3C, 0x00, 0x00,
+ 0x3C, 0x1F, 0x00, 0x00, 0x3E, 0x07, 0xC0, 0x00, 0x1F, 0x03, 0xE0, 0x00,
+ 0x0F, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x3C, 0x00, 0x07, 0xC0, 0x1F, 0x00,
+ 0x03, 0xC0, 0x07, 0x80, 0x01, 0xE0, 0x03, 0xE0, 0x01, 0xF0, 0x01, 0xF8,
+ 0x01, 0xFC, 0x01, 0xFE, 0x03, 0xFF, 0xC3, 0xFF, 0xE0, 0x03, 0xFF, 0xE0,
+ 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03,
+ 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00,
+ 0x00, 0x78, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C,
+ 0x00, 0x00, 0x0F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00,
+ 0x0F, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80,
+ 0x00, 0x01, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01,
+ 0xF0, 0x00, 0x08, 0x3C, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x41, 0xF0, 0x00,
+ 0x18, 0x3C, 0x00, 0x07, 0x07, 0x80, 0x01, 0xC1, 0xF8, 0x01, 0xF8, 0x7F,
+ 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0x00, 0x00, 0x3F, 0xC0,
+ 0x0F, 0xC0, 0x00, 0x1F, 0xC0, 0x01, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0xFC,
+ 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00,
+ 0xFF, 0x00, 0x02, 0xF0, 0x00, 0x37, 0x80, 0x01, 0xBC, 0x00, 0x19, 0xE0,
+ 0x00, 0x6F, 0x80, 0x0E, 0xF8, 0x00, 0x1B, 0xE0, 0x03, 0x3E, 0x00, 0x04,
+ 0x78, 0x01, 0x8F, 0x00, 0x03, 0x1E, 0x00, 0xE7, 0xC0, 0x00, 0xC7, 0x80,
+ 0x31, 0xF0, 0x00, 0x21, 0xE0, 0x18, 0x78, 0x00, 0x18, 0x78, 0x0E, 0x1E,
+ 0x00, 0x06, 0x1E, 0x03, 0x0F, 0x80, 0x01, 0x87, 0x81, 0x83, 0xE0, 0x00,
+ 0x41, 0xF0, 0xE0, 0xF0, 0x00, 0x30, 0x7C, 0x30, 0x3C, 0x00, 0x0C, 0x0F,
+ 0x18, 0x1F, 0x00, 0x03, 0x03, 0xCE, 0x07, 0xC0, 0x01, 0x80, 0xF3, 0x01,
+ 0xE0, 0x00, 0x60, 0x3D, 0x80, 0xF8, 0x00, 0x18, 0x0F, 0xE0, 0x3E, 0x00,
+ 0x0C, 0x03, 0xF0, 0x0F, 0x00, 0x03, 0x00, 0xF8, 0x03, 0xC0, 0x00, 0xC0,
+ 0x3E, 0x01, 0xF0, 0x00, 0x70, 0x0F, 0x00, 0x7C, 0x00, 0x1C, 0x01, 0x80,
+ 0x3F, 0x00, 0x0F, 0x80, 0x60, 0x1F, 0xC0, 0x0F, 0xF8, 0x10, 0x1F, 0xFE,
+ 0x00, 0x03, 0xFC, 0x00, 0x3F, 0xE0, 0x1F, 0xC0, 0x01, 0xF8, 0x00, 0xF8,
+ 0x00, 0x1C, 0x00, 0x1F, 0x00, 0x03, 0x80, 0x03, 0xF0, 0x00, 0x60, 0x00,
+ 0x7E, 0x00, 0x0C, 0x00, 0x0B, 0xE0, 0x03, 0x80, 0x03, 0x7C, 0x00, 0x60,
+ 0x00, 0x67, 0x80, 0x0C, 0x00, 0x0C, 0xF8, 0x03, 0x80, 0x03, 0x0F, 0x00,
+ 0x70, 0x00, 0x61, 0xF0, 0x0C, 0x00, 0x0C, 0x3E, 0x01, 0x80, 0x01, 0x83,
+ 0xC0, 0x70, 0x00, 0x60, 0x7C, 0x0C, 0x00, 0x0C, 0x07, 0x81, 0x80, 0x01,
+ 0x80, 0xF8, 0x30, 0x00, 0x60, 0x0F, 0x0E, 0x00, 0x0C, 0x01, 0xE1, 0x80,
+ 0x01, 0x80, 0x3E, 0x30, 0x00, 0x30, 0x03, 0xCE, 0x00, 0x0C, 0x00, 0x7D,
+ 0x80, 0x01, 0x80, 0x07, 0xB0, 0x00, 0x30, 0x00, 0xF6, 0x00, 0x0E, 0x00,
+ 0x1F, 0xC0, 0x01, 0x80, 0x01, 0xF0, 0x00, 0x30, 0x00, 0x3E, 0x00, 0x0E,
+ 0x00, 0x03, 0xC0, 0x01, 0xC0, 0x00, 0x70, 0x00, 0x7C, 0x00, 0x06, 0x00,
+ 0x3F, 0xE0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xFE,
+ 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0xF0, 0x7C, 0x00, 0x0F, 0x00, 0x78,
+ 0x00, 0x78, 0x00, 0xF0, 0x07, 0xC0, 0x03, 0xE0, 0x3E, 0x00, 0x07, 0x81,
+ 0xF0, 0x00, 0x1E, 0x07, 0xC0, 0x00, 0x7C, 0x3E, 0x00, 0x01, 0xF1, 0xF0,
+ 0x00, 0x07, 0xC7, 0xC0, 0x00, 0x1F, 0x3F, 0x00, 0x00, 0x7C, 0xF8, 0x00,
+ 0x01, 0xF7, 0xE0, 0x00, 0x0F, 0xDF, 0x00, 0x00, 0x3F, 0x7C, 0x00, 0x00,
+ 0xFB, 0xF0, 0x00, 0x07, 0xEF, 0xC0, 0x00, 0x1F, 0xBE, 0x00, 0x00, 0x7C,
+ 0xF8, 0x00, 0x03, 0xF3, 0xE0, 0x00, 0x0F, 0x8F, 0x80, 0x00, 0x3E, 0x3E,
+ 0x00, 0x01, 0xF0, 0xF8, 0x00, 0x0F, 0x81, 0xE0, 0x00, 0x3E, 0x07, 0x80,
+ 0x01, 0xF0, 0x1F, 0x00, 0x0F, 0x80, 0x3C, 0x00, 0x7C, 0x00, 0x78, 0x03,
+ 0xC0, 0x00, 0xF8, 0x3E, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x01, 0xFC, 0x00,
+ 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x0F, 0x81, 0xF8,
+ 0x00, 0x7C, 0x03, 0xE0, 0x03, 0xE0, 0x1F, 0x00, 0x1E, 0x00, 0x7C, 0x01,
+ 0xF0, 0x03, 0xE0, 0x0F, 0x80, 0x1F, 0x00, 0x78, 0x00, 0xF8, 0x03, 0xC0,
+ 0x07, 0xC0, 0x3E, 0x00, 0x3C, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0x00, 0x3E,
+ 0x00, 0xF8, 0x03, 0xF0, 0x07, 0xC0, 0x7E, 0x00, 0x3F, 0xFF, 0xE0, 0x01,
+ 0xEF, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x07, 0x80,
+ 0x00, 0x00, 0x3C, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x1F, 0x00, 0x00,
+ 0x00, 0xF0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x03,
+ 0xC0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1F, 0xC0,
+ 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F,
+ 0xFE, 0x00, 0x00, 0xF0, 0x7C, 0x00, 0x0F, 0x00, 0x78, 0x00, 0x78, 0x00,
+ 0xF0, 0x03, 0xC0, 0x03, 0xE0, 0x1E, 0x00, 0x07, 0x80, 0xF0, 0x00, 0x1E,
+ 0x07, 0xC0, 0x00, 0x7C, 0x3E, 0x00, 0x01, 0xF1, 0xF8, 0x00, 0x07, 0xC7,
+ 0xC0, 0x00, 0x1F, 0x3F, 0x00, 0x00, 0x7C, 0xF8, 0x00, 0x01, 0xF7, 0xE0,
+ 0x00, 0x0F, 0xDF, 0x80, 0x00, 0x3F, 0x7C, 0x00, 0x00, 0xFB, 0xF0, 0x00,
+ 0x03, 0xEF, 0xC0, 0x00, 0x1F, 0xBE, 0x00, 0x00, 0x7C, 0xF8, 0x00, 0x01,
+ 0xF3, 0xE0, 0x00, 0x0F, 0x8F, 0x80, 0x00, 0x3E, 0x3E, 0x00, 0x01, 0xF0,
+ 0xF8, 0x00, 0x07, 0xC3, 0xE0, 0x00, 0x3E, 0x07, 0x80, 0x01, 0xF0, 0x1F,
+ 0x00, 0x07, 0x80, 0x3C, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xE0, 0x01, 0xE0,
+ 0x1E, 0x00, 0x01, 0xF3, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x03, 0x00,
+ 0x00, 0x00, 0x18, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x04, 0x0F, 0xF0, 0x00,
+ 0x60, 0x7F, 0xFC, 0x07, 0x03, 0xFF, 0xFF, 0xF8, 0x38, 0x1F, 0xFF, 0x80,
+ 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xF8, 0x00,
+ 0x3E, 0x0F, 0xC0, 0x03, 0xE0, 0x3E, 0x00, 0x3E, 0x01, 0xF0, 0x03, 0xC0,
+ 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x78, 0x01, 0xF0,
+ 0x07, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x7C, 0x00, 0xF0,
+ 0x1F, 0x80, 0x1F, 0xFF, 0xE0, 0x01, 0xFF, 0xF0, 0x00, 0x1E, 0x1E, 0x00,
+ 0x01, 0xE1, 0xE0, 0x00, 0x3E, 0x1F, 0x00, 0x03, 0xE0, 0xF0, 0x00, 0x3C,
+ 0x0F, 0x00, 0x03, 0xC0, 0xF8, 0x00, 0x7C, 0x07, 0x80, 0x07, 0xC0, 0x7C,
+ 0x00, 0x78, 0x03, 0xC0, 0x0F, 0x80, 0x3C, 0x00, 0xF8, 0x03, 0xE0, 0x0F,
+ 0x00, 0x1E, 0x00, 0xF0, 0x01, 0xE0, 0x1F, 0x00, 0x1F, 0x03, 0xF8, 0x00,
+ 0xF8, 0xFF, 0xE0, 0x0F, 0xE0, 0x00, 0x3F, 0x06, 0x01, 0xFF, 0xDC, 0x07,
+ 0xC1, 0xF0, 0x1E, 0x01, 0xE0, 0x3C, 0x01, 0xC0, 0xF0, 0x03, 0x81, 0xE0,
+ 0x03, 0x03, 0xC0, 0x04, 0x07, 0x80, 0x08, 0x0F, 0x80, 0x00, 0x1F, 0x00,
+ 0x00, 0x1F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00,
+ 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00,
+ 0x00, 0x3E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7C, 0x08, 0x00, 0x78, 0x10,
+ 0x00, 0xF0, 0x20, 0x01, 0xE0, 0xC0, 0x03, 0xC1, 0x80, 0x07, 0x83, 0x80,
+ 0x1E, 0x07, 0x00, 0x3C, 0x0F, 0x00, 0xF0, 0x1F, 0x87, 0xC0, 0x23, 0xFF,
+ 0x00, 0x81, 0xF8, 0x00, 0x3F, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFD, 0xF0,
+ 0x3E, 0x07, 0xB8, 0x07, 0xC0, 0x76, 0x00, 0xF8, 0x04, 0x80, 0x3E, 0x00,
+ 0xB0, 0x07, 0xC0, 0x14, 0x00, 0xF8, 0x02, 0x00, 0x1E, 0x00, 0x00, 0x07,
+ 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xC0, 0x00,
+ 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0xF8,
+ 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00,
+ 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x0F, 0x00,
+ 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x03,
+ 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x3F, 0xFF, 0x00,
+ 0x00, 0x7F, 0xFE, 0x03, 0xFE, 0x1F, 0xE0, 0x01, 0xF8, 0x1F, 0x80, 0x01,
+ 0xC0, 0x3E, 0x00, 0x03, 0x80, 0x7C, 0x00, 0x07, 0x00, 0xF8, 0x00, 0x0C,
+ 0x03, 0xE0, 0x00, 0x18, 0x07, 0xC0, 0x00, 0x70, 0x0F, 0x80, 0x00, 0xC0,
+ 0x1F, 0x00, 0x01, 0x80, 0x7C, 0x00, 0x03, 0x00, 0xF8, 0x00, 0x0E, 0x01,
+ 0xF0, 0x00, 0x18, 0x07, 0xC0, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x60, 0x1F,
+ 0x00, 0x01, 0x80, 0x3E, 0x00, 0x03, 0x00, 0xF8, 0x00, 0x06, 0x01, 0xF0,
+ 0x00, 0x18, 0x03, 0xE0, 0x00, 0x30, 0x07, 0xC0, 0x00, 0x60, 0x1F, 0x00,
+ 0x00, 0xC0, 0x3E, 0x00, 0x03, 0x00, 0x7C, 0x00, 0x06, 0x00, 0xF8, 0x00,
+ 0x18, 0x01, 0xF0, 0x00, 0x30, 0x03, 0xE0, 0x00, 0xC0, 0x03, 0xE0, 0x03,
+ 0x80, 0x03, 0xE0, 0x0E, 0x00, 0x03, 0xF0, 0x78, 0x00, 0x03, 0xFF, 0xC0,
+ 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0xE0, 0x0F, 0xF9, 0xFC, 0x00, 0x1F,
+ 0x07, 0xC0, 0x00, 0x78, 0x3E, 0x00, 0x03, 0x81, 0xF0, 0x00, 0x18, 0x0F,
+ 0x80, 0x01, 0xC0, 0x7C, 0x00, 0x0C, 0x01, 0xE0, 0x00, 0xC0, 0x0F, 0x80,
+ 0x06, 0x00, 0x7C, 0x00, 0x60, 0x03, 0xE0, 0x07, 0x00, 0x1F, 0x00, 0x30,
+ 0x00, 0xF8, 0x03, 0x00, 0x03, 0xC0, 0x18, 0x00, 0x1E, 0x01, 0x80, 0x00,
+ 0xF8, 0x1C, 0x00, 0x07, 0xC0, 0xC0, 0x00, 0x3E, 0x0C, 0x00, 0x01, 0xF0,
+ 0x60, 0x00, 0x07, 0x86, 0x00, 0x00, 0x3C, 0x30, 0x00, 0x01, 0xE3, 0x00,
+ 0x00, 0x0F, 0xB0, 0x00, 0x00, 0x7D, 0x80, 0x00, 0x03, 0xF8, 0x00, 0x00,
+ 0x0F, 0xC0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x1E,
+ 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0xFF, 0xE3, 0xFF, 0x81, 0xFE, 0x7F, 0x01, 0xFC, 0x00, 0xF8, 0x7C,
+ 0x01, 0xF0, 0x00, 0xE0, 0xF8, 0x03, 0xE0, 0x01, 0x81, 0xF0, 0x03, 0xC0,
+ 0x07, 0x03, 0xE0, 0x07, 0x80, 0x0C, 0x03, 0xC0, 0x0F, 0x00, 0x18, 0x07,
+ 0x80, 0x1E, 0x00, 0x60, 0x0F, 0x00, 0x7E, 0x00, 0xC0, 0x1F, 0x00, 0xFC,
+ 0x03, 0x00, 0x3E, 0x03, 0xF8, 0x06, 0x00, 0x7C, 0x05, 0xF0, 0x18, 0x00,
+ 0xF8, 0x1B, 0xE0, 0x30, 0x01, 0xF0, 0x33, 0xC0, 0xC0, 0x01, 0xE0, 0xC7,
+ 0x83, 0x80, 0x03, 0xC1, 0x8F, 0x06, 0x00, 0x07, 0x86, 0x1E, 0x1C, 0x00,
+ 0x0F, 0x0C, 0x3C, 0x30, 0x00, 0x1F, 0x30, 0x7C, 0xE0, 0x00, 0x3E, 0x60,
+ 0xF9, 0x80, 0x00, 0x7D, 0x81, 0xF7, 0x00, 0x00, 0xFB, 0x03, 0xEC, 0x00,
+ 0x01, 0xFC, 0x03, 0xF8, 0x00, 0x01, 0xF8, 0x07, 0xE0, 0x00, 0x03, 0xE0,
+ 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x1F, 0x00, 0x00, 0x0F, 0x00, 0x3C, 0x00,
+ 0x00, 0x1E, 0x00, 0x78, 0x00, 0x00, 0x38, 0x00, 0xE0, 0x00, 0x00, 0x70,
+ 0x01, 0xC0, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x80, 0x06, 0x00,
+ 0x00, 0x07, 0xFF, 0x83, 0xFF, 0x01, 0xFE, 0x00, 0xFE, 0x00, 0x7C, 0x00,
+ 0x78, 0x00, 0x7C, 0x00, 0x70, 0x00, 0x3C, 0x00, 0xE0, 0x00, 0x3E, 0x01,
+ 0xC0, 0x00, 0x3E, 0x01, 0x80, 0x00, 0x1F, 0x03, 0x00, 0x00, 0x1F, 0x07,
+ 0x00, 0x00, 0x0F, 0x0E, 0x00, 0x00, 0x0F, 0x9C, 0x00, 0x00, 0x0F, 0xB8,
+ 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x03, 0xC0,
+ 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xF0,
+ 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x1C, 0xF0, 0x00, 0x00, 0x38, 0xF8,
+ 0x00, 0x00, 0x30, 0xF8, 0x00, 0x00, 0x60, 0x7C, 0x00, 0x00, 0xC0, 0x7C,
+ 0x00, 0x01, 0xC0, 0x3C, 0x00, 0x03, 0x80, 0x3E, 0x00, 0x07, 0x00, 0x3E,
+ 0x00, 0x0E, 0x00, 0x1F, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x7F, 0x00, 0x3F,
+ 0xC0, 0xFF, 0xC1, 0xFF, 0xF0, 0x7F, 0xF0, 0x7F, 0xC7, 0xF0, 0x03, 0xE0,
+ 0xF8, 0x00, 0x70, 0x3E, 0x00, 0x38, 0x07, 0x80, 0x0C, 0x01, 0xE0, 0x07,
+ 0x00, 0x7C, 0x03, 0x80, 0x1F, 0x00, 0xC0, 0x03, 0xC0, 0x60, 0x00, 0xF0,
+ 0x30, 0x00, 0x3E, 0x1C, 0x00, 0x07, 0x8E, 0x00, 0x01, 0xE3, 0x00, 0x00,
+ 0x7D, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xF8, 0x00,
+ 0x00, 0x3C, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0,
+ 0x00, 0x00, 0x78, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03,
+ 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x00, 0x00,
+ 0x0F, 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x03, 0xFF,
+ 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0x81, 0xF0, 0x00, 0xFC, 0x0E, 0x00, 0x0F,
+ 0xC0, 0x60, 0x00, 0xFC, 0x06, 0x00, 0x0F, 0xC0, 0x20, 0x00, 0x7C, 0x00,
+ 0x00, 0x07, 0xE0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00,
+ 0x7E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x03, 0xF0,
+ 0x00, 0x00, 0x3F, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00,
+ 0x01, 0xF8, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x1F,
+ 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0xFC, 0x00,
+ 0x08, 0x0F, 0xC0, 0x00, 0x80, 0xFC, 0x00, 0x0C, 0x07, 0xC0, 0x00, 0x60,
+ 0x7E, 0x00, 0x07, 0x07, 0xE0, 0x01, 0xF0, 0x7F, 0xFF, 0xFF, 0x83, 0xFF,
+ 0xFF, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x3C, 0x00, 0x1C, 0x00, 0x0E, 0x00,
+ 0x07, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0xE0,
+ 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07,
+ 0x00, 0x03, 0x80, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00,
+ 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x07, 0x00,
+ 0x03, 0x80, 0x01, 0xC0, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38,
+ 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x07, 0x80, 0x03,
+ 0xFC, 0x00, 0xF0, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x03, 0x80,
+ 0x01, 0xE0, 0x00, 0x70, 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03,
+ 0xC0, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x03, 0x80,
+ 0x01, 0xC0, 0x00, 0xF0, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x03,
+ 0x80, 0x01, 0xE0, 0x00, 0x70, 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x07, 0x00,
+ 0x03, 0xC0, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07,
+ 0x80, 0x00, 0xFF, 0x80, 0x07, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0xF0,
+ 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x07,
+ 0x00, 0x03, 0x80, 0x01, 0xC0, 0x01, 0xE0, 0x00, 0xE0, 0x00, 0x70, 0x00,
+ 0x38, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80,
+ 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x78, 0x00, 0x38,
+ 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01,
+ 0xC0, 0x00, 0xE0, 0x00, 0xF0, 0x00, 0x70, 0x00, 0x38, 0x03, 0xFC, 0x00,
+ 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x03, 0xBC,
+ 0x00, 0x39, 0xC0, 0x07, 0x1E, 0x00, 0x70, 0xE0, 0x0E, 0x0F, 0x00, 0xE0,
+ 0x70, 0x1E, 0x07, 0x81, 0xC0, 0x38, 0x3C, 0x03, 0xC3, 0x80, 0x1C, 0x78,
+ 0x01, 0xE7, 0x00, 0x0E, 0xF0, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x60, 0xF0, 0xF8, 0x78, 0x3C, 0x1E, 0x0E, 0x07, 0x00, 0x1E, 0x70,
+ 0x03, 0x0B, 0x80, 0x70, 0x3C, 0x07, 0x01, 0xE0, 0x70, 0x0E, 0x07, 0x00,
+ 0x70, 0x78, 0x03, 0x83, 0x80, 0x38, 0x3C, 0x01, 0xC1, 0xC0, 0x0E, 0x1E,
+ 0x00, 0xF0, 0xF0, 0x07, 0x0F, 0x00, 0x78, 0x78, 0x03, 0xC3, 0xC0, 0x3E,
+ 0x1E, 0x01, 0x70, 0xF0, 0x17, 0x0F, 0x81, 0x38, 0xBE, 0x11, 0xC8, 0xFF,
+ 0x0F, 0x83, 0xF0, 0x70, 0x00, 0x00, 0xF0, 0x00, 0x7F, 0x00, 0x00, 0x78,
+ 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00,
+ 0x78, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x0F,
+ 0x80, 0x71, 0xFE, 0x03, 0x98, 0xF8, 0x3D, 0x03, 0xE1, 0xE8, 0x0F, 0x0E,
+ 0x80, 0x78, 0x78, 0x03, 0xC7, 0xC0, 0x1E, 0x3C, 0x00, 0xF1, 0xE0, 0x0F,
+ 0x1E, 0x00, 0x78, 0xF0, 0x03, 0xC7, 0x80, 0x3C, 0x38, 0x01, 0xE3, 0xC0,
+ 0x1E, 0x1E, 0x00, 0xE0, 0xE0, 0x0E, 0x07, 0x00, 0xF0, 0x78, 0x07, 0x03,
+ 0xC0, 0xE0, 0x0F, 0x0E, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x3F, 0x00, 0x38,
+ 0x60, 0x38, 0x1C, 0x1C, 0x0F, 0x0E, 0x03, 0x87, 0x80, 0x03, 0xC0, 0x00,
+ 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x03, 0xC0, 0x00, 0xF0,
+ 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x02, 0x3E, 0x01,
+ 0x87, 0x80, 0xC1, 0xF0, 0x60, 0x3F, 0xF0, 0x03, 0xF0, 0x00, 0x00, 0x00,
+ 0x0E, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00,
+ 0x1C, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x3C, 0x00, 0x00,
+ 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x78, 0x00, 0x71,
+ 0x70, 0x00, 0xC1, 0x70, 0x03, 0x80, 0xF0, 0x07, 0x80, 0xE0, 0x07, 0x01,
+ 0xE0, 0x0E, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x3C, 0x01, 0xC0, 0x3C, 0x01,
+ 0xC0, 0x78, 0x03, 0xC0, 0x78, 0x03, 0xC0, 0x78, 0x03, 0x80, 0xF0, 0x07,
+ 0x80, 0xF0, 0x07, 0x80, 0xF0, 0x0F, 0x80, 0xF0, 0x0F, 0x00, 0xF0, 0x17,
+ 0x08, 0xF0, 0x27, 0x10, 0x78, 0x47, 0x20, 0x7F, 0x87, 0xC0, 0x1E, 0x07,
+ 0x00, 0x00, 0x1F, 0x00, 0x1C, 0xF0, 0x1C, 0x1C, 0x0E, 0x07, 0x07, 0x01,
+ 0xC3, 0xC0, 0xF1, 0xE0, 0x38, 0x70, 0x1C, 0x3C, 0x0E, 0x1F, 0x0F, 0x07,
+ 0x8F, 0x01, 0xFE, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0,
+ 0x00, 0xF0, 0x01, 0x3C, 0x00, 0xC7, 0x80, 0x61, 0xF0, 0x60, 0x3F, 0xF0,
+ 0x03, 0xE0, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x03, 0x1C, 0x00, 0x00,
+ 0xC3, 0x80, 0x00, 0x38, 0x70, 0x00, 0x06, 0x00, 0x00, 0x01, 0xC0, 0x00,
+ 0x00, 0x30, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x78,
+ 0x00, 0x00, 0x0E, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x07, 0xFF, 0xC0, 0x00,
+ 0xFF, 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x07, 0x00,
+ 0x00, 0x01, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00,
+ 0xE0, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xF0, 0x00,
+ 0x00, 0x1C, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x1E,
+ 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x0E, 0x00, 0x00,
+ 0x03, 0xC0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x01, 0xC0,
+ 0x00, 0x00, 0x70, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x01, 0x80, 0x00, 0x38,
+ 0x60, 0x00, 0x07, 0x0C, 0x00, 0x00, 0xE3, 0x00, 0x00, 0x0F, 0x80, 0x00,
+ 0x00, 0x00, 0x3F, 0x00, 0x07, 0x0E, 0x00, 0x70, 0x3E, 0x07, 0x01, 0xF0,
+ 0x70, 0x0E, 0x07, 0x80, 0x70, 0x3C, 0x03, 0x81, 0xC0, 0x1C, 0x0E, 0x01,
+ 0xE0, 0x70, 0x0E, 0x03, 0x80, 0xF0, 0x0E, 0x0F, 0x00, 0x30, 0xE0, 0x00,
+ 0xFE, 0x00, 0x0C, 0x00, 0x00, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x7E, 0x00,
+ 0x03, 0xFE, 0x00, 0x0F, 0xFC, 0x00, 0x8F, 0xF0, 0x18, 0x0F, 0xC1, 0x80,
+ 0x1F, 0x18, 0x00, 0x78, 0xC0, 0x01, 0xC6, 0x00, 0x0E, 0x30, 0x00, 0x61,
+ 0xC0, 0x07, 0x06, 0x00, 0x70, 0x1C, 0x0E, 0x00, 0x3F, 0xC0, 0x00, 0x00,
+ 0xF0, 0x00, 0x7F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00,
+ 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1C,
+ 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x03, 0x80, 0x78, 0x7E, 0x03, 0x86, 0x70,
+ 0x3C, 0x43, 0x81, 0xE4, 0x1C, 0x0E, 0x40, 0xE0, 0x74, 0x0E, 0x07, 0xA0,
+ 0x70, 0x3E, 0x03, 0x81, 0xE0, 0x1C, 0x0F, 0x00, 0xE0, 0xF0, 0x0E, 0x07,
+ 0x80, 0x70, 0x38, 0x03, 0x81, 0xC0, 0x1C, 0x1E, 0x00, 0xC2, 0xF0, 0x0E,
+ 0x27, 0x00, 0x73, 0x38, 0x03, 0x93, 0xC0, 0x1F, 0x1E, 0x00, 0xE0, 0x03,
+ 0x81, 0xF0, 0x7C, 0x1F, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x71, 0xFC, 0x1F, 0x07, 0x81, 0xE0, 0x78, 0x1C, 0x07, 0x03, 0xC0, 0xF0,
+ 0x38, 0x0E, 0x07, 0x81, 0xE0, 0x70, 0x1C, 0x0F, 0x03, 0x84, 0xE2, 0x39,
+ 0x0F, 0x81, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01,
+ 0xF0, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x3F, 0xC0, 0x00, 0xF0, 0x00, 0x1E,
+ 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0E, 0x00, 0x03, 0xC0, 0x00, 0x78,
+ 0x00, 0x0F, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x0F, 0x00, 0x01, 0xE0,
+ 0x00, 0x38, 0x00, 0x07, 0x00, 0x01, 0xE0, 0x00, 0x38, 0x00, 0x07, 0x00,
+ 0x00, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00,
+ 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x01, 0xC7, 0x00, 0x38, 0xC0, 0x07,
+ 0x30, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x7F, 0x00, 0x00, 0x78,
+ 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00,
+ 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00,
+ 0x00, 0x70, 0xFF, 0x83, 0x80, 0xF0, 0x3C, 0x06, 0x01, 0xE0, 0x60, 0x0E,
+ 0x06, 0x00, 0x70, 0xE0, 0x07, 0x8C, 0x00, 0x3C, 0xC0, 0x01, 0xCC, 0x00,
+ 0x0F, 0xF0, 0x00, 0xFF, 0x80, 0x07, 0x9E, 0x00, 0x38, 0xF0, 0x01, 0xC3,
+ 0x80, 0x1E, 0x1E, 0x00, 0xF0, 0x70, 0x07, 0x03, 0xC2, 0x78, 0x0E, 0x13,
+ 0xC0, 0x79, 0x1E, 0x01, 0xF0, 0x00, 0x07, 0x00, 0x00, 0xE1, 0xFC, 0x0F,
+ 0x80, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1C, 0x07, 0x80, 0xF0, 0x1E, 0x03,
+ 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x70, 0x1E, 0x03, 0xC0, 0x78, 0x0E, 0x03,
+ 0xC0, 0x78, 0x0E, 0x01, 0xC0, 0x78, 0x0F, 0x01, 0xC0, 0x38, 0x4F, 0x11,
+ 0xE4, 0x39, 0x07, 0xC0, 0x70, 0x00, 0x07, 0x81, 0xC0, 0x78, 0xFE, 0x0F,
+ 0xC1, 0xF8, 0x3C, 0x33, 0x84, 0x70, 0x78, 0x87, 0x10, 0xE0, 0xF2, 0x0E,
+ 0x41, 0xC1, 0xC8, 0x39, 0x07, 0x87, 0xA0, 0x74, 0x0F, 0x0F, 0x40, 0xE8,
+ 0x1E, 0x1F, 0x01, 0xE0, 0x38, 0x3C, 0x07, 0xC0, 0xF0, 0xF8, 0x0F, 0x01,
+ 0xE1, 0xE0, 0x1E, 0x03, 0xC3, 0xC0, 0x38, 0x07, 0x07, 0x00, 0xF0, 0x1E,
+ 0x1E, 0x01, 0xE0, 0x3C, 0x3C, 0x03, 0x80, 0x79, 0x70, 0x07, 0x00, 0xE2,
+ 0xE0, 0x1E, 0x03, 0x8B, 0xC0, 0x3C, 0x07, 0x27, 0x80, 0x70, 0x0F, 0x8E,
+ 0x00, 0xE0, 0x1E, 0x00, 0x07, 0x81, 0xE3, 0xFC, 0x3F, 0x83, 0xC2, 0x3C,
+ 0x1E, 0x21, 0xE0, 0xF2, 0x0F, 0x07, 0x20, 0x70, 0x39, 0x07, 0x83, 0xD0,
+ 0x3C, 0x1F, 0x01, 0xE0, 0xE8, 0x0E, 0x0F, 0x80, 0xF0, 0x78, 0x07, 0x83,
+ 0xC0, 0x38, 0x1C, 0x01, 0xC1, 0xE0, 0x1E, 0x0F, 0x00, 0xF1, 0x70, 0x07,
+ 0x0B, 0x80, 0x38, 0xBC, 0x01, 0xC9, 0xE0, 0x0F, 0x8E, 0x00, 0x38, 0x00,
+ 0x00, 0x1F, 0x80, 0x07, 0x8F, 0x00, 0x70, 0x3C, 0x07, 0x00, 0xE0, 0x70,
+ 0x07, 0x87, 0x80, 0x3C, 0x78, 0x01, 0xE7, 0x80, 0x0F, 0x3C, 0x00, 0x7B,
+ 0xC0, 0x03, 0xDE, 0x00, 0x3D, 0xF0, 0x01, 0xEF, 0x80, 0x0F, 0x78, 0x00,
+ 0xF3, 0xC0, 0x07, 0x9E, 0x00, 0x78, 0xF0, 0x03, 0x87, 0x80, 0x38, 0x1C,
+ 0x03, 0x80, 0xF0, 0x38, 0x03, 0xC3, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x3C,
+ 0x3F, 0x00, 0x7F, 0x8F, 0xF0, 0x01, 0xF7, 0x3F, 0x00, 0x1D, 0x83, 0xF0,
+ 0x07, 0xA0, 0x3E, 0x00, 0xF8, 0x07, 0xC0, 0x1E, 0x00, 0xF8, 0x03, 0xC0,
+ 0x1F, 0x00, 0xF0, 0x03, 0xE0, 0x1E, 0x00, 0x7C, 0x03, 0xC0, 0x1F, 0x00,
+ 0x70, 0x03, 0xE0, 0x1E, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0x00, 0x70, 0x03,
+ 0xC0, 0x0E, 0x00, 0xF8, 0x03, 0xC0, 0x1E, 0x00, 0x78, 0x07, 0x80, 0x0F,
+ 0x01, 0xE0, 0x01, 0xE0, 0x70, 0x00, 0x7C, 0x3C, 0x00, 0x0F, 0x7C, 0x00,
+ 0x01, 0xC0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x01, 0xE0,
+ 0x00, 0x00, 0x38, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00,
+ 0x7E, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x03, 0x8D,
+ 0xC0, 0x38, 0x2E, 0x07, 0x80, 0xF0, 0x78, 0x07, 0x03, 0x80, 0x38, 0x38,
+ 0x03, 0xC3, 0xC0, 0x1E, 0x3C, 0x00, 0xE1, 0xE0, 0x07, 0x1E, 0x00, 0x78,
+ 0xF0, 0x03, 0x87, 0x80, 0x3C, 0x78, 0x01, 0xE3, 0xC0, 0x1F, 0x1E, 0x01,
+ 0x70, 0xF0, 0x17, 0x87, 0x80, 0xBC, 0x3C, 0x09, 0xC0, 0xF1, 0x8E, 0x07,
+ 0xF8, 0xF0, 0x1F, 0x07, 0x80, 0x00, 0x38, 0x00, 0x03, 0xC0, 0x00, 0x1E,
+ 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00,
+ 0x3E, 0x00, 0x0F, 0xFE, 0x00, 0x07, 0x87, 0x3F, 0x87, 0xC3, 0xC7, 0xE1,
+ 0xE6, 0xF0, 0xF6, 0x00, 0x72, 0x00, 0x3A, 0x00, 0x1D, 0x00, 0x1F, 0x00,
+ 0x0E, 0x80, 0x07, 0x80, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0,
+ 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x0F,
+ 0x00, 0x00, 0x01, 0xF8, 0x81, 0x87, 0xC1, 0x80, 0xE1, 0xC0, 0x60, 0xE0,
+ 0x10, 0x70, 0x08, 0x3C, 0x04, 0x1F, 0x00, 0x07, 0xC0, 0x03, 0xE0, 0x00,
+ 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x03, 0xC1, 0x01, 0xE0, 0x80, 0x70,
+ 0x40, 0x38, 0x30, 0x1C, 0x38, 0x0C, 0x1C, 0x0E, 0x0F, 0x0E, 0x04, 0x7C,
+ 0x00, 0x00, 0xC0, 0x18, 0x03, 0x80, 0x78, 0x1F, 0x03, 0xFF, 0x7F, 0xF0,
+ 0xF0, 0x0E, 0x00, 0xE0, 0x1E, 0x01, 0xE0, 0x1C, 0x01, 0xC0, 0x3C, 0x03,
+ 0xC0, 0x38, 0x03, 0x80, 0x78, 0x07, 0x80, 0x70, 0x8F, 0x10, 0xF1, 0x0F,
+ 0x20, 0xFC, 0x07, 0x80, 0x00, 0x00, 0x00, 0xF0, 0x0E, 0x7F, 0x00, 0xE0,
+ 0xF0, 0x1E, 0x0E, 0x01, 0xE1, 0xE0, 0x3C, 0x1E, 0x03, 0xC1, 0xE0, 0x3C,
+ 0x1C, 0x07, 0xC3, 0xC0, 0x78, 0x3C, 0x0F, 0x83, 0xC0, 0xB8, 0x38, 0x1F,
+ 0x87, 0x83, 0x70, 0x78, 0x27, 0x07, 0x86, 0x70, 0x70, 0xC7, 0x1F, 0x08,
+ 0xE1, 0xE1, 0x0E, 0x2E, 0x60, 0xE4, 0xFC, 0x0F, 0x87, 0x00, 0x70, 0x1C,
+ 0x03, 0xBF, 0x00, 0xF1, 0xE0, 0x3C, 0x78, 0x07, 0x1E, 0x00, 0xC3, 0x80,
+ 0x30, 0xE0, 0x08, 0x38, 0x06, 0x0E, 0x01, 0x03, 0x80, 0xC0, 0xF0, 0x20,
+ 0x3C, 0x10, 0x07, 0x04, 0x01, 0xC2, 0x00, 0x71, 0x00, 0x1C, 0xC0, 0x07,
+ 0x60, 0x01, 0xF0, 0x00, 0x78, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x01, 0x00,
+ 0x00, 0x0C, 0x00, 0x40, 0x3B, 0xF8, 0x01, 0x00, 0xF1, 0xE0, 0x0C, 0x03,
+ 0xC3, 0x80, 0x78, 0x07, 0x0E, 0x01, 0xE0, 0x0C, 0x38, 0x0F, 0x80, 0x20,
+ 0xE0, 0x6E, 0x00, 0x83, 0x81, 0x38, 0x04, 0x0F, 0x0C, 0xE0, 0x10, 0x1C,
+ 0x23, 0x80, 0x80, 0x71, 0x8E, 0x06, 0x01, 0xCC, 0x38, 0x10, 0x07, 0x20,
+ 0xE0, 0x80, 0x1D, 0x83, 0x86, 0x00, 0x7C, 0x07, 0x30, 0x01, 0xF0, 0x1C,
+ 0x80, 0x07, 0x80, 0x74, 0x00, 0x1E, 0x01, 0xF0, 0x00, 0x70, 0x07, 0x80,
+ 0x01, 0xC0, 0x1C, 0x00, 0x06, 0x00, 0x60, 0x00, 0x10, 0x01, 0x00, 0x00,
+ 0x00, 0xE0, 0x38, 0x1F, 0x81, 0xF0, 0x8F, 0x09, 0x80, 0x3C, 0x40, 0x00,
+ 0x72, 0x00, 0x01, 0xD0, 0x00, 0x07, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0x38,
+ 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x7C, 0x00,
+ 0x01, 0x70, 0x00, 0x09, 0xC0, 0x00, 0x67, 0x00, 0x01, 0x1E, 0x10, 0x08,
+ 0x38, 0x40, 0x40, 0xE2, 0x39, 0x03, 0xD0, 0xF8, 0x0F, 0x83, 0xC0, 0x1C,
+ 0x00, 0x07, 0x80, 0x33, 0xFC, 0x03, 0xC1, 0xE0, 0x1E, 0x07, 0x80, 0x70,
+ 0x3C, 0x01, 0x80, 0xE0, 0x0C, 0x07, 0x80, 0x40, 0x3C, 0x02, 0x00, 0xE0,
+ 0x20, 0x07, 0x81, 0x00, 0x3C, 0x18, 0x01, 0xE0, 0x80, 0x07, 0x0C, 0x00,
+ 0x38, 0x40, 0x01, 0xE4, 0x00, 0x0F, 0x60, 0x00, 0x3A, 0x00, 0x01, 0xF0,
+ 0x00, 0x0F, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x18, 0x00, 0x00,
+ 0x80, 0x00, 0x0C, 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00,
+ 0x04, 0x00, 0x0E, 0x40, 0x00, 0x7C, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x0F,
+ 0xFF, 0x87, 0xFF, 0x82, 0x00, 0x83, 0x00, 0xC1, 0x00, 0xC0, 0x00, 0xC0,
+ 0x00, 0xC0, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x20,
+ 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x18, 0x00, 0x1E,
+ 0x00, 0x1F, 0xC0, 0x1F, 0xF0, 0xE8, 0xFC, 0x70, 0x1E, 0x38, 0x03, 0x88,
+ 0x00, 0x78, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x0E, 0x00, 0x0F,
+ 0x00, 0x07, 0x80, 0x03, 0x80, 0x01, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00,
+ 0x70, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x0F, 0x00,
+ 0x07, 0x80, 0x07, 0x80, 0x03, 0xC0, 0x07, 0xC0, 0x07, 0xC0, 0x00, 0x80,
+ 0x00, 0x60, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x07,
+ 0x80, 0x03, 0x80, 0x01, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x70, 0x00,
+ 0x38, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x01, 0x80,
+ 0x00, 0x70, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x18, 0x00, 0x0E, 0x00, 0x06, 0x00, 0x07,
+ 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0E,
+ 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x3C,
+ 0x00, 0x3C, 0x00, 0x38, 0x00, 0x38, 0x00, 0x18, 0x00, 0x08, 0x00, 0x1C,
+ 0x00, 0x7E, 0x00, 0x78, 0x00, 0xF0, 0x00, 0xE0, 0x01, 0xE0, 0x01, 0xE0,
+ 0x01, 0xC0, 0x01, 0xC0, 0x03, 0xC0, 0x03, 0x80, 0x03, 0x80, 0x07, 0x80,
+ 0x07, 0x80, 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x1C, 0x00,
+ 0xF8, 0x00, 0x1F, 0x80, 0x00, 0xFF, 0x80, 0xC7, 0xFF, 0x87, 0xBC, 0x3F,
+ 0xFE, 0x60, 0x3F, 0xF0, 0x00, 0x1F, 0x00 };
+
+const GFXglyph FreeSerifItalic24pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 12, 0, 1 }, // 0x20 ' '
+ { 0, 12, 32, 16, 2, -30 }, // 0x21 '!'
+ { 48, 14, 12, 16, 6, -31 }, // 0x22 '"'
+ { 69, 25, 31, 23, 0, -30 }, // 0x23 '#'
+ { 166, 21, 38, 24, 2, -33 }, // 0x24 '$'
+ { 266, 33, 32, 39, 4, -30 }, // 0x25 '%'
+ { 398, 30, 33, 37, 4, -31 }, // 0x26 '&'
+ { 522, 5, 12, 9, 6, -31 }, // 0x27 '''
+ { 530, 13, 39, 16, 2, -30 }, // 0x28 '('
+ { 594, 13, 39, 16, 0, -30 }, // 0x29 ')'
+ { 658, 16, 20, 23, 7, -31 }, // 0x2A '*'
+ { 698, 23, 23, 32, 4, -22 }, // 0x2B '+'
+ { 765, 7, 11, 12, -1, -4 }, // 0x2C ','
+ { 775, 11, 3, 16, 2, -11 }, // 0x2D '-'
+ { 780, 5, 5, 12, 1, -3 }, // 0x2E '.'
+ { 784, 21, 33, 14, 0, -31 }, // 0x2F '/'
+ { 871, 21, 31, 23, 2, -30 }, // 0x30 '0'
+ { 953, 17, 32, 23, 2, -31 }, // 0x31 '1'
+ { 1021, 21, 31, 24, 0, -30 }, // 0x32 '2'
+ { 1103, 22, 32, 23, 0, -31 }, // 0x33 '3'
+ { 1191, 22, 32, 23, 0, -31 }, // 0x34 '4'
+ { 1279, 22, 32, 24, 0, -31 }, // 0x35 '5'
+ { 1367, 23, 32, 23, 1, -31 }, // 0x36 '6'
+ { 1459, 21, 32, 23, 4, -31 }, // 0x37 '7'
+ { 1543, 22, 32, 23, 1, -31 }, // 0x38 '8'
+ { 1631, 22, 33, 23, 1, -31 }, // 0x39 '9'
+ { 1722, 9, 22, 12, 2, -20 }, // 0x3A ':'
+ { 1747, 11, 27, 12, 1, -20 }, // 0x3B ';'
+ { 1785, 23, 25, 27, 3, -24 }, // 0x3C '<'
+ { 1857, 24, 12, 31, 4, -17 }, // 0x3D '='
+ { 1893, 24, 25, 27, 3, -24 }, // 0x3E '>'
+ { 1968, 16, 33, 21, 6, -31 }, // 0x3F '?'
+ { 2034, 33, 33, 37, 3, -31 }, // 0x40 '@'
+ { 2171, 29, 31, 31, 0, -30 }, // 0x41 'A'
+ { 2284, 28, 31, 28, 0, -30 }, // 0x42 'B'
+ { 2393, 30, 33, 29, 2, -31 }, // 0x43 'C'
+ { 2517, 33, 31, 33, 0, -30 }, // 0x44 'D'
+ { 2645, 29, 31, 27, 0, -30 }, // 0x45 'E'
+ { 2758, 29, 31, 27, 0, -30 }, // 0x46 'F'
+ { 2871, 31, 33, 32, 2, -31 }, // 0x47 'G'
+ { 2999, 36, 31, 33, 0, -30 }, // 0x48 'H'
+ { 3139, 18, 31, 15, 0, -30 }, // 0x49 'I'
+ { 3209, 23, 32, 20, 0, -30 }, // 0x4A 'J'
+ { 3301, 33, 31, 30, 0, -30 }, // 0x4B 'K'
+ { 3429, 27, 31, 27, 0, -30 }, // 0x4C 'L'
+ { 3534, 42, 31, 39, 0, -30 }, // 0x4D 'M'
+ { 3697, 35, 32, 32, 0, -30 }, // 0x4E 'N'
+ { 3837, 30, 33, 31, 2, -31 }, // 0x4F 'O'
+ { 3961, 29, 31, 27, 0, -30 }, // 0x50 'P'
+ { 4074, 30, 41, 31, 2, -31 }, // 0x51 'Q'
+ { 4228, 28, 31, 29, 0, -30 }, // 0x52 'R'
+ { 4337, 23, 33, 21, 0, -31 }, // 0x53 'S'
+ { 4432, 27, 31, 28, 4, -30 }, // 0x54 'T'
+ { 4537, 31, 32, 33, 5, -30 }, // 0x55 'U'
+ { 4661, 29, 32, 31, 6, -30 }, // 0x56 'V'
+ { 4777, 39, 32, 42, 6, -30 }, // 0x57 'W'
+ { 4933, 32, 31, 31, 0, -30 }, // 0x58 'X'
+ { 5057, 26, 31, 28, 5, -30 }, // 0x59 'Y'
+ { 5158, 29, 31, 26, 0, -30 }, // 0x5A 'Z'
+ { 5271, 17, 39, 18, 1, -31 }, // 0x5B '['
+ { 5354, 17, 33, 23, 5, -31 }, // 0x5C '\'
+ { 5425, 17, 39, 18, 1, -31 }, // 0x5D ']'
+ { 5508, 20, 17, 20, 0, -31 }, // 0x5E '^'
+ { 5551, 24, 2, 23, 0, 5 }, // 0x5F '_'
+ { 5557, 8, 8, 12, 6, -31 }, // 0x60 '`'
+ { 5565, 21, 21, 23, 1, -20 }, // 0x61 'a'
+ { 5621, 21, 33, 22, 1, -31 }, // 0x62 'b'
+ { 5708, 18, 22, 19, 1, -20 }, // 0x63 'c'
+ { 5758, 24, 33, 23, 1, -31 }, // 0x64 'd'
+ { 5857, 18, 22, 19, 1, -20 }, // 0x65 'e'
+ { 5907, 27, 42, 20, -4, -31 }, // 0x66 'f'
+ { 6049, 21, 31, 21, -1, -20 }, // 0x67 'g'
+ { 6131, 21, 32, 23, 1, -31 }, // 0x68 'h'
+ { 6215, 10, 32, 12, 2, -30 }, // 0x69 'i'
+ { 6255, 19, 41, 13, -3, -30 }, // 0x6A 'j'
+ { 6353, 21, 33, 21, 1, -31 }, // 0x6B 'k'
+ { 6440, 11, 33, 12, 2, -31 }, // 0x6C 'l'
+ { 6486, 31, 21, 34, 1, -20 }, // 0x6D 'm'
+ { 6568, 21, 21, 23, 1, -20 }, // 0x6E 'n'
+ { 6624, 21, 22, 22, 1, -20 }, // 0x6F 'o'
+ { 6682, 27, 31, 22, -4, -20 }, // 0x70 'p'
+ { 6787, 21, 31, 23, 1, -20 }, // 0x71 'q'
+ { 6869, 17, 21, 17, 1, -20 }, // 0x72 'r'
+ { 6914, 17, 22, 16, 0, -20 }, // 0x73 's'
+ { 6961, 12, 26, 11, 1, -24 }, // 0x74 't'
+ { 7000, 20, 22, 23, 1, -20 }, // 0x75 'u'
+ { 7055, 18, 22, 21, 3, -20 }, // 0x76 'v'
+ { 7105, 30, 22, 32, 2, -20 }, // 0x77 'w'
+ { 7188, 22, 22, 20, -1, -20 }, // 0x78 'x'
+ { 7249, 21, 31, 22, 1, -20 }, // 0x79 'y'
+ { 7331, 17, 24, 18, 0, -19 }, // 0x7A 'z'
+ { 7382, 17, 40, 19, 2, -31 }, // 0x7B '{'
+ { 7467, 3, 33, 13, 5, -31 }, // 0x7C '|'
+ { 7480, 16, 41, 19, 0, -32 }, // 0x7D '}'
+ { 7562, 22, 6, 25, 2, -14 } }; // 0x7E '~'
+
+const GFXfont FreeSerifItalic24pt7b PROGMEM = {
+ (uint8_t *)FreeSerifItalic24pt7bBitmaps,
+ (GFXglyph *)FreeSerifItalic24pt7bGlyphs,
+ 0x20, 0x7E, 56 };
+
+// Approx. 8251 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifItalic9pt7b.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifItalic9pt7b.h
new file mode 100644
index 000000000000..34e6b8df21e5
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/FreeSerifItalic9pt7b.h
@@ -0,0 +1,202 @@
+const uint8_t FreeSerifItalic9pt7bBitmaps[] PROGMEM = {
+ 0x11, 0x12, 0x22, 0x24, 0x40, 0x0C, 0xDE, 0xE5, 0x40, 0x04, 0x82, 0x20,
+ 0x98, 0x24, 0x7F, 0xC4, 0x82, 0x23, 0xFC, 0x24, 0x11, 0x04, 0x83, 0x20,
+ 0x1C, 0x1B, 0x99, 0x4D, 0x26, 0x81, 0xC0, 0x70, 0x1C, 0x13, 0x49, 0xA4,
+ 0xDA, 0xC7, 0xC1, 0x00, 0x80, 0x1C, 0x61, 0xCF, 0x0E, 0x28, 0x30, 0xA0,
+ 0xC5, 0x03, 0x34, 0xE7, 0xAE, 0x40, 0xB1, 0x05, 0x84, 0x26, 0x20, 0x99,
+ 0x84, 0x3C, 0x03, 0x80, 0x6C, 0x06, 0xC0, 0x78, 0x06, 0x01, 0xEF, 0x66,
+ 0x24, 0x24, 0xC3, 0x8C, 0x10, 0xE3, 0x87, 0xCE, 0xFA, 0x08, 0x21, 0x08,
+ 0x61, 0x8C, 0x30, 0xC3, 0x0C, 0x30, 0x41, 0x02, 0x00, 0x10, 0x40, 0x82,
+ 0x0C, 0x30, 0xC3, 0x0C, 0x61, 0x84, 0x21, 0x08, 0x00, 0x30, 0xCA, 0x5E,
+ 0x6A, 0x93, 0x08, 0x08, 0x04, 0x02, 0x01, 0x0F, 0xF8, 0x40, 0x20, 0x10,
+ 0x08, 0x00, 0x56, 0xF0, 0xF0, 0x03, 0x02, 0x06, 0x04, 0x08, 0x08, 0x10,
+ 0x30, 0x20, 0x60, 0x40, 0xC0, 0x0E, 0x0C, 0x8C, 0x6C, 0x36, 0x1F, 0x0F,
+ 0x07, 0x87, 0xC3, 0x61, 0xB1, 0x88, 0x83, 0x80, 0x04, 0x70, 0xC3, 0x08,
+ 0x21, 0x86, 0x10, 0x43, 0x08, 0xF8, 0x1C, 0x67, 0x83, 0x03, 0x02, 0x06,
+ 0x0C, 0x08, 0x10, 0x20, 0x42, 0xFC, 0x0F, 0x08, 0xC0, 0x60, 0xC1, 0xE0,
+ 0x38, 0x0C, 0x06, 0x03, 0x01, 0x01, 0x1F, 0x00, 0x01, 0x01, 0x81, 0x41,
+ 0x61, 0x21, 0x11, 0x18, 0x88, 0xFF, 0x02, 0x03, 0x01, 0x00, 0x0F, 0x84,
+ 0x04, 0x03, 0x80, 0x60, 0x18, 0x0C, 0x06, 0x03, 0x03, 0x03, 0x1E, 0x00,
+ 0x01, 0x83, 0x87, 0x07, 0x03, 0x03, 0x73, 0xCD, 0x86, 0xC3, 0x61, 0xB1,
+ 0x88, 0xC3, 0xC0, 0x7F, 0x40, 0x80, 0x80, 0x40, 0x40, 0x60, 0x20, 0x20,
+ 0x10, 0x10, 0x18, 0x08, 0x00, 0x1E, 0x19, 0xCC, 0x66, 0x33, 0xB0, 0xE0,
+ 0x50, 0xCC, 0xC3, 0x61, 0xB0, 0xCC, 0xC3, 0xC0, 0x0E, 0x19, 0x8C, 0x6C,
+ 0x36, 0x1B, 0x0D, 0x86, 0xE6, 0x3F, 0x03, 0x03, 0x06, 0x0C, 0x00, 0x33,
+ 0x00, 0x00, 0xCC, 0x33, 0x00, 0x00, 0x44, 0x48, 0x01, 0x83, 0x86, 0x1C,
+ 0x0C, 0x03, 0x80, 0x30, 0x07, 0x00, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x0F,
+ 0xF8, 0xC0, 0x1C, 0x03, 0x80, 0x70, 0x18, 0x38, 0x70, 0xC0, 0x80, 0x00,
+ 0x3C, 0x8C, 0x18, 0x30, 0xC3, 0x0C, 0x20, 0x40, 0x80, 0x06, 0x00, 0x0F,
+ 0xC0, 0xC3, 0x0C, 0x04, 0xC7, 0xBC, 0x64, 0xE2, 0x27, 0x31, 0x39, 0x91,
+ 0xCC, 0x93, 0x3B, 0x0E, 0x00, 0x1F, 0x80, 0x01, 0x00, 0x60, 0x14, 0x04,
+ 0xC0, 0x98, 0x23, 0x07, 0xE1, 0x04, 0x20, 0x88, 0x1B, 0x8F, 0x80, 0x3F,
+ 0xC1, 0x8C, 0x21, 0x8C, 0x31, 0x8C, 0x3E, 0x04, 0x61, 0x86, 0x30, 0xC4,
+ 0x19, 0x86, 0x7F, 0x80, 0x07, 0x91, 0x86, 0x30, 0x26, 0x02, 0x60, 0x0C,
+ 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0x61, 0x83, 0xE0, 0x3F, 0xC0,
+ 0x63, 0x82, 0x0C, 0x30, 0x31, 0x81, 0x8C, 0x0C, 0x40, 0x66, 0x07, 0x30,
+ 0x31, 0x03, 0x18, 0x71, 0xFE, 0x00, 0x3F, 0xF0, 0xC2, 0x08, 0x21, 0x80,
+ 0x19, 0x81, 0xF8, 0x11, 0x03, 0x10, 0x30, 0x02, 0x04, 0x60, 0x8F, 0xF8,
+ 0x3F, 0xF0, 0xC2, 0x08, 0x21, 0x80, 0x19, 0x81, 0xF8, 0x11, 0x03, 0x10,
+ 0x30, 0x02, 0x00, 0x60, 0x0F, 0x80, 0x07, 0x91, 0x87, 0x30, 0x26, 0x02,
+ 0x60, 0x0C, 0x00, 0xC1, 0xFC, 0x0C, 0xC0, 0xCC, 0x0C, 0x60, 0x83, 0xF0,
+ 0x3E, 0x3C, 0x30, 0x60, 0x81, 0x06, 0x0C, 0x18, 0x30, 0x7F, 0x81, 0x06,
+ 0x0C, 0x18, 0x30, 0x60, 0x81, 0x06, 0x0C, 0x3C, 0x78, 0x1E, 0x18, 0x20,
+ 0xC1, 0x83, 0x04, 0x18, 0x30, 0x41, 0x87, 0x80, 0x0F, 0x81, 0x80, 0x80,
+ 0xC0, 0x60, 0x20, 0x30, 0x18, 0x0C, 0x04, 0x36, 0x1E, 0x00, 0x3E, 0x78,
+ 0x61, 0x82, 0x10, 0x31, 0x01, 0xB0, 0x0E, 0x00, 0x58, 0x06, 0x60, 0x33,
+ 0x01, 0x0C, 0x18, 0x61, 0xE7, 0xC0, 0x3E, 0x01, 0x80, 0x20, 0x0C, 0x01,
+ 0x80, 0x30, 0x04, 0x01, 0x80, 0x30, 0x04, 0x0D, 0x83, 0x7F, 0xE0, 0x1C,
+ 0x07, 0x0C, 0x0E, 0x0C, 0x14, 0x14, 0x1C, 0x14, 0x2C, 0x16, 0x4C, 0x26,
+ 0x48, 0x26, 0x98, 0x27, 0x18, 0x27, 0x10, 0x42, 0x30, 0xF4, 0x7C, 0x38,
+ 0x78, 0x60, 0x83, 0x04, 0x2C, 0x41, 0x22, 0x09, 0x10, 0x4D, 0x84, 0x28,
+ 0x21, 0x41, 0x06, 0x10, 0x21, 0xE1, 0x00, 0x07, 0x83, 0x18, 0xC1, 0xB0,
+ 0x36, 0x07, 0xC0, 0xF0, 0x3E, 0x06, 0xC0, 0xD8, 0x31, 0x8C, 0x1E, 0x00,
+ 0x3F, 0xC1, 0x9C, 0x21, 0x8C, 0x31, 0x86, 0x31, 0x87, 0xE1, 0x80, 0x30,
+ 0x04, 0x01, 0x80, 0x78, 0x00, 0x07, 0x83, 0x18, 0xC1, 0x98, 0x36, 0x07,
+ 0xC0, 0xF0, 0x1E, 0x06, 0xC0, 0xD8, 0x31, 0x04, 0x13, 0x01, 0x80, 0x70,
+ 0xB7, 0xE0, 0x3F, 0xC1, 0x8C, 0x21, 0x8C, 0x31, 0x8C, 0x3F, 0x04, 0xC1,
+ 0x98, 0x31, 0x84, 0x31, 0x86, 0x78, 0x70, 0x1E, 0x4C, 0x63, 0x08, 0xC0,
+ 0x38, 0x07, 0x00, 0x60, 0x0C, 0x43, 0x10, 0xC6, 0x62, 0x70, 0x7F, 0xE9,
+ 0x8E, 0x31, 0x04, 0x01, 0x80, 0x30, 0x06, 0x00, 0x80, 0x30, 0x06, 0x00,
+ 0x80, 0x7E, 0x00, 0x7C, 0xF3, 0x02, 0x30, 0x46, 0x04, 0x60, 0x46, 0x04,
+ 0x40, 0x8C, 0x08, 0xC0, 0x8C, 0x10, 0xE3, 0x03, 0xC0, 0xF8, 0xEC, 0x0C,
+ 0x81, 0x18, 0x43, 0x08, 0x62, 0x0C, 0x81, 0x90, 0x14, 0x03, 0x00, 0x60,
+ 0x08, 0x00, 0xFB, 0xCE, 0x43, 0x0C, 0x86, 0x11, 0x8C, 0x43, 0x38, 0x86,
+ 0xB2, 0x0D, 0x24, 0x1C, 0x50, 0x38, 0xA0, 0x21, 0x80, 0x42, 0x01, 0x04,
+ 0x00, 0x3E, 0x71, 0x82, 0x0C, 0x40, 0xC8, 0x07, 0x00, 0x60, 0x06, 0x00,
+ 0xB0, 0x13, 0x02, 0x18, 0x61, 0x8F, 0x3E, 0xF9, 0xC8, 0x23, 0x10, 0xC8,
+ 0x34, 0x05, 0x01, 0x80, 0x40, 0x30, 0x0C, 0x03, 0x03, 0xE0, 0x3F, 0xE4,
+ 0x19, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0x40, 0x18, 0x06, 0x05,
+ 0x81, 0x7F, 0xE0, 0x0E, 0x10, 0x20, 0x81, 0x02, 0x04, 0x10, 0x20, 0x40,
+ 0x82, 0x04, 0x08, 0x1C, 0x00, 0x81, 0x04, 0x18, 0x20, 0xC1, 0x04, 0x08,
+ 0x20, 0x41, 0x38, 0x20, 0x82, 0x08, 0x41, 0x04, 0x10, 0xC2, 0x08, 0x20,
+ 0x8C, 0x00, 0x18, 0x18, 0x2C, 0x24, 0x46, 0x42, 0x83, 0xFF, 0x80, 0xD8,
+ 0x80, 0x1F, 0x98, 0x98, 0x4C, 0x2C, 0x36, 0x33, 0x3A, 0xEE, 0x38, 0x08,
+ 0x04, 0x02, 0x03, 0x71, 0xCC, 0xC6, 0xC3, 0x63, 0x21, 0x93, 0x8F, 0x00,
+ 0x1F, 0x33, 0x60, 0xC0, 0xC0, 0xC0, 0xC4, 0x78, 0x01, 0x80, 0x40, 0x60,
+ 0x20, 0xF1, 0x89, 0x8C, 0xC4, 0xC2, 0x63, 0x33, 0xAE, 0xE0, 0x0E, 0x65,
+ 0x8B, 0x2F, 0x98, 0x31, 0x3C, 0x01, 0xE0, 0x40, 0x08, 0x02, 0x00, 0x40,
+ 0x3E, 0x03, 0x00, 0x40, 0x08, 0x01, 0x00, 0x60, 0x0C, 0x01, 0x00, 0x20,
+ 0x04, 0x01, 0x00, 0xC0, 0x00, 0x1E, 0x19, 0xD8, 0xCC, 0xE1, 0xC3, 0x01,
+ 0xE0, 0xBC, 0x82, 0x41, 0x31, 0x0F, 0x00, 0x38, 0x08, 0x04, 0x02, 0x03,
+ 0x39, 0x6C, 0xC6, 0x46, 0x63, 0x21, 0x11, 0xB8, 0xE0, 0x30, 0x00, 0xE2,
+ 0x44, 0xC8, 0xCE, 0x06, 0x00, 0x00, 0x00, 0xC0, 0x83, 0x04, 0x08, 0x10,
+ 0x60, 0x81, 0x02, 0x04, 0x70, 0x38, 0x10, 0x10, 0x10, 0x37, 0x22, 0x24,
+ 0x38, 0x78, 0x48, 0x4D, 0xC6, 0x73, 0x32, 0x26, 0x64, 0x4C, 0xDE, 0x77,
+ 0x39, 0x5E, 0xCC, 0xCC, 0xCE, 0x66, 0x62, 0x22, 0x11, 0x11, 0xB9, 0x8E,
+ 0x77, 0x3B, 0x33, 0x62, 0x62, 0x42, 0x4D, 0xCE, 0x0F, 0x18, 0xD8, 0x7C,
+ 0x3C, 0x3E, 0x1B, 0x18, 0xF0, 0x3B, 0x87, 0x31, 0x8C, 0x43, 0x31, 0x88,
+ 0x62, 0x30, 0xF0, 0x60, 0x10, 0x04, 0x03, 0x80, 0x0F, 0x18, 0x98, 0x4C,
+ 0x2C, 0x26, 0x33, 0x38, 0xEC, 0x04, 0x02, 0x03, 0x03, 0xC0, 0x76, 0x50,
+ 0xC1, 0x06, 0x08, 0x10, 0x60, 0x1A, 0x6C, 0xC8, 0xC0, 0xD1, 0xB3, 0x5C,
+ 0x23, 0xC8, 0xC4, 0x21, 0x18, 0xE0, 0xC3, 0x42, 0x42, 0xC6, 0x86, 0x8C,
+ 0x9D, 0xEE, 0x62, 0xC4, 0x89, 0xA3, 0x47, 0x0C, 0x10, 0xE2, 0x2C, 0x44,
+ 0xD8, 0x9D, 0x23, 0xA4, 0x65, 0x0C, 0xC1, 0x10, 0x19, 0x95, 0x43, 0x01,
+ 0x80, 0xC0, 0xA0, 0x91, 0x8E, 0x70, 0x88, 0x46, 0x23, 0x20, 0x90, 0x50,
+ 0x28, 0x18, 0x08, 0x08, 0x08, 0x18, 0x00, 0x3F, 0x42, 0x04, 0x08, 0x10,
+ 0x20, 0x40, 0x72, 0x0E, 0x08, 0x61, 0x04, 0x30, 0x86, 0x08, 0x61, 0x04,
+ 0x30, 0xC3, 0x8F, 0x00, 0xFF, 0xF0, 0x1E, 0x0C, 0x10, 0x20, 0xC1, 0x82,
+ 0x04, 0x1C, 0x30, 0x40, 0x83, 0x04, 0x08, 0x20, 0x60, 0x99, 0x8E };
+
+const GFXglyph FreeSerifItalic9pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 5, 0, 1 }, // 0x20 ' '
+ { 0, 4, 12, 6, 1, -11 }, // 0x21 '!'
+ { 6, 5, 4, 6, 3, -11 }, // 0x22 '"'
+ { 9, 10, 12, 9, 0, -11 }, // 0x23 '#'
+ { 24, 9, 15, 9, 1, -12 }, // 0x24 '$'
+ { 41, 14, 12, 15, 1, -11 }, // 0x25 '%'
+ { 62, 12, 12, 14, 1, -11 }, // 0x26 '&'
+ { 80, 2, 4, 4, 3, -11 }, // 0x27 '''
+ { 81, 6, 15, 6, 1, -11 }, // 0x28 '('
+ { 93, 6, 15, 6, 0, -11 }, // 0x29 ')'
+ { 105, 6, 8, 9, 3, -11 }, // 0x2A '*'
+ { 111, 9, 9, 12, 1, -8 }, // 0x2B '+'
+ { 122, 2, 4, 5, 0, -1 }, // 0x2C ','
+ { 123, 4, 1, 6, 1, -3 }, // 0x2D '-'
+ { 124, 2, 2, 5, 0, -1 }, // 0x2E '.'
+ { 125, 8, 12, 5, 0, -11 }, // 0x2F '/'
+ { 137, 9, 13, 9, 1, -12 }, // 0x30 '0'
+ { 152, 6, 13, 9, 1, -12 }, // 0x31 '1'
+ { 162, 8, 12, 9, 1, -11 }, // 0x32 '2'
+ { 174, 9, 12, 9, 0, -11 }, // 0x33 '3'
+ { 188, 9, 12, 9, 0, -11 }, // 0x34 '4'
+ { 202, 9, 12, 9, 0, -11 }, // 0x35 '5'
+ { 216, 9, 13, 9, 1, -12 }, // 0x36 '6'
+ { 231, 9, 12, 9, 1, -11 }, // 0x37 '7'
+ { 245, 9, 13, 9, 1, -12 }, // 0x38 '8'
+ { 260, 9, 13, 9, 0, -12 }, // 0x39 '9'
+ { 275, 4, 8, 4, 1, -7 }, // 0x3A ':'
+ { 279, 4, 10, 4, 1, -7 }, // 0x3B ';'
+ { 284, 9, 9, 10, 1, -8 }, // 0x3C '<'
+ { 295, 9, 5, 12, 2, -6 }, // 0x3D '='
+ { 301, 9, 9, 10, 1, -8 }, // 0x3E '>'
+ { 312, 7, 12, 8, 2, -11 }, // 0x3F '?'
+ { 323, 13, 12, 14, 1, -11 }, // 0x40 '@'
+ { 343, 11, 11, 12, 0, -10 }, // 0x41 'A'
+ { 359, 11, 12, 11, 0, -11 }, // 0x42 'B'
+ { 376, 12, 12, 11, 1, -11 }, // 0x43 'C'
+ { 394, 13, 12, 13, 0, -11 }, // 0x44 'D'
+ { 414, 12, 12, 10, 0, -11 }, // 0x45 'E'
+ { 432, 12, 12, 10, 0, -11 }, // 0x46 'F'
+ { 450, 12, 12, 12, 1, -11 }, // 0x47 'G'
+ { 468, 14, 12, 13, 0, -11 }, // 0x48 'H'
+ { 489, 7, 12, 6, 0, -11 }, // 0x49 'I'
+ { 500, 9, 12, 8, 0, -11 }, // 0x4A 'J'
+ { 514, 13, 12, 12, 0, -11 }, // 0x4B 'K'
+ { 534, 11, 12, 10, 0, -11 }, // 0x4C 'L'
+ { 551, 16, 12, 15, 0, -11 }, // 0x4D 'M'
+ { 575, 13, 12, 12, 0, -11 }, // 0x4E 'N'
+ { 595, 11, 12, 12, 1, -11 }, // 0x4F 'O'
+ { 612, 11, 12, 10, 0, -11 }, // 0x50 'P'
+ { 629, 11, 15, 12, 1, -11 }, // 0x51 'Q'
+ { 650, 11, 12, 11, 0, -11 }, // 0x52 'R'
+ { 667, 10, 12, 8, 0, -11 }, // 0x53 'S'
+ { 682, 11, 12, 11, 2, -11 }, // 0x54 'T'
+ { 699, 12, 12, 13, 2, -11 }, // 0x55 'U'
+ { 717, 11, 12, 12, 2, -11 }, // 0x56 'V'
+ { 734, 15, 12, 16, 2, -11 }, // 0x57 'W'
+ { 757, 12, 12, 12, 0, -11 }, // 0x58 'X'
+ { 775, 10, 12, 11, 2, -11 }, // 0x59 'Y'
+ { 790, 11, 12, 10, 0, -11 }, // 0x5A 'Z'
+ { 807, 7, 15, 7, 0, -11 }, // 0x5B '['
+ { 821, 6, 12, 9, 2, -11 }, // 0x5C '\'
+ { 830, 6, 15, 7, 1, -11 }, // 0x5D ']'
+ { 842, 8, 7, 8, 0, -11 }, // 0x5E '^'
+ { 849, 9, 1, 9, 0, 2 }, // 0x5F '_'
+ { 851, 3, 3, 5, 2, -11 }, // 0x60 '`'
+ { 853, 9, 8, 9, 0, -7 }, // 0x61 'a'
+ { 862, 9, 12, 9, 0, -11 }, // 0x62 'b'
+ { 876, 8, 8, 7, 0, -7 }, // 0x63 'c'
+ { 884, 9, 12, 9, 0, -11 }, // 0x64 'd'
+ { 898, 7, 8, 7, 0, -7 }, // 0x65 'e'
+ { 905, 11, 17, 8, -1, -12 }, // 0x66 'f'
+ { 929, 9, 12, 8, 0, -7 }, // 0x67 'g'
+ { 943, 9, 12, 9, 0, -11 }, // 0x68 'h'
+ { 957, 4, 12, 4, 1, -11 }, // 0x69 'i'
+ { 963, 7, 16, 5, -1, -11 }, // 0x6A 'j'
+ { 977, 8, 12, 8, 0, -11 }, // 0x6B 'k'
+ { 989, 4, 12, 5, 1, -11 }, // 0x6C 'l'
+ { 995, 13, 8, 13, 0, -7 }, // 0x6D 'm'
+ { 1008, 8, 8, 9, 0, -7 }, // 0x6E 'n'
+ { 1016, 9, 8, 9, 0, -7 }, // 0x6F 'o'
+ { 1025, 10, 12, 8, -1, -7 }, // 0x70 'p'
+ { 1040, 9, 12, 9, 0, -7 }, // 0x71 'q'
+ { 1054, 7, 8, 7, 0, -7 }, // 0x72 'r'
+ { 1061, 7, 8, 6, 0, -7 }, // 0x73 's'
+ { 1068, 5, 9, 4, 0, -8 }, // 0x74 't'
+ { 1074, 8, 8, 9, 1, -7 }, // 0x75 'u'
+ { 1082, 7, 8, 8, 1, -7 }, // 0x76 'v'
+ { 1089, 11, 8, 12, 1, -7 }, // 0x77 'w'
+ { 1100, 9, 8, 8, -1, -7 }, // 0x78 'x'
+ { 1109, 9, 12, 9, 0, -7 }, // 0x79 'y'
+ { 1123, 8, 9, 7, 0, -7 }, // 0x7A 'z'
+ { 1132, 6, 15, 7, 1, -11 }, // 0x7B '{'
+ { 1144, 1, 12, 5, 2, -11 }, // 0x7C '|'
+ { 1146, 7, 16, 7, 0, -12 }, // 0x7D '}'
+ { 1160, 8, 3, 10, 1, -5 } }; // 0x7E '~'
+
+const GFXfont FreeSerifItalic9pt7b PROGMEM = {
+ (uint8_t *)FreeSerifItalic9pt7bBitmaps,
+ (GFXglyph *)FreeSerifItalic9pt7bGlyphs,
+ 0x20, 0x7E, 22 };
+
+// Approx. 1835 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/Org_01.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/Org_01.h
new file mode 100644
index 000000000000..ac41f31cd274
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/Org_01.h
@@ -0,0 +1,131 @@
+// Org_v01 by Orgdot (www.orgdot.com/aliasfonts). A tiny,
+// stylized font with all characters within a 6 pixel height.
+
+const uint8_t Org_01Bitmaps[] PROGMEM = {
+ 0xE8, 0xA0, 0x57, 0xD5, 0xF5, 0x00, 0xFD, 0x3E, 0x5F, 0x80, 0x88, 0x88,
+ 0x88, 0x80, 0xF4, 0xBF, 0x2E, 0x80, 0x80, 0x6A, 0x40, 0x95, 0x80, 0xAA,
+ 0x80, 0x5D, 0x00, 0xC0, 0xF0, 0x80, 0x08, 0x88, 0x88, 0x00, 0xFC, 0x63,
+ 0x1F, 0x80, 0xF8, 0xF8, 0x7F, 0x0F, 0x80, 0xF8, 0x7E, 0x1F, 0x80, 0x8C,
+ 0x7E, 0x10, 0x80, 0xFC, 0x3E, 0x1F, 0x80, 0xFC, 0x3F, 0x1F, 0x80, 0xF8,
+ 0x42, 0x10, 0x80, 0xFC, 0x7F, 0x1F, 0x80, 0xFC, 0x7E, 0x1F, 0x80, 0x90,
+ 0xB0, 0x2A, 0x22, 0xF0, 0xF0, 0x88, 0xA8, 0xF8, 0x4E, 0x02, 0x00, 0xFD,
+ 0x6F, 0x0F, 0x80, 0xFC, 0x7F, 0x18, 0x80, 0xF4, 0x7D, 0x1F, 0x00, 0xFC,
+ 0x21, 0x0F, 0x80, 0xF4, 0x63, 0x1F, 0x00, 0xFC, 0x3F, 0x0F, 0x80, 0xFC,
+ 0x3F, 0x08, 0x00, 0xFC, 0x2F, 0x1F, 0x80, 0x8C, 0x7F, 0x18, 0x80, 0xF9,
+ 0x08, 0x4F, 0x80, 0x78, 0x85, 0x2F, 0x80, 0x8D, 0xB1, 0x68, 0x80, 0x84,
+ 0x21, 0x0F, 0x80, 0xFD, 0x6B, 0x5A, 0x80, 0xFC, 0x63, 0x18, 0x80, 0xFC,
+ 0x63, 0x1F, 0x80, 0xFC, 0x7F, 0x08, 0x00, 0xFC, 0x63, 0x3F, 0x80, 0xFC,
+ 0x7F, 0x29, 0x00, 0xFC, 0x3E, 0x1F, 0x80, 0xF9, 0x08, 0x42, 0x00, 0x8C,
+ 0x63, 0x1F, 0x80, 0x8C, 0x62, 0xA2, 0x00, 0xAD, 0x6B, 0x5F, 0x80, 0x8A,
+ 0x88, 0xA8, 0x80, 0x8C, 0x54, 0x42, 0x00, 0xF8, 0x7F, 0x0F, 0x80, 0xEA,
+ 0xC0, 0x82, 0x08, 0x20, 0x80, 0xD5, 0xC0, 0x54, 0xF8, 0x80, 0xF1, 0xFF,
+ 0x8F, 0x99, 0xF0, 0xF8, 0x8F, 0x1F, 0x99, 0xF0, 0xFF, 0x8F, 0x6B, 0xA4,
+ 0xF9, 0x9F, 0x10, 0x8F, 0x99, 0x90, 0xF0, 0x55, 0xC0, 0x8A, 0xF9, 0x90,
+ 0xF8, 0xFD, 0x63, 0x10, 0xF9, 0x99, 0xF9, 0x9F, 0xF9, 0x9F, 0x80, 0xF9,
+ 0x9F, 0x20, 0xF8, 0x88, 0x47, 0x1F, 0x27, 0xC8, 0x42, 0x00, 0x99, 0x9F,
+ 0x99, 0x97, 0x8C, 0x6B, 0xF0, 0x96, 0x69, 0x99, 0x9F, 0x10, 0x2E, 0x8F,
+ 0x2B, 0x22, 0xF8, 0x89, 0xA8, 0x0F, 0xE0 };
+
+const GFXglyph Org_01Glyphs[] PROGMEM = {
+ { 0, 0, 0, 6, 0, 1 }, // 0x20 ' '
+ { 0, 1, 5, 2, 0, -4 }, // 0x21 '!'
+ { 1, 3, 1, 4, 0, -4 }, // 0x22 '"'
+ { 2, 5, 5, 6, 0, -4 }, // 0x23 '#'
+ { 6, 5, 5, 6, 0, -4 }, // 0x24 '$'
+ { 10, 5, 5, 6, 0, -4 }, // 0x25 '%'
+ { 14, 5, 5, 6, 0, -4 }, // 0x26 '&'
+ { 18, 1, 1, 2, 0, -4 }, // 0x27 '''
+ { 19, 2, 5, 3, 0, -4 }, // 0x28 '('
+ { 21, 2, 5, 3, 0, -4 }, // 0x29 ')'
+ { 23, 3, 3, 4, 0, -3 }, // 0x2A '*'
+ { 25, 3, 3, 4, 0, -3 }, // 0x2B '+'
+ { 27, 1, 2, 2, 0, 0 }, // 0x2C ','
+ { 28, 4, 1, 5, 0, -2 }, // 0x2D '-'
+ { 29, 1, 1, 2, 0, 0 }, // 0x2E '.'
+ { 30, 5, 5, 6, 0, -4 }, // 0x2F '/'
+ { 34, 5, 5, 6, 0, -4 }, // 0x30 '0'
+ { 38, 1, 5, 2, 0, -4 }, // 0x31 '1'
+ { 39, 5, 5, 6, 0, -4 }, // 0x32 '2'
+ { 43, 5, 5, 6, 0, -4 }, // 0x33 '3'
+ { 47, 5, 5, 6, 0, -4 }, // 0x34 '4'
+ { 51, 5, 5, 6, 0, -4 }, // 0x35 '5'
+ { 55, 5, 5, 6, 0, -4 }, // 0x36 '6'
+ { 59, 5, 5, 6, 0, -4 }, // 0x37 '7'
+ { 63, 5, 5, 6, 0, -4 }, // 0x38 '8'
+ { 67, 5, 5, 6, 0, -4 }, // 0x39 '9'
+ { 71, 1, 4, 2, 0, -3 }, // 0x3A ':'
+ { 72, 1, 4, 2, 0, -3 }, // 0x3B ';'
+ { 73, 3, 5, 4, 0, -4 }, // 0x3C '<'
+ { 75, 4, 3, 5, 0, -3 }, // 0x3D '='
+ { 77, 3, 5, 4, 0, -4 }, // 0x3E '>'
+ { 79, 5, 5, 6, 0, -4 }, // 0x3F '?'
+ { 83, 5, 5, 6, 0, -4 }, // 0x40 '@'
+ { 87, 5, 5, 6, 0, -4 }, // 0x41 'A'
+ { 91, 5, 5, 6, 0, -4 }, // 0x42 'B'
+ { 95, 5, 5, 6, 0, -4 }, // 0x43 'C'
+ { 99, 5, 5, 6, 0, -4 }, // 0x44 'D'
+ { 103, 5, 5, 6, 0, -4 }, // 0x45 'E'
+ { 107, 5, 5, 6, 0, -4 }, // 0x46 'F'
+ { 111, 5, 5, 6, 0, -4 }, // 0x47 'G'
+ { 115, 5, 5, 6, 0, -4 }, // 0x48 'H'
+ { 119, 5, 5, 6, 0, -4 }, // 0x49 'I'
+ { 123, 5, 5, 6, 0, -4 }, // 0x4A 'J'
+ { 127, 5, 5, 6, 0, -4 }, // 0x4B 'K'
+ { 131, 5, 5, 6, 0, -4 }, // 0x4C 'L'
+ { 135, 5, 5, 6, 0, -4 }, // 0x4D 'M'
+ { 139, 5, 5, 6, 0, -4 }, // 0x4E 'N'
+ { 143, 5, 5, 6, 0, -4 }, // 0x4F 'O'
+ { 147, 5, 5, 6, 0, -4 }, // 0x50 'P'
+ { 151, 5, 5, 6, 0, -4 }, // 0x51 'Q'
+ { 155, 5, 5, 6, 0, -4 }, // 0x52 'R'
+ { 159, 5, 5, 6, 0, -4 }, // 0x53 'S'
+ { 163, 5, 5, 6, 0, -4 }, // 0x54 'T'
+ { 167, 5, 5, 6, 0, -4 }, // 0x55 'U'
+ { 171, 5, 5, 6, 0, -4 }, // 0x56 'V'
+ { 175, 5, 5, 6, 0, -4 }, // 0x57 'W'
+ { 179, 5, 5, 6, 0, -4 }, // 0x58 'X'
+ { 183, 5, 5, 6, 0, -4 }, // 0x59 'Y'
+ { 187, 5, 5, 6, 0, -4 }, // 0x5A 'Z'
+ { 191, 2, 5, 3, 0, -4 }, // 0x5B '['
+ { 193, 5, 5, 6, 0, -4 }, // 0x5C '\'
+ { 197, 2, 5, 3, 0, -4 }, // 0x5D ']'
+ { 199, 3, 2, 4, 0, -4 }, // 0x5E '^'
+ { 200, 5, 1, 6, 0, 1 }, // 0x5F '_'
+ { 201, 1, 1, 2, 0, -4 }, // 0x60 '`'
+ { 202, 4, 4, 5, 0, -3 }, // 0x61 'a'
+ { 204, 4, 5, 5, 0, -4 }, // 0x62 'b'
+ { 207, 4, 4, 5, 0, -3 }, // 0x63 'c'
+ { 209, 4, 5, 5, 0, -4 }, // 0x64 'd'
+ { 212, 4, 4, 5, 0, -3 }, // 0x65 'e'
+ { 214, 3, 5, 4, 0, -4 }, // 0x66 'f'
+ { 216, 4, 5, 5, 0, -3 }, // 0x67 'g'
+ { 219, 4, 5, 5, 0, -4 }, // 0x68 'h'
+ { 222, 1, 4, 2, 0, -3 }, // 0x69 'i'
+ { 223, 2, 5, 3, 0, -3 }, // 0x6A 'j'
+ { 225, 4, 5, 5, 0, -4 }, // 0x6B 'k'
+ { 228, 1, 5, 2, 0, -4 }, // 0x6C 'l'
+ { 229, 5, 4, 6, 0, -3 }, // 0x6D 'm'
+ { 232, 4, 4, 5, 0, -3 }, // 0x6E 'n'
+ { 234, 4, 4, 5, 0, -3 }, // 0x6F 'o'
+ { 236, 4, 5, 5, 0, -3 }, // 0x70 'p'
+ { 239, 4, 5, 5, 0, -3 }, // 0x71 'q'
+ { 242, 4, 4, 5, 0, -3 }, // 0x72 'r'
+ { 244, 4, 4, 5, 0, -3 }, // 0x73 's'
+ { 246, 5, 5, 6, 0, -4 }, // 0x74 't'
+ { 250, 4, 4, 5, 0, -3 }, // 0x75 'u'
+ { 252, 4, 4, 5, 0, -3 }, // 0x76 'v'
+ { 254, 5, 4, 6, 0, -3 }, // 0x77 'w'
+ { 257, 4, 4, 5, 0, -3 }, // 0x78 'x'
+ { 259, 4, 5, 5, 0, -3 }, // 0x79 'y'
+ { 262, 4, 4, 5, 0, -3 }, // 0x7A 'z'
+ { 264, 3, 5, 4, 0, -4 }, // 0x7B '{'
+ { 266, 1, 5, 2, 0, -4 }, // 0x7C '|'
+ { 267, 3, 5, 4, 0, -4 }, // 0x7D '}'
+ { 269, 5, 3, 6, 0, -3 } }; // 0x7E '~'
+
+const GFXfont Org_01 PROGMEM = {
+ (uint8_t *)Org_01Bitmaps,
+ (GFXglyph *)Org_01Glyphs,
+ 0x20, 0x7E, 7 };
+
+// Approx. 943 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/Picopixel.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/Picopixel.h
new file mode 100644
index 000000000000..0ed65437432c
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/Picopixel.h
@@ -0,0 +1,123 @@
+// Picopixel by Sebastian Weber. A tiny font
+// with all characters within a 6 pixel height.
+
+const uint8_t PicopixelBitmaps[] PROGMEM = {
+ 0xE8, 0xB4, 0x57, 0xD5, 0xF5, 0x00, 0x4E, 0x3E, 0x80, 0xA5, 0x4A, 0x4A,
+ 0x5A, 0x50, 0xC0, 0x6A, 0x40, 0x95, 0x80, 0xAA, 0x80, 0x5D, 0x00, 0x60,
+ 0xE0, 0x80, 0x25, 0x48, 0x56, 0xD4, 0x75, 0x40, 0xC5, 0x4E, 0xC5, 0x1C,
+ 0x97, 0x92, 0xF3, 0x1C, 0x53, 0x54, 0xE5, 0x48, 0x55, 0x54, 0x55, 0x94,
+ 0xA0, 0x46, 0x64, 0xE3, 0x80, 0x98, 0xC5, 0x04, 0x56, 0xC6, 0x57, 0xDA,
+ 0xD7, 0x5C, 0x72, 0x46, 0xD6, 0xDC, 0xF3, 0xCE, 0xF3, 0x48, 0x72, 0xD4,
+ 0xB7, 0xDA, 0xF8, 0x24, 0xD4, 0xBB, 0x5A, 0x92, 0x4E, 0x8E, 0xEB, 0x58,
+ 0x80, 0x9D, 0xB9, 0x90, 0x56, 0xD4, 0xD7, 0x48, 0x56, 0xD4, 0x40, 0xD7,
+ 0x5A, 0x71, 0x1C, 0xE9, 0x24, 0xB6, 0xD4, 0xB6, 0xA4, 0x8C, 0x6B, 0x55,
+ 0x00, 0xB5, 0x5A, 0xB5, 0x24, 0xE5, 0x4E, 0xEA, 0xC0, 0x91, 0x12, 0xD5,
+ 0xC0, 0x54, 0xF0, 0x90, 0xC7, 0xF0, 0x93, 0x5E, 0x71, 0x80, 0x25, 0xDE,
+ 0x5E, 0x30, 0x6E, 0x80, 0x77, 0x9C, 0x93, 0x5A, 0xB8, 0x45, 0x60, 0x92,
+ 0xEA, 0xAA, 0x40, 0xD5, 0x6A, 0xD6, 0x80, 0x55, 0x00, 0xD7, 0x40, 0x75,
+ 0x90, 0xE8, 0x71, 0xE0, 0xBA, 0x40, 0xB5, 0x80, 0xB5, 0x00, 0x8D, 0x54,
+ 0xAA, 0x80, 0xAC, 0xE0, 0xE5, 0x70, 0x6A, 0x26, 0xFC, 0xC8, 0xAC, 0x5A };
+
+const GFXglyph PicopixelGlyphs[] PROGMEM = {
+ { 0, 0, 0, 2, 0, 1 }, // 0x20 ' '
+ { 0, 1, 5, 2, 0, -4 }, // 0x21 '!'
+ { 1, 3, 2, 4, 0, -4 }, // 0x22 '"'
+ { 2, 5, 5, 6, 0, -4 }, // 0x23 '#'
+ { 6, 3, 6, 4, 0, -4 }, // 0x24 '$'
+ { 9, 3, 5, 4, 0, -4 }, // 0x25 '%'
+ { 11, 4, 5, 5, 0, -4 }, // 0x26 '&'
+ { 14, 1, 2, 2, 0, -4 }, // 0x27 '''
+ { 15, 2, 5, 3, 0, -4 }, // 0x28 '('
+ { 17, 2, 5, 3, 0, -4 }, // 0x29 ')'
+ { 19, 3, 3, 4, 0, -3 }, // 0x2A '*'
+ { 21, 3, 3, 4, 0, -3 }, // 0x2B '+'
+ { 23, 2, 2, 3, 0, 0 }, // 0x2C ','
+ { 24, 3, 1, 4, 0, -2 }, // 0x2D '-'
+ { 25, 1, 1, 2, 0, 0 }, // 0x2E '.'
+ { 26, 3, 5, 4, 0, -4 }, // 0x2F '/'
+ { 28, 3, 5, 4, 0, -4 }, // 0x30 '0'
+ { 30, 2, 5, 3, 0, -4 }, // 0x31 '1'
+ { 32, 3, 5, 4, 0, -4 }, // 0x32 '2'
+ { 34, 3, 5, 4, 0, -4 }, // 0x33 '3'
+ { 36, 3, 5, 4, 0, -4 }, // 0x34 '4'
+ { 38, 3, 5, 4, 0, -4 }, // 0x35 '5'
+ { 40, 3, 5, 4, 0, -4 }, // 0x36 '6'
+ { 42, 3, 5, 4, 0, -4 }, // 0x37 '7'
+ { 44, 3, 5, 4, 0, -4 }, // 0x38 '8'
+ { 46, 3, 5, 4, 0, -4 }, // 0x39 '9'
+ { 48, 1, 3, 2, 0, -3 }, // 0x3A ':'
+ { 49, 2, 4, 3, 0, -3 }, // 0x3B ';'
+ { 50, 2, 3, 3, 0, -3 }, // 0x3C '<'
+ { 51, 3, 3, 4, 0, -3 }, // 0x3D '='
+ { 53, 2, 3, 3, 0, -3 }, // 0x3E '>'
+ { 54, 3, 5, 4, 0, -4 }, // 0x3F '?'
+ { 56, 3, 5, 4, 0, -4 }, // 0x40 '@'
+ { 58, 3, 5, 4, 0, -4 }, // 0x41 'A'
+ { 60, 3, 5, 4, 0, -4 }, // 0x42 'B'
+ { 62, 3, 5, 4, 0, -4 }, // 0x43 'C'
+ { 64, 3, 5, 4, 0, -4 }, // 0x44 'D'
+ { 66, 3, 5, 4, 0, -4 }, // 0x45 'E'
+ { 68, 3, 5, 4, 0, -4 }, // 0x46 'F'
+ { 70, 3, 5, 4, 0, -4 }, // 0x47 'G'
+ { 72, 3, 5, 4, 0, -4 }, // 0x48 'H'
+ { 74, 1, 5, 2, 0, -4 }, // 0x49 'I'
+ { 75, 3, 5, 4, 0, -4 }, // 0x4A 'J'
+ { 77, 3, 5, 4, 0, -4 }, // 0x4B 'K'
+ { 79, 3, 5, 4, 0, -4 }, // 0x4C 'L'
+ { 81, 5, 5, 6, 0, -4 }, // 0x4D 'M'
+ { 85, 4, 5, 5, 0, -4 }, // 0x4E 'N'
+ { 88, 3, 5, 4, 0, -4 }, // 0x4F 'O'
+ { 90, 3, 5, 4, 0, -4 }, // 0x50 'P'
+ { 92, 3, 6, 4, 0, -4 }, // 0x51 'Q'
+ { 95, 3, 5, 4, 0, -4 }, // 0x52 'R'
+ { 97, 3, 5, 4, 0, -4 }, // 0x53 'S'
+ { 99, 3, 5, 4, 0, -4 }, // 0x54 'T'
+ { 101, 3, 5, 4, 0, -4 }, // 0x55 'U'
+ { 103, 3, 5, 4, 0, -4 }, // 0x56 'V'
+ { 105, 5, 5, 6, 0, -4 }, // 0x57 'W'
+ { 109, 3, 5, 4, 0, -4 }, // 0x58 'X'
+ { 111, 3, 5, 4, 0, -4 }, // 0x59 'Y'
+ { 113, 3, 5, 4, 0, -4 }, // 0x5A 'Z'
+ { 115, 2, 5, 3, 0, -4 }, // 0x5B '['
+ { 117, 3, 5, 4, 0, -4 }, // 0x5C '\'
+ { 119, 2, 5, 3, 0, -4 }, // 0x5D ']'
+ { 121, 3, 2, 4, 0, -4 }, // 0x5E '^'
+ { 122, 4, 1, 4, 0, 1 }, // 0x5F '_'
+ { 123, 2, 2, 3, 0, -4 }, // 0x60 '`'
+ { 124, 3, 4, 4, 0, -3 }, // 0x61 'a'
+ { 126, 3, 5, 4, 0, -4 }, // 0x62 'b'
+ { 128, 3, 3, 4, 0, -2 }, // 0x63 'c'
+ { 130, 3, 5, 4, 0, -4 }, // 0x64 'd'
+ { 132, 3, 4, 4, 0, -3 }, // 0x65 'e'
+ { 134, 2, 5, 3, 0, -4 }, // 0x66 'f'
+ { 136, 3, 5, 4, 0, -3 }, // 0x67 'g'
+ { 138, 3, 5, 4, 0, -4 }, // 0x68 'h'
+ { 140, 1, 5, 2, 0, -4 }, // 0x69 'i'
+ { 141, 2, 6, 3, 0, -4 }, // 0x6A 'j'
+ { 143, 3, 5, 4, 0, -4 }, // 0x6B 'k'
+ { 145, 2, 5, 3, 0, -4 }, // 0x6C 'l'
+ { 147, 5, 3, 6, 0, -2 }, // 0x6D 'm'
+ { 149, 3, 3, 4, 0, -2 }, // 0x6E 'n'
+ { 151, 3, 3, 4, 0, -2 }, // 0x6F 'o'
+ { 153, 3, 4, 4, 0, -2 }, // 0x70 'p'
+ { 155, 3, 4, 4, 0, -2 }, // 0x71 'q'
+ { 157, 2, 3, 3, 0, -2 }, // 0x72 'r'
+ { 158, 3, 4, 4, 0, -3 }, // 0x73 's'
+ { 160, 2, 5, 3, 0, -4 }, // 0x74 't'
+ { 162, 3, 3, 4, 0, -2 }, // 0x75 'u'
+ { 164, 3, 3, 4, 0, -2 }, // 0x76 'v'
+ { 166, 5, 3, 6, 0, -2 }, // 0x77 'w'
+ { 168, 3, 3, 4, 0, -2 }, // 0x78 'x'
+ { 170, 3, 4, 4, 0, -2 }, // 0x79 'y'
+ { 172, 3, 4, 4, 0, -3 }, // 0x7A 'z'
+ { 174, 3, 5, 4, 0, -4 }, // 0x7B '{'
+ { 176, 1, 6, 2, 0, -4 }, // 0x7C '|'
+ { 177, 3, 5, 4, 0, -4 }, // 0x7D '}'
+ { 179, 4, 2, 5, 0, -3 } }; // 0x7E '~'
+
+const GFXfont Picopixel PROGMEM = {
+ (uint8_t *)PicopixelBitmaps,
+ (GFXglyph *)PicopixelGlyphs,
+ 0x20, 0x7E, 7 };
+
+// Approx. 852 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/Tiny3x3a2pt7b b/lib/Adafruit-GFX-Library-1.2.9/Fonts/Tiny3x3a2pt7b
new file mode 100644
index 000000000000..d77676c21a81
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/Tiny3x3a2pt7b
@@ -0,0 +1,130 @@
+/**
+** The FontStruction “Tiny3x3a”
+** (https://fontstruct.com/fontstructions/show/670512) by “Michaelangel007” is
+** licensed under a Creative Commons Attribution Non-commercial Share Alike license
+** (http://creativecommons.org/licenses/by-nc-sa/3.0/).
+** “Tiny3x3a” was originally cloned (copied) from the FontStruction
+** “CHECKER” (https://fontstruct.com/fontstructions/show/2391) by Wolf grant
+** Grant, which is licensed under a Creative Commons Attribution Non-commercial
+** Share Alike license (http://creativecommons.org/licenses/by-nc-sa/3.0/).
+*
+* Converted by eadmaster with fontconvert
+**/
+
+const uint8_t Tiny3x3a2pt7bBitmaps[] PROGMEM = {
+ 0xC0, 0xB4, 0xBF, 0x80, 0x6B, 0x00, 0xDD, 0x80, 0x59, 0x80, 0x80, 0x64,
+ 0x98, 0xF0, 0x5D, 0x00, 0xC0, 0xE0, 0x80, 0x2A, 0x00, 0x55, 0x00, 0x94,
+ 0xC9, 0x80, 0xEF, 0x80, 0xBC, 0x80, 0x6B, 0x00, 0x9F, 0x80, 0xE4, 0x80,
+ 0x7F, 0x00, 0xFC, 0x80, 0xA0, 0x58, 0x64, 0xE3, 0x80, 0x98, 0xD8, 0xD8,
+ 0x80, 0x5E, 0x80, 0xDF, 0x80, 0x71, 0x80, 0xD7, 0x00, 0xFB, 0x80, 0xFA,
+ 0x00, 0xD7, 0x80, 0xBE, 0x80, 0xE0, 0x27, 0x00, 0xBA, 0x80, 0x93, 0x80,
+ 0xFE, 0x80, 0xF6, 0x80, 0xF7, 0x80, 0xFE, 0x00, 0xF7, 0x00, 0xDE, 0x80,
+ 0x6B, 0x00, 0xE9, 0x00, 0xB7, 0x80, 0xB5, 0x00, 0xBF, 0x80, 0xAA, 0x80,
+ 0xA9, 0x00, 0xEB, 0x80, 0xEC, 0x88, 0x80, 0xDC, 0x54, 0xE0, 0x90, 0x70,
+ 0xBC, 0xF0, 0x7C, 0xB0, 0x68, 0xFC, 0xBC, 0xC0, 0x58, 0x9A, 0x80, 0xA4,
+ 0xDC, 0xD4, 0xF0, 0xF8, 0xF4, 0xE0, 0x60, 0x59, 0x80, 0xBC, 0xA8, 0xEC,
+ 0xF0, 0xAC, 0x80, 0x90, 0x79, 0x80, 0xF0, 0xCF, 0x00, 0x78 };
+
+const GFXglyph Tiny3x3a2pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 4, 0, 1 }, // 0x20 ' '
+ { 0, 1, 2, 3, 1, -2 }, // 0x21 '!'
+ { 1, 3, 2, 4, 0, -2 }, // 0x22 '"'
+ { 2, 3, 3, 4, 0, -2 }, // 0x23 '#'
+ { 4, 3, 3, 4, 0, -2 }, // 0x24 '$'
+ { 6, 3, 3, 4, 0, -2 }, // 0x25 '%'
+ { 8, 3, 3, 4, 0, -2 }, // 0x26 '&'
+ { 10, 1, 1, 3, 1, -2 }, // 0x27 '''
+ { 11, 2, 3, 3, 0, -2 }, // 0x28 '('
+ { 12, 2, 3, 4, 1, -2 }, // 0x29 ')'
+ { 13, 2, 2, 4, 1, -2 }, // 0x2A '*'
+ { 14, 3, 3, 4, 0, -2 }, // 0x2B '+'
+ { 16, 1, 2, 2, 0, 0 }, // 0x2C ','
+ { 17, 3, 1, 4, 0, -1 }, // 0x2D '-'
+ { 18, 1, 1, 2, 0, 0 }, // 0x2E '.'
+ { 19, 3, 3, 4, 0, -2 }, // 0x2F '/'
+ { 21, 3, 3, 4, 0, -2 }, // 0x30 '0'
+ { 23, 2, 3, 3, 0, -2 }, // 0x31 '1'
+ { 24, 3, 3, 4, 0, -2 }, // 0x32 '2'
+ { 26, 3, 3, 4, 0, -2 }, // 0x33 '3'
+ { 28, 3, 3, 4, 0, -2 }, // 0x34 '4'
+ { 30, 3, 3, 4, 0, -2 }, // 0x35 '5'
+ { 32, 3, 3, 4, 0, -2 }, // 0x36 '6'
+ { 34, 3, 3, 4, 0, -2 }, // 0x37 '7'
+ { 36, 3, 3, 4, 0, -2 }, // 0x38 '8'
+ { 38, 3, 3, 4, 0, -2 }, // 0x39 '9'
+ { 40, 1, 3, 3, 1, -2 }, // 0x3A ':'
+ { 41, 2, 3, 3, 0, -1 }, // 0x3B ';'
+ { 42, 2, 3, 3, 0, -2 }, // 0x3C '<'
+ { 43, 3, 3, 4, 0, -2 }, // 0x3D '='
+ { 45, 2, 3, 4, 1, -2 }, // 0x3E '>'
+ { 46, 2, 3, 4, 1, -2 }, // 0x3F '?'
+ { 47, 3, 3, 4, 0, -2 }, // 0x40 '@'
+ { 49, 3, 3, 4, 0, -2 }, // 0x41 'A'
+ { 51, 3, 3, 4, 0, -2 }, // 0x42 'B'
+ { 53, 3, 3, 4, 0, -2 }, // 0x43 'C'
+ { 55, 3, 3, 4, 0, -2 }, // 0x44 'D'
+ { 57, 3, 3, 4, 0, -2 }, // 0x45 'E'
+ { 59, 3, 3, 4, 0, -2 }, // 0x46 'F'
+ { 61, 3, 3, 4, 0, -2 }, // 0x47 'G'
+ { 63, 3, 3, 4, 0, -2 }, // 0x48 'H'
+ { 65, 1, 3, 3, 1, -2 }, // 0x49 'I'
+ { 66, 3, 3, 4, 0, -2 }, // 0x4A 'J'
+ { 68, 3, 3, 4, 0, -2 }, // 0x4B 'K'
+ { 70, 3, 3, 4, 0, -2 }, // 0x4C 'L'
+ { 72, 3, 3, 4, 0, -2 }, // 0x4D 'M'
+ { 74, 3, 3, 4, 0, -2 }, // 0x4E 'N'
+ { 76, 3, 3, 4, 0, -2 }, // 0x4F 'O'
+ { 78, 3, 3, 4, 0, -2 }, // 0x50 'P'
+ { 80, 3, 3, 4, 0, -2 }, // 0x51 'Q'
+ { 82, 3, 3, 4, 0, -2 }, // 0x52 'R'
+ { 84, 3, 3, 4, 0, -2 }, // 0x53 'S'
+ { 86, 3, 3, 4, 0, -2 }, // 0x54 'T'
+ { 88, 3, 3, 4, 0, -2 }, // 0x55 'U'
+ { 90, 3, 3, 4, 0, -2 }, // 0x56 'V'
+ { 92, 3, 3, 4, 0, -2 }, // 0x57 'W'
+ { 94, 3, 3, 4, 0, -2 }, // 0x58 'X'
+ { 96, 3, 3, 4, 0, -2 }, // 0x59 'Y'
+ { 98, 3, 3, 4, 0, -2 }, // 0x5A 'Z'
+ { 100, 2, 3, 3, 0, -2 }, // 0x5B '['
+ { 101, 3, 3, 4, 0, -2 }, // 0x5C '\'
+ { 103, 2, 3, 4, 1, -2 }, // 0x5D ']'
+ { 104, 3, 2, 4, 0, -2 }, // 0x5E '^'
+ { 105, 3, 1, 4, 0, 0 }, // 0x5F '_'
+ { 106, 2, 2, 3, 0, -2 }, // 0x60 '`'
+ { 107, 2, 2, 3, 0, -1 }, // 0x61 'a'
+ { 108, 2, 3, 3, 0, -2 }, // 0x62 'b'
+ { 109, 2, 2, 3, 0, -1 }, // 0x63 'c'
+ { 110, 2, 3, 3, 0, -2 }, // 0x64 'd'
+ { 111, 2, 2, 3, 0, -1 }, // 0x65 'e'
+ { 112, 2, 3, 3, 0, -2 }, // 0x66 'f'
+ { 113, 2, 3, 3, 0, -1 }, // 0x67 'g'
+ { 114, 2, 3, 3, 0, -2 }, // 0x68 'h'
+ { 115, 1, 2, 2, 0, -1 }, // 0x69 'i'
+ { 116, 2, 3, 3, 0, -1 }, // 0x6A 'j'
+ { 117, 3, 3, 4, 0, -2 }, // 0x6B 'k'
+ { 119, 2, 3, 3, 0, -2 }, // 0x6C 'l'
+ { 120, 3, 2, 4, 0, -1 }, // 0x6D 'm'
+ { 121, 3, 2, 4, 0, -1 }, // 0x6E 'n'
+ { 122, 2, 2, 3, 0, -1 }, // 0x6F 'o'
+ { 123, 2, 3, 3, 0, -1 }, // 0x70 'p'
+ { 124, 2, 3, 3, 0, -1 }, // 0x71 'q'
+ { 125, 2, 2, 3, 0, -1 }, // 0x72 'r'
+ { 126, 2, 2, 3, 0, -1 }, // 0x73 's'
+ { 127, 3, 3, 4, 0, -2 }, // 0x74 't'
+ { 129, 3, 2, 4, 0, -1 }, // 0x75 'u'
+ { 130, 3, 2, 4, 0, -1 }, // 0x76 'v'
+ { 131, 3, 2, 4, 0, -1 }, // 0x77 'w'
+ { 132, 2, 2, 3, 0, -1 }, // 0x78 'x'
+ { 133, 3, 3, 4, 0, -1 }, // 0x79 'y'
+ { 135, 2, 2, 3, 0, -1 }, // 0x7A 'z'
+ { 136, 3, 3, 4, 0, -2 }, // 0x7B '{'
+ { 138, 1, 4, 3, 1, -2 }, // 0x7C '|'
+ { 139, 3, 3, 4, 0, -2 }, // 0x7D '}'
+ { 141, 3, 2, 4, 0, -2 } }; // 0x7E '~'
+
+const GFXfont Tiny3x3a2pt7b PROGMEM = {
+ (uint8_t *)Tiny3x3a2pt7bBitmaps,
+ (GFXglyph *)Tiny3x3a2pt7bGlyphs,
+ 0x20, 0x7E, 4 };
+
+// Approx. 814 bytes
diff --git a/lib/Adafruit-GFX-Library-1.2.9/Fonts/TomThumb.h b/lib/Adafruit-GFX-Library-1.2.9/Fonts/TomThumb.h
new file mode 100644
index 000000000000..dad420dcdbe0
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/Fonts/TomThumb.h
@@ -0,0 +1,474 @@
+/**
+** The original 3x5 font is licensed under the 3-clause BSD license:
+**
+** Copyright 1999 Brian J. Swetland
+** Copyright 1999 Vassilii Khachaturov
+** Portions (of vt100.c/vt100.h) copyright Dan Marks
+**
+** 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. The name of the authors may not be used to endorse or promote products
+** derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+**
+** Modifications to Tom Thumb for improved readability are from Robey Pointer,
+** see:
+** http://robey.lag.net/2010/01/23/tiny-monospace-font.html
+**
+** The original author does not have any objection to relicensing of Robey
+** Pointer's modifications (in this file) in a more permissive license. See
+** the discussion at the above blog, and also here:
+** http://opengameart.org/forumtopic/how-to-submit-art-using-the-3-clause-bsd-license
+**
+** Feb 21, 2016: Conversion from Linux BDF --> Adafruit GFX font,
+** with the help of this Python script:
+** https://gist.github.com/skelliam/322d421f028545f16f6d
+** William Skellenger (williamj@skellenger.net)
+** Twitter: @skelliam
+**
+*/
+
+#define TOMTHUMB_USE_EXTENDED 0
+
+const uint8_t TomThumbBitmaps[] PROGMEM = {
+ 0x00, /* 0x20 space */
+ 0x80, 0x80, 0x80, 0x00, 0x80, /* 0x21 exclam */
+ 0xA0, 0xA0, /* 0x22 quotedbl */
+ 0xA0, 0xE0, 0xA0, 0xE0, 0xA0, /* 0x23 numbersign */
+ 0x60, 0xC0, 0x60, 0xC0, 0x40, /* 0x24 dollar */
+ 0x80, 0x20, 0x40, 0x80, 0x20, /* 0x25 percent */
+ 0xC0, 0xC0, 0xE0, 0xA0, 0x60, /* 0x26 ampersand */
+ 0x80, 0x80, /* 0x27 quotesingle */
+ 0x40, 0x80, 0x80, 0x80, 0x40, /* 0x28 parenleft */
+ 0x80, 0x40, 0x40, 0x40, 0x80, /* 0x29 parenright */
+ 0xA0, 0x40, 0xA0, /* 0x2A asterisk */
+ 0x40, 0xE0, 0x40, /* 0x2B plus */
+ 0x40, 0x80, /* 0x2C comma */
+ 0xE0, /* 0x2D hyphen */
+ 0x80, /* 0x2E period */
+ 0x20, 0x20, 0x40, 0x80, 0x80, /* 0x2F slash */
+ 0x60, 0xA0, 0xA0, 0xA0, 0xC0, /* 0x30 zero */
+ 0x40, 0xC0, 0x40, 0x40, 0x40, /* 0x31 one */
+ 0xC0, 0x20, 0x40, 0x80, 0xE0, /* 0x32 two */
+ 0xC0, 0x20, 0x40, 0x20, 0xC0, /* 0x33 three */
+ 0xA0, 0xA0, 0xE0, 0x20, 0x20, /* 0x34 four */
+ 0xE0, 0x80, 0xC0, 0x20, 0xC0, /* 0x35 five */
+ 0x60, 0x80, 0xE0, 0xA0, 0xE0, /* 0x36 six */
+ 0xE0, 0x20, 0x40, 0x80, 0x80, /* 0x37 seven */
+ 0xE0, 0xA0, 0xE0, 0xA0, 0xE0, /* 0x38 eight */
+ 0xE0, 0xA0, 0xE0, 0x20, 0xC0, /* 0x39 nine */
+ 0x80, 0x00, 0x80, /* 0x3A colon */
+ 0x40, 0x00, 0x40, 0x80, /* 0x3B semicolon */
+ 0x20, 0x40, 0x80, 0x40, 0x20, /* 0x3C less */
+ 0xE0, 0x00, 0xE0, /* 0x3D equal */
+ 0x80, 0x40, 0x20, 0x40, 0x80, /* 0x3E greater */
+ 0xE0, 0x20, 0x40, 0x00, 0x40, /* 0x3F question */
+ 0x40, 0xA0, 0xE0, 0x80, 0x60, /* 0x40 at */
+ 0x40, 0xA0, 0xE0, 0xA0, 0xA0, /* 0x41 A */
+ 0xC0, 0xA0, 0xC0, 0xA0, 0xC0, /* 0x42 B */
+ 0x60, 0x80, 0x80, 0x80, 0x60, /* 0x43 C */
+ 0xC0, 0xA0, 0xA0, 0xA0, 0xC0, /* 0x44 D */
+ 0xE0, 0x80, 0xE0, 0x80, 0xE0, /* 0x45 E */
+ 0xE0, 0x80, 0xE0, 0x80, 0x80, /* 0x46 F */
+ 0x60, 0x80, 0xE0, 0xA0, 0x60, /* 0x47 G */
+ 0xA0, 0xA0, 0xE0, 0xA0, 0xA0, /* 0x48 H */
+ 0xE0, 0x40, 0x40, 0x40, 0xE0, /* 0x49 I */
+ 0x20, 0x20, 0x20, 0xA0, 0x40, /* 0x4A J */
+ 0xA0, 0xA0, 0xC0, 0xA0, 0xA0, /* 0x4B K */
+ 0x80, 0x80, 0x80, 0x80, 0xE0, /* 0x4C L */
+ 0xA0, 0xE0, 0xE0, 0xA0, 0xA0, /* 0x4D M */
+ 0xA0, 0xE0, 0xE0, 0xE0, 0xA0, /* 0x4E N */
+ 0x40, 0xA0, 0xA0, 0xA0, 0x40, /* 0x4F O */
+ 0xC0, 0xA0, 0xC0, 0x80, 0x80, /* 0x50 P */
+ 0x40, 0xA0, 0xA0, 0xE0, 0x60, /* 0x51 Q */
+ 0xC0, 0xA0, 0xE0, 0xC0, 0xA0, /* 0x52 R */
+ 0x60, 0x80, 0x40, 0x20, 0xC0, /* 0x53 S */
+ 0xE0, 0x40, 0x40, 0x40, 0x40, /* 0x54 T */
+ 0xA0, 0xA0, 0xA0, 0xA0, 0x60, /* 0x55 U */
+ 0xA0, 0xA0, 0xA0, 0x40, 0x40, /* 0x56 V */
+ 0xA0, 0xA0, 0xE0, 0xE0, 0xA0, /* 0x57 W */
+ 0xA0, 0xA0, 0x40, 0xA0, 0xA0, /* 0x58 X */
+ 0xA0, 0xA0, 0x40, 0x40, 0x40, /* 0x59 Y */
+ 0xE0, 0x20, 0x40, 0x80, 0xE0, /* 0x5A Z */
+ 0xE0, 0x80, 0x80, 0x80, 0xE0, /* 0x5B bracketleft */
+ 0x80, 0x40, 0x20, /* 0x5C backslash */
+ 0xE0, 0x20, 0x20, 0x20, 0xE0, /* 0x5D bracketright */
+ 0x40, 0xA0, /* 0x5E asciicircum */
+ 0xE0, /* 0x5F underscore */
+ 0x80, 0x40, /* 0x60 grave */
+ 0xC0, 0x60, 0xA0, 0xE0, /* 0x61 a */
+ 0x80, 0xC0, 0xA0, 0xA0, 0xC0, /* 0x62 b */
+ 0x60, 0x80, 0x80, 0x60, /* 0x63 c */
+ 0x20, 0x60, 0xA0, 0xA0, 0x60, /* 0x64 d */
+ 0x60, 0xA0, 0xC0, 0x60, /* 0x65 e */
+ 0x20, 0x40, 0xE0, 0x40, 0x40, /* 0x66 f */
+ 0x60, 0xA0, 0xE0, 0x20, 0x40, /* 0x67 g */
+ 0x80, 0xC0, 0xA0, 0xA0, 0xA0, /* 0x68 h */
+ 0x80, 0x00, 0x80, 0x80, 0x80, /* 0x69 i */
+ 0x20, 0x00, 0x20, 0x20, 0xA0, 0x40, /* 0x6A j */
+ 0x80, 0xA0, 0xC0, 0xC0, 0xA0, /* 0x6B k */
+ 0xC0, 0x40, 0x40, 0x40, 0xE0, /* 0x6C l */
+ 0xE0, 0xE0, 0xE0, 0xA0, /* 0x6D m */
+ 0xC0, 0xA0, 0xA0, 0xA0, /* 0x6E n */
+ 0x40, 0xA0, 0xA0, 0x40, /* 0x6F o */
+ 0xC0, 0xA0, 0xA0, 0xC0, 0x80, /* 0x70 p */
+ 0x60, 0xA0, 0xA0, 0x60, 0x20, /* 0x71 q */
+ 0x60, 0x80, 0x80, 0x80, /* 0x72 r */
+ 0x60, 0xC0, 0x60, 0xC0, /* 0x73 s */
+ 0x40, 0xE0, 0x40, 0x40, 0x60, /* 0x74 t */
+ 0xA0, 0xA0, 0xA0, 0x60, /* 0x75 u */
+ 0xA0, 0xA0, 0xE0, 0x40, /* 0x76 v */
+ 0xA0, 0xE0, 0xE0, 0xE0, /* 0x77 w */
+ 0xA0, 0x40, 0x40, 0xA0, /* 0x78 x */
+ 0xA0, 0xA0, 0x60, 0x20, 0x40, /* 0x79 y */
+ 0xE0, 0x60, 0xC0, 0xE0, /* 0x7A z */
+ 0x60, 0x40, 0x80, 0x40, 0x60, /* 0x7B braceleft */
+ 0x80, 0x80, 0x00, 0x80, 0x80, /* 0x7C bar */
+ 0xC0, 0x40, 0x20, 0x40, 0xC0, /* 0x7D braceright */
+ 0x60, 0xC0, /* 0x7E asciitilde */
+#if (TOMTHUMB_USE_EXTENDED)
+ 0x80, 0x00, 0x80, 0x80, 0x80, /* 0xA1 exclamdown */
+ 0x40, 0xE0, 0x80, 0xE0, 0x40, /* 0xA2 cent */
+ 0x60, 0x40, 0xE0, 0x40, 0xE0, /* 0xA3 sterling */
+ 0xA0, 0x40, 0xE0, 0x40, 0xA0, /* 0xA4 currency */
+ 0xA0, 0xA0, 0x40, 0xE0, 0x40, /* 0xA5 yen */
+ 0x80, 0x80, 0x00, 0x80, 0x80, /* 0xA6 brokenbar */
+ 0x60, 0x40, 0xA0, 0x40, 0xC0, /* 0xA7 section */
+ 0xA0, /* 0xA8 dieresis */
+ 0x60, 0x80, 0x60, /* 0xA9 copyright */
+ 0x60, 0xA0, 0xE0, 0x00, 0xE0, /* 0xAA ordfeminine */
+ 0x40, 0x80, 0x40, /* 0xAB guillemotleft */
+ 0xE0, 0x20, /* 0xAC logicalnot */
+ 0xC0, /* 0xAD softhyphen */
+ 0xC0, 0xC0, 0xA0, /* 0xAE registered */
+ 0xE0, /* 0xAF macron */
+ 0x40, 0xA0, 0x40, /* 0xB0 degree */
+ 0x40, 0xE0, 0x40, 0x00, 0xE0, /* 0xB1 plusminus */
+ 0xC0, 0x40, 0x60, /* 0xB2 twosuperior */
+ 0xE0, 0x60, 0xE0, /* 0xB3 threesuperior */
+ 0x40, 0x80, /* 0xB4 acute */
+ 0xA0, 0xA0, 0xA0, 0xC0, 0x80, /* 0xB5 mu */
+ 0x60, 0xA0, 0x60, 0x60, 0x60, /* 0xB6 paragraph */
+ 0xE0, 0xE0, 0xE0, /* 0xB7 periodcentered */
+ 0x40, 0x20, 0xC0, /* 0xB8 cedilla */
+ 0x80, 0x80, 0x80, /* 0xB9 onesuperior */
+ 0x40, 0xA0, 0x40, 0x00, 0xE0, /* 0xBA ordmasculine */
+ 0x80, 0x40, 0x80, /* 0xBB guillemotright */
+ 0x80, 0x80, 0x00, 0x60, 0x20, /* 0xBC onequarter */
+ 0x80, 0x80, 0x00, 0xC0, 0x60, /* 0xBD onehalf */
+ 0xC0, 0xC0, 0x00, 0x60, 0x20, /* 0xBE threequarters */
+ 0x40, 0x00, 0x40, 0x80, 0xE0, /* 0xBF questiondown */
+ 0x40, 0x20, 0x40, 0xE0, 0xA0, /* 0xC0 Agrave */
+ 0x40, 0x80, 0x40, 0xE0, 0xA0, /* 0xC1 Aacute */
+ 0xE0, 0x00, 0x40, 0xE0, 0xA0, /* 0xC2 Acircumflex */
+ 0x60, 0xC0, 0x40, 0xE0, 0xA0, /* 0xC3 Atilde */
+ 0xA0, 0x40, 0xA0, 0xE0, 0xA0, /* 0xC4 Adieresis */
+ 0xC0, 0xC0, 0xA0, 0xE0, 0xA0, /* 0xC5 Aring */
+ 0x60, 0xC0, 0xE0, 0xC0, 0xE0, /* 0xC6 AE */
+ 0x60, 0x80, 0x80, 0x60, 0x20, 0x40, /* 0xC7 Ccedilla */
+ 0x40, 0x20, 0xE0, 0xC0, 0xE0, /* 0xC8 Egrave */
+ 0x40, 0x80, 0xE0, 0xC0, 0xE0, /* 0xC9 Eacute */
+ 0xE0, 0x00, 0xE0, 0xC0, 0xE0, /* 0xCA Ecircumflex */
+ 0xA0, 0x00, 0xE0, 0xC0, 0xE0, /* 0xCB Edieresis */
+ 0x40, 0x20, 0xE0, 0x40, 0xE0, /* 0xCC Igrave */
+ 0x40, 0x80, 0xE0, 0x40, 0xE0, /* 0xCD Iacute */
+ 0xE0, 0x00, 0xE0, 0x40, 0xE0, /* 0xCE Icircumflex */
+ 0xA0, 0x00, 0xE0, 0x40, 0xE0, /* 0xCF Idieresis */
+ 0xC0, 0xA0, 0xE0, 0xA0, 0xC0, /* 0xD0 Eth */
+ 0xC0, 0x60, 0xA0, 0xE0, 0xA0, /* 0xD1 Ntilde */
+ 0x40, 0x20, 0xE0, 0xA0, 0xE0, /* 0xD2 Ograve */
+ 0x40, 0x80, 0xE0, 0xA0, 0xE0, /* 0xD3 Oacute */
+ 0xE0, 0x00, 0xE0, 0xA0, 0xE0, /* 0xD4 Ocircumflex */
+ 0xC0, 0x60, 0xE0, 0xA0, 0xE0, /* 0xD5 Otilde */
+ 0xA0, 0x00, 0xE0, 0xA0, 0xE0, /* 0xD6 Odieresis */
+ 0xA0, 0x40, 0xA0, /* 0xD7 multiply */
+ 0x60, 0xA0, 0xE0, 0xA0, 0xC0, /* 0xD8 Oslash */
+ 0x80, 0x40, 0xA0, 0xA0, 0xE0, /* 0xD9 Ugrave */
+ 0x20, 0x40, 0xA0, 0xA0, 0xE0, /* 0xDA Uacute */
+ 0xE0, 0x00, 0xA0, 0xA0, 0xE0, /* 0xDB Ucircumflex */
+ 0xA0, 0x00, 0xA0, 0xA0, 0xE0, /* 0xDC Udieresis */
+ 0x20, 0x40, 0xA0, 0xE0, 0x40, /* 0xDD Yacute */
+ 0x80, 0xE0, 0xA0, 0xE0, 0x80, /* 0xDE Thorn */
+ 0x60, 0xA0, 0xC0, 0xA0, 0xC0, 0x80, /* 0xDF germandbls */
+ 0x40, 0x20, 0x60, 0xA0, 0xE0, /* 0xE0 agrave */
+ 0x40, 0x80, 0x60, 0xA0, 0xE0, /* 0xE1 aacute */
+ 0xE0, 0x00, 0x60, 0xA0, 0xE0, /* 0xE2 acircumflex */
+ 0x60, 0xC0, 0x60, 0xA0, 0xE0, /* 0xE3 atilde */
+ 0xA0, 0x00, 0x60, 0xA0, 0xE0, /* 0xE4 adieresis */
+ 0x60, 0x60, 0x60, 0xA0, 0xE0, /* 0xE5 aring */
+ 0x60, 0xE0, 0xE0, 0xC0, /* 0xE6 ae */
+ 0x60, 0x80, 0x60, 0x20, 0x40, /* 0xE7 ccedilla */
+ 0x40, 0x20, 0x60, 0xE0, 0x60, /* 0xE8 egrave */
+ 0x40, 0x80, 0x60, 0xE0, 0x60, /* 0xE9 eacute */
+ 0xE0, 0x00, 0x60, 0xE0, 0x60, /* 0xEA ecircumflex */
+ 0xA0, 0x00, 0x60, 0xE0, 0x60, /* 0xEB edieresis */
+ 0x80, 0x40, 0x80, 0x80, 0x80, /* 0xEC igrave */
+ 0x40, 0x80, 0x40, 0x40, 0x40, /* 0xED iacute */
+ 0xE0, 0x00, 0x40, 0x40, 0x40, /* 0xEE icircumflex */
+ 0xA0, 0x00, 0x40, 0x40, 0x40, /* 0xEF idieresis */
+ 0x60, 0xC0, 0x60, 0xA0, 0x60, /* 0xF0 eth */
+ 0xC0, 0x60, 0xC0, 0xA0, 0xA0, /* 0xF1 ntilde */
+ 0x40, 0x20, 0x40, 0xA0, 0x40, /* 0xF2 ograve */
+ 0x40, 0x80, 0x40, 0xA0, 0x40, /* 0xF3 oacute */
+ 0xE0, 0x00, 0x40, 0xA0, 0x40, /* 0xF4 ocircumflex */
+ 0xC0, 0x60, 0x40, 0xA0, 0x40, /* 0xF5 otilde */
+ 0xA0, 0x00, 0x40, 0xA0, 0x40, /* 0xF6 odieresis */
+ 0x40, 0x00, 0xE0, 0x00, 0x40, /* 0xF7 divide */
+ 0x60, 0xE0, 0xA0, 0xC0, /* 0xF8 oslash */
+ 0x80, 0x40, 0xA0, 0xA0, 0x60, /* 0xF9 ugrave */
+ 0x20, 0x40, 0xA0, 0xA0, 0x60, /* 0xFA uacute */
+ 0xE0, 0x00, 0xA0, 0xA0, 0x60, /* 0xFB ucircumflex */
+ 0xA0, 0x00, 0xA0, 0xA0, 0x60, /* 0xFC udieresis */
+ 0x20, 0x40, 0xA0, 0x60, 0x20, 0x40, /* 0xFD yacute */
+ 0x80, 0xC0, 0xA0, 0xC0, 0x80, /* 0xFE thorn */
+ 0xA0, 0x00, 0xA0, 0x60, 0x20, 0x40, /* 0xFF ydieresis */
+ 0x00, /* 0x11D gcircumflex */
+ 0x60, 0xC0, 0xE0, 0xC0, 0x60, /* 0x152 OE */
+ 0x60, 0xE0, 0xC0, 0xE0, /* 0x153 oe */
+ 0xA0, 0x60, 0xC0, 0x60, 0xC0, /* 0x160 Scaron */
+ 0xA0, 0x60, 0xC0, 0x60, 0xC0, /* 0x161 scaron */
+ 0xA0, 0x00, 0xA0, 0x40, 0x40, /* 0x178 Ydieresis */
+ 0xA0, 0xE0, 0x60, 0xC0, 0xE0, /* 0x17D Zcaron */
+ 0xA0, 0xE0, 0x60, 0xC0, 0xE0, /* 0x17E zcaron */
+ 0x00, /* 0xEA4 uni0EA4 */
+ 0x00, /* 0x13A0 uni13A0 */
+ 0x80, /* 0x2022 bullet */
+ 0xA0, /* 0x2026 ellipsis */
+ 0x60, 0xE0, 0xE0, 0xC0, 0x60, /* 0x20AC Euro */
+ 0xE0, 0xA0, 0xA0, 0xA0, 0xE0, /* 0xFFFD uniFFFD */
+#endif /* (TOMTHUMB_USE_EXTENDED) */
+ };
+
+
+/* {offset, width, height, advance cursor, x offset, y offset} */
+const GFXglyph TomThumbGlyphs[] PROGMEM = {
+ { 0, 8, 1, 2, 0, -5 }, /* 0x20 space */
+ { 1, 8, 5, 2, 0, -5 }, /* 0x21 exclam */
+ { 6, 8, 2, 4, 0, -5 }, /* 0x22 quotedbl */
+ { 8, 8, 5, 4, 0, -5 }, /* 0x23 numbersign */
+ { 13, 8, 5, 4, 0, -5 }, /* 0x24 dollar */
+ { 18, 8, 5, 4, 0, -5 }, /* 0x25 percent */
+ { 23, 8, 5, 4, 0, -5 }, /* 0x26 ampersand */
+ { 28, 8, 2, 2, 0, -5 }, /* 0x27 quotesingle */
+ { 30, 8, 5, 3, 0, -5 }, /* 0x28 parenleft */
+ { 35, 8, 5, 3, 0, -5 }, /* 0x29 parenright */
+ { 40, 8, 3, 4, 0, -5 }, /* 0x2A asterisk */
+ { 43, 8, 3, 4, 0, -4 }, /* 0x2B plus */
+ { 46, 8, 2, 3, 0, -2 }, /* 0x2C comma */
+ { 48, 8, 1, 4, 0, -3 }, /* 0x2D hyphen */
+ { 49, 8, 1, 2, 0, -1 }, /* 0x2E period */
+ { 50, 8, 5, 4, 0, -5 }, /* 0x2F slash */
+ { 55, 8, 5, 4, 0, -5 }, /* 0x30 zero */
+ { 60, 8, 5, 3, 0, -5 }, /* 0x31 one */
+ { 65, 8, 5, 4, 0, -5 }, /* 0x32 two */
+ { 70, 8, 5, 4, 0, -5 }, /* 0x33 three */
+ { 75, 8, 5, 4, 0, -5 }, /* 0x34 four */
+ { 80, 8, 5, 4, 0, -5 }, /* 0x35 five */
+ { 85, 8, 5, 4, 0, -5 }, /* 0x36 six */
+ { 90, 8, 5, 4, 0, -5 }, /* 0x37 seven */
+ { 95, 8, 5, 4, 0, -5 }, /* 0x38 eight */
+ { 100, 8, 5, 4, 0, -5 }, /* 0x39 nine */
+ { 105, 8, 3, 2, 0, -4 }, /* 0x3A colon */
+ { 108, 8, 4, 3, 0, -4 }, /* 0x3B semicolon */
+ { 112, 8, 5, 4, 0, -5 }, /* 0x3C less */
+ { 117, 8, 3, 4, 0, -4 }, /* 0x3D equal */
+ { 120, 8, 5, 4, 0, -5 }, /* 0x3E greater */
+ { 125, 8, 5, 4, 0, -5 }, /* 0x3F question */
+ { 130, 8, 5, 4, 0, -5 }, /* 0x40 at */
+ { 135, 8, 5, 4, 0, -5 }, /* 0x41 A */
+ { 140, 8, 5, 4, 0, -5 }, /* 0x42 B */
+ { 145, 8, 5, 4, 0, -5 }, /* 0x43 C */
+ { 150, 8, 5, 4, 0, -5 }, /* 0x44 D */
+ { 155, 8, 5, 4, 0, -5 }, /* 0x45 E */
+ { 160, 8, 5, 4, 0, -5 }, /* 0x46 F */
+ { 165, 8, 5, 4, 0, -5 }, /* 0x47 G */
+ { 170, 8, 5, 4, 0, -5 }, /* 0x48 H */
+ { 175, 8, 5, 4, 0, -5 }, /* 0x49 I */
+ { 180, 8, 5, 4, 0, -5 }, /* 0x4A J */
+ { 185, 8, 5, 4, 0, -5 }, /* 0x4B K */
+ { 190, 8, 5, 4, 0, -5 }, /* 0x4C L */
+ { 195, 8, 5, 4, 0, -5 }, /* 0x4D M */
+ { 200, 8, 5, 4, 0, -5 }, /* 0x4E N */
+ { 205, 8, 5, 4, 0, -5 }, /* 0x4F O */
+ { 210, 8, 5, 4, 0, -5 }, /* 0x50 P */
+ { 215, 8, 5, 4, 0, -5 }, /* 0x51 Q */
+ { 220, 8, 5, 4, 0, -5 }, /* 0x52 R */
+ { 225, 8, 5, 4, 0, -5 }, /* 0x53 S */
+ { 230, 8, 5, 4, 0, -5 }, /* 0x54 T */
+ { 235, 8, 5, 4, 0, -5 }, /* 0x55 U */
+ { 240, 8, 5, 4, 0, -5 }, /* 0x56 V */
+ { 245, 8, 5, 4, 0, -5 }, /* 0x57 W */
+ { 250, 8, 5, 4, 0, -5 }, /* 0x58 X */
+ { 255, 8, 5, 4, 0, -5 }, /* 0x59 Y */
+ { 260, 8, 5, 4, 0, -5 }, /* 0x5A Z */
+ { 265, 8, 5, 4, 0, -5 }, /* 0x5B bracketleft */
+ { 270, 8, 3, 4, 0, -4 }, /* 0x5C backslash */
+ { 273, 8, 5, 4, 0, -5 }, /* 0x5D bracketright */
+ { 278, 8, 2, 4, 0, -5 }, /* 0x5E asciicircum */
+ { 280, 8, 1, 4, 0, -1 }, /* 0x5F underscore */
+ { 281, 8, 2, 3, 0, -5 }, /* 0x60 grave */
+ { 283, 8, 4, 4, 0, -4 }, /* 0x61 a */
+ { 287, 8, 5, 4, 0, -5 }, /* 0x62 b */
+ { 292, 8, 4, 4, 0, -4 }, /* 0x63 c */
+ { 296, 8, 5, 4, 0, -5 }, /* 0x64 d */
+ { 301, 8, 4, 4, 0, -4 }, /* 0x65 e */
+ { 305, 8, 5, 4, 0, -5 }, /* 0x66 f */
+ { 310, 8, 5, 4, 0, -4 }, /* 0x67 g */
+ { 315, 8, 5, 4, 0, -5 }, /* 0x68 h */
+ { 320, 8, 5, 2, 0, -5 }, /* 0x69 i */
+ { 325, 8, 6, 4, 0, -5 }, /* 0x6A j */
+ { 331, 8, 5, 4, 0, -5 }, /* 0x6B k */
+ { 336, 8, 5, 4, 0, -5 }, /* 0x6C l */
+ { 341, 8, 4, 4, 0, -4 }, /* 0x6D m */
+ { 345, 8, 4, 4, 0, -4 }, /* 0x6E n */
+ { 349, 8, 4, 4, 0, -4 }, /* 0x6F o */
+ { 353, 8, 5, 4, 0, -4 }, /* 0x70 p */
+ { 358, 8, 5, 4, 0, -4 }, /* 0x71 q */
+ { 363, 8, 4, 4, 0, -4 }, /* 0x72 r */
+ { 367, 8, 4, 4, 0, -4 }, /* 0x73 s */
+ { 371, 8, 5, 4, 0, -5 }, /* 0x74 t */
+ { 376, 8, 4, 4, 0, -4 }, /* 0x75 u */
+ { 380, 8, 4, 4, 0, -4 }, /* 0x76 v */
+ { 384, 8, 4, 4, 0, -4 }, /* 0x77 w */
+ { 388, 8, 4, 4, 0, -4 }, /* 0x78 x */
+ { 392, 8, 5, 4, 0, -4 }, /* 0x79 y */
+ { 397, 8, 4, 4, 0, -4 }, /* 0x7A z */
+ { 401, 8, 5, 4, 0, -5 }, /* 0x7B braceleft */
+ { 406, 8, 5, 2, 0, -5 }, /* 0x7C bar */
+ { 411, 8, 5, 4, 0, -5 }, /* 0x7D braceright */
+ { 416, 8, 2, 4, 0, -5 }, /* 0x7E asciitilde */
+#if (TOMTHUMB_USE_EXTENDED)
+ { 418, 8, 5, 2, 0, -5 }, /* 0xA1 exclamdown */
+ { 423, 8, 5, 4, 0, -5 }, /* 0xA2 cent */
+ { 428, 8, 5, 4, 0, -5 }, /* 0xA3 sterling */
+ { 433, 8, 5, 4, 0, -5 }, /* 0xA4 currency */
+ { 438, 8, 5, 4, 0, -5 }, /* 0xA5 yen */
+ { 443, 8, 5, 2, 0, -5 }, /* 0xA6 brokenbar */
+ { 448, 8, 5, 4, 0, -5 }, /* 0xA7 section */
+ { 453, 8, 1, 4, 0, -5 }, /* 0xA8 dieresis */
+ { 454, 8, 3, 4, 0, -5 }, /* 0xA9 copyright */
+ { 457, 8, 5, 4, 0, -5 }, /* 0xAA ordfeminine */
+ { 462, 8, 3, 3, 0, -5 }, /* 0xAB guillemotleft */
+ { 465, 8, 2, 4, 0, -4 }, /* 0xAC logicalnot */
+ { 467, 8, 1, 3, 0, -3 }, /* 0xAD softhyphen */
+ { 468, 8, 3, 4, 0, -5 }, /* 0xAE registered */
+ { 471, 8, 1, 4, 0, -5 }, /* 0xAF macron */
+ { 472, 8, 3, 4, 0, -5 }, /* 0xB0 degree */
+ { 475, 8, 5, 4, 0, -5 }, /* 0xB1 plusminus */
+ { 480, 8, 3, 4, 0, -5 }, /* 0xB2 twosuperior */
+ { 483, 8, 3, 4, 0, -5 }, /* 0xB3 threesuperior */
+ { 486, 8, 2, 3, 0, -5 }, /* 0xB4 acute */
+ { 488, 8, 5, 4, 0, -5 }, /* 0xB5 mu */
+ { 493, 8, 5, 4, 0, -5 }, /* 0xB6 paragraph */
+ { 498, 8, 3, 4, 0, -4 }, /* 0xB7 periodcentered */
+ { 501, 8, 3, 4, 0, -3 }, /* 0xB8 cedilla */
+ { 504, 8, 3, 2, 0, -5 }, /* 0xB9 onesuperior */
+ { 507, 8, 5, 4, 0, -5 }, /* 0xBA ordmasculine */
+ { 512, 8, 3, 3, 0, -5 }, /* 0xBB guillemotright */
+ { 515, 8, 5, 4, 0, -5 }, /* 0xBC onequarter */
+ { 520, 8, 5, 4, 0, -5 }, /* 0xBD onehalf */
+ { 525, 8, 5, 4, 0, -5 }, /* 0xBE threequarters */
+ { 530, 8, 5, 4, 0, -5 }, /* 0xBF questiondown */
+ { 535, 8, 5, 4, 0, -5 }, /* 0xC0 Agrave */
+ { 540, 8, 5, 4, 0, -5 }, /* 0xC1 Aacute */
+ { 545, 8, 5, 4, 0, -5 }, /* 0xC2 Acircumflex */
+ { 550, 8, 5, 4, 0, -5 }, /* 0xC3 Atilde */
+ { 555, 8, 5, 4, 0, -5 }, /* 0xC4 Adieresis */
+ { 560, 8, 5, 4, 0, -5 }, /* 0xC5 Aring */
+ { 565, 8, 5, 4, 0, -5 }, /* 0xC6 AE */
+ { 570, 8, 6, 4, 0, -5 }, /* 0xC7 Ccedilla */
+ { 576, 8, 5, 4, 0, -5 }, /* 0xC8 Egrave */
+ { 581, 8, 5, 4, 0, -5 }, /* 0xC9 Eacute */
+ { 586, 8, 5, 4, 0, -5 }, /* 0xCA Ecircumflex */
+ { 591, 8, 5, 4, 0, -5 }, /* 0xCB Edieresis */
+ { 596, 8, 5, 4, 0, -5 }, /* 0xCC Igrave */
+ { 601, 8, 5, 4, 0, -5 }, /* 0xCD Iacute */
+ { 606, 8, 5, 4, 0, -5 }, /* 0xCE Icircumflex */
+ { 611, 8, 5, 4, 0, -5 }, /* 0xCF Idieresis */
+ { 616, 8, 5, 4, 0, -5 }, /* 0xD0 Eth */
+ { 621, 8, 5, 4, 0, -5 }, /* 0xD1 Ntilde */
+ { 626, 8, 5, 4, 0, -5 }, /* 0xD2 Ograve */
+ { 631, 8, 5, 4, 0, -5 }, /* 0xD3 Oacute */
+ { 636, 8, 5, 4, 0, -5 }, /* 0xD4 Ocircumflex */
+ { 641, 8, 5, 4, 0, -5 }, /* 0xD5 Otilde */
+ { 646, 8, 5, 4, 0, -5 }, /* 0xD6 Odieresis */
+ { 651, 8, 3, 4, 0, -4 }, /* 0xD7 multiply */
+ { 654, 8, 5, 4, 0, -5 }, /* 0xD8 Oslash */
+ { 659, 8, 5, 4, 0, -5 }, /* 0xD9 Ugrave */
+ { 664, 8, 5, 4, 0, -5 }, /* 0xDA Uacute */
+ { 669, 8, 5, 4, 0, -5 }, /* 0xDB Ucircumflex */
+ { 674, 8, 5, 4, 0, -5 }, /* 0xDC Udieresis */
+ { 679, 8, 5, 4, 0, -5 }, /* 0xDD Yacute */
+ { 684, 8, 5, 4, 0, -5 }, /* 0xDE Thorn */
+ { 689, 8, 6, 4, 0, -5 }, /* 0xDF germandbls */
+ { 695, 8, 5, 4, 0, -5 }, /* 0xE0 agrave */
+ { 700, 8, 5, 4, 0, -5 }, /* 0xE1 aacute */
+ { 705, 8, 5, 4, 0, -5 }, /* 0xE2 acircumflex */
+ { 710, 8, 5, 4, 0, -5 }, /* 0xE3 atilde */
+ { 715, 8, 5, 4, 0, -5 }, /* 0xE4 adieresis */
+ { 720, 8, 5, 4, 0, -5 }, /* 0xE5 aring */
+ { 725, 8, 4, 4, 0, -4 }, /* 0xE6 ae */
+ { 729, 8, 5, 4, 0, -4 }, /* 0xE7 ccedilla */
+ { 734, 8, 5, 4, 0, -5 }, /* 0xE8 egrave */
+ { 739, 8, 5, 4, 0, -5 }, /* 0xE9 eacute */
+ { 744, 8, 5, 4, 0, -5 }, /* 0xEA ecircumflex */
+ { 749, 8, 5, 4, 0, -5 }, /* 0xEB edieresis */
+ { 754, 8, 5, 3, 0, -5 }, /* 0xEC igrave */
+ { 759, 8, 5, 3, 0, -5 }, /* 0xED iacute */
+ { 764, 8, 5, 4, 0, -5 }, /* 0xEE icircumflex */
+ { 769, 8, 5, 4, 0, -5 }, /* 0xEF idieresis */
+ { 774, 8, 5, 4, 0, -5 }, /* 0xF0 eth */
+ { 779, 8, 5, 4, 0, -5 }, /* 0xF1 ntilde */
+ { 784, 8, 5, 4, 0, -5 }, /* 0xF2 ograve */
+ { 789, 8, 5, 4, 0, -5 }, /* 0xF3 oacute */
+ { 794, 8, 5, 4, 0, -5 }, /* 0xF4 ocircumflex */
+ { 799, 8, 5, 4, 0, -5 }, /* 0xF5 otilde */
+ { 804, 8, 5, 4, 0, -5 }, /* 0xF6 odieresis */
+ { 809, 8, 5, 4, 0, -5 }, /* 0xF7 divide */
+ { 814, 8, 4, 4, 0, -4 }, /* 0xF8 oslash */
+ { 818, 8, 5, 4, 0, -5 }, /* 0xF9 ugrave */
+ { 823, 8, 5, 4, 0, -5 }, /* 0xFA uacute */
+ { 828, 8, 5, 4, 0, -5 }, /* 0xFB ucircumflex */
+ { 833, 8, 5, 4, 0, -5 }, /* 0xFC udieresis */
+ { 838, 8, 6, 4, 0, -5 }, /* 0xFD yacute */
+ { 844, 8, 5, 4, 0, -4 }, /* 0xFE thorn */
+ { 849, 8, 6, 4, 0, -5 }, /* 0xFF ydieresis */
+ { 855, 8, 1, 2, 0, -1 }, /* 0x11D gcircumflex */
+ { 856, 8, 5, 4, 0, -5 }, /* 0x152 OE */
+ { 861, 8, 4, 4, 0, -4 }, /* 0x153 oe */
+ { 865, 8, 5, 4, 0, -5 }, /* 0x160 Scaron */
+ { 870, 8, 5, 4, 0, -5 }, /* 0x161 scaron */
+ { 875, 8, 5, 4, 0, -5 }, /* 0x178 Ydieresis */
+ { 880, 8, 5, 4, 0, -5 }, /* 0x17D Zcaron */
+ { 885, 8, 5, 4, 0, -5 }, /* 0x17E zcaron */
+ { 890, 8, 1, 2, 0, -1 }, /* 0xEA4 uni0EA4 */
+ { 891, 8, 1, 2, 0, -1 }, /* 0x13A0 uni13A0 */
+ { 892, 8, 1, 2, 0, -3 }, /* 0x2022 bullet */
+ { 893, 8, 1, 4, 0, -1 }, /* 0x2026 ellipsis */
+ { 894, 8, 5, 4, 0, -5 }, /* 0x20AC Euro */
+ { 899, 8, 5, 4, 0, -5 }, /* 0xFFFD uniFFFD */
+#endif /* (TOMTHUMB_USE_EXTENDED) */
+};
+
+const GFXfont TomThumb PROGMEM = {
+ (uint8_t *)TomThumbBitmaps,
+ (GFXglyph *)TomThumbGlyphs,
+ 0x20, 0x7E, 6 };
diff --git a/lib/Adafruit-GFX-Library-1.2.9/README.md b/lib/Adafruit-GFX-Library-1.2.9/README.md
new file mode 100644
index 000000000000..cd27c33b66f1
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/README.md
@@ -0,0 +1,31 @@
+# Adafruit GFX Library # [![Build Status](https://travis-ci.org/adafruit/Adafruit_GFX.svg?branch=master)](https://travis-ci.org/adafruit/Adafruit_GFX)
+
+This is the core graphics library for all our displays, providing a common set of graphics primitives (points, lines, circles, etc.). It needs to be paired with a hardware-specific library for each display device we carry (to handle the lower-level functions).
+
+Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit!
+
+Written by Limor Fried/Ladyada for Adafruit Industries.
+BSD license, check license.txt for more information.
+All text above must be included in any redistribution.
+
+Recent Arduino IDE releases include the Library Manager for easy installation. Otherwise, to download, click the DOWNLOAD ZIP button, uncompress and rename the uncompressed folder Adafruit_GFX. Confirm that the Adafruit_GFX folder contains Adafruit_GFX.cpp and Adafruit_GFX.h. Place the Adafruit_GFX library folder your ArduinoSketchFolder/Libraries/ folder. You may need to create the Libraries subfolder if its your first library. Restart the IDE.
+
+# Useful Resources
+
+- Image2Code: This is a handy Java GUI utility to convert a BMP file into the array code necessary to display the image with the drawBitmap function. Check out the code at ehubin's GitHub repository: https://github.com/ehubin/Adafruit-GFX-Library/tree/master/Img2Code
+
+- drawXBitmap function: You can use the GIMP photo editor to save a .xbm file and use the array saved in the file to draw a bitmap with the drawXBitmap function. See the pull request here for more details: https://github.com/adafruit/Adafruit-GFX-Library/pull/31
+
+- 'Fonts' folder contains bitmap fonts for use with recent (1.1 and later) Adafruit_GFX. To use a font in your Arduino sketch, \#include the corresponding .h file and pass address of GFXfont struct to setFont(). Pass NULL to revert to 'classic' fixed-space bitmap font.
+
+- 'fontconvert' folder contains a command-line tool for converting TTF fonts to Adafruit_GFX header format.
+
+---
+
+### Roadmap
+
+The PRIME DIRECTIVE is to maintain backward compatibility with existing Arduino sketches -- many are hosted elsewhere and don't track changes here, some are in print and can never be changed! This "little" library has grown organically over time and sometimes we paint ourselves into a design corner and just have to live with it or add ungainly workarounds.
+
+Highly unlikely to merge any changes for additional or incompatible font formats (see Prime Directive above). There are already two formats and the code is quite bloaty there as it is (this also creates liabilities for tools and documentation). If you *must* have a more sophisticated font format, consider creating a fork with the features required for your project. For similar reasons, also unlikely to add any more bitmap formats, it's getting messy.
+
+Please don't reformat code for the sake of reformatting code. The resulting large "visual diff" makes it impossible to untangle actual bug fixes from merely rearranged lines.
diff --git a/lib/Adafruit-GFX-Library-1.2.9/examples/mock_ili9341/mock_ili9341.ino b/lib/Adafruit-GFX-Library-1.2.9/examples/mock_ili9341/mock_ili9341.ino
new file mode 100644
index 000000000000..3154d4095463
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/examples/mock_ili9341/mock_ili9341.ino
@@ -0,0 +1,365 @@
+/***************************************************
+ This is our GFX example for the Adafruit ILI9341 Breakout and Shield
+ ----> http://www.adafruit.com/products/1651
+
+ Check out the links above for our tutorials and wiring diagrams
+ These displays use SPI to communicate, 4 or 5 pins are required to
+ interface (RST is optional)
+ Adafruit invests time and resources providing this open source code,
+ please support Adafruit and open-source hardware by purchasing
+ products from Adafruit!
+
+ Written by Limor Fried/Ladyada for Adafruit Industries.
+ MIT license, all text above must be included in any redistribution
+ ****************************************************/
+
+
+#include "SPI.h"
+#include "Adafruit_GFX.h"
+#include "Adafruit_ILI9341.h"
+
+// For the Adafruit shield, these are the default.
+#define TFT_DC 9
+#define TFT_CS 10
+
+// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
+Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
+// If using the breakout, change pins as desired
+//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
+
+void setup() {
+ Serial.begin(9600);
+ Serial.println("ILI9341 Test!");
+
+ tft.begin();
+
+ // read diagnostics (optional but can help debug problems)
+ uint8_t x = tft.readcommand8(ILI9341_RDMODE);
+ Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX);
+ x = tft.readcommand8(ILI9341_RDMADCTL);
+ Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX);
+ x = tft.readcommand8(ILI9341_RDPIXFMT);
+ Serial.print("Pixel Format: 0x"); Serial.println(x, HEX);
+ x = tft.readcommand8(ILI9341_RDIMGFMT);
+ Serial.print("Image Format: 0x"); Serial.println(x, HEX);
+ x = tft.readcommand8(ILI9341_RDSELFDIAG);
+ Serial.print("Self Diagnostic: 0x"); Serial.println(x, HEX);
+
+ Serial.println(F("Benchmark Time (microseconds)"));
+ delay(10);
+ Serial.print(F("Screen fill "));
+ Serial.println(testFillScreen());
+ delay(500);
+
+ Serial.print(F("Text "));
+ Serial.println(testText());
+ delay(3000);
+
+ Serial.print(F("Lines "));
+ Serial.println(testLines(ILI9341_CYAN));
+ delay(500);
+
+ Serial.print(F("Horiz/Vert Lines "));
+ Serial.println(testFastLines(ILI9341_RED, ILI9341_BLUE));
+ delay(500);
+
+ Serial.print(F("Rectangles (outline) "));
+ Serial.println(testRects(ILI9341_GREEN));
+ delay(500);
+
+ Serial.print(F("Rectangles (filled) "));
+ Serial.println(testFilledRects(ILI9341_YELLOW, ILI9341_MAGENTA));
+ delay(500);
+
+ Serial.print(F("Circles (filled) "));
+ Serial.println(testFilledCircles(10, ILI9341_MAGENTA));
+
+ Serial.print(F("Circles (outline) "));
+ Serial.println(testCircles(10, ILI9341_WHITE));
+ delay(500);
+
+ Serial.print(F("Triangles (outline) "));
+ Serial.println(testTriangles());
+ delay(500);
+
+ Serial.print(F("Triangles (filled) "));
+ Serial.println(testFilledTriangles());
+ delay(500);
+
+ Serial.print(F("Rounded rects (outline) "));
+ Serial.println(testRoundRects());
+ delay(500);
+
+ Serial.print(F("Rounded rects (filled) "));
+ Serial.println(testFilledRoundRects());
+ delay(500);
+
+ Serial.println(F("Done!"));
+
+}
+
+
+void loop(void) {
+ for(uint8_t rotation=0; rotation<4; rotation++) {
+ tft.setRotation(rotation);
+ testText();
+ delay(1000);
+ }
+}
+
+unsigned long testFillScreen() {
+ unsigned long start = micros();
+ tft.fillScreen(ILI9341_BLACK);
+ yield();
+ tft.fillScreen(ILI9341_RED);
+ yield();
+ tft.fillScreen(ILI9341_GREEN);
+ yield();
+ tft.fillScreen(ILI9341_BLUE);
+ yield();
+ tft.fillScreen(ILI9341_BLACK);
+ yield();
+ return micros() - start;
+}
+
+unsigned long testText() {
+ tft.fillScreen(ILI9341_BLACK);
+ unsigned long start = micros();
+ tft.setCursor(0, 0);
+ tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1);
+ tft.println("Hello World!");
+ tft.setTextColor(ILI9341_YELLOW); tft.setTextSize(2);
+ tft.println(1234.56);
+ tft.setTextColor(ILI9341_RED); tft.setTextSize(3);
+ tft.println(0xDEADBEEF, HEX);
+ tft.println();
+ tft.setTextColor(ILI9341_GREEN);
+ tft.setTextSize(5);
+ tft.println("Groop");
+ tft.setTextSize(2);
+ tft.println("I implore thee,");
+ tft.setTextSize(1);
+ tft.println("my foonting turlingdromes.");
+ tft.println("And hooptiously drangle me");
+ tft.println("with crinkly bindlewurdles,");
+ tft.println("Or I will rend thee");
+ tft.println("in the gobberwarts");
+ tft.println("with my blurglecruncheon,");
+ tft.println("see if I don't!");
+ return micros() - start;
+}
+
+unsigned long testLines(uint16_t color) {
+ unsigned long start, t;
+ int x1, y1, x2, y2,
+ w = tft.width(),
+ h = tft.height();
+
+ tft.fillScreen(ILI9341_BLACK);
+ yield();
+
+ x1 = y1 = 0;
+ y2 = h - 1;
+ start = micros();
+ for(x2=0; x20; i-=6) {
+ i2 = i / 2;
+ start = micros();
+ tft.fillRect(cx-i2, cy-i2, i, i, color1);
+ t += micros() - start;
+ // Outlines are not included in timing results
+ tft.drawRect(cx-i2, cy-i2, i, i, color2);
+ yield();
+ }
+
+ return t;
+}
+
+unsigned long testFilledCircles(uint8_t radius, uint16_t color) {
+ unsigned long start;
+ int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2;
+
+ tft.fillScreen(ILI9341_BLACK);
+ start = micros();
+ for(x=radius; x10; i-=5) {
+ start = micros();
+ tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
+ tft.color565(0, i*10, i*10));
+ t += micros() - start;
+ tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
+ tft.color565(i*10, i*10, 0));
+ yield();
+ }
+
+ return t;
+}
+
+unsigned long testRoundRects() {
+ unsigned long start;
+ int w, i, i2,
+ cx = tft.width() / 2 - 1,
+ cy = tft.height() / 2 - 1;
+
+ tft.fillScreen(ILI9341_BLACK);
+ w = min(tft.width(), tft.height());
+ start = micros();
+ for(i=0; i20; i-=6) {
+ i2 = i / 2;
+ tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0));
+ yield();
+ }
+
+ return micros() - start;
+}
\ No newline at end of file
diff --git a/lib/Adafruit-GFX-Library-1.2.9/fontconvert/Makefile b/lib/Adafruit-GFX-Library-1.2.9/fontconvert/Makefile
new file mode 100644
index 000000000000..47f5a0e15a5a
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/fontconvert/Makefile
@@ -0,0 +1,12 @@
+all: fontconvert
+
+CC = gcc
+CFLAGS = -Wall -I/usr/local/include/freetype2 -I/usr/include/freetype2 -I/usr/include
+LIBS = -lfreetype
+
+fontconvert: fontconvert.c
+ $(CC) $(CFLAGS) $< $(LIBS) -o $@
+ strip $@
+
+clean:
+ rm -f fontconvert
diff --git a/lib/Adafruit-GFX-Library-1.2.9/fontconvert/fontconvert.c b/lib/Adafruit-GFX-Library-1.2.9/fontconvert/fontconvert.c
new file mode 100644
index 000000000000..bfd21103cc79
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/fontconvert/fontconvert.c
@@ -0,0 +1,284 @@
+/*
+TrueType to Adafruit_GFX font converter. Derived from Peter Jakobs'
+Adafruit_ftGFX fork & makefont tool, and Paul Kourany's Adafruit_mfGFX.
+
+NOT AN ARDUINO SKETCH. This is a command-line tool for preprocessing
+fonts to be used with the Adafruit_GFX Arduino library.
+
+For UNIX-like systems. Outputs to stdout; redirect to header file, e.g.:
+ ./fontconvert ~/Library/Fonts/FreeSans.ttf 18 > FreeSans18pt7b.h
+
+REQUIRES FREETYPE LIBRARY. www.freetype.org
+
+Currently this only extracts the printable 7-bit ASCII chars of a font.
+Will eventually extend with some int'l chars a la ftGFX, not there yet.
+Keep 7-bit fonts around as an option in that case, more compact.
+
+See notes at end for glyph nomenclature & other tidbits.
+*/
+
+#include
+#include
+#include
+#include
+#include FT_GLYPH_H
+#include "../gfxfont.h" // Adafruit_GFX font structures
+
+#define DPI 141 // Approximate res. of Adafruit 2.8" TFT
+
+// Accumulate bits for output, with periodic hexadecimal byte write
+void enbit(uint8_t value) {
+ static uint8_t row = 0, sum = 0, bit = 0x80, firstCall = 1;
+ if(value) sum |= bit; // Set bit if needed
+ if(!(bit >>= 1)) { // Advance to next bit, end of byte reached?
+ if(!firstCall) { // Format output table nicely
+ if(++row >= 12) { // Last entry on line?
+ printf(",\n "); // Newline format output
+ row = 0; // Reset row counter
+ } else { // Not end of line
+ printf(", "); // Simple comma delim
+ }
+ }
+ printf("0x%02X", sum); // Write byte value
+ sum = 0; // Clear for next byte
+ bit = 0x80; // Reset bit counter
+ firstCall = 0; // Formatting flag
+ }
+}
+
+int main(int argc, char *argv[]) {
+ int i, j, err, size, first=' ', last='~',
+ bitmapOffset = 0, x, y, byte;
+ char *fontName, c, *ptr;
+ FT_Library library;
+ FT_Face face;
+ FT_Glyph glyph;
+ FT_Bitmap *bitmap;
+ FT_BitmapGlyphRec *g;
+ GFXglyph *table;
+ uint8_t bit;
+
+ // Parse command line. Valid syntaxes are:
+ // fontconvert [filename] [size]
+ // fontconvert [filename] [size] [last char]
+ // fontconvert [filename] [size] [first char] [last char]
+ // Unless overridden, default first and last chars are
+ // ' ' (space) and '~', respectively
+
+ if(argc < 3) {
+ fprintf(stderr, "Usage: %s fontfile size [first] [last]\n",
+ argv[0]);
+ return 1;
+ }
+
+ size = atoi(argv[2]);
+
+ if(argc == 4) {
+ last = atoi(argv[3]);
+ } else if(argc == 5) {
+ first = atoi(argv[3]);
+ last = atoi(argv[4]);
+ }
+
+ if(last < first) {
+ i = first;
+ first = last;
+ last = i;
+ }
+
+ ptr = strrchr(argv[1], '/'); // Find last slash in filename
+ if(ptr) ptr++; // First character of filename (path stripped)
+ else ptr = argv[1]; // No path; font in local dir.
+
+ // Allocate space for font name and glyph table
+ if((!(fontName = malloc(strlen(ptr) + 20))) ||
+ (!(table = (GFXglyph *)malloc((last - first + 1) *
+ sizeof(GFXglyph))))) {
+ fprintf(stderr, "Malloc error\n");
+ return 1;
+ }
+
+ // Derive font table names from filename. Period (filename
+ // extension) is truncated and replaced with the font size & bits.
+ strcpy(fontName, ptr);
+ ptr = strrchr(fontName, '.'); // Find last period (file ext)
+ if(!ptr) ptr = &fontName[strlen(fontName)]; // If none, append
+ // Insert font size and 7/8 bit. fontName was alloc'd w/extra
+ // space to allow this, we're not sprintfing into Forbidden Zone.
+ sprintf(ptr, "%dpt%db", size, (last > 127) ? 8 : 7);
+ // Space and punctuation chars in name replaced w/ underscores.
+ for(i=0; (c=fontName[i]); i++) {
+ if(isspace(c) || ispunct(c)) fontName[i] = '_';
+ }
+
+ // Init FreeType lib, load font
+ if((err = FT_Init_FreeType(&library))) {
+ fprintf(stderr, "FreeType init error: %d", err);
+ return err;
+ }
+ if((err = FT_New_Face(library, argv[1], 0, &face))) {
+ fprintf(stderr, "Font load error: %d", err);
+ FT_Done_FreeType(library);
+ return err;
+ }
+
+ // << 6 because '26dot6' fixed-point format
+ FT_Set_Char_Size(face, size << 6, 0, DPI, 0);
+
+ // Currently all symbols from 'first' to 'last' are processed.
+ // Fonts may contain WAY more glyphs than that, but this code
+ // will need to handle encoding stuff to deal with extracting
+ // the right symbols, and that's not done yet.
+ // fprintf(stderr, "%ld glyphs\n", face->num_glyphs);
+
+ printf("const uint8_t %sBitmaps[] PROGMEM = {\n ", fontName);
+
+ // Process glyphs and output huge bitmap data array
+ for(i=first, j=0; i<=last; i++, j++) {
+ // MONO renderer provides clean image with perfect crop
+ // (no wasted pixels) via bitmap struct.
+ if((err = FT_Load_Char(face, i, FT_LOAD_TARGET_MONO))) {
+ fprintf(stderr, "Error %d loading char '%c'\n",
+ err, i);
+ continue;
+ }
+
+ if((err = FT_Render_Glyph(face->glyph,
+ FT_RENDER_MODE_MONO))) {
+ fprintf(stderr, "Error %d rendering char '%c'\n",
+ err, i);
+ continue;
+ }
+
+ if((err = FT_Get_Glyph(face->glyph, &glyph))) {
+ fprintf(stderr, "Error %d getting glyph '%c'\n",
+ err, i);
+ continue;
+ }
+
+ bitmap = &face->glyph->bitmap;
+ g = (FT_BitmapGlyphRec *)glyph;
+
+ // Minimal font and per-glyph information is stored to
+ // reduce flash space requirements. Glyph bitmaps are
+ // fully bit-packed; no per-scanline pad, though end of
+ // each character may be padded to next byte boundary
+ // when needed. 16-bit offset means 64K max for bitmaps,
+ // code currently doesn't check for overflow. (Doesn't
+ // check that size & offsets are within bounds either for
+ // that matter...please convert fonts responsibly.)
+ table[j].bitmapOffset = bitmapOffset;
+ table[j].width = bitmap->width;
+ table[j].height = bitmap->rows;
+ table[j].xAdvance = face->glyph->advance.x >> 6;
+ table[j].xOffset = g->left;
+ table[j].yOffset = 1 - g->top;
+
+ for(y=0; y < bitmap->rows; y++) {
+ for(x=0;x < bitmap->width; x++) {
+ byte = x / 8;
+ bit = 0x80 >> (x & 7);
+ enbit(bitmap->buffer[
+ y * bitmap->pitch + byte] & bit);
+ }
+ }
+
+ // Pad end of char bitmap to next byte boundary if needed
+ int n = (bitmap->width * bitmap->rows) & 7;
+ if(n) { // Pixel count not an even multiple of 8?
+ n = 8 - n; // # bits to next multiple
+ while(n--) enbit(0);
+ }
+ bitmapOffset += (bitmap->width * bitmap->rows + 7) / 8;
+
+ FT_Done_Glyph(glyph);
+ }
+
+ printf(" };\n\n"); // End bitmap array
+
+ // Output glyph attributes table (one per character)
+ printf("const GFXglyph %sGlyphs[] PROGMEM = {\n", fontName);
+ for(i=first, j=0; i<=last; i++, j++) {
+ printf(" { %5d, %3d, %3d, %3d, %4d, %4d }",
+ table[j].bitmapOffset,
+ table[j].width,
+ table[j].height,
+ table[j].xAdvance,
+ table[j].xOffset,
+ table[j].yOffset);
+ if(i < last) {
+ printf(", // 0x%02X", i);
+ if((i >= ' ') && (i <= '~')) {
+ printf(" '%c'", i);
+ }
+ putchar('\n');
+ }
+ }
+ printf(" }; // 0x%02X", last);
+ if((last >= ' ') && (last <= '~')) printf(" '%c'", last);
+ printf("\n\n");
+
+ // Output font structure
+ printf("const GFXfont %s PROGMEM = {\n", fontName);
+ printf(" (uint8_t *)%sBitmaps,\n", fontName);
+ printf(" (GFXglyph *)%sGlyphs,\n", fontName);
+ if (face->size->metrics.height == 0) {
+ // No face height info, assume fixed width and get from a glyph.
+ printf(" 0x%02X, 0x%02X, %d };\n\n",
+ first, last, table[0].height);
+ } else {
+ printf(" 0x%02X, 0x%02X, %ld };\n\n",
+ first, last, face->size->metrics.height >> 6);
+ }
+ printf("// Approx. %d bytes\n",
+ bitmapOffset + (last - first + 1) * 7 + 7);
+ // Size estimate is based on AVR struct and pointer sizes;
+ // actual size may vary.
+
+ FT_Done_FreeType(library);
+
+ return 0;
+}
+
+/* -------------------------------------------------------------------------
+
+Character metrics are slightly different from classic GFX & ftGFX.
+In classic GFX: cursor position is the upper-left pixel of each 5x7
+character; lower extent of most glyphs (except those w/descenders)
+is +6 pixels in Y direction.
+W/new GFX fonts: cursor position is on baseline, where baseline is
+'inclusive' (containing the bottom-most row of pixels in most symbols,
+except those with descenders; ftGFX is one pixel lower).
+
+Cursor Y will be moved automatically when switching between classic
+and new fonts. If you switch fonts, any print() calls will continue
+along the same baseline.
+
+ ...........#####.. -- yOffset
+ ..........######..
+ ..........######..
+ .........#######..
+ ........#########.
+ * = Cursor pos. ........#########.
+ .......##########.
+ ......#####..####.
+ ......#####..####.
+ *.#.. .....#####...####.
+ .#.#. ....##############
+ #...# ...###############
+ #...# ...###############
+ ##### ..#####......#####
+ #...# .#####.......#####
+====== #...# ====== #*###.........#### ======= Baseline
+ || xOffset
+
+glyph->xOffset and yOffset are pixel offsets, in GFX coordinate space
+(+Y is down), from the cursor position to the top-left pixel of the
+glyph bitmap. i.e. yOffset is typically negative, xOffset is typically
+zero but a few glyphs will have other values (even negative xOffsets
+sometimes, totally normal). glyph->xAdvance is the distance to move
+the cursor on the X axis after drawing the corresponding symbol.
+
+There's also some changes with regard to 'background' color and new GFX
+fonts (classic fonts unchanged). See Adafruit_GFX.cpp for explanation.
+*/
diff --git a/lib/Adafruit-GFX-Library-1.2.9/fontconvert/fontconvert_win.md b/lib/Adafruit-GFX-Library-1.2.9/fontconvert/fontconvert_win.md
new file mode 100644
index 000000000000..361078b60b60
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/fontconvert/fontconvert_win.md
@@ -0,0 +1,88 @@
+### A short guide to use fontconvert.c to create your own fonts using MinGW.
+
+#### STEP 1: INSTALL MinGW
+
+Install MinGW (Minimalist GNU for Windows) from [MinGW.org](http://www.mingw.org/).
+Please read carefully the instructions found on [Getting started page](http://www.mingw.org/wiki/Getting_Started).
+I suggest installing with the "Graphical User Interface Installer".
+To complete your initial installation you should further install some "packages".
+For our purpose you should only install the "Basic Setup" packages.
+To do that:
+
+1. Open the MinGW Installation Manager
+2. From the left panel click "Basic Setup".
+3. On the right panel choose "mingw32-base", "mingw-gcc-g++", "mingw-gcc-objc" and "msys-base"
+and click "Mark for installation"
+4. From the Menu click "Installation" and then "Apply changes". In the pop-up window select "Apply".
+
+
+#### STEP 2: INSTALL Freetype Library
+
+To read about the freetype project visit [freetype.org](https://www.freetype.org/).
+To Download the latest version of freetype go to [download page](http://download.savannah.gnu.org/releases/freetype/)
+and choose "freetype-2.7.tar.gz" file (or a newer version if available).
+To avoid long cd commands later in the command prompt, I suggest you unzip the file in the C:\ directory.
+(I also renamed the folder to "ft27")
+Before you build the library it's good to read these articles:
+* [Using MSYS with MinGW](http://www.mingw.org/wiki/MSYS)
+* [Installation and Use of Supplementary Libraries with MinGW](http://www.mingw.org/wiki/LibraryPathHOWTO)
+* [Include Path](http://www.mingw.org/wiki/IncludePathHOWTO)
+
+Inside the unzipped folder there is another folder named "docs". Open it and read the INSTALL.UNIX (using notepad).
+Pay attention to paragraph 3 (Build and Install the Library). So, let's begin the installation.
+To give the appropriate commands we will use the MSYS command prompt (not cmd.exe of windows) which is UNIX like.
+Follow the path C:\MinGW\msys\1.0 and double click "msys.bat". The command prompt environment appears.
+Enter "ft27" directory using the cd commands:
+```
+cd /c
+cd ft27
+```
+
+and then type one by one the commands:
+```
+./configure --prefix=/mingw
+make
+make install
+```
+Once you're finished, go inside "C:\MinGW\include" and there should be a new folder named "freetype2".
+That, hopefully, means that you have installed the library correctly !!
+
+#### STEP 3: Build fontconvert.c
+
+Before proceeding I suggest you make a copy of Adafruit_GFX_library folder in C:\ directory.
+Then, inside "fontconvert" folder open the "makefile" with an editor ( I used notepad++).
+Change the commands so in the end the program looks like :
+```
+all: fontconvert
+
+CC = gcc
+CFLAGS = -Wall -I c:/mingw/include/freetype2
+LIBS = -lfreetype
+
+fontconvert: fontconvert.c
+ $(CC) $(CFLAGS) $< $(LIBS) -o $@
+
+clean:
+ rm -f fontconvert
+```
+Go back in the command prompt and with a cd command enter the fontconvert directory.
+```
+cd /c/adafruit_gfx_library\fontconvert
+```
+Give the command:
+```
+make
+```
+This command will, eventually, create a "fontconvert.exe" file inside fontconvert directory.
+
+#### STEP 4: Create your own font header files
+
+Now that you have an executable file, you can use it to create your own fonts to work with Adafruit GFX lib.
+So, if we suppose that you already have a .ttf file with your favorite fonts, jump to the command prompt and type:
+```
+./fontconvert yourfonts.ttf 9 > yourfonts9pt7b.h
+```
+You can read more details at: [learn.adafruit](https://learn.adafruit.com/adafruit-gfx-graphics-library/using-fonts).
+
+Taraaaaaammm !! you've just created your new font header file. Put it inside the "Fonts" folder, grab a cup of coffee
+and start playing with your Arduino (or whatever else ....)+ display module project.
diff --git a/lib/Adafruit-GFX-Library-1.2.9/fontconvert/makefonts.sh b/lib/Adafruit-GFX-Library-1.2.9/fontconvert/makefonts.sh
new file mode 100644
index 000000000000..35f07ea52262
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/fontconvert/makefonts.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+# Ugly little Bash script, generates a set of .h files for GFX using
+# GNU FreeFont sources. There are three fonts: 'Mono' (Courier-like),
+# 'Sans' (Helvetica-like) and 'Serif' (Times-like); four styles: regular,
+# bold, oblique or italic, and bold+oblique or bold+italic; and four
+# sizes: 9, 12, 18 and 24 point. No real error checking or anything,
+# this just powers through all the combinations, calling the fontconvert
+# utility and redirecting the output to a .h file for each combo.
+
+# Adafruit_GFX repository does not include the source outline fonts
+# (huge zipfile, different license) but they're easily acquired:
+# http://savannah.gnu.org/projects/freefont/
+
+convert=./fontconvert
+inpath=~/Desktop/freefont/
+outpath=../Fonts/
+fonts=(FreeMono FreeSans FreeSerif)
+styles=("" Bold Italic BoldItalic Oblique BoldOblique)
+sizes=(9 12 18 24)
+
+for f in ${fonts[*]}
+do
+ for index in ${!styles[*]}
+ do
+ st=${styles[$index]}
+ for si in ${sizes[*]}
+ do
+ infile=$inpath$f$st".ttf"
+ if [ -f $infile ] # Does source combination exist?
+ then
+ outfile=$outpath$f$st$si"pt7b.h"
+# printf "%s %s %s > %s\n" $convert $infile $si $outfile
+ $convert $infile $si > $outfile
+ fi
+ done
+ done
+done
diff --git a/lib/Adafruit-GFX-Library-1.2.9/gfxfont.h b/lib/Adafruit-GFX-Library-1.2.9/gfxfont.h
new file mode 100644
index 000000000000..c691de645b4d
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/gfxfont.h
@@ -0,0 +1,29 @@
+// Font structures for newer Adafruit_GFX (1.1 and later).
+// Example fonts are included in 'Fonts' directory.
+// To use a font in your Arduino sketch, #include the corresponding .h
+// file and pass address of GFXfont struct to setFont(). Pass NULL to
+// revert to 'classic' fixed-space bitmap font.
+
+#ifndef _GFXFONT_H_
+#define _GFXFONT_H_
+
+/// Font data stored PER GLYPH
+typedef struct {
+ uint16_t bitmapOffset; ///< Pointer into GFXfont->bitmap
+ uint8_t width; ///< Bitmap dimensions in pixels
+ uint8_t height; ///< Bitmap dimensions in pixels
+ uint8_t xAdvance; ///< Distance to advance cursor (x axis)
+ int8_t xOffset; ///< X dist from cursor pos to UL corner
+ int8_t yOffset; ///< Y dist from cursor pos to UL corner
+} GFXglyph;
+
+/// Data stored for FONT AS A WHOLE
+typedef struct {
+ uint8_t *bitmap; ///< Glyph bitmaps, concatenated
+ GFXglyph *glyph; ///< Glyph array
+ uint8_t first; ///< ASCII extents (first char)
+ uint8_t last; ///< ASCII extents (last char)
+ uint8_t yAdvance; ///< Newline distance (y axis)
+} GFXfont;
+
+#endif // _GFXFONT_H_
diff --git a/lib/Adafruit-GFX-Library-1.2.9/glcdfont.c b/lib/Adafruit-GFX-Library-1.2.9/glcdfont.c
new file mode 100644
index 000000000000..6f88bd23a781
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/glcdfont.c
@@ -0,0 +1,276 @@
+// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0.
+// See gfxfont.h for newer custom bitmap font info.
+
+#ifndef FONT5X7_H
+#define FONT5X7_H
+
+#ifdef __AVR__
+ #include
+ #include
+#elif defined(ESP8266)
+ #include
+#else
+ #define PROGMEM
+#endif
+
+// Standard ASCII 5x7 font
+
+static const unsigned char font[] PROGMEM = {
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3E, 0x5B, 0x4F, 0x5B, 0x3E,
+ 0x3E, 0x6B, 0x4F, 0x6B, 0x3E,
+ 0x1C, 0x3E, 0x7C, 0x3E, 0x1C,
+ 0x18, 0x3C, 0x7E, 0x3C, 0x18,
+ 0x1C, 0x57, 0x7D, 0x57, 0x1C,
+ 0x1C, 0x5E, 0x7F, 0x5E, 0x1C,
+ 0x00, 0x18, 0x3C, 0x18, 0x00,
+ 0xFF, 0xE7, 0xC3, 0xE7, 0xFF,
+ 0x00, 0x18, 0x24, 0x18, 0x00,
+ 0xFF, 0xE7, 0xDB, 0xE7, 0xFF,
+ 0x30, 0x48, 0x3A, 0x06, 0x0E,
+ 0x26, 0x29, 0x79, 0x29, 0x26,
+ 0x40, 0x7F, 0x05, 0x05, 0x07,
+ 0x40, 0x7F, 0x05, 0x25, 0x3F,
+ 0x5A, 0x3C, 0xE7, 0x3C, 0x5A,
+ 0x7F, 0x3E, 0x1C, 0x1C, 0x08,
+ 0x08, 0x1C, 0x1C, 0x3E, 0x7F,
+ 0x14, 0x22, 0x7F, 0x22, 0x14,
+ 0x5F, 0x5F, 0x00, 0x5F, 0x5F,
+ 0x06, 0x09, 0x7F, 0x01, 0x7F,
+ 0x00, 0x66, 0x89, 0x95, 0x6A,
+ 0x60, 0x60, 0x60, 0x60, 0x60,
+ 0x94, 0xA2, 0xFF, 0xA2, 0x94,
+ 0x08, 0x04, 0x7E, 0x04, 0x08,
+ 0x10, 0x20, 0x7E, 0x20, 0x10,
+ 0x08, 0x08, 0x2A, 0x1C, 0x08,
+ 0x08, 0x1C, 0x2A, 0x08, 0x08,
+ 0x1E, 0x10, 0x10, 0x10, 0x10,
+ 0x0C, 0x1E, 0x0C, 0x1E, 0x0C,
+ 0x30, 0x38, 0x3E, 0x38, 0x30,
+ 0x06, 0x0E, 0x3E, 0x0E, 0x06,
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x5F, 0x00, 0x00,
+ 0x00, 0x07, 0x00, 0x07, 0x00,
+ 0x14, 0x7F, 0x14, 0x7F, 0x14,
+ 0x24, 0x2A, 0x7F, 0x2A, 0x12,
+ 0x23, 0x13, 0x08, 0x64, 0x62,
+ 0x36, 0x49, 0x56, 0x20, 0x50,
+ 0x00, 0x08, 0x07, 0x03, 0x00,
+ 0x00, 0x1C, 0x22, 0x41, 0x00,
+ 0x00, 0x41, 0x22, 0x1C, 0x00,
+ 0x2A, 0x1C, 0x7F, 0x1C, 0x2A,
+ 0x08, 0x08, 0x3E, 0x08, 0x08,
+ 0x00, 0x80, 0x70, 0x30, 0x00,
+ 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x00, 0x00, 0x60, 0x60, 0x00,
+ 0x20, 0x10, 0x08, 0x04, 0x02,
+ 0x3E, 0x51, 0x49, 0x45, 0x3E,
+ 0x00, 0x42, 0x7F, 0x40, 0x00,
+ 0x72, 0x49, 0x49, 0x49, 0x46,
+ 0x21, 0x41, 0x49, 0x4D, 0x33,
+ 0x18, 0x14, 0x12, 0x7F, 0x10,
+ 0x27, 0x45, 0x45, 0x45, 0x39,
+ 0x3C, 0x4A, 0x49, 0x49, 0x31,
+ 0x41, 0x21, 0x11, 0x09, 0x07,
+ 0x36, 0x49, 0x49, 0x49, 0x36,
+ 0x46, 0x49, 0x49, 0x29, 0x1E,
+ 0x00, 0x00, 0x14, 0x00, 0x00,
+ 0x00, 0x40, 0x34, 0x00, 0x00,
+ 0x00, 0x08, 0x14, 0x22, 0x41,
+ 0x14, 0x14, 0x14, 0x14, 0x14,
+ 0x00, 0x41, 0x22, 0x14, 0x08,
+ 0x02, 0x01, 0x59, 0x09, 0x06,
+ 0x3E, 0x41, 0x5D, 0x59, 0x4E,
+ 0x7C, 0x12, 0x11, 0x12, 0x7C,
+ 0x7F, 0x49, 0x49, 0x49, 0x36,
+ 0x3E, 0x41, 0x41, 0x41, 0x22,
+ 0x7F, 0x41, 0x41, 0x41, 0x3E,
+ 0x7F, 0x49, 0x49, 0x49, 0x41,
+ 0x7F, 0x09, 0x09, 0x09, 0x01,
+ 0x3E, 0x41, 0x41, 0x51, 0x73,
+ 0x7F, 0x08, 0x08, 0x08, 0x7F,
+ 0x00, 0x41, 0x7F, 0x41, 0x00,
+ 0x20, 0x40, 0x41, 0x3F, 0x01,
+ 0x7F, 0x08, 0x14, 0x22, 0x41,
+ 0x7F, 0x40, 0x40, 0x40, 0x40,
+ 0x7F, 0x02, 0x1C, 0x02, 0x7F,
+ 0x7F, 0x04, 0x08, 0x10, 0x7F,
+ 0x3E, 0x41, 0x41, 0x41, 0x3E,
+ 0x7F, 0x09, 0x09, 0x09, 0x06,
+ 0x3E, 0x41, 0x51, 0x21, 0x5E,
+ 0x7F, 0x09, 0x19, 0x29, 0x46,
+ 0x26, 0x49, 0x49, 0x49, 0x32,
+ 0x03, 0x01, 0x7F, 0x01, 0x03,
+ 0x3F, 0x40, 0x40, 0x40, 0x3F,
+ 0x1F, 0x20, 0x40, 0x20, 0x1F,
+ 0x3F, 0x40, 0x38, 0x40, 0x3F,
+ 0x63, 0x14, 0x08, 0x14, 0x63,
+ 0x03, 0x04, 0x78, 0x04, 0x03,
+ 0x61, 0x59, 0x49, 0x4D, 0x43,
+ 0x00, 0x7F, 0x41, 0x41, 0x41,
+ 0x02, 0x04, 0x08, 0x10, 0x20,
+ 0x00, 0x41, 0x41, 0x41, 0x7F,
+ 0x04, 0x02, 0x01, 0x02, 0x04,
+ 0x40, 0x40, 0x40, 0x40, 0x40,
+ 0x00, 0x03, 0x07, 0x08, 0x00,
+ 0x20, 0x54, 0x54, 0x78, 0x40,
+ 0x7F, 0x28, 0x44, 0x44, 0x38,
+ 0x38, 0x44, 0x44, 0x44, 0x28,
+ 0x38, 0x44, 0x44, 0x28, 0x7F,
+ 0x38, 0x54, 0x54, 0x54, 0x18,
+ 0x00, 0x08, 0x7E, 0x09, 0x02,
+ 0x18, 0xA4, 0xA4, 0x9C, 0x78,
+ 0x7F, 0x08, 0x04, 0x04, 0x78,
+ 0x00, 0x44, 0x7D, 0x40, 0x00,
+ 0x20, 0x40, 0x40, 0x3D, 0x00,
+ 0x7F, 0x10, 0x28, 0x44, 0x00,
+ 0x00, 0x41, 0x7F, 0x40, 0x00,
+ 0x7C, 0x04, 0x78, 0x04, 0x78,
+ 0x7C, 0x08, 0x04, 0x04, 0x78,
+ 0x38, 0x44, 0x44, 0x44, 0x38,
+ 0xFC, 0x18, 0x24, 0x24, 0x18,
+ 0x18, 0x24, 0x24, 0x18, 0xFC,
+ 0x7C, 0x08, 0x04, 0x04, 0x08,
+ 0x48, 0x54, 0x54, 0x54, 0x24,
+ 0x04, 0x04, 0x3F, 0x44, 0x24,
+ 0x3C, 0x40, 0x40, 0x20, 0x7C,
+ 0x1C, 0x20, 0x40, 0x20, 0x1C,
+ 0x3C, 0x40, 0x30, 0x40, 0x3C,
+ 0x44, 0x28, 0x10, 0x28, 0x44,
+ 0x4C, 0x90, 0x90, 0x90, 0x7C,
+ 0x44, 0x64, 0x54, 0x4C, 0x44,
+ 0x00, 0x08, 0x36, 0x41, 0x00,
+ 0x00, 0x00, 0x77, 0x00, 0x00,
+ 0x00, 0x41, 0x36, 0x08, 0x00,
+ 0x02, 0x01, 0x02, 0x04, 0x02,
+ 0x3C, 0x26, 0x23, 0x26, 0x3C,
+ 0x1E, 0xA1, 0xA1, 0x61, 0x12,
+ 0x3A, 0x40, 0x40, 0x20, 0x7A,
+ 0x38, 0x54, 0x54, 0x55, 0x59,
+ 0x21, 0x55, 0x55, 0x79, 0x41,
+ 0x22, 0x54, 0x54, 0x78, 0x42, // a-umlaut
+ 0x21, 0x55, 0x54, 0x78, 0x40,
+ 0x20, 0x54, 0x55, 0x79, 0x40,
+ 0x0C, 0x1E, 0x52, 0x72, 0x12,
+ 0x39, 0x55, 0x55, 0x55, 0x59,
+ 0x39, 0x54, 0x54, 0x54, 0x59,
+ 0x39, 0x55, 0x54, 0x54, 0x58,
+ 0x00, 0x00, 0x45, 0x7C, 0x41,
+ 0x00, 0x02, 0x45, 0x7D, 0x42,
+ 0x00, 0x01, 0x45, 0x7C, 0x40,
+ 0x7D, 0x12, 0x11, 0x12, 0x7D, // A-umlaut
+ 0xF0, 0x28, 0x25, 0x28, 0xF0,
+ 0x7C, 0x54, 0x55, 0x45, 0x00,
+ 0x20, 0x54, 0x54, 0x7C, 0x54,
+ 0x7C, 0x0A, 0x09, 0x7F, 0x49,
+ 0x32, 0x49, 0x49, 0x49, 0x32,
+ 0x3A, 0x44, 0x44, 0x44, 0x3A, // o-umlaut
+ 0x32, 0x4A, 0x48, 0x48, 0x30,
+ 0x3A, 0x41, 0x41, 0x21, 0x7A,
+ 0x3A, 0x42, 0x40, 0x20, 0x78,
+ 0x00, 0x9D, 0xA0, 0xA0, 0x7D,
+ 0x3D, 0x42, 0x42, 0x42, 0x3D, // O-umlaut
+ 0x3D, 0x40, 0x40, 0x40, 0x3D,
+ 0x3C, 0x24, 0xFF, 0x24, 0x24,
+ 0x48, 0x7E, 0x49, 0x43, 0x66,
+ 0x2B, 0x2F, 0xFC, 0x2F, 0x2B,
+ 0xFF, 0x09, 0x29, 0xF6, 0x20,
+ 0xC0, 0x88, 0x7E, 0x09, 0x03,
+ 0x20, 0x54, 0x54, 0x79, 0x41,
+ 0x00, 0x00, 0x44, 0x7D, 0x41,
+ 0x30, 0x48, 0x48, 0x4A, 0x32,
+ 0x38, 0x40, 0x40, 0x22, 0x7A,
+ 0x00, 0x7A, 0x0A, 0x0A, 0x72,
+ 0x7D, 0x0D, 0x19, 0x31, 0x7D,
+ 0x26, 0x29, 0x29, 0x2F, 0x28,
+ 0x26, 0x29, 0x29, 0x29, 0x26,
+ 0x30, 0x48, 0x4D, 0x40, 0x20,
+ 0x38, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x38,
+ 0x2F, 0x10, 0xC8, 0xAC, 0xBA,
+ 0x2F, 0x10, 0x28, 0x34, 0xFA,
+ 0x00, 0x00, 0x7B, 0x00, 0x00,
+ 0x08, 0x14, 0x2A, 0x14, 0x22,
+ 0x22, 0x14, 0x2A, 0x14, 0x08,
+ 0x55, 0x00, 0x55, 0x00, 0x55, // #176 (25% block) missing in old code
+ 0xAA, 0x55, 0xAA, 0x55, 0xAA, // 50% block
+ 0xFF, 0x55, 0xFF, 0x55, 0xFF, // 75% block
+ 0x00, 0x00, 0x00, 0xFF, 0x00,
+ 0x10, 0x10, 0x10, 0xFF, 0x00,
+ 0x14, 0x14, 0x14, 0xFF, 0x00,
+ 0x10, 0x10, 0xFF, 0x00, 0xFF,
+ 0x10, 0x10, 0xF0, 0x10, 0xF0,
+ 0x14, 0x14, 0x14, 0xFC, 0x00,
+ 0x14, 0x14, 0xF7, 0x00, 0xFF,
+ 0x00, 0x00, 0xFF, 0x00, 0xFF,
+ 0x14, 0x14, 0xF4, 0x04, 0xFC,
+ 0x14, 0x14, 0x17, 0x10, 0x1F,
+ 0x10, 0x10, 0x1F, 0x10, 0x1F,
+ 0x14, 0x14, 0x14, 0x1F, 0x00,
+ 0x10, 0x10, 0x10, 0xF0, 0x00,
+ 0x00, 0x00, 0x00, 0x1F, 0x10,
+ 0x10, 0x10, 0x10, 0x1F, 0x10,
+ 0x10, 0x10, 0x10, 0xF0, 0x10,
+ 0x00, 0x00, 0x00, 0xFF, 0x10,
+ 0x10, 0x10, 0x10, 0x10, 0x10,
+ 0x10, 0x10, 0x10, 0xFF, 0x10,
+ 0x00, 0x00, 0x00, 0xFF, 0x14,
+ 0x00, 0x00, 0xFF, 0x00, 0xFF,
+ 0x00, 0x00, 0x1F, 0x10, 0x17,
+ 0x00, 0x00, 0xFC, 0x04, 0xF4,
+ 0x14, 0x14, 0x17, 0x10, 0x17,
+ 0x14, 0x14, 0xF4, 0x04, 0xF4,
+ 0x00, 0x00, 0xFF, 0x00, 0xF7,
+ 0x14, 0x14, 0x14, 0x14, 0x14,
+ 0x14, 0x14, 0xF7, 0x00, 0xF7,
+ 0x14, 0x14, 0x14, 0x17, 0x14,
+ 0x10, 0x10, 0x1F, 0x10, 0x1F,
+ 0x14, 0x14, 0x14, 0xF4, 0x14,
+ 0x10, 0x10, 0xF0, 0x10, 0xF0,
+ 0x00, 0x00, 0x1F, 0x10, 0x1F,
+ 0x00, 0x00, 0x00, 0x1F, 0x14,
+ 0x00, 0x00, 0x00, 0xFC, 0x14,
+ 0x00, 0x00, 0xF0, 0x10, 0xF0,
+ 0x10, 0x10, 0xFF, 0x10, 0xFF,
+ 0x14, 0x14, 0x14, 0xFF, 0x14,
+ 0x10, 0x10, 0x10, 0x1F, 0x00,
+ 0x00, 0x00, 0x00, 0xF0, 0x10,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xFF, 0xFF,
+ 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
+ 0x38, 0x44, 0x44, 0x38, 0x44,
+ 0xFC, 0x4A, 0x4A, 0x4A, 0x34, // sharp-s or beta
+ 0x7E, 0x02, 0x02, 0x06, 0x06,
+ 0x02, 0x7E, 0x02, 0x7E, 0x02,
+ 0x63, 0x55, 0x49, 0x41, 0x63,
+ 0x38, 0x44, 0x44, 0x3C, 0x04,
+ 0x40, 0x7E, 0x20, 0x1E, 0x20,
+ 0x06, 0x02, 0x7E, 0x02, 0x02,
+ 0x99, 0xA5, 0xE7, 0xA5, 0x99,
+ 0x1C, 0x2A, 0x49, 0x2A, 0x1C,
+ 0x4C, 0x72, 0x01, 0x72, 0x4C,
+ 0x30, 0x4A, 0x4D, 0x4D, 0x30,
+ 0x30, 0x48, 0x78, 0x48, 0x30,
+ 0xBC, 0x62, 0x5A, 0x46, 0x3D,
+ 0x3E, 0x49, 0x49, 0x49, 0x00,
+ 0x7E, 0x01, 0x01, 0x01, 0x7E,
+ 0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
+ 0x44, 0x44, 0x5F, 0x44, 0x44,
+ 0x40, 0x51, 0x4A, 0x44, 0x40,
+ 0x40, 0x44, 0x4A, 0x51, 0x40,
+ 0x00, 0x00, 0xFF, 0x01, 0x03,
+ 0xE0, 0x80, 0xFF, 0x00, 0x00,
+ 0x08, 0x08, 0x6B, 0x6B, 0x08,
+ 0x36, 0x12, 0x36, 0x24, 0x36,
+ 0x06, 0x0F, 0x09, 0x0F, 0x06,
+ 0x00, 0x00, 0x18, 0x18, 0x00,
+ 0x00, 0x00, 0x10, 0x10, 0x00,
+ 0x30, 0x40, 0xFF, 0x01, 0x01,
+ 0x00, 0x1F, 0x01, 0x01, 0x1E,
+ 0x00, 0x19, 0x1D, 0x17, 0x12,
+ 0x00, 0x3C, 0x3C, 0x3C, 0x3C,
+ 0x00, 0x00, 0x00, 0x00, 0x00 // #255 NBSP
+};
+#endif // FONT5X7_H
diff --git a/lib/Adafruit-GFX-Library-1.2.9/library.properties b/lib/Adafruit-GFX-Library-1.2.9/library.properties
new file mode 100644
index 000000000000..eea478015e91
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/library.properties
@@ -0,0 +1,9 @@
+name=Adafruit GFX Library
+version=1.2.9
+author=Adafruit
+maintainer=Adafruit
+sentence=Adafruit GFX graphics core library, this is the 'core' class that all our other graphics libraries derive from.
+paragraph=Install this library in addition to the display library for your hardware.
+category=Display
+url=https://github.com/adafruit/Adafruit-GFX-Library
+architectures=*
diff --git a/lib/Adafruit-GFX-Library-1.2.9/license.txt b/lib/Adafruit-GFX-Library-1.2.9/license.txt
new file mode 100644
index 000000000000..7492e93a1341
--- /dev/null
+++ b/lib/Adafruit-GFX-Library-1.2.9/license.txt
@@ -0,0 +1,24 @@
+Software License Agreement (BSD License)
+
+Copyright (c) 2012 Adafruit Industries. 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.
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.github/ISSUE_TEMPLATE.md b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 000000000000..f0e26146fa93
--- /dev/null
+++ b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,46 @@
+Thank you for opening an issue on an Adafruit Arduino library repository. To
+improve the speed of resolution please review the following guidelines and
+common troubleshooting steps below before creating the issue:
+
+- **Do not use GitHub issues for troubleshooting projects and issues.** Instead use
+ the forums at http://forums.adafruit.com to ask questions and troubleshoot why
+ something isn't working as expected. In many cases the problem is a common issue
+ that you will more quickly receive help from the forum community. GitHub issues
+ are meant for known defects in the code. If you don't know if there is a defect
+ in the code then start with troubleshooting on the forum first.
+
+- **If following a tutorial or guide be sure you didn't miss a step.** Carefully
+ check all of the steps and commands to run have been followed. Consult the
+ forum if you're unsure or have questions about steps in a guide/tutorial.
+
+- **For Arduino projects check these very common issues to ensure they don't apply**:
+
+ - For uploading sketches or communicating with the board make sure you're using
+ a **USB data cable** and **not** a **USB charge-only cable**. It is sometimes
+ very hard to tell the difference between a data and charge cable! Try using the
+ cable with other devices or swapping to another cable to confirm it is not
+ the problem.
+
+ - **Be sure you are supplying adequate power to the board.** Check the specs of
+ your board and plug in an external power supply. In many cases just
+ plugging a board into your computer is not enough to power it and other
+ peripherals.
+
+ - **Double check all soldering joints and connections.** Flakey connections
+ cause many mysterious problems. See the [guide to excellent soldering](https://learn.adafruit.com/adafruit-guide-excellent-soldering/tools) for examples of good solder joints.
+
+ - **Ensure you are using an official Arduino or Adafruit board.** We can't
+ guarantee a clone board will have the same functionality and work as expected
+ with this code and don't support them.
+
+If you're sure this issue is a defect in the code and checked the steps above
+please fill in the following fields to provide enough troubleshooting information.
+You may delete the guideline and text above to just leave the following details:
+
+- Arduino board: **INSERT ARDUINO BOARD NAME/TYPE HERE**
+
+- Arduino IDE version (found in Arduino -> About Arduino menu): **INSERT ARDUINO
+ VERSION HERE**
+
+- List the steps to reproduce the problem below (if possible attach a sketch or
+ copy the sketch code in too): **LIST REPRO STEPS BELOW**
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.github/PULL_REQUEST_TEMPLATE.md b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 000000000000..7b641eb862c0
--- /dev/null
+++ b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,26 @@
+Thank you for creating a pull request to contribute to Adafruit's GitHub code!
+Before you open the request please review the following guidelines and tips to
+help it be more easily integrated:
+
+- **Describe the scope of your change--i.e. what the change does and what parts
+ of the code were modified.** This will help us understand any risks of integrating
+ the code.
+
+- **Describe any known limitations with your change.** For example if the change
+ doesn't apply to a supported platform of the library please mention it.
+
+- **Please run any tests or examples that can exercise your modified code.** We
+ strive to not break users of the code and running tests/examples helps with this
+ process.
+
+Thank you again for contributing! We will try to test and integrate the change
+as soon as we can, but be aware we have many GitHub repositories to manage and
+can't immediately respond to every request. There is no need to bump or check in
+on a pull request (it will clutter the discussion of the request).
+
+Also don't be worried if the request is closed or not integrated--sometimes the
+priorities of Adafruit's GitHub code (education, ease of use) might not match the
+priorities of the pull request. Don't fret, the open source community thrives on
+forks and GitHub makes it easy to keep your changes in a forked repo.
+
+After reviewing the guidelines above you can delete this text from the pull request.
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.gitignore b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.gitignore
new file mode 100644
index 000000000000..c2a26c038308
--- /dev/null
+++ b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.gitignore
@@ -0,0 +1,4 @@
+# Our handy .gitignore for automation ease
+Doxyfile*
+doxygen_sqlite3.db
+html
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.travis.yml b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.travis.yml
new file mode 100644
index 000000000000..3e5672cd687b
--- /dev/null
+++ b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.travis.yml
@@ -0,0 +1,38 @@
+language: c
+sudo: false
+
+cache:
+ directories:
+ - ~/arduino_ide
+ # Caches Arduino IDE + ESP32 platform
+ - ~/.arduino15/packages/
+ # Caches Arduino platforms
+git:
+ depth: false
+ quiet: true
+
+# Blacklist
+branches:
+ except:
+ - gh-pages
+
+env:
+ global:
+ - PRETTYNAME="Adafruit ILI9341 Arduino Library"
+# Optional, will default to "$TRAVIS_BUILD_DIR/Doxyfile"
+# - DOXYFILE: $TRAVIS_BUILD_DIR/Doxyfile
+
+before_install:
+ - source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/install.sh)
+
+install:
+ - arduino --install-library "Adafruit GFX Library","Adafruit STMPE610","Adafruit TouchScreen"
+
+script:
+ - build_main_platforms
+
+# Generate and deploy documentation
+after_success:
+ - source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/library_check.sh)
+ - source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/doxy_gen_and_deploy.sh)
+
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/Adafruit_ILI9341.cpp b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/Adafruit_ILI9341.cpp
new file mode 100644
index 000000000000..442975adaac0
--- /dev/null
+++ b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/Adafruit_ILI9341.cpp
@@ -0,0 +1,282 @@
+/*!
+* @file Adafruit_ILI9341.cpp
+*
+* @mainpage Adafruit ILI9341 TFT Displays
+*
+* @section intro_sec Introduction
+*
+* This is the documentation for Adafruit's ILI9341 driver for the
+* Arduino platform.
+*
+* This library works with the Adafruit 2.8" Touch Shield V2 (SPI)
+* http://www.adafruit.com/products/1651
+*
+* Adafruit 2.4" TFT LCD with Touchscreen Breakout w/MicroSD Socket - ILI9341
+* https://www.adafruit.com/product/2478
+*
+* 2.8" TFT LCD with Touchscreen Breakout Board w/MicroSD Socket - ILI9341
+* https://www.adafruit.com/product/1770
+*
+* 2.2" 18-bit color TFT LCD display with microSD card breakout - ILI9340
+* https://www.adafruit.com/product/1770
+*
+* TFT FeatherWing - 2.4" 320x240 Touchscreen For All Feathers
+* https://www.adafruit.com/product/3315
+*
+* These displays use SPI to communicate, 4 or 5 pins are required
+* to interface (RST is optional).
+*
+* Adafruit invests time and resources providing this open source code,
+* please support Adafruit and open-source hardware by purchasing
+* products from Adafruit!
+*
+* @section dependencies Dependencies
+*
+* This library depends on
+* Adafruit_GFX being present on your system. Please make sure you have
+* installed the latest version before using this library.
+*
+* @section author Author
+*
+* Written by Limor "ladyada" Fried for Adafruit Industries.
+*
+* @section license License
+*
+* BSD license, all text here must be included in any redistribution.
+*
+*/
+
+#include "Adafruit_ILI9341.h"
+#ifndef ARDUINO_STM32_FEATHER
+ #include "pins_arduino.h"
+ #ifndef RASPI
+ #include "wiring_private.h"
+ #endif
+#endif
+#include
+
+#if defined (ARDUINO_ARCH_ARC32) || defined (ARDUINO_MAXIM)
+ #define SPI_DEFAULT_FREQ 16000000
+#elif defined (__AVR__) || defined(TEENSYDUINO)
+ #define SPI_DEFAULT_FREQ 8000000
+#elif defined(ESP8266) || defined(ESP32)
+ #define SPI_DEFAULT_FREQ 40000000
+#elif defined(RASPI)
+ #define SPI_DEFAULT_FREQ 80000000
+#elif defined(ARDUINO_ARCH_STM32F1)
+ #define SPI_DEFAULT_FREQ 36000000
+#else
+ #define SPI_DEFAULT_FREQ 24000000 ///< Default SPI data clock frequency
+#endif
+
+#define MADCTL_MY 0x80 ///< Bottom to top
+#define MADCTL_MX 0x40 ///< Right to left
+#define MADCTL_MV 0x20 ///< Reverse Mode
+#define MADCTL_ML 0x10 ///< LCD refresh Bottom to top
+#define MADCTL_RGB 0x00 ///< Red-Green-Blue pixel order
+#define MADCTL_BGR 0x08 ///< Blue-Green-Red pixel order
+#define MADCTL_MH 0x04 ///< LCD refresh right to left
+
+/**************************************************************************/
+/*!
+ @brief Instantiate Adafruit ILI9341 driver with software SPI
+ @param cs Chip select pin #
+ @param dc Data/Command pin #
+ @param mosi SPI MOSI pin #
+ @param sclk SPI Clock pin #
+ @param rst Reset pin # (optional, pass -1 if unused)
+ @param miso SPI MISO pin # (optional, pass -1 if unused)
+*/
+/**************************************************************************/
+Adafruit_ILI9341::Adafruit_ILI9341(int8_t cs, int8_t dc, int8_t mosi,
+ int8_t sclk, int8_t rst, int8_t miso) : Adafruit_SPITFT(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT, cs, dc, mosi, sclk, rst, miso) {
+}
+
+/**************************************************************************/
+/*!
+ @brief Instantiate Adafruit ILI9341 driver with hardware SPI
+ @param cs Chip select pin #
+ @param dc Data/Command pin #
+ @param rst Reset pin # (optional, pass -1 if unused)
+*/
+/**************************************************************************/
+Adafruit_ILI9341::Adafruit_ILI9341(int8_t cs, int8_t dc, int8_t rst) : Adafruit_SPITFT(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT, cs, dc, rst) {
+}
+
+static const uint8_t PROGMEM initcmd[] = {
+ 0xEF, 3, 0x03, 0x80, 0x02,
+ 0xCF, 3, 0x00, 0xC1, 0x30,
+ 0xED, 4, 0x64, 0x03, 0x12, 0x81,
+ 0xE8, 3, 0x85, 0x00, 0x78,
+ 0xCB, 5, 0x39, 0x2C, 0x00, 0x34, 0x02,
+ 0xF7, 1, 0x20,
+ 0xEA, 2, 0x00, 0x00,
+ ILI9341_PWCTR1 , 1, 0x23, // Power control VRH[5:0]
+ ILI9341_PWCTR2 , 1, 0x10, // Power control SAP[2:0];BT[3:0]
+ ILI9341_VMCTR1 , 2, 0x3e, 0x28, // VCM control
+ ILI9341_VMCTR2 , 1, 0x86, // VCM control2
+ ILI9341_MADCTL , 1, 0x48, // Memory Access Control
+ ILI9341_VSCRSADD, 1, 0x00, // Vertical scroll zero
+ ILI9341_PIXFMT , 1, 0x55,
+ ILI9341_FRMCTR1 , 2, 0x00, 0x18,
+ ILI9341_DFUNCTR , 3, 0x08, 0x82, 0x27, // Display Function Control
+ 0xF2, 1, 0x00, // 3Gamma Function Disable
+ ILI9341_GAMMASET , 1, 0x01, // Gamma curve selected
+ ILI9341_GMCTRP1 , 15, 0x0F, 0x31, 0x2B, 0x0C, 0x0E, 0x08, // Set Gamma
+ 0x4E, 0xF1, 0x37, 0x07, 0x10, 0x03, 0x0E, 0x09, 0x00,
+ ILI9341_GMCTRN1 , 15, 0x00, 0x0E, 0x14, 0x03, 0x11, 0x07, // Set Gamma
+ 0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, 0x36, 0x0F,
+ ILI9341_SLPOUT , 0x80, // Exit Sleep
+ ILI9341_DISPON , 0x80, // Display on
+ 0x00 // End of list
+};
+
+/**************************************************************************/
+/*!
+ @brief Initialize ILI9341 chip
+ Connects to the ILI9341 over SPI and sends initialization procedure commands
+ @param freq Desired SPI clock frequency
+*/
+/**************************************************************************/
+void Adafruit_ILI9341::begin(uint32_t freq) {
+ if(!freq) freq = SPI_DEFAULT_FREQ;
+ _freq = freq;
+
+ initSPI(freq);
+
+ startWrite();
+
+ uint8_t cmd, x, numArgs;
+ const uint8_t *addr = initcmd;
+ while((cmd = pgm_read_byte(addr++)) > 0) {
+ writeCommand(cmd);
+ x = pgm_read_byte(addr++);
+ numArgs = x & 0x7F;
+ while(numArgs--) spiWrite(pgm_read_byte(addr++));
+ if(x & 0x80) delay(120);
+ }
+
+ endWrite();
+
+ _width = ILI9341_TFTWIDTH;
+ _height = ILI9341_TFTHEIGHT;
+}
+
+
+/**************************************************************************/
+/*!
+ @brief Set origin of (0,0) and orientation of TFT display
+ @param m The index for rotation, from 0-3 inclusive
+*/
+/**************************************************************************/
+void Adafruit_ILI9341::setRotation(uint8_t m) {
+ rotation = m % 4; // can't be higher than 3
+ switch (rotation) {
+ case 0:
+ m = (MADCTL_MX | MADCTL_BGR);
+ _width = ILI9341_TFTWIDTH;
+ _height = ILI9341_TFTHEIGHT;
+ break;
+ case 1:
+ m = (MADCTL_MV | MADCTL_BGR);
+ _width = ILI9341_TFTHEIGHT;
+ _height = ILI9341_TFTWIDTH;
+ break;
+ case 2:
+ m = (MADCTL_MY | MADCTL_BGR);
+ _width = ILI9341_TFTWIDTH;
+ _height = ILI9341_TFTHEIGHT;
+ break;
+ case 3:
+ m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR);
+ _width = ILI9341_TFTHEIGHT;
+ _height = ILI9341_TFTWIDTH;
+ break;
+ }
+
+ startWrite();
+ writeCommand(ILI9341_MADCTL);
+ spiWrite(m);
+ endWrite();
+}
+
+/**************************************************************************/
+/*!
+ @brief Enable/Disable display color inversion
+ @param invert True to invert, False to have normal color
+*/
+/**************************************************************************/
+void Adafruit_ILI9341::invertDisplay(boolean invert) {
+ startWrite();
+ writeCommand(invert ? ILI9341_INVON : ILI9341_INVOFF);
+ endWrite();
+}
+
+/**************************************************************************/
+/*!
+ @brief Scroll display memory
+ @param y How many pixels to scroll display by
+*/
+/**************************************************************************/
+void Adafruit_ILI9341::scrollTo(uint16_t y) {
+ startWrite();
+ writeCommand(ILI9341_VSCRSADD);
+ SPI_WRITE16(y);
+ endWrite();
+}
+
+/**************************************************************************/
+
+void Adafruit_ILI9341::setScrollMargins(uint16_t top, uint16_t bottom)
+{
+ uint16_t height = _height - (top + bottom);
+
+ startWrite();
+ writeCommand(0x33);
+ SPI_WRITE16(top);
+ SPI_WRITE16(height);
+ SPI_WRITE16(bottom);
+ endWrite();
+}
+
+/**************************************************************************/
+/*!
+ @brief Set the "address window" - the rectangle we will write to RAM with the next chunk of SPI data writes. The ILI9341 will automatically wrap the data as each row is filled
+ @param x TFT memory 'x' origin
+ @param y TFT memory 'y' origin
+ @param w Width of rectangle
+ @param h Height of rectangle
+*/
+/**************************************************************************/
+void Adafruit_ILI9341::setAddrWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h) {
+ uint32_t xa = ((uint32_t)x << 16) | (x+w-1);
+ uint32_t ya = ((uint32_t)y << 16) | (y+h-1);
+ writeCommand(ILI9341_CASET); // Column addr set
+ SPI_WRITE32(xa);
+ writeCommand(ILI9341_PASET); // Row addr set
+ SPI_WRITE32(ya);
+ writeCommand(ILI9341_RAMWR); // write to RAM
+}
+
+/**************************************************************************/
+/*!
+ @brief Read 8 bits of data from ILI9341 configuration memory. NOT from RAM!
+ This is highly undocumented/supported, it's really a hack but kinda works?
+ @param command The command register to read data from
+ @param index The byte index into the command to read from
+ @return Unsigned 8-bit data read from ILI9341 register
+*/
+/**************************************************************************/
+uint8_t Adafruit_ILI9341::readcommand8(uint8_t command, uint8_t index) {
+ uint32_t freq = _freq;
+ if(_freq > 24000000) _freq = 24000000;
+ startWrite();
+ writeCommand(0xD9); // woo sekret command?
+ spiWrite(0x10 + index);
+ writeCommand(command);
+ uint8_t r = spiRead();
+ endWrite();
+ _freq = freq;
+ return r;
+}
+
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/Adafruit_ILI9341.h b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/Adafruit_ILI9341.h
new file mode 100644
index 000000000000..368e1cc0fc15
--- /dev/null
+++ b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/Adafruit_ILI9341.h
@@ -0,0 +1,144 @@
+/*!
+* @file Adafruit_ILI9341.h
+*
+* This is the documentation for Adafruit's ILI9341 driver for the
+* Arduino platform.
+*
+* This library works with the Adafruit 2.8" Touch Shield V2 (SPI)
+* http://www.adafruit.com/products/1651
+* Adafruit 2.4" TFT LCD with Touchscreen Breakout w/MicroSD Socket - ILI9341
+* https://www.adafruit.com/product/2478
+* 2.8" TFT LCD with Touchscreen Breakout Board w/MicroSD Socket - ILI9341
+* https://www.adafruit.com/product/1770
+* 2.2" 18-bit color TFT LCD display with microSD card breakout - ILI9340
+* https://www.adafruit.com/product/1770
+* TFT FeatherWing - 2.4" 320x240 Touchscreen For All Feathers
+* https://www.adafruit.com/product/3315
+*
+* These displays use SPI to communicate, 4 or 5 pins are required
+* to interface (RST is optional).
+*
+* Adafruit invests time and resources providing this open source code,
+* please support Adafruit and open-source hardware by purchasing
+* products from Adafruit!
+*
+*
+* This library depends on
+* Adafruit_GFX being present on your system. Please make sure you have
+* installed the latest version before using this library.
+*
+* Written by Limor "ladyada" Fried for Adafruit Industries.
+*
+* BSD license, all text here must be included in any redistribution.
+*
+*/
+
+#ifndef _ADAFRUIT_ILI9341H_
+#define _ADAFRUIT_ILI9341H_
+
+#include "Arduino.h"
+#include "Print.h"
+#include
+#include "Adafruit_GFX.h"
+#include
+#include
+
+#define ILI9341_TFTWIDTH 240 ///< ILI9341 max TFT width
+#define ILI9341_TFTHEIGHT 320 ///< ILI9341 max TFT height
+
+#define ILI9341_NOP 0x00 ///< No-op register
+#define ILI9341_SWRESET 0x01 ///< Software reset register
+#define ILI9341_RDDID 0x04 ///< Read display identification information
+#define ILI9341_RDDST 0x09 ///< Read Display Status
+
+#define ILI9341_SLPIN 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_RDMODE 0x0A ///< Read Display Power Mode
+#define ILI9341_RDMADCTL 0x0B ///< Read Display MADCTL
+#define ILI9341_RDPIXFMT 0x0C ///< Read Display Pixel Format
+#define ILI9341_RDIMGFMT 0x0D ///< Read Display Image Format
+#define ILI9341_RDSELFDIAG 0x0F ///< Read Display Self-Diagnostic Result
+
+#define ILI9341_INVOFF 0x20 ///< Display Inversion OFF
+#define ILI9341_INVON 0x21 ///< Display Inversion ON
+#define ILI9341_GAMMASET 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_RAMRD 0x2E ///< Memory Read
+
+#define ILI9341_PTLAR 0x30 ///< Partial Area
+#define ILI9341_MADCTL 0x36 ///< Memory Access Control
+#define ILI9341_VSCRSADD 0x37 ///< Vertical Scrolling Start Address
+#define ILI9341_PIXFMT 0x3A ///< COLMOD: Pixel Format Set
+
+#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_INVCTR 0xB4 ///< Display Inversion Control
+#define ILI9341_DFUNCTR 0xB6 ///< Display Function Control
+
+#define ILI9341_PWCTR1 0xC0 ///< Power Control 1
+#define ILI9341_PWCTR2 0xC1 ///< Power Control 2
+#define ILI9341_PWCTR3 0xC2 ///< Power Control 3
+#define ILI9341_PWCTR4 0xC3 ///< Power Control 4
+#define ILI9341_PWCTR5 0xC4 ///< Power Control 5
+#define ILI9341_VMCTR1 0xC5 ///< VCOM Control 1
+#define ILI9341_VMCTR2 0xC7 ///< VCOM Control 2
+
+#define ILI9341_RDID1 0xDA ///< Read ID 1
+#define ILI9341_RDID2 0xDB ///< Read ID 2
+#define ILI9341_RDID3 0xDC ///< Read ID 3
+#define ILI9341_RDID4 0xDD ///< Read ID 4
+
+#define ILI9341_GMCTRP1 0xE0 ///< Positive Gamma Correction
+#define ILI9341_GMCTRN1 0xE1 ///< Negative Gamma Correction
+//#define ILI9341_PWCTR6 0xFC
+
+// Color definitions
+#define ILI9341_BLACK 0x0000 ///< 0, 0, 0
+#define ILI9341_NAVY 0x000F ///< 0, 0, 123
+#define ILI9341_DARKGREEN 0x03E0 ///< 0, 125, 0
+#define ILI9341_DARKCYAN 0x03EF ///< 0, 125, 123
+#define ILI9341_MAROON 0x7800 ///< 123, 0, 0
+#define ILI9341_PURPLE 0x780F ///< 123, 0, 123
+#define ILI9341_OLIVE 0x7BE0 ///< 123, 125, 0
+#define ILI9341_LIGHTGREY 0xC618 ///< 198, 195, 198
+#define ILI9341_DARKGREY 0x7BEF ///< 123, 125, 123
+#define ILI9341_BLUE 0x001F ///< 0, 0, 255
+#define ILI9341_GREEN 0x07E0 ///< 0, 255, 0
+#define ILI9341_CYAN 0x07FF ///< 0, 255, 255
+#define ILI9341_RED 0xF800 ///< 255, 0, 0
+#define ILI9341_MAGENTA 0xF81F ///< 255, 0, 255
+#define ILI9341_YELLOW 0xFFE0 ///< 255, 255, 0
+#define ILI9341_WHITE 0xFFFF ///< 255, 255, 255
+#define ILI9341_ORANGE 0xFD20 ///< 255, 165, 0
+#define ILI9341_GREENYELLOW 0xAFE5 ///< 173, 255, 41
+#define ILI9341_PINK 0xFC18 ///< 255, 130, 198
+
+///< Class to manage hardware interface with ILI9341 chipset (also seems to work with ILI9340)
+class Adafruit_ILI9341 : public Adafruit_SPITFT {
+ public:
+ Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _MOSI, int8_t _SCLK, int8_t _RST = -1, int8_t _MISO = -1);
+ Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _RST = -1);
+
+ void begin(uint32_t freq=0);
+ void setRotation(uint8_t r);
+ void invertDisplay(boolean i);
+ void scrollTo(uint16_t y);
+
+ void setScrollMargins(uint16_t top, uint16_t bottom);
+
+ // Transaction API not used by GFX
+ void setAddrWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h);
+
+ uint8_t readcommand8(uint8_t reg, uint8_t index=0);
+};
+
+#endif // _ADAFRUIT_ILI9341H_
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/README.md b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/README.md
new file mode 100644
index 000000000000..b08f630863a4
--- /dev/null
+++ b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/README.md
@@ -0,0 +1,35 @@
+# Adafruit ILI9341 Arduino Library [![Build Status](https://travis-ci.org/adafruit/Adafruit_ILI9341.svg?branch=master)](https://travis-ci.org/adafruit/Adafruit_ILI9341)
+
+This is a library for the Adafruit ILI9341 display products
+
+This library works with the Adafruit 2.8" Touch Shield V2 (SPI)
+ * http://www.adafruit.com/products/1651
+
+Adafruit 2.4" TFT LCD with Touchscreen Breakout w/MicroSD Socket - ILI9341
+ * https://www.adafruit.com/product/2478
+
+2.8" TFT LCD with Touchscreen Breakout Board w/MicroSD Socket - ILI9341
+ * https://www.adafruit.com/product/1770
+
+2.2" 18-bit color TFT LCD display with microSD card breakout - ILI9340
+ * https://www.adafruit.com/product/1480
+
+TFT FeatherWing - 2.4" 320x240 Touchscreen For All Feathers
+ * https://www.adafruit.com/product/3315
+
+Check out the links above for our tutorials and wiring diagrams.
+These displays use SPI to communicate, 4 or 5 pins are required
+to interface (RST is optional).
+
+Adafruit invests time and resources providing this open source code,
+please support Adafruit and open-source hardware by purchasing
+products from Adafruit!
+
+Written by Limor Fried/Ladyada for Adafruit Industries.
+MIT license, all text above must be included in any redistribution
+
+To download. click the DOWNLOADS button in the top right corner, rename the uncompressed folder Adafruit_ILI9341. Check that the Adafruit_ILI9341 folder contains Adafruit_ILI9341.cpp and Adafruit_ILI9341.
+
+Place the Adafruit_ILI9341 library folder your arduinosketchfolder/libraries/ folder. You may need to create the libraries subfolder if its your first library. Restart the IDE
+
+Also requires the Adafruit_GFX library for Arduino.
diff --git a/lib/PubSubClient-2.6.09/tests/testcases/__init__.py b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/breakouttouchpaint/.esp8266.test.skip
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/testcases/__init__.py
rename to lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/breakouttouchpaint/.esp8266.test.skip
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/breakouttouchpaint/breakouttouchpaint.ino b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/breakouttouchpaint/breakouttouchpaint.ino
new file mode 100644
index 000000000000..298bcad6b362
--- /dev/null
+++ b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/breakouttouchpaint/breakouttouchpaint.ino
@@ -0,0 +1,145 @@
+/***************************************************
+ This is our touchscreen painting example for the Adafruit ILI9341 Breakout
+ ----> http://www.adafruit.com/products/1770
+
+ Check out the links above for our tutorials and wiring diagrams
+ These displays use SPI to communicate, 4 or 5 pins are required to
+ interface (RST is optional)
+ Adafruit invests time and resources providing this open source code,
+ please support Adafruit and open-source hardware by purchasing
+ products from Adafruit!
+
+ Written by Limor Fried/Ladyada for Adafruit Industries.
+ MIT license, all text above must be included in any redistribution
+ ****************************************************/
+
+/** NOT FOR USE WITH THE TOUCH SHIELD, ONLY FOR THE BREAKOUT! **/
+
+#include // Core graphics library
+#include
+#include
+#include "TouchScreen.h"
+
+// These are the four touchscreen analog pins
+#define YP A2 // must be an analog pin, use "An" notation!
+#define XM A3 // must be an analog pin, use "An" notation!
+#define YM 5 // can be a digital pin
+#define XP 4 // can be a digital pin
+
+// This is calibration data for the raw touch data to the screen coordinates
+#define TS_MINX 150
+#define TS_MINY 120
+#define TS_MAXX 920
+#define TS_MAXY 940
+
+#define MINPRESSURE 10
+#define MAXPRESSURE 1000
+
+// The display uses hardware SPI, plus #9 & #10
+#define TFT_CS 10
+#define TFT_DC 9
+Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
+
+// For better pressure precision, we need to know the resistance
+// between X+ and X- Use any multimeter to read it
+// For the one we're using, its 300 ohms across the X plate
+TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
+
+// Size of the color selection boxes and the paintbrush size
+#define BOXSIZE 40
+#define PENRADIUS 3
+int oldcolor, currentcolor;
+
+void setup(void) {
+ // while (!Serial); // used for leonardo debugging
+
+ Serial.begin(9600);
+ Serial.println(F("Touch Paint!"));
+
+ tft.begin();
+ tft.fillScreen(ILI9341_BLACK);
+
+ // make the color selection boxes
+ tft.fillRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_RED);
+ tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_YELLOW);
+ tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_GREEN);
+ tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_CYAN);
+ tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_BLUE);
+ tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_MAGENTA);
+
+ // select the current color 'red'
+ tft.drawRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ currentcolor = ILI9341_RED;
+}
+
+
+void loop()
+{
+ // Retrieve a point
+ TSPoint p = ts.getPoint();
+
+ /*
+ Serial.print("X = "); Serial.print(p.x);
+ Serial.print("\tY = "); Serial.print(p.y);
+ Serial.print("\tPressure = "); Serial.println(p.z);
+ */
+
+ // we have some minimum pressure we consider 'valid'
+ // pressure of 0 means no pressing!
+ if (p.z < MINPRESSURE || p.z > MAXPRESSURE) {
+ return;
+ }
+
+ // Scale from ~0->1000 to tft.width using the calibration #'s
+ p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width());
+ p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());
+
+ /*
+ Serial.print("("); Serial.print(p.x);
+ Serial.print(", "); Serial.print(p.y);
+ Serial.println(")");
+ */
+
+
+ if (p.y < BOXSIZE) {
+ oldcolor = currentcolor;
+
+ if (p.x < BOXSIZE) {
+ currentcolor = ILI9341_RED;
+ tft.drawRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ } else if (p.x < BOXSIZE*2) {
+ currentcolor = ILI9341_YELLOW;
+ tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ } else if (p.x < BOXSIZE*3) {
+ currentcolor = ILI9341_GREEN;
+ tft.drawRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ } else if (p.x < BOXSIZE*4) {
+ currentcolor = ILI9341_CYAN;
+ tft.drawRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ } else if (p.x < BOXSIZE*5) {
+ currentcolor = ILI9341_BLUE;
+ tft.drawRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ } else if (p.x < BOXSIZE*6) {
+ currentcolor = ILI9341_MAGENTA;
+ tft.drawRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ }
+
+ if (oldcolor != currentcolor) {
+ if (oldcolor == ILI9341_RED)
+ tft.fillRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_RED);
+ if (oldcolor == ILI9341_YELLOW)
+ tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_YELLOW);
+ if (oldcolor == ILI9341_GREEN)
+ tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_GREEN);
+ if (oldcolor == ILI9341_CYAN)
+ tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_CYAN);
+ if (oldcolor == ILI9341_BLUE)
+ tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_BLUE);
+ if (oldcolor == ILI9341_MAGENTA)
+ tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_MAGENTA);
+ }
+ }
+ if (((p.y-PENRADIUS) > BOXSIZE) && ((p.y+PENRADIUS) < tft.height())) {
+ tft.fillCircle(p.x, p.y, PENRADIUS, currentcolor);
+ }
+}
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/fulltest_featherwing/.mega2560.test.skip b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/fulltest_featherwing/.mega2560.test.skip
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/fulltest_featherwing/fulltest_featherwing.ino b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/fulltest_featherwing/fulltest_featherwing.ino
new file mode 100644
index 000000000000..25f32f2e6fe5
--- /dev/null
+++ b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/fulltest_featherwing/fulltest_featherwing.ino
@@ -0,0 +1,265 @@
+/***************************************************
+ This is our touchscreen painting example for the Adafruit TFT FeatherWing
+ ----> http://www.adafruit.com/products/3315
+
+ Check out the links above for our tutorials and wiring diagrams
+
+ Adafruit invests time and resources providing this open source code,
+ please support Adafruit and open-source hardware by purchasing
+ products from Adafruit!
+
+ Written by Limor Fried/Ladyada for Adafruit Industries.
+ MIT license, all text above must be included in any redistribution
+ ****************************************************/
+
+#include
+#include // this is needed even tho we aren't using it
+
+#include // Core graphics library
+#include // Hardware-specific library
+#include
+#include
+
+#ifdef ESP8266
+ #define STMPE_CS 16
+ #define TFT_CS 0
+ #define TFT_DC 15
+ #define SD_CS 2
+#endif
+#ifdef ESP32
+ #define STMPE_CS 32
+ #define TFT_CS 15
+ #define TFT_DC 33
+ #define SD_CS 14
+#endif
+#ifdef TEENSYDUINO
+ #define TFT_DC 10
+ #define TFT_CS 4
+ #define STMPE_CS 3
+ #define SD_CS 8
+#endif
+#ifdef ARDUINO_STM32_FEATHER
+ #define TFT_DC PB4
+ #define TFT_CS PA15
+ #define STMPE_CS PC7
+ #define SD_CS PC5
+#endif
+#ifdef ARDUINO_NRF52_FEATHER /* BSP 0.6.5 and higher! */
+ #define TFT_DC 11
+ #define TFT_CS 31
+ #define STMPE_CS 30
+ #define SD_CS 27
+#endif
+#if defined(ARDUINO_MAX32620FTHR) || defined(ARDUINO_MAX32630FTHR)
+ #define TFT_DC P5_4
+ #define TFT_CS P5_3
+ #define STMPE_CS P3_3
+ #define SD_CS P3_2
+#endif
+
+// Anything else!
+#if defined (__AVR_ATmega32U4__) || defined(ARDUINO_SAMD_FEATHER_M0) || defined (__AVR_ATmega328P__) || defined(ARDUINO_SAMD_ZERO) || defined(__SAMD51__) || defined(__SAM3X8E__)
+ #define STMPE_CS 6
+ #define TFT_CS 9
+ #define TFT_DC 10
+ #define SD_CS 5
+#endif
+
+Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
+Adafruit_STMPE610 ts = Adafruit_STMPE610(STMPE_CS);
+
+
+// This is calibration data for the raw touch data to the screen coordinates
+#define TS_MINX 3800
+#define TS_MAXX 100
+#define TS_MINY 100
+#define TS_MAXY 3750
+
+#define PENRADIUS 3
+
+void setup(void) {
+ Serial.begin(115200);
+
+ delay(10);
+ Serial.println("FeatherWing TFT");
+ if (!ts.begin()) {
+ Serial.println("Couldn't start touchscreen controller");
+ while (1);
+ }
+ Serial.println("Touchscreen started");
+
+ tft.begin();
+ tft.fillScreen(ILI9341_BLUE);
+
+ yield();
+
+ Serial.print("Initializing SD card...");
+ if (!SD.begin(SD_CS)) {
+ Serial.println("failed!");
+ }
+ Serial.println("OK!");
+
+ bmpDraw("purple.bmp", 0, 0);
+}
+
+void loop() {
+ // Retrieve a point
+ TS_Point p = ts.getPoint();
+
+ Serial.print("X = "); Serial.print(p.x);
+ Serial.print("\tY = "); Serial.print(p.y);
+ Serial.print("\tPressure = "); Serial.println(p.z);
+
+ // Scale from ~0->4000 to tft.width using the calibration #'s
+ p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width());
+ p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());
+
+ if (((p.y-PENRADIUS) > 0) && ((p.y+PENRADIUS) < tft.height())) {
+ tft.fillCircle(p.x, p.y, PENRADIUS, ILI9341_RED);
+ }
+}
+
+// This function opens a Windows Bitmap (BMP) file and
+// displays it at the given coordinates. It's sped up
+// by reading many pixels worth of data at a time
+// (rather than pixel by pixel). Increasing the buffer
+// size takes more of the Arduino's precious RAM but
+// makes loading a little faster. 20 pixels seems a
+// good balance.
+
+#define BUFFPIXEL 20
+
+void bmpDraw(char *filename, int16_t x, int16_t y) {
+
+ File bmpFile;
+ int bmpWidth, bmpHeight; // W+H in pixels
+ uint8_t bmpDepth; // Bit depth (currently must be 24)
+ uint32_t bmpImageoffset; // Start of image data in file
+ uint32_t rowSize; // Not always = bmpWidth; may have padding
+ uint8_t sdbuffer[3*BUFFPIXEL]; // pixel buffer (R+G+B per pixel)
+ uint8_t buffidx = sizeof(sdbuffer); // Current position in sdbuffer
+ boolean goodBmp = false; // Set to true on valid header parse
+ boolean flip = true; // BMP is stored bottom-to-top
+ int w, h, row, col;
+ uint8_t r, g, b;
+ uint32_t pos = 0, startTime = millis();
+
+ if((x >= tft.width()) || (y >= tft.height())) return;
+
+ Serial.println();
+ Serial.print(F("Loading image '"));
+ Serial.print(filename);
+ Serial.println('\'');
+
+ // Open requested file on SD card
+ if ((bmpFile = SD.open(filename)) == NULL) {
+ Serial.print(F("File not found"));
+ return;
+ }
+
+ // Parse BMP header
+ if(read16(bmpFile) == 0x4D42) { // BMP signature
+ Serial.print(F("File size: ")); Serial.println(read32(bmpFile));
+ (void)read32(bmpFile); // Read & ignore creator bytes
+ bmpImageoffset = read32(bmpFile); // Start of image data
+ Serial.print(F("Image Offset: ")); Serial.println(bmpImageoffset, DEC);
+ // Read DIB header
+ Serial.print(F("Header size: ")); Serial.println(read32(bmpFile));
+ bmpWidth = read32(bmpFile);
+ bmpHeight = read32(bmpFile);
+ if(read16(bmpFile) == 1) { // # planes -- must be '1'
+ bmpDepth = read16(bmpFile); // bits per pixel
+ Serial.print(F("Bit Depth: ")); Serial.println(bmpDepth);
+ if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed
+
+ goodBmp = true; // Supported BMP format -- proceed!
+ Serial.print(F("Image size: "));
+ Serial.print(bmpWidth);
+ Serial.print('x');
+ Serial.println(bmpHeight);
+
+ // BMP rows are padded (if needed) to 4-byte boundary
+ rowSize = (bmpWidth * 3 + 3) & ~3;
+
+ // If bmpHeight is negative, image is in top-down order.
+ // This is not canon but has been observed in the wild.
+ if(bmpHeight < 0) {
+ bmpHeight = -bmpHeight;
+ flip = false;
+ }
+
+ // Crop area to be loaded
+ w = bmpWidth;
+ h = bmpHeight;
+ if((x+w-1) >= tft.width()) w = tft.width() - x;
+ if((y+h-1) >= tft.height()) h = tft.height() - y;
+
+ // Set TFT address window to clipped image bounds
+ tft.startWrite();
+ tft.setAddrWindow(x, y, w, h);
+
+ for (row=0; row= sizeof(sdbuffer)) { // Indeed
+ tft.endWrite();
+ bmpFile.read(sdbuffer, sizeof(sdbuffer));
+ tft.startWrite();
+ buffidx = 0; // Set index to beginning
+ }
+
+ // Convert pixel from BMP to TFT format, push to display
+ b = sdbuffer[buffidx++];
+ g = sdbuffer[buffidx++];
+ r = sdbuffer[buffidx++];
+ tft.pushColor(tft.color565(r,g,b));
+ } // end pixel
+ tft.endWrite();
+ } // end scanline
+ Serial.print(F("Loaded in "));
+ Serial.print(millis() - startTime);
+ Serial.println(" ms");
+ } // end goodBmp
+ }
+ }
+
+ bmpFile.close();
+ if(!goodBmp) Serial.println(F("BMP format not recognized."));
+}
+
+// These read 16- and 32-bit types from the SD card file.
+// BMP data is stored little-endian, Arduino is little-endian too.
+// May need to reverse subscript order if porting elsewhere.
+
+uint16_t read16(File &f) {
+ uint16_t result;
+ ((uint8_t *)&result)[0] = f.read(); // LSB
+ ((uint8_t *)&result)[1] = f.read(); // MSB
+ return result;
+}
+
+uint32_t read32(File &f) {
+ uint32_t result;
+ ((uint8_t *)&result)[0] = f.read(); // LSB
+ ((uint8_t *)&result)[1] = f.read();
+ ((uint8_t *)&result)[2] = f.read();
+ ((uint8_t *)&result)[3] = f.read(); // MSB
+ return result;
+}
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/graphicstest/graphicstest.ino b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/graphicstest/graphicstest.ino
new file mode 100644
index 000000000000..3154d4095463
--- /dev/null
+++ b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/graphicstest/graphicstest.ino
@@ -0,0 +1,365 @@
+/***************************************************
+ This is our GFX example for the Adafruit ILI9341 Breakout and Shield
+ ----> http://www.adafruit.com/products/1651
+
+ Check out the links above for our tutorials and wiring diagrams
+ These displays use SPI to communicate, 4 or 5 pins are required to
+ interface (RST is optional)
+ Adafruit invests time and resources providing this open source code,
+ please support Adafruit and open-source hardware by purchasing
+ products from Adafruit!
+
+ Written by Limor Fried/Ladyada for Adafruit Industries.
+ MIT license, all text above must be included in any redistribution
+ ****************************************************/
+
+
+#include "SPI.h"
+#include "Adafruit_GFX.h"
+#include "Adafruit_ILI9341.h"
+
+// For the Adafruit shield, these are the default.
+#define TFT_DC 9
+#define TFT_CS 10
+
+// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
+Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
+// If using the breakout, change pins as desired
+//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
+
+void setup() {
+ Serial.begin(9600);
+ Serial.println("ILI9341 Test!");
+
+ tft.begin();
+
+ // read diagnostics (optional but can help debug problems)
+ uint8_t x = tft.readcommand8(ILI9341_RDMODE);
+ Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX);
+ x = tft.readcommand8(ILI9341_RDMADCTL);
+ Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX);
+ x = tft.readcommand8(ILI9341_RDPIXFMT);
+ Serial.print("Pixel Format: 0x"); Serial.println(x, HEX);
+ x = tft.readcommand8(ILI9341_RDIMGFMT);
+ Serial.print("Image Format: 0x"); Serial.println(x, HEX);
+ x = tft.readcommand8(ILI9341_RDSELFDIAG);
+ Serial.print("Self Diagnostic: 0x"); Serial.println(x, HEX);
+
+ Serial.println(F("Benchmark Time (microseconds)"));
+ delay(10);
+ Serial.print(F("Screen fill "));
+ Serial.println(testFillScreen());
+ delay(500);
+
+ Serial.print(F("Text "));
+ Serial.println(testText());
+ delay(3000);
+
+ Serial.print(F("Lines "));
+ Serial.println(testLines(ILI9341_CYAN));
+ delay(500);
+
+ Serial.print(F("Horiz/Vert Lines "));
+ Serial.println(testFastLines(ILI9341_RED, ILI9341_BLUE));
+ delay(500);
+
+ Serial.print(F("Rectangles (outline) "));
+ Serial.println(testRects(ILI9341_GREEN));
+ delay(500);
+
+ Serial.print(F("Rectangles (filled) "));
+ Serial.println(testFilledRects(ILI9341_YELLOW, ILI9341_MAGENTA));
+ delay(500);
+
+ Serial.print(F("Circles (filled) "));
+ Serial.println(testFilledCircles(10, ILI9341_MAGENTA));
+
+ Serial.print(F("Circles (outline) "));
+ Serial.println(testCircles(10, ILI9341_WHITE));
+ delay(500);
+
+ Serial.print(F("Triangles (outline) "));
+ Serial.println(testTriangles());
+ delay(500);
+
+ Serial.print(F("Triangles (filled) "));
+ Serial.println(testFilledTriangles());
+ delay(500);
+
+ Serial.print(F("Rounded rects (outline) "));
+ Serial.println(testRoundRects());
+ delay(500);
+
+ Serial.print(F("Rounded rects (filled) "));
+ Serial.println(testFilledRoundRects());
+ delay(500);
+
+ Serial.println(F("Done!"));
+
+}
+
+
+void loop(void) {
+ for(uint8_t rotation=0; rotation<4; rotation++) {
+ tft.setRotation(rotation);
+ testText();
+ delay(1000);
+ }
+}
+
+unsigned long testFillScreen() {
+ unsigned long start = micros();
+ tft.fillScreen(ILI9341_BLACK);
+ yield();
+ tft.fillScreen(ILI9341_RED);
+ yield();
+ tft.fillScreen(ILI9341_GREEN);
+ yield();
+ tft.fillScreen(ILI9341_BLUE);
+ yield();
+ tft.fillScreen(ILI9341_BLACK);
+ yield();
+ return micros() - start;
+}
+
+unsigned long testText() {
+ tft.fillScreen(ILI9341_BLACK);
+ unsigned long start = micros();
+ tft.setCursor(0, 0);
+ tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1);
+ tft.println("Hello World!");
+ tft.setTextColor(ILI9341_YELLOW); tft.setTextSize(2);
+ tft.println(1234.56);
+ tft.setTextColor(ILI9341_RED); tft.setTextSize(3);
+ tft.println(0xDEADBEEF, HEX);
+ tft.println();
+ tft.setTextColor(ILI9341_GREEN);
+ tft.setTextSize(5);
+ tft.println("Groop");
+ tft.setTextSize(2);
+ tft.println("I implore thee,");
+ tft.setTextSize(1);
+ tft.println("my foonting turlingdromes.");
+ tft.println("And hooptiously drangle me");
+ tft.println("with crinkly bindlewurdles,");
+ tft.println("Or I will rend thee");
+ tft.println("in the gobberwarts");
+ tft.println("with my blurglecruncheon,");
+ tft.println("see if I don't!");
+ return micros() - start;
+}
+
+unsigned long testLines(uint16_t color) {
+ unsigned long start, t;
+ int x1, y1, x2, y2,
+ w = tft.width(),
+ h = tft.height();
+
+ tft.fillScreen(ILI9341_BLACK);
+ yield();
+
+ x1 = y1 = 0;
+ y2 = h - 1;
+ start = micros();
+ for(x2=0; x20; i-=6) {
+ i2 = i / 2;
+ start = micros();
+ tft.fillRect(cx-i2, cy-i2, i, i, color1);
+ t += micros() - start;
+ // Outlines are not included in timing results
+ tft.drawRect(cx-i2, cy-i2, i, i, color2);
+ yield();
+ }
+
+ return t;
+}
+
+unsigned long testFilledCircles(uint8_t radius, uint16_t color) {
+ unsigned long start;
+ int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2;
+
+ tft.fillScreen(ILI9341_BLACK);
+ start = micros();
+ for(x=radius; x10; i-=5) {
+ start = micros();
+ tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
+ tft.color565(0, i*10, i*10));
+ t += micros() - start;
+ tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
+ tft.color565(i*10, i*10, 0));
+ yield();
+ }
+
+ return t;
+}
+
+unsigned long testRoundRects() {
+ unsigned long start;
+ int w, i, i2,
+ cx = tft.width() / 2 - 1,
+ cy = tft.height() / 2 - 1;
+
+ tft.fillScreen(ILI9341_BLACK);
+ w = min(tft.width(), tft.height());
+ start = micros();
+ for(i=0; i20; i-=6) {
+ i2 = i / 2;
+ tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0));
+ yield();
+ }
+
+ return micros() - start;
+}
\ No newline at end of file
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/graphicstest_featherwing/.mega2560.test.skip b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/graphicstest_featherwing/.mega2560.test.skip
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/graphicstest_featherwing/graphicstest_featherwing.ino b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/graphicstest_featherwing/graphicstest_featherwing.ino
new file mode 100644
index 000000000000..2a108d29cd27
--- /dev/null
+++ b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/graphicstest_featherwing/graphicstest_featherwing.ino
@@ -0,0 +1,404 @@
+/***************************************************
+ This is our GFX example for the Adafruit ILI9341 TFT FeatherWing
+ ----> http://www.adafruit.com/products/3315
+
+ Check out the links above for our tutorials and wiring diagrams
+
+ Adafruit invests time and resources providing this open source code,
+ please support Adafruit and open-source hardware by purchasing
+ products from Adafruit!
+
+ Written by Limor Fried/Ladyada for Adafruit Industries.
+ MIT license, all text above must be included in any redistribution
+ ****************************************************/
+
+#include
+#include
+#include
+
+#ifdef ESP8266
+ #define STMPE_CS 16
+ #define TFT_CS 0
+ #define TFT_DC 15
+ #define SD_CS 2
+#endif
+#ifdef ESP32
+ #define STMPE_CS 32
+ #define TFT_CS 15
+ #define TFT_DC 33
+ #define SD_CS 14
+#endif
+#ifdef TEENSYDUINO
+ #define TFT_DC 10
+ #define TFT_CS 4
+ #define STMPE_CS 3
+ #define SD_CS 8
+#endif
+#ifdef ARDUINO_STM32_FEATHER
+ #define TFT_DC PB4
+ #define TFT_CS PA15
+ #define STMPE_CS PC7
+ #define SD_CS PC5
+#endif
+#ifdef ARDUINO_NRF52_FEATHER /* BSP 0.6.5 and higher! */
+ #define TFT_DC 11
+ #define TFT_CS 31
+ #define STMPE_CS 30
+ #define SD_CS 27
+#endif
+#if defined(ARDUINO_MAX32620FTHR) || defined(ARDUINO_MAX32630FTHR)
+ #define TFT_DC P5_4
+ #define TFT_CS P5_3
+ #define STMPE_CS P3_3
+ #define SD_CS P3_2
+#endif
+
+// Anything else!
+#if defined (__AVR_ATmega32U4__) || defined(ARDUINO_SAMD_FEATHER_M0) || defined (__AVR_ATmega328P__) || defined(ARDUINO_SAMD_ZERO) || defined(__SAMD51__) || defined(__SAM3X8E__)
+ #define STMPE_CS 6
+ #define TFT_CS 9
+ #define TFT_DC 10
+ #define SD_CS 5
+#endif
+
+
+Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
+
+void setup() {
+ Serial.begin(115200);
+
+ delay(10);
+ Serial.println("FeatherWing TFT Test!");
+
+ tft.begin();
+
+ // read diagnostics (optional but can help debug problems)
+ uint8_t x = tft.readcommand8(ILI9341_RDMODE);
+ Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX);
+ x = tft.readcommand8(ILI9341_RDMADCTL);
+ Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX);
+ x = tft.readcommand8(ILI9341_RDPIXFMT);
+ Serial.print("Pixel Format: 0x"); Serial.println(x, HEX);
+ x = tft.readcommand8(ILI9341_RDIMGFMT);
+ Serial.print("Image Format: 0x"); Serial.println(x, HEX);
+ x = tft.readcommand8(ILI9341_RDSELFDIAG);
+ Serial.print("Self Diagnostic: 0x"); Serial.println(x, HEX);
+
+ Serial.println(F("Benchmark Time (microseconds)"));
+ delay(10);
+ Serial.print(F("Screen fill "));
+ Serial.println(testFillScreen());
+ delay(500);
+
+ Serial.print(F("Text "));
+ Serial.println(testText());
+ delay(3000);
+
+ Serial.print(F("Lines "));
+ Serial.println(testLines(ILI9341_CYAN));
+ delay(500);
+
+ Serial.print(F("Horiz/Vert Lines "));
+ Serial.println(testFastLines(ILI9341_RED, ILI9341_BLUE));
+ delay(500);
+
+ Serial.print(F("Rectangles (outline) "));
+ Serial.println(testRects(ILI9341_GREEN));
+ delay(500);
+
+ Serial.print(F("Rectangles (filled) "));
+ Serial.println(testFilledRects(ILI9341_YELLOW, ILI9341_MAGENTA));
+ delay(500);
+
+ Serial.print(F("Circles (filled) "));
+ Serial.println(testFilledCircles(10, ILI9341_MAGENTA));
+
+ Serial.print(F("Circles (outline) "));
+ Serial.println(testCircles(10, ILI9341_WHITE));
+ delay(500);
+
+ Serial.print(F("Triangles (outline) "));
+ Serial.println(testTriangles());
+ delay(500);
+
+ Serial.print(F("Triangles (filled) "));
+ Serial.println(testFilledTriangles());
+ delay(500);
+
+ Serial.print(F("Rounded rects (outline) "));
+ Serial.println(testRoundRects());
+ delay(500);
+
+ Serial.print(F("Rounded rects (filled) "));
+ Serial.println(testFilledRoundRects());
+ delay(500);
+
+ Serial.println(F("Done!"));
+
+}
+
+
+void loop(void) {
+ for(uint8_t rotation=0; rotation<4; rotation++) {
+ tft.setRotation(rotation);
+ testText();
+ delay(1000);
+ }
+}
+
+unsigned long testFillScreen() {
+ unsigned long start = micros();
+ tft.fillScreen(ILI9341_BLACK);
+ yield();
+ tft.fillScreen(ILI9341_RED);
+ yield();
+ tft.fillScreen(ILI9341_GREEN);
+ yield();
+ tft.fillScreen(ILI9341_BLUE);
+ yield();
+ tft.fillScreen(ILI9341_BLACK);
+ yield();
+ return micros() - start;
+}
+
+unsigned long testText() {
+ tft.fillScreen(ILI9341_BLACK);
+ unsigned long start = micros();
+ tft.setCursor(0, 0);
+ tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1);
+ tft.println("Hello World!");
+ tft.setTextColor(ILI9341_YELLOW); tft.setTextSize(2);
+ tft.println(1234.56);
+ tft.setTextColor(ILI9341_RED); tft.setTextSize(3);
+ tft.println(0xDEADBEEF, HEX);
+ tft.println();
+ tft.setTextColor(ILI9341_GREEN);
+ tft.setTextSize(5);
+ tft.println("Groop");
+ tft.setTextSize(2);
+ tft.println("I implore thee,");
+ tft.setTextSize(1);
+ tft.println("my foonting turlingdromes.");
+ tft.println("And hooptiously drangle me");
+ tft.println("with crinkly bindlewurdles,");
+ tft.println("Or I will rend thee");
+ tft.println("in the gobberwarts");
+ tft.println("with my blurglecruncheon,");
+ tft.println("see if I don't!");
+ return micros() - start;
+}
+
+unsigned long testLines(uint16_t color) {
+ unsigned long start, t;
+ int x1, y1, x2, y2,
+ w = tft.width(),
+ h = tft.height();
+
+ tft.fillScreen(ILI9341_BLACK);
+ yield();
+
+ x1 = y1 = 0;
+ y2 = h - 1;
+ start = micros();
+ for(x2=0; x20; i-=6) {
+ i2 = i / 2;
+ start = micros();
+ tft.fillRect(cx-i2, cy-i2, i, i, color1);
+ t += micros() - start;
+ // Outlines are not included in timing results
+ tft.drawRect(cx-i2, cy-i2, i, i, color2);
+ yield();
+ }
+
+ return t;
+}
+
+unsigned long testFilledCircles(uint8_t radius, uint16_t color) {
+ unsigned long start;
+ int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2;
+
+ tft.fillScreen(ILI9341_BLACK);
+ start = micros();
+ for(x=radius; x10; i-=5) {
+ start = micros();
+ tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
+ tft.color565(0, i*10, i*10));
+ t += micros() - start;
+ tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
+ tft.color565(i*10, i*10, 0));
+ yield();
+ }
+
+ return t;
+}
+
+unsigned long testRoundRects() {
+ unsigned long start;
+ int w, i, i2,
+ cx = tft.width() / 2 - 1,
+ cy = tft.height() / 2 - 1;
+
+ tft.fillScreen(ILI9341_BLACK);
+ w = min(tft.width(), tft.height());
+ start = micros();
+ for(i=0; i20; i-=6) {
+ i2 = i / 2;
+ tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0));
+ yield();
+ }
+
+ return micros() - start;
+}
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/onoffbutton/onoffbutton.ino b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/onoffbutton/onoffbutton.ino
new file mode 100644
index 000000000000..3365d3385d7e
--- /dev/null
+++ b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/onoffbutton/onoffbutton.ino
@@ -0,0 +1,125 @@
+//This example implements a simple sliding On/Off button. The example
+// demonstrates drawing and touch operations.
+//
+//Thanks to Adafruit forums member Asteroid for the original sketch!
+//
+#include
+#include
+#include
+#include
+#include
+
+// This is calibration data for the raw touch data to the screen coordinates
+#define TS_MINX 150
+#define TS_MINY 130
+#define TS_MAXX 3800
+#define TS_MAXY 4000
+
+#define STMPE_CS 8
+Adafruit_STMPE610 ts = Adafruit_STMPE610(STMPE_CS);
+#define TFT_CS 10
+#define TFT_DC 9
+Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
+
+boolean RecordOn = false;
+
+#define FRAME_X 210
+#define FRAME_Y 180
+#define FRAME_W 100
+#define FRAME_H 50
+
+#define REDBUTTON_X FRAME_X
+#define REDBUTTON_Y FRAME_Y
+#define REDBUTTON_W (FRAME_W/2)
+#define REDBUTTON_H FRAME_H
+
+#define GREENBUTTON_X (REDBUTTON_X + REDBUTTON_W)
+#define GREENBUTTON_Y FRAME_Y
+#define GREENBUTTON_W (FRAME_W/2)
+#define GREENBUTTON_H FRAME_H
+
+void drawFrame()
+{
+ tft.drawRect(FRAME_X, FRAME_Y, FRAME_W, FRAME_H, ILI9341_BLACK);
+}
+
+void redBtn()
+{
+ tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, ILI9341_RED);
+ tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, ILI9341_BLUE);
+ drawFrame();
+ tft.setCursor(GREENBUTTON_X + 6 , GREENBUTTON_Y + (GREENBUTTON_H/2));
+ tft.setTextColor(ILI9341_WHITE);
+ tft.setTextSize(2);
+ tft.println("ON");
+ RecordOn = false;
+}
+
+void greenBtn()
+{
+ tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, ILI9341_GREEN);
+ tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, ILI9341_BLUE);
+ drawFrame();
+ tft.setCursor(REDBUTTON_X + 6 , REDBUTTON_Y + (REDBUTTON_H/2));
+ tft.setTextColor(ILI9341_WHITE);
+ tft.setTextSize(2);
+ tft.println("OFF");
+ RecordOn = true;
+}
+
+void setup(void)
+{
+ Serial.begin(9600);
+ tft.begin();
+ if (!ts.begin()) {
+ Serial.println("Unable to start touchscreen.");
+ }
+ else {
+ Serial.println("Touchscreen started.");
+ }
+
+ tft.fillScreen(ILI9341_BLUE);
+ // origin = left,top landscape (USB left upper)
+ tft.setRotation(1);
+ redBtn();
+}
+
+void loop()
+{
+ // See if there's any touch data for us
+ if (!ts.bufferEmpty())
+ {
+ // Retrieve a point
+ TS_Point p = ts.getPoint();
+ // Scale using the calibration #'s
+ // and rotate coordinate system
+ p.x = map(p.x, TS_MINY, TS_MAXY, 0, tft.height());
+ p.y = map(p.y, TS_MINX, TS_MAXX, 0, tft.width());
+ int y = tft.height() - p.x;
+ int x = p.y;
+
+ if (RecordOn)
+ {
+ if((x > REDBUTTON_X) && (x < (REDBUTTON_X + REDBUTTON_W))) {
+ if ((y > REDBUTTON_Y) && (y <= (REDBUTTON_Y + REDBUTTON_H))) {
+ Serial.println("Red btn hit");
+ redBtn();
+ }
+ }
+ }
+ else //Record is off (RecordOn == false)
+ {
+ if((x > GREENBUTTON_X) && (x < (GREENBUTTON_X + GREENBUTTON_W))) {
+ if ((y > GREENBUTTON_Y) && (y <= (GREENBUTTON_Y + GREENBUTTON_H))) {
+ Serial.println("Green btn hit");
+ greenBtn();
+ }
+ }
+ }
+
+ Serial.println(RecordOn);
+ }
+}
+
+
+
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/onoffbutton_breakout/.esp8266.test.skip b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/onoffbutton_breakout/.esp8266.test.skip
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/onoffbutton_breakout/onoffbutton_breakout.ino b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/onoffbutton_breakout/onoffbutton_breakout.ino
new file mode 100644
index 000000000000..aa8cb9992fbb
--- /dev/null
+++ b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/onoffbutton_breakout/onoffbutton_breakout.ino
@@ -0,0 +1,133 @@
+//This example implements a simple sliding On/Off button. The example
+// demonstrates drawing and touch operations.
+//
+//Thanks to Adafruit forums member Asteroid for the original sketch!
+//
+#include
+#include
+#include
+#include
+#include
+
+//Touchscreen X+ X- Y+ Y- pins
+#define YP A3 // must be an analog pin, use "An" notation!
+#define XM A2 // must be an analog pin, use "An" notation!
+#define YM 5 // can be a digital pin
+#define XP 4 // can be a digital pin
+
+// This is calibration data for the raw touch data to the screen coordinates
+#define TS_MINX 150
+#define TS_MINY 120
+#define TS_MAXX 920
+#define TS_MAXY 940
+
+#define MINPRESSURE 10
+#define MAXPRESSURE 1000
+
+// For better pressure precision, we need to know the resistance
+// between X+ and X- Use any multimeter to read it
+// For the one we're using, its 300 ohms across the X plate
+TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
+
+
+#define TFT_CS 10
+#define TFT_DC 9
+Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
+
+boolean RecordOn = false;
+
+#define FRAME_X 210
+#define FRAME_Y 180
+#define FRAME_W 100
+#define FRAME_H 50
+
+#define REDBUTTON_X FRAME_X
+#define REDBUTTON_Y FRAME_Y
+#define REDBUTTON_W (FRAME_W/2)
+#define REDBUTTON_H FRAME_H
+
+#define GREENBUTTON_X (REDBUTTON_X + REDBUTTON_W)
+#define GREENBUTTON_Y FRAME_Y
+#define GREENBUTTON_W (FRAME_W/2)
+#define GREENBUTTON_H FRAME_H
+
+void drawFrame()
+{
+ tft.drawRect(FRAME_X, FRAME_Y, FRAME_W, FRAME_H, ILI9341_BLACK);
+}
+
+void redBtn()
+{
+ tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, ILI9341_RED);
+ tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, ILI9341_BLUE);
+ drawFrame();
+ tft.setCursor(GREENBUTTON_X + 6 , GREENBUTTON_Y + (GREENBUTTON_H/2));
+ tft.setTextColor(ILI9341_WHITE);
+ tft.setTextSize(2);
+ tft.println("ON");
+ RecordOn = false;
+}
+
+void greenBtn()
+{
+ tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, ILI9341_GREEN);
+ tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, ILI9341_BLUE);
+ drawFrame();
+ tft.setCursor(REDBUTTON_X + 6 , REDBUTTON_Y + (REDBUTTON_H/2));
+ tft.setTextColor(ILI9341_WHITE);
+ tft.setTextSize(2);
+ tft.println("OFF");
+ RecordOn = true;
+}
+
+void setup(void)
+{
+ Serial.begin(9600);
+ tft.begin();
+
+ tft.fillScreen(ILI9341_BLUE);
+ // origin = left,top landscape (USB left upper)
+ tft.setRotation(1);
+ redBtn();
+}
+
+void loop()
+{
+ // Retrieve a point
+ TSPoint p = ts.getPoint();
+
+ // See if there's any touch data for us
+ if (p.z > MINPRESSURE && p.z < MAXPRESSURE)
+ {
+ // Scale using the calibration #'s
+ // and rotate coordinate system
+ p.x = map(p.x, TS_MINY, TS_MAXY, 0, tft.height());
+ p.y = map(p.y, TS_MINX, TS_MAXX, 0, tft.width());
+ int y = tft.height() - p.x;
+ int x = p.y;
+
+ if (RecordOn)
+ {
+ if((x > REDBUTTON_X) && (x < (REDBUTTON_X + REDBUTTON_W))) {
+ if ((y > REDBUTTON_Y) && (y <= (REDBUTTON_Y + REDBUTTON_H))) {
+ Serial.println("Red btn hit");
+ redBtn();
+ }
+ }
+ }
+ else //Record is off (RecordOn == false)
+ {
+ if((x > GREENBUTTON_X) && (x < (GREENBUTTON_X + GREENBUTTON_W))) {
+ if ((y > GREENBUTTON_Y) && (y <= (GREENBUTTON_Y + GREENBUTTON_H))) {
+ Serial.println("Green btn hit");
+ greenBtn();
+ }
+ }
+ }
+
+ Serial.println(RecordOn);
+ }
+}
+
+
+
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/pictureEmbed/dragon.h b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/pictureEmbed/dragon.h
new file mode 100644
index 000000000000..ab61bb77c996
--- /dev/null
+++ b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/pictureEmbed/dragon.h
@@ -0,0 +1,861 @@
+#define DRAGON_WIDTH 110
+#define DRAGON_HEIGHT 70
+
+const PROGMEM uint16_t dragonBitmap[DRAGON_WIDTH * DRAGON_HEIGHT] = {
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0X8C10, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XBD14, 0XAC92, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XDEFB, 0XB431, 0XA1C9, 0XAA4B, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XCE18, 0X9A2A, 0X9044,
+ 0XDEFB, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XDEFB, 0XB3B0, 0XA148, 0XB865, 0XC066, 0XC066, 0XAA4B,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XAB2E, 0X9864,
+ 0XA865, 0XAAAC, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XAC92,
+ 0X728B, 0XDEFB, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XCE18, 0XAB2E, 0XAA4B, 0XAA4B, 0XAA4B, 0XA3AF,
+ 0XB431, 0XB431, 0XB431, 0XA411, 0XA8E6, 0XD086, 0XB865, 0X7043, 0XA865,
+ 0XD086, 0XAA4B, 0XCE79, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XB493, 0XA8E6,
+ 0X9864, 0XC066, 0XD086, 0XB493, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XCE79, 0X830D,
+ 0X80C5, 0XAB2E, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XB431, 0XC066, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XB865, 0X9864,
+ 0XC066, 0XD086, 0XB8E7, 0XB493, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XDE9A, 0XA1C9,
+ 0XB865, 0X9864, 0XD086, 0XD086, 0XD086, 0XBDF7, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XAD14, 0X71A8,
+ 0X9864, 0XC066, 0XC515, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XDEFB, 0XBDF7, 0XBD14, 0XA411, 0XB431, 0XB148, 0XD086, 0XC066,
+ 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0XD086, 0XA865,
+ 0XB865, 0XD086, 0XD086, 0XB1CA, 0XDEFB, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XB3B0,
+ 0XB865, 0XA865, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0XBD14, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XCE79, 0X932D, 0X78C5,
+ 0XA865, 0XD086, 0XC066, 0XC515, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XDEFB, 0XAB2E, 0XA0C6, 0XB865, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086,
+ 0XB865, 0X78C5, 0X4208, 0X2104, 0X8947, 0X9864, 0X9864, 0X9864, 0XD086,
+ 0XD086, 0XA865, 0X9864, 0XD086, 0XB865, 0XDEFB, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XCE18,
+ 0XB148, 0XC066, 0XA865, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XAA4B, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XB493, 0X89A8, 0X9044,
+ 0XB865, 0XD086, 0XD086, 0XC066, 0XC515, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0X7B8E, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XAD14, 0XDEFB, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XB431, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0XA865,
+ 0X9864, 0XD086, 0XD086, 0XD086, 0XAA4B, 0X9A2A, 0XC066, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XC066, 0X9044, 0X9864, 0X9864, 0X9044, 0XCE18, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D,
+ 0XB3B0, 0XC066, 0XB865, 0XA865, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XAAAC, 0XBD96, 0XAD14, 0XAAAC, 0X8044, 0X9864,
+ 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0XB431, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XB3B0, 0XAA4B, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XBD96, 0XB8E7, 0XB431, 0XEF7D, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XA32E, 0X9864, 0X9864, 0XAA4B, 0XAA4B, 0X9147, 0XB865,
+ 0X9044, 0XD086, 0XA865, 0XD086, 0XC066, 0XC066, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086,
+ 0XAA4B, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XDE9A, 0XB148, 0XD086, 0XA865, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0X9864, 0X9864, 0XA865, 0X9864,
+ 0XC066, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XA148, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XC515, 0XC066, 0XAA4B, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XAA4B, 0XD086,
+ 0XA865, 0XAB2E, 0XBD96, 0XEF7D, 0XCE79, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XDEFB, 0XB1CA, 0XD086, 0XD086, 0X9864, 0X822A, 0XBDF7, 0XB493,
+ 0XB148, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0X9864,
+ 0XD086, 0XD086, 0XD086, 0XAA4B, 0XBD14, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XB431, 0XB865, 0XD086, 0X9864, 0XC066, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XC066, 0X9864, 0X9864, 0XC066, 0XA865, 0X9864,
+ 0XC066, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XB3B0,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XCD96, 0XC066, 0XD086, 0XAA4B, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XDE9A, 0XB865, 0XD086, 0XD086, 0XD086, 0XA865, 0X9147, 0X9C92, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XCE18, 0X80C5, 0X5822, 0X5A08, 0XDEFB,
+ 0XFFFF, 0XFFFF, 0XCE79, 0XA0C6, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0X9044, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XAB2E, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XEF7D, 0XAA4B, 0XD086, 0XC066, 0X9864, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XA865, 0X9864, 0XA865, 0XD086, 0X9864, 0X9864,
+ 0XC066, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XAB2E, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XDE9A, 0XB8E7, 0XD086, 0XD086,
+ 0XAA4B, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XC515, 0XC066, 0XD086, 0XB865, 0X8044, 0X82AB,
+ 0XBDF7, 0XBDF7, 0XBDF7, 0XBDF7, 0XBDF7, 0XBDF7, 0XAC92, 0XA3AF, 0X92AC,
+ 0XAB2E, 0XAA4B, 0XA1C9, 0X9864, 0XB865, 0XA865, 0XC066, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0XB1CA, 0XBD14,
+ 0X9CF3, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XCE18, 0XA8E6, 0XD086, 0XC066, 0XA865, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XC066, 0X9864, 0X9864, 0XC066, 0XD086, 0X9864, 0X9864,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XC066, 0XC515, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XDE9A, 0XB8E7, 0XD086,
+ 0XD086, 0XD086, 0XAA4B, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XB3B0, 0XD086, 0XA865,
+ 0XC066, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XC066, 0XA865, 0X8044, 0X4822, 0X9044, 0X9044,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0X8044, 0X9864, 0XD086, 0XD086, 0XD086,
+ 0XAA4B, 0XCE18, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XB493, 0XC066, 0XD086, 0XC066, 0XA865, 0XD086,
+ 0XD086, 0XD086, 0XA865, 0X9864, 0XA865, 0XD086, 0XC066, 0X9864, 0X9864,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0X9044, 0X3986, 0XCE79,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XDE9A, 0XB8E7,
+ 0XD086, 0XD086, 0XC066, 0XD086, 0XAA4B, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XB431, 0XC066, 0X90C6, 0XAA4B, 0XAA4B, 0XAA4B, 0XAA4B, 0X99C9, 0X9864,
+ 0X9864, 0X9864, 0X6843, 0X6843, 0X5822, 0X4822, 0X7043, 0X9044, 0XC066,
+ 0X9864, 0X7043, 0XC066, 0XB865, 0XD086, 0X7043, 0X8044, 0XC066, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XC066, 0XB431, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XAB2E, 0XD086, 0XD086, 0XC066, 0XA865,
+ 0XD086, 0XD086, 0X9864, 0X9044, 0XC066, 0XD086, 0XC066, 0X9864, 0XA865,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XB865, 0X9864, 0X9864, 0X9864, 0X9044, 0X6843, 0X6843, 0X8044, 0X7B0C,
+ 0XCE79, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XDE9A,
+ 0XB8E7, 0XD086, 0X9864, 0XC066, 0X9864, 0XD086, 0XAA4B, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XC515, 0XA8E6, 0XCE18, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XA148, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XB148, 0XBD14, 0X9A2A, 0XD086, 0X9864, 0X9864, 0X6843, 0XD086, 0XC066,
+ 0XC066, 0XD086, 0XD086, 0XD086, 0XA865, 0XC066, 0XA865, 0XEF7D, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XB1CA, 0XD086, 0XD086, 0XD086,
+ 0X9864, 0XC066, 0X9864, 0X9864, 0XD086, 0XD086, 0XC066, 0X9864, 0XA865,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0X9864, 0X9864, 0X9864,
+ 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0XA865, 0XD086, 0XA1C9,
+ 0XDE9A, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XDE9A, 0XB8E7, 0XD086, 0XD086, 0X9864, 0XD086, 0X9864, 0XD086, 0XAA4B,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XDEFB, 0XCE18, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XAA4B, 0XD086, 0XC066,
+ 0XD086, 0XAAAC, 0XEF7D, 0XFFFF, 0X932D, 0XB865, 0XB865, 0XC066, 0X7043,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XB148, 0XEF7D, 0XBD14, 0XA148,
+ 0XBDF7, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XAA4B, 0XD086, 0XD086,
+ 0XD086, 0X8044, 0X9864, 0XA865, 0XD086, 0XD086, 0XC066, 0X9864, 0XA865,
+ 0XD086, 0XD086, 0XA865, 0X9864, 0X9864, 0X9864, 0X9864, 0XA865, 0XD086,
+ 0XB865, 0X9864, 0X9864, 0X9864, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XAB2E, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XDE9A, 0XB8E7, 0XD086, 0XD086, 0XC066, 0XA865, 0XD086, 0X9864,
+ 0XD086, 0XA0C6, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0X8C10, 0XB431, 0XEF7D, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XBD14,
+ 0XD086, 0XA1C9, 0X80C5, 0XEF7D, 0XFFFF, 0XB431, 0XD086, 0XB865, 0X9864,
+ 0X8044, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XAA4B, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XBD14, 0XD086,
+ 0XD086, 0XD086, 0XA865, 0XB865, 0XD086, 0XD086, 0XC066, 0X9864, 0X9864,
+ 0X9864, 0X9044, 0X9864, 0X9864, 0XC066, 0XD086, 0XD086, 0XB865, 0X9864,
+ 0X9864, 0X9864, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XAB2E, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XDE9A, 0XB8E7, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086,
+ 0XD086, 0X9864, 0XD086, 0X9864, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XB148,
+ 0XA1C9, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XBDF7, 0XD086, 0XBD14, 0XEF7D, 0XFFFF, 0XFFFF, 0XA148, 0XD086,
+ 0XD086, 0XD086, 0X9864, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XC066, 0XB431, 0XEF7D, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XAA4B, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XC066, 0X7043,
+ 0X9864, 0XA865, 0XD086, 0XD086, 0XD086, 0XC066, 0X9864, 0X9864, 0X9864,
+ 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XAAAC, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XA32E, 0XAA4B, 0XAA4B, 0XAA4B, 0XAB2E,
+ 0X9044, 0XD086, 0XA865, 0X9864, 0XD086, 0XD086, 0XBDF7, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XBDF7, 0XDEFB, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XB431, 0XB865, 0XAC92, 0XFFFF, 0XEF7D, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0X8947, 0XEF7D, 0XFFFF, 0XFFFF, 0XEF7D,
+ 0X9044, 0XD086, 0XD086, 0XB865, 0XB865, 0X9864, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XA0C6, 0XEF7D, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0X9864, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0X9864, 0X9864, 0XA865, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XA8E6, 0XEF7D, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XCE18, 0XC066, 0XD086, 0XA1C9, 0XB431, 0XD086, 0XD086, 0XB493,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XAB2E, 0XB865,
+ 0XB3B0, 0XFFFF, 0XFFFF, 0X9AAC, 0XB865, 0XA148, 0XFFFF, 0X9AAC, 0XCD96,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XAA4B, 0XB865, 0X9864, 0X9864, 0X8044, 0X9044, 0X8044, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XA1C9, 0X90C6, 0XD086, 0XB3B0, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0X9864, 0XD086, 0XD086, 0X9864, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0X9864, 0X9864, 0X9864, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XAB2E, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XDEFB, 0XB3B0, 0XAA4B, 0X9864, 0X9864, 0XA1C9,
+ 0XAB2E, 0XBD96, 0XFFFF, 0XAA4B, 0XD086, 0XD086, 0XB493, 0XFFFF, 0XAB2E,
+ 0XC066, 0XAAAC, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0X8947, 0X9864, 0X9A2A, 0XFFFF, 0X9864, 0XD086, 0XA148, 0XEF7D,
+ 0XA8E6, 0XB431, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XCE79, 0XC066, 0XD086, 0XD086, 0XD086, 0X9044, 0X7043,
+ 0X8044, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XFFFF, 0XFFFF, 0XBD14,
+ 0X92AC, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0X9864, 0XD086, 0XB865,
+ 0XB865, 0XD086, 0XD086, 0X8044, 0X6843, 0X9864, 0X9864, 0X9864, 0X9864,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XBD96, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XB431, 0XB865, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0X9147, 0XA865, 0XD086, 0XC066, 0XCE79,
+ 0XFFFF, 0XFFFF, 0XCD96, 0X7926, 0XEF7D, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0X9864, 0XD086, 0XC066, 0X9CF3, 0XC066, 0XD086,
+ 0X8A2A, 0X8947, 0XD086, 0XBD14, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XAD14, 0XC066, 0XD086, 0XD086, 0XD086,
+ 0X9864, 0X9864, 0X8044, 0XD086, 0XD086, 0XD086, 0XD086, 0XB865, 0XDEFB,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0X9864,
+ 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0X9864,
+ 0XC066, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XBDF7, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XB493, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0XA865,
+ 0XA148, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XAA4B, 0XD086, 0XD086, 0X71A8,
+ 0XD086, 0XD086, 0X9044, 0XD086, 0X9864, 0XBDF7, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XDE9A, 0XB865, 0XA865, 0XA865,
+ 0XD086, 0XD086, 0X7043, 0X9864, 0X9044, 0XA865, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XA8E6, 0XB493, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0X9864, 0XB865, 0XB865, 0XD086, 0XD086, 0XD086, 0X9864, 0X9864,
+ 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XA865, 0X9864, 0X9864, 0X9864, 0X9864, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XBDF7, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XA0C6, 0XD086,
+ 0XD086, 0XD086, 0XA865, 0X80C5, 0X9864, 0XC066, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XC066, 0X8B8E, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XB493, 0XD086,
+ 0XD086, 0X9864, 0XA865, 0XA865, 0XC066, 0XD086, 0XA8E6, 0XEF7D, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XAAAC, 0XD086,
+ 0XD086, 0XC066, 0X9864, 0X8044, 0XA865, 0X9044, 0XC066, 0X8044, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9A2A, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XEF7D, 0XA865, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0X9864, 0X9864, 0XC066, 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0X9864,
+ 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0XD086, 0XD086,
+ 0X9864, 0X9864, 0X9864, 0XC066, 0XAB2E, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0X9864, 0XD086, 0XD086, 0X90C6, 0XCE79, 0XFFFF, 0XFFFF, 0X9C92, 0X9864,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XAB2E, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XEF7D, 0XA0C6, 0XD086, 0XD086, 0XB865, 0X9864, 0XD086, 0XB1CA, 0XDE9A,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XAA4B, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0X7043, 0XA865, 0X9044,
+ 0X9044, 0XD086, 0XD086, 0XD086, 0XD086, 0XB1CA, 0XB431, 0X82AB, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XBD14, 0XA865, 0XC066, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0X9864, 0XC066, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0X7043, 0X8044, 0XDEFB, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0X9864, 0XD086, 0XD086, 0XA32E, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0X728B, 0XB865, 0XD086, 0XD086, 0XD086, 0X9864, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XAA4B, 0XD086, 0XD086, 0XB865, 0X90C6,
+ 0XEF7D, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XC515, 0X9044, 0XC066, 0XD086, 0XD086, 0XD086, 0X9864, 0X8044,
+ 0XC066, 0X8044, 0X9044, 0XC066, 0XD086, 0XD086, 0XD086, 0XBDF7, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0X6926, 0XC066, 0XD086,
+ 0XD086, 0XD086, 0X9044, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0XA865,
+ 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XA8E6, 0XAAAC, 0XB431, 0X8410,
+ 0X8C71, 0XFFFF, 0XFFFF, 0XFFFF, 0XAAAC, 0XD086, 0XD086, 0XA865, 0XA32E,
+ 0XB431, 0XB431, 0X8947, 0XC066, 0X9864, 0XD086, 0XD086, 0XD086, 0XC066,
+ 0XCE79, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XB431, 0XD086, 0XD086,
+ 0XD086, 0XB8E7, 0XDEFB, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XA0C6, 0XD086, 0XA865, 0X9864, 0X9864, 0X9864,
+ 0X9044, 0X9044, 0XA865, 0X9864, 0XA865, 0X9864, 0XD086, 0XD086, 0XD086,
+ 0XB3B0, 0XFFFF, 0XEF7D, 0XBDF7, 0XB431, 0XAAAC, 0XA148, 0XA865, 0XD086,
+ 0XD086, 0XD086, 0XC066, 0XD086, 0XB865, 0X9044, 0X9864, 0X9864, 0XC066,
+ 0XD086, 0XD086, 0XD086, 0X9864, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XB8E7, 0XB493, 0XEF7D, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XDE9A, 0XB8E7, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XBDF7, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XAAAC,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XB3B0, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XDEFB, 0XB865, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0X8044, 0X9864, 0XB865, 0X8044, 0XC066, 0X6843, 0XD086,
+ 0XD086, 0X9864, 0XA0C6, 0X99C9, 0XA865, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0X8044, 0XB865, 0XD086, 0XC066, 0XA865,
+ 0XD086, 0XA865, 0X9864, 0X9864, 0XD086, 0XD086, 0XB865, 0X9864, 0XC066,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XB1CA, 0XDEFB, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XDEFB, 0XAB2E, 0X9864, 0XC066, 0XD086, 0XC066, 0X9864, 0X89A8, 0XA865,
+ 0XD086, 0XD086, 0XD086, 0XA865, 0XEF7D, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XAA4B, 0XD086, 0XD086, 0XD086, 0XD086, 0XA148, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XBDF7, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0X7043, 0XC066, 0X6843, 0XD086, 0X7043,
+ 0XC066, 0X9044, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0XD086, 0X9864, 0XB865, 0XB865,
+ 0XD086, 0XC066, 0XA865, 0XD086, 0XD086, 0XD086, 0X9864, 0X9864, 0XC066,
+ 0XD086, 0XA865, 0XA865, 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0X9C92,
+ 0XBDF7, 0XBDF7, 0XBDF7, 0XBDF7, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XCE79, 0XBDF7, 0XCE79, 0XEF7D,
+ 0XAAAC, 0XD086, 0XD086, 0XD086, 0XD086, 0XA1C9, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XA148, 0XD086, 0XD086, 0XD086, 0XD086, 0XB865,
+ 0XDEFB, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XCD96,
+ 0X8044, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X6843, 0X9044, 0X9864,
+ 0XA865, 0XA865, 0X9044, 0XB865, 0XD086, 0XD086, 0XB865, 0X9864, 0X8044,
+ 0XC066, 0XD086, 0XD086, 0XB865, 0XD086, 0XA865, 0X9044, 0XD086, 0XB865,
+ 0XB865, 0XB865, 0XA865, 0XD086, 0XB865, 0XB865, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XA865, 0X9864, 0XB865, 0XC066, 0X9864, 0XD086, 0XD086, 0XD086,
+ 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0X9864, 0XA1C9,
+ 0XAB2E, 0XBD14, 0XCE79, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XCE79,
+ 0XB493, 0XB148, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XBD14, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0X9864, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XBDF7, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XA148, 0XD086, 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0X9864,
+ 0X9864, 0X9864, 0X7043, 0X9864, 0XD086, 0XD086, 0XA865, 0X9864, 0XB865,
+ 0XD086, 0X9864, 0XD086, 0XC066, 0X7043, 0XD086, 0XD086, 0X9864, 0XC066,
+ 0XA865, 0XD086, 0X9864, 0XD086, 0XC066, 0XA865, 0XD086, 0XA865, 0XC066,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0X9864, 0X9044, 0X9864,
+ 0XC066, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0X9864, 0X9864, 0X9864, 0X9864,
+ 0X9864, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XA1C9,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XC515, 0XC066, 0XA865,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XAD14, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0X9044, 0X8044, 0X9864, 0XA865, 0XD086, 0XA865, 0X9864, 0XC066,
+ 0XD086, 0XD086, 0XA865, 0XC066, 0XC066, 0XA865, 0X9864, 0XD086, 0XA865,
+ 0XC066, 0XD086, 0X9864, 0XD086, 0X9864, 0XD086, 0XD086, 0XB865, 0XB865,
+ 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0X9864, 0X8044, 0X8044, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864,
+ 0XA865, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XB8E7, 0XDEFB, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF,
+ 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X04A6, 0XB865,
+ 0XD086, 0X31C3, 0XC066, 0XD086, 0XD086, 0X9864, 0XB865, 0X2305, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X9864, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0X6843, 0X9864, 0XA865, 0XB865, 0X9864, 0XC066,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XC066, 0XA865, 0XD086, 0X9864,
+ 0XD086, 0X9864, 0XD086, 0XD086, 0XA865, 0XC066, 0X9864, 0XD086, 0XD086,
+ 0XD086, 0XC066, 0XA865, 0XB865, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0X8044, 0X8044, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0X9864, 0XC066, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0X8145, 0X0C66, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0506,
+ 0X8145, 0XD086, 0X9105, 0X0506, 0X80E5, 0XD086, 0XD086, 0X9864, 0XD086,
+ 0X9864, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X80E5, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X8044, 0XB865, 0X9864, 0XB865,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0XC066, 0X9864, 0XD086,
+ 0XD086, 0X9864, 0XC066, 0XA865, 0XD086, 0XD086, 0XD086, 0X9864, 0X9864,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0XA865, 0X9864, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XA865, 0X9864, 0X9864, 0X7043, 0X9864, 0XA865,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0XC066, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XC066, 0X59E5, 0X0506, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X2305, 0XB865, 0XD086, 0X2305, 0X0547, 0X1B65, 0XD086, 0XD086,
+ 0XB865, 0XB865, 0X9864, 0X6985, 0X1B65, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0C05, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0X9044, 0X8044, 0X9864,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0X9864,
+ 0XD086, 0XD086, 0XD086, 0X9864, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0X9864, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XB865, 0XA865,
+ 0XA865, 0XD086, 0XD086, 0XA865, 0X9864, 0XC066, 0XD086, 0XD086, 0X9864,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XA865, 0XC066, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0X80E5, 0X0C05, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X1B65, 0XC066, 0X8044, 0X04A6, 0X0547, 0X0547,
+ 0X80E5, 0XD086, 0XD086, 0X9864, 0XA865, 0XD086, 0XD086, 0X1AC4, 0X0405,
+ 0X0547, 0X0547, 0X4285, 0XC066, 0X9864, 0X9864, 0X9864, 0X9864, 0X8044,
+ 0XA865, 0XD086, 0XD086, 0XC066, 0XA865, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0X7043, 0XC066, 0XD086, 0XD086, 0XD086, 0X9864, 0X9864, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XA865, 0XA865, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XB865, 0X8044, 0XD086, 0XA865, 0XC066, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XC066, 0XA865, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XA865, 0X59E5, 0X0BA5, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0506, 0X3264, 0X98A5, 0X7145, 0X04A6, 0X0547,
+ 0X0547, 0X0547, 0X1BC5, 0XC066, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086,
+ 0X9864, 0XD086, 0X7145, 0X4984, 0X80A4, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0X9864, 0X7043, 0X9864, 0X9864, 0XB865, 0X9864, 0XD086, 0XD086,
+ 0XD086, 0X8044, 0XA865, 0XD086, 0XD086, 0XD086, 0XD086, 0X9044, 0XA865,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0X9864, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0X8044, 0XC066, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0XC066, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9044, 0XA865, 0X9864,
+ 0X6985, 0X4285, 0X1B65, 0X0506, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0445, 0X0445, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X4A25, 0XD086, 0XD086, 0XD086,
+ 0X9864, 0X9864, 0XC066, 0XD086, 0XD086, 0X9864, 0X9864, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0X9864,
+ 0XD086, 0XB865, 0X9864, 0X4822, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0X6843, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0X9864,
+ 0XD086, 0XC066, 0X9864, 0X8044, 0X9864, 0X9864, 0X9864, 0X8044, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0X9864,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XA8C5, 0X32C5, 0X0506, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X4A25,
+ 0XD086, 0XD086, 0XD086, 0XA865, 0X9864, 0XB865, 0XD086, 0X9864, 0X9864,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0X9864, 0XA865, 0XB865, 0XD086, 0X8044, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0X6843, 0XD086, 0X9044, 0X9864, 0X9044, 0X9864, 0XB865,
+ 0X9864, 0X9864, 0XB865, 0XA865, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086,
+ 0XA865, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XC066, 0X9864, 0XA865, 0X9864, 0X9044, 0XA865, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0X98A5, 0X32C5, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X32C5, 0XC066, 0XD086, 0XD086, 0XD086, 0XB865, 0X9864,
+ 0X8044, 0X9864, 0X8044, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0X9864, 0XC066, 0XA865, 0X9864, 0X9864, 0XA865,
+ 0X9864, 0X9044, 0X9864, 0XD086, 0X6843, 0X9864, 0XC066, 0XA865, 0XD086,
+ 0XD086, 0XB865, 0X8044, 0X7043, 0XB865, 0XD086, 0X9864, 0X9864, 0X9864,
+ 0X9864, 0X9864, 0XA865, 0XB865, 0X9864, 0X9864, 0X9864, 0XA865, 0XD086,
+ 0XD086, 0XD086, 0X9044, 0XD086, 0XD086, 0XC066, 0XA865, 0XC066, 0X9864,
+ 0X9864, 0X9044, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X80E5,
+ 0X1BC5, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X4285, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XB865, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0X9044, 0X7043, 0XD086,
+ 0X8044, 0X9044, 0XD086, 0XD086, 0X9044, 0X9864, 0X6843, 0XD086, 0XD086,
+ 0X9864, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XB865, 0XA865,
+ 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X6985,
+ 0X04A6, 0X4A25, 0X80A4, 0XA865, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086,
+ 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0X9864, 0X8044, 0X9864, 0XC066,
+ 0XD086, 0XD086, 0XC066, 0X6985, 0X0C66, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X4A25,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XA865, 0X9044, 0XB865, 0XA865, 0X9864, 0X9044, 0X9864,
+ 0XB865, 0X9044, 0XC066, 0X9864, 0XD086, 0XD086, 0X9864, 0XD086, 0XA865,
+ 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0X9864, 0XC066, 0X9864,
+ 0XB865, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0X4A25, 0X0506, 0X0547, 0X0547, 0X1BC5, 0XA8C5, 0XD086, 0XD086, 0XB865,
+ 0XB865, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0X9864,
+ 0XD086, 0X9864, 0XB865, 0XD086, 0XD086, 0XD086, 0XB865, 0X32C5, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0506, 0X8145, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XC066,
+ 0XA865, 0XD086, 0XD086, 0XB865, 0XB865, 0XD086, 0XB865, 0X8044, 0XB865,
+ 0XA865, 0X8044, 0XA865, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0X9864,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0X8044, 0X7043,
+ 0X7043, 0XC066, 0XD086, 0XC066, 0XA865, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0X6985, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X04A6, 0X2305,
+ 0X32C5, 0X6944, 0XD086, 0XD086, 0XD086, 0X9864, 0XC066, 0XD086, 0XD086,
+ 0X9864, 0XD086, 0XD086, 0X9864, 0XB865, 0XB865, 0XD086, 0XC066, 0XB865,
+ 0XD086, 0X7145, 0X0C66, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0C66, 0XB865, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XA865, 0XC066, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086,
+ 0X9044, 0XB865, 0X9044, 0XD086, 0XD086, 0XD086, 0XC066, 0XA865, 0XD086,
+ 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0XB865, 0XA865, 0XD086, 0XB865,
+ 0XB865, 0XD086, 0XD086, 0XB865, 0X9864, 0X7043, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0X32C5, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0405, 0X2305, 0X0BA5, 0X0BA5, 0X7145,
+ 0X9864, 0X90A4, 0X58E3, 0XD086, 0XB865, 0XB865, 0XD086, 0X9864, 0XD086,
+ 0XD086, 0X1A63, 0XA8C5, 0XD086, 0XA8C5, 0X0C66, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X32C5, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XA865, 0X90A4, 0X4183, 0X6985, 0X5924, 0X9044,
+ 0XD086, 0XB865, 0XB865, 0X9044, 0X9864, 0XD086, 0XD086, 0XD086, 0X9864,
+ 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0XA8C5, 0X1B65, 0X0405,
+ 0X0405, 0X9044, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X4A25, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0405, 0X1AC4, 0XD086, 0XD086,
+ 0X9864, 0XD086, 0XD086, 0X4285, 0X04A6, 0X59E5, 0X9864, 0X4224, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0506, 0X98A5, 0XD086, 0XD086, 0X22C4, 0X0506, 0X0547, 0X0547, 0X0547,
+ 0X2305, 0XD086, 0XA865, 0X8044, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0X9864, 0XD086, 0XD086, 0X9044, 0XD086, 0XB865, 0X6985, 0X04A6,
+ 0X0547, 0X0547, 0X0547, 0X90A4, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XA865, 0XC066, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XB865, 0X0BA5,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X22C4, 0XA865, 0X9044, 0X9864, 0XD086, 0X6985, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X4A25, 0XD086, 0X98A5, 0X0506, 0X0547, 0X0547,
+ 0X0547, 0X0506, 0X4183, 0X9864, 0X9044, 0XB865, 0XD086, 0XD086, 0XD086,
+ 0X9864, 0XD086, 0XD086, 0X9864, 0XD086, 0X7145, 0X0BA5, 0X0405, 0X04A6,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X32C5, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0X9044, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0X90A4, 0X4285, 0X04A6, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0405, 0XD086, 0XD086, 0X9864, 0XD086, 0X6985, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X1B65, 0XD086, 0X4A25, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X4A25, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086,
+ 0XD086, 0X8145, 0X0B64, 0XD086, 0XD086, 0XA865, 0X32C5, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X2305,
+ 0X98A5, 0XC066, 0X9864, 0X9864, 0X9864, 0XC066, 0X9864, 0XA865, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0X80E5, 0X59E5,
+ 0X0C05, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0445, 0XC066, 0XD086, 0X9044, 0XD086,
+ 0X6985, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0405, 0X98A5,
+ 0X0506, 0X0547, 0X0547, 0X0547, 0X0547, 0X59E5, 0XD086, 0XB865, 0XB865,
+ 0XD086, 0XD086, 0XA8C5, 0X0C66, 0X0506, 0X98A5, 0XD086, 0X90A4, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0506, 0X70E4, 0XD086, 0XD086, 0XD086, 0XD086, 0XC066,
+ 0X9864, 0X9864, 0X9864, 0X9044, 0X9864, 0XC066, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XC066, 0X1BC5, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X68E4, 0X9044,
+ 0X9864, 0XD086, 0X6985, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0445, 0X1BC5, 0X0547, 0X0547, 0X0547, 0X0547, 0X0C66, 0X90A4, 0XA865,
+ 0X9044, 0XD086, 0XD086, 0XA8C5, 0X0C66, 0X0547, 0X0547, 0X32C5, 0XD086,
+ 0X4A25, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0C66, 0X7145, 0X9864, 0X9864,
+ 0XA865, 0XA865, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0X9864, 0XD086,
+ 0XD086, 0X90A4, 0X80E5, 0XC066, 0XD086, 0X7145, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X9864, 0XD086, 0X9864, 0XD086, 0X6985, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X80E5,
+ 0XD086, 0XB865, 0XB865, 0XD086, 0XA8C5, 0X0C66, 0X0547, 0X0547, 0X0547,
+ 0X0506, 0X9044, 0X04A6, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X4285, 0XB865, 0XA865, 0X9864, 0XC066, 0XD086, 0XA865,
+ 0XC066, 0XD086, 0XC066, 0X0C05, 0X0547, 0X0445, 0X4285, 0X58E3, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X9864, 0XD086, 0X9864, 0XD086, 0X4285, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X9864, 0XD086, 0X9864, 0XD086, 0XA8C5, 0X0C66, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0405, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0405, 0X04A6, 0X2305, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0C66, 0X80E5, 0X9864, 0X9864, 0X9864,
+ 0X8044, 0XB865, 0XD086, 0XD086, 0X32C5, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X4285, 0XA865, 0X7043, 0XB865, 0XD086, 0X2305,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X2365, 0X9864, 0XB865, 0XB865, 0XA8C5, 0X0C66, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0506, 0X70A4, 0XA865, 0X8044, 0XD086, 0X7145, 0X0506, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X04A6, 0X3224, 0XD086, 0XD086,
+ 0XC066, 0X9864, 0XC066, 0XD086, 0XD086, 0X4A25, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X1B65, 0X32C5, 0X68E4, 0X2365, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X9864, 0XD086, 0X9864, 0XD086,
+ 0XC066, 0X0445, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X2305, 0X6985, 0X59E5, 0X22C4, 0X0445, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0C66, 0XA8C5, 0XA865, 0XA865, 0XD086, 0X2305,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0BA5, 0X0C05, 0X0C66, 0X9044, 0XD086, 0XD086, 0X8145,
+ 0X04A6, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0C05, 0XB865, 0XC066,
+ 0X9864, 0X9044, 0XA865, 0XD086, 0XD086, 0XD086, 0X4A25, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X22C4, 0X70E4, 0XB865, 0X9864, 0XC066,
+ 0X2365, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X5924, 0X9864,
+ 0XA865, 0XD086, 0X9864, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X3224, 0X22C4, 0X9864, 0XA865, 0XC066, 0X6985,
+ 0X0BA5, 0X0506, 0X0547, 0X0506, 0X32C5, 0XB865, 0XD086, 0XD086, 0XD086,
+ 0X80E5, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0C05, 0X4A25,
+ 0X80E5, 0XD086, 0XB865, 0X4A25, 0X0BA5, 0X22C4, 0X6985, 0X90A4, 0X9864,
+ 0X9864, 0X9864, 0X9044, 0XD086, 0XD086, 0XD086, 0XB865, 0X2305, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X04A6, 0X0547, 0X1B04,
+ 0XC066, 0XD086, 0XC066, 0X4285, 0X0506, 0X0547, 0X0547, 0X0547, 0X4A25,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0X59E5, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X7043, 0XA865,
+ 0XD086, 0XD086, 0XB865, 0X7043, 0X6843, 0X9864, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0X1B65, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0506, 0X32C5, 0X3264, 0X6985,
+ 0X59E5, 0X04A6, 0X0547, 0X4A25, 0XC066, 0X9864, 0XA865, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0X6985, 0X04A6,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0C66, 0X59E5, 0X6883, 0X9864, 0X9864, 0XD086, 0X98A5, 0X4285, 0X32C5,
+ 0X6944, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X2305, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0506, 0X32C5, 0X6985, 0X6944,
+ 0XC066, 0XC066, 0X9864, 0X9864, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XA865, 0X0506, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0506, 0X80E5, 0X9864,
+ 0X9864, 0XD086, 0XD086, 0XB865, 0X6985, 0X6985, 0X9044, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0X59E5, 0X0C05,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0506, 0X6985, 0XA865, 0XA865, 0XD086, 0XD086, 0XD086, 0X9864, 0XB865,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X6985,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X3264, 0X7145,
+ 0X6985, 0X9864, 0X9044, 0X9864, 0X9864, 0X9864, 0XA865, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X90A4, 0X6985, 0X4285,
+ 0X1BC5, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0445,
+ 0X2305, 0X04A6, 0X90A4, 0XC066, 0X9864, 0X9044, 0X9864, 0X9864, 0X9864,
+ 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X58E3, 0X3264,
+ 0X1B65, 0X0506, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X4224, 0X4224, 0X3264, 0X7043, 0X4A25, 0X32C5, 0X49C4,
+ 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0X7145, 0X1B65, 0X0506, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X04A6, 0X0547, 0X0547, 0X04A6, 0X80E5, 0XD086, 0XD086, 0XD086, 0XD086,
+ 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0X7145, 0X49C4, 0XB865, 0XD086,
+ 0XD086, 0XD086, 0X9044, 0X9864, 0X32C5, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0445, 0X5883, 0XA865, 0XD086, 0XD086,
+ 0XC066, 0X9864, 0X7145, 0X6985, 0X3264, 0X80E5, 0X7145, 0X32C5, 0X70E4,
+ 0XD086, 0XD086, 0XD086, 0X68E4, 0X4285, 0X04A6, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0405, 0X0547, 0X0547, 0X0547, 0X0506,
+ 0X6985, 0X9864, 0XD086, 0XD086, 0XA865, 0X9864, 0XD086, 0XD086, 0XD086,
+ 0XB865, 0X80E5, 0X80A4, 0XC066, 0XD086, 0XD086, 0X58E3, 0X32C5, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0C66, 0X90A4, 0XA865, 0XA865, 0XD086,
+ 0XD086, 0XD086, 0X6985, 0X0BA5, 0X0405, 0X22C4, 0X0C05, 0X0547, 0X0547,
+ 0X0C66, 0X7145, 0XC066, 0XD086, 0X70A4, 0X4285, 0X58E3, 0X0506, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X59E5, 0XA865, 0X9044,
+ 0X9864, 0X4A25, 0X0445, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X1B65, 0X98A5, 0XD086, 0X9044, 0X7145, 0X8044, 0X04A6,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X1BC5, 0X7145, 0X9864, 0XD086, 0X98A5, 0X2305, 0X0506, 0X0506, 0X32C5,
+ 0X6985, 0X32C5, 0X04A6, 0X0547, 0X0547, 0X0C05, 0X5984, 0XA865, 0X9864,
+ 0X9864, 0X32C5, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X49C4, 0X59E5, 0X22C4,
+ 0X70E4, 0X9864, 0X7145, 0X1B65, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0445, 0X0405, 0X0506, 0X0547, 0X0506,
+ 0X0506, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X2264,
+ 0X0506, 0X0506, 0X0445, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0506, 0X0405, 0X0445, 0X0547,
+ 0X0C66, 0X0445, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0506, 0X90A4, 0X80E5, 0X4224, 0X3224, 0X0506, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0405, 0X0547, 0X0506, 0X1A03, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0B64,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X04A6, 0X1BC5, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547,
+ 0X0547, 0X0547, 0X0547, 0X0547, 0X0547 };
+
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/pictureEmbed/pictureEmbed.ino b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/pictureEmbed/pictureEmbed.ino
new file mode 100644
index 000000000000..5c5475756d0e
--- /dev/null
+++ b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/pictureEmbed/pictureEmbed.ino
@@ -0,0 +1,69 @@
+// ILI9341 example with embedded color bitmaps in sketch.
+// WILL NOT FIT ON ARDUINO UNO OR OTHER AVR BOARDS;
+// uses large bitmap image stored in array!
+
+// Options for converting images to the format used here include:
+// http://www.rinkydinkelectronics.com/t_imageconverter565.php
+// or
+// GIMP (https://www.gimp.org/) as follows:
+// 1. File -> Export As
+// 2. In Export Image dialog, use 'C source code (*.c)' as filetype.
+// 3. Press export to get the export options dialog.
+// 4. Type the desired variable name into the 'prefixed name' box.
+// 5. Uncheck 'GLIB types (guint8*)'
+// 6. Check 'Save as RGB565 (16-bit)'
+// 7. Press export to save your image.
+// Assuming 'image_name' was typed in the 'prefixed name' box of step 4,
+// you can have to include the c file, then using the image can be done with:
+// tft.drawRGBBitmap(0, 0, image_name.pixel_data, image_name.width, image_name.height);
+// See also https://forum.pjrc.com/threads/35575-Export-for-ILI9341_t3-with-GIMP
+
+#include "SPI.h"
+#include
+#include "dragon.h"
+
+// For the Adafruit shield, these are the default.
+//#define TFT_DC 9
+//#define TFT_CS 10
+
+// Feather 32u4 or M0 with TFT FeatherWing:
+#define TFT_DC 10
+#define TFT_CS 9
+// ESP8266:
+//#define TFT_DC 15
+//#define TFT_CS 0
+// Other boards (including Feather boards) may have other pinouts;
+// see learn.adafruit.com/adafruit-2-4-tft-touch-screen-featherwing/pinouts
+
+Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
+// If using the breakout, change pins as desired
+//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
+
+void setup() {
+ tft.begin();
+}
+
+void loop(void) {
+ for(uint8_t r=0; r<4; r++) {
+ tft.setRotation(r);
+ tft.fillScreen(ILI9341_BLACK);
+ for(uint8_t j=0; j<20; j++) {
+ tft.drawRGBBitmap(
+ random(-DRAGON_WIDTH , tft.width()),
+ random(-DRAGON_HEIGHT, tft.height()),
+#if defined(__AVR__) || defined(ESP8266)
+ dragonBitmap,
+#else
+ // Some non-AVR MCU's have a "flat" memory model and don't
+ // distinguish between flash and RAM addresses. In this case,
+ // the RAM-resident-optimized drawRGBBitmap in the ILI9341
+ // library can be invoked by forcibly type-converting the
+ // PROGMEM bitmap pointer to a non-const uint16_t *.
+ (uint16_t *)dragonBitmap,
+#endif
+ DRAGON_WIDTH, DRAGON_HEIGHT);
+ delay(1); // Allow ESP8266 to handle watchdog & WiFi stuff
+ }
+ delay(3000);
+ }
+}
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/spitftbitmap/spitftbitmap.ino b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/spitftbitmap/spitftbitmap.ino
new file mode 100644
index 000000000000..7e2fedc5e979
--- /dev/null
+++ b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/spitftbitmap/spitftbitmap.ino
@@ -0,0 +1,218 @@
+/***************************************************
+ This is our Bitmap drawing example for the Adafruit ILI9341 Breakout and Shield
+ ----> http://www.adafruit.com/products/1651
+
+ Check out the links above for our tutorials and wiring diagrams
+ These displays use SPI to communicate, 4 or 5 pins are required to
+ interface (RST is optional)
+ Adafruit invests time and resources providing this open source code,
+ please support Adafruit and open-source hardware by purchasing
+ products from Adafruit!
+
+ Written by Limor Fried/Ladyada for Adafruit Industries.
+ MIT license, all text above must be included in any redistribution
+ ****************************************************/
+
+
+#include // Core graphics library
+#include "Adafruit_ILI9341.h" // Hardware-specific library
+#include
+#include
+
+// TFT display and SD card will share the hardware SPI interface.
+// Hardware SPI pins are specific to the Arduino board type and
+// cannot be remapped to alternate pins. For Arduino Uno,
+// Duemilanove, etc., pin 11 = MOSI, pin 12 = MISO, pin 13 = SCK.
+
+#define TFT_DC 9
+#define TFT_CS 10
+Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
+
+#define SD_CS 4
+
+void setup(void) {
+ Serial.begin(9600);
+
+ tft.begin();
+
+ yield();
+
+ Serial.print("Initializing SD card...");
+ if (!SD.begin(SD_CS)) {
+ Serial.println("failed!");
+ }
+ Serial.println("OK!");
+
+}
+
+void loop() {
+ for(uint8_t r=0; r<4; r++) {
+ tft.setRotation(r);
+ tft.fillScreen(ILI9341_BLUE);
+ for(int8_t i=-2; i<1; i++) {
+ bmpDraw("purple.bmp",
+ (tft.width() / 2) + (i * 120),
+ (tft.height() / 2) + (i * 160));
+ }
+ }
+}
+
+// This function opens a Windows Bitmap (BMP) file and
+// displays it at the given coordinates. It's sped up
+// by reading many pixels worth of data at a time
+// (rather than pixel by pixel). Increasing the buffer
+// size takes more of the Arduino's precious RAM but
+// makes loading a little faster. 20 pixels seems a
+// good balance.
+
+#define BUFFPIXEL 20
+
+void bmpDraw(char *filename, int16_t x, int16_t y) {
+
+ File bmpFile;
+ int bmpWidth, bmpHeight; // W+H in pixels
+ uint8_t bmpDepth; // Bit depth (currently must be 24)
+ uint32_t bmpImageoffset; // Start of image data in file
+ uint32_t rowSize; // Not always = bmpWidth; may have padding
+ uint8_t sdbuffer[3*BUFFPIXEL]; // pixel buffer (R+G+B per pixel)
+ uint8_t buffidx = sizeof(sdbuffer); // Current position in sdbuffer
+ boolean goodBmp = false; // Set to true on valid header parse
+ boolean flip = true; // BMP is stored bottom-to-top
+ int w, h, row, col, x2, y2, bx1, by1;
+ uint8_t r, g, b;
+ uint32_t pos = 0, startTime = millis();
+
+ if((x >= tft.width()) || (y >= tft.height())) return;
+
+ Serial.println();
+ Serial.print(F("Loading image '"));
+ Serial.print(filename);
+ Serial.println('\'');
+
+ // Open requested file on SD card
+ if ((bmpFile = SD.open(filename)) == NULL) {
+ Serial.print(F("File not found"));
+ return;
+ }
+
+ // Parse BMP header
+ if(read16(bmpFile) == 0x4D42) { // BMP signature
+ Serial.print(F("File size: ")); Serial.println(read32(bmpFile));
+ (void)read32(bmpFile); // Read & ignore creator bytes
+ bmpImageoffset = read32(bmpFile); // Start of image data
+ Serial.print(F("Image Offset: ")); Serial.println(bmpImageoffset, DEC);
+ // Read DIB header
+ Serial.print(F("Header size: ")); Serial.println(read32(bmpFile));
+ bmpWidth = read32(bmpFile);
+ bmpHeight = read32(bmpFile);
+ if(read16(bmpFile) == 1) { // # planes -- must be '1'
+ bmpDepth = read16(bmpFile); // bits per pixel
+ Serial.print(F("Bit Depth: ")); Serial.println(bmpDepth);
+ if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed
+
+ goodBmp = true; // Supported BMP format -- proceed!
+ Serial.print(F("Image size: "));
+ Serial.print(bmpWidth);
+ Serial.print('x');
+ Serial.println(bmpHeight);
+
+ // BMP rows are padded (if needed) to 4-byte boundary
+ rowSize = (bmpWidth * 3 + 3) & ~3;
+
+ // If bmpHeight is negative, image is in top-down order.
+ // This is not canon but has been observed in the wild.
+ if(bmpHeight < 0) {
+ bmpHeight = -bmpHeight;
+ flip = false;
+ }
+
+ // Crop area to be loaded
+ x2 = x + bmpWidth - 1; // Lower-right corner
+ y2 = y + bmpHeight - 1;
+ if((x2 >= 0) && (y2 >= 0)) { // On screen?
+ w = bmpWidth; // Width/height of section to load/display
+ h = bmpHeight;
+ bx1 = by1 = 0; // UL coordinate in BMP file
+ if(x < 0) { // Clip left
+ bx1 = -x;
+ x = 0;
+ w = x2 + 1;
+ }
+ if(y < 0) { // Clip top
+ by1 = -y;
+ y = 0;
+ h = y2 + 1;
+ }
+ if(x2 >= tft.width()) w = tft.width() - x; // Clip right
+ if(y2 >= tft.height()) h = tft.height() - y; // Clip bottom
+
+ // Set TFT address window to clipped image bounds
+ tft.startWrite(); // Requires start/end transaction now
+ tft.setAddrWindow(x, y, w, h);
+
+ for (row=0; row= sizeof(sdbuffer)) { // Indeed
+ tft.endWrite(); // End TFT transaction
+ bmpFile.read(sdbuffer, sizeof(sdbuffer));
+ buffidx = 0; // Set index to beginning
+ tft.startWrite(); // Start new TFT transaction
+ }
+ // Convert pixel from BMP to TFT format, push to display
+ b = sdbuffer[buffidx++];
+ g = sdbuffer[buffidx++];
+ r = sdbuffer[buffidx++];
+ tft.writePixel(tft.color565(r,g,b));
+ } // end pixel
+ } // end scanline
+ tft.endWrite(); // End last TFT transaction
+ } // end onscreen
+ Serial.print(F("Loaded in "));
+ Serial.print(millis() - startTime);
+ Serial.println(" ms");
+ } // end goodBmp
+ }
+ }
+
+ bmpFile.close();
+ if(!goodBmp) Serial.println(F("BMP format not recognized."));
+}
+
+// These read 16- and 32-bit types from the SD card file.
+// BMP data is stored little-endian, Arduino is little-endian too.
+// May need to reverse subscript order if porting elsewhere.
+
+uint16_t read16(File &f) {
+ uint16_t result;
+ ((uint8_t *)&result)[0] = f.read(); // LSB
+ ((uint8_t *)&result)[1] = f.read(); // MSB
+ return result;
+}
+
+uint32_t read32(File &f) {
+ uint32_t result;
+ ((uint8_t *)&result)[0] = f.read(); // LSB
+ ((uint8_t *)&result)[1] = f.read();
+ ((uint8_t *)&result)[2] = f.read();
+ ((uint8_t *)&result)[3] = f.read(); // MSB
+ return result;
+}
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/touchpaint/touchpaint.ino b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/touchpaint/touchpaint.ino
new file mode 100644
index 000000000000..227abdc84d74
--- /dev/null
+++ b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/touchpaint/touchpaint.ino
@@ -0,0 +1,146 @@
+/***************************************************
+ This is our touchscreen painting example for the Adafruit ILI9341 Shield
+ ----> http://www.adafruit.com/products/1651
+
+ Check out the links above for our tutorials and wiring diagrams
+ These displays use SPI to communicate, 4 or 5 pins are required to
+ interface (RST is optional)
+ Adafruit invests time and resources providing this open source code,
+ please support Adafruit and open-source hardware by purchasing
+ products from Adafruit!
+
+ Written by Limor Fried/Ladyada for Adafruit Industries.
+ MIT license, all text above must be included in any redistribution
+ ****************************************************/
+
+
+#include // Core graphics library
+#include
+#include // this is needed even tho we aren't using it
+#include
+#include
+
+// This is calibration data for the raw touch data to the screen coordinates
+#define TS_MINX 150
+#define TS_MINY 130
+#define TS_MAXX 3800
+#define TS_MAXY 4000
+
+// The STMPE610 uses hardware SPI on the shield, and #8
+#define STMPE_CS 8
+Adafruit_STMPE610 ts = Adafruit_STMPE610(STMPE_CS);
+
+// The display also uses hardware SPI, plus #9 & #10
+#define TFT_CS 10
+#define TFT_DC 9
+Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
+
+// Size of the color selection boxes and the paintbrush size
+#define BOXSIZE 40
+#define PENRADIUS 3
+int oldcolor, currentcolor;
+
+void setup(void) {
+ // while (!Serial); // used for leonardo debugging
+
+ Serial.begin(9600);
+ Serial.println(F("Touch Paint!"));
+
+ tft.begin();
+
+ if (!ts.begin()) {
+ Serial.println("Couldn't start touchscreen controller");
+ while (1);
+ }
+ Serial.println("Touchscreen started");
+
+ tft.fillScreen(ILI9341_BLACK);
+
+ // make the color selection boxes
+ tft.fillRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_RED);
+ tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_YELLOW);
+ tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_GREEN);
+ tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_CYAN);
+ tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_BLUE);
+ tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_MAGENTA);
+
+ // select the current color 'red'
+ tft.drawRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ currentcolor = ILI9341_RED;
+}
+
+
+void loop()
+{
+ // See if there's any touch data for us
+ if (ts.bufferEmpty()) {
+ return;
+ }
+ /*
+ // You can also wait for a touch
+ if (! ts.touched()) {
+ return;
+ }
+ */
+
+ // Retrieve a point
+ TS_Point p = ts.getPoint();
+
+ /*
+ Serial.print("X = "); Serial.print(p.x);
+ Serial.print("\tY = "); Serial.print(p.y);
+ Serial.print("\tPressure = "); Serial.println(p.z);
+ */
+
+ // Scale from ~0->4000 to tft.width using the calibration #'s
+ p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width());
+ p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());
+
+ /*
+ Serial.print("("); Serial.print(p.x);
+ Serial.print(", "); Serial.print(p.y);
+ Serial.println(")");
+ */
+
+ if (p.y < BOXSIZE) {
+ oldcolor = currentcolor;
+
+ if (p.x < BOXSIZE) {
+ currentcolor = ILI9341_RED;
+ tft.drawRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ } else if (p.x < BOXSIZE*2) {
+ currentcolor = ILI9341_YELLOW;
+ tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ } else if (p.x < BOXSIZE*3) {
+ currentcolor = ILI9341_GREEN;
+ tft.drawRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ } else if (p.x < BOXSIZE*4) {
+ currentcolor = ILI9341_CYAN;
+ tft.drawRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ } else if (p.x < BOXSIZE*5) {
+ currentcolor = ILI9341_BLUE;
+ tft.drawRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ } else if (p.x < BOXSIZE*6) {
+ currentcolor = ILI9341_MAGENTA;
+ tft.drawRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ }
+
+ if (oldcolor != currentcolor) {
+ if (oldcolor == ILI9341_RED)
+ tft.fillRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_RED);
+ if (oldcolor == ILI9341_YELLOW)
+ tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_YELLOW);
+ if (oldcolor == ILI9341_GREEN)
+ tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_GREEN);
+ if (oldcolor == ILI9341_CYAN)
+ tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_CYAN);
+ if (oldcolor == ILI9341_BLUE)
+ tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_BLUE);
+ if (oldcolor == ILI9341_MAGENTA)
+ tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_MAGENTA);
+ }
+ }
+ if (((p.y-PENRADIUS) > BOXSIZE) && ((p.y+PENRADIUS) < tft.height())) {
+ tft.fillCircle(p.x, p.y, PENRADIUS, currentcolor);
+ }
+}
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/touchpaint_featherwing/.mega2560.test.skip b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/touchpaint_featherwing/.mega2560.test.skip
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/touchpaint_featherwing/touchpaint_featherwing.ino b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/touchpaint_featherwing/touchpaint_featherwing.ino
new file mode 100644
index 000000000000..5d317abcd511
--- /dev/null
+++ b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/touchpaint_featherwing/touchpaint_featherwing.ino
@@ -0,0 +1,165 @@
+/***************************************************
+ This is our touchscreen painting example for the Adafruit TFT FeatherWing
+ ----> http://www.adafruit.com/products/3315
+
+ Check out the links above for our tutorials and wiring diagrams
+
+ Adafruit invests time and resources providing this open source code,
+ please support Adafruit and open-source hardware by purchasing
+ products from Adafruit!
+
+ Written by Limor Fried/Ladyada for Adafruit Industries.
+ MIT license, all text above must be included in any redistribution
+ ****************************************************/
+
+#include
+#include // this is needed even tho we aren't using it
+
+#include // Core graphics library
+#include // Hardware-specific library
+#include
+
+#ifdef ESP8266
+ #define STMPE_CS 16
+ #define TFT_CS 0
+ #define TFT_DC 15
+ #define SD_CS 2
+#endif
+#ifdef ESP32
+ #define STMPE_CS 32
+ #define TFT_CS 15
+ #define TFT_DC 33
+ #define SD_CS 14
+#endif
+#ifdef TEENSYDUINO
+ #define TFT_DC 10
+ #define TFT_CS 4
+ #define STMPE_CS 3
+ #define SD_CS 8
+#endif
+#ifdef ARDUINO_STM32_FEATHER
+ #define TFT_DC PB4
+ #define TFT_CS PA15
+ #define STMPE_CS PC7
+ #define SD_CS PC5
+#endif
+#ifdef ARDUINO_NRF52_FEATHER /* BSP 0.6.5 and higher! */
+ #define TFT_DC 11
+ #define TFT_CS 31
+ #define STMPE_CS 30
+ #define SD_CS 27
+#endif
+#if defined(ARDUINO_MAX32620FTHR) || defined(ARDUINO_MAX32630FTHR)
+ #define TFT_DC P5_4
+ #define TFT_CS P5_3
+ #define STMPE_CS P3_3
+ #define SD_CS P3_2
+#endif
+
+// Anything else!
+#if defined (__AVR_ATmega32U4__) || defined(ARDUINO_SAMD_FEATHER_M0) || defined (__AVR_ATmega328P__) || defined(ARDUINO_SAMD_ZERO) || defined(__SAMD51__) || defined(__SAM3X8E__)
+ #define STMPE_CS 6
+ #define TFT_CS 9
+ #define TFT_DC 10
+ #define SD_CS 5
+#endif
+
+
+Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
+Adafruit_STMPE610 ts = Adafruit_STMPE610(STMPE_CS);
+
+
+// This is calibration data for the raw touch data to the screen coordinates
+#define TS_MINX 3800
+#define TS_MAXX 100
+#define TS_MINY 100
+#define TS_MAXY 3750
+
+// Size of the color selection boxes and the paintbrush size
+#define BOXSIZE 40
+#define PENRADIUS 3
+int oldcolor, currentcolor;
+
+void setup(void) {
+ Serial.begin(115200);
+
+ delay(10);
+ Serial.println("FeatherWing TFT");
+ if (!ts.begin()) {
+ Serial.println("Couldn't start touchscreen controller");
+ while (1);
+ }
+ Serial.println("Touchscreen started");
+
+ tft.begin();
+ tft.fillScreen(ILI9341_BLACK);
+
+ // make the color selection boxes
+ tft.fillRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_RED);
+ tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_YELLOW);
+ tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_GREEN);
+ tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_CYAN);
+ tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_BLUE);
+ tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_MAGENTA);
+
+ // select the current color 'red'
+ tft.drawRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ currentcolor = ILI9341_RED;
+}
+
+void loop() {
+ // Retrieve a point
+ TS_Point p = ts.getPoint();
+
+ Serial.print("X = "); Serial.print(p.x);
+ Serial.print("\tY = "); Serial.print(p.y);
+ Serial.print("\tPressure = "); Serial.println(p.z);
+
+
+ // Scale from ~0->4000 to tft.width using the calibration #'s
+ p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width());
+ p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());
+
+ if (p.y < BOXSIZE) {
+ oldcolor = currentcolor;
+
+ if (p.x < BOXSIZE) {
+ currentcolor = ILI9341_RED;
+ tft.drawRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ } else if (p.x < BOXSIZE*2) {
+ currentcolor = ILI9341_YELLOW;
+ tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ } else if (p.x < BOXSIZE*3) {
+ currentcolor = ILI9341_GREEN;
+ tft.drawRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ } else if (p.x < BOXSIZE*4) {
+ currentcolor = ILI9341_CYAN;
+ tft.drawRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ } else if (p.x < BOXSIZE*5) {
+ currentcolor = ILI9341_BLUE;
+ tft.drawRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ } else if (p.x < BOXSIZE*6) {
+ currentcolor = ILI9341_MAGENTA;
+ tft.drawRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
+ }
+
+ if (oldcolor != currentcolor) {
+ if (oldcolor == ILI9341_RED)
+ tft.fillRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_RED);
+ if (oldcolor == ILI9341_YELLOW)
+ tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_YELLOW);
+ if (oldcolor == ILI9341_GREEN)
+ tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_GREEN);
+ if (oldcolor == ILI9341_CYAN)
+ tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_CYAN);
+ if (oldcolor == ILI9341_BLUE)
+ tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_BLUE);
+ if (oldcolor == ILI9341_MAGENTA)
+ tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_MAGENTA);
+ }
+ }
+
+ if (((p.y-PENRADIUS) > 0) && ((p.y+PENRADIUS) < tft.height())) {
+ tft.fillCircle(p.x, p.y, PENRADIUS, currentcolor);
+ }
+}
diff --git a/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/library.properties b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/library.properties
new file mode 100644
index 000000000000..8c93d49eec60
--- /dev/null
+++ b/lib/Adafruit_ILI9341-1.2.0-Tasmota-1.0/library.properties
@@ -0,0 +1,9 @@
+name=Adafruit ILI9341
+version=1.2.0
+author=Adafruit
+maintainer=Adafruit
+sentence=Library for Adafruit ILI9341 displays
+paragraph=Library for Adafruit ILI9341 displays
+category=Display
+url=https://github.com/adafruit/Adafruit_ILI9341
+architectures=*
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/Adafruit_LEDBackpack.cpp b/lib/Adafruit_LED_Backpack-1.1.6/Adafruit_LEDBackpack.cpp
new file mode 100644
index 000000000000..fd703917307b
--- /dev/null
+++ b/lib/Adafruit_LED_Backpack-1.1.6/Adafruit_LEDBackpack.cpp
@@ -0,0 +1,672 @@
+/***************************************************
+ This is a library for our I2C LED Backpacks
+
+ Designed specifically to work with the Adafruit LED Matrix backpacks
+ ----> http://www.adafruit.com/products/
+ ----> http://www.adafruit.com/products/
+
+ These displays use I2C to communicate, 2 pins are required to
+ interface. There are multiple selectable I2C addresses. For backpacks
+ with 2 Address Select pins: 0x70, 0x71, 0x72 or 0x73. For backpacks
+ with 3 Address Select pins: 0x70 thru 0x77
+
+ Adafruit invests time and resources providing this open source code,
+ please support Adafruit and open-source hardware by purchasing
+ products from Adafruit!
+
+ Written by Limor Fried/Ladyada for Adafruit Industries.
+ MIT license, all text above must be included in any redistribution
+ ****************************************************/
+
+#include
+
+#include "Adafruit_LEDBackpack.h"
+#include "Adafruit_GFX.h"
+
+#ifndef _BV
+ #define _BV(bit) (1<<(bit))
+#endif
+
+#ifndef _swap_int16_t
+#define _swap_int16_t(a, b) { int16_t t = a; a = b; b = t; }
+#endif
+
+static const uint8_t numbertable[] = {
+ 0x3F, /* 0 */
+ 0x06, /* 1 */
+ 0x5B, /* 2 */
+ 0x4F, /* 3 */
+ 0x66, /* 4 */
+ 0x6D, /* 5 */
+ 0x7D, /* 6 */
+ 0x07, /* 7 */
+ 0x7F, /* 8 */
+ 0x6F, /* 9 */
+ 0x77, /* a */
+ 0x7C, /* b */
+ 0x39, /* C */
+ 0x5E, /* d */
+ 0x79, /* E */
+ 0x71, /* F */
+};
+
+static const uint16_t alphafonttable[] PROGMEM = {
+
+0b0000000000000001,
+0b0000000000000010,
+0b0000000000000100,
+0b0000000000001000,
+0b0000000000010000,
+0b0000000000100000,
+0b0000000001000000,
+0b0000000010000000,
+0b0000000100000000,
+0b0000001000000000,
+0b0000010000000000,
+0b0000100000000000,
+0b0001000000000000,
+0b0010000000000000,
+0b0100000000000000,
+0b1000000000000000,
+0b0000000000000000,
+0b0000000000000000,
+0b0000000000000000,
+0b0000000000000000,
+0b0000000000000000,
+0b0000000000000000,
+0b0000000000000000,
+0b0000000000000000,
+0b0001001011001001,
+0b0001010111000000,
+0b0001001011111001,
+0b0000000011100011,
+0b0000010100110000,
+0b0001001011001000,
+0b0011101000000000,
+0b0001011100000000,
+0b0000000000000000, //
+0b0000000000000110, // !
+0b0000001000100000, // "
+0b0001001011001110, // #
+0b0001001011101101, // $
+0b0000110000100100, // %
+0b0010001101011101, // &
+0b0000010000000000, // '
+0b0010010000000000, // (
+0b0000100100000000, // )
+0b0011111111000000, // *
+0b0001001011000000, // +
+0b0000100000000000, // ,
+0b0000000011000000, // -
+0b0000000000000000, // .
+0b0000110000000000, // /
+0b0000110000111111, // 0
+0b0000000000000110, // 1
+0b0000000011011011, // 2
+0b0000000010001111, // 3
+0b0000000011100110, // 4
+0b0010000001101001, // 5
+0b0000000011111101, // 6
+0b0000000000000111, // 7
+0b0000000011111111, // 8
+0b0000000011101111, // 9
+0b0001001000000000, // :
+0b0000101000000000, // ;
+0b0010010000000000, // <
+0b0000000011001000, // =
+0b0000100100000000, // >
+0b0001000010000011, // ?
+0b0000001010111011, // @
+0b0000000011110111, // A
+0b0001001010001111, // B
+0b0000000000111001, // C
+0b0001001000001111, // D
+0b0000000011111001, // E
+0b0000000001110001, // F
+0b0000000010111101, // G
+0b0000000011110110, // H
+0b0001001000000000, // I
+0b0000000000011110, // J
+0b0010010001110000, // K
+0b0000000000111000, // L
+0b0000010100110110, // M
+0b0010000100110110, // N
+0b0000000000111111, // O
+0b0000000011110011, // P
+0b0010000000111111, // Q
+0b0010000011110011, // R
+0b0000000011101101, // S
+0b0001001000000001, // T
+0b0000000000111110, // U
+0b0000110000110000, // V
+0b0010100000110110, // W
+0b0010110100000000, // X
+0b0001010100000000, // Y
+0b0000110000001001, // Z
+0b0000000000111001, // [
+0b0010000100000000, //
+0b0000000000001111, // ]
+0b0000110000000011, // ^
+0b0000000000001000, // _
+0b0000000100000000, // `
+0b0001000001011000, // a
+0b0010000001111000, // b
+0b0000000011011000, // c
+0b0000100010001110, // d
+0b0000100001011000, // e
+0b0000000001110001, // f
+0b0000010010001110, // g
+0b0001000001110000, // h
+0b0001000000000000, // i
+0b0000000000001110, // j
+0b0011011000000000, // k
+0b0000000000110000, // l
+0b0001000011010100, // m
+0b0001000001010000, // n
+0b0000000011011100, // o
+0b0000000101110000, // p
+0b0000010010000110, // q
+0b0000000001010000, // r
+0b0010000010001000, // s
+0b0000000001111000, // t
+0b0000000000011100, // u
+0b0010000000000100, // v
+0b0010100000010100, // w
+0b0010100011000000, // x
+0b0010000000001100, // y
+0b0000100001001000, // z
+0b0000100101001001, // {
+0b0001001000000000, // |
+0b0010010010001001, // }
+0b0000010100100000, // ~
+0b0011111111111111,
+
+};
+void Adafruit_LEDBackpack::setBrightness(uint8_t b) {
+ if (b > 15) b = 15;
+ Wire.beginTransmission(i2c_addr);
+ Wire.write(HT16K33_CMD_BRIGHTNESS | b);
+ Wire.endTransmission();
+}
+
+void Adafruit_LEDBackpack::blinkRate(uint8_t b) {
+ Wire.beginTransmission(i2c_addr);
+ if (b > 3) b = 0; // turn off if not sure
+
+ Wire.write(HT16K33_BLINK_CMD | HT16K33_BLINK_DISPLAYON | (b << 1));
+ Wire.endTransmission();
+}
+
+Adafruit_LEDBackpack::Adafruit_LEDBackpack(void) {
+}
+
+void Adafruit_LEDBackpack::begin(uint8_t _addr = 0x70) {
+ i2c_addr = _addr;
+
+ Wire.begin();
+
+ Wire.beginTransmission(i2c_addr);
+ Wire.write(0x21); // turn on oscillator
+ Wire.endTransmission();
+ blinkRate(HT16K33_BLINK_OFF);
+
+ setBrightness(15); // max brightness
+}
+
+void Adafruit_LEDBackpack::writeDisplay(void) {
+ Wire.beginTransmission(i2c_addr);
+ Wire.write((uint8_t)0x00); // start at address $00
+
+ for (uint8_t i=0; i<8; i++) {
+ Wire.write(displaybuffer[i] & 0xFF);
+ Wire.write(displaybuffer[i] >> 8);
+ }
+ Wire.endTransmission();
+}
+
+void Adafruit_LEDBackpack::clear(void) {
+ for (uint8_t i=0; i<8; i++) {
+ displaybuffer[i] = 0;
+ }
+}
+
+/******************************* QUAD ALPHANUM OBJECT */
+
+Adafruit_AlphaNum4::Adafruit_AlphaNum4(void) {
+
+}
+
+void Adafruit_AlphaNum4::writeDigitRaw(uint8_t n, uint16_t bitmask) {
+ displaybuffer[n] = bitmask;
+}
+
+void Adafruit_AlphaNum4::writeDigitAscii(uint8_t n, uint8_t a, boolean d) {
+ uint16_t font = pgm_read_word(alphafonttable+a);
+
+ displaybuffer[n] = font;
+
+ /*
+ Serial.print(a, DEC);
+ Serial.print(" / '"); Serial.write(a);
+ Serial.print("' = 0x"); Serial.println(font, HEX);
+ */
+
+ if (d) displaybuffer[n] |= (1<<14);
+}
+
+/******************************* 24 BARGRAPH OBJECT */
+
+Adafruit_24bargraph::Adafruit_24bargraph(void) {
+
+}
+
+void Adafruit_24bargraph::setBar(uint8_t bar, uint8_t color) {
+ uint16_t a, c;
+
+ if (bar < 12)
+ c = bar / 4;
+ else
+ c = (bar - 12) / 4;
+
+ a = bar % 4;
+ if (bar >= 12)
+ a += 4;
+
+ //Serial.print("Ano = "); Serial.print(a); Serial.print(" Cath = "); Serial.println(c);
+ if (color == LED_RED) {
+ // Turn on red LED.
+ displaybuffer[c] |= _BV(a);
+ // Turn off green LED.
+ displaybuffer[c] &= ~_BV(a+8);
+ } else if (color == LED_YELLOW) {
+ // Turn on red and green LED.
+ displaybuffer[c] |= _BV(a) | _BV(a+8);
+ } else if (color == LED_OFF) {
+ // Turn off red and green LED.
+ displaybuffer[c] &= ~_BV(a) & ~_BV(a+8);
+ } else if (color == LED_GREEN) {
+ // Turn on green LED.
+ displaybuffer[c] |= _BV(a+8);
+ // Turn off red LED.
+ displaybuffer[c] &= ~_BV(a);
+ }
+}
+
+
+/******************************* 16x8 MATRIX OBJECT */
+
+Adafruit_8x16matrix::Adafruit_8x16matrix(void) : Adafruit_GFX(8, 16) {
+}
+
+void Adafruit_8x16matrix::drawPixel(int16_t x, int16_t y, uint16_t color) {
+
+ // check rotation, move pixel around if necessary
+ switch (getRotation()) {
+ case 2:
+ _swap_int16_t(x, y);
+ x = 16 - x - 1;
+ break;
+ case 3:
+ x = 16 - x - 1;
+ y = 8 - y - 1;
+ break;
+ case 0:
+ _swap_int16_t(x, y);
+ y = 8 - y - 1;
+ break;
+ }
+ /*
+ Serial.print("("); Serial.print(x);
+ Serial.print(","); Serial.print(y);
+ Serial.println(")");
+ */
+
+ if ((y < 0) || (y >= 8)) return;
+ if ((x < 0) || (x >= 16)) return;
+
+ if (color) {
+ displaybuffer[y] |= 1 << x;
+ } else {
+ displaybuffer[y] &= ~(1 << x);
+ }
+}
+
+/******************************* 16x8 MINI MATRIX OBJECT */
+
+Adafruit_8x16minimatrix::Adafruit_8x16minimatrix(void) : Adafruit_GFX(8, 16) {
+}
+
+void Adafruit_8x16minimatrix::drawPixel(int16_t x, int16_t y, uint16_t color) {
+
+ if ((y < 0) || (x < 0)) return;
+ if ((getRotation() % 2 == 0) && ((y >= 16) || (x >= 8))) return;
+ if ((getRotation() % 2 == 1) && ((x >= 16) || (y >= 8))) return;
+
+
+ // check rotation, move pixel around if necessary
+ switch (getRotation()) {
+ case 2:
+ if (y >= 8) {
+ x += 8;
+ y -= 8;
+ }
+ _swap_int16_t(x, y);
+ break;
+ case 3:
+ x = 16 - x - 1;
+ if (x >= 8) {
+ x -= 8;
+ y += 8;
+ }
+ break;
+ case 0:
+ y = 16 - y - 1;
+ x = 8 - x - 1;
+ if (y >= 8) {
+ x += 8;
+ y -= 8;
+ }
+ _swap_int16_t(x, y);
+ break;
+ case 1:
+ y = 8 - y - 1;
+ if (x >= 8) {
+ x -= 8;
+ y += 8;
+ }
+ break;
+ }
+
+ if (color) {
+ displaybuffer[x] |= 1 << y;
+ } else {
+ displaybuffer[x] &= ~(1 << y);
+ }
+}
+
+/******************************* 8x8 MATRIX OBJECT */
+
+Adafruit_8x8matrix::Adafruit_8x8matrix(void) : Adafruit_GFX(8, 8) {
+}
+
+void Adafruit_8x8matrix::drawPixel(int16_t x, int16_t y, uint16_t color) {
+ if ((y < 0) || (y >= 8)) return;
+ if ((x < 0) || (x >= 8)) return;
+
+ // check rotation, move pixel around if necessary
+ switch (getRotation()) {
+ case 1:
+ _swap_int16_t(x, y);
+ x = 8 - x - 1;
+ break;
+ case 2:
+ x = 8 - x - 1;
+ y = 8 - y - 1;
+ break;
+ case 3:
+ _swap_int16_t(x, y);
+ y = 8 - y - 1;
+ break;
+ }
+
+ // wrap around the x
+ x += 7;
+ x %= 8;
+
+
+ if (color) {
+ displaybuffer[y] |= 1 << x;
+ } else {
+ displaybuffer[y] &= ~(1 << x);
+ }
+}
+
+/******************************* 8x8 BICOLOR MATRIX OBJECT */
+
+Adafruit_BicolorMatrix::Adafruit_BicolorMatrix(void) : Adafruit_GFX(8, 8) {
+}
+
+void Adafruit_BicolorMatrix::drawPixel(int16_t x, int16_t y, uint16_t color) {
+ if ((y < 0) || (y >= 8)) return;
+ if ((x < 0) || (x >= 8)) return;
+
+ switch (getRotation()) {
+ case 1:
+ _swap_int16_t(x, y);
+ x = 8 - x - 1;
+ break;
+ case 2:
+ x = 8 - x - 1;
+ y = 8 - y - 1;
+ break;
+ case 3:
+ _swap_int16_t(x, y);
+ y = 8 - y - 1;
+ break;
+ }
+
+ if (color == LED_GREEN) {
+ // Turn on green LED.
+ displaybuffer[y] |= 1 << x;
+ // Turn off red LED.
+ displaybuffer[y] &= ~(1 << (x+8));
+ } else if (color == LED_RED) {
+ // Turn on red LED.
+ displaybuffer[y] |= 1 << (x+8);
+ // Turn off green LED.
+ displaybuffer[y] &= ~(1 << x);
+ } else if (color == LED_YELLOW) {
+ // Turn on green and red LED.
+ displaybuffer[y] |= (1 << (x+8)) | (1 << x);
+ } else if (color == LED_OFF) {
+ // Turn off green and red LED.
+ displaybuffer[y] &= ~(1 << x) & ~(1 << (x+8));
+ }
+}
+
+/******************************* 7 SEGMENT OBJECT */
+
+Adafruit_7segment::Adafruit_7segment(void) {
+ position = 0;
+}
+
+void Adafruit_7segment::print(unsigned long n, int base)
+{
+ if (base == 0) write(n);
+ else printNumber(n, base);
+}
+
+void Adafruit_7segment::print(char c, int base)
+{
+ print((long) c, base);
+}
+
+void Adafruit_7segment::print(unsigned char b, int base)
+{
+ print((unsigned long) b, base);
+}
+
+void Adafruit_7segment::print(int n, int base)
+{
+ print((long) n, base);
+}
+
+void Adafruit_7segment::print(unsigned int n, int base)
+{
+ print((unsigned long) n, base);
+}
+
+void Adafruit_7segment::println(void) {
+ position = 0;
+}
+
+void Adafruit_7segment::println(char c, int base)
+{
+ print(c, base);
+ println();
+}
+
+void Adafruit_7segment::println(unsigned char b, int base)
+{
+ print(b, base);
+ println();
+}
+
+void Adafruit_7segment::println(int n, int base)
+{
+ print(n, base);
+ println();
+}
+
+void Adafruit_7segment::println(unsigned int n, int base)
+{
+ print(n, base);
+ println();
+}
+
+void Adafruit_7segment::println(long n, int base)
+{
+ print(n, base);
+ println();
+}
+
+void Adafruit_7segment::println(unsigned long n, int base)
+{
+ print(n, base);
+ println();
+}
+
+void Adafruit_7segment::println(double n, int digits)
+{
+ print(n, digits);
+ println();
+}
+
+void Adafruit_7segment::print(double n, int digits)
+{
+ printFloat(n, digits);
+}
+
+
+size_t Adafruit_7segment::write(uint8_t c) {
+
+ uint8_t r = 0;
+
+ if (c == '\n') position = 0;
+ if (c == '\r') position = 0;
+
+ if ((c >= '0') && (c <= '9')) {
+ writeDigitNum(position, c-'0');
+ r = 1;
+ }
+
+ position++;
+ if (position == 2) position++;
+
+ return r;
+}
+
+void Adafruit_7segment::writeDigitRaw(uint8_t d, uint8_t bitmask) {
+ if (d > 4) return;
+ displaybuffer[d] = bitmask;
+}
+
+void Adafruit_7segment::drawColon(boolean state) {
+ if (state)
+ displaybuffer[2] = 0x2;
+ else
+ displaybuffer[2] = 0;
+}
+
+void Adafruit_7segment::writeColon(void) {
+ Wire.beginTransmission(i2c_addr);
+ Wire.write((uint8_t)0x04); // start at address $02
+
+ Wire.write(displaybuffer[2] & 0xFF);
+ Wire.write(displaybuffer[2] >> 8);
+
+ Wire.endTransmission();
+}
+
+void Adafruit_7segment::writeDigitNum(uint8_t d, uint8_t num, boolean dot) {
+ if (d > 4) return;
+
+ writeDigitRaw(d, numbertable[num] | (dot << 7));
+}
+
+void Adafruit_7segment::print(long n, int base)
+{
+ printNumber(n, base);
+}
+
+void Adafruit_7segment::printNumber(long n, uint8_t base)
+{
+ printFloat(n, 0, base);
+}
+
+void Adafruit_7segment::printFloat(double n, uint8_t fracDigits, uint8_t base)
+{
+ uint8_t numericDigits = 4; // available digits on display
+ boolean isNegative = false; // true if the number is negative
+
+ // is the number negative?
+ if(n < 0) {
+ isNegative = true; // need to draw sign later
+ --numericDigits; // the sign will take up one digit
+ n *= -1; // pretend the number is positive
+ }
+
+ // calculate the factor required to shift all fractional digits
+ // into the integer part of the number
+ double toIntFactor = 1.0;
+ for(int i = 0; i < fracDigits; ++i) toIntFactor *= base;
+
+ // create integer containing digits to display by applying
+ // shifting factor and rounding adjustment
+ uint32_t displayNumber = n * toIntFactor + 0.5;
+
+ // calculate upper bound on displayNumber given
+ // available digits on display
+ uint32_t tooBig = 1;
+ for(int i = 0; i < numericDigits; ++i) tooBig *= base;
+
+ // if displayNumber is too large, try fewer fractional digits
+ while(displayNumber >= tooBig) {
+ --fracDigits;
+ toIntFactor /= base;
+ displayNumber = n * toIntFactor + 0.5;
+ }
+
+ // did toIntFactor shift the decimal off the display?
+ if (toIntFactor < 1) {
+ printError();
+ } else {
+ // otherwise, display the number
+ int8_t displayPos = 4;
+
+ if (displayNumber) //if displayNumber is not 0
+ {
+ for(uint8_t i = 0; displayNumber || i <= fracDigits; ++i) {
+ boolean displayDecimal = (fracDigits != 0 && i == fracDigits);
+ writeDigitNum(displayPos--, displayNumber % base, displayDecimal);
+ if(displayPos == 2) writeDigitRaw(displayPos--, 0x00);
+ displayNumber /= base;
+ }
+ }
+ else {
+ writeDigitNum(displayPos--, 0, false);
+ }
+
+ // display negative sign if negative
+ if(isNegative) writeDigitRaw(displayPos--, 0x40);
+
+ // clear remaining display positions
+ while(displayPos >= 0) writeDigitRaw(displayPos--, 0x00);
+ }
+}
+
+void Adafruit_7segment::printError(void) {
+ for(uint8_t i = 0; i < SEVENSEG_DIGITS; ++i) {
+ writeDigitRaw(i, (i == 2 ? 0x00 : 0x40));
+ }
+}
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/Adafruit_LEDBackpack.h b/lib/Adafruit_LED_Backpack-1.1.6/Adafruit_LEDBackpack.h
new file mode 100644
index 000000000000..7b468f305696
--- /dev/null
+++ b/lib/Adafruit_LED_Backpack-1.1.6/Adafruit_LEDBackpack.h
@@ -0,0 +1,171 @@
+/***************************************************
+ This is a library for our I2C LED Backpacks
+
+ Designed specifically to work with the Adafruit LED Matrix backpacks
+ ----> http://www.adafruit.com/products/
+ ----> http://www.adafruit.com/products/
+
+ These displays use I2C to communicate, 2 pins are required to
+ interface. There are multiple selectable I2C addresses. For backpacks
+ with 2 Address Select pins: 0x70, 0x71, 0x72 or 0x73. For backpacks
+ with 3 Address Select pins: 0x70 thru 0x77
+
+ Adafruit invests time and resources providing this open source code,
+ please support Adafruit and open-source hardware by purchasing
+ products from Adafruit!
+
+ Written by Limor Fried/Ladyada for Adafruit Industries.
+ MIT license, all text above must be included in any redistribution
+ ****************************************************/
+#ifndef Adafruit_LEDBackpack_h
+#define Adafruit_LEDBackpack_h
+
+#if (ARDUINO >= 100)
+ #include "Arduino.h"
+#else
+ #include "WProgram.h"
+#endif
+
+
+ #include
+
+#include "Adafruit_GFX.h"
+
+#define LED_ON 1
+#define LED_OFF 0
+
+#define LED_RED 1
+#define LED_YELLOW 2
+#define LED_GREEN 3
+
+
+
+#define HT16K33_BLINK_CMD 0x80
+#define HT16K33_BLINK_DISPLAYON 0x01
+#define HT16K33_BLINK_OFF 0
+#define HT16K33_BLINK_2HZ 1
+#define HT16K33_BLINK_1HZ 2
+#define HT16K33_BLINK_HALFHZ 3
+
+#define HT16K33_CMD_BRIGHTNESS 0xE0
+
+#define SEVENSEG_DIGITS 5
+
+
+// this is the raw HT16K33 controller
+class Adafruit_LEDBackpack {
+ public:
+ Adafruit_LEDBackpack(void);
+ void begin(uint8_t _addr);
+ void setBrightness(uint8_t b);
+ void blinkRate(uint8_t b);
+ void writeDisplay(void);
+ void clear(void);
+
+ uint16_t displaybuffer[8];
+
+ void init(uint8_t a);
+ protected:
+ uint8_t i2c_addr;
+};
+
+class Adafruit_AlphaNum4 : public Adafruit_LEDBackpack {
+ public:
+ Adafruit_AlphaNum4(void);
+
+ void writeDigitRaw(uint8_t n, uint16_t bitmask);
+ void writeDigitAscii(uint8_t n, uint8_t ascii, boolean dot = false);
+
+ private:
+
+
+};
+
+class Adafruit_24bargraph : public Adafruit_LEDBackpack {
+ public:
+ Adafruit_24bargraph(void);
+
+ void setBar(uint8_t bar, uint8_t color);
+
+ private:
+};
+
+
+class Adafruit_8x16matrix : public Adafruit_LEDBackpack, public Adafruit_GFX {
+ public:
+ Adafruit_8x16matrix(void);
+
+ void drawPixel(int16_t x, int16_t y, uint16_t color);
+
+ private:
+};
+
+class Adafruit_8x16minimatrix : public Adafruit_LEDBackpack, public Adafruit_GFX {
+ public:
+ Adafruit_8x16minimatrix(void);
+
+ void drawPixel(int16_t x, int16_t y, uint16_t color);
+
+ private:
+};
+
+class Adafruit_8x8matrix : public Adafruit_LEDBackpack, public Adafruit_GFX {
+ public:
+ Adafruit_8x8matrix(void);
+
+ void drawPixel(int16_t x, int16_t y, uint16_t color);
+
+ private:
+};
+
+class Adafruit_BicolorMatrix : public Adafruit_LEDBackpack, public Adafruit_GFX {
+ public:
+ Adafruit_BicolorMatrix(void);
+
+ void drawPixel(int16_t x, int16_t y, uint16_t color);
+
+ private:
+};
+
+
+#define DEC 10
+#define HEX 16
+#define OCT 8
+#define BIN 2
+#define BYTE 0
+
+class Adafruit_7segment : public Adafruit_LEDBackpack {
+ public:
+ Adafruit_7segment(void);
+ size_t write(uint8_t c);
+
+ void print(char, int = BYTE);
+ void print(unsigned char, int = BYTE);
+ void print(int, int = DEC);
+ void print(unsigned int, int = DEC);
+ void print(long, int = DEC);
+ void print(unsigned long, int = DEC);
+ void print(double, int = 2);
+ void println(char, int = BYTE);
+ void println(unsigned char, int = BYTE);
+ void println(int, int = DEC);
+ void println(unsigned int, int = DEC);
+ void println(long, int = DEC);
+ void println(unsigned long, int = DEC);
+ void println(double, int = 2);
+ void println(void);
+
+ void writeDigitRaw(uint8_t x, uint8_t bitmask);
+ void writeDigitNum(uint8_t x, uint8_t num, boolean dot = false);
+ void drawColon(boolean state);
+ void printNumber(long, uint8_t = 2);
+ void printFloat(double, uint8_t = 2, uint8_t = DEC);
+ void printError(void);
+
+ void writeColon(void);
+
+ private:
+ uint8_t position;
+};
+#endif // Adafruit_LEDBackpack_h
+
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/README.md b/lib/Adafruit_LED_Backpack-1.1.6/README.md
new file mode 100644
index 000000000000..3834b6e1fda0
--- /dev/null
+++ b/lib/Adafruit_LED_Backpack-1.1.6/README.md
@@ -0,0 +1,30 @@
+# Adafruit-LED-Backpack-Library
+
+
+## Compatibility
+
+MCU | Tested Works | Doesn't Work | Not Tested | Notes
+----------------- | :----------: | :----------: | :---------: | -----
+Atmega328 @ 16MHz | X | | |
+Atmega328 @ 12MHz | X | | |
+Atmega32u4 @ 16MHz | X | | |
+Atmega32u4 @ 8MHz | X | | |
+ESP8266 | X | | |
+Atmega2560 @ 16MHz | X | | |
+ATSAM3X8E | X | | | Use SDA/SCL on pins 20 & 21
+ATSAM21D | X | | |
+ATtiny85 @ 16MHz | X | | | Use 0 for SDA, 2 for SCL, examples may need Serial references removed
+ATtiny85 @ 8MHz | X | | | Use 0 for SDA, 2 for SCL, examples may need Serial references removed
+
+ * ATmega328 @ 16MHz : Arduino UNO, Adafruit Pro Trinket 5V, Adafruit Metro 328, Adafruit Metro Mini
+ * ATmega328 @ 12MHz : Adafruit Pro Trinket 3V
+ * ATmega32u4 @ 16MHz : Arduino Leonardo, Arduino Micro, Arduino Yun, Teensy 2.0
+ * ATmega32u4 @ 8MHz : Adafruit Flora, Bluefruit Micro
+ * ESP8266 : Adafruit Huzzah
+ * ATmega2560 @ 16MHz : Arduino Mega
+ * ATSAM3X8E : Arduino Due
+ * ATSAM21D : Arduino Zero, M0 Pro
+ * ATtiny85 @ 16MHz : Adafruit Trinket 5V
+ * ATtiny85 @ 8MHz : Adafruit Gemma, Arduino Gemma, Adafruit Trinket 3V
+
+
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/README.txt b/lib/Adafruit_LED_Backpack-1.1.6/README.txt
new file mode 100644
index 000000000000..268d96a8c4e1
--- /dev/null
+++ b/lib/Adafruit_LED_Backpack-1.1.6/README.txt
@@ -0,0 +1,26 @@
+This is a library for the Adafruit LED Backpacks
+This library works with the Adafruit Mini 8x8 and 7-Segment LED Backpacks
+ ----> http://www.adafruit.com/products/881
+ ----> http://www.adafruit.com/products/880
+ ----> http://www.adafruit.com/products/879
+ ----> http://www.adafruit.com/products/878
+ ----> http://www.adafruit.com/products/872
+ ----> http://www.adafruit.com/products/871
+ ----> http://www.adafruit.com/products/870
+
+These displays use I2C to communicate, 2 pins are required to
+interface. There are multiple selectable I2C addresses. For backpacks
+with 2 Address Select pins: 0x70, 0x71, 0x72 or 0x73. For backpacks
+with 3 Address Select pins: 0x70 thru 0x77
+
+
+Written by Limor Fried/Ladyada for Adafruit Industries.
+MIT license, all text above must be included in any redistribution
+
+To download. click the DOWNLOADS button in the top right corner, rename the uncompressed folder Adafruit_LEDBackpack. Check that the Adafruit_LEDBackpack folder contains Adafruit_LEDBackpack.cpp and Adafruit_LEDBackpack.
+
+Place the Adafruit_LEDBackpack library folder your /libraries/ folder. You may need to create the libraries subfolder if its your first library. Restart the IDE
+
+**** Also requires the Adafruit_GFX library for Arduino. ****
+Download it from here:
+ https://github.com/adafruit/Adafruit-GFX-Library
\ No newline at end of file
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/examples/HT16K33/HT16K33.ino b/lib/Adafruit_LED_Backpack-1.1.6/examples/HT16K33/HT16K33.ino
new file mode 100644
index 000000000000..faf8247dd351
--- /dev/null
+++ b/lib/Adafruit_LED_Backpack-1.1.6/examples/HT16K33/HT16K33.ino
@@ -0,0 +1,55 @@
+/***************************************************
+ This is a library for our I2C LED Backpacks
+
+ Designed specifically to work with the Adafruit LED Matrix backpacks
+ ----> http://www.adafruit.com/products/872
+ ----> http://www.adafruit.com/products/871
+ ----> http://www.adafruit.com/products/870
+
+ These displays use I2C to communicate, 2 pins are required to
+ interface. There are multiple selectable I2C addresses. For backpacks
+ with 2 Address Select pins: 0x70, 0x71, 0x72 or 0x73. For backpacks
+ with 3 Address Select pins: 0x70 thru 0x77
+
+ Adafruit invests time and resources providing this open source code,
+ please support Adafruit and open-source hardware by purchasing
+ products from Adafruit!
+
+ Written by Limor Fried/Ladyada for Adafruit Industries.
+ BSD license, all text above must be included in any redistribution
+ ****************************************************/
+
+#include
+#include
+#include "Adafruit_LEDBackpack.h"
+
+#ifndef _BV
+ #define _BV(bit) (1<<(bit))
+#endif
+
+
+Adafruit_LEDBackpack matrix = Adafruit_LEDBackpack();
+
+uint8_t counter = 0;
+
+void setup() {
+ Serial.begin(9600);
+ Serial.println("HT16K33 test");
+
+ matrix.begin(0x70); // pass in the address
+}
+
+void loop() {
+ // paint one LED per row. The HT16K33 internal memory looks like
+ // a 8x16 bit matrix (8 rows, 16 columns)
+ for (uint8_t i=0; i<8; i++) {
+ // draw a diagonal row of pixels
+ matrix.displaybuffer[i] = _BV((counter+i) % 16) | _BV((counter+i+8) % 16) ;
+ }
+ // write the changes we just made to the display
+ matrix.writeDisplay();
+ delay(100);
+
+ counter++;
+ if (counter >= 16) counter = 0;
+}
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/examples/bargraph24/bargraph24.ino b/lib/Adafruit_LED_Backpack-1.1.6/examples/bargraph24/bargraph24.ino
new file mode 100644
index 000000000000..d9ed552e3abf
--- /dev/null
+++ b/lib/Adafruit_LED_Backpack-1.1.6/examples/bargraph24/bargraph24.ino
@@ -0,0 +1,65 @@
+/***************************************************
+ This is a library for our I2C LED Backpacks
+
+ Designed specifically to work with the Adafruit LED 24 Bargraph Backpack
+ ----> http://www.adafruit.com/products/721
+
+ These displays use I2C to communicate, 2 pins are required to
+ interface. There are multiple selectable I2C addresses. For backpacks
+ with 2 Address Select pins: 0x70, 0x71, 0x72 or 0x73. For backpacks
+ with 3 Address Select pins: 0x70 thru 0x77
+
+ Adafruit invests time and resources providing this open source code,
+ please support Adafruit and open-source hardware by purchasing
+ products from Adafruit!
+
+ Written by Limor Fried/Ladyada for Adafruit Industries.
+ BSD license, all text above must be included in any redistribution
+ ****************************************************/
+
+#include
+#include
+#include "Adafruit_LEDBackpack.h"
+
+Adafruit_24bargraph bar = Adafruit_24bargraph();
+
+void setup() {
+ Serial.begin(9600);
+ Serial.println("HT16K33 Bi-Color Bargraph test");
+
+ bar.begin(0x70); // pass in the address
+
+ for (uint8_t b=0; b<24; b++ ){
+ if ((b % 3) == 0) bar.setBar(b, LED_RED);
+ if ((b % 3) == 1) bar.setBar(b, LED_YELLOW);
+ if ((b % 3) == 2) bar.setBar(b, LED_GREEN);
+ }
+ bar.writeDisplay();
+ delay(2000);
+}
+
+
+void loop() {
+ for (uint8_t b=0; b<24; b++) {
+ bar.setBar(b, LED_RED);
+ bar.writeDisplay();
+ delay(50);
+ bar.setBar(b, LED_OFF);
+ bar.writeDisplay();
+ }
+ for (uint8_t b=0; b<24; b++) {
+ bar.setBar(b, LED_GREEN);
+ bar.writeDisplay();
+ delay(50);
+ bar.setBar(b, LED_OFF);
+ bar.writeDisplay();
+ }
+
+ for (uint8_t b=0; b<24; b++) {
+ bar.setBar(23-b, LED_YELLOW);
+ bar.writeDisplay();
+ delay(50);
+ bar.setBar(23-b, LED_OFF);
+ bar.writeDisplay();
+ }
+}
\ No newline at end of file
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/examples/bicolor8x8/bicolor8x8.pde b/lib/Adafruit_LED_Backpack-1.1.6/examples/bicolor8x8/bicolor8x8.pde
new file mode 100644
index 000000000000..01088032a4f9
--- /dev/null
+++ b/lib/Adafruit_LED_Backpack-1.1.6/examples/bicolor8x8/bicolor8x8.pde
@@ -0,0 +1,122 @@
+/***************************************************
+ This is a library for our I2C LED Backpacks
+
+ Designed specifically to work with the Adafruit LED Matrix backpacks
+ ----> http://www.adafruit.com/products/872
+ ----> http://www.adafruit.com/products/871
+ ----> http://www.adafruit.com/products/870
+
+ These displays use I2C to communicate, 2 pins are required to
+ interface. There are multiple selectable I2C addresses. For backpacks
+ with 2 Address Select pins: 0x70, 0x71, 0x72 or 0x73. For backpacks
+ with 3 Address Select pins: 0x70 thru 0x77
+
+ Adafruit invests time and resources providing this open source code,
+ please support Adafruit and open-source hardware by purchasing
+ products from Adafruit!
+
+ Written by Limor Fried/Ladyada for Adafruit Industries.
+ BSD license, all text above must be included in any redistribution
+ ****************************************************/
+
+#include
+#include
+#include "Adafruit_LEDBackpack.h"
+
+Adafruit_BicolorMatrix matrix = Adafruit_BicolorMatrix();
+
+void setup() {
+ Serial.begin(9600);
+ Serial.println("8x8 LED Matrix Test");
+
+ matrix.begin(0x70); // pass in the address
+}
+
+static const uint8_t PROGMEM
+ smile_bmp[] =
+ { B00111100,
+ B01000010,
+ B10100101,
+ B10000001,
+ B10100101,
+ B10011001,
+ B01000010,
+ B00111100 },
+ neutral_bmp[] =
+ { B00111100,
+ B01000010,
+ B10100101,
+ B10000001,
+ B10111101,
+ B10000001,
+ B01000010,
+ B00111100 },
+ frown_bmp[] =
+ { B00111100,
+ B01000010,
+ B10100101,
+ B10000001,
+ B10011001,
+ B10100101,
+ B01000010,
+ B00111100 };
+
+void loop() {
+
+ matrix.clear();
+ matrix.drawBitmap(0, 0, smile_bmp, 8, 8, LED_GREEN);
+ matrix.writeDisplay();
+ delay(500);
+
+ matrix.clear();
+ matrix.drawBitmap(0, 0, neutral_bmp, 8, 8, LED_YELLOW);
+ matrix.writeDisplay();
+ delay(500);
+
+ matrix.clear();
+ matrix.drawBitmap(0, 0, frown_bmp, 8, 8, LED_RED);
+ matrix.writeDisplay();
+ delay(500);
+
+ matrix.clear(); // clear display
+ matrix.drawPixel(0, 0, LED_GREEN);
+ matrix.writeDisplay(); // write the changes we just made to the display
+ delay(500);
+
+ matrix.clear();
+ matrix.drawLine(0,0, 7,7, LED_YELLOW);
+ matrix.writeDisplay(); // write the changes we just made to the display
+ delay(500);
+
+ matrix.clear();
+ matrix.drawRect(0,0, 8,8, LED_RED);
+ matrix.fillRect(2,2, 4,4, LED_GREEN);
+ matrix.writeDisplay(); // write the changes we just made to the display
+ delay(500);
+
+ matrix.clear();
+ matrix.drawCircle(3,3, 3, LED_YELLOW);
+ matrix.writeDisplay(); // write the changes we just made to the display
+ delay(500);
+
+ matrix.setTextWrap(false); // we dont want text to wrap so it scrolls nicely
+ matrix.setTextSize(1);
+ matrix.setTextColor(LED_GREEN);
+ for (int8_t x=7; x>=-36; x--) {
+ matrix.clear();
+ matrix.setCursor(x,0);
+ matrix.print("Hello");
+ matrix.writeDisplay();
+ delay(100);
+ }
+ matrix.setRotation(3);
+ matrix.setTextColor(LED_RED);
+ for (int8_t x=7; x>=-36; x--) {
+ matrix.clear();
+ matrix.setCursor(x,0);
+ matrix.print("World");
+ matrix.writeDisplay();
+ delay(100);
+ }
+ matrix.setRotation(0);
+}
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/examples/clock_sevenseg_ds1307/clock_sevenseg_ds1307.ino b/lib/Adafruit_LED_Backpack-1.1.6/examples/clock_sevenseg_ds1307/clock_sevenseg_ds1307.ino
new file mode 100644
index 000000000000..5ffb542c2432
--- /dev/null
+++ b/lib/Adafruit_LED_Backpack-1.1.6/examples/clock_sevenseg_ds1307/clock_sevenseg_ds1307.ino
@@ -0,0 +1,178 @@
+// Clock example using a seven segment display & DS1307 real-time clock.
+//
+// Must have the Adafruit RTClib library installed too! See:
+// https://github.com/adafruit/RTClib
+//
+// Designed specifically to work with the Adafruit LED 7-Segment backpacks
+// and DS1307 real-time clock breakout:
+// ----> http://www.adafruit.com/products/881
+// ----> http://www.adafruit.com/products/880
+// ----> http://www.adafruit.com/products/879
+// ----> http://www.adafruit.com/products/878
+// ----> https://www.adafruit.com/products/264
+//
+// Adafruit invests time and resources providing this open source code,
+// please support Adafruit and open-source hardware by purchasing
+// products from Adafruit!
+//
+// Written by Tony DiCola for Adafruit Industries.
+// Released under a MIT license: https://opensource.org/licenses/MIT
+
+#include
+#include
+#include
+#include "Adafruit_LEDBackpack.h"
+
+
+// Set to false to display time in 12 hour format, or true to use 24 hour:
+#define TIME_24_HOUR false
+
+// I2C address of the display. Stick with the default address of 0x70
+// unless you've changed the address jumpers on the back of the display.
+#define DISPLAY_ADDRESS 0x70
+
+
+// Create display and DS1307 objects. These are global variables that
+// can be accessed from both the setup and loop function below.
+Adafruit_7segment clockDisplay = Adafruit_7segment();
+RTC_DS1307 rtc = RTC_DS1307();
+
+// Keep track of the hours, minutes, seconds displayed by the clock.
+// Start off at 0:00:00 as a signal that the time should be read from
+// the DS1307 to initialize it.
+int hours = 0;
+int minutes = 0;
+int seconds = 0;
+
+// Remember if the colon was drawn on the display so it can be blinked
+// on and off every second.
+bool blinkColon = false;
+
+
+void setup() {
+ // Setup function runs once at startup to initialize the display
+ // and DS1307 clock.
+
+ // Setup Serial port to print debug output.
+ Serial.begin(115200);
+ Serial.println("Clock starting!");
+
+ // Setup the display.
+ clockDisplay.begin(DISPLAY_ADDRESS);
+
+ // Setup the DS1307 real-time clock.
+ rtc.begin();
+
+ // Set the DS1307 clock if it hasn't been set before.
+ bool setClockTime = !rtc.isrunning();
+ // Alternatively you can force the clock to be set again by
+ // uncommenting this line:
+ //setClockTime = true;
+ if (setClockTime) {
+ Serial.println("Setting DS1307 time!");
+ // This line sets the DS1307 time to the exact date and time the
+ // sketch was compiled:
+ rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
+ // Alternatively you can set the RTC with an explicit date & time,
+ // for example to set January 21, 2014 at 3am you would uncomment:
+ //rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
+ }
+}
+
+void loop() {
+ // Loop function runs over and over again to implement the clock logic.
+
+ // Check if it's the top of the hour and get a new time reading
+ // from the DS1307. This helps keep the clock accurate by fixing
+ // any drift.
+ if (minutes == 0) {
+ // Get the time from the DS1307.
+ DateTime now = rtc.now();
+ // Print out the time for debug purposes:
+ Serial.print("Read date & time from DS1307: ");
+ Serial.print(now.year(), DEC);
+ Serial.print('/');
+ Serial.print(now.month(), DEC);
+ Serial.print('/');
+ Serial.print(now.day(), DEC);
+ Serial.print(' ');
+ Serial.print(now.hour(), DEC);
+ Serial.print(':');
+ Serial.print(now.minute(), DEC);
+ Serial.print(':');
+ Serial.print(now.second(), DEC);
+ Serial.println();
+ // Now set the hours and minutes.
+ hours = now.hour();
+ minutes = now.minute();
+ }
+
+ // Show the time on the display by turning it into a numeric
+ // value, like 3:30 turns into 330, by multiplying the hour by
+ // 100 and then adding the minutes.
+ int displayValue = hours*100 + minutes;
+
+ // Do 24 hour to 12 hour format conversion when required.
+ if (!TIME_24_HOUR) {
+ // Handle when hours are past 12 by subtracting 12 hours (1200 value).
+ if (hours > 12) {
+ displayValue -= 1200;
+ }
+ // Handle hour 0 (midnight) being shown as 12.
+ else if (hours == 0) {
+ displayValue += 1200;
+ }
+ }
+
+ // Now print the time value to the display.
+ clockDisplay.print(displayValue, DEC);
+
+ // Add zero padding when in 24 hour mode and it's midnight.
+ // In this case the print function above won't have leading 0's
+ // which can look confusing. Go in and explicitly add these zeros.
+ if (TIME_24_HOUR && hours == 0) {
+ // Pad hour 0.
+ clockDisplay.writeDigitNum(1, 0);
+ // Also pad when the 10's minute is 0 and should be padded.
+ if (minutes < 10) {
+ clockDisplay.writeDigitNum(2, 0);
+ }
+ }
+
+ // Blink the colon by flipping its value every loop iteration
+ // (which happens every second).
+ blinkColon = !blinkColon;
+ clockDisplay.drawColon(blinkColon);
+
+ // Now push out to the display the new values that were set above.
+ clockDisplay.writeDisplay();
+
+ // Pause for a second for time to elapse. This value is in milliseconds
+ // so 1000 milliseconds = 1 second.
+ delay(1000);
+
+ // Now increase the seconds by one.
+ seconds += 1;
+ // If the seconds go above 59 then the minutes should increase and
+ // the seconds should wrap back to 0.
+ if (seconds > 59) {
+ seconds = 0;
+ minutes += 1;
+ // Again if the minutes go above 59 then the hour should increase and
+ // the minutes should wrap back to 0.
+ if (minutes > 59) {
+ minutes = 0;
+ hours += 1;
+ // Note that when the minutes are 0 (i.e. it's the top of a new hour)
+ // then the start of the loop will read the actual time from the DS1307
+ // again. Just to be safe though we'll also increment the hour and wrap
+ // back to 0 if it goes above 23 (i.e. past midnight).
+ if (hours > 23) {
+ hours = 0;
+ }
+ }
+ }
+
+ // Loop code is finished, it will jump back to the start of the loop
+ // function again!
+}
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/examples/clock_sevenseg_gps/clock_sevenseg_gps.ino b/lib/Adafruit_LED_Backpack-1.1.6/examples/clock_sevenseg_gps/clock_sevenseg_gps.ino
new file mode 100644
index 000000000000..a6054969cc3b
--- /dev/null
+++ b/lib/Adafruit_LED_Backpack-1.1.6/examples/clock_sevenseg_gps/clock_sevenseg_gps.ino
@@ -0,0 +1,159 @@
+// Clock example using a seven segment display & GPS for time.
+//
+// Must have the Adafruit GPS library installed too! See:
+// https://github.com/adafruit/Adafruit-GPS-Library
+//
+// Designed specifically to work with the Adafruit LED 7-Segment backpacks
+// and ultimate GPS breakout/shield:
+// ----> http://www.adafruit.com/products/881
+// ----> http://www.adafruit.com/products/880
+// ----> http://www.adafruit.com/products/879
+// ----> http://www.adafruit.com/products/878
+// ----> http://www.adafruit.com/products/746
+//
+// Adafruit invests time and resources providing this open source code,
+// please support Adafruit and open-source hardware by purchasing
+// products from Adafruit!
+//
+// Written by Tony DiCola for Adafruit Industries.
+// Released under a MIT license: https://opensource.org/licenses/MIT
+
+#include
+#include
+#include
+#include
+#include "Adafruit_LEDBackpack.h"
+
+
+// Set to false to display time in 12 hour format, or true to use 24 hour:
+#define TIME_24_HOUR false
+
+// Offset the hours from UTC (universal time) to your local time by changing
+// this value. The GPS time will be in UTC so lookup the offset for your
+// local time from a site like:
+// https://en.wikipedia.org/wiki/List_of_UTC_time_offsets
+// This value, -7, will set the time to UTC-7 or Pacific Standard Time during
+// daylight savings time.
+#define HOUR_OFFSET -7
+
+// I2C address of the display. Stick with the default address of 0x70
+// unless you've changed the address jumpers on the back of the display.
+#define DISPLAY_ADDRESS 0x70
+
+
+// Create display and GPS objects. These are global variables that
+// can be accessed from both the setup and loop function below.
+Adafruit_7segment clockDisplay = Adafruit_7segment();
+SoftwareSerial gpsSerial(8, 7); // GPS breakout/shield will use a
+ // software serial connection with
+ // TX = pin 8 and RX = pin 7.
+Adafruit_GPS gps(&gpsSerial);
+
+
+void setup() {
+ // Setup function runs once at startup to initialize the display and GPS.
+
+ // Setup Serial port to print debug output.
+ Serial.begin(115200);
+ Serial.println("Clock starting!");
+
+ // Setup the display.
+ clockDisplay.begin(DISPLAY_ADDRESS);
+
+ // Setup the GPS using a 9600 baud connection (the default for most
+ // GPS modules).
+ gps.begin(9600);
+
+ // Configure GPS to onlu output minimum data (location, time, fix).
+ gps.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);
+
+ // Use a 1 hz, once a second, update rate.
+ gps.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
+
+ // Enable the interrupt to parse GPS data.
+ enableGPSInterrupt();
+}
+
+void loop() {
+ // Loop function runs over and over again to implement the clock logic.
+
+ // Check if GPS has new data and parse it.
+ if (gps.newNMEAreceived()) {
+ gps.parse(gps.lastNMEA());
+ }
+
+ // Grab the current hours, minutes, seconds from the GPS.
+ // This will only be set once the GPS has a fix! Make sure to add
+ // a coin cell battery so the GPS will save the time between power-up/down.
+ int hours = gps.hour + HOUR_OFFSET; // Add hour offset to convert from UTC
+ // to local time.
+ // Handle when UTC + offset wraps around to a negative or > 23 value.
+ if (hours < 0) {
+ hours = 24+hours;
+ }
+ if (hours > 23) {
+ hours = 24-hours;
+ }
+ int minutes = gps.minute;
+ int seconds = gps.seconds;
+
+ // Show the time on the display by turning it into a numeric
+ // value, like 3:30 turns into 330, by multiplying the hour by
+ // 100 and then adding the minutes.
+ int displayValue = hours*100 + minutes;
+
+ // Do 24 hour to 12 hour format conversion when required.
+ if (!TIME_24_HOUR) {
+ // Handle when hours are past 12 by subtracting 12 hours (1200 value).
+ if (hours > 12) {
+ displayValue -= 1200;
+ }
+ // Handle hour 0 (midnight) being shown as 12.
+ else if (hours == 0) {
+ displayValue += 1200;
+ }
+ }
+
+ // Now print the time value to the display.
+ clockDisplay.print(displayValue, DEC);
+
+ // Add zero padding when in 24 hour mode and it's midnight.
+ // In this case the print function above won't have leading 0's
+ // which can look confusing. Go in and explicitly add these zeros.
+ if (TIME_24_HOUR && hours == 0) {
+ // Pad hour 0.
+ clockDisplay.writeDigitNum(1, 0);
+ // Also pad when the 10's minute is 0 and should be padded.
+ if (minutes < 10) {
+ clockDisplay.writeDigitNum(2, 0);
+ }
+ }
+
+ // Blink the colon by turning it on every even second and off
+ // every odd second. The modulus operator is very handy here to
+ // check if a value is even (modulus 2 equals 0) or odd (modulus 2
+ // equals 1).
+ clockDisplay.drawColon(seconds % 2 == 0);
+
+ // Now push out to the display the new values that were set above.
+ clockDisplay.writeDisplay();
+
+ // Loop code is finished, it will jump back to the start of the loop
+ // function again! Don't add any delays because the parsing needs to
+ // happen all the time!
+}
+
+SIGNAL(TIMER0_COMPA_vect) {
+ // Use a timer interrupt once a millisecond to check for new GPS data.
+ // This piggybacks on Arduino's internal clock timer for the millis()
+ // function.
+ gps.read();
+}
+
+void enableGPSInterrupt() {
+ // Function to enable the timer interrupt that will parse GPS data.
+ // Timer0 is already used for millis() - we'll just interrupt somewhere
+ // in the middle and call the "Compare A" function above
+ OCR0A = 0xAF;
+ TIMSK0 |= _BV(OCIE0A);
+}
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/examples/matrix16x8/matrix16x8.ino b/lib/Adafruit_LED_Backpack-1.1.6/examples/matrix16x8/matrix16x8.ino
new file mode 100644
index 000000000000..b724e1d19ae6
--- /dev/null
+++ b/lib/Adafruit_LED_Backpack-1.1.6/examples/matrix16x8/matrix16x8.ino
@@ -0,0 +1,133 @@
+/***************************************************
+ This is a library for our I2C LED Backpacks
+
+ Designed specifically to work with the Adafruit 16x8 LED Matrix backpacks
+ ----> http://www.adafruit.com/products/2035
+ ----> http://www.adafruit.com/products/2036
+ ----> http://www.adafruit.com/products/2037
+ ----> http://www.adafruit.com/products/2038
+ ----> http://www.adafruit.com/products/2039
+ ----> http://www.adafruit.com/products/2040
+ ----> http://www.adafruit.com/products/2041
+ ----> http://www.adafruit.com/products/2042
+ ----> http://www.adafruit.com/products/2043
+ ----> http://www.adafruit.com/products/2044
+ ----> http://www.adafruit.com/products/2052
+
+ These displays use I2C to communicate, 2 pins are required to
+ interface. There are multiple selectable I2C addresses. For backpacks
+ with 2 Address Select pins: 0x70, 0x71, 0x72 or 0x73. For backpacks
+ with 3 Address Select pins: 0x70 thru 0x77
+
+ Adafruit invests time and resources providing this open source code,
+ please support Adafruit and open-source hardware by purchasing
+ products from Adafruit!
+
+ Written by Limor Fried/Ladyada for Adafruit Industries.
+ BSD license, all text above must be included in any redistribution
+ ****************************************************/
+
+#include
+#include
+#include "Adafruit_LEDBackpack.h"
+
+Adafruit_8x16matrix matrix = Adafruit_8x16matrix();
+
+void setup() {
+ Serial.begin(9600);
+ Serial.println("16x8 LED Matrix Test");
+
+ matrix.begin(0x70); // pass in the address
+}
+
+static const uint8_t PROGMEM
+ smile_bmp[] =
+ { B00111100,
+ B01000010,
+ B10100101,
+ B10000001,
+ B10100101,
+ B10011001,
+ B01000010,
+ B00111100 },
+ neutral_bmp[] =
+ { B00111100,
+ B01000010,
+ B10100101,
+ B10000001,
+ B10111101,
+ B10000001,
+ B01000010,
+ B00111100 },
+ frown_bmp[] =
+ { B00111100,
+ B01000010,
+ B10100101,
+ B10000001,
+ B10011001,
+ B10100101,
+ B01000010,
+ B00111100 };
+
+void loop() {
+
+ matrix.clear();
+ matrix.drawBitmap(0, 0, smile_bmp, 8, 8, LED_ON);
+ matrix.writeDisplay();
+ delay(500);
+
+ matrix.clear();
+ matrix.drawBitmap(0, 8, neutral_bmp, 8, 8, LED_ON);
+ matrix.writeDisplay();
+ delay(500);
+
+ matrix.clear();
+ matrix.drawBitmap(0, 0, frown_bmp, 8, 8, LED_ON);
+ matrix.writeDisplay();
+ delay(500);
+
+ matrix.clear(); // clear display
+ matrix.drawPixel(0, 0, LED_ON);
+ matrix.writeDisplay(); // write the changes we just made to the display
+ delay(500);
+
+ matrix.clear();
+ matrix.drawLine(0,0, 7,15, LED_ON);
+ matrix.writeDisplay(); // write the changes we just made to the display
+ delay(500);
+
+ matrix.clear();
+ matrix.drawRect(0,0, 8,16, LED_ON);
+ matrix.fillRect(2,2, 4,12, LED_ON);
+ matrix.writeDisplay(); // write the changes we just made to the display
+ delay(500);
+
+ matrix.clear();
+ matrix.drawCircle(3,8, 3, LED_ON);
+ matrix.writeDisplay(); // write the changes we just made to the display
+ delay(500);
+
+ matrix.setTextSize(2);
+ matrix.setTextWrap(false); // we dont want text to wrap so it scrolls nicely
+ matrix.setTextColor(LED_ON);
+ for (int8_t x=0; x>=-64; x--) {
+ matrix.clear();
+ matrix.setCursor(x,0);
+ matrix.print("Hello");
+ matrix.writeDisplay();
+ delay(100);
+ }
+
+ matrix.setTextSize(1);
+ matrix.setTextWrap(false); // we dont want text to wrap so it scrolls nicely
+ matrix.setTextColor(LED_ON);
+ matrix.setRotation(1);
+ for (int8_t x=7; x>=-36; x--) {
+ matrix.clear();
+ matrix.setCursor(x,0);
+ matrix.print("World");
+ matrix.writeDisplay();
+ delay(100);
+ }
+ matrix.setRotation(0);
+}
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/examples/matrix8x8/matrix8x8.ino b/lib/Adafruit_LED_Backpack-1.1.6/examples/matrix8x8/matrix8x8.ino
new file mode 100644
index 000000000000..650da459e90e
--- /dev/null
+++ b/lib/Adafruit_LED_Backpack-1.1.6/examples/matrix8x8/matrix8x8.ino
@@ -0,0 +1,120 @@
+/***************************************************
+ This is a library for our I2C LED Backpacks
+
+ Designed specifically to work with the Adafruit LED Matrix backpacks
+ ----> http://www.adafruit.com/products/872
+ ----> http://www.adafruit.com/products/871
+ ----> http://www.adafruit.com/products/870
+
+ These displays use I2C to communicate, 2 pins are required to
+ interface. There are multiple selectable I2C addresses. For backpacks
+ with 2 Address Select pins: 0x70, 0x71, 0x72 or 0x73. For backpacks
+ with 3 Address Select pins: 0x70 thru 0x77
+
+ Adafruit invests time and resources providing this open source code,
+ please support Adafruit and open-source hardware by purchasing
+ products from Adafruit!
+
+ Written by Limor Fried/Ladyada for Adafruit Industries.
+ BSD license, all text above must be included in any redistribution
+ ****************************************************/
+
+#include
+#include
+#include "Adafruit_LEDBackpack.h"
+
+Adafruit_8x8matrix matrix = Adafruit_8x8matrix();
+
+void setup() {
+ Serial.begin(9600);
+ Serial.println("8x8 LED Matrix Test");
+
+ matrix.begin(0x70); // pass in the address
+}
+
+static const uint8_t PROGMEM
+ smile_bmp[] =
+ { B00111100,
+ B01000010,
+ B10100101,
+ B10000001,
+ B10100101,
+ B10011001,
+ B01000010,
+ B00111100 },
+ neutral_bmp[] =
+ { B00111100,
+ B01000010,
+ B10100101,
+ B10000001,
+ B10111101,
+ B10000001,
+ B01000010,
+ B00111100 },
+ frown_bmp[] =
+ { B00111100,
+ B01000010,
+ B10100101,
+ B10000001,
+ B10011001,
+ B10100101,
+ B01000010,
+ B00111100 };
+
+void loop() {
+ matrix.clear();
+ matrix.drawBitmap(0, 0, smile_bmp, 8, 8, LED_ON);
+ matrix.writeDisplay();
+ delay(500);
+
+ matrix.clear();
+ matrix.drawBitmap(0, 0, neutral_bmp, 8, 8, LED_ON);
+ matrix.writeDisplay();
+ delay(500);
+
+ matrix.clear();
+ matrix.drawBitmap(0, 0, frown_bmp, 8, 8, LED_ON);
+ matrix.writeDisplay();
+ delay(500);
+
+ matrix.clear(); // clear display
+ matrix.drawPixel(0, 0, LED_ON);
+ matrix.writeDisplay(); // write the changes we just made to the display
+ delay(500);
+
+ matrix.clear();
+ matrix.drawLine(0,0, 7,7, LED_ON);
+ matrix.writeDisplay(); // write the changes we just made to the display
+ delay(500);
+
+ matrix.clear();
+ matrix.drawRect(0,0, 8,8, LED_ON);
+ matrix.fillRect(2,2, 4,4, LED_ON);
+ matrix.writeDisplay(); // write the changes we just made to the display
+ delay(500);
+
+ matrix.clear();
+ matrix.drawCircle(3,3, 3, LED_ON);
+ matrix.writeDisplay(); // write the changes we just made to the display
+ delay(500);
+
+ matrix.setTextSize(1);
+ matrix.setTextWrap(false); // we dont want text to wrap so it scrolls nicely
+ matrix.setTextColor(LED_ON);
+ for (int8_t x=0; x>=-36; x--) {
+ matrix.clear();
+ matrix.setCursor(x,0);
+ matrix.print("Hello");
+ matrix.writeDisplay();
+ delay(100);
+ }
+ matrix.setRotation(3);
+ for (int8_t x=7; x>=-36; x--) {
+ matrix.clear();
+ matrix.setCursor(x,0);
+ matrix.print("World");
+ matrix.writeDisplay();
+ delay(100);
+ }
+ matrix.setRotation(0);
+}
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/examples/minimatrix16x8/minimatrix16x8.ino b/lib/Adafruit_LED_Backpack-1.1.6/examples/minimatrix16x8/minimatrix16x8.ino
new file mode 100644
index 000000000000..b8d29e5492ee
--- /dev/null
+++ b/lib/Adafruit_LED_Backpack-1.1.6/examples/minimatrix16x8/minimatrix16x8.ino
@@ -0,0 +1,123 @@
+/***************************************************
+ This is a library for our I2C LED Backpacks & FeatherWings
+
+ Designed specifically to work with the Adafruit 16x8 LED Matrix FeatherWing
+
+ These displays use I2C to communicate, 2 pins are required to
+ interface. There are multiple selectable I2C addresses. For backpacks
+ with 2 Address Select pins: 0x70, 0x71, 0x72 or 0x73. For backpacks
+ with 3 Address Select pins: 0x70 thru 0x77
+
+ Adafruit invests time and resources providing this open source code,
+ please support Adafruit and open-source hardware by purchasing
+ products from Adafruit!
+
+ Written by Limor Fried/Ladyada for Adafruit Industries.
+ BSD license, all text above must be included in any redistribution
+ ****************************************************/
+
+#include
+#include
+#include "Adafruit_LEDBackpack.h"
+
+Adafruit_8x16minimatrix matrix = Adafruit_8x16minimatrix();
+
+void setup() {
+ //while (!Serial);
+ Serial.begin(9600);
+ Serial.println("16x8 LED Mini Matrix Test");
+
+ matrix.begin(0x70); // pass in the address
+}
+
+static const uint8_t PROGMEM
+ smile_bmp[] =
+ { B00111100,
+ B01000010,
+ B10100101,
+ B10000001,
+ B10100101,
+ B10011001,
+ B01000010,
+ B00111100 },
+ neutral_bmp[] =
+ { B00111100,
+ B01000010,
+ B10100101,
+ B10000001,
+ B10111101,
+ B10000001,
+ B01000010,
+ B00111100 },
+ frown_bmp[] =
+ { B00111100,
+ B01000010,
+ B10100101,
+ B10000001,
+ B10011001,
+ B10100101,
+ B01000010,
+ B00111100 };
+
+void loop() {
+
+ matrix.clear();
+ matrix.drawBitmap(0, 0, smile_bmp, 8, 8, LED_ON);
+ matrix.writeDisplay();
+ delay(500);
+
+ matrix.clear();
+ matrix.drawBitmap(0, 8, neutral_bmp, 8, 8, LED_ON);
+ matrix.writeDisplay();
+ delay(500);
+
+ matrix.clear();
+ matrix.drawBitmap(0, 0, frown_bmp, 8, 8, LED_ON);
+ matrix.writeDisplay();
+ delay(500);
+
+
+ matrix.drawPixel(0, 0, LED_ON);
+ matrix.writeDisplay(); // write the changes we just made to the display
+ delay(500);
+
+ matrix.clear();
+ matrix.drawLine(0,0, 7,15, LED_ON);
+ matrix.writeDisplay(); // write the changes we just made to the display
+ delay(500);
+
+ matrix.clear();
+ matrix.drawRect(0,0, 8,16, LED_ON);
+ matrix.fillRect(2,2, 4,12, LED_ON);
+ matrix.writeDisplay(); // write the changes we just made to the display
+ delay(500);
+
+ matrix.clear();
+ matrix.drawCircle(3,8, 3, LED_ON);
+ matrix.writeDisplay(); // write the changes we just made to the display
+ delay(500);
+
+ matrix.setTextSize(2);
+ matrix.setTextWrap(false); // we dont want text to wrap so it scrolls nicely
+ matrix.setTextColor(LED_ON);
+ for (int8_t x=0; x>=-64; x--) {
+ matrix.clear();
+ matrix.setCursor(x,0);
+ matrix.print("Hello");
+ matrix.writeDisplay();
+ delay(100);
+ }
+
+ matrix.setTextSize(1);
+ matrix.setTextWrap(false); // we dont want text to wrap so it scrolls nicely
+ matrix.setTextColor(LED_ON);
+ matrix.setRotation(1);
+ for (int8_t x=7; x>=-36; x--) {
+ matrix.clear();
+ matrix.setCursor(x,0);
+ matrix.print("World");
+ matrix.writeDisplay();
+ delay(100);
+ }
+ matrix.setRotation(0);
+}
\ No newline at end of file
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/examples/quadalphanum/quadalphanum.ino b/lib/Adafruit_LED_Backpack-1.1.6/examples/quadalphanum/quadalphanum.ino
new file mode 100644
index 000000000000..70cb050e4307
--- /dev/null
+++ b/lib/Adafruit_LED_Backpack-1.1.6/examples/quadalphanum/quadalphanum.ino
@@ -0,0 +1,73 @@
+// Demo the quad alphanumeric display LED backpack kit
+// scrolls through every character, then scrolls Serial
+// input onto the display
+
+#include
+#include
+#include "Adafruit_LEDBackpack.h"
+
+Adafruit_AlphaNum4 alpha4 = Adafruit_AlphaNum4();
+
+void setup() {
+ Serial.begin(9600);
+
+ alpha4.begin(0x70); // pass in the address
+
+ alpha4.writeDigitRaw(3, 0x0);
+ alpha4.writeDigitRaw(0, 0xFFFF);
+ alpha4.writeDisplay();
+ delay(200);
+ alpha4.writeDigitRaw(0, 0x0);
+ alpha4.writeDigitRaw(1, 0xFFFF);
+ alpha4.writeDisplay();
+ delay(200);
+ alpha4.writeDigitRaw(1, 0x0);
+ alpha4.writeDigitRaw(2, 0xFFFF);
+ alpha4.writeDisplay();
+ delay(200);
+ alpha4.writeDigitRaw(2, 0x0);
+ alpha4.writeDigitRaw(3, 0xFFFF);
+ alpha4.writeDisplay();
+ delay(200);
+
+ alpha4.clear();
+ alpha4.writeDisplay();
+
+ // display every character,
+ for (uint8_t i='!'; i<='z'; i++) {
+ alpha4.writeDigitAscii(0, i);
+ alpha4.writeDigitAscii(1, i+1);
+ alpha4.writeDigitAscii(2, i+2);
+ alpha4.writeDigitAscii(3, i+3);
+ alpha4.writeDisplay();
+
+ delay(300);
+ }
+ Serial.println("Start typing to display!");
+}
+
+
+char displaybuffer[4] = {' ', ' ', ' ', ' '};
+
+void loop() {
+ while (! Serial.available()) return;
+
+ char c = Serial.read();
+ if (! isprint(c)) return; // only printable!
+
+ // scroll down display
+ displaybuffer[0] = displaybuffer[1];
+ displaybuffer[1] = displaybuffer[2];
+ displaybuffer[2] = displaybuffer[3];
+ displaybuffer[3] = c;
+
+ // set every digit to the buffer
+ alpha4.writeDigitAscii(0, displaybuffer[0]);
+ alpha4.writeDigitAscii(1, displaybuffer[1]);
+ alpha4.writeDigitAscii(2, displaybuffer[2]);
+ alpha4.writeDigitAscii(3, displaybuffer[3]);
+
+ // write it out!
+ alpha4.writeDisplay();
+ delay(200);
+}
\ No newline at end of file
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/examples/quadalphanum_mini/quadalphanum_mini.ino b/lib/Adafruit_LED_Backpack-1.1.6/examples/quadalphanum_mini/quadalphanum_mini.ino
new file mode 100644
index 000000000000..827ea85e56d2
--- /dev/null
+++ b/lib/Adafruit_LED_Backpack-1.1.6/examples/quadalphanum_mini/quadalphanum_mini.ino
@@ -0,0 +1,72 @@
+// Demo the quad alphanumeric display LED backpack kit
+// Displays a short message and then scrolls through every character
+
+// For use with Gemma or Trinket (Attiny85)
+
+#include
+#include
+
+
+// Connect + pins to 3-5V
+// Connect GND to ground
+// Connect Data to #0
+// Connect Clock to #2
+
+#include
+#include "Adafruit_LEDBackpack.h"
+
+char *message = "Hello world! ";
+
+Adafruit_AlphaNum4 alpha4 = Adafruit_AlphaNum4();
+
+void setup() {
+ // This is the auto-speed doubler line, keep it in, it will
+ // automatically double the speed when 16Mhz is selected!
+ if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
+
+ alpha4.begin(0x70); // pass in the address
+
+ alpha4.writeDigitRaw(3, 0x0);
+ alpha4.writeDigitRaw(0, 0xFFFF);
+ alpha4.writeDisplay();
+ delay(200);
+ alpha4.writeDigitRaw(0, 0x0);
+ alpha4.writeDigitRaw(1, 0xFFFF);
+ alpha4.writeDisplay();
+ delay(200);
+ alpha4.writeDigitRaw(1, 0x0);
+ alpha4.writeDigitRaw(2, 0xFFFF);
+ alpha4.writeDisplay();
+ delay(200);
+ alpha4.writeDigitRaw(2, 0x0);
+ alpha4.writeDigitRaw(3, 0xFFFF);
+ alpha4.writeDisplay();
+ delay(200);
+
+ alpha4.clear();
+ alpha4.writeDisplay();
+
+ // send a message!
+ for (uint8_t i=0; i
+#include
+#include
+#include "Adafruit_LEDBackpack.h"
+
+// Because the two eye matrices share the same address, only four
+// matrix objects are needed for the five displays:
+#define MATRIX_EYES 0
+#define MATRIX_MOUTH_LEFT 1
+#define MATRIX_MOUTH_MIDDLE 2
+#define MATRIX_MOUTH_RIGHT 3
+Adafruit_8x8matrix matrix[4] = { // Array of Adafruit_8x8matrix objects
+ Adafruit_8x8matrix(), Adafruit_8x8matrix(),
+ Adafruit_8x8matrix(), Adafruit_8x8matrix() };
+
+// Rather than assigning matrix addresses sequentially in a loop, each
+// has a spot in this array. This makes it easier if you inadvertently
+// install one or more matrices in the wrong physical position --
+// re-order the addresses in this table and you can still refer to
+// matrices by index above, no other code or wiring needs to change.
+static const uint8_t matrixAddr[] = { 0x70, 0x71, 0x72, 0x73 };
+
+static const uint8_t PROGMEM // Bitmaps are stored in program memory
+ blinkImg[][8] = { // Eye animation frames
+ { B00111100, // Fully open eye
+ B01111110,
+ B11111111,
+ B11111111,
+ B11111111,
+ B11111111,
+ B01111110,
+ B00111100 },
+ { B00000000,
+ B01111110,
+ B11111111,
+ B11111111,
+ B11111111,
+ B11111111,
+ B01111110,
+ B00111100 },
+ { B00000000,
+ B00000000,
+ B00111100,
+ B11111111,
+ B11111111,
+ B11111111,
+ B00111100,
+ B00000000 },
+ { B00000000,
+ B00000000,
+ B00000000,
+ B00111100,
+ B11111111,
+ B01111110,
+ B00011000,
+ B00000000 },
+ { B00000000, // Fully closed eye
+ B00000000,
+ B00000000,
+ B00000000,
+ B10000001,
+ B01111110,
+ B00000000,
+ B00000000 } },
+ mouthImg[][24] = { // Mouth animation frames
+ { B00000000, B00000000, B00000000, // Mouth position A
+ B00000000, B00000000, B00000000,
+ B01111111, B11111111, B11111110,
+ B00000000, B00000000, B00000000,
+ B00000000, B00000000, B00000000,
+ B00000000, B00000000, B00000000,
+ B00000000, B00000000, B00000000,
+ B00000000, B00000000, B00000000 },
+ { B00000000, B00000000, B00000000, // Mouth position B
+ B00000000, B00000000, B00000000,
+ B00111111, B11111111, B11111100,
+ B00000111, B00000000, B11100000,
+ B00000000, B11111111, B00000000,
+ B00000000, B00000000, B00000000,
+ B00000000, B00000000, B00000000,
+ B00000000, B00000000, B00000000 },
+ { B00000000, B00000000, B00000000, // Mouth position C
+ B00000000, B00000000, B00000000,
+ B00111111, B11111111, B11111100,
+ B00001000, B00000000, B00010000,
+ B00000110, B00000000, B01100000,
+ B00000001, B11000011, B10000000,
+ B00000000, B00111100, B00000000,
+ B00000000, B00000000, B00000000 },
+ { B00000000, B00000000, B00000000, // Mouth position D
+ B00000000, B00000000, B00000000,
+ B00111111, B11111111, B11111100,
+ B00100000, B00000000, B00000100,
+ B00010000, B00000000, B00001000,
+ B00001100, B00000000, B00110000,
+ B00000011, B10000001, B11000000,
+ B00000000, B01111110, B00000000 },
+ { B00000000, B00000000, B00000000, // Mouth position E
+ B00000000, B00111100, B00000000,
+ B00011111, B11000011, B11111000,
+ B00000011, B10000001, B11000000,
+ B00000000, B01111110, B00000000,
+ B00000000, B00000000, B00000000,
+ B00000000, B00000000, B00000000,
+ B00000000, B00000000, B00000000 },
+ { B00000000, B00111100, B00000000, // Mouth position F
+ B00000000, B11000011, B00000000,
+ B00001111, B00000000, B11110000,
+ B00000001, B00000000, B10000000,
+ B00000000, B11000011, B00000000,
+ B00000000, B00111100, B00000000,
+ B00000000, B00000000, B00000000,
+ B00000000, B00000000, B00000000 } };
+
+uint8_t
+ blinkIndex[] = { 1, 2, 3, 4, 3, 2, 1 }, // Blink bitmap sequence
+ blinkCountdown = 100, // Countdown to next blink (in frames)
+ gazeCountdown = 75, // Countdown to next eye movement
+ gazeFrames = 50, // Duration of eye movement (smaller = faster)
+ mouthPos = 0, // Current image number for mouth
+ mouthCountdown = 10; // Countdown to next mouth change
+int8_t
+ eyeX = 3, eyeY = 3, // Current eye position
+ newX = 3, newY = 3, // Next eye position
+ dX = 0, dY = 0; // Distance from prior to new position
+
+void setup() {
+
+ // Seed random number generator from an unused analog input:
+ randomSeed(analogRead(A0));
+
+ // Initialize each matrix object:
+ for(uint8_t i=0; i<4; i++) {
+ matrix[i].begin(matrixAddr[i]);
+ // If using 'small' (1.2") displays vs. 'mini' (0.8"), enable this:
+ // matrix[i].setRotation(3);
+ }
+}
+
+void loop() {
+
+ // Draw eyeball in current state of blinkyness (no pupil). Note that
+ // only one eye needs to be drawn. Because the two eye matrices share
+ // the same address, the same data will be received by both.
+ matrix[MATRIX_EYES].clear();
+ // When counting down to the next blink, show the eye in the fully-
+ // open state. On the last few counts (during the blink), look up
+ // the corresponding bitmap index.
+ matrix[MATRIX_EYES].drawBitmap(0, 0,
+ blinkImg[
+ (blinkCountdown < sizeof(blinkIndex)) ? // Currently blinking?
+ blinkIndex[blinkCountdown] : // Yes, look up bitmap #
+ 0 // No, show bitmap 0
+ ], 8, 8, LED_ON);
+ // Decrement blink counter. At end, set random time for next blink.
+ if(--blinkCountdown == 0) blinkCountdown = random(5, 180);
+
+ // Add a pupil (2x2 black square) atop the blinky eyeball bitmap.
+ // Periodically, the pupil moves to a new position...
+ if(--gazeCountdown <= gazeFrames) {
+ // Eyes are in motion - draw pupil at interim position
+ matrix[MATRIX_EYES].fillRect(
+ newX - (dX * gazeCountdown / gazeFrames),
+ newY - (dY * gazeCountdown / gazeFrames),
+ 2, 2, LED_OFF);
+ if(gazeCountdown == 0) { // Last frame?
+ eyeX = newX; eyeY = newY; // Yes. What's new is old, then...
+ do { // Pick random positions until one is within the eye circle
+ newX = random(7); newY = random(7);
+ dX = newX - 3; dY = newY - 3;
+ } while((dX * dX + dY * dY) >= 10); // Thank you Pythagoras
+ dX = newX - eyeX; // Horizontal distance to move
+ dY = newY - eyeY; // Vertical distance to move
+ gazeFrames = random(3, 15); // Duration of eye movement
+ gazeCountdown = random(gazeFrames, 120); // Count to end of next movement
+ }
+ } else {
+ // Not in motion yet -- draw pupil at current static position
+ matrix[MATRIX_EYES].fillRect(eyeX, eyeY, 2, 2, LED_OFF);
+ }
+
+ // Draw mouth, switch to new random image periodically
+ drawMouth(mouthImg[mouthPos]);
+ if(--mouthCountdown == 0) {
+ mouthPos = random(6); // Random image
+ // If the 'neutral' position was chosen, there's a 1-in-5 chance we'll
+ // select a longer hold time. This gives the appearance of periodic
+ // pauses in speech (e.g. between sentences, etc.).
+ mouthCountdown = ((mouthPos == 0) && (random(5) == 0)) ?
+ random(10, 40) : // Longer random duration
+ random(2, 8); // Shorter random duration
+ }
+
+ // Refresh all of the matrices in one quick pass
+ for(uint8_t i=0; i<4; i++) matrix[i].writeDisplay();
+
+ delay(20); // ~50 FPS
+}
+
+// Draw mouth image across three adjacent displays
+void drawMouth(const uint8_t *img) {
+ for(uint8_t i=0; i<3; i++) {
+ matrix[MATRIX_MOUTH_LEFT + i].clear();
+ matrix[MATRIX_MOUTH_LEFT + i].drawBitmap(i * -8, 0, img, 24, 8, LED_ON);
+ }
+}
+
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/examples/sevenseg/sevenseg.ino b/lib/Adafruit_LED_Backpack-1.1.6/examples/sevenseg/sevenseg.ino
new file mode 100644
index 000000000000..0a4f70c7431c
--- /dev/null
+++ b/lib/Adafruit_LED_Backpack-1.1.6/examples/sevenseg/sevenseg.ino
@@ -0,0 +1,81 @@
+/***************************************************
+ This is a library for our I2C LED Backpacks
+
+ Designed specifically to work with the Adafruit LED 7-Segment backpacks
+ ----> http://www.adafruit.com/products/881
+ ----> http://www.adafruit.com/products/880
+ ----> http://www.adafruit.com/products/879
+ ----> http://www.adafruit.com/products/878
+
+ These displays use I2C to communicate, 2 pins are required to
+ interface. There are multiple selectable I2C addresses. For backpacks
+ with 2 Address Select pins: 0x70, 0x71, 0x72 or 0x73. For backpacks
+ with 3 Address Select pins: 0x70 thru 0x77
+
+ Adafruit invests time and resources providing this open source code,
+ please support Adafruit and open-source hardware by purchasing
+ products from Adafruit!
+
+ Written by Limor Fried/Ladyada for Adafruit Industries.
+ BSD license, all text above must be included in any redistribution
+ ****************************************************/
+
+#include // Enable this line if using Arduino Uno, Mega, etc.
+#include
+#include "Adafruit_LEDBackpack.h"
+
+Adafruit_7segment matrix = Adafruit_7segment();
+
+void setup() {
+#ifndef __AVR_ATtiny85__
+ Serial.begin(9600);
+ Serial.println("7 Segment Backpack Test");
+#endif
+ matrix.begin(0x70);
+}
+
+void loop() {
+ // try to print a number thats too long
+ matrix.print(10000, DEC);
+ matrix.writeDisplay();
+ delay(500);
+
+ // print a hex number
+ matrix.print(0xBEEF, HEX);
+ matrix.writeDisplay();
+ delay(500);
+
+ // print a floating point
+ matrix.print(12.34);
+ matrix.writeDisplay();
+ delay(500);
+
+ // print with print/println
+ for (uint16_t counter = 0; counter < 9999; counter++) {
+ matrix.println(counter);
+ matrix.writeDisplay();
+ delay(10);
+ }
+
+ // method #2 - draw each digit
+ uint16_t blinkcounter = 0;
+ boolean drawDots = false;
+ for (uint16_t counter = 0; counter < 9999; counter ++) {
+ matrix.writeDigitNum(0, (counter / 1000), drawDots);
+ matrix.writeDigitNum(1, (counter / 100) % 10, drawDots);
+ matrix.drawColon(drawDots);
+ matrix.writeDigitNum(3, (counter / 10) % 10, drawDots);
+ matrix.writeDigitNum(4, counter % 10, drawDots);
+
+ blinkcounter+=50;
+ if (blinkcounter < 500) {
+ drawDots = false;
+ } else if (blinkcounter < 1000) {
+ drawDots = true;
+ } else {
+ blinkcounter = 0;
+ }
+ matrix.writeDisplay();
+ delay(10);
+ }
+}
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/examples/wavface/wavface.pde b/lib/Adafruit_LED_Backpack-1.1.6/examples/wavface/wavface.pde
new file mode 100644
index 000000000000..b3c521bcc26d
--- /dev/null
+++ b/lib/Adafruit_LED_Backpack-1.1.6/examples/wavface/wavface.pde
@@ -0,0 +1,336 @@
+// 'wavface' example sketch for Adafruit I2C 8x8 LED backpacks
+// and Wave Shield:
+//
+// www.adafruit.com/products/870 www.adafruit.com/products/1049
+// www.adafruit.com/products/871 www.adafruit.com/products/1050
+// www.adafruit.com/products/872 www.adafruit.com/products/1051
+// www.adafruit.com/products/959 www.adafruit.com/products/1052
+// www.adafruit.com/products/94
+//
+// Requires Adafruit_LEDBackpack, Adafruit_GFX libraries and WaveHC
+// libraries.
+//
+// This sketch shows animation roughly synchronized to prerecorded
+// speech. It's fairly complex and may be overwhelming to novice
+// programmers, who may want to start with the 'matrix8x8' example
+// and then 'roboface' before working through this code. Also, much
+// of the comments relating to the face animation have been stripped
+// here for brevity...refer to the 'roboface' sketch if you have any
+// questions how that part works.
+//
+// Additional hardware required: sounds are triggered using three
+// normally-open momentary buttons connected to Digital pins 6, 7, 8
+// and GND. (e.g. www.adafruit.com/products/1009 )
+//
+// Adafruit invests time and resources providing this open source code,
+// please support Adafruit and open-source hardware by purchasing
+// products from Adafruit!
+//
+// Written by P. Burgess for Adafruit Industries, parts adapted from
+// 'PiSpeakHC' sketch included with WaveHC library.
+// BSD license, all text above must be included in any redistribution.
+
+#include
+#include
+#include
+#include
+#include
+#include "Adafruit_LEDBackpack.h"
+
+// These WAV files should be in the root level of the SD card:
+static const char PROGMEM
+ wav0[] = "beware_i.wav",
+ wav1[] = "ihunger.wav",
+ wav2[] = "run_cowd.wav";
+static const char * const wavname[] PROGMEM = { wav0, wav1, wav2 };
+// PROGMEM makes frequent appearances throughout this code, reason being that
+// the SD card library requires gobs of precious RAM (leaving very little to
+// our own sketch). PROGMEM lets us put fixed data into program flash memory,
+// which is considerably more spacious. String tables are paritcularly nasty.
+// See www.arduino.cc/en/Reference/PROGMEM for more info.
+
+SdReader card; // This object holds the information for the card
+FatVolume vol; // This holds the information for the partition on the card
+FatReader root; // This holds the information for the volumes root directory
+FatReader file; // This object represent the WAV file for a phrase
+WaveHC wave; // A single wave object -- only one sound is played at a time
+
+// Because the two eye matrices share the same address, only four
+// matrix objects are needed for the five displays:
+#define MATRIX_EYES 0
+#define MATRIX_MOUTH_LEFT 1
+#define MATRIX_MOUTH_MIDDLE 2
+#define MATRIX_MOUTH_RIGHT 3
+Adafruit_8x8matrix matrix[4] = { // Array of Adafruit_8x8matrix objects
+ Adafruit_8x8matrix(), Adafruit_8x8matrix(),
+ Adafruit_8x8matrix(), Adafruit_8x8matrix() };
+
+// Rather than assigning matrix addresses sequentially in a loop, each
+// has a spot in this array. This makes it easier if you inadvertently
+// install one or more matrices in the wrong physical position --
+// re-order the addresses in this table and you can still refer to
+// matrices by index above, no other code or wiring needs to change.
+static const uint8_t PROGMEM matrixAddr[] = { 0x70, 0x71, 0x72, 0x73 };
+
+static const uint8_t PROGMEM // Bitmaps are stored in program memory
+ blinkImg[][8] = { // Eye animation frames
+ { B00111100, // Fully open eye
+ B01111110,
+ B11111111,
+ B11111111,
+ B11111111,
+ B11111111,
+ B01111110,
+ B00111100 },
+ { B00000000,
+ B01111110,
+ B11111111,
+ B11111111,
+ B11111111,
+ B11111111,
+ B01111110,
+ B00111100 },
+ { B00000000,
+ B00000000,
+ B00111100,
+ B11111111,
+ B11111111,
+ B11111111,
+ B00111100,
+ B00000000 },
+ { B00000000,
+ B00000000,
+ B00000000,
+ B00111100,
+ B11111111,
+ B01111110,
+ B00011000,
+ B00000000 },
+ { B00000000, // Fully closed eye
+ B00000000,
+ B00000000,
+ B00000000,
+ B10000001,
+ B01111110,
+ B00000000,
+ B00000000 } },
+ mouthImg[][24] = { // Mouth animation frames
+ { B00000000, B00000000, B00000000, // Mouth position A
+ B00000000, B00000000, B00000000,
+ B01111111, B11111111, B11111110,
+ B00000000, B00000000, B00000000,
+ B00000000, B00000000, B00000000,
+ B00000000, B00000000, B00000000,
+ B00000000, B00000000, B00000000,
+ B00000000, B00000000, B00000000 },
+ { B00000000, B00000000, B00000000, // Mouth position B
+ B00000000, B00000000, B00000000,
+ B00111111, B11111111, B11111100,
+ B00000111, B00000000, B11100000,
+ B00000000, B11111111, B00000000,
+ B00000000, B00000000, B00000000,
+ B00000000, B00000000, B00000000,
+ B00000000, B00000000, B00000000 },
+ { B00000000, B00000000, B00000000, // Mouth position C
+ B00000000, B00000000, B00000000,
+ B00111111, B11111111, B11111100,
+ B00001000, B00000000, B00010000,
+ B00000110, B00000000, B01100000,
+ B00000001, B11000011, B10000000,
+ B00000000, B00111100, B00000000,
+ B00000000, B00000000, B00000000 },
+ { B00000000, B00000000, B00000000, // Mouth position D
+ B00000000, B00000000, B00000000,
+ B00111111, B11111111, B11111100,
+ B00100000, B00000000, B00000100,
+ B00010000, B00000000, B00001000,
+ B00001100, B00000000, B00110000,
+ B00000011, B10000001, B11000000,
+ B00000000, B01111110, B00000000 },
+ { B00000000, B00000000, B00000000, // Mouth position E
+ B00000000, B00111100, B00000000,
+ B00011111, B11000011, B11111000,
+ B00000011, B10000001, B11000000,
+ B00000000, B01111110, B00000000,
+ B00000000, B00000000, B00000000,
+ B00000000, B00000000, B00000000,
+ B00000000, B00000000, B00000000 },
+ { B00000000, B00111100, B00000000, // Mouth position F
+ B00000000, B11000011, B00000000,
+ B00001111, B00000000, B11110000,
+ B00000001, B00000000, B10000000,
+ B00000000, B11000011, B00000000,
+ B00000000, B00111100, B00000000,
+ B00000000, B00000000, B00000000,
+ B00000000, B00000000, B00000000 } };
+
+// Animation sequences corresponding to each WAV. First number in
+// each pair is a mouth bitmap index. Second number is the hold
+// time (in frames). 255 marks end of list.
+// There is no 'magic' here, the software is NOT deriving mouth
+// position from the sound...the tables were determined by hand,
+// just as animators do it. Further explanation here:
+// http://www.idleworm.com/how/anm/03t/talk1.shtml
+
+static const uint8_t PROGMEM
+ seq1[] = { 0, 2, 2, 5, 5, 3, 3, 7, // "Beware, I live!"
+ 4, 5, 3, 4, 2, 5, 4, 3,
+ 3, 4, 1, 5, 3, 5, 255 },
+ seq2[] = { 0, 1, 3, 5, 1, 5, 4, 2, // "I hunger!"
+ 3, 2, 1, 2, 4, 4, 1, 3,
+ 4, 2, 255 },
+ seq3[] = { 0, 1, 1, 2, 3, 6, 2, 5, // "Run, coward!"
+ 0, 1, 4, 4, 5, 2, 1, 5,
+ 3, 6, 1, 4, 255 };
+static const uint8_t * const anim[] = { seq1, seq2, seq3 };
+
+const uint8_t
+ blinkIndex[] PROGMEM = { 1, 2, 3, 4, 3, 2, 1 }; // Blink bitmap sequence
+uint8_t
+ blinkCountdown = 100, // Countdown to next blink (in frames)
+ gazeCountdown = 75, // Countdown to next eye movement
+ gazeFrames = 50, // Duration of eye movement (smaller = faster)
+ mouthPos = 0, // Current image number for mouth
+ mouthCountdown = 10, // Countdown to next mouth change
+ newPos = 255, // New mouth position for current frame
+ *seq, // Animation sequence currently being played back
+ idx, // Current array index within animation sequence
+ prevBtn = 99, // Button # pressed on last loop() iteration
+ btnCount = 0; // Number of iterations same button has been held
+int8_t
+ eyeX = 3, eyeY = 3, // Current eye position
+ newX = 3, newY = 3, // Next eye position
+ dX = 0, dY = 0; // Distance from prior to new position
+
+void setup() {
+
+ Serial.begin(9600);
+
+ Serial.println(F("WAV face"));
+
+ if(!card.init()) Serial.println(F("Card init. failed!"));
+ if(!vol.init(card)) Serial.println(F("No partition!"));
+ if(!root.openRoot(vol)) Serial.println(F("Couldn't open dir"));
+ Serial.println(F("Files found:"));
+ root.ls();
+
+ // Seed random number generator from an unused analog input:
+ randomSeed(analogRead(A0));
+
+ // Initialize each matrix object:
+ for(uint8_t i=0; i<4; i++) {
+ matrix[i].begin(pgm_read_byte(&matrixAddr[i]));
+ // If using 'small' (1.2") displays vs. 'mini' (0.8"), enable this:
+ // matrix[i].setRotation(3);
+ }
+
+ // Enable pull-up resistors on three button inputs.
+ // Other end of each button then connects to GND.
+ for(uint8_t i=6; i<=8; i++) {
+ pinMode(i, INPUT);
+ digitalWrite(i, HIGH); // Enable pullup
+ }
+}
+
+void loop() {
+
+ uint8_t i;
+
+ // Draw eyeball in current state of blinkyness (no pupil).
+ matrix[MATRIX_EYES].clear();
+ matrix[MATRIX_EYES].drawBitmap(0, 0,
+ blinkImg[
+ (blinkCountdown < sizeof(blinkIndex)) ? // Currently blinking?
+ pgm_read_byte(&blinkIndex[blinkCountdown]) : // Yes, look up bitmap #
+ 0 // No, show bitmap 0
+ ], 8, 8, LED_ON);
+ // Decrement blink counter. At end, set random time for next blink.
+ if(--blinkCountdown == 0) blinkCountdown = random(5, 180);
+
+ if(--gazeCountdown <= gazeFrames) {
+ // Eyes are in motion - draw pupil at interim position
+ matrix[MATRIX_EYES].fillRect(
+ newX - (dX * gazeCountdown / gazeFrames),
+ newY - (dY * gazeCountdown / gazeFrames),
+ 2, 2, LED_OFF);
+ if(gazeCountdown == 0) { // Last frame?
+ eyeX = newX; eyeY = newY; // Yes. What's new is old, then...
+ do { // Pick random positions until one is within the eye circle
+ newX = random(7); newY = random(7);
+ dX = newX - 3; dY = newY - 3;
+ } while((dX * dX + dY * dY) >= 10); // Thank you Pythagoras
+ dX = newX - eyeX; // Horizontal distance to move
+ dY = newY - eyeY; // Vertical distance to move
+ gazeFrames = random(3, 15); // Duration of eye movement
+ gazeCountdown = random(gazeFrames, 120); // Count to end of next movement
+ }
+ } else {
+ // Not in motion yet -- draw pupil at current static position
+ matrix[MATRIX_EYES].fillRect(eyeX, eyeY, 2, 2, LED_OFF);
+ }
+
+ // Scan buttons 6, 7, 8 looking for first button pressed...
+ for(i=0; (i<3) && (digitalRead(i+6) == HIGH); i++);
+
+ if(i < 3) { // Anything pressed? Yes!
+ if(i == prevBtn) { // Same as last time we checked? Good!
+ if(++btnCount == 3) { // 3 passes to 'debounce' button input
+ playfile((char *)pgm_read_word(&wavname[i])); // Start WAV
+ // Look up animation sequence # corresponding to this WAV...
+ seq = (uint8_t *)pgm_read_word(&anim[i]);
+ idx = 0; // Begin at first byte of data
+ newPos = pgm_read_byte(&seq[idx++]); // Initial mouth pos
+ mouthCountdown = pgm_read_byte(&seq[idx++]); // Hold time for pos
+ }
+ } else btnCount = 0; // Different button than before - start count over
+ prevBtn = i;
+ } else prevBtn = 99; // No buttons pressed
+
+ if(newPos != 255) { // Is the mouth in motion?
+ if(--mouthCountdown == 0) { // Count down frames to next position
+ newPos = pgm_read_byte(&seq[idx++]); // New mouth position
+ if(newPos == 255) { // End of list?
+ mouthPos = 0; // Yes, set mouth to neutral position
+ } else {
+ mouthPos = newPos; // Set mouth to new position
+ mouthCountdown = pgm_read_byte(&seq[idx++]); // Read hold time
+ }
+ }
+ } else mouthPos = 0; // Mouth not in motion -- set to neutral position
+
+ drawMouth(mouthImg[mouthPos]);
+
+ // Refresh all matrices in one quick pass
+ for(uint8_t i=0; i<4; i++) matrix[i].writeDisplay();
+
+ delay(20);
+}
+
+// Draw mouth image across three adjacent displays
+void drawMouth(const uint8_t *img) {
+ for(uint8_t i=0; i<3; i++) {
+ matrix[MATRIX_MOUTH_LEFT + i].clear();
+ matrix[MATRIX_MOUTH_LEFT + i].drawBitmap(i * -8, 0, img, 24, 8, LED_ON);
+ }
+}
+
+// Open and start playing a WAV file
+void playfile(const char *name) {
+ char filename[13]; // 8.3+NUL
+
+ if(wave.isplaying) wave.stop(); // Stop any currently-playing WAV
+
+ strcpy_P(filename, name); // Copy name out of PROGMEM into RAM
+
+ if(!file.open(root, filename)) {
+ Serial.print(F("Couldn't open file "));
+ Serial.println(filename);
+ return;
+ }
+ if(!wave.create(file)) {
+ Serial.println(F("Not a valid WAV"));
+ return;
+ }
+ wave.play();
+}
+
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/examples/wavface/wavs/beware_i.wav b/lib/Adafruit_LED_Backpack-1.1.6/examples/wavface/wavs/beware_i.wav
new file mode 100644
index 000000000000..f27bd6f3bd91
Binary files /dev/null and b/lib/Adafruit_LED_Backpack-1.1.6/examples/wavface/wavs/beware_i.wav differ
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/examples/wavface/wavs/ihunger.wav b/lib/Adafruit_LED_Backpack-1.1.6/examples/wavface/wavs/ihunger.wav
new file mode 100644
index 000000000000..b57a291f6a13
Binary files /dev/null and b/lib/Adafruit_LED_Backpack-1.1.6/examples/wavface/wavs/ihunger.wav differ
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/examples/wavface/wavs/run_cowd.wav b/lib/Adafruit_LED_Backpack-1.1.6/examples/wavface/wavs/run_cowd.wav
new file mode 100644
index 000000000000..babb864ecf94
Binary files /dev/null and b/lib/Adafruit_LED_Backpack-1.1.6/examples/wavface/wavs/run_cowd.wav differ
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/library.properties b/lib/Adafruit_LED_Backpack-1.1.6/library.properties
new file mode 100644
index 000000000000..e04636907bc2
--- /dev/null
+++ b/lib/Adafruit_LED_Backpack-1.1.6/library.properties
@@ -0,0 +1,9 @@
+name=Adafruit LED Backpack Library
+version=1.1.6
+author=Adafruit
+maintainer=Adafruit
+sentence=Adafruit LED Backpack Library for our 8x8 matrix and 7-segment LED backpacks
+paragraph=Adafruit LED Backpack Library for our 8x8 matrix and 7-segment LED backpacks
+category=Display
+url=https://github.com/adafruit/Adafruit-LED-Backpack-Library
+architectures=*
diff --git a/lib/Adafruit_LED_Backpack-1.1.6/license.txt b/lib/Adafruit_LED_Backpack-1.1.6/license.txt
new file mode 100644
index 000000000000..fee1e9c31149
--- /dev/null
+++ b/lib/Adafruit_LED_Backpack-1.1.6/license.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2012 Adafruit Industries
+
+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.
diff --git a/lib/Adafruit_SSD1306-1.1.2/.github/ISSUE_TEMPLATE.md b/lib/Adafruit_SSD1306-1.1.2/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 000000000000..f0e26146fa93
--- /dev/null
+++ b/lib/Adafruit_SSD1306-1.1.2/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,46 @@
+Thank you for opening an issue on an Adafruit Arduino library repository. To
+improve the speed of resolution please review the following guidelines and
+common troubleshooting steps below before creating the issue:
+
+- **Do not use GitHub issues for troubleshooting projects and issues.** Instead use
+ the forums at http://forums.adafruit.com to ask questions and troubleshoot why
+ something isn't working as expected. In many cases the problem is a common issue
+ that you will more quickly receive help from the forum community. GitHub issues
+ are meant for known defects in the code. If you don't know if there is a defect
+ in the code then start with troubleshooting on the forum first.
+
+- **If following a tutorial or guide be sure you didn't miss a step.** Carefully
+ check all of the steps and commands to run have been followed. Consult the
+ forum if you're unsure or have questions about steps in a guide/tutorial.
+
+- **For Arduino projects check these very common issues to ensure they don't apply**:
+
+ - For uploading sketches or communicating with the board make sure you're using
+ a **USB data cable** and **not** a **USB charge-only cable**. It is sometimes
+ very hard to tell the difference between a data and charge cable! Try using the
+ cable with other devices or swapping to another cable to confirm it is not
+ the problem.
+
+ - **Be sure you are supplying adequate power to the board.** Check the specs of
+ your board and plug in an external power supply. In many cases just
+ plugging a board into your computer is not enough to power it and other
+ peripherals.
+
+ - **Double check all soldering joints and connections.** Flakey connections
+ cause many mysterious problems. See the [guide to excellent soldering](https://learn.adafruit.com/adafruit-guide-excellent-soldering/tools) for examples of good solder joints.
+
+ - **Ensure you are using an official Arduino or Adafruit board.** We can't
+ guarantee a clone board will have the same functionality and work as expected
+ with this code and don't support them.
+
+If you're sure this issue is a defect in the code and checked the steps above
+please fill in the following fields to provide enough troubleshooting information.
+You may delete the guideline and text above to just leave the following details:
+
+- Arduino board: **INSERT ARDUINO BOARD NAME/TYPE HERE**
+
+- Arduino IDE version (found in Arduino -> About Arduino menu): **INSERT ARDUINO
+ VERSION HERE**
+
+- List the steps to reproduce the problem below (if possible attach a sketch or
+ copy the sketch code in too): **LIST REPRO STEPS BELOW**
diff --git a/lib/Adafruit_SSD1306-1.1.2/.github/PULL_REQUEST_TEMPLATE.md b/lib/Adafruit_SSD1306-1.1.2/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 000000000000..7b641eb862c0
--- /dev/null
+++ b/lib/Adafruit_SSD1306-1.1.2/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,26 @@
+Thank you for creating a pull request to contribute to Adafruit's GitHub code!
+Before you open the request please review the following guidelines and tips to
+help it be more easily integrated:
+
+- **Describe the scope of your change--i.e. what the change does and what parts
+ of the code were modified.** This will help us understand any risks of integrating
+ the code.
+
+- **Describe any known limitations with your change.** For example if the change
+ doesn't apply to a supported platform of the library please mention it.
+
+- **Please run any tests or examples that can exercise your modified code.** We
+ strive to not break users of the code and running tests/examples helps with this
+ process.
+
+Thank you again for contributing! We will try to test and integrate the change
+as soon as we can, but be aware we have many GitHub repositories to manage and
+can't immediately respond to every request. There is no need to bump or check in
+on a pull request (it will clutter the discussion of the request).
+
+Also don't be worried if the request is closed or not integrated--sometimes the
+priorities of Adafruit's GitHub code (education, ease of use) might not match the
+priorities of the pull request. Don't fret, the open source community thrives on
+forks and GitHub makes it easy to keep your changes in a forked repo.
+
+After reviewing the guidelines above you can delete this text from the pull request.
diff --git a/lib/Adafruit_SSD1306-1.1.2/Adafruit_SSD1306.cpp b/lib/Adafruit_SSD1306-1.1.2/Adafruit_SSD1306.cpp
new file mode 100644
index 000000000000..570a3358451d
--- /dev/null
+++ b/lib/Adafruit_SSD1306-1.1.2/Adafruit_SSD1306.cpp
@@ -0,0 +1,729 @@
+/*********************************************************************
+This is a library for our Monochrome OLEDs based on SSD1306 drivers
+
+ Pick one up today in the adafruit shop!
+ ------> http://www.adafruit.com/category/63_98
+
+These displays use SPI to communicate, 4 or 5 pins are required to
+interface
+
+Adafruit invests time and resources providing this open source code,
+please support Adafruit and open-source hardware by purchasing
+products from Adafruit!
+
+Written by Limor Fried/Ladyada for Adafruit Industries.
+BSD license, check license.txt for more information
+All text above, and the splash screen below must be included in any redistribution
+*********************************************************************/
+
+#ifdef __AVR__
+ #include
+#elif defined(ESP8266) || defined(ESP32)
+ #include
+#else
+ #define pgm_read_byte(addr) (*(const unsigned char *)(addr))
+#endif
+
+#if !defined(__ARM_ARCH) && !defined(ENERGIA) && !defined(ESP8266) && !defined(ESP32) && !defined(__arc__)
+ #include
+#endif
+
+#include
+
+#include
+#include
+#include "Adafruit_GFX.h"
+#include "Adafruit_SSD1306.h"
+
+// the memory buffer for the LCD
+
+static uint8_t buffer[SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH / 8] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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,
+0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x80, 0x80, 0xC0, 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, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xF8, 0xE0, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80,
+0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xFF,
+#if (SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH > 96*16)
+0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+0x80, 0xFF, 0xFF, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x8C, 0x8E, 0x84, 0x00, 0x00, 0x80, 0xF8,
+0xF8, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80,
+0x00, 0xE0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xC7, 0x01, 0x01,
+0x01, 0x01, 0x83, 0xFF, 0xFF, 0x00, 0x00, 0x7C, 0xFE, 0xC7, 0x01, 0x01, 0x01, 0x01, 0x83, 0xFF,
+0xFF, 0xFF, 0x00, 0x38, 0xFE, 0xC7, 0x83, 0x01, 0x01, 0x01, 0x83, 0xC7, 0xFF, 0xFF, 0x00, 0x00,
+0x01, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0x07, 0x01, 0x01, 0x01, 0x00, 0x00, 0x7F, 0xFF,
+0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0xFF,
+0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x03, 0x0F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC7, 0xC7, 0x8F,
+0x8F, 0x9F, 0xBF, 0xFF, 0xFF, 0xC3, 0xC0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xFC,
+0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xC0, 0x00, 0x01, 0x03, 0x03, 0x03,
+0x03, 0x03, 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01,
+0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x00, 0x00,
+0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x03,
+0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+#if (SSD1306_LCDHEIGHT == 64)
+0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0x0F,
+0x87, 0xC7, 0xF7, 0xFF, 0xFF, 0x1F, 0x1F, 0x3D, 0xFC, 0xF8, 0xF8, 0xF8, 0xF8, 0x7C, 0x7D, 0xFF,
+0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x0F, 0x07, 0x00, 0x30, 0x30, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC0, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0xC0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x1F,
+0x0F, 0x07, 0x1F, 0x7F, 0xFF, 0xFF, 0xF8, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xE0,
+0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00,
+0x00, 0xFC, 0xFE, 0xFC, 0x0C, 0x06, 0x06, 0x0E, 0xFC, 0xF8, 0x00, 0x00, 0xF0, 0xF8, 0x1C, 0x0E,
+0x06, 0x06, 0x06, 0x0C, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFC,
+0xFE, 0xFC, 0x00, 0x18, 0x3C, 0x7E, 0x66, 0xE6, 0xCE, 0x84, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0x06,
+0x06, 0xFC, 0xFE, 0xFC, 0x0C, 0x06, 0x06, 0x06, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xC0, 0xF8,
+0xFC, 0x4E, 0x46, 0x46, 0x46, 0x4E, 0x7C, 0x78, 0x40, 0x18, 0x3C, 0x76, 0xE6, 0xCE, 0xCC, 0x80,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x0F, 0x03,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00,
+0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x03, 0x07, 0x0E, 0x0C,
+0x18, 0x18, 0x0C, 0x06, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x01, 0x0F, 0x0E, 0x0C, 0x18, 0x0C, 0x0F,
+0x07, 0x01, 0x00, 0x04, 0x0E, 0x0C, 0x18, 0x0C, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00,
+0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x07,
+0x07, 0x0C, 0x0C, 0x18, 0x1C, 0x0C, 0x06, 0x06, 0x00, 0x04, 0x0E, 0x0C, 0x18, 0x0C, 0x0F, 0x07,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+#endif
+#endif
+};
+
+#define ssd1306_swap(a, b) { int16_t t = a; a = b; b = t; }
+
+// the most basic function, set a single pixel
+void Adafruit_SSD1306::drawPixel(int16_t x, int16_t y, uint16_t color) {
+ if ((x < 0) || (x >= width()) || (y < 0) || (y >= height()))
+ return;
+
+ // check rotation, move pixel around if necessary
+ switch (getRotation()) {
+ case 1:
+ ssd1306_swap(x, y);
+ x = WIDTH - x - 1;
+ break;
+ case 2:
+ x = WIDTH - x - 1;
+ y = HEIGHT - y - 1;
+ break;
+ case 3:
+ ssd1306_swap(x, y);
+ y = HEIGHT - y - 1;
+ break;
+ }
+
+ // x is which column
+ switch (color)
+ {
+ case WHITE: buffer[x+ (y/8)*SSD1306_LCDWIDTH] |= (1 << (y&7)); break;
+ case BLACK: buffer[x+ (y/8)*SSD1306_LCDWIDTH] &= ~(1 << (y&7)); break;
+ case INVERSE: buffer[x+ (y/8)*SSD1306_LCDWIDTH] ^= (1 << (y&7)); break;
+ }
+
+}
+
+Adafruit_SSD1306::Adafruit_SSD1306(int8_t SID, int8_t SCLK, int8_t DC, int8_t RST, int8_t CS) : Adafruit_GFX(SSD1306_LCDWIDTH, SSD1306_LCDHEIGHT) {
+ cs = CS;
+ rst = RST;
+ dc = DC;
+ sclk = SCLK;
+ sid = SID;
+ hwSPI = false;
+}
+
+// constructor for hardware SPI - we indicate DataCommand, ChipSelect, Reset
+Adafruit_SSD1306::Adafruit_SSD1306(int8_t DC, int8_t RST, int8_t CS) : Adafruit_GFX(SSD1306_LCDWIDTH, SSD1306_LCDHEIGHT) {
+ dc = DC;
+ rst = RST;
+ cs = CS;
+ hwSPI = true;
+}
+
+// initializer for I2C - we only indicate the reset pin!
+Adafruit_SSD1306::Adafruit_SSD1306(int8_t reset) :
+Adafruit_GFX(SSD1306_LCDWIDTH, SSD1306_LCDHEIGHT) {
+ sclk = dc = cs = sid = -1;
+ rst = reset;
+}
+
+
+void Adafruit_SSD1306::begin(uint8_t vccstate, uint8_t i2caddr, bool reset) {
+ _vccstate = vccstate;
+ _i2caddr = i2caddr;
+
+ // set pin directions
+ if (sid != -1){
+ pinMode(dc, OUTPUT);
+ pinMode(cs, OUTPUT);
+#ifdef HAVE_PORTREG
+ csport = portOutputRegister(digitalPinToPort(cs));
+ cspinmask = digitalPinToBitMask(cs);
+ dcport = portOutputRegister(digitalPinToPort(dc));
+ dcpinmask = digitalPinToBitMask(dc);
+#endif
+ if (!hwSPI){
+ // set pins for software-SPI
+ pinMode(sid, OUTPUT);
+ pinMode(sclk, OUTPUT);
+#ifdef HAVE_PORTREG
+ clkport = portOutputRegister(digitalPinToPort(sclk));
+ clkpinmask = digitalPinToBitMask(sclk);
+ mosiport = portOutputRegister(digitalPinToPort(sid));
+ mosipinmask = digitalPinToBitMask(sid);
+#endif
+ }
+ if (hwSPI){
+ SPI.begin();
+#ifdef SPI_HAS_TRANSACTION
+ SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
+#else
+ SPI.setClockDivider (4);
+#endif
+ }
+ }
+ else
+ {
+ // I2C Init
+ Wire.begin();
+#ifdef __SAM3X8E__
+ // Force 400 KHz I2C, rawr! (Uses pins 20, 21 for SDA, SCL)
+ TWI1->TWI_CWGR = 0;
+ TWI1->TWI_CWGR = ((VARIANT_MCK / (2 * 400000)) - 4) * 0x101;
+#endif
+ }
+ if ((reset) && (rst >= 0)) {
+ // Setup reset pin direction (used by both SPI and I2C)
+ pinMode(rst, OUTPUT);
+ digitalWrite(rst, HIGH);
+ // VDD (3.3V) goes high at start, lets just chill for a ms
+ delay(1);
+ // bring reset low
+ digitalWrite(rst, LOW);
+ // wait 10ms
+ delay(10);
+ // bring out of reset
+ digitalWrite(rst, HIGH);
+ // turn on VCC (9V?)
+ }
+
+ // Init sequence
+ ssd1306_command(SSD1306_DISPLAYOFF); // 0xAE
+ ssd1306_command(SSD1306_SETDISPLAYCLOCKDIV); // 0xD5
+ ssd1306_command(0x80); // the suggested ratio 0x80
+
+ ssd1306_command(SSD1306_SETMULTIPLEX); // 0xA8
+ ssd1306_command(SSD1306_LCDHEIGHT - 1);
+
+ ssd1306_command(SSD1306_SETDISPLAYOFFSET); // 0xD3
+ ssd1306_command(0x0); // no offset
+ ssd1306_command(SSD1306_SETSTARTLINE | 0x0); // line #0
+ ssd1306_command(SSD1306_CHARGEPUMP); // 0x8D
+ if (vccstate == SSD1306_EXTERNALVCC)
+ { ssd1306_command(0x10); }
+ else
+ { ssd1306_command(0x14); }
+ ssd1306_command(SSD1306_MEMORYMODE); // 0x20
+ ssd1306_command(0x00); // 0x0 act like ks0108
+ ssd1306_command(SSD1306_SEGREMAP | 0x1);
+ ssd1306_command(SSD1306_COMSCANDEC);
+
+ #if defined SSD1306_128_32
+ ssd1306_command(SSD1306_SETCOMPINS); // 0xDA
+ ssd1306_command(0x02);
+ ssd1306_command(SSD1306_SETCONTRAST); // 0x81
+ ssd1306_command(0x8F);
+
+#elif defined SSD1306_128_64
+ ssd1306_command(SSD1306_SETCOMPINS); // 0xDA
+ ssd1306_command(0x12);
+ ssd1306_command(SSD1306_SETCONTRAST); // 0x81
+ if (vccstate == SSD1306_EXTERNALVCC)
+ { ssd1306_command(0x9F); }
+ else
+ { ssd1306_command(0xCF); }
+
+#elif defined SSD1306_96_16
+ ssd1306_command(SSD1306_SETCOMPINS); // 0xDA
+ ssd1306_command(0x2); //ada x12
+ ssd1306_command(SSD1306_SETCONTRAST); // 0x81
+ if (vccstate == SSD1306_EXTERNALVCC)
+ { ssd1306_command(0x10); }
+ else
+ { ssd1306_command(0xAF); }
+
+#endif
+
+ ssd1306_command(SSD1306_SETPRECHARGE); // 0xd9
+ if (vccstate == SSD1306_EXTERNALVCC)
+ { ssd1306_command(0x22); }
+ else
+ { ssd1306_command(0xF1); }
+ ssd1306_command(SSD1306_SETVCOMDETECT); // 0xDB
+ ssd1306_command(0x40);
+ ssd1306_command(SSD1306_DISPLAYALLON_RESUME); // 0xA4
+ ssd1306_command(SSD1306_NORMALDISPLAY); // 0xA6
+
+ ssd1306_command(SSD1306_DEACTIVATE_SCROLL);
+
+ ssd1306_command(SSD1306_DISPLAYON);//--turn on oled panel
+}
+
+
+void Adafruit_SSD1306::invertDisplay(uint8_t i) {
+ if (i) {
+ ssd1306_command(SSD1306_INVERTDISPLAY);
+ } else {
+ ssd1306_command(SSD1306_NORMALDISPLAY);
+ }
+}
+
+void Adafruit_SSD1306::ssd1306_command(uint8_t c) {
+ if (sid != -1)
+ {
+ // SPI
+#ifdef HAVE_PORTREG
+ *csport |= cspinmask;
+ *dcport &= ~dcpinmask;
+ *csport &= ~cspinmask;
+#else
+ digitalWrite(cs, HIGH);
+ digitalWrite(dc, LOW);
+ digitalWrite(cs, LOW);
+#endif
+ fastSPIwrite(c);
+#ifdef HAVE_PORTREG
+ *csport |= cspinmask;
+#else
+ digitalWrite(cs, HIGH);
+#endif
+ }
+ else
+ {
+ // I2C
+ uint8_t control = 0x00; // Co = 0, D/C = 0
+ Wire.beginTransmission(_i2caddr);
+ Wire.write(control);
+ Wire.write(c);
+ Wire.endTransmission();
+ }
+}
+
+// startscrollright
+// Activate a right handed scroll for rows start through stop
+// Hint, the display is 16 rows tall. To scroll the whole display, run:
+// display.scrollright(0x00, 0x0F)
+void Adafruit_SSD1306::startscrollright(uint8_t start, uint8_t stop){
+ ssd1306_command(SSD1306_RIGHT_HORIZONTAL_SCROLL);
+ ssd1306_command(0X00);
+ ssd1306_command(start);
+ ssd1306_command(0X00);
+ ssd1306_command(stop);
+ ssd1306_command(0X00);
+ ssd1306_command(0XFF);
+ ssd1306_command(SSD1306_ACTIVATE_SCROLL);
+}
+
+// startscrollleft
+// Activate a right handed scroll for rows start through stop
+// Hint, the display is 16 rows tall. To scroll the whole display, run:
+// display.scrollright(0x00, 0x0F)
+void Adafruit_SSD1306::startscrollleft(uint8_t start, uint8_t stop){
+ ssd1306_command(SSD1306_LEFT_HORIZONTAL_SCROLL);
+ ssd1306_command(0X00);
+ ssd1306_command(start);
+ ssd1306_command(0X00);
+ ssd1306_command(stop);
+ ssd1306_command(0X00);
+ ssd1306_command(0XFF);
+ ssd1306_command(SSD1306_ACTIVATE_SCROLL);
+}
+
+// startscrolldiagright
+// Activate a diagonal scroll for rows start through stop
+// Hint, the display is 16 rows tall. To scroll the whole display, run:
+// display.scrollright(0x00, 0x0F)
+void Adafruit_SSD1306::startscrolldiagright(uint8_t start, uint8_t stop){
+ ssd1306_command(SSD1306_SET_VERTICAL_SCROLL_AREA);
+ ssd1306_command(0X00);
+ ssd1306_command(SSD1306_LCDHEIGHT);
+ ssd1306_command(SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL);
+ ssd1306_command(0X00);
+ ssd1306_command(start);
+ ssd1306_command(0X00);
+ ssd1306_command(stop);
+ ssd1306_command(0X01);
+ ssd1306_command(SSD1306_ACTIVATE_SCROLL);
+}
+
+// startscrolldiagleft
+// Activate a diagonal scroll for rows start through stop
+// Hint, the display is 16 rows tall. To scroll the whole display, run:
+// display.scrollright(0x00, 0x0F)
+void Adafruit_SSD1306::startscrolldiagleft(uint8_t start, uint8_t stop){
+ ssd1306_command(SSD1306_SET_VERTICAL_SCROLL_AREA);
+ ssd1306_command(0X00);
+ ssd1306_command(SSD1306_LCDHEIGHT);
+ ssd1306_command(SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL);
+ ssd1306_command(0X00);
+ ssd1306_command(start);
+ ssd1306_command(0X00);
+ ssd1306_command(stop);
+ ssd1306_command(0X01);
+ ssd1306_command(SSD1306_ACTIVATE_SCROLL);
+}
+
+void Adafruit_SSD1306::stopscroll(void){
+ ssd1306_command(SSD1306_DEACTIVATE_SCROLL);
+}
+
+// Dim the display
+// dim = true: display is dimmed
+// dim = false: display is normal
+void Adafruit_SSD1306::dim(boolean dim) {
+ uint8_t contrast;
+
+ if (dim) {
+ contrast = 0; // Dimmed display
+ } else {
+ if (_vccstate == SSD1306_EXTERNALVCC) {
+ contrast = 0x9F;
+ } else {
+ contrast = 0xCF;
+ }
+ }
+ // the range of contrast to too small to be really useful
+ // it is useful to dim the display
+ ssd1306_command(SSD1306_SETCONTRAST);
+ ssd1306_command(contrast);
+}
+
+void Adafruit_SSD1306::display(void) {
+ ssd1306_command(SSD1306_COLUMNADDR);
+ ssd1306_command(0); // Column start address (0 = reset)
+ ssd1306_command(SSD1306_LCDWIDTH-1); // Column end address (127 = reset)
+
+ ssd1306_command(SSD1306_PAGEADDR);
+ ssd1306_command(0); // Page start address (0 = reset)
+ #if SSD1306_LCDHEIGHT == 64
+ ssd1306_command(7); // Page end address
+ #endif
+ #if SSD1306_LCDHEIGHT == 32
+ ssd1306_command(3); // Page end address
+ #endif
+ #if SSD1306_LCDHEIGHT == 16
+ ssd1306_command(1); // Page end address
+ #endif
+
+ if (sid != -1)
+ {
+ // SPI
+#ifdef HAVE_PORTREG
+ *csport |= cspinmask;
+ *dcport |= dcpinmask;
+ *csport &= ~cspinmask;
+#else
+ digitalWrite(cs, HIGH);
+ digitalWrite(dc, HIGH);
+ digitalWrite(cs, LOW);
+#endif
+
+ for (uint16_t i=0; i<(SSD1306_LCDWIDTH*SSD1306_LCDHEIGHT/8); i++) {
+ fastSPIwrite(buffer[i]);
+ }
+#ifdef HAVE_PORTREG
+ *csport |= cspinmask;
+#else
+ digitalWrite(cs, HIGH);
+#endif
+ }
+ else
+ {
+ // save I2C bitrate
+#ifdef TWBR
+ uint8_t twbrbackup = TWBR;
+ TWBR = 12; // upgrade to 400KHz!
+#endif
+
+ //Serial.println(TWBR, DEC);
+ //Serial.println(TWSR & 0x3, DEC);
+
+ // I2C
+ for (uint16_t i=0; i<(SSD1306_LCDWIDTH*SSD1306_LCDHEIGHT/8); i++) {
+ // send a bunch of data in one xmission
+ Wire.beginTransmission(_i2caddr);
+ WIRE_WRITE(0x40);
+ for (uint8_t x=0; x<16; x++) {
+ WIRE_WRITE(buffer[i]);
+ i++;
+ }
+ i--;
+ Wire.endTransmission();
+ }
+#ifdef TWBR
+ TWBR = twbrbackup;
+#endif
+ }
+}
+
+// clear everything
+void Adafruit_SSD1306::clearDisplay(void) {
+ memset(buffer, 0, (SSD1306_LCDWIDTH*SSD1306_LCDHEIGHT/8));
+}
+
+
+inline void Adafruit_SSD1306::fastSPIwrite(uint8_t d) {
+
+ if(hwSPI) {
+ (void)SPI.transfer(d);
+ } else {
+ for(uint8_t bit = 0x80; bit; bit >>= 1) {
+#ifdef HAVE_PORTREG
+ *clkport &= ~clkpinmask;
+ if(d & bit) *mosiport |= mosipinmask;
+ else *mosiport &= ~mosipinmask;
+ *clkport |= clkpinmask;
+#else
+ digitalWrite(sclk, LOW);
+ if(d & bit) digitalWrite(sid, HIGH);
+ else digitalWrite(sid, LOW);
+ digitalWrite(sclk, HIGH);
+#endif
+ }
+ }
+}
+
+void Adafruit_SSD1306::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) {
+ boolean bSwap = false;
+ switch(rotation) {
+ case 0:
+ // 0 degree rotation, do nothing
+ break;
+ case 1:
+ // 90 degree rotation, swap x & y for rotation, then invert x
+ bSwap = true;
+ ssd1306_swap(x, y);
+ x = WIDTH - x - 1;
+ break;
+ case 2:
+ // 180 degree rotation, invert x and y - then shift y around for height.
+ x = WIDTH - x - 1;
+ y = HEIGHT - y - 1;
+ x -= (w-1);
+ break;
+ case 3:
+ // 270 degree rotation, swap x & y for rotation, then invert y and adjust y for w (not to become h)
+ bSwap = true;
+ ssd1306_swap(x, y);
+ y = HEIGHT - y - 1;
+ y -= (w-1);
+ break;
+ }
+
+ if(bSwap) {
+ drawFastVLineInternal(x, y, w, color);
+ } else {
+ drawFastHLineInternal(x, y, w, color);
+ }
+}
+
+void Adafruit_SSD1306::drawFastHLineInternal(int16_t x, int16_t y, int16_t w, uint16_t color) {
+ // Do bounds/limit checks
+ if(y < 0 || y >= HEIGHT) { return; }
+
+ // make sure we don't try to draw below 0
+ if(x < 0) {
+ w += x;
+ x = 0;
+ }
+
+ // make sure we don't go off the edge of the display
+ if( (x + w) > WIDTH) {
+ w = (WIDTH - x);
+ }
+
+ // if our width is now negative, punt
+ if(w <= 0) { return; }
+
+ // set up the pointer for movement through the buffer
+ register uint8_t *pBuf = buffer;
+ // adjust the buffer pointer for the current row
+ pBuf += ((y/8) * SSD1306_LCDWIDTH);
+ // and offset x columns in
+ pBuf += x;
+
+ register uint8_t mask = 1 << (y&7);
+
+ switch (color)
+ {
+ case WHITE: while(w--) { *pBuf++ |= mask; }; break;
+ case BLACK: mask = ~mask; while(w--) { *pBuf++ &= mask; }; break;
+ case INVERSE: while(w--) { *pBuf++ ^= mask; }; break;
+ }
+}
+
+void Adafruit_SSD1306::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) {
+ bool bSwap = false;
+ switch(rotation) {
+ case 0:
+ break;
+ case 1:
+ // 90 degree rotation, swap x & y for rotation, then invert x and adjust x for h (now to become w)
+ bSwap = true;
+ ssd1306_swap(x, y);
+ x = WIDTH - x - 1;
+ x -= (h-1);
+ break;
+ case 2:
+ // 180 degree rotation, invert x and y - then shift y around for height.
+ x = WIDTH - x - 1;
+ y = HEIGHT - y - 1;
+ y -= (h-1);
+ break;
+ case 3:
+ // 270 degree rotation, swap x & y for rotation, then invert y
+ bSwap = true;
+ ssd1306_swap(x, y);
+ y = HEIGHT - y - 1;
+ break;
+ }
+
+ if(bSwap) {
+ drawFastHLineInternal(x, y, h, color);
+ } else {
+ drawFastVLineInternal(x, y, h, color);
+ }
+}
+
+
+void Adafruit_SSD1306::drawFastVLineInternal(int16_t x, int16_t __y, int16_t __h, uint16_t color) {
+
+ // do nothing if we're off the left or right side of the screen
+ if(x < 0 || x >= WIDTH) { return; }
+
+ // make sure we don't try to draw below 0
+ if(__y < 0) {
+ // __y is negative, this will subtract enough from __h to account for __y being 0
+ __h += __y;
+ __y = 0;
+
+ }
+
+ // make sure we don't go past the height of the display
+ if( (__y + __h) > HEIGHT) {
+ __h = (HEIGHT - __y);
+ }
+
+ // if our height is now negative, punt
+ if(__h <= 0) {
+ return;
+ }
+
+ // this display doesn't need ints for coordinates, use local byte registers for faster juggling
+ register uint8_t y = __y;
+ register uint8_t h = __h;
+
+
+ // set up the pointer for fast movement through the buffer
+ register uint8_t *pBuf = buffer;
+ // adjust the buffer pointer for the current row
+ pBuf += ((y/8) * SSD1306_LCDWIDTH);
+ // and offset x columns in
+ pBuf += x;
+
+ // do the first partial byte, if necessary - this requires some masking
+ register uint8_t mod = (y&7);
+ if(mod) {
+ // mask off the high n bits we want to set
+ mod = 8-mod;
+
+ // note - lookup table results in a nearly 10% performance improvement in fill* functions
+ // register uint8_t mask = ~(0xFF >> (mod));
+ static uint8_t premask[8] = {0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE };
+ register uint8_t mask = premask[mod];
+
+ // adjust the mask if we're not going to reach the end of this byte
+ if( h < mod) {
+ mask &= (0XFF >> (mod-h));
+ }
+
+ switch (color)
+ {
+ case WHITE: *pBuf |= mask; break;
+ case BLACK: *pBuf &= ~mask; break;
+ case INVERSE: *pBuf ^= mask; break;
+ }
+
+ // fast exit if we're done here!
+ if(h= 8) {
+ if (color == INVERSE) { // separate copy of the code so we don't impact performance of the black/white write version with an extra comparison per loop
+ do {
+ *pBuf=~(*pBuf);
+
+ // adjust the buffer forward 8 rows worth of data
+ pBuf += SSD1306_LCDWIDTH;
+
+ // adjust h & y (there's got to be a faster way for me to do this, but this should still help a fair bit for now)
+ h -= 8;
+ } while(h >= 8);
+ }
+ else {
+ // store a local value to work with
+ register uint8_t val = (color == WHITE) ? 255 : 0;
+
+ do {
+ // write our value in
+ *pBuf = val;
+
+ // adjust the buffer forward 8 rows worth of data
+ pBuf += SSD1306_LCDWIDTH;
+
+ // adjust h & y (there's got to be a faster way for me to do this, but this should still help a fair bit for now)
+ h -= 8;
+ } while(h >= 8);
+ }
+ }
+
+ // now do the final partial byte, if necessary
+ if(h) {
+ mod = h & 7;
+ // this time we want to mask the low bits of the byte, vs the high bits we did above
+ // register uint8_t mask = (1 << mod) - 1;
+ // note - lookup table results in a nearly 10% performance improvement in fill* functions
+ static uint8_t postmask[8] = {0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F };
+ register uint8_t mask = postmask[mod];
+ switch (color)
+ {
+ case WHITE: *pBuf |= mask; break;
+ case BLACK: *pBuf &= ~mask; break;
+ case INVERSE: *pBuf ^= mask; break;
+ }
+ }
+}
diff --git a/lib/Adafruit_SSD1306-1.1.2/Adafruit_SSD1306.h b/lib/Adafruit_SSD1306-1.1.2/Adafruit_SSD1306.h
new file mode 100644
index 000000000000..1d43dfddf080
--- /dev/null
+++ b/lib/Adafruit_SSD1306-1.1.2/Adafruit_SSD1306.h
@@ -0,0 +1,186 @@
+/*********************************************************************
+This is a library for our Monochrome OLEDs based on SSD1306 drivers
+
+ Pick one up today in the adafruit shop!
+ ------> http://www.adafruit.com/category/63_98
+
+These displays use SPI to communicate, 4 or 5 pins are required to
+interface
+
+Adafruit invests time and resources providing this open source code,
+please support Adafruit and open-source hardware by purchasing
+products from Adafruit!
+
+Written by Limor Fried/Ladyada for Adafruit Industries.
+BSD license, check license.txt for more information
+All text above, and the splash screen must be included in any redistribution
+*********************************************************************/
+#ifndef _Adafruit_SSD1306_H_
+#define _Adafruit_SSD1306_H_
+
+#if ARDUINO >= 100
+ #include "Arduino.h"
+ #define WIRE_WRITE Wire.write
+#else
+ #include "WProgram.h"
+ #define WIRE_WRITE Wire.send
+#endif
+
+#if defined(__SAM3X8E__)
+ typedef volatile RwReg PortReg;
+ typedef uint32_t PortMask;
+ #define HAVE_PORTREG
+#elif defined(ARDUINO_ARCH_SAMD)
+// not supported
+#elif defined(ESP8266) || defined(ESP32) || defined(ARDUINO_STM32_FEATHER) || defined(__arc__)
+ typedef volatile uint32_t PortReg;
+ typedef uint32_t PortMask;
+#elif defined(__AVR__)
+ typedef volatile uint8_t PortReg;
+ typedef uint8_t PortMask;
+ #define HAVE_PORTREG
+#else
+ // chances are its 32 bit so assume that
+ typedef volatile uint32_t PortReg;
+ typedef uint32_t PortMask;
+#endif
+
+#include
+#include
+
+#define BLACK 0
+#define WHITE 1
+#define INVERSE 2
+
+#define SSD1306_I2C_ADDRESS 0x3C // 011110+SA0+RW - 0x3C or 0x3D
+// Address for 128x32 is 0x3C
+// Address for 128x64 is 0x3D (default) or 0x3C (if SA0 is grounded)
+
+/*=========================================================================
+ SSD1306 Displays
+ -----------------------------------------------------------------------
+ The driver is used in multiple displays (128x64, 128x32, etc.).
+ Select the appropriate display below to create an appropriately
+ sized framebuffer, etc.
+
+ SSD1306_128_64 128x64 pixel display
+
+ SSD1306_128_32 128x32 pixel display
+
+ SSD1306_96_16
+
+ -----------------------------------------------------------------------*/
+ #define SSD1306_128_64
+// #define SSD1306_128_32
+// #define SSD1306_96_16
+/*=========================================================================*/
+
+#if defined SSD1306_128_64 && defined SSD1306_128_32
+ #error "Only one SSD1306 display can be specified at once in SSD1306.h"
+#endif
+#if !defined SSD1306_128_64 && !defined SSD1306_128_32 && !defined SSD1306_96_16
+ #error "At least one SSD1306 display must be specified in SSD1306.h"
+#endif
+
+#if defined SSD1306_128_64
+ #define SSD1306_LCDWIDTH 128
+ #define SSD1306_LCDHEIGHT 64
+#endif
+#if defined SSD1306_128_32
+ #define SSD1306_LCDWIDTH 128
+ #define SSD1306_LCDHEIGHT 32
+#endif
+#if defined SSD1306_96_16
+ #define SSD1306_LCDWIDTH 96
+ #define SSD1306_LCDHEIGHT 16
+#endif
+
+#define SSD1306_SETCONTRAST 0x81
+#define SSD1306_DISPLAYALLON_RESUME 0xA4
+#define SSD1306_DISPLAYALLON 0xA5
+#define SSD1306_NORMALDISPLAY 0xA6
+#define SSD1306_INVERTDISPLAY 0xA7
+#define SSD1306_DISPLAYOFF 0xAE
+#define SSD1306_DISPLAYON 0xAF
+
+#define SSD1306_SETDISPLAYOFFSET 0xD3
+#define SSD1306_SETCOMPINS 0xDA
+
+#define SSD1306_SETVCOMDETECT 0xDB
+
+#define SSD1306_SETDISPLAYCLOCKDIV 0xD5
+#define SSD1306_SETPRECHARGE 0xD9
+
+#define SSD1306_SETMULTIPLEX 0xA8
+
+#define SSD1306_SETLOWCOLUMN 0x00
+#define SSD1306_SETHIGHCOLUMN 0x10
+
+#define SSD1306_SETSTARTLINE 0x40
+
+#define SSD1306_MEMORYMODE 0x20
+#define SSD1306_COLUMNADDR 0x21
+#define SSD1306_PAGEADDR 0x22
+
+#define SSD1306_COMSCANINC 0xC0
+#define SSD1306_COMSCANDEC 0xC8
+
+#define SSD1306_SEGREMAP 0xA0
+
+#define SSD1306_CHARGEPUMP 0x8D
+
+#define SSD1306_EXTERNALVCC 0x1
+#define SSD1306_SWITCHCAPVCC 0x2
+
+// Scrolling #defines
+#define SSD1306_ACTIVATE_SCROLL 0x2F
+#define SSD1306_DEACTIVATE_SCROLL 0x2E
+#define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3
+#define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26
+#define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27
+#define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29
+#define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A
+
+class Adafruit_SSD1306 : public Adafruit_GFX {
+ public:
+ Adafruit_SSD1306(int8_t SID, int8_t SCLK, int8_t DC, int8_t RST, int8_t CS);
+ Adafruit_SSD1306(int8_t DC, int8_t RST, int8_t CS);
+ Adafruit_SSD1306(int8_t RST = -1);
+
+ void begin(uint8_t switchvcc = SSD1306_SWITCHCAPVCC, uint8_t i2caddr = SSD1306_I2C_ADDRESS, bool reset=true);
+ void ssd1306_command(uint8_t c);
+
+ void clearDisplay(void);
+ void invertDisplay(uint8_t i);
+ void display();
+
+ void startscrollright(uint8_t start, uint8_t stop);
+ void startscrollleft(uint8_t start, uint8_t stop);
+
+ void startscrolldiagright(uint8_t start, uint8_t stop);
+ void startscrolldiagleft(uint8_t start, uint8_t stop);
+ void stopscroll(void);
+
+ void dim(boolean dim);
+
+ void drawPixel(int16_t x, int16_t y, uint16_t color);
+
+ virtual void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
+ virtual void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
+
+ private:
+ int8_t _i2caddr, _vccstate, sid, sclk, dc, rst, cs;
+ void fastSPIwrite(uint8_t c);
+
+ boolean hwSPI;
+#ifdef HAVE_PORTREG
+ PortReg *mosiport, *clkport, *csport, *dcport;
+ PortMask mosipinmask, clkpinmask, cspinmask, dcpinmask;
+#endif
+
+ inline void drawFastVLineInternal(int16_t x, int16_t y, int16_t h, uint16_t color) __attribute__((always_inline));
+ inline void drawFastHLineInternal(int16_t x, int16_t y, int16_t w, uint16_t color) __attribute__((always_inline));
+
+};
+
+#endif /* _Adafruit_SSD1306_H_ */
diff --git a/lib/Adafruit_SSD1306-1.1.2/README.md b/lib/Adafruit_SSD1306-1.1.2/README.md
new file mode 100644
index 000000000000..d76bb285ceb2
--- /dev/null
+++ b/lib/Adafruit_SSD1306-1.1.2/README.md
@@ -0,0 +1,32 @@
+# Adafruit_SSD1306
+
+
+## Compatibility
+
+MCU | Tested Works | Doesn't Work | Not Tested | Notes
+------------------ | :----------: | :----------: | :---------: | -----
+Atmega328 @ 16MHz | X | | |
+Atmega328 @ 12MHz | X | | |
+Atmega32u4 @ 16MHz | X | | |
+Atmega32u4 @ 8MHz | X | | |
+ESP8266 | X | | | change OLED_RESET to different pin if using default I2C pins D4/D5.
+Atmega2560 @ 16MHz | X | | |
+ATSAM3X8E | X | | |
+ATSAM21D | X | | |
+ATtiny85 @ 16MHz | | X | |
+ATtiny85 @ 8MHz | | X | |
+Intel Curie @ 32MHz | | | X |
+STM32F2 | | | X |
+
+ * ATmega328 @ 16MHz : Arduino UNO, Adafruit Pro Trinket 5V, Adafruit Metro 328, Adafruit Metro Mini
+ * ATmega328 @ 12MHz : Adafruit Pro Trinket 3V
+ * ATmega32u4 @ 16MHz : Arduino Leonardo, Arduino Micro, Arduino Yun, Teensy 2.0
+ * ATmega32u4 @ 8MHz : Adafruit Flora, Bluefruit Micro
+ * ESP8266 : Adafruit Huzzah
+ * ATmega2560 @ 16MHz : Arduino Mega
+ * ATSAM3X8E : Arduino Due
+ * ATSAM21D : Arduino Zero, M0 Pro
+ * ATtiny85 @ 16MHz : Adafruit Trinket 5V
+ * ATtiny85 @ 8MHz : Adafruit Gemma, Arduino Gemma, Adafruit Trinket 3V
+
+
diff --git a/lib/Adafruit_SSD1306-1.1.2/README.txt b/lib/Adafruit_SSD1306-1.1.2/README.txt
new file mode 100644
index 000000000000..420cc153cc99
--- /dev/null
+++ b/lib/Adafruit_SSD1306-1.1.2/README.txt
@@ -0,0 +1,24 @@
+This is a library for our Monochrome OLEDs based on SSD1306 drivers
+
+ Pick one up today in the adafruit shop!
+ ------> http://www.adafruit.com/category/63_98
+
+These displays use SPI to communicate, 4 or 5 pins are required to
+interface
+
+Adafruit invests time and resources providing this open source code,
+please support Adafruit and open-source hardware by purchasing
+products from Adafruit!
+
+Written by Limor Fried/Ladyada for Adafruit Industries.
+Scrolling code contributed by Michael Gregg
+BSD license, check license.txt for more information
+All text above must be included in any redistribution
+
+To download. click the DOWNLOADS button in the top right corner, rename the uncompressed folder Adafruit_SSD1306. Check that the Adafruit_SSD1306 folder contains Adafruit_SSD1306.cpp and Adafruit_SSD1306.h
+
+Place the Adafruit_SSD1306 library folder your /libraries/ folder. You may need to create the libraries subfolder if its your first library. Restart the IDE.
+
+You will also have to download the Adafruit GFX Graphics core which does all the circles, text, rectangles, etc. You can get it from
+https://github.com/adafruit/Adafruit-GFX-Library
+and download/install that library as well
\ No newline at end of file
diff --git a/lib/Adafruit_SSD1306-1.1.2/examples/ssd1306_128x32_i2c/ssd1306_128x32_i2c.ino b/lib/Adafruit_SSD1306-1.1.2/examples/ssd1306_128x32_i2c/ssd1306_128x32_i2c.ino
new file mode 100644
index 000000000000..b3b8bfa9a785
--- /dev/null
+++ b/lib/Adafruit_SSD1306-1.1.2/examples/ssd1306_128x32_i2c/ssd1306_128x32_i2c.ino
@@ -0,0 +1,375 @@
+/*********************************************************************
+This is an example for our Monochrome OLEDs based on SSD1306 drivers
+
+ Pick one up today in the adafruit shop!
+ ------> http://www.adafruit.com/category/63_98
+
+This example is for a 128x32 size display using I2C to communicate
+3 pins are required to interface (2 I2C and one reset)
+
+Adafruit invests time and resources providing this open source code,
+please support Adafruit and open-source hardware by purchasing
+products from Adafruit!
+
+Written by Limor Fried/Ladyada for Adafruit Industries.
+BSD license, check license.txt for more information
+All text above, and the splash screen must be included in any redistribution
+*********************************************************************/
+
+#include
+#include
+#include
+#include
+
+#define OLED_RESET 4
+Adafruit_SSD1306 display(OLED_RESET);
+
+#define NUMFLAKES 10
+#define XPOS 0
+#define YPOS 1
+#define DELTAY 2
+
+
+#define LOGO16_GLCD_HEIGHT 16
+#define LOGO16_GLCD_WIDTH 16
+static const unsigned char PROGMEM logo16_glcd_bmp[] =
+{ B00000000, B11000000,
+ B00000001, B11000000,
+ B00000001, B11000000,
+ B00000011, B11100000,
+ B11110011, B11100000,
+ B11111110, B11111000,
+ B01111110, B11111111,
+ B00110011, B10011111,
+ B00011111, B11111100,
+ B00001101, B01110000,
+ B00011011, B10100000,
+ B00111111, B11100000,
+ B00111111, B11110000,
+ B01111100, B11110000,
+ B01110000, B01110000,
+ B00000000, B00110000 };
+
+#if (SSD1306_LCDHEIGHT != 32)
+#error("Height incorrect, please fix Adafruit_SSD1306.h!");
+#endif
+
+void setup() {
+ Serial.begin(9600);
+
+ // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
+ display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32)
+ // init done
+
+ // Show image buffer on the display hardware.
+ // Since the buffer is intialized with an Adafruit splashscreen
+ // internally, this will display the splashscreen.
+ display.display();
+ delay(2000);
+
+ // Clear the buffer.
+ display.clearDisplay();
+
+ // draw a single pixel
+ display.drawPixel(10, 10, WHITE);
+ // Show the display buffer on the hardware.
+ // NOTE: You _must_ call display after making any drawing commands
+ // to make them visible on the display hardware!
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw many lines
+ testdrawline();
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw rectangles
+ testdrawrect();
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw multiple rectangles
+ testfillrect();
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw mulitple circles
+ testdrawcircle();
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw a white circle, 10 pixel radius
+ display.fillCircle(display.width()/2, display.height()/2, 10, WHITE);
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ testdrawroundrect();
+ delay(2000);
+ display.clearDisplay();
+
+ testfillroundrect();
+ delay(2000);
+ display.clearDisplay();
+
+ testdrawtriangle();
+ delay(2000);
+ display.clearDisplay();
+
+ testfilltriangle();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw the first ~12 characters in the font
+ testdrawchar();
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw scrolling text
+ testscrolltext();
+ delay(2000);
+ display.clearDisplay();
+
+ // text display tests
+ display.setTextSize(1);
+ display.setTextColor(WHITE);
+ display.setCursor(0,0);
+ display.println("Hello, world!");
+ display.setTextColor(BLACK, WHITE); // 'inverted' text
+ display.println(3.141592);
+ display.setTextSize(2);
+ display.setTextColor(WHITE);
+ display.print("0x"); display.println(0xDEADBEEF, HEX);
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // miniature bitmap display
+ display.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1);
+ display.display();
+ delay(1);
+
+ // invert the display
+ display.invertDisplay(true);
+ delay(1000);
+ display.invertDisplay(false);
+ delay(1000);
+ display.clearDisplay();
+
+ // draw a bitmap icon and 'animate' movement
+ testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH);
+}
+
+
+void loop() {
+
+}
+
+
+void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) {
+ uint8_t icons[NUMFLAKES][3];
+
+ // initialize
+ for (uint8_t f=0; f< NUMFLAKES; f++) {
+ icons[f][XPOS] = random(display.width());
+ icons[f][YPOS] = 0;
+ icons[f][DELTAY] = random(5) + 1;
+
+ Serial.print("x: ");
+ Serial.print(icons[f][XPOS], DEC);
+ Serial.print(" y: ");
+ Serial.print(icons[f][YPOS], DEC);
+ Serial.print(" dy: ");
+ Serial.println(icons[f][DELTAY], DEC);
+ }
+
+ while (1) {
+ // draw each icon
+ for (uint8_t f=0; f< NUMFLAKES; f++) {
+ display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, WHITE);
+ }
+ display.display();
+ delay(200);
+
+ // then erase it + move it
+ for (uint8_t f=0; f< NUMFLAKES; f++) {
+ display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, BLACK);
+ // move it
+ icons[f][YPOS] += icons[f][DELTAY];
+ // if its gone, reinit
+ if (icons[f][YPOS] > display.height()) {
+ icons[f][XPOS] = random(display.width());
+ icons[f][YPOS] = 0;
+ icons[f][DELTAY] = random(5) + 1;
+ }
+ }
+ }
+}
+
+
+void testdrawchar(void) {
+ display.setTextSize(1);
+ display.setTextColor(WHITE);
+ display.setCursor(0,0);
+
+ for (uint8_t i=0; i < 168; i++) {
+ if (i == '\n') continue;
+ display.write(i);
+ if ((i > 0) && (i % 21 == 0))
+ display.println();
+ }
+ display.display();
+ delay(1);
+}
+
+void testdrawcircle(void) {
+ for (int16_t i=0; i0; i-=5) {
+ display.fillTriangle(display.width()/2, display.height()/2-i,
+ display.width()/2-i, display.height()/2+i,
+ display.width()/2+i, display.height()/2+i, WHITE);
+ if (color == WHITE) color = BLACK;
+ else color = WHITE;
+ display.display();
+ delay(1);
+ }
+}
+
+void testdrawroundrect(void) {
+ for (int16_t i=0; i=0; i-=4) {
+ display.drawLine(0, display.height()-1, display.width()-1, i, WHITE);
+ display.display();
+ delay(1);
+ }
+ delay(250);
+
+ display.clearDisplay();
+ for (int16_t i=display.width()-1; i>=0; i-=4) {
+ display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE);
+ display.display();
+ delay(1);
+ }
+ for (int16_t i=display.height()-1; i>=0; i-=4) {
+ display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE);
+ display.display();
+ delay(1);
+ }
+ delay(250);
+
+ display.clearDisplay();
+ for (int16_t i=0; i http://www.adafruit.com/category/63_98
+
+This example is for a 128x32 size display using SPI to communicate
+4 or 5 pins are required to interface
+
+Adafruit invests time and resources providing this open source code,
+please support Adafruit and open-source hardware by purchasing
+products from Adafruit!
+
+Written by Limor Fried/Ladyada for Adafruit Industries.
+BSD license, check license.txt for more information
+All text above, and the splash screen must be included in any redistribution
+*********************************************************************/
+
+#include
+#include
+#include
+#include
+
+// If using software SPI (the default case):
+#define OLED_MOSI 9
+#define OLED_CLK 10
+#define OLED_DC 11
+#define OLED_CS 12
+#define OLED_RESET 13
+Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
+
+/* Uncomment this block to use hardware SPI
+#define OLED_DC 6
+#define OLED_CS 7
+#define OLED_RESET 8
+Adafruit_SSD1306 display(OLED_DC, OLED_RESET, OLED_CS);
+*/
+
+#define NUMFLAKES 10
+#define XPOS 0
+#define YPOS 1
+#define DELTAY 2
+
+#define LOGO16_GLCD_HEIGHT 16
+#define LOGO16_GLCD_WIDTH 16
+static const unsigned char PROGMEM logo16_glcd_bmp[] =
+{ B00000000, B11000000,
+ B00000001, B11000000,
+ B00000001, B11000000,
+ B00000011, B11100000,
+ B11110011, B11100000,
+ B11111110, B11111000,
+ B01111110, B11111111,
+ B00110011, B10011111,
+ B00011111, B11111100,
+ B00001101, B01110000,
+ B00011011, B10100000,
+ B00111111, B11100000,
+ B00111111, B11110000,
+ B01111100, B11110000,
+ B01110000, B01110000,
+ B00000000, B00110000 };
+
+#if (SSD1306_LCDHEIGHT != 32)
+#error("Height incorrect, please fix Adafruit_SSD1306.h!");
+#endif
+
+void setup() {
+ Serial.begin(9600);
+
+ // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
+ display.begin(SSD1306_SWITCHCAPVCC);
+ // init done
+
+ // Show image buffer on the display hardware.
+ // Since the buffer is intialized with an Adafruit splashscreen
+ // internally, this will display the splashscreen.
+ display.display();
+ delay(2000);
+
+ // Clear the buffer.
+ display.clearDisplay();
+
+ // draw a single pixel
+ display.drawPixel(10, 10, WHITE);
+ // Show the display buffer on the hardware.
+ // NOTE: You _must_ call display after making any drawing commands
+ // to make them visible on the display hardware!
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw many lines
+ testdrawline();
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw rectangles
+ testdrawrect();
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw multiple rectangles
+ testfillrect();
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw mulitple circles
+ testdrawcircle();
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw a white circle, 10 pixel radius
+ display.fillCircle(display.width()/2, display.height()/2, 10, WHITE);
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ testdrawroundrect();
+ delay(2000);
+ display.clearDisplay();
+
+ testfillroundrect();
+ delay(2000);
+ display.clearDisplay();
+
+ testdrawtriangle();
+ delay(2000);
+ display.clearDisplay();
+
+ testfilltriangle();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw the first ~12 characters in the font
+ testdrawchar();
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw scrolling text
+ testscrolltext();
+ delay(2000);
+ display.clearDisplay();
+
+ // text display tests
+ display.setTextSize(1);
+ display.setTextColor(WHITE);
+ display.setCursor(0,0);
+ display.println("Hello, world!");
+ display.setTextColor(BLACK, WHITE); // 'inverted' text
+ display.println(3.141592);
+ display.setTextSize(2);
+ display.setTextColor(WHITE);
+ display.print("0x"); display.println(0xDEADBEEF, HEX);
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // miniature bitmap display
+ display.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1);
+ display.display();
+
+ // invert the display
+ display.invertDisplay(true);
+ delay(1000);
+ display.invertDisplay(false);
+ delay(1000);
+ display.clearDisplay();
+
+ // draw a bitmap icon and 'animate' movement
+ testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH);
+}
+
+
+void loop() {
+
+}
+
+
+void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) {
+ uint8_t icons[NUMFLAKES][3];
+
+ // initialize
+ for (uint8_t f=0; f< NUMFLAKES; f++) {
+ icons[f][XPOS] = random(display.width());
+ icons[f][YPOS] = 0;
+ icons[f][DELTAY] = random(5) + 1;
+
+ Serial.print("x: ");
+ Serial.print(icons[f][XPOS], DEC);
+ Serial.print(" y: ");
+ Serial.print(icons[f][YPOS], DEC);
+ Serial.print(" dy: ");
+ Serial.println(icons[f][DELTAY], DEC);
+ }
+
+ while (1) {
+ // draw each icon
+ for (uint8_t f=0; f< NUMFLAKES; f++) {
+ display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, WHITE);
+ }
+ display.display();
+ delay(200);
+
+ // then erase it + move it
+ for (uint8_t f=0; f< NUMFLAKES; f++) {
+ display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, BLACK);
+ // move it
+ icons[f][YPOS] += icons[f][DELTAY];
+ // if its gone, reinit
+ if (icons[f][YPOS] > display.height()) {
+ icons[f][XPOS] = random(display.width());
+ icons[f][YPOS] = 0;
+ icons[f][DELTAY] = random(5) + 1;
+ }
+ }
+ }
+}
+
+
+void testdrawchar(void) {
+ display.setTextSize(1);
+ display.setTextColor(WHITE);
+ display.setCursor(0,0);
+
+ for (uint8_t i=0; i < 168; i++) {
+ if (i == '\n') continue;
+ display.write(i);
+ if ((i > 0) && (i % 21 == 0))
+ display.println();
+ }
+ display.display();
+}
+
+void testdrawcircle(void) {
+ for (int16_t i=0; i0; i-=5) {
+ display.fillTriangle(display.width()/2, display.height()/2-i,
+ display.width()/2-i, display.height()/2+i,
+ display.width()/2+i, display.height()/2+i, WHITE);
+ if (color == WHITE) color = BLACK;
+ else color = WHITE;
+ display.display();
+ }
+}
+
+void testdrawroundrect(void) {
+ for (int16_t i=0; i=0; i-=4) {
+ display.drawLine(0, display.height()-1, display.width()-1, i, WHITE);
+ display.display();
+ }
+ delay(250);
+
+ display.clearDisplay();
+ for (int16_t i=display.width()-1; i>=0; i-=4) {
+ display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE);
+ display.display();
+ }
+ for (int16_t i=display.height()-1; i>=0; i-=4) {
+ display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE);
+ display.display();
+ }
+ delay(250);
+
+ display.clearDisplay();
+ for (int16_t i=0; i http://www.adafruit.com/category/63_98
+
+This example is for a 128x64 size display using I2C to communicate
+3 pins are required to interface (2 I2C and one reset)
+
+Adafruit invests time and resources providing this open source code,
+please support Adafruit and open-source hardware by purchasing
+products from Adafruit!
+
+Written by Limor Fried/Ladyada for Adafruit Industries.
+BSD license, check license.txt for more information
+All text above, and the splash screen must be included in any redistribution
+*********************************************************************/
+
+#include
+#include
+#include
+#include
+
+#define OLED_RESET 4
+Adafruit_SSD1306 display(OLED_RESET);
+
+#define NUMFLAKES 10
+#define XPOS 0
+#define YPOS 1
+#define DELTAY 2
+
+
+#define LOGO16_GLCD_HEIGHT 16
+#define LOGO16_GLCD_WIDTH 16
+static const unsigned char PROGMEM logo16_glcd_bmp[] =
+{ B00000000, B11000000,
+ B00000001, B11000000,
+ B00000001, B11000000,
+ B00000011, B11100000,
+ B11110011, B11100000,
+ B11111110, B11111000,
+ B01111110, B11111111,
+ B00110011, B10011111,
+ B00011111, B11111100,
+ B00001101, B01110000,
+ B00011011, B10100000,
+ B00111111, B11100000,
+ B00111111, B11110000,
+ B01111100, B11110000,
+ B01110000, B01110000,
+ B00000000, B00110000 };
+
+#if (SSD1306_LCDHEIGHT != 64)
+#error("Height incorrect, please fix Adafruit_SSD1306.h!");
+#endif
+
+void setup() {
+ Serial.begin(9600);
+
+ // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
+ display.begin(SSD1306_SWITCHCAPVCC, 0x3D); // initialize with the I2C addr 0x3D (for the 128x64)
+ // init done
+
+ // Show image buffer on the display hardware.
+ // Since the buffer is intialized with an Adafruit splashscreen
+ // internally, this will display the splashscreen.
+ display.display();
+ delay(2000);
+
+ // Clear the buffer.
+ display.clearDisplay();
+
+ // draw a single pixel
+ display.drawPixel(10, 10, WHITE);
+ // Show the display buffer on the hardware.
+ // NOTE: You _must_ call display after making any drawing commands
+ // to make them visible on the display hardware!
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw many lines
+ testdrawline();
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw rectangles
+ testdrawrect();
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw multiple rectangles
+ testfillrect();
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw mulitple circles
+ testdrawcircle();
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw a white circle, 10 pixel radius
+ display.fillCircle(display.width()/2, display.height()/2, 10, WHITE);
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ testdrawroundrect();
+ delay(2000);
+ display.clearDisplay();
+
+ testfillroundrect();
+ delay(2000);
+ display.clearDisplay();
+
+ testdrawtriangle();
+ delay(2000);
+ display.clearDisplay();
+
+ testfilltriangle();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw the first ~12 characters in the font
+ testdrawchar();
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw scrolling text
+ testscrolltext();
+ delay(2000);
+ display.clearDisplay();
+
+ // text display tests
+ display.setTextSize(1);
+ display.setTextColor(WHITE);
+ display.setCursor(0,0);
+ display.println("Hello, world!");
+ display.setTextColor(BLACK, WHITE); // 'inverted' text
+ display.println(3.141592);
+ display.setTextSize(2);
+ display.setTextColor(WHITE);
+ display.print("0x"); display.println(0xDEADBEEF, HEX);
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // miniature bitmap display
+ display.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1);
+ display.display();
+ delay(1);
+
+ // invert the display
+ display.invertDisplay(true);
+ delay(1000);
+ display.invertDisplay(false);
+ delay(1000);
+ display.clearDisplay();
+
+ // draw a bitmap icon and 'animate' movement
+ testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH);
+}
+
+
+void loop() {
+
+}
+
+
+void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) {
+ uint8_t icons[NUMFLAKES][3];
+
+ // initialize
+ for (uint8_t f=0; f< NUMFLAKES; f++) {
+ icons[f][XPOS] = random(display.width());
+ icons[f][YPOS] = 0;
+ icons[f][DELTAY] = random(5) + 1;
+
+ Serial.print("x: ");
+ Serial.print(icons[f][XPOS], DEC);
+ Serial.print(" y: ");
+ Serial.print(icons[f][YPOS], DEC);
+ Serial.print(" dy: ");
+ Serial.println(icons[f][DELTAY], DEC);
+ }
+
+ while (1) {
+ // draw each icon
+ for (uint8_t f=0; f< NUMFLAKES; f++) {
+ display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, WHITE);
+ }
+ display.display();
+ delay(200);
+
+ // then erase it + move it
+ for (uint8_t f=0; f< NUMFLAKES; f++) {
+ display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, BLACK);
+ // move it
+ icons[f][YPOS] += icons[f][DELTAY];
+ // if its gone, reinit
+ if (icons[f][YPOS] > display.height()) {
+ icons[f][XPOS] = random(display.width());
+ icons[f][YPOS] = 0;
+ icons[f][DELTAY] = random(5) + 1;
+ }
+ }
+ }
+}
+
+
+void testdrawchar(void) {
+ display.setTextSize(1);
+ display.setTextColor(WHITE);
+ display.setCursor(0,0);
+
+ for (uint8_t i=0; i < 168; i++) {
+ if (i == '\n') continue;
+ display.write(i);
+ if ((i > 0) && (i % 21 == 0))
+ display.println();
+ }
+ display.display();
+ delay(1);
+}
+
+void testdrawcircle(void) {
+ for (int16_t i=0; i0; i-=5) {
+ display.fillTriangle(display.width()/2, display.height()/2-i,
+ display.width()/2-i, display.height()/2+i,
+ display.width()/2+i, display.height()/2+i, WHITE);
+ if (color == WHITE) color = BLACK;
+ else color = WHITE;
+ display.display();
+ delay(1);
+ }
+}
+
+void testdrawroundrect(void) {
+ for (int16_t i=0; i=0; i-=4) {
+ display.drawLine(0, display.height()-1, display.width()-1, i, WHITE);
+ display.display();
+ delay(1);
+ }
+ delay(250);
+
+ display.clearDisplay();
+ for (int16_t i=display.width()-1; i>=0; i-=4) {
+ display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE);
+ display.display();
+ delay(1);
+ }
+ for (int16_t i=display.height()-1; i>=0; i-=4) {
+ display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE);
+ display.display();
+ delay(1);
+ }
+ delay(250);
+
+ display.clearDisplay();
+ for (int16_t i=0; i http://www.adafruit.com/category/63_98
+
+This example is for a 128x64 size display using SPI to communicate
+4 or 5 pins are required to interface
+
+Adafruit invests time and resources providing this open source code,
+please support Adafruit and open-source hardware by purchasing
+products from Adafruit!
+
+Written by Limor Fried/Ladyada for Adafruit Industries.
+BSD license, check license.txt for more information
+All text above, and the splash screen must be included in any redistribution
+*********************************************************************/
+
+#include
+#include
+#include
+#include
+
+// If using software SPI (the default case):
+#define OLED_MOSI 9
+#define OLED_CLK 10
+#define OLED_DC 11
+#define OLED_CS 12
+#define OLED_RESET 13
+Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
+
+/* Uncomment this block to use hardware SPI
+#define OLED_DC 6
+#define OLED_CS 7
+#define OLED_RESET 8
+Adafruit_SSD1306 display(OLED_DC, OLED_RESET, OLED_CS);
+*/
+
+#define NUMFLAKES 10
+#define XPOS 0
+#define YPOS 1
+#define DELTAY 2
+
+#define LOGO16_GLCD_HEIGHT 16
+#define LOGO16_GLCD_WIDTH 16
+static const unsigned char PROGMEM logo16_glcd_bmp[] =
+{ B00000000, B11000000,
+ B00000001, B11000000,
+ B00000001, B11000000,
+ B00000011, B11100000,
+ B11110011, B11100000,
+ B11111110, B11111000,
+ B01111110, B11111111,
+ B00110011, B10011111,
+ B00011111, B11111100,
+ B00001101, B01110000,
+ B00011011, B10100000,
+ B00111111, B11100000,
+ B00111111, B11110000,
+ B01111100, B11110000,
+ B01110000, B01110000,
+ B00000000, B00110000 };
+
+#if (SSD1306_LCDHEIGHT != 64)
+#error("Height incorrect, please fix Adafruit_SSD1306.h!");
+#endif
+
+void setup() {
+ Serial.begin(9600);
+
+ // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
+ display.begin(SSD1306_SWITCHCAPVCC);
+ // init done
+
+ // Show image buffer on the display hardware.
+ // Since the buffer is intialized with an Adafruit splashscreen
+ // internally, this will display the splashscreen.
+ display.display();
+ delay(2000);
+
+ // Clear the buffer.
+ display.clearDisplay();
+
+ // draw a single pixel
+ display.drawPixel(10, 10, WHITE);
+ // Show the display buffer on the hardware.
+ // NOTE: You _must_ call display after making any drawing commands
+ // to make them visible on the display hardware!
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw many lines
+ testdrawline();
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw rectangles
+ testdrawrect();
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw multiple rectangles
+ testfillrect();
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw mulitple circles
+ testdrawcircle();
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw a white circle, 10 pixel radius
+ display.fillCircle(display.width()/2, display.height()/2, 10, WHITE);
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ testdrawroundrect();
+ delay(2000);
+ display.clearDisplay();
+
+ testfillroundrect();
+ delay(2000);
+ display.clearDisplay();
+
+ testdrawtriangle();
+ delay(2000);
+ display.clearDisplay();
+
+ testfilltriangle();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw the first ~12 characters in the font
+ testdrawchar();
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // draw scrolling text
+ testscrolltext();
+ delay(2000);
+ display.clearDisplay();
+
+ // text display tests
+ display.setTextSize(1);
+ display.setTextColor(WHITE);
+ display.setCursor(0,0);
+ display.println("Hello, world!");
+ display.setTextColor(BLACK, WHITE); // 'inverted' text
+ display.println(3.141592);
+ display.setTextSize(2);
+ display.setTextColor(WHITE);
+ display.print("0x"); display.println(0xDEADBEEF, HEX);
+ display.display();
+ delay(2000);
+ display.clearDisplay();
+
+ // miniature bitmap display
+ display.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1);
+ display.display();
+
+ // invert the display
+ display.invertDisplay(true);
+ delay(1000);
+ display.invertDisplay(false);
+ delay(1000);
+ display.clearDisplay();
+
+ // draw a bitmap icon and 'animate' movement
+ testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH);
+}
+
+
+void loop() {
+
+}
+
+
+void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) {
+ uint8_t icons[NUMFLAKES][3];
+
+ // initialize
+ for (uint8_t f=0; f< NUMFLAKES; f++) {
+ icons[f][XPOS] = random(display.width());
+ icons[f][YPOS] = 0;
+ icons[f][DELTAY] = random(5) + 1;
+
+ Serial.print("x: ");
+ Serial.print(icons[f][XPOS], DEC);
+ Serial.print(" y: ");
+ Serial.print(icons[f][YPOS], DEC);
+ Serial.print(" dy: ");
+ Serial.println(icons[f][DELTAY], DEC);
+ }
+
+ while (1) {
+ // draw each icon
+ for (uint8_t f=0; f< NUMFLAKES; f++) {
+ display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, WHITE);
+ }
+ display.display();
+ delay(200);
+
+ // then erase it + move it
+ for (uint8_t f=0; f< NUMFLAKES; f++) {
+ display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, BLACK);
+ // move it
+ icons[f][YPOS] += icons[f][DELTAY];
+ // if its gone, reinit
+ if (icons[f][YPOS] > display.height()) {
+ icons[f][XPOS] = random(display.width());
+ icons[f][YPOS] = 0;
+ icons[f][DELTAY] = random(5) + 1;
+ }
+ }
+ }
+}
+
+
+void testdrawchar(void) {
+ display.setTextSize(1);
+ display.setTextColor(WHITE);
+ display.setCursor(0,0);
+
+ for (uint8_t i=0; i < 168; i++) {
+ if (i == '\n') continue;
+ display.write(i);
+ if ((i > 0) && (i % 21 == 0))
+ display.println();
+ }
+ display.display();
+}
+
+void testdrawcircle(void) {
+ for (int16_t i=0; i0; i-=5) {
+ display.fillTriangle(display.width()/2, display.height()/2-i,
+ display.width()/2-i, display.height()/2+i,
+ display.width()/2+i, display.height()/2+i, WHITE);
+ if (color == WHITE) color = BLACK;
+ else color = WHITE;
+ display.display();
+ }
+}
+
+void testdrawroundrect(void) {
+ for (int16_t i=0; i=0; i-=4) {
+ display.drawLine(0, display.height()-1, display.width()-1, i, WHITE);
+ display.display();
+ }
+ delay(250);
+
+ display.clearDisplay();
+ for (int16_t i=display.width()-1; i>=0; i-=4) {
+ display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE);
+ display.display();
+ }
+ for (int16_t i=display.height()-1; i>=0; i-=4) {
+ display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE);
+ display.display();
+ }
+ delay(250);
+
+ display.clearDisplay();
+ for (int16_t i=0; i
+sentence=SSD1306 oled driver library for 'monochrome' 128x64 and 128x32 OLEDs!
+paragraph=SSD1306 oled driver library for 'monochrome' 128x64 and 128x32 OLEDs!
+category=Display
+url=https://github.com/adafruit/Adafruit_SSD1306
+architectures=*
diff --git a/lib/Adafruit_SSD1306-1.1.2/license.txt b/lib/Adafruit_SSD1306-1.1.2/license.txt
new file mode 100644
index 000000000000..f6a0f22b826f
--- /dev/null
+++ b/lib/Adafruit_SSD1306-1.1.2/license.txt
@@ -0,0 +1,26 @@
+Software License Agreement (BSD License)
+
+Copyright (c) 2012, Adafruit Industries
+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 the copyright holders 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 ''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 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.
diff --git a/lib/ESPAsyncUDP-master/.travis.yml b/lib/ESPAsyncUDP-master/.travis.yml
deleted file mode 100644
index c1ef4ec8fb6f..000000000000
--- a/lib/ESPAsyncUDP-master/.travis.yml
+++ /dev/null
@@ -1,37 +0,0 @@
-sudo: false
-language: bash
-os:
- - linux
-
-script:
- - /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_1.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :1 -ac -screen 0 1280x1024x16
- - sleep 3
- - export DISPLAY=:1.0
- - wget http://downloads.arduino.cc/arduino-1.6.5-linux64.tar.xz
- - tar xf arduino-1.6.5-linux64.tar.xz
- - mv arduino-1.6.5 $HOME/arduino_ide
- - export PATH="$HOME/arduino_ide:$PATH"
- - which arduino
- - mkdir -p $HOME/Arduino/libraries
- - cp -r $TRAVIS_BUILD_DIR $HOME/Arduino/libraries/ESPAsyncUDP
- - cd $HOME/arduino_ide/hardware
- - mkdir esp8266com
- - cd esp8266com
- - git clone https://github.com/esp8266/Arduino.git esp8266
- - cd esp8266/tools
- - python get.py
- - source $TRAVIS_BUILD_DIR/travis/common.sh
- - arduino --board esp8266com:esp8266:generic --save-prefs
- - arduino --get-pref sketchbook.path
- - build_sketches arduino $HOME/Arduino/libraries/ESPAsyncUDP esp8266
-
-notifications:
- email:
- on_success: change
- on_failure: change
- webhooks:
- urls:
- - https://webhooks.gitter.im/e/60e65d0c78ea0a920347
- on_success: change # options: [always|never|change] default: always
- on_failure: always # options: [always|never|change] default: always
- on_start: false # default: false
diff --git a/lib/ESPAsyncUDP-master/README.md b/lib/ESPAsyncUDP-master/README.md
deleted file mode 100644
index 997a7cc26bc8..000000000000
--- a/lib/ESPAsyncUDP-master/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# ESPAsyncUDP
-Async UDP Library for ESP8266 Arduino [![Build Status](https://travis-ci.org/me-no-dev/ESPAsyncUDP.svg?branch=master)](https://travis-ci.org/me-no-dev/ESPAsyncUDP)
-
-[![Join the chat at https://gitter.im/me-no-dev/ESPAsyncWebServer](https://badges.gitter.im/me-no-dev/ESPAsyncWebServer.svg)](https://gitter.im/me-no-dev/ESPAsyncWebServer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
-This is a fully asynchronous UDP library, aimed at enabling trouble-free, multi-connection network environment for Espressif's ESP8266 MCUs.
-
-The library is easy to use and includes support for Unicast, Broadcast and Multicast environments
-
-Latest GIT version of ESP8266 Arduino might be required for this library to work
diff --git a/lib/ESPAsyncUDP-master/examples/AsyncUDPClient/AsyncUDPClient.ino b/lib/ESPAsyncUDP-master/examples/AsyncUDPClient/AsyncUDPClient.ino
deleted file mode 100644
index cf528fe12ab1..000000000000
--- a/lib/ESPAsyncUDP-master/examples/AsyncUDPClient/AsyncUDPClient.ino
+++ /dev/null
@@ -1,51 +0,0 @@
-#include
-#include "ESPAsyncUDP.h"
-
-const char * ssid = "***********";
-const char * password = "***********";
-
-AsyncUDP udp;
-
-void setup()
-{
- Serial.begin(115200);
- WiFi.mode(WIFI_STA);
- WiFi.begin(ssid, password);
- if (WiFi.waitForConnectResult() != WL_CONNECTED) {
- Serial.println("WiFi Failed");
- while(1) {
- delay(1000);
- }
- }
- if(udp.connect(IPAddress(192,168,1,100), 1234)) {
- Serial.println("UDP connected");
- udp.onPacket([](AsyncUDPPacket packet) {
- Serial.print("UDP Packet Type: ");
- Serial.print(packet.isBroadcast()?"Broadcast":packet.isMulticast()?"Multicast":"Unicast");
- Serial.print(", From: ");
- Serial.print(packet.remoteIP());
- Serial.print(":");
- Serial.print(packet.remotePort());
- Serial.print(", To: ");
- Serial.print(packet.localIP());
- Serial.print(":");
- Serial.print(packet.localPort());
- Serial.print(", Length: ");
- Serial.print(packet.length());
- Serial.print(", Data: ");
- Serial.write(packet.data(), packet.length());
- Serial.println();
- //reply to the client
- packet.printf("Got %u bytes of data", packet.length());
- });
- //Send unicast
- udp.print("Hello Server!");
- }
-}
-
-void loop()
-{
- delay(1000);
- //Send broadcast on port 1234
- udp.broadcastTo("Anyone here?", 1234);
-}
diff --git a/lib/ESPAsyncUDP-master/examples/AsyncUDPMulticastServer/AsyncUDPMulticastServer.ino b/lib/ESPAsyncUDP-master/examples/AsyncUDPMulticastServer/AsyncUDPMulticastServer.ino
deleted file mode 100644
index bb3e69c9b6c3..000000000000
--- a/lib/ESPAsyncUDP-master/examples/AsyncUDPMulticastServer/AsyncUDPMulticastServer.ino
+++ /dev/null
@@ -1,52 +0,0 @@
-#include
-#include "ESPAsyncUDP.h"
-
-const char * ssid = "***********";
-const char * password = "***********";
-
-AsyncUDP udp;
-
-void setup()
-{
- Serial.begin(115200);
- WiFi.mode(WIFI_STA);
- WiFi.begin(ssid, password);
- if (WiFi.waitForConnectResult() != WL_CONNECTED) {
- Serial.println("WiFi Failed");
- while(1) {
- delay(1000);
- }
- }
- if(udp.listenMulticast(IPAddress(239,1,2,3), 1234)) {
- Serial.print("UDP Listening on IP: ");
- Serial.println(WiFi.localIP());
- udp.onPacket([](AsyncUDPPacket packet) {
- Serial.print("UDP Packet Type: ");
- Serial.print(packet.isBroadcast()?"Broadcast":packet.isMulticast()?"Multicast":"Unicast");
- Serial.print(", From: ");
- Serial.print(packet.remoteIP());
- Serial.print(":");
- Serial.print(packet.remotePort());
- Serial.print(", To: ");
- Serial.print(packet.localIP());
- Serial.print(":");
- Serial.print(packet.localPort());
- Serial.print(", Length: ");
- Serial.print(packet.length());
- Serial.print(", Data: ");
- Serial.write(packet.data(), packet.length());
- Serial.println();
- //reply to the client
- packet.printf("Got %u bytes of data", packet.length());
- });
- //Send multicast
- udp.print("Hello!");
- }
-}
-
-void loop()
-{
- delay(1000);
- //Send multicast
- udp.print("Anyone here?");
-}
diff --git a/lib/ESPAsyncUDP-master/examples/AsyncUDPServer/AsyncUDPServer.ino b/lib/ESPAsyncUDP-master/examples/AsyncUDPServer/AsyncUDPServer.ino
deleted file mode 100644
index fc12a7fc3ab1..000000000000
--- a/lib/ESPAsyncUDP-master/examples/AsyncUDPServer/AsyncUDPServer.ino
+++ /dev/null
@@ -1,50 +0,0 @@
-#include
-#include "ESPAsyncUDP.h"
-
-const char * ssid = "***********";
-const char * password = "***********";
-
-AsyncUDP udp;
-
-void setup()
-{
- Serial.begin(115200);
- WiFi.mode(WIFI_STA);
- WiFi.begin(ssid, password);
- if (WiFi.waitForConnectResult() != WL_CONNECTED) {
- Serial.println("WiFi Failed");
- while(1) {
- delay(1000);
- }
- }
- if(udp.listen(1234)) {
- Serial.print("UDP Listening on IP: ");
- Serial.println(WiFi.localIP());
- udp.onPacket([](AsyncUDPPacket packet) {
- Serial.print("UDP Packet Type: ");
- Serial.print(packet.isBroadcast()?"Broadcast":packet.isMulticast()?"Multicast":"Unicast");
- Serial.print(", From: ");
- Serial.print(packet.remoteIP());
- Serial.print(":");
- Serial.print(packet.remotePort());
- Serial.print(", To: ");
- Serial.print(packet.localIP());
- Serial.print(":");
- Serial.print(packet.localPort());
- Serial.print(", Length: ");
- Serial.print(packet.length());
- Serial.print(", Data: ");
- Serial.write(packet.data(), packet.length());
- Serial.println();
- //reply to the client
- packet.printf("Got %u bytes of data", packet.length());
- });
- }
-}
-
-void loop()
-{
- delay(1000);
- //Send broadcast
- udp.broadcast("Anyone here?");
-}
diff --git a/lib/ESPAsyncUDP-master/library.json b/lib/ESPAsyncUDP-master/library.json
deleted file mode 100644
index fe300b6e62e5..000000000000
--- a/lib/ESPAsyncUDP-master/library.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "name":"ESPAsyncUDP",
- "description":"Asynchronous UDP Library for ESP8266",
- "keywords":"async,udp,server,client,multicast,broadcast",
- "authors":
- {
- "name": "Hristo Gochkov",
- "maintainer": true
- },
- "repository":
- {
- "type": "git",
- "url": "https://github.com/me-no-dev/ESPAsyncUDP.git"
- },
- "frameworks": "arduino",
- "platforms":"espressif"
-}
diff --git a/lib/ESPAsyncUDP-master/library.properties b/lib/ESPAsyncUDP-master/library.properties
deleted file mode 100644
index 1aa6ef1ad78e..000000000000
--- a/lib/ESPAsyncUDP-master/library.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-name=ESP Async UDP
-version=1.0.0
-author=Me-No-Dev
-maintainer=Me-No-Dev
-sentence=Async UDP Library for ESP8266
-paragraph=Async UDP Library for ESP8266
-category=Other
-url=https://github.com/me-no-dev/ESPAsyncUDP
-architectures=*
diff --git a/lib/ESPAsyncUDP-master/src/AsyncUDP.cpp b/lib/ESPAsyncUDP-master/src/AsyncUDP.cpp
deleted file mode 100644
index 9e433b1f4ac8..000000000000
--- a/lib/ESPAsyncUDP-master/src/AsyncUDP.cpp
+++ /dev/null
@@ -1,432 +0,0 @@
-#include // Arduino_Esp8266 version information (ARDUINO_ESP8266_RELEASE and ARDUINO_ESP8266_RELEASE_2_3_0)
-#ifndef ARDUINO_ESP8266_RELEASE_2_3_0 // This Library will only work with ARDUINO_ESP8266_RELEASE_2_4_0 and up
-
-#include "Arduino.h"
-#include "ESPAsyncUDP.h"
-
-extern "C" {
-#include "user_interface.h"
-#include "lwip/opt.h"
-#include "lwip/inet.h"
-#include "lwip/udp.h"
-#include "lwip/igmp.h"
-}
-
-AsyncUDPMessage::AsyncUDPMessage(size_t size)
-{
- _index = 0;
- if(size > 1460) {
- size = 1460;
- }
- _size = size;
- _buffer = (uint8_t *)malloc(size);
-}
-
-AsyncUDPMessage::~AsyncUDPMessage()
-{
- if(_buffer) {
- free(_buffer);
- }
-}
-
-size_t AsyncUDPMessage::write(const uint8_t *data, size_t len)
-{
- if(_buffer == NULL) {
- return 0;
- }
- size_t s = space();
- if(len > s) {
- len = s;
- }
- memcpy(_buffer + _index, data, len);
- _index += len;
- return len;
-}
-
-size_t AsyncUDPMessage::write(uint8_t data)
-{
- return write(&data, 1);
-}
-
-size_t AsyncUDPMessage::space()
-{
- if(_buffer == NULL) {
- return 0;
- }
- return _size - _index;
-}
-
-uint8_t * AsyncUDPMessage::data()
-{
- return _buffer;
-}
-
-size_t AsyncUDPMessage::length()
-{
- return _index;
-}
-
-void AsyncUDPMessage::flush()
-{
- _index = 0;
-}
-
-
-AsyncUDPPacket::AsyncUDPPacket(AsyncUDP *udp, ip_addr_t *localIp, uint16_t localPort, ip_addr_t *remoteIp, uint16_t remotePort, uint8_t *data, size_t len)
-{
- _udp = udp;
- _localIp = localIp;
- _localPort = localPort;
- _remoteIp = remoteIp;
- _remotePort = remotePort;
- _data = data;
- _len = len;
-}
-
-AsyncUDPPacket::~AsyncUDPPacket()
-{
-
-}
-
-uint8_t * AsyncUDPPacket::data()
-{
- return _data;
-}
-
-size_t AsyncUDPPacket::length()
-{
- return _len;
-}
-
-IPAddress AsyncUDPPacket::localIP()
-{
- return IPAddress(_localIp->addr);
-}
-
-uint16_t AsyncUDPPacket::localPort()
-{
- return _localPort;
-}
-
-IPAddress AsyncUDPPacket::remoteIP()
-{
- return IPAddress(_remoteIp->addr);
-}
-
-uint16_t AsyncUDPPacket::remotePort()
-{
- return _remotePort;
-}
-
-bool AsyncUDPPacket::isBroadcast()
-{
- return _localIp->addr == 0xFFFFFFFF || _localIp->addr == (uint32_t)(0);
-}
-
-bool AsyncUDPPacket::isMulticast()
-{
- return ip_addr_ismulticast(_localIp);
-}
-
-size_t AsyncUDPPacket::write(const uint8_t *data, size_t len)
-{
- return _udp->writeTo(data, len, _remoteIp, _remotePort);
-}
-
-size_t AsyncUDPPacket::write(uint8_t data)
-{
- return write(&data, 1);
-}
-
-size_t AsyncUDPPacket::send(AsyncUDPMessage &message)
-{
- return write(message.data(), message.length());
-}
-
-
-
-AsyncUDP::AsyncUDP()
-{
- _pcb = NULL;
- _connected = false;
- _handler = NULL;
-}
-
-AsyncUDP::~AsyncUDP()
-{
- close();
-}
-
-AsyncUDP::operator bool()
-{
- return _connected;
-}
-
-bool AsyncUDP::connected()
-{
- return _connected;
-}
-
-void AsyncUDP::onPacket(AuPacketHandlerFunctionWithArg cb, void * arg)
-{
- onPacket(std::bind(cb, arg, std::placeholders::_1));
-}
-
-void AsyncUDP::onPacket(AuPacketHandlerFunction cb)
-{
- _handler = cb;
-}
-
-void AsyncUDP::_recv(udp_pcb *upcb, pbuf *pb, ip_addr_t *addr, uint16_t port)
-{
- (void)upcb; // its unused, avoid warning
- while(pb != NULL) {
- if(_handler) {
- uint8_t * data = (uint8_t*)((pb)->payload);
- size_t len = pb->len;
-
- ip_hdr* iphdr = reinterpret_cast(data - UDP_HLEN - IP_HLEN);
- ip_addr_t daddr;
- daddr.addr = iphdr->dest.addr;
-
- udp_hdr* udphdr = reinterpret_cast(((uint8_t*)((pb)->payload)) - UDP_HLEN);
- uint16_t dport = ntohs(udphdr->dest);
-
- AsyncUDPPacket packet(this, &daddr, dport, addr, port, data, len);
- _handler(packet);
- }
-
- pbuf * this_pb = pb;
- pb = pb->next;
- this_pb->next = NULL;
- pbuf_free(this_pb);
- }
-}
-
-#if LWIP_VERSION_MAJOR == 1
-void AsyncUDP::_s_recv(void *arg, udp_pcb *upcb, pbuf *p, ip_addr_t *addr, uint16_t port)
-#else
-void AsyncUDP::_s_recv(void *arg, udp_pcb *upcb, pbuf *p, const ip_addr_t *addr, uint16_t port)
-#endif
-{
- reinterpret_cast(arg)->_recv(upcb, p, (ip_addr_t *)addr, port);
-}
-
-bool AsyncUDP::listen(ip_addr_t *addr, uint16_t port)
-{
- close();
- _pcb = udp_new();
- if(_pcb == NULL) {
- return false;
- }
- err_t err = udp_bind(_pcb, addr, port);
- if(err != ERR_OK) {
- close();
- return false;
- }
- udp_recv(_pcb, &_s_recv, (void *) this);
- _connected = true;
- return true;
-}
-
-bool AsyncUDP::listenMulticast(ip_addr_t *addr, uint16_t port, uint8_t ttl)
-{
- close();
- if(!ip_addr_ismulticast(addr)) {
- return false;
- }
- ip_addr_t multicast_if_addr;
- struct ip_info ifIpInfo;
- int mode = wifi_get_opmode();
- if(mode & STATION_MODE) {
- wifi_get_ip_info(STATION_IF, &ifIpInfo);
- multicast_if_addr.addr = ifIpInfo.ip.addr;
- } else if (mode & SOFTAP_MODE) {
- wifi_get_ip_info(SOFTAP_IF, &ifIpInfo);
- multicast_if_addr.addr = ifIpInfo.ip.addr;
- } else {
- return false;
- }
- if (igmp_joingroup(&multicast_if_addr, addr)!= ERR_OK) {
- return false;
- }
- if(!listen(IPADDR_ANY, port)) {
- return false;
- }
-#if LWIP_VERSION_MAJOR == 1
- udp_set_multicast_netif_addr(_pcb, multicast_if_addr);
-#else
- udp_set_multicast_netif_addr(_pcb, &multicast_if_addr);
-#endif
- udp_set_multicast_ttl(_pcb, ttl);
- ip_addr_copy(_pcb->remote_ip, *addr);
- _pcb->remote_port = port;
- return true;
-}
-
-bool AsyncUDP::connect(ip_addr_t *addr, uint16_t port)
-{
- close();
- _pcb = udp_new();
- if(_pcb == NULL) {
- return false;
- }
- err_t err = udp_connect(_pcb, addr, port);
- if(err != ERR_OK) {
- close();
- return false;
- }
- udp_recv(_pcb, &_s_recv, (void *) this);
- _connected = true;
- return true;
-}
-
-void AsyncUDP::close()
-{
- if(_pcb != NULL) {
- if(_connected) {
- udp_disconnect(_pcb);
- }
- udp_remove(_pcb);
- _connected = false;
- _pcb = NULL;
- }
-}
-
-size_t AsyncUDP::writeTo(const uint8_t *data, size_t len, ip_addr_t *addr, uint16_t port)
-{
- if(!_pcb && !connect(addr, port)) {
- return 0;
- }
- if(len > 1460) {
- len = 1460;
- }
- pbuf* pbt = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
- if(pbt != NULL) {
- uint8_t* dst = reinterpret_cast(pbt->payload);
- memcpy(dst, data, len);
- err_t err = udp_sendto(_pcb, pbt, addr, port);
- pbuf_free(pbt);
- if(err < ERR_OK) {
- return 0;
- }
- return len;
- }
- return 0;
-}
-
-bool AsyncUDP::listen(const IPAddress addr, uint16_t port)
-{
- ip_addr_t laddr;
- laddr.addr = addr;
- return listen(&laddr, port);
-}
-
-bool AsyncUDP::listen(uint16_t port)
-{
- return listen(IPAddress((uint32_t)INADDR_ANY), port);
-}
-
-bool AsyncUDP::listenMulticast(const IPAddress addr, uint16_t port, uint8_t ttl)
-{
- ip_addr_t laddr;
- laddr.addr = addr;
- return listenMulticast(&laddr, port, ttl);
-}
-
-bool AsyncUDP::connect(const IPAddress addr, uint16_t port)
-{
- ip_addr_t daddr;
- daddr.addr = addr;
- return connect(&daddr, port);
-}
-
-size_t AsyncUDP::writeTo(const uint8_t *data, size_t len, const IPAddress addr, uint16_t port)
-{
- ip_addr_t daddr;
- daddr.addr = addr;
- return writeTo(data, len, &daddr, port);
-}
-
-size_t AsyncUDP::write(const uint8_t *data, size_t len)
-{
- //return writeTo(data, len, &(_pcb->remote_ip), _pcb->remote_port);
- if(_pcb){ // Patch applied (https://github.com/me-no-dev/ESPAsyncUDP/pull/21)
- return writeTo(data, len, &(_pcb->remote_ip), _pcb->remote_port);
- }
- return 0;
-}
-
-size_t AsyncUDP::write(uint8_t data)
-{
- return write(&data, 1);
-}
-
-size_t AsyncUDP::broadcastTo(uint8_t *data, size_t len, uint16_t port)
-{
- ip_addr_t daddr;
- daddr.addr = 0xFFFFFFFF;
- return writeTo(data, len, &daddr, port);
-}
-
-size_t AsyncUDP::broadcastTo(const char * data, uint16_t port)
-{
- return broadcastTo((uint8_t *)data, strlen(data), port);
-}
-
-size_t AsyncUDP::broadcast(uint8_t *data, size_t len)
-{
- if(_pcb->local_port != 0) {
- return broadcastTo(data, len, _pcb->local_port);
- }
- return 0;
-}
-
-size_t AsyncUDP::broadcast(const char * data)
-{
- return broadcast((uint8_t *)data, strlen(data));
-}
-
-
-size_t AsyncUDP::sendTo(AsyncUDPMessage &message, ip_addr_t *addr, uint16_t port)
-{
- if(!message) {
- return 0;
- }
- return writeTo(message.data(), message.length(), addr, port);
-}
-
-size_t AsyncUDP::sendTo(AsyncUDPMessage &message, const IPAddress addr, uint16_t port)
-{
- //if(!message) {
- if((!message) || (!_pcb)) { // Patch applied (https://github.com/me-no-dev/ESPAsyncUDP/pull/21)
- return 0;
- }
- return writeTo(message.data(), message.length(), addr, port);
-}
-
-size_t AsyncUDP::send(AsyncUDPMessage &message)
-{
- if(!message) {
- return 0;
- }
- return writeTo(message.data(), message.length(), &(_pcb->remote_ip), _pcb->remote_port);
-}
-
-size_t AsyncUDP::broadcastTo(AsyncUDPMessage &message, uint16_t port)
-{
- if(!message) {
- return 0;
- }
- return broadcastTo(message.data(), message.length(), port);
-}
-
-size_t AsyncUDP::broadcast(AsyncUDPMessage &message)
-{
- if(!message) {
- return 0;
- }
- return broadcast(message.data(), message.length());
-}
-
-#endif
diff --git a/lib/ESPAsyncUDP-master/src/ESPAsyncUDP.h b/lib/ESPAsyncUDP-master/src/ESPAsyncUDP.h
deleted file mode 100644
index 8e5a70b21cdc..000000000000
--- a/lib/ESPAsyncUDP-master/src/ESPAsyncUDP.h
+++ /dev/null
@@ -1,130 +0,0 @@
-#ifndef ESPASYNCUDP_H
-#define ESPASYNCUDP_H
-
-#include "IPAddress.h"
-#include "Print.h"
-#include
-#include "lwip/init.h"
-
-class AsyncUDP;
-class AsyncUDPPacket;
-class AsyncUDPMessage;
-struct udp_pcb;
-struct pbuf;
-#if LWIP_VERSION_MAJOR == 1
-struct ip_addr;
-typedef struct ip_addr ip_addr_t;
-#else
-struct ip4_addr;
-typedef struct ip4_addr ip_addr_t;
-#endif
-
-class AsyncUDPMessage : public Print
-{
-protected:
- uint8_t *_buffer;
- size_t _index;
- size_t _size;
-public:
- AsyncUDPMessage(size_t size=1460);
- virtual ~AsyncUDPMessage();
- size_t write(const uint8_t *data, size_t len);
- size_t write(uint8_t data);
- size_t space();
- uint8_t * data();
- size_t length();
- void flush();
- operator bool()
- {
- return _buffer != NULL;
- }
-};
-
-class AsyncUDPPacket : public Print
-{
-protected:
- AsyncUDP *_udp;
- ip_addr_t *_localIp;
- uint16_t _localPort;
- ip_addr_t *_remoteIp;
- uint16_t _remotePort;
- uint8_t *_data;
- size_t _len;
-public:
- AsyncUDPPacket(AsyncUDP *udp, ip_addr_t *localIp, uint16_t localPort, ip_addr_t *remoteIp, uint16_t remotePort, uint8_t *data, size_t len);
- virtual ~AsyncUDPPacket();
-
- uint8_t * data();
- size_t length();
- bool isBroadcast();
- bool isMulticast();
-
- IPAddress localIP();
- uint16_t localPort();
- IPAddress remoteIP();
- uint16_t remotePort();
-
- size_t send(AsyncUDPMessage &message);
-
- size_t write(const uint8_t *data, size_t len);
- size_t write(uint8_t data);
-};
-
-typedef std::function AuPacketHandlerFunction;
-typedef std::function AuPacketHandlerFunctionWithArg;
-
-class AsyncUDP : public Print
-{
-protected:
- udp_pcb *_pcb;
- bool _connected;
- AuPacketHandlerFunction _handler;
-
- void _recv(udp_pcb *upcb, pbuf *pb, ip_addr_t *addr, uint16_t port);
-#if LWIP_VERSION_MAJOR == 1
- static void _s_recv(void *arg, udp_pcb *upcb, pbuf *p, ip_addr_t *addr, uint16_t port);
-#else
- static void _s_recv(void *arg, udp_pcb *upcb, pbuf *p, const ip_addr_t *addr, uint16_t port);
-#endif
-
-public:
- AsyncUDP();
- virtual ~AsyncUDP();
-
- void onPacket(AuPacketHandlerFunctionWithArg cb, void * arg=NULL);
- void onPacket(AuPacketHandlerFunction cb);
-
- bool listen(ip_addr_t *addr, uint16_t port);
- bool listen(const IPAddress addr, uint16_t port);
- bool listen(uint16_t port);
-
- bool listenMulticast(ip_addr_t *addr, uint16_t port, uint8_t ttl=1);
- bool listenMulticast(const IPAddress addr, uint16_t port, uint8_t ttl=1);
-
- bool connect(ip_addr_t *addr, uint16_t port);
- bool connect(const IPAddress addr, uint16_t port);
-
- void close();
-
- size_t writeTo(const uint8_t *data, size_t len, ip_addr_t *addr, uint16_t port);
- size_t writeTo(const uint8_t *data, size_t len, const IPAddress addr, uint16_t port);
- size_t write(const uint8_t *data, size_t len);
- size_t write(uint8_t data);
-
- size_t broadcastTo(uint8_t *data, size_t len, uint16_t port);
- size_t broadcastTo(const char * data, uint16_t port);
- size_t broadcast(uint8_t *data, size_t len);
- size_t broadcast(const char * data);
-
- size_t sendTo(AsyncUDPMessage &message, ip_addr_t *addr, uint16_t port);
- size_t sendTo(AsyncUDPMessage &message, const IPAddress addr, uint16_t port);
- size_t send(AsyncUDPMessage &message);
-
- size_t broadcastTo(AsyncUDPMessage &message, uint16_t port);
- size_t broadcast(AsyncUDPMessage &message);
-
- bool connected();
- operator bool();
-};
-
-#endif
diff --git a/lib/ESPAsyncUDP-master/travis/common.sh b/lib/ESPAsyncUDP-master/travis/common.sh
deleted file mode 100644
index 57bede34321a..000000000000
--- a/lib/ESPAsyncUDP-master/travis/common.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-
-function build_sketches()
-{
- local arduino=$1
- local srcpath=$2
- local platform=$3
- local sketches=$(find $srcpath -name *.ino)
- for sketch in $sketches; do
- local sketchdir=$(dirname $sketch)
- if [[ -f "$sketchdir/.$platform.skip" ]]; then
- echo -e "\n\n ------------ Skipping $sketch ------------ \n\n";
- continue
- fi
- echo -e "\n\n ------------ Building $sketch ------------ \n\n";
- $arduino --verify $sketch;
- local result=$?
- if [ $result -ne 0 ]; then
- echo "Build failed ($1)"
- return $result
- fi
- done
-}
diff --git a/lib/MPU6050/Examples/MPU6050_DMP6/MPU6050_DMP6.ino b/lib/I2Cdevlib-MPU6050/Examples/MPU6050_DMP6/MPU6050_DMP6.ino
similarity index 100%
rename from lib/MPU6050/Examples/MPU6050_DMP6/MPU6050_DMP6.ino
rename to lib/I2Cdevlib-MPU6050/Examples/MPU6050_DMP6/MPU6050_DMP6.ino
diff --git a/lib/MPU6050/Examples/MPU6050_DMP6/Processing/MPUTeapot/MPUTeapot.pde b/lib/I2Cdevlib-MPU6050/Examples/MPU6050_DMP6/Processing/MPUTeapot/MPUTeapot.pde
similarity index 100%
rename from lib/MPU6050/Examples/MPU6050_DMP6/Processing/MPUTeapot/MPUTeapot.pde
rename to lib/I2Cdevlib-MPU6050/Examples/MPU6050_DMP6/Processing/MPUTeapot/MPUTeapot.pde
diff --git a/lib/MPU6050/Examples/MPU6050_raw/MPU6050_raw.ino b/lib/I2Cdevlib-MPU6050/Examples/MPU6050_raw/MPU6050_raw.ino
similarity index 100%
rename from lib/MPU6050/Examples/MPU6050_raw/MPU6050_raw.ino
rename to lib/I2Cdevlib-MPU6050/Examples/MPU6050_raw/MPU6050_raw.ino
diff --git a/lib/MPU6050/MPU6050.cpp b/lib/I2Cdevlib-MPU6050/MPU6050.cpp
similarity index 100%
rename from lib/MPU6050/MPU6050.cpp
rename to lib/I2Cdevlib-MPU6050/MPU6050.cpp
diff --git a/lib/MPU6050/MPU6050.h b/lib/I2Cdevlib-MPU6050/MPU6050.h
similarity index 100%
rename from lib/MPU6050/MPU6050.h
rename to lib/I2Cdevlib-MPU6050/MPU6050.h
diff --git a/lib/MPU6050/MPU6050_6Axis_MotionApps20.h b/lib/I2Cdevlib-MPU6050/MPU6050_6Axis_MotionApps20.h
similarity index 99%
rename from lib/MPU6050/MPU6050_6Axis_MotionApps20.h
rename to lib/I2Cdevlib-MPU6050/MPU6050_6Axis_MotionApps20.h
index 1f7b88589537..90704f0c702b 100644
--- a/lib/MPU6050/MPU6050_6Axis_MotionApps20.h
+++ b/lib/I2Cdevlib-MPU6050/MPU6050_6Axis_MotionApps20.h
@@ -46,7 +46,11 @@ THE SOFTWARE.
// Tom Carpenter's conditional PROGMEM code
// http://forum.arduino.cc/index.php?topic=129407.0
#ifndef __arm__
- #include
+ #if (defined(__AVR__))
+ #include
+ #else
+ #include
+ #endif
#else
// Teensy 3.0 library conditional PROGMEM code from Paul Stoffregen
#ifndef __PGMSPACE_H_
@@ -109,11 +113,19 @@ THE SOFTWARE.
#define DEBUG_PRINTLN(x) Serial.println(x)
#define DEBUG_PRINTLNF(x, y) Serial.println(x, y)
#else
+#ifndef DEBUG_PRINT
#define DEBUG_PRINT(x)
+#endif
+#ifndef DEBUG_PRINTF
#define DEBUG_PRINTF(x, y)
+#endif
+#ifndef DEBUG_PRINTLN
#define DEBUG_PRINTLN(x)
+#endif
+#ifndef DEBUG_PRINTLNF
#define DEBUG_PRINTLNF(x, y)
#endif
+#endif
#define MPU6050_DMP_CODE_SIZE 1929 // dmpMemory[]
#define MPU6050_DMP_CONFIG_SIZE 192 // dmpConfig[]
@@ -402,7 +414,7 @@ uint8_t MPU6050::dmpInitialize() {
setIntEnabled(0x12);
DEBUG_PRINTLN(F("Setting sample rate to 200Hz..."));
- setRate(4); // 1khz / (1 + 4) = 200 Hz
+ setRate(1); // 1khz / (1 + 4) = 200 Hz
DEBUG_PRINTLN(F("Setting external frame sync to TEMP_OUT_L[0]..."));
setExternalFrameSync(MPU6050_EXT_SYNC_TEMP_OUT_L);
diff --git a/lib/MPU6050/MPU6050_9Axis_MotionApps41.h b/lib/I2Cdevlib-MPU6050/MPU6050_9Axis_MotionApps41.h
similarity index 100%
rename from lib/MPU6050/MPU6050_9Axis_MotionApps41.h
rename to lib/I2Cdevlib-MPU6050/MPU6050_9Axis_MotionApps41.h
diff --git a/lib/MPU6050/helper_3dmath.h b/lib/I2Cdevlib-MPU6050/helper_3dmath.h
similarity index 100%
rename from lib/MPU6050/helper_3dmath.h
rename to lib/I2Cdevlib-MPU6050/helper_3dmath.h
diff --git a/lib/IRremoteESP8266-2.2.1.02/README.md b/lib/IRremoteESP8266-2.2.1.02/README.md
deleted file mode 100644
index 6b2975793721..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/README.md
+++ /dev/null
@@ -1,74 +0,0 @@
-# IRremote ESP8266 Library
-
-[![Build Status](https://travis-ci.org/markszabo/IRremoteESP8266.svg?branch=master)](https://travis-ci.org/markszabo/IRremoteESP8266)
-[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/markszabo/IRremoteESP8266.svg)](http://isitmaintained.com/project/markszabo/IRremoteESP8266 "Average time to resolve an issue")
-[![Percentage of issues still open](http://isitmaintained.com/badge/open/markszabo/IRremoteESP8266.svg)](http://isitmaintained.com/project/markszabo/IRremoteESP8266 "Percentage of issues still open")
-[![GitLicense](https://gitlicense.com/badge/markszabo/IRremoteESP8266)](https://gitlicense.com/license/markszabo/IRremoteESP8266)
-
-This library enables you to **send and receive** infra-red signals on an ESP8266 using Arduino framework (https://github.com/esp8266/Arduino)
-
-## v2.2 Now Available
-Version 2.2 of the library is now available. This is a significant internal change to existing versions.
-
-## Upgrading from versions prior to v2.0
-You will need to change your pre-v2.0 code slightly to work with post-v2.0 versions of the library. You can read more about the changes on our [wiki](https://github.com/markszabo/IRremoteESP8266/wiki/Upgrading-to-v2.0) page.
-Please [report an issue](https://github.com/markszabo/IRremoteESP8266/issues/new) if you find any problems with the documentation or the library itself.
-
-## Troubleshooting
-Before reporting an issue or asking for help, please try to follow our [Troubleshooting Guide](https://github.com/markszabo/IRremoteESP8266/wiki/Troubleshooting-Guide) first.
-
-## Frequently Asked Questions
-Some common answers to common questions and problems can be found on our [F.A.Q. wiki page](https://github.com/markszabo/IRremoteESP8266/wiki/Frequently-Asked-Questions).
-
-## History
-This library was originally based on Ken Shirriff's work (https://github.com/shirriff/Arduino-IRremote/)
-
-[Mark Szabo](https://github.com/markszabo/IRremoteESP8266) has updated the IRsend class to work on ESP8266 and [Sebastien Warin](https://github.com/sebastienwarin/IRremoteESP8266) the receiving & decoding part (IRrecv class).
-
-## Installation
-1. Click "Download ZIP"
-2. Extract the downloaded zip file
-3. Rename the extracted folder to "IRremoteESP8266"
-4. Move this folder to your libraries directory (under windows: C:\Users\YOURNAME\Documents\Arduino\libraries\)
-5. Restart your Arduino ide
-6. Check out the examples
-
-###### Using Git to install library ( Linux )
-```
-cd ~/Arduino/libraries
-git clone https://github.com/markszabo/IRremoteESP8266.git
-```
-###### To Update to the latest version of the library
-`
-cd ~/Arduino/libraries/IRremoteESP8266 && git pull
-`
-
-## Unit Tests
-The [Unit Tests](https://en.wikipedia.org/wiki/Unit_testing) under the test/ directory are for a Unix machine, **not** the micro-controller (ESP8266).
-This allows execution under Travis and on the developer's machine.
-We can do this from v2.0 of the library onwards, as everything now uses c98-style type definitions.
-e.g. uint16_t etc.
-Any Arduino/ESP8266 specific code needs to be disabled using something similar to the following lines:
-```
-#ifndef UNIT_TEST
-
-#endif
-```
-
-This is not a perfect situation as we can not obviously emulate hardware specific features and differences. e.g. Interrupts, GPIOs, CPU instruction timing etc, etc.
-
-If you want to run all the tests yourself, try the following:
-```
-$ cd test
-$ make run
-```
-
-## Contributing
-If you want to [contribute](.github/CONTRIBUTING.md#how-can-i-contribute) to this project, consider:
-- [Report](.github/CONTRIBUTING.md#reporting-bugs) bugs and errors
-- Ask for enhancements
-- [Create issues](.github/CONTRIBUTING.md#reporting-bugs) and [pull requests](.github/CONTRIBUTING.md#pull-requests)
-- Tell other people about this library
-
-## Contributors
-Available [here](.github/Contributors.md)
diff --git a/lib/IRremoteESP8266-2.2.1.02/ReleaseNotes.md b/lib/IRremoteESP8266-2.2.1.02/ReleaseNotes.md
deleted file mode 100644
index 3b9bce86a11c..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/ReleaseNotes.md
+++ /dev/null
@@ -1,112 +0,0 @@
-# Release Notes
-
-## _v2.2.1 (20171025)_
-
-**[Features]**
-- Support for sending and decoding Nikai TV messages. (#311, #313)
-- gc_decode: External utility to decode Global Cache codes. (#308, #312)
-- IRMQTTServer: Example code to send IR messages via HTTP & MQTT. (#316, #323)
-- Improve converting 64bit values to hexidecimal. (#318)
-
-**[Misc]**
-- IRrecvDump.ino code is now deprecated. Use IRrecvDumpV2.ino instead. (#314)
-
-
-## _v2.2.0 (20170922)_
-
-**[Bug Fixes]**
-- Add printing output of RC-MM and RC-5X protocols in example code. (#284)
-- LG timing improvements based on observations (#291)
-
-**[Features]**
-- Automatic capture timing calibration for some protocols. (#268)
-- Support for creating & sending Trotec AC codes. (#279)
-- Support for creating & sending Argo Ulisse 13 DCI codes. (#280 #300)
-- Move to 2 microsecond timing resolution for capture of codes. (#287)
-- Capture buffer changes:
-- Size at runtime. (#276)
-- Message timeout at runtime. (#294)
-- Simplify creating & using a second buffer (#303)
-- New example code:
- - Trotec A/C (#279)
- - LG A/C units (#289)
- - Argo Ulisse 13 DCI codes. (#300)
-
-
-## _v2.1.1 (20170711)_
-
-**[Bug Fixes]**
-- GlobalCache incorrectly using hardware offset for period calc. (#267)
-
-**[Features]**
-- Support reporting of 'NEC'-like 32-bit protocols. e.g. Apple TV remote (#265)
-- Add an example of sendRaw() to IRsendDemo.ino (#270)
-
-
-## _v2.1.0 (20170704)_
-
-**[Features]**
-- Support for sending Pronto IR codes. (#248)
-- Support for sending Fujitsu A/C codes. (#88)
-- Minor improvements to examples.
-
-
-## _v2.0.3 (20170618)_
-
-**[Bug fixes]**
-- Capture buffer could become corrupt after large message, breaking subsequent decodes. (#253)
-
-
-## _v2.0.2 (20170615)_
-
-**[Bug fixes]**
-- Correct decode issue introduced in v2.0.1 affecting multiple protocol decoders (#243)
-- Correct post-message gap for the Panasonic protocol(s) (#245)
-- Incorrect display of the decoded uint64_t value in the example code. (#245)
-
-
-## _v2.0.1 (20170614)_
-
-**[Bug fixes]**
-- Decoding protocols when it doesn't detect a post-command gap, and there is no more data. (#243)
-- Incorrect minimum size calculation when there is no post-command gap. (#243)
-
-
-## _v2.0.0 - 64 bit support and major improvements (20170612)_
-
-**[Misc]**
-- This is almost a complete re-write of the library.
-
-**[Features]**
-- All suitable protocols now handle 64-bit data messages and are repeatable via an optional argument.
-- Unit tests for all protocols.
-- Far better and stricter decoding for most protocols.
-- Address & command decoding for protocols where that information is available.
-- Much more precise timing for generation of signals sent.
-- Lower duty-cycles for some protocols.
-- Several new protocols added, and some new sending and decoding routines for existing ones.
-- Ability to optionally chose which protocols are included, enabling faster decoding and smaller code footprints if desired.
-- Support for far larger capture buffers. (e.g. RAWLEN > 256)
-
-**[Bug fixes]**
-- Numerous bug fixes.
-
-
-## _v1.2.0 (20170429)_
-
-**[Features]**
-- Add ability to copy IR capture buffer, and continue capturing. Means faster and better IR command decoding.
-- Reduce IRAM usage by 28 bytes.
-- Improve capture of RC-MM & Panasonic protocols.
-- Upgrade IRrecvDumpV2 to new IR capture buffer. Much fewer corrupted/truncated IR messages.
-
-
-## _v1.1.1 (20170413)_
-
-**[Bug fixes]**
-- Fix a reported problem when sending the LG protocol. Preemptive fix for possible similar cases.
-- Fix minor issues in examples.
-
-**[Features]**
-- Add documentation to some examples to aid new people.
-- Add ALPHA support for RC-MM protocol. (Known to be currently not 100% working.)
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/IRrecvDumpV2/IRrecvDumpV2.ino b/lib/IRremoteESP8266-2.2.1.02/examples/IRrecvDumpV2/IRrecvDumpV2.ino
deleted file mode 100644
index bb86a5f9d2f3..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/examples/IRrecvDumpV2/IRrecvDumpV2.ino
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * IRremoteESP8266: IRrecvDumpV2 - dump details of IR codes with IRrecv
- * An IR detector/demodulator must be connected to the input RECV_PIN.
- * Example circuit diagram:
- * https://github.com/markszabo/IRremoteESP8266/wiki#ir-receiving
- * Changes:
- * Version 0.2 April, 2017
- * - Decode from a copy of the data so we can start capturing faster thus
- * reduce the likelihood of miscaptures.
- * Based on Ken Shirriff's IrsendDemo Version 0.1 July, 2009, Copyright 2009 Ken Shirriff, http://arcfn.com
- */
-
-#ifndef UNIT_TEST
-#include
-#endif
-#include
-#include
-#include
-
-// An IR detector/demodulator is connected to GPIO pin 14(D5 on a NodeMCU
-// board).
-uint16_t RECV_PIN = 14;
-// As this program is a special purpose capture/decoder, let us use a larger
-// than normal buffer so we can handle Air Conditioner remote codes.
-uint16_t CAPTURE_BUFFER_SIZE = 1024;
-
-// Nr. of milli-Seconds of no-more-data before we consider a message ended.
-// NOTE: Don't exceed MAX_TIMEOUT_MS. Typically 130ms.
-#define TIMEOUT 15U // Suits most messages, while not swallowing repeats.
-// #define TIMEOUT 90U // Suits messages with big gaps like XMP-1 & some aircon
- // units, but can accidently swallow repeated messages
- // in the rawData[] output.
-
-// Use turn on the save buffer feature for more complete capture coverage.
-IRrecv irrecv(RECV_PIN, CAPTURE_BUFFER_SIZE, TIMEOUT, true);
-
-decode_results results; // Somewhere to store the results
-
-void setup() {
- // Status message will be sent to the PC at 115200 baud
- Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
- delay(500); // Wait a bit for the serial connection to be establised.
-
- irrecv.enableIRIn(); // Start the receiver
-}
-
-// Display encoding type
-//
-void encoding(decode_results *results) {
- switch (results->decode_type) {
- default:
- case UNKNOWN: Serial.print("UNKNOWN"); break;
- case NEC: Serial.print("NEC"); break;
- case NEC_LIKE: Serial.print("NEC (non-strict)"); break;
- case SONY: Serial.print("SONY"); break;
- case RC5: Serial.print("RC5"); break;
- case RC5X: Serial.print("RC5X"); break;
- case RC6: Serial.print("RC6"); break;
- case RCMM: Serial.print("RCMM"); break;
- case DISH: Serial.print("DISH"); break;
- case SHARP: Serial.print("SHARP"); break;
- case JVC: Serial.print("JVC"); break;
- case SANYO: Serial.print("SANYO"); break;
- case SANYO_LC7461: Serial.print("SANYO_LC7461"); break;
- case MITSUBISHI: Serial.print("MITSUBISHI"); break;
- case SAMSUNG: Serial.print("SAMSUNG"); break;
- case LG: Serial.print("LG"); break;
- case WHYNTER: Serial.print("WHYNTER"); break;
- case AIWA_RC_T501: Serial.print("AIWA_RC_T501"); break;
- case PANASONIC: Serial.print("PANASONIC"); break;
- case DENON: Serial.print("DENON"); break;
- case COOLIX: Serial.print("COOLIX"); break;
- case NIKAI: Serial.print("NIKAI"); break;
- }
- if (results->repeat) Serial.print(" (Repeat)");
-}
-
-// Dump out the decode_results structure.
-//
-void dumpInfo(decode_results *results) {
- if (results->overflow)
- Serial.printf("WARNING: IR code too big for buffer (>= %d). "
- "These results shouldn't be trusted until this is resolved. "
- "Edit & increase CAPTURE_BUFFER_SIZE.\n",
- CAPTURE_BUFFER_SIZE);
-
- // Show Encoding standard
- Serial.print("Encoding : ");
- encoding(results);
- Serial.println("");
-
- // Show Code & length
- Serial.print("Code : ");
- serialPrintUint64(results->value, 16);
- Serial.print(" (");
- Serial.print(results->bits, DEC);
- Serial.println(" bits)");
-}
-
-uint16_t getCookedLength(decode_results *results) {
- uint16_t length = results->rawlen - 1;
- for (uint16_t i = 0; i < results->rawlen - 1; i++) {
- uint32_t usecs = results->rawbuf[i] * RAWTICK;
- // Add two extra entries for multiple larger than UINT16_MAX it is.
- length += (usecs / UINT16_MAX) * 2;
- }
- return length;
-}
-
-// Dump out the decode_results structure.
-//
-void dumpRaw(decode_results *results) {
- // Print Raw data
- Serial.print("Timing[");
- Serial.print(results->rawlen - 1, DEC);
- Serial.println("]: ");
-
- for (uint16_t i = 1; i < results->rawlen; i++) {
- if (i % 100 == 0)
- yield(); // Preemptive yield every 100th entry to feed the WDT.
- if (i % 2 == 0) { // even
- Serial.print("-");
- } else { // odd
- Serial.print(" +");
- }
- Serial.printf("%6d", results->rawbuf[i] * RAWTICK);
- if (i < results->rawlen - 1)
- Serial.print(", "); // ',' not needed for last one
- if (!(i % 8)) Serial.println("");
- }
- Serial.println(""); // Newline
-}
-
-// Dump out the decode_results structure.
-//
-void dumpCode(decode_results *results) {
- // Start declaration
- Serial.print("uint16_t "); // variable type
- Serial.print("rawData["); // array name
- Serial.print(getCookedLength(results), DEC); // array size
- Serial.print("] = {"); // Start declaration
-
- // Dump data
- for (uint16_t i = 1; i < results->rawlen; i++) {
- uint32_t usecs;
- for (usecs = results->rawbuf[i] * RAWTICK;
- usecs > UINT16_MAX;
- usecs -= UINT16_MAX)
- Serial.printf("%d, 0", UINT16_MAX);
- Serial.print(usecs, DEC);
- if (i < results->rawlen - 1)
- Serial.print(", "); // ',' not needed on last one
- if (i % 2 == 0) Serial.print(" "); // Extra if it was even.
- }
-
- // End declaration
- Serial.print("};"); //
-
- // Comment
- Serial.print(" // ");
- encoding(results);
- Serial.print(" ");
- serialPrintUint64(results->value, HEX);
-
- // Newline
- Serial.println("");
-
- // Now dump "known" codes
- if (results->decode_type != UNKNOWN) {
- // Some protocols have an address &/or command.
- // NOTE: It will ignore the atypical case when a message has been decoded
- // but the address & the command are both 0.
- if (results->address > 0 || results->command > 0) {
- Serial.print("uint32_t address = 0x");
- Serial.print(results->address, HEX);
- Serial.println(";");
- Serial.print("uint32_t command = 0x");
- Serial.print(results->command, HEX);
- Serial.println(";");
- }
-
- // All protocols have data
- Serial.print("uint64_t data = 0x");
- serialPrintUint64(results->value, 16);
- Serial.println(";");
- }
-}
-
-// The repeating section of the code
-//
-void loop() {
- // Check if the IR code has been received.
- if (irrecv.decode(&results)) {
- dumpInfo(&results); // Output the results
- dumpRaw(&results); // Output the results in RAW format
- dumpCode(&results); // Output the results as source code
- Serial.println(""); // Blank line between entries
- }
-}
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/TurnOnFujitsuAC/TurnOnFujitsuAC.ino b/lib/IRremoteESP8266-2.2.1.02/examples/TurnOnFujitsuAC/TurnOnFujitsuAC.ino
deleted file mode 100644
index 52e31b5d8e0d..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/examples/TurnOnFujitsuAC/TurnOnFujitsuAC.ino
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2017 Jonny Graham
-#include
-#include
-
-IRFujitsuAC fujitsu(5); // IR led controlled by Pin D1.
-
-void printState() {
- // Display the settings.
- Serial.println("Fujitsu A/C remote is in the following state:");
- Serial.printf(" Command:%d, Mode: %d, Temp: %dC, Fan Speed: %d," \
- " Swing Mode: %d\n",
- fujitsu.getCmd(), fujitsu.getMode(), fujitsu.getTemp(),
- fujitsu.getFanSpeed(), fujitsu.getSwing());
- // Display the encoded IR sequence.
- unsigned char* ir_code = fujitsu.getRaw();
- Serial.print("IR Code: 0x");
- for (uint8_t i = 0; i < FUJITSU_AC_STATE_LENGTH; i++)
- Serial.printf("%02X", ir_code[i]);
- Serial.println();
-}
-
-void setup() {
- fujitsu.begin();
- Serial.begin(115200);
- delay(200);
-
- // Set up what we want to send. See ir_Mitsubishi.cpp for all the options.
- Serial.println("Default state of the remote.");
- printState();
- Serial.println("Setting desired state for A/C.");
- fujitsu.setCmd(FUJITSU_AC_CMD_TURN_ON);
- fujitsu.setSwing(FUJITSU_AC_SWING_BOTH);
- fujitsu.setMode(FUJITSU_AC_MODE_COOL);
- fujitsu.setFanSpeed(FUJITSU_AC_FAN_HIGH);
- fujitsu.setTemp(24);
-}
-
-void loop() {
- // Now send the IR signal.
- Serial.println("Sending IR command to A/C ...");
- fujitsu.send();
- printState();
- delay(5000);
-}
diff --git a/lib/IRremoteESP8266-2.2.1.02/keywords.txt b/lib/IRremoteESP8266-2.2.1.02/keywords.txt
deleted file mode 100644
index ab1b3f70c37e..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/keywords.txt
+++ /dev/null
@@ -1,128 +0,0 @@
-#########################################
-# Syntax Coloring Map For IRremoteESP8266
-#########################################
-
-#######################################################
-# The Arduino IDE requires the use of a tab separator
-# between the name and identifier. Without this tab the
-# keyword is not highlighted.
-#
-# Reference: https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5:-Library-specification#keywords
-#######################################################
-
-#######################################
-# Datatypes (KEYWORD1)
-#######################################
-
-decode_results KEYWORD1
-IRrecv KEYWORD1
-IRsend KEYWORD1
-IRtimer KEYWORD1
-
-#######################################
-# Methods and Functions (KEYWORD2)
-#######################################
-
-decode KEYWORD2
-enableIRIn KEYWORD2
-disableIRIn KEYWORD2
-resume KEYWORD2
-begin KEYWORD2
-send KEYWORD2
-enableIROut KEYWORD2
-sendNEC KEYWORD2
-encodeNEC KEYWORD2
-sendLG KEYWORD2
-encodeLG KEYWORD2
-sendSony KEYWORD2
-encodeSony KEYWORD2
-sendSanyo KEYWORD2
-sendSanyoLC7461 KEYWORD2
-encodeSanyoLC7461 KEYWORD2
-sendMitsubishi KEYWORD2
-sendRaw KEYWORD2
-sendGC KEYWORD2
-sendRC5 KEYWORD2
-sendRC6 KEYWORD2
-sendRCMM KEYWORD2
-sendDISH KEYWORD2
-sendSharp KEYWORD2
-sendSharpRaw KEYWORD2
-encodeSharp KEYWORD2
-sendPanasonic KEYWORD2
-sendPanasonic64 KEYWORD2
-encodePanasonic KEYWORD2
-sendJVC KEYWORD2
-encodeJVC KEYWORD2
-sendWhynter KEYWORD2
-sendSAMSUNG KEYWORD2
-encodeSAMSUNG KEYWORD2
-sendDaikin KEYWORD2
-sendCOOLIX KEYWORD2
-sendDenon KEYWORD2
-sendKelvinator KEYWORD2
-sendSherwood KEYWORD2
-sendMitsubishiAC KEYWORD2
-mark KEYWORD2
-space KEYWORD2
-reset KEYWORD2
-elapsed KEYWORD2
-calcLGChecksum KEYWORD2
-reverseBits KEYWORD2
-
-#######################################
-# Constants (LITERAL1)
-#######################################
-
-NEC LITERAL1
-SONY LITERAL1
-SANYO LITERAL1
-MITSUBISHI LITERAL1
-RC5 LITERAL1
-RC5X LITERAL1
-RC6 LITERAL1
-DISH LITERAL1
-SHARP LITERAL1
-PANASONIC LITERAL1
-JVC LITERAL1
-LG LITERAL1
-SAMSUNG LITERAL1
-WHYNTER LITERAL1
-AIWA_RC_T501 LITERAL1
-COOLIX LITERAL1
-UNKNOWN LITERAL1
-REPEAT LITERAL1
-DENON LITERAL1
-DAIKIN LITERAL1
-KELVINATOR LITERAL1
-SHERWOOD LITERAL1
-MITSUBISHIAC LITERAL1
-RCMM LITERAL1
-SANYO_LC7461 LITERAL1
-NEC_BITS LITERAL1
-SHERWOOD_BITS LITERAL1
-SONY_MIN_BITS LITERAL1
-SONY_12_BITS LITERAL1
-SONY_15_BITS LITERAL1
-SONY_20_BITS LITERAL1
-SANYO_SA8650B_BITS LITERAL1
-MITSUBISHI_BITS LITERAL1
-PANASONIC_BITS LITERAL1
-JVC_BITS LITERAL1
-LG_BITS LITERAL1
-SAMSUNG_BITS LITERAL1
-COOLIX_BITS LITERAL1
-DAIKIN_BITS LITERAL1
-RC5X_BITS LITERAL1
-RC6_36_BITS LITERAL1
-RC6_MODE0_BITS LITERAL1
-RCMM_BITS LITERAL1
-WHYNTER_BITS LITERAL1
-SANYO_LC7461_BITS LITERAL1
-SHARP_BITS LITERAL1
-DISH_BITS LITERAL1
-DENON_BITS LITERAL1
-SONY_MIN_REPEAT LITERAL1
-MITSUBISHI_MIN_REPEAT LITERAL1
-DISH_MIN_REPEAT LITERAL1
-SHERWOOD_MIN_REPEAT LITERAL1
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/IRrecv.h b/lib/IRremoteESP8266-2.2.1.02/src/IRrecv.h
deleted file mode 100644
index febe5e2d534c..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/IRrecv.h
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright 2009 Ken Shirriff
-// Copyright 2015 Mark Szabo
-// Copyright 2015 Sebastien Warin
-// Copyright 2017 David Conran
-
-#ifndef IRRECV_H_
-#define IRRECV_H_
-
-#ifndef UNIT_TEST
-#include
-#endif
-#include
-#define __STDC_LIMIT_MACROS
-#include
-#include "IRremoteESP8266.h"
-
-// Constants
-#define HEADER 2U // Usual nr. of header entries.
-#define FOOTER 2U // Usual nr. of footer (stop bits) entries.
-#define OFFSET_START 1U // Usual rawbuf entry to start processing from.
-#define MS_TO_USEC(x) (x * 1000U) // Convert milli-Seconds to micro-Seconds.
-// Marks tend to be 100us too long, and spaces 100us too short
-// when received due to sensor lag.
-#define MARK_EXCESS 50U
-#define RAWBUF 100U // Default length of raw capture buffer
-#define REPEAT UINT64_MAX
-// receiver states
-#define STATE_IDLE 2U
-#define STATE_MARK 3U
-#define STATE_SPACE 4U
-#define STATE_STOP 5U
-#define TOLERANCE 25U // default percent tolerance in measurements
-#define RAWTICK 2U // Capture tick to uSec factor.
-// How long (ms) before we give up wait for more data?
-// Don't exceed MAX_TIMEOUT_MS without a good reason.
-// That is the capture buffers maximum value size. (UINT16_MAX / RAWTICK)
-// Typically messages/protocols tend to repeat around the 100ms timeframe,
-// thus we should timeout before that to give us some time to try to decode
-// before we need to start capturing a possible new message.
-// Typically 15ms suits most applications. However, some protocols demand a
-// higher value. e.g. 90ms for XMP-1 and some aircon units.
-#define TIMEOUT_MS 15U // In MilliSeconds.
-#define MAX_TIMEOUT_MS (RAWTICK * UINT16_MAX / MS_TO_USEC(1))
-
-// Use FNV hash algorithm: http://isthe.com/chongo/tech/comp/fnv/#FNV-param
-#define FNV_PRIME_32 16777619UL
-#define FNV_BASIS_32 2166136261UL
-
-// Types
-// information for the interrupt handler
-typedef struct {
- uint8_t recvpin; // pin for IR data from detector
- uint8_t rcvstate; // state machine
- uint16_t timer; // state timer, counts 50uS ticks.
- uint16_t bufsize; // max. nr. of entries in the capture buffer.
- uint16_t *rawbuf; // raw data
- // uint16_t is used for rawlen as it saves 3 bytes of iram in the interrupt
- // handler. Don't ask why, I don't know. It just does.
- uint16_t rawlen; // counter of entries in rawbuf.
- uint8_t overflow; // Buffer overflow indicator.
- uint8_t timeout; // Nr. of milliSeconds before we give up.
-} irparams_t;
-
-// results from a data match
-typedef struct {
- bool success; // Was the match successful?
- uint64_t data; // The data found.
- uint16_t used; // How many buffer positions were used.
-} match_result_t;
-
-// Classes
-
-// Results returned from the decoder
-class decode_results {
- public:
- decode_type_t decode_type; // NEC, SONY, RC5, UNKNOWN
- uint64_t value; // Decoded value
- uint16_t bits; // Number of bits in decoded value
- volatile uint16_t *rawbuf; // Raw intervals in .5 us ticks
- uint16_t rawlen; // Number of records in rawbuf.
- bool overflow;
- bool repeat; // Is the result a repeat code?
- uint32_t address; // Decoded device address.
- uint32_t command; // Decoded command.
-};
-
-// main class for receiving IR
-class IRrecv {
- public:
- explicit IRrecv(uint16_t recvpin, uint16_t bufsize = RAWBUF,
- uint8_t timeout = TIMEOUT_MS,
- bool save_buffer = false); // Constructor
- ~IRrecv(); // Destructor
- bool decode(decode_results *results, irparams_t *save = NULL);
- void enableIRIn();
- void disableIRIn();
- void resume();
- uint16_t getBufSize();
-
-#ifndef UNIT_TEST
-
- private:
-#endif
- irparams_t *irparams_save;
- // These are called by decode
- void copyIrParams(volatile irparams_t *src, irparams_t *dst);
- int16_t compare(uint16_t oldval, uint16_t newval);
- uint32_t ticksLow(uint32_t usecs, uint8_t tolerance = TOLERANCE);
- uint32_t ticksHigh(uint32_t usecs, uint8_t tolerance = TOLERANCE);
- bool match(uint32_t measured, uint32_t desired,
- uint8_t tolerance = TOLERANCE);
- bool matchAtLeast(uint32_t measured, uint32_t desired,
- uint8_t tolerance = TOLERANCE);
- bool matchMark(uint32_t measured, uint32_t desired,
- uint8_t tolerance = TOLERANCE, int16_t excess = MARK_EXCESS);
- bool matchSpace(uint32_t measured, uint32_t desired,
- uint8_t tolerance = TOLERANCE, int16_t excess = MARK_EXCESS);
- match_result_t matchData(volatile uint16_t *data_ptr, uint16_t nbits,
- uint16_t onemark, uint32_t onespace,
- uint16_t zeromark, uint32_t zerospace);
- bool decodeHash(decode_results *results);
-#if (DECODE_NEC || DECODE_SHERWOOD || DECODE_AIWA_RC_T501 || SEND_SANYO)
- bool decodeNEC(decode_results *results, uint16_t nbits = NEC_BITS,
- bool strict = true);
-#endif
-#if DECODE_SONY
- bool decodeSony(decode_results *results, uint16_t nbits = SONY_MIN_BITS,
- bool strict = false);
-#endif
-#if DECODE_SANYO
- // DISABLED due to poor quality.
- // bool decodeSanyo(decode_results *results,
- // uint16_t nbits = SANYO_SA8650B_BITS,
- // bool strict = false);
- bool decodeSanyoLC7461(decode_results *results,
- uint16_t nbits = SANYO_LC7461_BITS,
- bool strict = true);
-#endif
-#if DECODE_MITSUBISHI
- bool decodeMitsubishi(decode_results *results,
- uint16_t nbits = MITSUBISHI_BITS,
- bool strict = true);
-#endif
-#if (DECODE_RC5 || DECODE_R6)
- int16_t getRClevel(decode_results *results, uint16_t *offset, uint16_t *used,
- uint16_t bitTime);
-#endif
-#if DECODE_RC5
- bool decodeRC5(decode_results *results, uint16_t nbits = RC5X_BITS,
- bool strict = true);
-#endif
-#if DECODE_RC6
- bool decodeRC6(decode_results *results, uint16_t nbits = RC6_MODE0_BITS,
- bool strict = false);
-#endif
-#if DECODE_RCMM
- bool decodeRCMM(decode_results *results, uint16_t nbits = RCMM_BITS,
- bool strict = false);
-#endif
-#if (DECODE_PANASONIC || DECODE_DENON)
- bool decodePanasonic(decode_results *results, uint16_t nbits = PANASONIC_BITS,
- bool strict = false,
- uint32_t manufacturer = PANASONIC_MANUFACTURER);
-#endif
-#if DECODE_LG
- bool decodeLG(decode_results *results, uint16_t nbits = LG_BITS,
- bool strict = false);
-#endif
-#if DECODE_JVC
- bool decodeJVC(decode_results *results, uint16_t nbits = JVC_BITS,
- bool strict = true);
-#endif
-#if DECODE_SAMSUNG
- bool decodeSAMSUNG(decode_results *results, uint16_t nbits = SAMSUNG_BITS,
- bool strict = true);
-#endif
-#if DECODE_WHYNTER
- bool decodeWhynter(decode_results *results, uint16_t nbits = WHYNTER_BITS,
- bool strict = true);
-#endif
-#if DECODE_COOLIX
- bool decodeCOOLIX(decode_results *results, uint16_t nbits = COOLIX_BITS,
- bool strict = true);
-#endif
-#if DECODE_DENON
- bool decodeDenon(decode_results *results, uint16_t nbits = DENON_BITS,
- bool strict = true);
-#endif
-#if DECODE_DISH
- bool decodeDISH(decode_results *results, uint16_t nbits = DISH_BITS,
- bool strict = true);
-#endif
-#if (DECODE_SHARP || DECODE_DENON)
- bool decodeSharp(decode_results *results, uint16_t nbits = SHARP_BITS,
- bool strict = true, bool expansion = true);
-#endif
-#if DECODE_AIWA_RC_T501
- bool decodeAiwaRCT501(decode_results *results,
- uint16_t nbits = AIWA_RC_T501_BITS, bool strict = true);
-#endif
-#if DECODE_NIKAI
- bool decodeNikai(decode_results *results, uint16_t nbits = NIKAI_BITS,
- bool strict = true);
-#endif
-};
-
-#endif // IRRECV_H_
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/IRremoteESP8266.h b/lib/IRremoteESP8266-2.2.1.02/src/IRremoteESP8266.h
deleted file mode 100644
index e2dc26904dff..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/IRremoteESP8266.h
+++ /dev/null
@@ -1,337 +0,0 @@
- /***************************************************
- * IRremote for ESP8266
- *
- * Based on the IRremote library for Arduino by Ken Shirriff
- * Version 0.11 August, 2009
- * Copyright 2009 Ken Shirriff
- * For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
- *
- * Edited by Mitra to add new controller SANYO
- *
- * Interrupt code based on NECIRrcv by Joe Knapp
- * http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1210243556
- * Also influenced by http://zovirl.com/2008/11/12/building-a-universal-remote-with-an-arduino/
- *
- * JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post)
- * LG added by Darryl Smith (based on the JVC protocol)
- * Whynter A/C ARC-110WD added by Francesco Meschia
- * Coolix A/C / heatpump added by (send) bakrus & (decode) crankyoldgit
- * Denon: sendDenon, decodeDenon added by Massimiliano Pinto
- (from https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Denon.cpp)
- * Kelvinator A/C and Sherwood added by crankyoldgit
- * Mitsubishi (TV) sending added by crankyoldgit
- * Pronto code sending added by crankyoldgit
- * Mitsubishi A/C added by crankyoldgit
- * (derived from https://github.com/r45635/HVAC-IR-Control)
- * DISH decode by marcosamarinho
- * Gree Heatpump sending added by Ville Skyttä (scop)
- * (derived from https://github.com/ToniA/arduino-heatpumpir/blob/master/GreeHeatpumpIR.cpp)
- * Updated by markszabo (https://github.com/markszabo/IRremoteESP8266) for sending IR code on ESP8266
- * Updated by Sebastien Warin (http://sebastien.warin.fr) for receiving IR code on ESP8266
- *
- * Updated by sillyfrog for Daikin, adopted from
- * (https://github.com/mharizanov/Daikin-AC-remote-control-over-the-Internet/)
- * Fujitsu A/C code added by jonnygraham
- * Trotec AC code by stufisher
- * GPL license, all text above must be included in any redistribution
- ****************************************************/
-
-#ifndef IRREMOTEESP8266_H_
-#define IRREMOTEESP8266_H_
-
-#define __STDC_LIMIT_MACROS
-#include
-#ifdef UNIT_TEST
-#include
-#endif
-
-// Library Version
-#define _IRREMOTEESP8266_VERSION_ "2.2.1"
-// Supported IR protocols
-// Each protocol you include costs memory and, during decode, costs time
-// Disable (set to false) all the protocols you do not need/want!
-//
-/*
-#define DECODE_NEC true
-#define SEND_NEC true
-
-#define DECODE_SHERWOOD true // Doesn't exist. Actually is DECODE_NEC
-#define SEND_SHERWOOD true
-
-#define DECODE_RC5 true
-#define SEND_RC5 true
-
-#define DECODE_RC6 true
-#define SEND_RC6 true
-
-#define DECODE_RCMM true
-#define SEND_RCMM true
-
-#define DECODE_SONY true
-#define SEND_SONY true
-
-#define DECODE_PANASONIC true
-#define SEND_PANASONIC true
-
-#define DECODE_JVC true
-#define SEND_JVC true
-
-#define DECODE_SAMSUNG true
-#define SEND_SAMSUNG true
-
-#define DECODE_WHYNTER true
-#define SEND_WHYNTER true
-
-#define DECODE_AIWA_RC_T501 true
-#define SEND_AIWA_RC_T501 true
-
-#define DECODE_LG true
-#define SEND_LG true
-
-#define DECODE_SANYO true
-#define SEND_SANYO true
-
-#define DECODE_MITSUBISHI true
-#define SEND_MITSUBISHI true
-
-#define DECODE_DISH true
-#define SEND_DISH true
-
-#define DECODE_SHARP true
-#define SEND_SHARP true
-
-#define DECODE_DENON true
-#define SEND_DENON true
-
-#define DECODE_KELVINATOR false // Not written.
-#define SEND_KELVINATOR true
-
-#define DECODE_MITSUBISHI_AC false // Not written.
-#define SEND_MITSUBISHI_AC true
-
-#define DECODE_FUJITSU_AC false // Not written.
-#define SEND_FUJITSU_AC true
-
-#define DECODE_DAIKIN false // Not finished.
-#define SEND_DAIKIN true
-
-#define DECODE_COOLIX true
-#define SEND_COOLIX true
-
-#define DECODE_GLOBALCACHE false // Not written.
-#define SEND_GLOBALCACHE true
-
-#define DECODE_GREE false // Not written.
-#define SEND_GREE true
-
-#define DECODE_PRONTO false // Not written.
-#define SEND_PRONTO true
-
-#define DECODE_ARGO false // Not written.
-#define SEND_ARGO true
-
-#define DECODE_TROTEC false // Not implemented.
-#define SEND_TROTEC true
-
-#define DECODE_NIKAI true
-#define SEND_NIKAI true
-*/
-
-// Tasmota supported protocols (less protocols is less code size)
-#define DECODE_NEC true
-#define SEND_NEC true
-
-#define DECODE_SHERWOOD false // Doesn't exist. Actually is DECODE_NEC
-#define SEND_SHERWOOD false
-
-#define DECODE_RC5 true
-#define SEND_RC5 true
-
-#define DECODE_RC6 true
-#define SEND_RC6 true
-
-#define DECODE_RCMM false
-#define SEND_RCMM false
-
-#define DECODE_SONY true
-#define SEND_SONY true
-
-#define DECODE_PANASONIC true
-#define SEND_PANASONIC true
-
-#define DECODE_JVC true
-#define SEND_JVC true
-
-#define DECODE_SAMSUNG true
-#define SEND_SAMSUNG true
-
-#define DECODE_WHYNTER false
-#define SEND_WHYNTER false
-
-#define DECODE_AIWA_RC_T501 false
-#define SEND_AIWA_RC_T501 false
-
-#define DECODE_LG false
-#define SEND_LG false
-
-#define DECODE_SANYO false
-#define SEND_SANYO false
-
-#define DECODE_MITSUBISHI false
-#define SEND_MITSUBISHI false
-
-#define DECODE_DISH false
-#define SEND_DISH true
-
-#define DECODE_SHARP false
-#define SEND_SHARP false
-
-#define DECODE_DENON false
-#define SEND_DENON false
-
-#define DECODE_KELVINATOR false // Not written.
-#define SEND_KELVINATOR false
-
-#define DECODE_MITSUBISHI_AC false // Not written.
-#define SEND_MITSUBISHI_AC true
-
-#define DECODE_FUJITSU_AC false // Not written.
-#define SEND_FUJITSU_AC false
-
-#define DECODE_DAIKIN false // Not finished.
-#define SEND_DAIKIN false
-
-#define DECODE_COOLIX false
-#define SEND_COOLIX false
-
-#define DECODE_GLOBALCACHE false // Not written.
-#define SEND_GLOBALCACHE false
-
-#define DECODE_GREE false // Not written.
-#define SEND_GREE false
-
-#define DECODE_PRONTO false // Not written.
-#define SEND_PRONTO false
-
-#define DECODE_ARGO false // Not written.
-#define SEND_ARGO false
-
-#define DECODE_TROTEC false // Not implemented.
-#define SEND_TROTEC false
-
-#define DECODE_NIKAI false
-#define SEND_NIKAI false
-
-/*
- * Always add to the end of the list and should never remove entries
- * or change order. Projects may save the type number for later usage
- * so numbering should always stay the same.
- */
-enum decode_type_t {
- UNKNOWN = -1,
- UNUSED = 0,
- RC5,
- RC6,
- NEC,
- SONY,
- PANASONIC,
- JVC,
- SAMSUNG,
- WHYNTER,
- AIWA_RC_T501,
- LG,
- SANYO,
- MITSUBISHI,
- DISH,
- SHARP,
- COOLIX,
- DAIKIN,
- DENON,
- KELVINATOR,
- SHERWOOD,
- MITSUBISHI_AC,
- RCMM,
- SANYO_LC7461,
- RC5X,
- GREE,
- PRONTO, // Technically not a protocol, but an encoding.
- NEC_LIKE,
- ARGO,
- TROTEC,
- NIKAI,
- RAW, // Technically not a protocol, but an encoding.
- GLOBALCACHE // Technically not a protocol, but an encoding.
-};
-
-// Message lengths & required repeat values
-#define AIWA_RC_T501_BITS 15U
-#define AIWA_RC_T501_MIN_REPEAT 1U
-#define COOLIX_BITS 24U
-#define DAIKIN_BITS 99U
-#define DAIKIN_COMMAND_LENGTH 27U
-#define DENON_BITS SHARP_BITS
-#define DENON_48_BITS PANASONIC_BITS
-#define DENON_LEGACY_BITS 14U
-#define DISH_BITS 16U
-#define DISH_MIN_REPEAT 3U
-#define GREE_STATE_LENGTH 8U
-#define GREE_BITS (GREE_STATE_LENGTH * 8)
-#define JVC_BITS 16U
-#define KELVINATOR_STATE_LENGTH 16U
-#define LG_BITS 28U
-#define LG32_BITS 32U
-#define MITSUBISHI_BITS 16U
-// TODO(anyone): Verify that the Mitsubishi repeat is really needed.
-#define MITSUBISHI_MIN_REPEAT 1U // Based on marcosamarinho's code.
-#define MITSUBISHI_AC_STATE_LENGTH 18U
-#define MITSUBISHI_AC_MIN_REPEAT 1U
-#define FUJITSU_AC_MIN_REPEAT 0U
-#define NEC_BITS 32U
-#define PANASONIC_BITS 48U
-#define PANASONIC_MANUFACTURER 0x4004ULL
-#define PRONTO_MIN_LENGTH 6U
-#define RC5_RAW_BITS 14U
-#define RC5_BITS RC5_RAW_BITS - 2U
-#define RC5X_BITS RC5_RAW_BITS - 1U
-#define RC6_MODE0_BITS 20U // Excludes the 'start' bit.
-#define RC6_36_BITS 36U // Excludes the 'start' bit.
-#define RCMM_BITS 24U
-#define SAMSUNG_BITS 32U
-#define SANYO_SA8650B_BITS 12U
-#define SANYO_LC7461_ADDRESS_BITS 13U
-#define SANYO_LC7461_COMMAND_BITS 8U
-#define SANYO_LC7461_BITS ((SANYO_LC7461_ADDRESS_BITS + \
- SANYO_LC7461_COMMAND_BITS) * 2)
-#define SHARP_ADDRESS_BITS 5U
-#define SHARP_COMMAND_BITS 8U
-#define SHARP_BITS (SHARP_ADDRESS_BITS + SHARP_COMMAND_BITS + 2) // 15U
-#define SHERWOOD_BITS NEC_BITS
-#define SHERWOOD_MIN_REPEAT 1U
-#define SONY_12_BITS 12U
-#define SONY_15_BITS 15U
-#define SONY_20_BITS 20U
-#define SONY_MIN_BITS SONY_12_BITS
-#define SONY_MIN_REPEAT 2U
-#define TROTEC_COMMAND_LENGTH 9U
-#define WHYNTER_BITS 32U
-#define ARGO_COMMAND_LENGTH 12U
-#define NIKAI_BITS 24U
-
-// Turn on Debugging information by uncommenting the following line.
-// #define DEBUG 1
-
-#ifdef DEBUG
-#ifdef UNIT_TEST
-#define DPRINT(x) do { std::cout << x; } while (0)
-#define DPRINTLN(x) do { std::cout << x << std::endl; } while (0)
-#endif // UNIT_TEST
-#ifdef ARDUINO
-#define DPRINT(x) do { Serial.print(x); } while (0)
-#define DPRINTLN(x) do { Serial.println(x); } while (0)
-#endif // ARDUINO
-#else // DEBUG
-#define DPRINT(x)
-#define DPRINTLN(x)
-#endif // DEBUG
-
-#endif // IRREMOTEESP8266_H_
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/IRsend.cpp b/lib/IRremoteESP8266-2.2.1.02/src/IRsend.cpp
deleted file mode 100644
index 300b1fa99a22..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/IRsend.cpp
+++ /dev/null
@@ -1,327 +0,0 @@
-// Copyright 2009 Ken Shirriff
-// Copyright 2015 Mark Szabo
-// Copyright 2017 David Conran
-
-#include "IRsend.h"
-#ifndef UNIT_TEST
-#include
-#else
-#define __STDC_LIMIT_MACROS
-#include
-#endif
-#include
-#ifdef UNIT_TEST
-#include
-#endif
-#include "IRtimer.h"
-
-// Originally from https://github.com/shirriff/Arduino-IRremote/
-// Updated by markszabo (https://github.com/markszabo/IRremoteESP8266) for
-// sending IR code on ESP8266
-
-// IRsend ----------------------------------------------------------------------
-// Create an IRsend object.
-//
-// Args:
-// IRsendPin: Which GPIO pin to use when sending an IR command.
-// inverted: *DANGER* Optional flag to invert the output. (default = false)
-// e.g. LED is illuminated when GPIO is LOW rather than HIGH.
-// Setting this to something other than the default could
-// easily destroy your IR LED if you are overdriving it.
-// Unless you *REALLY* know what you are doing, don't change this.
-// Returns:
-// An IRsend object.
-IRsend::IRsend(uint16_t IRsendPin, bool inverted) : IRpin(IRsendPin),
- periodOffset(PERIOD_OFFSET) {
- if (inverted) {
- outputOn = LOW;
- outputOff = HIGH;
- } else {
- outputOn = HIGH;
- outputOff = LOW;
- }
-}
-
-// Enable the pin for output.
-void IRsend::begin() {
-#ifndef UNIT_TEST
- pinMode(IRpin, OUTPUT);
-#endif
-}
-
-// Turn off the IR LED.
-void IRsend::ledOff() {
-#ifndef UNIT_TEST
- digitalWrite(IRpin, outputOff);
-#endif
-}
-
-// Calculate the period for a given frequency. (T = 1/f)
-//
-// Args:
-// freq: Frequency in Hz.
-// use_offset: Should we use the calculated offset or not?
-// Returns:
-// nr. of uSeconds.
-uint32_t IRsend::calcUSecPeriod(uint32_t hz, bool use_offset) {
- if (hz == 0) hz = 1; // Avoid Zero hz. Divide by Zero is nasty.
- uint32_t period = (1000000UL + hz/2) / hz; // The equiv of round(1000000/hz).
- // Apply the offset and ensure we don't result in a <= 0 value.
- if (use_offset)
- return std::max((uint32_t) 1, period + periodOffset);
- else
- return std::max((uint32_t) 1, period);
-}
-
-// Set the output frequency modulation and duty cycle.
-//
-// Args:
-// freq: The freq we want to modulate at. Assumes < 1000 means kHz else Hz.
-// duty: Percentage duty cycle of the LED. e.g. 25 = 25% = 1/4 on, 3/4 off.
-//
-// Note:
-// Integer timing functions & math mean we can't do fractions of
-// microseconds timing. Thus minor changes to the freq & duty values may have
-// limited effect. You've been warned.
-void IRsend::enableIROut(uint32_t freq, uint8_t duty) {
- // Can't have more than 100% duty cycle.
- duty = std::min(duty, (uint8_t) 100);
- if (freq < 1000) // Were we given kHz? Supports the old call usage.
- freq *= 1000;
- uint32_t period = calcUSecPeriod(freq);
- // Nr. of uSeconds the LED will be on per pulse.
- onTimePeriod = (period * duty) / 100;
- // Nr. of uSeconds the LED will be off per pulse.
- offTimePeriod = period - onTimePeriod;
-}
-
-// Modulate the IR LED for the given period (usec) and at the duty cycle set.
-//
-// Args:
-// usec: The period of time to modulate the IR LED for, in microseconds.
-// Returns:
-// Nr. of pulses actually sent.
-//
-// Note:
-// The ESP8266 has no good way to do hardware PWM, so we have to do it all
-// in software. There is a horrible kludge/brilliant hack to use the second
-// serial TX line to do fairly accurate hardware PWM, but it is only
-// available on a single specific GPIO and only available on some modules.
-// e.g. It's not available on the ESP-01 module.
-// Hence, for greater compatibility & choice, we don't use that method.
-// Ref:
-// https://www.analysir.com/blog/2017/01/29/updated-esp8266-nodemcu-backdoor-upwm-hack-for-ir-signals/
-uint16_t IRsend::mark(uint16_t usec) {
- uint16_t counter = 0;
- IRtimer usecTimer = IRtimer();
- // Cache the time taken so far. This saves us calling time, and we can be
- // assured that we can't have odd math problems. i.e. unsigned under/overflow.
- uint32_t elapsed = usecTimer.elapsed();
-
- while (elapsed < usec) { // Loop until we've met/exceeded our required time.
-#ifndef UNIT_TEST
- digitalWrite(IRpin, outputOn); // Turn the LED on.
- // Calculate how long we should pulse on for.
- // e.g. Are we to close to the end of our requested mark time (usec)?
- delayMicroseconds(std::min((uint32_t) onTimePeriod, usec - elapsed));
- digitalWrite(IRpin, outputOff); // Turn the LED off.
-#endif
- counter++;
- if (elapsed + onTimePeriod >= usec)
- return counter; // LED is now off & we've passed our allotted time.
- // Wait for the lesser of the rest of the duty cycle, or the time remaining.
-#ifndef UNIT_TEST
- delayMicroseconds(std::min(usec - elapsed - onTimePeriod,
- (uint32_t) offTimePeriod));
-#endif
- elapsed = usecTimer.elapsed(); // Update & recache the actual elapsed time.
- }
- return counter;
-}
-
-// Turn the pin (LED) off for a given time.
-// Sends an IR space for the specified number of microseconds.
-// A space is no output, so the PWM output is disabled.
-//
-// Args:
-// time: Time in microseconds (us).
-void IRsend::space(uint32_t time) {
- ledOff();
- if (time == 0) return;
-#ifndef UNIT_TEST
- // delayMicroseconds is only accurate to 16383us.
- // Ref: https://www.arduino.cc/en/Reference/delayMicroseconds
- if (time <= 16383) {
- delayMicroseconds(time);
- } else {
- // Invoke a delay(), where possible, to avoid triggering the WDT.
- delay(time / 1000UL); // Delay for as many whole milliseconds as we can.
- // Delay the remaining sub-millisecond.
- delayMicroseconds(static_cast(time % 1000UL));
- }
-#endif
-}
-
-// Calculate & set any offsets to account for execution times.
-//
-// Args:
-// hz: The frequency to calibrate at >= 1000Hz. Default is 38000Hz.
-//
-// Status: ALPHA / Untested.
-//
-// NOTE:
-// This will generate an 65535us mark() IR LED signal.
-// This only needs to be called once, if at all.
-void IRsend::calibrate(uint16_t hz) {
- if (hz < 1000) // Were we given kHz? Supports the old call usage.
- hz *= 1000;
- periodOffset = 0; // Turn off any existing offset while we calibrate.
- enableIROut(hz);
- IRtimer usecTimer = IRtimer(); // Start a timer *just* before we do the call.
- uint16_t pulses = mark(UINT16_MAX); // Generate a PWM of 65,535 us. (Max.)
- uint32_t timeTaken = usecTimer.elapsed(); // Record the time it took.
- // While it shouldn't be necessary, assume at least 1 pulse, to avoid a
- // divide by 0 situation.
- pulses = std::max(pulses, (uint16_t) 1U);
- uint32_t calcPeriod = calcUSecPeriod(hz); // e.g. @38kHz it should be 26us.
- // Assuming 38kHz for the example calculations:
- // In a 65535us pulse, we should have 2520.5769 pulses @ 26us periods.
- // e.g. 65535.0us / 26us = 2520.5769
- // This should have caused approx 2520 loops through the main loop in mark().
- // The average over that many interations should give us a reasonable
- // approximation at what offset we need to use to account for instruction
- // execution times.
- //
- // Calculate the actual period from the actual time & the actual pulses
- // generated.
- double_t actualPeriod = (double_t) timeTaken / (double_t) pulses;
- // Store the difference between the actual time per period vs. calculated.
- periodOffset = (int8_t) ((double_t) calcPeriod - actualPeriod);
-}
-
-// Generic method for sending data that is common to most protocols.
-// Will send leading or trailing 0's if the nbits is larger than the number
-// of bits in data.
-//
-// Args:
-// onemark: Nr. of usecs for the led to be pulsed for a '1' bit.
-// onespace: Nr. of usecs for the led to be fully off for a '1' bit.
-// zeromark: Nr. of usecs for the led to be pulsed for a '0' bit.
-// zerospace: Nr. of usecs for the led to be fully off for a '0' bit.
-// data: The data to be transmitted.
-// nbits: Nr. of bits of data to be sent.
-// MSBfirst: Flag for bit transmission order. Defaults to MSB->LSB order.
-void IRsend::sendData(uint16_t onemark, uint32_t onespace,
- uint16_t zeromark, uint32_t zerospace,
- uint64_t data, uint16_t nbits, bool MSBfirst) {
- if (nbits == 0) // If we are asked to send nothing, just return.
- return;
- if (MSBfirst) { // Send the MSB first.
- // Send 0's until we get down to a bit size we can actually manage.
- while (nbits > sizeof(data) * 8) {
- mark(zeromark);
- space(zerospace);
- nbits--;
- }
- // Send the supplied data.
- for (uint64_t mask = 1ULL << (nbits - 1); mask; mask >>= 1)
- if (data & mask) { // Send a 1
- mark(onemark);
- space(onespace);
- } else { // Send a 0
- mark(zeromark);
- space(zerospace);
- }
- } else { // Send the Least Significant Bit (LSB) first / MSB last.
- for (uint16_t bit = 0; bit < nbits; bit++, data >>= 1)
- if (data & 1) { // Send a 1
- mark(onemark);
- space(onespace);
- } else { // Send a 0
- mark(zeromark);
- space(zerospace);
- }
- }
-}
-
-// Send a raw IRremote message.
-//
-// Args:
-// buf: An array of uint16_t's that has microseconds elements.
-// len: Nr. of elements in the buf[] array.
-// hz: Frequency to send the message at. (kHz < 1000; Hz >= 1000)
-//
-// Status: STABLE / Known working.
-//
-// Notes:
-// Even elements are Mark times (On), Odd elements are Space times (Off).
-//
-// Ref:
-// examples/IRrecvDumpV2/IRrecvDumpV2.ino
-void IRsend::sendRaw(uint16_t buf[], uint16_t len, uint16_t hz) {
- // Set IR carrier frequency
- enableIROut(hz);
- for (uint16_t i = 0; i < len; i++) {
- if (i & 1) { // Odd bit.
- space(buf[i]);
- } else { // Even bit.
- mark(buf[i]);
- }
- }
- ledOff(); // We potentially have ended with a mark(), so turn of the LED.
-}
-
-#ifndef UNIT_TEST
-void IRsend::send(uint16_t type, uint64_t data, uint16_t nbits) {
- switch (type) {
-#if SEND_NEC
- case NEC: sendNEC(data, nbits); break;
-#endif
-#if SEND_SONY
- case SONY: sendSony(data, nbits); break;
-#endif
-#if SEND_RC5
- case RC5: sendRC5(data, nbits); break;
-#endif
-#if SEND_RC6
- case RC6: sendRC6(data, nbits); break;
-#endif
-#if SEND_DISH
- case DISH: sendDISH(data, nbits); break;
-#endif
-#if SEND_JVC
- case JVC: sendJVC(data, nbits); break;
-#endif
-#if SEND_SAMSUNG
- case SAMSUNG: sendSAMSUNG(data, nbits); break;
-#endif
-#if SEND_LG
- case LG: sendLG(data, nbits); break;
-#endif
-#if SEND_WHYNTER
- case WHYNTER: sendWhynter(data, nbits); break;
-#endif
-#if SEND_COOLIX
- case COOLIX: sendCOOLIX(data, nbits); break;
-#endif
-#if SEND_DENON
- case DENON: sendDenon(data, nbits); break;
-#endif
-#if SEND_SHERWOOD
- case SHERWOOD: sendSherwood(data, nbits); break;
-#endif
-#if SEND_RCMM
- case RCMM: sendRCMM(data, nbits); break;
-#endif
-#if SEND_MITSUBISHI
- case MITSUBISHI: sendMitsubishi(data, nbits); break;
-#endif
-#if SEND_SHARP
- case SHARP: sendSharpRaw(data, nbits); break;
-#endif
-#if SEND_AIWA_RC_T501
- case AIWA_RC_T501: sendAiwaRCT501(data, nbits); break;
-#endif
- }
-}
-#endif
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/IRsend.h b/lib/IRremoteESP8266-2.2.1.02/src/IRsend.h
deleted file mode 100644
index 87c1fdd9a721..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/IRsend.h
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright 2009 Ken Shirriff
-// Copyright 2015 Mark Szabo
-// Copyright 2017 David Conran
-#ifndef IRSEND_H_
-#define IRSEND_H_
-
-#define __STDC_LIMIT_MACROS
-#include
-#include "IRremoteESP8266.h"
-
-// Originally from https://github.com/shirriff/Arduino-IRremote/
-// Updated by markszabo (https://github.com/markszabo/IRremoteESP8266) for
-// sending IR code on ESP8266
-
-#if TEST || UNIT_TEST
-#define VIRTUAL virtual
-#else
-#define VIRTUAL
-#endif
-
-// Constants
-// Offset (in microseconds) to use in Period time calculations to account for
-// code excution time in producing the software PWM signal.
-// Value determined in https://github.com/markszabo/IRremoteESP8266/issues/62
-#define PERIOD_OFFSET -3
-#define DUTY_DEFAULT 50
-
-// Classes
-class IRsend {
- public:
- explicit IRsend(uint16_t IRsendPin, bool inverted = false);
- void begin();
- void enableIROut(uint32_t freq, uint8_t duty = DUTY_DEFAULT);
- VIRTUAL uint16_t mark(uint16_t usec);
- VIRTUAL void space(uint32_t usec);
- void calibrate(uint16_t hz = 38000U);
- void sendRaw(uint16_t buf[], uint16_t len, uint16_t hz);
- void sendData(uint16_t onemark, uint32_t onespace, uint16_t zeromark,
- uint32_t zerospace, uint64_t data, uint16_t nbits,
- bool MSBfirst = true);
- void send(uint16_t type, uint64_t data, uint16_t nbits);
-#if (SEND_NEC || SEND_SHERWOOD || SEND_AIWA_RC_T501 || SEND_SANYO)
- void sendNEC(uint64_t data, uint16_t nbits = NEC_BITS, uint16_t repeat = 0);
- uint32_t encodeNEC(uint16_t address, uint16_t command);
-#endif
-#if SEND_SONY
- // sendSony() should typically be called with repeat=2 as Sony devices
- // expect the code to be sent at least 3 times. (code + 2 repeats = 3 codes)
- // Legacy use of this procedure was to only send a single code so call it with
- // repeat=0 for backward compatibility. As of v2.0 it defaults to sending
- // a Sony command that will be accepted be a device.
- void sendSony(uint64_t data, uint16_t nbits = SONY_20_BITS,
- uint16_t repeat = SONY_MIN_REPEAT);
- uint32_t encodeSony(uint16_t nbits, uint16_t command, uint16_t address,
- uint16_t extended = 0);
-#endif
-#if SEND_SHERWOOD
- void sendSherwood(uint64_t data, uint16_t nbits = SHERWOOD_BITS,
- uint16_t repeat = SHERWOOD_MIN_REPEAT);
-#endif
-#if SEND_SAMSUNG
- void sendSAMSUNG(uint64_t data, uint16_t nbits = SAMSUNG_BITS,
- uint16_t repeat = 0);
- uint32_t encodeSAMSUNG(uint8_t customer, uint8_t command);
-#endif
-#if SEND_LG
- void sendLG(uint64_t data, uint16_t nbits = LG_BITS, uint16_t repeat = 0);
- uint32_t encodeLG(uint16_t address, uint16_t command);
-#endif
-#if (SEND_SHARP || SEND_DENON)
- uint32_t encodeSharp(uint16_t address, uint16_t command,
- uint16_t expansion = 1, uint16_t check = 0,
- bool MSBfirst = false);
- void sendSharp(uint16_t address, uint16_t command,
- uint16_t nbits = SHARP_BITS, uint16_t repeat = 0);
- void sendSharpRaw(uint64_t data, uint16_t nbits = SHARP_BITS,
- uint16_t repeat = 0);
-#endif
-#if SEND_JVC
- void sendJVC(uint64_t data, uint16_t nbits = JVC_BITS, uint16_t repeat = 0);
- uint16_t encodeJVC(uint8_t address, uint8_t command);
-#endif
-#if SEND_DENON
- void sendDenon(uint64_t data, uint16_t nbits = DENON_BITS,
- uint16_t repeat = 0);
-#endif
-#if SEND_SANYO
- uint64_t encodeSanyoLC7461(uint16_t address, uint8_t command);
- void sendSanyoLC7461(uint64_t data, uint16_t nbits = SANYO_LC7461_BITS,
- uint16_t repeat = 0);
-#endif
-#if SEND_DISH
- // sendDISH() should typically be called with repeat=3 as DISH devices
- // expect the code to be sent at least 4 times. (code + 3 repeats = 4 codes)
- // Legacy use of this procedure was only to send a single code
- // so use repeat=0 for backward compatibility.
- void sendDISH(uint64_t data, uint16_t nbits = DISH_BITS,
- uint16_t repeat = DISH_MIN_REPEAT);
-#endif
-#if (SEND_PANASONIC || SEND_DENON)
- void sendPanasonic64(uint64_t data, uint16_t nbits = PANASONIC_BITS,
- uint16_t repeat = 0);
- void sendPanasonic(uint16_t address, uint32_t data,
- uint16_t nbits = PANASONIC_BITS, uint16_t repeat = 0);
- uint64_t encodePanasonic(uint16_t manufacturer, uint8_t device,
- uint8_t subdevice, uint8_t function);
-#endif
-#if SEND_RC5
- void sendRC5(uint64_t data, uint16_t nbits = RC5X_BITS, uint16_t repeat = 0);
- uint16_t encodeRC5(uint8_t address, uint8_t command,
- bool key_released = false);
- uint16_t encodeRC5X(uint8_t address, uint8_t command,
- bool key_released = false);
- uint64_t toggleRC5(uint64_t data);
-#endif
-#if SEND_RC6
- void sendRC6(uint64_t data, uint16_t nbits = RC6_MODE0_BITS,
- uint16_t repeat = 0);
- uint64_t encodeRC6(uint32_t address, uint8_t command,
- uint16_t mode = RC6_MODE0_BITS);
- uint64_t toggleRC6(uint64_t data, uint16_t nbits = RC6_MODE0_BITS);
-#endif
-#if SEND_RCMM
- void sendRCMM(uint64_t data, uint16_t nbits = RCMM_BITS, uint16_t repeat = 0);
-#endif
-#if SEND_COOLIX
- void sendCOOLIX(uint64_t data, uint16_t nbits = COOLIX_BITS,
- uint16_t repeat = 0);
-#endif
-#if SEND_WHYNTER
- void sendWhynter(uint64_t data, uint16_t nbits = WHYNTER_BITS,
- uint16_t repeat = 0);
-#endif
-#if SEND_MITSUBISHI
- void sendMitsubishi(uint64_t data, uint16_t nbits = MITSUBISHI_BITS,
- uint16_t repeat = MITSUBISHI_MIN_REPEAT);
-#endif
-#if SEND_MITSUBISHI_AC
- void sendMitsubishiAC(unsigned char data[],
- uint16_t nbytes = MITSUBISHI_AC_STATE_LENGTH,
- uint16_t repeat = MITSUBISHI_AC_MIN_REPEAT);
-#endif
-#if SEND_FUJITSU_AC
- void sendFujitsuAC(unsigned char data[],
- uint16_t nbytes,
- uint16_t repeat = FUJITSU_AC_MIN_REPEAT);
-#endif
-#if SEND_GLOBALCACHE
- void sendGC(uint16_t buf[], uint16_t len);
-#endif
-#if SEND_KELVINATOR
- void sendKelvinator(unsigned char data[],
- uint16_t nbytes = KELVINATOR_STATE_LENGTH,
- uint16_t repeat = 0);
-#endif
-#if SEND_DAIKIN
- void sendDaikin(unsigned char data[],
- uint16_t nbytes = DAIKIN_COMMAND_LENGTH,
- uint16_t repeat = 0);
-#endif
-#if SEND_AIWA_RC_T501
- void sendAiwaRCT501(uint64_t data, uint16_t nbits = AIWA_RC_T501_BITS,
- uint16_t repeat = AIWA_RC_T501_MIN_REPEAT);
-#endif
-#if SEND_GREE
- void sendGree(uint64_t data, uint16_t nbits = GREE_BITS, uint16_t repeat = 0);
- void sendGree(uint8_t data[], uint16_t nbytes = GREE_STATE_LENGTH,
- uint16_t repeat = 0);
-#endif
-#if SEND_PRONTO
- void sendPronto(uint16_t data[], uint16_t len, uint16_t repeat = 0);
-#endif
-#if SEND_ARGO
- void sendArgo(unsigned char data[],
- uint16_t nbytes = ARGO_COMMAND_LENGTH,
- uint16_t repeat = 0);
-#endif
-#if SEND_TROTEC
- void sendTrotec(unsigned char data[],
- uint16_t nbytes = TROTEC_COMMAND_LENGTH,
- uint16_t repeat = 0);
-#endif
-#if SEND_NIKAI
- void sendNikai(uint64_t data, uint16_t nbits = NIKAI_BITS,
- uint16_t repeat = 0);
-#endif
-
- protected:
-#ifdef UNIT_TEST
-#ifndef HIGH
-#define HIGH 0x1
-#endif
-#ifndef LOW
-#define LOW 0x0
-#endif
-#endif // UNIT_TEST
- uint8_t outputOn;
- uint8_t outputOff;
-
- private:
- uint16_t onTimePeriod;
- uint16_t offTimePeriod;
- uint16_t IRpin;
- int8_t periodOffset;
- void ledOff();
- uint32_t calcUSecPeriod(uint32_t hz, bool use_offset = true);
-};
-
-#endif // IRSEND_H_
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/IRutils.cpp b/lib/IRremoteESP8266-2.2.1.02/src/IRutils.cpp
deleted file mode 100644
index 22b4bb3b774f..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/IRutils.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2017 David Conran
-
-#include "IRutils.h"
-#ifndef UNIT_TEST
-#include
-#endif
-
-#define __STDC_LIMIT_MACROS
-#include
-#include
-#ifndef ARDUINO
-#include
-#endif
-#include "IRrecv.h"
-
-// Reverse the order of the requested least significant nr. of bits.
-// Args:
-// input: Bit pattern/integer to reverse.
-// nbits: Nr. of bits to reverse.
-// Returns:
-// The reversed bit pattern.
-uint64_t reverseBits(uint64_t input, uint16_t nbits) {
- if (nbits <= 1)
- return input; // Reversing <= 1 bits makes no change at all.
- // Cap the nr. of bits to rotate to the max nr. of bits in the input.
- nbits = std::min(nbits, (uint16_t) (sizeof(input) * 8));
- uint64_t output = 0;
- for (uint16_t i = 0; i < nbits; i++) {
- output <<= 1;
- output |= (input & 1);
- input >>= 1;
- }
- // Merge any remaining unreversed bits back to the top of the reversed bits.
- return (input << nbits) | output;
-}
-
-// Convert a uint64_t (unsigned long long) to a string.
-// Arduino String/toInt/Serial.print() can't handle printing 64 bit values.
-//
-// Args:
-// input: The value to print
-// base: The output base.
-// Returns:
-// A string representation of the integer.
-// Note: Based on Arduino's Print::printNumber()
-#ifdef ARDUINO // Arduino's & C++'s string implementations can't co-exist.
-String uint64ToString(uint64_t input, uint8_t base) {
- String result = "";
-#else
-std::string uint64ToString(uint64_t input, uint8_t base) {
- std::string result = "";
-#endif
- // prevent issues if called with base <= 1
- if (base < 2) base = 10;
- // Check we have a base that we can actually print.
- // i.e. [0-9A-Z] == 36
- if (base > 36) base = 10;
-
- do {
- char c = input % base;
- input /= base;
-
- if (c < 10)
- c +='0';
- else
- c += 'A' - 10;
- result = c + result;
- } while (input);
- return result;
-}
-
-#ifdef ARDUINO
-// Print a uint64_t/unsigned long long to the Serial port
-// Serial.print() can't handle printing long longs. (uint64_t)
-//
-// Args:
-// input: The value to print
-// base: The output base.
-void serialPrintUint64(uint64_t input, uint8_t base) {
- Serial.print(uint64ToString(input, base));
-}
-#endif
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/IRutils.h b/lib/IRremoteESP8266-2.2.1.02/src/IRutils.h
deleted file mode 100644
index eb3f1d8ee8da..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/IRutils.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef IRUTILS_H_
-#define IRUTILS_H_
-
-// Copyright 2017 David Conran
-
-#ifndef UNIT_TEST
-#include
-#endif
-#define __STDC_LIMIT_MACROS
-#include
-#ifndef ARDUINO
-#include
-#endif
-
-uint64_t reverseBits(uint64_t input, uint16_t nbits);
-#ifdef ARDUINO // Arduino's & C++'s string implementations can't co-exist.
-String uint64ToString(uint64_t input, uint8_t base = 10);
-#else
-std::string uint64ToString(uint64_t input, uint8_t base = 10);
-#endif
-void serialPrintUint64(uint64_t input, uint8_t base = 10);
-
-#endif // IRUTILS_H_
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Coolix.cpp b/lib/IRremoteESP8266-2.2.1.02/src/ir_Coolix.cpp
deleted file mode 100644
index f664d6ad760a..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Coolix.cpp
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright bakrus
-// Copyright 2017 David Conran
-
-#include "IRrecv.h"
-#include "IRsend.h"
-#include "IRtimer.h"
-#include "IRutils.h"
-
-// CCCCC OOOOO OOOOO LL IIIII XX XX
-// CC C OO OO OO OO LL III XX XX
-// CC OO OO OO OO LL III XXXX
-// CC C OO OO OO OO LL III XX XX
-// CCCCC OOOO0 OOOO0 LLLLLLL IIIII XX XX
-
-// Coolix A/C / heatpump added by (send) bakrus & (decode) crankyoldgit
-
-// Constants
-// Pulse parms are *50-100 for the Mark and *50+100 for the space
-// First MARK is the one after the long gap
-// pulse parameters in usec
-#define COOLIX_TICK 560U // Approximately 21 cycles at 38kHz
-#define COOLIX_BIT_MARK_TICKS 1U
-#define COOLIX_BIT_MARK (COOLIX_BIT_MARK_TICKS * COOLIX_TICK)
-#define COOLIX_ONE_SPACE_TICKS 3U
-#define COOLIX_ONE_SPACE (COOLIX_ONE_SPACE_TICKS * COOLIX_TICK)
-#define COOLIX_ZERO_SPACE_TICKS 1U
-#define COOLIX_ZERO_SPACE (COOLIX_ZERO_SPACE_TICKS * COOLIX_TICK)
-#define COOLIX_HDR_MARK_TICKS 8U
-#define COOLIX_HDR_MARK (COOLIX_HDR_MARK_TICKS * COOLIX_TICK)
-#define COOLIX_HDR_SPACE_TICKS 8U
-#define COOLIX_HDR_SPACE (COOLIX_HDR_SPACE_TICKS * COOLIX_TICK)
-#define COOLIX_MIN_GAP_TICKS (COOLIX_HDR_MARK_TICKS + \
- COOLIX_ZERO_SPACE_TICKS)
-#define COOLIX_MIN_GAP (COOLIX_MIN_GAP_TICKS * COOLIX_TICK)
-
-#if SEND_COOLIX
-// Send a Coolix message
-//
-// Args:
-// data: Contents of the message to be sent.
-// nbits: Nr. of bits of data to be sent. Typically COOLIX_BITS.
-// repeat: Nr. of additional times the message is to be sent.
-//
-// Status: BETA / Probably works.
-//
-// Ref:
-// https://github.com/z3t0/Arduino-IRremote/blob/master/ir_COOLIX.cpp
-// TODO(anyone): Verify repeat functionality against a real unit.
-void IRsend::sendCOOLIX(uint64_t data, uint16_t nbits, uint16_t repeat) {
- if (nbits % 8 != 0)
- return; // nbits is required to be a multiple of 8.
-
- // Set IR carrier frequency
- enableIROut(38);
-
- for (uint16_t r = 0; r <= repeat; r++) {
- // Header
- mark(COOLIX_HDR_MARK);
- space(COOLIX_HDR_SPACE);
-
- // Data
- // Break data into byte segments, starting at the Most Significant
- // Byte. Each byte then being sent normal, then followed inverted.
- for (uint16_t i = 8; i <= nbits; i += 8) {
- // Grab a bytes worth of data.
- uint8_t segment = (data >> (nbits - i)) & 0xFF;
- // Normal
- sendData(COOLIX_BIT_MARK, COOLIX_ONE_SPACE,
- COOLIX_BIT_MARK, COOLIX_ZERO_SPACE,
- segment, 8, true);
- // Inverted.
- sendData(COOLIX_BIT_MARK, COOLIX_ONE_SPACE,
- COOLIX_BIT_MARK, COOLIX_ZERO_SPACE,
- segment ^ 0xFF, 8, true);
- }
-
- // Footer
- mark(COOLIX_BIT_MARK);
- space(COOLIX_MIN_GAP); // Pause before repeating
- }
-}
-#endif
-
-#if DECODE_COOLIX
-// Decode the supplied Coolix message.
-//
-// Args:
-// results: Ptr to the data to decode and where to store the decode result.
-// nbits: The number of data bits to expect. Typically COOLIX_BITS.
-// strict: Flag indicating if we should perform strict matching.
-// Returns:
-// boolean: True if it can decode it, false if it can't.
-//
-// Status: BETA / Probably working.
-bool IRrecv::decodeCOOLIX(decode_results *results, uint16_t nbits,
- bool strict) {
- // The protocol sends the data normal + inverted, alternating on
- // each byte. Hence twice the number of expected data bits.
- if (results->rawlen < 2 * 2 * nbits + HEADER + FOOTER - 1)
- return false; // Can't possibly be a valid COOLIX message.
- if (strict && nbits != COOLIX_BITS)
- return false; // Not strictly an COOLIX message.
- if (nbits % 8 != 0) // nbits has to be a multiple of nr. of bits in a byte.
- return false;
-
- uint64_t data = 0;
- uint64_t inverted = 0;
- uint16_t offset = OFFSET_START;
-
- if (nbits > sizeof(data) * 8)
- return false; // We can't possibly capture a Coolix packet that big.
-
- // Header
- if (!matchMark(results->rawbuf[offset], COOLIX_HDR_MARK)) return false;
- // Calculate how long the common tick time is based on the header mark.
- uint32_t m_tick = results->rawbuf[offset++] * RAWTICK / COOLIX_HDR_MARK_TICKS;
- if (!matchSpace(results->rawbuf[offset], COOLIX_HDR_SPACE)) return false;
- // Calculate how long the common tick time is based on the header space.
- uint32_t s_tick = results->rawbuf[offset++] * RAWTICK /
- COOLIX_HDR_SPACE_TICKS;
-
- // Data
- // Twice as many bits as there are normal plus inverted bits.
- for (uint16_t i = 0; i < nbits * 2; i++, offset++) {
- bool flip = (i / 8) % 2;
- if (!matchMark(results->rawbuf[offset++], COOLIX_BIT_MARK_TICKS * m_tick))
- return false;
- if (matchSpace(results->rawbuf[offset], COOLIX_ONE_SPACE_TICKS * s_tick)) {
- if (flip)
- inverted = (inverted << 1) | 1;
- else
- data = (data << 1) | 1;
- } else if (matchSpace(results->rawbuf[offset],
- COOLIX_ZERO_SPACE_TICKS * s_tick)) {
- if (flip)
- inverted <<= 1;
- else
- data <<= 1;
- } else {
- return false;
- }
- }
-
- // Footer
- if (!matchMark(results->rawbuf[offset++], COOLIX_BIT_MARK_TICKS * m_tick))
- return false;
- if (offset < results->rawlen &&
- !matchAtLeast(results->rawbuf[offset], COOLIX_MIN_GAP_TICKS * s_tick))
- return false;
-
- // Compliance
- uint64_t orig = data; // Save a copy of the data.
- if (strict) {
- for (uint16_t i = 0; i < nbits; i += 8, data >>= 8, inverted >>= 8)
- if ((data & 0xFF) != ((inverted & 0xFF) ^ 0xFF))
- return false;
- }
-
- // Success
- results->decode_type = COOLIX;
- results->bits = nbits;
- results->value = orig;
- results->address = 0;
- results->command = 0;
- return true;
-}
-#endif
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Daikin.cpp b/lib/IRremoteESP8266-2.2.1.02/src/ir_Daikin.cpp
deleted file mode 100644
index f57b67608841..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Daikin.cpp
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
-An Arduino sketch to emulate IR Daikin ARC433** remote control unit
-Read more at:
-http://harizanov.com/2012/02/control-daikin-air-conditioner-over-the-internet/
-
-Copyright 2016 sillyfrog
-*/
-
-#include "ir_Daikin.h"
-#include
-#include "IRremoteESP8266.h"
-#include "IRutils.h"
-
-// DDDDD AAA IIIII KK KK IIIII NN NN
-// DD DD AAAAA III KK KK III NNN NN
-// DD DD AA AA III KKKK III NN N NN
-// DD DD AAAAAAA III KK KK III NN NNN
-// DDDDDD AA AA IIIII KK KK IIIII NN NN
-
-// Constants
-// Ref:
-// https://github.com/mharizanov/Daikin-AC-remote-control-over-the-Internet/tree/master/IRremote
-#define DAIKIN_HDR_MARK 3650U // DAIKIN_ZERO_MARK * 8
-#define DAIKIN_HDR_SPACE 1623U // DAIKIN_ZERO_MARK * 4
-#define DAIKIN_ONE_SPACE 1280U
-#define DAIKIN_ONE_MARK 428U
-#define DAIKIN_ZERO_MARK 428U
-#define DAIKIN_ZERO_SPACE 428U
-#define DAIKIN_GAP 29000U
-
-#if SEND_DAIKIN
-// Send a Daikin A/C message.
-//
-// Args:
-// data: An array of DAIKIN_COMMAND_LENGTH bytes containing the IR command.
-//
-// Status: STABLE
-//
-// Ref:
-// IRDaikinESP.cpp
-// https://github.com/mharizanov/Daikin-AC-remote-control-over-the-Internet/tree/master/IRremote
-void IRsend::sendDaikin(unsigned char data[], uint16_t nbytes,
- uint16_t repeat) {
- if (nbytes < DAIKIN_COMMAND_LENGTH)
- return; // Not enough bytes to send a proper message.
- // Set IR carrier frequency
- enableIROut(38);
- for (uint16_t r = 0; r <= repeat; r++) {
- // Header #1
- mark(DAIKIN_HDR_MARK);
- space(DAIKIN_HDR_SPACE);
- // Data #1
- for (uint16_t i = 0; i < 8 && i < nbytes; i++)
- sendData(DAIKIN_ONE_MARK, DAIKIN_ONE_SPACE, DAIKIN_ZERO_MARK,
- DAIKIN_ZERO_SPACE, data[i], 8, false);
- // Footer #1
- mark(DAIKIN_ONE_MARK);
- space(DAIKIN_ZERO_SPACE + DAIKIN_GAP);
-
- // Header #2
- mark(DAIKIN_HDR_MARK);
- space(DAIKIN_HDR_SPACE);
- // Data #2
- for (uint16_t i = 8; i < nbytes; i++)
- sendData(DAIKIN_ONE_MARK, DAIKIN_ONE_SPACE, DAIKIN_ZERO_MARK,
- DAIKIN_ZERO_SPACE, data[i], 8, false);
- // Footer #2
- mark(DAIKIN_ONE_MARK);
- space(DAIKIN_ZERO_SPACE + DAIKIN_GAP);
- }
-}
-
-IRDaikinESP::IRDaikinESP(uint16_t pin) : _irsend(pin) {
- stateReset();
-}
-
-void IRDaikinESP::begin() {
- _irsend.begin();
-}
-
-void IRDaikinESP::send() {
- _irsend.sendDaikin(daikin);
-}
-
-void IRDaikinESP::checksum() {
- uint8_t sum = 0;
- uint8_t i;
-
- for (i = 0; i <= 6; i++)
- sum += daikin[i];
-
- daikin[7] = sum & 0xFF;
- sum = 0;
- for (i = 8; i <= 25; i++)
- sum += daikin[i];
- daikin[26] = sum & 0xFF;
-}
-
-
-void IRDaikinESP::stateReset() {
- for (uint8_t i = 4; i < DAIKIN_COMMAND_LENGTH; i++)
- daikin[i] = 0x0;
-
- daikin[0] = 0x11;
- daikin[1] = 0xDA;
- daikin[2] = 0x27;
- daikin[3] = 0xF0;
- daikin[7] = 0x20;
- daikin[8] = 0x11;
- daikin[9] = 0xDA;
- daikin[10] = 0x27;
- daikin[13] = 0x41;
- daikin[14] = 0x1E;
- daikin[16] = 0xB0;
- daikin[23] = 0xC0;
- daikin[26] = 0xE3;
- checksum();
-}
-
-uint8_t* IRDaikinESP::getRaw() {
- checksum(); // Ensure correct settings before sending.
- return daikin;
-}
-
-void IRDaikinESP::on() {
- // state = ON;
- daikin[13] |= 0x01;
- checksum();
-}
-
-void IRDaikinESP::off() {
- // state = OFF;
- daikin[13] &= 0xFE;
- checksum();
-}
-
-void IRDaikinESP::setPower(bool state) {
- if (state)
- on();
- else
- off();
-}
-
-uint8_t IRDaikinESP::getPower() {
- return daikin[13] & 0x01;
-}
-
-// DAIKIN_SILENT or DAIKIN_POWERFUL
-void IRDaikinESP::setAux(uint8_t aux) {
- daikin[21] = aux;
- checksum();
-}
-
-uint8_t IRDaikinESP::getAux() {
- return daikin[21];
-}
-
-void IRDaikinESP::setQuiet(bool state) {
- if (state)
- setAux(DAIKIN_SILENT);
- else
- setAux(0x0);
-}
-
-bool IRDaikinESP::getQuiet() {
- return (getAux() == DAIKIN_SILENT);
-}
-
-void IRDaikinESP::setPowerful(bool state) {
- if (state)
- setAux(DAIKIN_POWERFUL);
- else
- setAux(0x0);
-}
-
-bool IRDaikinESP::getPowerful() {
- return (getAux() == DAIKIN_POWERFUL);
-}
-
-// Set the temp in deg C
-void IRDaikinESP::setTemp(uint8_t temp) {
- if (temp < DAIKIN_MIN_TEMP)
- temp = DAIKIN_MIN_TEMP;
- else if (temp > DAIKIN_MAX_TEMP)
- temp = DAIKIN_MAX_TEMP;
- daikin[14] = temp * 2;
- checksum();
-}
-
-uint8_t IRDaikinESP::getTemp() {
- return daikin[14] / 2;
-}
-
-// Set the speed of the fan, 0-5, 0 is auto, 1-5 is the speed
-void IRDaikinESP::setFan(uint8_t fan) {
- // Set the fan speed bits, leave low 4 bits alone
- uint8_t fanset;
- daikin[16] &= 0x0F;
- fan = std::min(fan, DAIKIN_FAN_MAX);
- if (fan == DAIKIN_FAN_AUTO)
- fanset = 0xA0;
- else
- fanset = 0x20 + (0x10 * fan);
- daikin[16] |= fanset;
- checksum();
-}
-
-uint8_t IRDaikinESP::getFan() {
- uint8_t fan = daikin[16] >> 4;
- fan -= 2;
- if (fan > DAIKIN_FAN_MAX)
- fan = DAIKIN_FAN_AUTO;
- return fan;
-}
-
-uint8_t IRDaikinESP::getMode() {
- /*
- DAIKIN_COOL
- DAIKIN_HEAT
- DAIKIN_FAN
- DAIKIN_AUTO
- DAIKIN_DRY
- */
- return daikin[13] >> 4;
-}
-
-void IRDaikinESP::setMode(uint8_t mode) {
- switch (mode) {
- case DAIKIN_COOL:
- case DAIKIN_HEAT:
- case DAIKIN_FAN:
- case DAIKIN_DRY:
- break;
- default:
- mode = DAIKIN_AUTO;
- }
- daikin[13] = (mode << 4) | getPower();
- checksum();
-}
-
-void IRDaikinESP::setSwingVertical(bool state) {
- if (state)
- daikin[16] |= 0x0F;
- else
- daikin[16] &= 0xF0;
- checksum();
-}
-
-bool IRDaikinESP::getSwingVertical() {
- return daikin[16] & 0x01;
-}
-
-void IRDaikinESP::setSwingHorizontal(bool state) {
- if (state)
- daikin[17] |= 0x0F;
- else
- daikin[17] &= 0xF0;
- checksum();
-}
-
-bool IRDaikinESP::getSwingHorizontal() {
- return daikin[17] & 0x01;
-}
-#endif // SEND_DAIKIN
-
-#if DECODE_DAIKIN
-// TODO(crankyoldgit): NOT WORKING. This needs to be finished.
-// Decode the supplied Daikin A/C message. (NOT WORKING - DO NOT USE)
-// Args:
-// results: Ptr to the data to decode and where to store the decode result.
-// nbits: Nr. of bits to expect in the data portion. Typically SAMSUNG_BITS.
-// strict: Flag to indicate if we strictly adhere to the specification.
-// Returns:
-// boolean: True if it can decode it, false if it can't.
-//
-// Status: UNFINISHED / Completely not working, not even vaguely.
-//
-// Ref:
-// https://github.com/mharizanov/Daikin-AC-remote-control-over-the-Internet/tree/master/IRremote
-bool IRrecv::decodeDaikin(decode_results *results, uint16_t nbits,
- bool strict) {
- if (results->rawlen < 2 * nbits + HEADER + FOOTER)
- return false;
-
- // Compliance
- if (strict && nbits != DAIKIN_BITS)
- return false;
-
- uint32_t data = 0;
- uint16_t offset = OFFSET_START;
-
- // Header
- if (!matchMark(results->rawbuf[offset++], DAIKIN_HDR_MARK))
- return false;
- if (!matchSpace(results->rawbuf[offset++], DAIKIN_HDR_SPACE))
- return false;
-
- // Data (#1)
- for (uint8_t i = 0; i < sizeof(data) * 8; i++, offset++) {
- if (!matchMark(results->rawbuf[offset++], DAIKIN_ONE_MARK))
- return false;
- if (matchSpace(results->rawbuf[offset], DAIKIN_ONE_SPACE))
- data = (data << 1) | 1; // 1
- else if (matchSpace(results->rawbuf[offset], DAIKIN_ZERO_SPACE))
- data <<= 1; // 0
- else
- return false;
- }
-
- uint32_t number = data; // some number...
- uint32_t reversed = reverseBits(number, sizeof(number) * 8)
-
- DPRINT("Code ");
- DPRINTLN(reversed, HEX);
-
- // Data (#2)
- for (uint8_t i = 0; i < sizeof(data) * 8; i++, offset++) {
- if (!matchMark(results->rawbuf[offset++], DAIKIN_ONE_MARK))
- return false;
- if (matchSpace(results->rawbuf[offset], DAIKIN_ONE_SPACE))
- data = (data << 1) | 1; // 1
- else if (matchSpace(results->rawbuf[offset], DAIKIN_ZERO_SPACE))
- data <<= 1; // 0
- else
- return false;
- }
-
- number = data; // some number...
- reversed = reverseBits(number, sizeof(number) * 8)
-
- DPRINT("Code2 ");
- DPRINTLN(reversed, HEX);
-
- if (!matchSpace(results->rawbuf[offset++], DAIKIN_GAP)) {
- DPRINTLN("no gap");
- return false;
- }
-
- // Success
- results->bits = DAIKIN_BITS;
- results->value = reversed;
- results->decode_type = DAIKIN;
- results->address = 0;
- results->command = 0;
- return true;
-}
-#endif // DECODE_DAIKIN
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Daikin.h b/lib/IRremoteESP8266-2.2.1.02/src/ir_Daikin.h
deleted file mode 100644
index 7172a5e271ae..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Daikin.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/* Copyright 2016 sillyfrog */
-#ifndef IR_DAIKIN_H_
-#define IR_DAIKIN_H_
-
-#include "IRremoteESP8266.h"
-#include "IRsend.h"
-
-// DDDDD AAA IIIII KK KK IIIII NN NN
-// DD DD AAAAA III KK KK III NNN NN
-// DD DD AA AA III KKKK III NN N NN
-// DD DD AAAAAAA III KK KK III NN NNN
-// DDDDDD AA AA IIIII KK KK IIIII NN NN
-
-/*
- Daikin AC map
- byte 7= checksum of the first part (and last byte before a 29ms pause)
- byte 13=mode
- b7 = 0
- b6+b5+b4 = Mode
- Modes: b6+b5+b4
- 011 = Cool
- 100 = Heat (temp 23)
- 110 = FAN (temp not shown, but 25)
- 000 = Fully Automatic (temp 25)
- 010 = DRY (temp 0xc0 = 96 degrees c)
- b3 = 0
- b2 = OFF timer set
- b1 = ON timer set
- b0 = Air Conditioner ON
- byte 14=temp*2 (Temp should be between 18 - 32)
- byte 16=Fan
- FAN control
- b7+b6+b5+b4 = Fan speed
- Fan: b7+b6+b5+b4
- 0×30 = 1 bar
- 0×40 = 2 bar
- 0×50 = 3 bar
- 0×60 = 4 bar
- 0×70 = 5 bar
- 0xa0 = Auto
- 0xb0 = Not auto, moon + tree
- b3+b2+b1+b0 = Swing control up/down
- Swing control up/down:
- 0000 = Swing up/down off
- 1111 = Swing up/down on
- byte 17
- Swing control left/right:
- 0000 = Swing left/right off
- 1111 = Swing left/right on
- byte 21=Aux -> Powerful (bit 1), Silent (bit 5)
- byte 24=Aux2 -> Intelligent eye on (bit 7)
- byte 26= checksum of the second part
-*/
-
-// Constants
-#define DAIKIN_COOL 0b011
-#define DAIKIN_HEAT 0b100
-#define DAIKIN_FAN 0b110
-#define DAIKIN_AUTO 0b000
-#define DAIKIN_DRY 0b010
-#define DAIKIN_POWERFUL 0b00000010
-#define DAIKIN_SILENT 0b00100000
-#define DAIKIN_MIN_TEMP 18U // Celsius
-#define DAIKIN_MAX_TEMP 32U // Celsius
-#define DAIKIN_FAN_AUTO (uint8_t) 0U
-#define DAIKIN_FAN_MIN (uint8_t) 1U
-#define DAIKIN_FAN_MAX (uint8_t) 5U
-
-#if SEND_DAIKIN
-class IRDaikinESP {
- public:
- explicit IRDaikinESP(uint16_t pin);
-
- void send();
- void begin();
- void on();
- void off();
- void setPower(bool state);
- uint8_t getPower();
- void setAux(uint8_t aux);
- uint8_t getAux();
- void setTemp(uint8_t temp);
- uint8_t getTemp();
- void setFan(uint8_t fan);
- uint8_t getFan();
- uint8_t getMode();
- void setMode(uint8_t mode);
- void setSwingVertical(bool state);
- bool getSwingVertical();
- void setSwingHorizontal(bool state);
- bool getSwingHorizontal();
- bool getQuiet();
- void setQuiet(bool state);
- bool getPowerful();
- void setPowerful(bool state);
- uint8_t* getRaw();
-
- private:
- // # of bytes per command
- uint8_t daikin[DAIKIN_COMMAND_LENGTH];
- void stateReset();
- void checksum();
- IRsend _irsend;
-};
-#endif
-
-#endif // IR_DAIKIN_H_
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Fujitsu.cpp b/lib/IRremoteESP8266-2.2.1.02/src/ir_Fujitsu.cpp
deleted file mode 100644
index adf753c0c768..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Fujitsu.cpp
+++ /dev/null
@@ -1,221 +0,0 @@
-// Copyright 2017 Jonny Graham
-#include "ir_Fujitsu.h"
-#include
-#include "IRsend.h"
-
-
-// Fujitsu A/C support added by Jonny Graham
-
-
-// Fujitsu A/C
-// Ref:
-// These values are based on averages of measurements
-#define FUJITSU_AC_HDR_MARK 3224U
-#define FUJITSU_AC_HDR_SPACE 1574U
-#define FUJITSU_AC_BIT_MARK 448U
-#define FUJITSU_AC_ONE_SPACE 1182U
-#define FUJITSU_AC_ZERO_SPACE 367U
-#define FUJITSU_AC_TRL_MARK 448U
-#define FUJITSU_AC_TRL_SPACE 8100U
-
-#if SEND_FUJITSU_AC
-// Send a Fujitsu A/C message.
-//
-// Args:
-// data: An array of bytes containing the IR command.
-// nbytes: Nr. of bytes of data in the array. (typically either
-// FUJITSU_AC_STATE_LENGTH or FUJITSU_AC_STATE_LENGTH_SHORT)
-// repeat: Nr. of times the message is to be repeated.
-// (Default = FUJITSU_AC_MIN_REPEAT).
-//
-// Status: BETA / Appears to be working.
-//
-void IRsend::sendFujitsuAC(unsigned char data[], uint16_t nbytes,
- uint16_t repeat) {
- // Set IR carrier frequency
- enableIROut(38);
- for (uint16_t r = 0; r <= repeat; ++r) {
- // Header
- mark(FUJITSU_AC_HDR_MARK);
- space(FUJITSU_AC_HDR_SPACE);
- // Data
- for (uint16_t i = 0; i < nbytes; i++)
- sendData(FUJITSU_AC_BIT_MARK, FUJITSU_AC_ONE_SPACE,
- FUJITSU_AC_BIT_MARK, FUJITSU_AC_ZERO_SPACE,
- data[i], 8, false);
- // Footer
- mark(FUJITSU_AC_TRL_MARK);
- space(FUJITSU_AC_TRL_SPACE);
- }
-}
-
-// Code to emulate Fujitsu A/C IR remote control unit.
-
-// Warning: Consider this very alpha code. Seems to work, but not validated.
-//
-// Equipment it seems compatible with:
-// * Fujitsu ASYG30LFCA with remote AR-RAH2E
-// *
-// Initialise the object.
-IRFujitsuAC::IRFujitsuAC(uint16_t pin) : _irsend(pin) {
- stateReset();
-}
-
-// Reset the state of the remote to a known good state/sequence.
-void IRFujitsuAC::stateReset() {
- _temp = 24;
- _fanSpeed = FUJITSU_AC_FAN_HIGH;
- _mode = FUJITSU_AC_MODE_COOL;
- _swingMode = FUJITSU_AC_SWING_BOTH;
- _cmd = FUJITSU_AC_CMD_TURN_ON;
-}
-
-// Configure the pin for output.
-void IRFujitsuAC::begin() {
- _irsend.begin();
-}
-
-// Send the current desired state to the IR LED.
-void IRFujitsuAC::send() {
- getRaw();
- uint8_t len = getCommandLength();
- _irsend.sendFujitsuAC(remote_state, len);
-}
-
-uint8_t IRFujitsuAC::getCommandLength() {
- if (remote_state[5] != 0xFE)
- return FUJITSU_AC_STATE_LENGTH_SHORT;
- else
- return FUJITSU_AC_STATE_LENGTH;
-}
-
-// Return a pointer to the internal state date of the remote.
-uint8_t* IRFujitsuAC::getRaw() {
- remote_state[0] = 0x14;
- remote_state[1] = 0x63;
- remote_state[2] = 0x00;
- remote_state[3] = 0x10;
- remote_state[4] = 0x10;
- bool fullCmd = false;
- switch (_cmd) {
- case FUJITSU_AC_CMD_TURN_OFF:
- remote_state[5] = 0x02;
- break;
- case FUJITSU_AC_CMD_STEP_HORIZ:
- remote_state[5] = 0x79;
- break;
- case FUJITSU_AC_CMD_STEP_VERT:
- remote_state[5] = 0x6C;
- break;
- default:
- remote_state[5] = 0xFE;
- fullCmd = true;
- break;
- }
- if (fullCmd) {
- remote_state[6] = 0x09;
- remote_state[7] = 0x30;
- uint8_t tempByte = _temp - FUJITSU_AC_MIN_TEMP;
- remote_state[8] = (_cmd == FUJITSU_AC_CMD_TURN_ON) | (tempByte << 4);
- remote_state[9] = _mode | 0 << 4; // timer off
- remote_state[10] = _fanSpeed | _swingMode << 4;
- remote_state[11] = 0; // timerOff values
- remote_state[12] = 0; // timerOff/on values
- remote_state[13] = 0; // timerOn values
- remote_state[14] = 0x20;
- // Checksum is the sum of the 8th to 16th bytes (ie remote_state[7]
- // thru remote_state[15]).
- // The checksum itself is stored in the 16th byte (ie remote_state[15]).
- // So we sum bytes 8th-15th...
- uint8_t checksum = 0;
- for (uint8_t i = 7 ; i < 15; ++i) {
- checksum += remote_state[i];
- }
- // and then do 0 - sum and store it in 16th.
- remote_state[15] = 0 - checksum;
- } else {
- // For the short codes, byte 7 is the inverse of byte 6
- remote_state[6] = ~remote_state[5];
- for (uint8_t i = 7; i < FUJITSU_AC_STATE_LENGTH; ++i) {
- remote_state[i] = 0;
- }
- }
- return remote_state;
-}
-
-// Set the requested power state of the A/C to off.
-void IRFujitsuAC::off() {
- _cmd = FUJITSU_AC_CMD_TURN_OFF;
-}
-
-void IRFujitsuAC::stepHoriz() {
- _cmd = FUJITSU_AC_CMD_STEP_HORIZ;
-}
-
-void IRFujitsuAC::stepVert() {
- _cmd = FUJITSU_AC_CMD_STEP_VERT;
-}
-
-// Set the requested command of the A/C.
-void IRFujitsuAC::setCmd(uint8_t cmd) {
- switch (cmd) {
- case FUJITSU_AC_CMD_TURN_OFF:
- case FUJITSU_AC_CMD_TURN_ON:
- case FUJITSU_AC_CMD_STAY_ON:
- case FUJITSU_AC_CMD_STEP_HORIZ:
- case FUJITSU_AC_CMD_STEP_VERT:
- break;
- default:
- cmd = FUJITSU_AC_CMD_STAY_ON;
- break;
- }
- _cmd = cmd;
-}
-
-uint8_t IRFujitsuAC::getCmd() {
- return _cmd;
-}
-
-// Set the temp. in deg C
-void IRFujitsuAC::setTemp(uint8_t temp) {
- temp = std::max((uint8_t) FUJITSU_AC_MIN_TEMP, temp);
- temp = std::min((uint8_t) FUJITSU_AC_MAX_TEMP, temp);
- _temp = temp;
-}
-
-uint8_t IRFujitsuAC::getTemp() {
- return _temp;
-}
-
-// Set the speed of the fan
-void IRFujitsuAC::setFanSpeed(uint8_t fanSpeed) {
- if (fanSpeed > FUJITSU_AC_FAN_QUIET)
- fanSpeed = FUJITSU_AC_FAN_HIGH; // Set the fan to maximum if out of range.
- _fanSpeed = fanSpeed;
-}
-uint8_t IRFujitsuAC::getFanSpeed() {
- return _fanSpeed;
-}
-
-// Set the requested climate operation mode of the a/c unit.
-void IRFujitsuAC::setMode(uint8_t mode) {
- if (mode > FUJITSU_AC_MODE_HEAT)
- mode = FUJITSU_AC_MODE_HEAT; // Set the mode to maximum if out of range.
- _mode = mode;
-}
-
-uint8_t IRFujitsuAC::getMode() {
- return _mode;
-}
-// Set the requested swing operation mode of the a/c unit.
-void IRFujitsuAC::setSwing(uint8_t swingMode) {
- if (swingMode > FUJITSU_AC_SWING_BOTH)
- swingMode = FUJITSU_AC_SWING_BOTH; // Set the mode to max if out of range
- _swingMode = swingMode;
-}
-
-uint8_t IRFujitsuAC::getSwing() {
- return _swingMode;
-}
-
-#endif
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Fujitsu.h b/lib/IRremoteESP8266-2.2.1.02/src/ir_Fujitsu.h
deleted file mode 100644
index 451a5b20367f..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Fujitsu.h
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2017 Jonny Graham
-#ifndef IR_FUJITSU_H_
-#define IR_FUJITSU_H_
-
-#define __STDC_LIMIT_MACROS
-#include
-#include "IRremoteESP8266.h"
-#include "IRsend.h"
-
-
-// FUJITSU A/C support added by Jonny Graham
-
-// Constants
-
-#define FUJITSU_AC_MODE_AUTO 0x00U
-#define FUJITSU_AC_MODE_COOL 0x01U
-#define FUJITSU_AC_MODE_DRY 0x02U
-#define FUJITSU_AC_MODE_FAN 0x03U
-#define FUJITSU_AC_MODE_HEAT 0x04U
-
-#define FUJITSU_AC_CMD_STAY_ON 0x00U
-#define FUJITSU_AC_CMD_TURN_ON 0x01U
-#define FUJITSU_AC_CMD_TURN_OFF 0x02U
-#define FUJITSU_AC_CMD_STEP_HORIZ 0x79U
-#define FUJITSU_AC_CMD_STEP_VERT 0x6CU
-
-#define FUJITSU_AC_FAN_AUTO 0x00U
-#define FUJITSU_AC_FAN_HIGH 0x01U
-#define FUJITSU_AC_FAN_MED 0x02U
-#define FUJITSU_AC_FAN_LOW 0x03U
-#define FUJITSU_AC_FAN_QUIET 0x04U
-
-#define FUJITSU_AC_MIN_TEMP 16U // 16C
-#define FUJITSU_AC_MAX_TEMP 30U // 30C
-
-#define FUJITSU_AC_SWING_OFF 0x00U
-#define FUJITSU_AC_SWING_VERT 0x01U
-#define FUJITSU_AC_SWING_HORIZ 0x02U
-#define FUJITSU_AC_SWING_BOTH 0x03U
-
-#define FUJITSU_AC_STATE_LENGTH 16
-#define FUJITSU_AC_STATE_LENGTH_SHORT 7
-
-#if SEND_FUJITSU_AC
-class IRFujitsuAC {
- public:
- explicit IRFujitsuAC(uint16_t pin);
-
- void stateReset();
- void send();
- void begin();
- void off();
- void stepHoriz();
- void stepVert();
- void setCmd(uint8_t cmd);
- uint8_t getCmd();
- void setTemp(uint8_t temp);
- uint8_t getTemp();
- void setFanSpeed(uint8_t fan);
- uint8_t getFanSpeed();
- void setMode(uint8_t mode);
- uint8_t getMode();
- void setSwing(uint8_t mode);
- uint8_t getSwing();
- uint8_t* getRaw();
-
- private:
- uint8_t remote_state[FUJITSU_AC_STATE_LENGTH];
- uint8_t getCommandLength();
- IRsend _irsend;
- uint8_t _temp;
- uint8_t _fanSpeed;
- uint8_t _mode;
- uint8_t _swingMode;
- uint8_t _cmd;
-};
-
-#endif
-
-#endif // IR_FUJITSU_H_
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Gree.cpp b/lib/IRremoteESP8266-2.2.1.02/src/ir_Gree.cpp
deleted file mode 100644
index d1bc760bf06a..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Gree.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2017 Ville Skyttä (scop)
-// Copyright 2017 David Conran
-//
-// Gree protocol compatible heat pump carrying the "Ultimate" brand name.
-//
-
-#include "IRremoteESP8266.h"
-#include "IRsend.h"
-
-// GGGG RRRRRR EEEEEEE EEEEEEE
-// GG GG RR RR EE EE
-// GG RRRRRR EEEEE EEEEE
-// GG GG RR RR EE EE
-// GGGGGG RR RR EEEEEEE EEEEEEE
-
-// Constants
-// Ref: https://github.com/ToniA/arduino-heatpumpir/blob/master/GreeHeatpumpIR.h
-#define GREE_HDR_MARK 9000U
-#define GREE_HDR_SPACE 4000U
-#define GREE_BIT_MARK 620U
-#define GREE_ONE_SPACE 1600U
-#define GREE_ZERO_SPACE 540U
-#define GREE_MSG_SPACE 19000U
-
-#if SEND_GREE
-// Send a Gree Heat Pump message.
-//
-// Args:
-// data: An array of bytes containing the IR command.
-// nbytes: Nr. of bytes of data in the array. (>=GREE_STATE_LENGTH)
-// repeat: Nr. of times the message is to be repeated. (Default = 0).
-//
-// Status: ALPHA / Untested.
-//
-// Ref:
-// https://github.com/ToniA/arduino-heatpumpir/blob/master/GreeHeatpumpIR.cpp
-void IRsend::sendGree(unsigned char data[], uint16_t nbytes, uint16_t repeat) {
- if (nbytes < GREE_STATE_LENGTH)
- return; // Not enough bytes to send a proper message.
-
- // Set IR carrier frequency
- enableIROut(38);
-
- for (uint16_t r = 0; r <= repeat; r++) {
- // Header #1
- mark(GREE_HDR_MARK);
- space(GREE_HDR_SPACE);
-
- // Data #1
- uint16_t i;
- for (i = 0; i < 4 && i < nbytes; i++)
- sendData(GREE_BIT_MARK, GREE_ONE_SPACE, GREE_BIT_MARK, GREE_ZERO_SPACE,
- data[i], 8, false);
-
- // Footer #1 (010)
- sendData(GREE_BIT_MARK, GREE_ONE_SPACE, GREE_BIT_MARK, GREE_ZERO_SPACE,
- 0b010, 3);
-
- // Header #2
- mark(GREE_BIT_MARK);
- space(GREE_MSG_SPACE);
-
- // Data #2
- for (; i < nbytes; i++)
- sendData(GREE_BIT_MARK, GREE_ONE_SPACE, GREE_BIT_MARK, GREE_ZERO_SPACE,
- data[i], 8, false);
-
- // Footer #2
- mark(GREE_BIT_MARK);
- space(GREE_MSG_SPACE);
- }
-}
-
-// Send a Gree Heat Pump message.
-//
-// Args:
-// data: The raw message to be sent.
-// nbits: Nr. of bits of data in the message. (Default is GREE_BITS)
-// repeat: Nr. of times the message is to be repeated. (Default = 0).
-//
-// Status: ALPHA / Untested.
-//
-// Ref:
-// https://github.com/ToniA/arduino-heatpumpir/blob/master/GreeHeatpumpIR.cpp
-void IRsend::sendGree(uint64_t data, uint16_t nbits, uint16_t repeat) {
- if (nbits != GREE_BITS)
- return; // Wrong nr. of bits to send a proper message.
- // Set IR carrier frequency
- enableIROut(38);
-
- for (uint16_t r = 0; r <= repeat; r++) {
- // Header
- mark(GREE_HDR_MARK);
- space(GREE_HDR_SPACE);
-
- // Data
- for (int16_t i = 8; i <= nbits; i += 8) {
- sendData(GREE_BIT_MARK, GREE_ONE_SPACE, GREE_BIT_MARK, GREE_ZERO_SPACE,
- (data >> (nbits - i)) & 0xFF, 8, false);
- if (i == nbits / 2) {
- // Send the mid-message Footer.
- sendData(GREE_BIT_MARK, GREE_ONE_SPACE, GREE_BIT_MARK, GREE_ZERO_SPACE,
- 0b010, 3);
- mark(GREE_BIT_MARK);
- space(GREE_MSG_SPACE);
- }
- }
- // Footer
- mark(GREE_BIT_MARK);
- space(GREE_MSG_SPACE);
- }
-}
-#endif // SEND_GREE
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Kelvinator.cpp b/lib/IRremoteESP8266-2.2.1.02/src/ir_Kelvinator.cpp
deleted file mode 100644
index 257a32e1a207..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Kelvinator.cpp
+++ /dev/null
@@ -1,329 +0,0 @@
-// Copyright 2016 David Conran
-//
-// Code to emulate IR Kelvinator YALIF remote control unit, which should control
-// at least the following Kelvinator A/C units:
-// KSV26CRC, KSV26HRC, KSV35CRC, KSV35HRC, KSV53HRC, KSV62HRC, KSV70CRC,
-// KSV70HRC, KSV80HRC.
-//
-// Note:
-// * Unsupported:
-// - All Sleep modes.
-// - All Timer modes.
-// - "I Feel" button & mode.
-// - Energy Saving mode.
-// - Low Heat mode.
-// - Fahrenheit.
-
-#include "ir_Kelvinator.h"
-#include
-
-// KK KK EEEEEEE LL VV VV IIIII NN NN AAA TTTTTTT OOOOO RRRRRR
-// KK KK EE LL VV VV III NNN NN AAAAA TTT OO OO RR RR
-// KKKK EEEEE LL VV VV III NN N NN AA AA TTT OO OO RRRRRR
-// KK KK EE LL VV VV III NN NNN AAAAAAA TTT OO OO RR RR
-// KK KK EEEEEEE LLLLLLL VVV IIIII NN NN AA AA TTT OOOO0 RR RR
-
-// Constants
-#define KELVINATOR_HDR_MARK 8990U
-#define KELVINATOR_HDR_SPACE 4490U
-#define KELVINATOR_BIT_MARK 675U
-#define KELVINATOR_ONE_SPACE 1560U
-#define KELVINATOR_ZERO_SPACE 520U
-#define KELVINATOR_GAP_SPACE 19950U
-#define KELVINATOR_CMD_FOOTER 2U
-
-#define KELVINATOR_POWER 8U
-#define KELVINATOR_MODE_MASK 0xF8U
-#define KELVINATOR_FAN_OFFSET 4U
-#define KELVINATOR_BASIC_FAN_MASK uint8_t(0xFFU ^ (3U << KELVINATOR_FAN_OFFSET))
-#define KELVINATOR_FAN_MASK uint8_t(0xFFU ^ (7U << KELVINATOR_FAN_OFFSET))
-#define KELVINATOR_CHECKSUM_START 10U
-#define KELVINATOR_VENT_SWING_OFFSET 6U
-#define KELVINATOR_VENT_SWING uint8_t(1U << KELVINATOR_VENT_SWING_OFFSET)
-#define KELVINATOR_VENT_SWING_V uint8_t(1U)
-#define KELVINATOR_VENT_SWING_H uint8_t(1U << 4)
-#define KELVINATOR_SLEEP_1_AND_3 uint8_t(1U << 7)
-#define KELVINATOR_QUIET_OFFSET 7U
-#define KELVINATOR_QUIET uint8_t(1U << KELVINATOR_QUIET_OFFSET)
-#define KELVINATOR_ION_FILTER_OFFSET 6U
-#define KELVINATOR_ION_FILTER uint8_t(1U << KELVINATOR_ION_FILTER_OFFSET)
-#define KELVINATOR_LIGHT_OFFSET 5U
-#define KELVINATOR_LIGHT uint8_t(1U << KELVINATOR_LIGHT_OFFSET)
-#define KELVINATOR_XFAN_OFFSET 7U
-#define KELVINATOR_XFAN uint8_t(1U << KELVINATOR_XFAN_OFFSET)
-#define KELVINATOR_TURBO_OFFSET 4U
-#define KELVINATOR_TURBO uint8_t(1U << KELVINATOR_TURBO_OFFSET)
-
-#if SEND_KELVINATOR
-// Send a Kelvinator A/C message.
-//
-// Args:
-// data: An array of bytes containing the IR command.
-// nbytes: Nr. of bytes of data in the array. (>=KELVINATOR_STATE_LENGTH)
-// repeat: Nr. of times the message is to be repeated. (Default = 0).
-//
-// Status: STABLE / Known working.
-//
-void IRsend::sendKelvinator(unsigned char data[], uint16_t nbytes,
- uint16_t repeat) {
- if (nbytes < KELVINATOR_STATE_LENGTH)
- return; // Not enough bytes to send a proper message.
-
- // Set IR carrier frequency
- enableIROut(38);
-
- for (uint16_t r = 0; r <= repeat; r++) {
- // Header #1
- mark(KELVINATOR_HDR_MARK);
- space(KELVINATOR_HDR_SPACE);
- // Data (command)
- // Send the first command data (4 bytes)
- uint8_t i;
- for (i = 0; i < 4; i++)
- sendData(KELVINATOR_BIT_MARK, KELVINATOR_ONE_SPACE, KELVINATOR_BIT_MARK,
- KELVINATOR_ZERO_SPACE, data[i], 8, false);
- // Send Footer for the command data (3 bits (0b010))
- sendData(KELVINATOR_BIT_MARK, KELVINATOR_ONE_SPACE, KELVINATOR_BIT_MARK,
- KELVINATOR_ZERO_SPACE, KELVINATOR_CMD_FOOTER, 3, false);
- // Send an interdata gap.
- mark(KELVINATOR_BIT_MARK);
- space(KELVINATOR_GAP_SPACE);
- // Data (options)
- // Send the 1st option chunk of data (4 bytes).
- for (; i < 8; i++)
- sendData(KELVINATOR_BIT_MARK, KELVINATOR_ONE_SPACE, KELVINATOR_BIT_MARK,
- KELVINATOR_ZERO_SPACE, data[i], 8, false);
- // Send a double data gap to signify we are starting a new command sequence.
- mark(KELVINATOR_BIT_MARK);
- space(KELVINATOR_GAP_SPACE * 2);
- // Header #2
- mark(KELVINATOR_HDR_MARK);
- space(KELVINATOR_HDR_SPACE);
- // Data (command)
- // Send the 2nd command data (4 bytes).
- // Basically an almost identical repeat of the earlier command data.
- for (; i < 12; i++)
- sendData(KELVINATOR_BIT_MARK, KELVINATOR_ONE_SPACE, KELVINATOR_BIT_MARK,
- KELVINATOR_ZERO_SPACE, data[i], 8, false);
- // Send Footer for the command data (3 bits (B010))
- sendData(KELVINATOR_BIT_MARK, KELVINATOR_ONE_SPACE, KELVINATOR_BIT_MARK,
- KELVINATOR_ZERO_SPACE, KELVINATOR_CMD_FOOTER, 3, false);
- // Send an interdata gap.
- mark(KELVINATOR_BIT_MARK);
- space(KELVINATOR_GAP_SPACE);
- // Data (options)
- // Send the 2nd option chunk of data (4 bytes).
- // Unlike the commands, definitely not a repeat of the earlier option data.
- for (; i < KELVINATOR_STATE_LENGTH; i++)
- sendData(KELVINATOR_BIT_MARK, KELVINATOR_ONE_SPACE, KELVINATOR_BIT_MARK,
- KELVINATOR_ZERO_SPACE, data[i], 8, false);
- // Footer
- mark(KELVINATOR_BIT_MARK);
- space(KELVINATOR_GAP_SPACE * 2);
- }
-}
-
-IRKelvinatorAC::IRKelvinatorAC(uint16_t pin) : _irsend(pin) {
- stateReset();
-}
-
-void IRKelvinatorAC::stateReset() {
- for (uint8_t i = 0; i < KELVINATOR_STATE_LENGTH; i++)
- remote_state[i] = 0x0;
- remote_state[3] = 0x50;
- remote_state[11] = 0x70;
-}
-
-void IRKelvinatorAC::begin() {
- _irsend.begin();
-}
-
-void IRKelvinatorAC::fixup() {
- // X-Fan mode is only valid in COOL or DRY modes.
- if (getMode() != KELVINATOR_COOL && getMode() != KELVINATOR_DRY)
- setXFan(false);
- checksum(); // Calculate the checksums
-}
-
-void IRKelvinatorAC::send() {
- fixup(); // Ensure correct settings before sending.
- _irsend.sendKelvinator(remote_state);
-}
-
-uint8_t* IRKelvinatorAC::getRaw() {
- fixup(); // Ensure correct settings before sending.
- return remote_state;
-}
-
-// Many Bothans died to bring us this information.
-void IRKelvinatorAC::checksum() {
- // For each command + options block.
- for (uint8_t offset = 0; offset < KELVINATOR_STATE_LENGTH; offset += 8) {
- uint8_t sum = KELVINATOR_CHECKSUM_START;
- // Sum the lower half of the first 4 bytes of this block.
- for (uint8_t i = 0; i < 4; i++)
- sum += (remote_state[i + offset] & 0xFU);
- // then sum the upper half of the next 3 bytes.
- for (uint8_t i = 4; i < 7; i++)
- sum += (remote_state[i + offset] >> 4);
- // Trim it down to fit into the 4 bits allowed. i.e. Mod 16.
- sum &= 0xFU;
- // Place it into the IR code in the top half of the 8th & 16th byte.
- remote_state[7 + offset] = (sum << 4) | (remote_state[7 + offset] & 0xFU);
- }
-}
-
-void IRKelvinatorAC::on() {
- remote_state[0] |= KELVINATOR_POWER;
- remote_state[8] = remote_state[0]; // Duplicate to the 2nd command chunk.
-}
-
-void IRKelvinatorAC::off() {
- remote_state[0] &= ~KELVINATOR_POWER;
- remote_state[8] = remote_state[0]; // Duplicate to the 2nd command chunk.
-}
-
-void IRKelvinatorAC::setPower(bool state) {
- if (state)
- on();
- else
- off();
-}
-
-bool IRKelvinatorAC::getPower() {
- return ((remote_state[0] & KELVINATOR_POWER) != 0);
-}
-
-// Set the temp. in deg C
-void IRKelvinatorAC::setTemp(uint8_t temp) {
- temp = std::max((uint8_t) KELVINATOR_MIN_TEMP, temp);
- temp = std::min((uint8_t) KELVINATOR_MAX_TEMP, temp);
- remote_state[1] = (remote_state[1] & 0xF0U) | (temp - KELVINATOR_MIN_TEMP);
- remote_state[9] = remote_state[1]; // Duplicate to the 2nd command chunk.
-}
-
-// Return the set temp. in deg C
-uint8_t IRKelvinatorAC::getTemp() {
- return ((remote_state[1] & 0xFU) + KELVINATOR_MIN_TEMP);
-}
-
-// Set the speed of the fan, 0-5, 0 is auto, 1-5 is the speed
-void IRKelvinatorAC::setFan(uint8_t fan) {
- fan = std::min((uint8_t) KELVINATOR_FAN_MAX, fan); // Bounds check
-
- // Only change things if we need to.
- if (fan != getFan()) {
- // Set the basic fan values.
- uint8_t fan_basic = std::min((uint8_t) KELVINATOR_BASIC_FAN_MAX, fan);
- remote_state[0] = (remote_state[0] & KELVINATOR_BASIC_FAN_MASK) |
- (fan_basic << KELVINATOR_FAN_OFFSET);
- remote_state[8] = remote_state[0]; // Duplicate to the 2nd command chunk.
- // Set the advanced(?) fan value.
- remote_state[14] = (remote_state[14] & KELVINATOR_FAN_MASK) |
- (fan << KELVINATOR_FAN_OFFSET);
- setTurbo(false); // Turbo mode is turned off if we change the fan settings.
- }
-}
-
-uint8_t IRKelvinatorAC::getFan() {
- return ((remote_state[14] & ~KELVINATOR_FAN_MASK) >> KELVINATOR_FAN_OFFSET);
-}
-
-uint8_t IRKelvinatorAC::getMode() {
- return (remote_state[0] & ~KELVINATOR_MODE_MASK);
-}
-
-void IRKelvinatorAC::setMode(uint8_t mode) {
- // If we get an unexpected mode, default to AUTO.
- if (mode > KELVINATOR_HEAT) mode = KELVINATOR_AUTO;
- remote_state[0] = (remote_state[0] & KELVINATOR_MODE_MASK) | mode;
- remote_state[8] = remote_state[0]; // Duplicate to the 2nd command chunk.
- if (mode == KELVINATOR_AUTO || KELVINATOR_DRY)
- // When the remote is set to Auto or Dry, it defaults to 25C and doesn't
- // show it.
- setTemp(KELVINATOR_AUTO_TEMP);
-}
-
-void IRKelvinatorAC::setSwingVertical(bool state) {
- if (state) {
- remote_state[0] |= KELVINATOR_VENT_SWING;
- remote_state[4] |= KELVINATOR_VENT_SWING_V;
- } else {
- remote_state[4] &= ~KELVINATOR_VENT_SWING_V;
- if (!getSwingHorizontal())
- remote_state[0] &= ~KELVINATOR_VENT_SWING;
- }
- remote_state[8] = remote_state[0]; // Duplicate to the 2nd command chunk.
-}
-
-bool IRKelvinatorAC::getSwingVertical() {
- return ((remote_state[4] & KELVINATOR_VENT_SWING_V) != 0);
-}
-
-void IRKelvinatorAC::setSwingHorizontal(bool state) {
- if (state) {
- remote_state[0] |= KELVINATOR_VENT_SWING;
- remote_state[4] |= KELVINATOR_VENT_SWING_H;
- } else {
- remote_state[4] &= ~KELVINATOR_VENT_SWING_H;
- if (!getSwingVertical())
- remote_state[0] &= ~KELVINATOR_VENT_SWING;
- }
- remote_state[8] = remote_state[0]; // Duplicate to the 2nd command chunk.
-}
-
-bool IRKelvinatorAC::getSwingHorizontal() {
- return ((remote_state[4] & KELVINATOR_VENT_SWING_H) != 0);
-}
-
-void IRKelvinatorAC::setQuiet(bool state) {
- remote_state[12] &= ~KELVINATOR_QUIET;
- remote_state[12] |= (state << KELVINATOR_QUIET_OFFSET);
-}
-
-bool IRKelvinatorAC::getQuiet() {
- return ((remote_state[12] & KELVINATOR_QUIET) != 0);
-}
-
-void IRKelvinatorAC::setIonFilter(bool state) {
- remote_state[2] &= ~KELVINATOR_ION_FILTER;
- remote_state[2] |= (state << KELVINATOR_ION_FILTER_OFFSET);
- remote_state[10] = remote_state[2]; // Duplicate to the 2nd command chunk.
-}
-
-bool IRKelvinatorAC::getIonFilter() {
- return ((remote_state[2] & KELVINATOR_ION_FILTER) != 0);
-}
-
-void IRKelvinatorAC::setLight(bool state) {
- remote_state[2] &= ~KELVINATOR_LIGHT;
- remote_state[2] |= (state << KELVINATOR_LIGHT_OFFSET);
- remote_state[10] = remote_state[2]; // Duplicate to the 2nd command chunk.
-}
-
-bool IRKelvinatorAC::getLight() {
- return ((remote_state[2] & KELVINATOR_LIGHT) != 0);
-}
-
-// Note: XFan mode is only valid in Cool or Dry mode.
-void IRKelvinatorAC::setXFan(bool state) {
- remote_state[2] &= ~KELVINATOR_XFAN;
- remote_state[2] |= (state << KELVINATOR_XFAN_OFFSET);
- remote_state[10] = remote_state[2]; // Duplicate to the 2nd command chunk.
-}
-
-bool IRKelvinatorAC::getXFan() {
- return ((remote_state[2] & KELVINATOR_XFAN) != 0);
-}
-
-// Note: Turbo mode is turned off if the fan speed is changed.
-void IRKelvinatorAC::setTurbo(bool state) {
- remote_state[2] &= ~KELVINATOR_TURBO;
- remote_state[2] |= (state << KELVINATOR_TURBO_OFFSET);
- remote_state[10] = remote_state[2]; // Duplicate to the 2nd command chunk.
-}
-
-bool IRKelvinatorAC::getTurbo() {
- return ((remote_state[2] & KELVINATOR_TURBO) != 0);
-}
-#endif
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_LG.cpp b/lib/IRremoteESP8266-2.2.1.02/src/ir_LG.cpp
deleted file mode 100644
index 716ddd2051d0..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_LG.cpp
+++ /dev/null
@@ -1,233 +0,0 @@
-// Copyright 2015 Darryl Smith
-// Copyright 2015 cheaplin
-// Copyright 2017 David Conran
-
-#include "ir_LG.h"
-#include
-#include "IRrecv.h"
-#include "IRsend.h"
-#include "IRtimer.h"
-#include "IRutils.h"
-
-// L GGGG
-// L G
-// L G GG
-// L G G
-// LLLLL GGG
-
-// LG decode originally added by Darryl Smith (based on the JVC protocol)
-// LG send originally added by https://github.com/chaeplin
-
-// Constants
-#define LG_TICK 50U
-#define LG_HDR_MARK_TICKS 160U
-#define LG_HDR_MARK (LG_HDR_MARK_TICKS * LG_TICK)
-#define LG_HDR_SPACE_TICKS 80U
-#define LG_HDR_SPACE (LG_HDR_SPACE_TICKS * LG_TICK)
-#define LG_BIT_MARK_TICKS 11U
-#define LG_BIT_MARK (LG_BIT_MARK_TICKS * LG_TICK)
-#define LG_ONE_SPACE_TICKS 32U
-#define LG_ONE_SPACE (LG_ONE_SPACE_TICKS * LG_TICK)
-#define LG_ZERO_SPACE_TICKS 11U
-#define LG_ZERO_SPACE (LG_ZERO_SPACE_TICKS * LG_TICK)
-#define LG_RPT_SPACE_TICKS 45U
-#define LG_RPT_SPACE (LG_RPT_SPACE_TICKS * LG_TICK)
-#define LG_MIN_GAP_TICKS 795U
-#define LG_MIN_GAP (LG_MIN_GAP_TICKS * LG_TICK)
-#define LG_MIN_MESSAGE_LENGTH_TICKS 2161U
-#define LG_MIN_MESSAGE_LENGTH (LG_MIN_MESSAGE_LENGTH_TICKS * LG_TICK)
-#define LG32_HDR_MARK_TICKS 90U
-#define LG32_HDR_MARK (LG32_HDR_MARK_TICKS * LG_TICK)
-#define LG32_HDR_SPACE_TICKS 89U
-#define LG32_HDR_SPACE (LG32_HDR_SPACE_TICKS * LG_TICK)
-#define LG32_RPT_HDR_MARK_TICKS 179U
-#define LG32_RPT_HDR_MARK (LG32_RPT_HDR_MARK_TICKS * LG_TICK)
-
-#if (SEND_LG || DECODE_LG)
-// Calculate the rolling 4-bit wide checksum over all of the data.
-// Args:
-// data: The value to be checksum'ed.
-// Returns:
-// A 4-bit checksum.
-uint8_t calcLGChecksum(uint16_t data) {
- return(((data >> 12) + ((data >> 8) & 0xF) + ((data >> 4) & 0xF) +
- (data & 0xF)) & 0xF);
-}
-#endif
-
-#if SEND_LG
-// Send an LG formatted message.
-//
-// Args:
-// data: The contents of the message you want to send.
-// nbits: The bit size of the message being sent.
-// Typically LG_BITS or LG32_BITS.
-// repeat: The number of times you want the message to be repeated.
-//
-// Status: Beta / Should be working.
-//
-// Notes:
-// LG has a separate message to indicate a repeat, like NEC does.
-void IRsend::sendLG(uint64_t data, uint16_t nbits, uint16_t repeat) {
- // Set IR carrier frequency
- enableIROut(38);
-
- uint16_t repeatHeaderMark = 0;
- IRtimer usecTimer = IRtimer();
-
- if (nbits >= LG32_BITS) {
- // LG 32bit protocol is near identical to Samsung except for repeats.
- sendSAMSUNG(data, nbits, 0); // Send it as a single Samsung message.
- repeatHeaderMark = LG32_RPT_HDR_MARK;
- repeat++;
- } else {
- // LG (28-bit) protocol.
- repeatHeaderMark = LG_HDR_MARK;
- // Header
- usecTimer.reset();
- mark(LG_HDR_MARK);
- space(LG_HDR_SPACE);
- // Data
- sendData(LG_BIT_MARK, LG_ONE_SPACE, LG_BIT_MARK, LG_ZERO_SPACE,
- data, nbits, true);
- // Footer
- mark(LG_BIT_MARK);
- space(std::max((uint32_t) (LG_MIN_MESSAGE_LENGTH - usecTimer.elapsed()),
- (uint32_t) LG_MIN_GAP));
- }
-
- // Repeat
- // Protocol has a mandatory repeat-specific code sent after every command.
- for (uint16_t i = 0; i < repeat; i++) {
- usecTimer.reset();
- mark(repeatHeaderMark);
- space(LG_RPT_SPACE);
- mark(LG_BIT_MARK);
- space(std::max((uint32_t) LG_MIN_MESSAGE_LENGTH - usecTimer.elapsed(),
- (uint32_t) LG_MIN_GAP));
- }
-}
-
-// Construct a raw 28-bit LG message from the supplied address & command.
-//
-// Args:
-// address: The address code.
-// command: The command code.
-// Returns:
-// A raw 28-bit LG message suitable for sendLG().
-//
-// Status: BETA / Should work.
-//
-// Notes:
-// e.g. Sequence of bits = address + command + checksum.
-uint32_t IRsend::encodeLG(uint16_t address, uint16_t command) {
- return ((address << 20) | (command << 4) | calcLGChecksum(command));
-}
-#endif
-
-#if DECODE_LG
-// Decode the supplied LG message.
-// LG protocol has a repeat code which is 4 items long.
-// Even though the protocol has 28/32 bits of data, only 24/28 bits are
-// distinct.
-// In transmission order, the 28/32 bits are constructed as follows:
-// 8/12 bits of address + 16 bits of command + 4 bits of checksum.
-//
-// Args:
-// results: Ptr to the data to decode and where to store the decode result.
-// nbits: Nr. of bits to expect in the data portion.
-// Typically LG_BITS or LG32_BITS.
-// strict: Flag to indicate if we strictly adhere to the specification.
-// Returns:
-// boolean: True if it can decode it, false if it can't.
-//
-// Status: BETA / Should work.
-//
-// Note:
-// LG 32bit protocol appears near identical to the Samsung protocol.
-// They possibly differ on how they repeat and initial HDR mark.
-
-// Ref:
-// https://funembedded.wordpress.com/2014/11/08/ir-remote-control-for-lg-conditioner-using-stm32f302-mcu-on-mbed-platform/
-bool IRrecv::decodeLG(decode_results *results, uint16_t nbits, bool strict) {
- if (results->rawlen < 2 * nbits + HEADER + FOOTER - 1 && results->rawlen != 4)
- return false; // Can't possibly be a valid LG message.
- if (strict && nbits != LG_BITS && nbits != LG32_BITS)
- return false; // Doesn't comply with expected LG protocol.
-
- uint64_t data = 0;
- uint16_t offset = OFFSET_START;
-
- // Header
- if (!matchMark(results->rawbuf[offset], LG_HDR_MARK) &&
- !matchMark(results->rawbuf[offset], LG32_HDR_MARK)) return false;
- uint32_t m_tick;
- if (matchMark(results->rawbuf[offset], LG_HDR_MARK))
- m_tick = results->rawbuf[offset++] * RAWTICK / LG_HDR_MARK_TICKS;
- else
- m_tick = results->rawbuf[offset++] * RAWTICK / LG32_HDR_MARK_TICKS;
- if (!matchSpace(results->rawbuf[offset], LG_HDR_SPACE) &&
- !matchSpace(results->rawbuf[offset], LG32_HDR_SPACE)) return false;
- uint32_t s_tick;
- if (matchSpace(results->rawbuf[offset], LG_HDR_SPACE))
- s_tick = results->rawbuf[offset++] * RAWTICK / LG_HDR_SPACE_TICKS;
- else
- s_tick = results->rawbuf[offset++] * RAWTICK / LG32_HDR_SPACE_TICKS;
-
- // Data
- match_result_t data_result = matchData(&(results->rawbuf[offset]), nbits,
- LG_BIT_MARK_TICKS * m_tick,
- LG_ONE_SPACE_TICKS * s_tick,
- LG_BIT_MARK_TICKS * m_tick,
- LG_ZERO_SPACE_TICKS * s_tick);
- if (data_result.success == false) return false;
- data = data_result.data;
- offset += data_result.used;
-
- // Footer
- if (!matchMark(results->rawbuf[offset++], LG_BIT_MARK_TICKS * m_tick))
- return false;
- if (offset < results->rawlen &&
- !matchAtLeast(results->rawbuf[offset], LG_MIN_GAP_TICKS * s_tick))
- return false;
-
- // Repeat
- if (nbits >= LG32_BITS) {
- // If we are expecting the LG 32-bit protocol, there is always
- // a repeat message. So, check for it.
-#ifndef UNIT_TEST
- if (!matchSpace(results->rawbuf[offset], LG_MIN_GAP_TICKS * s_tick))
-#else
- if (!(matchSpace(results->rawbuf[offset],
- LG_MIN_MESSAGE_LENGTH_TICKS * s_tick) ||
- matchSpace(results->rawbuf[offset], 65500) ||
- matchSpace(results->rawbuf[offset], LG_MIN_GAP_TICKS * s_tick)))
-#endif // UNIT_TEST
- return false;
- offset++;
- if (!matchMark(results->rawbuf[offset++], LG32_RPT_HDR_MARK_TICKS * m_tick))
- return false;
- if (!matchSpace(results->rawbuf[offset++], LG_RPT_SPACE_TICKS * s_tick))
- return false;
- if (!matchMark(results->rawbuf[offset++], LG_BIT_MARK_TICKS * m_tick))
- return false;
- if (offset < results->rawlen &&
- !matchAtLeast(results->rawbuf[offset], LG_MIN_GAP_TICKS * s_tick))
- return false;
- }
-
- // Compliance
- uint16_t command = (data >> 4) & 0xFFFF; // The 16 bits before the checksum.
-
- if (strict && (data & 0xF) != calcLGChecksum(command))
- return false; // The last 4 bits sent are the expected checksum.
-
- // Success
- results->decode_type = LG;
- results->bits = nbits;
- results->value = data;
- results->command = command;
- results->address = data >> 20; // The bits before the command.
- return true;
-}
-#endif
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Mitsubishi.cpp b/lib/IRremoteESP8266-2.2.1.02/src/ir_Mitsubishi.cpp
deleted file mode 100644
index df8b6e1ef59e..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Mitsubishi.cpp
+++ /dev/null
@@ -1,349 +0,0 @@
-// Copyright 2009 Ken Shirriff
-// Copyright 2017 David Conran
-
-#include "ir_Mitsubishi.h"
-#include
-#include "IRrecv.h"
-#include "IRsend.h"
-#include "IRtimer.h"
-#include "IRutils.h"
-
-// MMMMM IIIII TTTTT SSSS U U BBBB IIIII SSSS H H IIIII
-// M M M I T S U U B B I S H H I
-// M M M I T SSS U U BBBB I SSS HHHHH I
-// M M I T S U U B B I S H H I
-// M M IIIII T SSSS UUU BBBBB IIIII SSSS H H IIIII
-
-// Mitsubishi (TV) decoding added from https://github.com/z3t0/Arduino-IRremote
-// Mitsubishi (TV) sending & Mitsubishi A/C support added by David Conran
-
-// Constants
-// Mitsubishi TV
-// period time is 1/33000Hz = 30.303 uSeconds (T)
-// Ref:
-// GlobalCache's Control Tower's Mitsubishi TV data.
-// https://github.com/marcosamarinho/IRremoteESP8266/blob/master/ir_Mitsubishi.cpp
-#define MITSUBISHI_TICK 30U
-#define MITSUBISHI_BIT_MARK_TICKS 10U
-#define MITSUBISHI_BIT_MARK (MITSUBISHI_BIT_MARK_TICKS * \
- MITSUBISHI_TICK)
-#define MITSUBISHI_ONE_SPACE_TICKS 70U
-#define MITSUBISHI_ONE_SPACE (MITSUBISHI_ONE_SPACE_TICKS * \
- MITSUBISHI_TICK)
-#define MITSUBISHI_ZERO_SPACE_TICKS 30U
-#define MITSUBISHI_ZERO_SPACE (MITSUBISHI_ZERO_SPACE_TICKS * \
- MITSUBISHI_TICK)
-#define MITSUBISHI_MIN_COMMAND_LENGTH_TICKS 1786U
-#define MITSUBISHI_MIN_COMMAND_LENGTH (MITSUBISHI_MIN_COMMAND_LENGTH_TICKS * \
- MITSUBISHI_TICK)
-#define MITSUBISHI_MIN_GAP_TICKS 936U
-#define MITSUBISHI_MIN_GAP (MITSUBISHI_MIN_GAP_TICKS * \
- MITSUBISHI_TICK)
-
-// Mitsubishi A/C
-// Ref:
-// https://github.com/r45635/HVAC-IR-Control/blob/master/HVAC_ESP8266/HVAC_ESP8266.ino#L84
-#define MITSUBISHI_AC_HDR_MARK 3400U
-#define MITSUBISHI_AC_HDR_SPACE 1750U
-#define MITSUBISHI_AC_BIT_MARK 450U
-#define MITSUBISHI_AC_ONE_SPACE 1300U
-#define MITSUBISHI_AC_ZERO_SPACE 420U
-#define MITSUBISHI_AC_RPT_MARK 440U
-#define MITSUBISHI_AC_RPT_SPACE 17100UL
-
-#if SEND_MITSUBISHI
-// Send a Mitsubishi message
-//
-// Args:
-// data: Contents of the message to be sent.
-// nbits: Nr. of bits of data to be sent. Typically MITSUBISHI_BITS.
-// repeat: Nr. of additional times the message is to be sent.
-//
-// Status: ALPHA / untested.
-//
-// Notes:
-// This protocol appears to have no header.
-// Ref:
-// https://github.com/marcosamarinho/IRremoteESP8266/blob/master/ir_Mitsubishi.cpp
-// GlobalCache's Control Tower's Mitsubishi TV data.
-void IRsend::sendMitsubishi(uint64_t data, uint16_t nbits, uint16_t repeat) {
- enableIROut(33); // Set IR carrier frequency
- IRtimer usecTimer = IRtimer();
-
- for (uint16_t i = 0; i <= repeat; i++) {
- usecTimer.reset();
- // No header
-
- // Data
- sendData(MITSUBISHI_BIT_MARK, MITSUBISHI_ONE_SPACE,
- MITSUBISHI_BIT_MARK, MITSUBISHI_ZERO_SPACE,
- data, nbits, true);
- // Footer
- mark(MITSUBISHI_BIT_MARK);
- space(std::max(MITSUBISHI_MIN_COMMAND_LENGTH - usecTimer.elapsed(),
- MITSUBISHI_MIN_GAP));
- }
-}
-#endif
-
-#if DECODE_MITSUBISHI
-// Decode the supplied Mitsubishi message.
-//
-// Args:
-// results: Ptr to the data to decode and where to store the decode result.
-// nbits: Nr. of data bits to expect.
-// strict: Flag indicating if we should perform strict matching.
-// Returns:
-// boolean: True if it can decode it, false if it can't.
-//
-// Status: BETA / previously working.
-//
-// Notes:
-// This protocol appears to have no header.
-//
-// Ref:
-// GlobalCache's Control Tower's Mitsubishi TV data.
-bool IRrecv::decodeMitsubishi(decode_results *results, uint16_t nbits,
- bool strict) {
- if (results->rawlen < 2 * nbits + FOOTER - 1)
- return false; // Shorter than shortest possibly expected.
- if (strict && nbits != MITSUBISHI_BITS)
- return false; // Request is out of spec.
-
- uint16_t offset = OFFSET_START;
- uint64_t data = 0;
-
- // No Header
- // But try to auto-calibrate off the initial mark signal.
- if (!matchMark(results->rawbuf[offset], MITSUBISHI_BIT_MARK, 30))
- return false;
- // Calculate how long the common tick time is based on the initial mark.
- uint32_t tick = results->rawbuf[offset] * RAWTICK / MITSUBISHI_BIT_MARK_TICKS;
-
- // Data
- match_result_t data_result = matchData(&(results->rawbuf[offset]), nbits,
- MITSUBISHI_BIT_MARK_TICKS * tick,
- MITSUBISHI_ONE_SPACE_TICKS * tick,
- MITSUBISHI_BIT_MARK_TICKS * tick,
- MITSUBISHI_ZERO_SPACE_TICKS * tick);
- if (data_result.success == false) return false;
- data = data_result.data;
- offset += data_result.used;
- uint16_t actualBits = data_result.used / 2;
-
- // Footer
- if (!matchMark(results->rawbuf[offset++], MITSUBISHI_BIT_MARK_TICKS * tick,
- 30)) return false;
- if (offset < results->rawlen &&
- !matchAtLeast(results->rawbuf[offset], MITSUBISHI_MIN_GAP_TICKS * tick))
- return false;
-
- // Compliance
- if (actualBits < nbits)
- return false;
- if (strict && actualBits != nbits)
- return false; // Not as we expected.
-
- // Success
- results->decode_type = MITSUBISHI;
- results->bits = actualBits;
- results->value = data;
- results->address = 0;
- results->command = 0;
- return true;
-}
-#endif
-
-#if SEND_MITSUBISHI_AC
-// Send a Mitsubishi A/C message.
-//
-// Args:
-// data: An array of bytes containing the IR command.
-// nbytes: Nr. of bytes of data in the array. (>=MITSUBISHI_AC_STATE_LENGTH)
-// repeat: Nr. of times the message is to be repeated.
-// (Default = MITSUBISHI_AC_MIN_REPEAT).
-//
-// Status: BETA / Appears to be working.
-//
-void IRsend::sendMitsubishiAC(unsigned char data[], uint16_t nbytes,
- uint16_t repeat) {
- if (nbytes < MITSUBISHI_AC_STATE_LENGTH)
- return; // Not enough bytes to send a proper message.
-
- // Set IR carrier frequency
- enableIROut(38);
- // Mitsubishi AC remote sends the packet twice.
- for (uint16_t r = 0; r <= repeat; r++) {
- // Header
- mark(MITSUBISHI_AC_HDR_MARK);
- space(MITSUBISHI_AC_HDR_SPACE);
- // Data
- for (uint16_t i = 0; i < nbytes; i++)
- sendData(MITSUBISHI_AC_BIT_MARK, MITSUBISHI_AC_ONE_SPACE,
- MITSUBISHI_AC_BIT_MARK, MITSUBISHI_AC_ZERO_SPACE,
- data[i], 8, false);
- // Footer
- mark(MITSUBISHI_AC_RPT_MARK);
- space(MITSUBISHI_AC_RPT_SPACE);
- }
-}
-
-// Code to emulate Mitsubishi A/C IR remote control unit.
-// Inspired and derived from the work done at:
-// https://github.com/r45635/HVAC-IR-Control
-//
-// Warning: Consider this very alpha code. Seems to work, but not validated.
-//
-// Equipment it seems compatible with:
-// *
-// Initialise the object.
-IRMitsubishiAC::IRMitsubishiAC(uint16_t pin) : _irsend(pin) {
- stateReset();
-}
-
-// Reset the state of the remote to a known good state/sequence.
-void IRMitsubishiAC::stateReset() {
- // The state of the IR remote in IR code form.
- // Known good state obtained from:
- // https://github.com/r45635/HVAC-IR-Control/blob/master/HVAC_ESP8266/HVAC_ESP8266.ino#L108
- // Note: Can't use the following because it requires -std=c++11
- // uint8_t known_good_state[MITSUBISHI_AC_STATE_LENGTH] = {
- // 0x23, 0xCB, 0x26, 0x01, 0x00, 0x20, 0x08, 0x06, 0x30, 0x45, 0x67, 0x00,
- // 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F};
- remote_state[0] = 0x23;
- remote_state[1] = 0xCB;
- remote_state[2] = 0x26;
- remote_state[3] = 0x01;
- remote_state[4] = 0x00;
- remote_state[5] = 0x20;
- remote_state[6] = 0x08;
- remote_state[7] = 0x06;
- remote_state[8] = 0x30;
- remote_state[9] = 0x45;
- remote_state[10] = 0x67;
- for (uint8_t i = 11; i < MITSUBISHI_AC_STATE_LENGTH - 1; i++)
- remote_state[i] = 0;
- remote_state[MITSUBISHI_AC_STATE_LENGTH - 1] = 0x1F;
- checksum(); // Calculate the checksum
-}
-
-// Configure the pin for output.
-void IRMitsubishiAC::begin() {
- _irsend.begin();
-}
-
-// Send the current desired state to the IR LED.
-void IRMitsubishiAC::send() {
- checksum(); // Ensure correct checksum before sending.
- _irsend.sendMitsubishiAC(remote_state);
-}
-
-// Return a pointer to the internal state date of the remote.
-uint8_t* IRMitsubishiAC::getRaw() {
- checksum();
- return remote_state;
-}
-
-// Calculate the checksum for the current internal state of the remote.
-void IRMitsubishiAC::checksum() {
- uint8_t sum = 0;
- // Checksum is simple addition of all previous bytes stored
- // as a 8 bit value.
- for (uint8_t i = 0; i < 17; i++)
- sum += remote_state[i];
- remote_state[17] = sum & 0xFFU;
-}
-
-// Set the requested power state of the A/C to off.
-void IRMitsubishiAC::on() {
- // state = ON;
- remote_state[5] |= MITSUBISHI_AC_POWER;
-}
-
-// Set the requested power state of the A/C to off.
-void IRMitsubishiAC::off() {
- // state = OFF;
- remote_state[5] &= ~MITSUBISHI_AC_POWER;
-}
-
-// Set the requested power state of the A/C.
-void IRMitsubishiAC::setPower(bool state) {
- if (state)
- on();
- else
- off();
-}
-
-// Return the requested power state of the A/C.
-bool IRMitsubishiAC::getPower() {
- return((remote_state[5] & MITSUBISHI_AC_POWER) != 0);
-}
-
-// Set the temp. in deg C
-void IRMitsubishiAC::setTemp(uint8_t temp) {
- temp = std::max((uint8_t) MITSUBISHI_AC_MIN_TEMP, temp);
- temp = std::min((uint8_t) MITSUBISHI_AC_MAX_TEMP, temp);
- remote_state[7] = temp - MITSUBISHI_AC_MIN_TEMP;
-}
-
-// Return the set temp. in deg C
-uint8_t IRMitsubishiAC::getTemp() {
- return(remote_state[7] + MITSUBISHI_AC_MIN_TEMP);
-}
-
-// Set the speed of the fan, 0-6.
-// 0 is auto, 1-5 is the speed, 6 is silent.
-void IRMitsubishiAC::setFan(uint8_t fan) {
- // Bounds check
- if (fan > MITSUBISHI_AC_FAN_SILENT)
- fan = MITSUBISHI_AC_FAN_MAX; // Set the fan to maximum if out of range.
- if (fan == MITSUBISHI_AC_FAN_AUTO) { // Automatic is a special case.
- remote_state[9] = 0b10000000 | (remote_state[9] & 0b01111000);
- return;
- } else if (fan >= MITSUBISHI_AC_FAN_MAX) {
- fan--; // There is no spoon^H^H^Heed 5 (max), pretend it doesn't exist.
- }
- remote_state[9] &= 0b01111000; // Clear the previous state
- remote_state[9] |= fan;
-}
-
-// Return the requested state of the unit's fan.
-uint8_t IRMitsubishiAC::getFan() {
- uint8_t fan = remote_state[9] & 0b111;
- if (fan == MITSUBISHI_AC_FAN_MAX)
- return MITSUBISHI_AC_FAN_SILENT;
- return fan;
-}
-
-// Return the requested climate operation mode of the a/c unit.
-uint8_t IRMitsubishiAC::getMode() {
- return(remote_state[6]);
-}
-
-// Set the requested climate operation mode of the a/c unit.
-void IRMitsubishiAC::setMode(uint8_t mode) {
- // If we get an unexpected mode, default to AUTO.
- switch (mode) {
- case MITSUBISHI_AC_AUTO: break;
- case MITSUBISHI_AC_COOL: break;
- case MITSUBISHI_AC_DRY: break;
- case MITSUBISHI_AC_HEAT: break;
- default: mode = MITSUBISHI_AC_AUTO;
- }
- remote_state[6] = mode;
-}
-
-// Set the requested vane operation mode of the a/c unit.
-void IRMitsubishiAC::setVane(uint8_t mode) {
- mode = std::min(mode, (uint8_t) 0b111); // bounds check
- mode |= 0b1000;
- mode <<= 3;
- remote_state[9] &= 0b11000111; // Clear the previous setting.
- remote_state[9] |= mode;
-}
-
-// Return the requested vane operation mode of the a/c unit.
-uint8_t IRMitsubishiAC::getVane() {
- return ((remote_state[9] & 0b00111000) >> 3);
-}
-#endif
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Mitsubishi.h b/lib/IRremoteESP8266-2.2.1.02/src/ir_Mitsubishi.h
deleted file mode 100644
index e9f5731aa3aa..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Mitsubishi.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2009 Ken Shirriff
-// Copyright 2017 David Conran
-#ifndef IR_MITSUBISHI_H_
-#define IR_MITSUBISHI_H_
-
-#define __STDC_LIMIT_MACROS
-#include
-#include "IRremoteESP8266.h"
-#include "IRsend.h"
-
-// MMMMM IIIII TTTTT SSSS U U BBBB IIIII SSSS H H IIIII
-// M M M I T S U U B B I S H H I
-// M M M I T SSS U U BBBB I SSS HHHHH I
-// M M I T S U U B B I S H H I
-// M M IIIII T SSSS UUU BBBBB IIIII SSSS H H IIIII
-
-// Mitsubishi (TV) decoding added from https://github.com/z3t0/Arduino-IRremote
-// Mitsubishi (TV) sending & Mitsubishi A/C support added by David Conran
-
-// Constants
-#define MITSUBISHI_AC_AUTO 0x20U
-#define MITSUBISHI_AC_COOL 0x18U
-#define MITSUBISHI_AC_DRY 0x10U
-#define MITSUBISHI_AC_HEAT 0x08U
-#define MITSUBISHI_AC_POWER 0x20U
-#define MITSUBISHI_AC_FAN_AUTO 0U
-#define MITSUBISHI_AC_FAN_MAX 5U
-#define MITSUBISHI_AC_FAN_REAL_MAX 4U
-#define MITSUBISHI_AC_FAN_SILENT 6U
-#define MITSUBISHI_AC_MIN_TEMP 16U // 16C
-#define MITSUBISHI_AC_MAX_TEMP 31U // 31C
-#define MITSUBISHI_AC_VANE_AUTO 0U
-#define MITSUBISHI_AC_VANE_AUTO_MOVE 7U
-
-#if SEND_MITSUBISHI_AC
-class IRMitsubishiAC {
- public:
- explicit IRMitsubishiAC(uint16_t pin);
-
- void stateReset();
- void send();
- void begin();
- void on();
- void off();
- void setPower(bool state);
- bool getPower();
- void setTemp(uint8_t temp);
- uint8_t getTemp();
- void setFan(uint8_t fan);
- uint8_t getFan();
- void setMode(uint8_t mode);
- uint8_t getMode();
- void setVane(uint8_t mode);
- uint8_t getVane();
- uint8_t* getRaw();
-
- private:
- uint8_t remote_state[MITSUBISHI_AC_STATE_LENGTH];
- void checksum();
- IRsend _irsend;
-};
-
-#endif
-
-#endif // IR_MITSUBISHI_H_
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Nikai.cpp b/lib/IRremoteESP8266-2.2.1.02/src/ir_Nikai.cpp
deleted file mode 100644
index e1afda4c5305..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Nikai.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2009 Ken Shirriff
-// Copyright 2017 David Conran
-
-#include
-#include "IRrecv.h"
-#include "IRsend.h"
-#include "IRtimer.h"
-#include "IRutils.h"
-
-// NN NN IIIII KK KK AAA IIIII
-// NNN NN III KK KK AAAAA III
-// NN N NN III KKKK AA AA III
-// NN NNN III KK KK AAAAAAA III
-// NN NN IIIII KK KK AA AA IIIII
-
-// Constants
-// Ref:
-// https://github.com/markszabo/IRremoteESP8266/issues/309
-#define NIKAI_TICK 500U
-#define NIKAI_HDR_MARK_TICKS 8U
-#define NIKAI_HDR_MARK (NIKAI_HDR_MARK_TICKS * NIKAI_TICK)
-#define NIKAI_HDR_SPACE_TICKS 8U
-#define NIKAI_HDR_SPACE (NIKAI_HDR_SPACE_TICKS * NIKAI_TICK)
-#define NIKAI_BIT_MARK_TICKS 1U
-#define NIKAI_BIT_MARK (NIKAI_BIT_MARK_TICKS * NIKAI_TICK)
-#define NIKAI_ONE_SPACE_TICKS 2U
-#define NIKAI_ONE_SPACE (NIKAI_ONE_SPACE_TICKS * NIKAI_TICK)
-#define NIKAI_ZERO_SPACE_TICKS 4U
-#define NIKAI_ZERO_SPACE (NIKAI_ZERO_SPACE_TICKS * NIKAI_TICK)
-#define NIKAI_MIN_GAP_TICKS 17U
-#define NIKAI_MIN_GAP (NIKAI_MIN_GAP_TICKS * NIKAI_TICK)
-
-
-#if SEND_NIKAI
-// Send a Nikai TV formatted message.
-//
-// Args:
-// data: The message to be sent.
-// nbits: The bit size of the message being sent. typically NIKAI_BITS.
-// repeat: The number of times the message is to be repeated.
-//
-// Status: ALPHA / Untested.
-//
-// Ref: https://github.com/markszabo/IRremoteESP8266/issues/309
-void IRsend::sendNikai(uint64_t data, uint16_t nbits, uint16_t repeat) {
- // Set 38kHz IR carrier frequency & a 1/3 (33%) duty cycle.
- enableIROut(38, 33);
- // We always send a message, even for repeat=0, hence '<= repeat'.
- for (uint16_t i=0; i <= repeat; i++) {
- // Header
- mark(NIKAI_HDR_MARK);
- space(NIKAI_HDR_SPACE);
- // Data
- sendData(NIKAI_BIT_MARK, NIKAI_ONE_SPACE, NIKAI_BIT_MARK,
- NIKAI_ZERO_SPACE, data, nbits, true);
- // Footer
- mark(NIKAI_BIT_MARK);
- space(NIKAI_MIN_GAP);
- }
-}
-#endif
-
-#if DECODE_NIKAI
-// Decode the supplied Nikai message.
-//
-// Args:
-// results: Ptr to the data to decode and where to store the decode result.
-// nbits: Nr. of bits to expect in the data portion.
-// Typically NIKAI_BITS.
-// strict: Flag to indicate if we strictly adhere to the specification.
-// Returns:
-// boolean: True if it can decode it, false if it can't.
-//
-// Status: ALPHA / Untested.
-//
-bool IRrecv::decodeNikai(decode_results *results, uint16_t nbits, bool strict) {
- if (results->rawlen < 2 * nbits + HEADER + FOOTER - 1)
- return false; // Can't possibly be a valid Nikai message.
- if (strict && nbits != NIKAI_BITS)
- return false; // We expect Nikai to be a certain sized message.
-
- uint64_t data = 0;
- uint16_t offset = OFFSET_START;
-
- // Header
- if (!matchMark(results->rawbuf[offset], NIKAI_HDR_MARK)) return false;
- // Calculate how long the common tick time is based on the header mark.
- uint32_t m_tick = results->rawbuf[offset++] * RAWTICK /
- NIKAI_HDR_MARK_TICKS;
- if (!matchSpace(results->rawbuf[offset], NIKAI_HDR_SPACE)) return false;
- // Calculate how long the common tick time is based on the header space.
- uint32_t s_tick = results->rawbuf[offset++] * RAWTICK /
- NIKAI_HDR_SPACE_TICKS;
- // Data
- match_result_t data_result = matchData(&(results->rawbuf[offset]), nbits,
- NIKAI_BIT_MARK_TICKS * m_tick,
- NIKAI_ONE_SPACE_TICKS * s_tick,
- NIKAI_BIT_MARK_TICKS * m_tick,
- NIKAI_ZERO_SPACE_TICKS * s_tick);
- if (data_result.success == false) return false;
- data = data_result.data;
- offset += data_result.used;
- // Footer
- if (!matchMark(results->rawbuf[offset++], NIKAI_BIT_MARK_TICKS * m_tick))
- return false;
- if (offset < results->rawlen &&
- !matchAtLeast(results->rawbuf[offset], NIKAI_MIN_GAP_TICKS * s_tick))
- return false;
-
- // Compliance
-
- // Success
- results->bits = nbits;
- results->value = data;
- results->decode_type = NIKAI;
- results->command = 0;
- results->address = 0;
- return true;
-}
-#endif
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Panasonic.cpp b/lib/IRremoteESP8266-2.2.1.02/src/ir_Panasonic.cpp
deleted file mode 100644
index fb1f12234474..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Panasonic.cpp
+++ /dev/null
@@ -1,196 +0,0 @@
-// Copyright 2015 Kristian Lauszus
-// Copyright 2017 David Conran
-
-#include
-#include "IRrecv.h"
-#include "IRsend.h"
-#include "IRtimer.h"
-#include "IRutils.h"
-
-// PPPP AAA N N AAA SSSS OOO N N IIIII CCCC
-// P P A A NN N A A S O O NN N I C
-// PPPP AAAAA N N N AAAAA SSS O O N N N I C
-// P A A N NN A A S O O N NN I C
-// P A A N N A A SSSS OOO N N IIIII CCCC
-
-// Panasonic protocol originally added by Kristian Lauszus from:
-// https://github.com/z3t0/Arduino-IRremote
-// (Thanks to zenwheel and other people at the original blog post)
-
-// Constants
-// Ref:
-// http://www.remotecentral.com/cgi-bin/mboard/rc-pronto/thread.cgi?26152
-#define PANASONIC_TICK 432U
-#define PANASONIC_HDR_MARK_TICKS 8U
-#define PANASONIC_HDR_MARK (PANASONIC_HDR_MARK_TICKS * PANASONIC_TICK)
-#define PANASONIC_HDR_SPACE_TICKS 4U
-#define PANASONIC_HDR_SPACE (PANASONIC_HDR_SPACE_TICKS * PANASONIC_TICK)
-#define PANASONIC_BIT_MARK_TICKS 1U
-#define PANASONIC_BIT_MARK (PANASONIC_BIT_MARK_TICKS * PANASONIC_TICK)
-#define PANASONIC_ONE_SPACE_TICKS 3U
-#define PANASONIC_ONE_SPACE (PANASONIC_ONE_SPACE_TICKS * PANASONIC_TICK)
-#define PANASONIC_ZERO_SPACE_TICKS 1U
-#define PANASONIC_ZERO_SPACE (PANASONIC_ZERO_SPACE_TICKS * PANASONIC_TICK)
-#define PANASONIC_MIN_COMMAND_LENGTH_TICKS 300UL
-#define PANASONIC_MIN_COMMAND_LENGTH (PANASONIC_MIN_COMMAND_LENGTH_TICKS * \
- PANASONIC_TICK)
-#define PANASONIC_END_GAP 5000U // See issue #245
-#define PANASONIC_MIN_GAP_TICKS (PANASONIC_MIN_COMMAND_LENGTH_TICKS - \
- (PANASONIC_HDR_MARK_TICKS + PANASONIC_HDR_SPACE_TICKS + \
- PANASONIC_BITS * (PANASONIC_BIT_MARK_TICKS + PANASONIC_ONE_SPACE_TICKS) + \
- PANASONIC_BIT_MARK_TICKS))
-#define PANASONIC_MIN_GAP ((uint32_t)(PANASONIC_MIN_GAP_TICKS * PANASONIC_TICK))
-#if (SEND_PANASONIC || SEND_DENON)
-// Send a Panasonic formatted message.
-//
-// Args:
-// data: The message to be sent.
-// nbits: The number of bits of the message to be sent. (PANASONIC_BITS).
-// repeat: The number of times the command is to be repeated.
-//
-// Status: BETA / Should be working.
-//
-// Note:
-// This protocol is a modified version of Kaseikyo.
-void IRsend::sendPanasonic64(uint64_t data, uint16_t nbits, uint16_t repeat) {
- enableIROut(36700U); // Set IR carrier frequency of 36.7kHz.
- IRtimer usecTimer = IRtimer();
-
- for (uint16_t i = 0; i <= repeat; i++) {
- usecTimer.reset();
- // Header
- mark(PANASONIC_HDR_MARK);
- space(PANASONIC_HDR_SPACE);
- // Data
- sendData(PANASONIC_BIT_MARK, PANASONIC_ONE_SPACE,
- PANASONIC_BIT_MARK, PANASONIC_ZERO_SPACE,
- data, nbits, true);
- // Footer
- mark(PANASONIC_BIT_MARK);
- space(std::max((uint32_t) PANASONIC_MIN_COMMAND_LENGTH -
- usecTimer.elapsed(),
- PANASONIC_MIN_GAP));
- }
-}
-
-// Send a Panasonic formatted message.
-//
-// Args:
-// address: The manufacturer code.
-// data: The data portion to be sent.
-// nbits: The number of bits of the message to be sent. (PANASONIC_BITS).
-// repeat: The number of times the command is to be repeated.
-//
-// Status: STABLE.
-//
-// Note:
-// This protocol is a modified version of Kaseikyo.
-void IRsend::sendPanasonic(uint16_t address, uint32_t data, uint16_t nbits,
- uint16_t repeat) {
- sendPanasonic64(((uint64_t) address << 32) | (uint64_t) data, nbits, repeat);
-}
-
-// Calculate the raw Panasonic data based on device, subdevice, & function.
-//
-// Args:
-// manufacturer: A 16-bit manufacturer code. e.g. 0x4004 is Panasonic.
-// device: An 8-bit code.
-// subdevice: An 8-bit code.
-// function: An 8-bit code.
-// Returns:
-// A raw uint64_t Panasonic message.
-//
-// Status: BETA / Should be working..
-//
-// Note:
-// Panasonic 48-bit protocol is a modified version of Kaseikyo.
-// Ref:
-// http://www.remotecentral.com/cgi-bin/mboard/rc-pronto/thread.cgi?2615
-uint64_t IRsend::encodePanasonic(uint16_t manufacturer,
- uint8_t device,
- uint8_t subdevice,
- uint8_t function) {
- uint8_t checksum = device ^ subdevice ^ function;
- return (((uint64_t) manufacturer << 32) |
- ((uint64_t) device << 24) |
- ((uint64_t) subdevice << 16) |
- ((uint64_t) function << 8) |
- checksum);
-}
-#endif // (SEND_PANASONIC || SEND_DENON)
-
-#if (DECODE_PANASONIC || DECODE_DENON)
-// Decode the supplied Panasonic message.
-//
-// Args:
-// results: Ptr to the data to decode and where to store the decode result.
-// nbits: Nr. of data bits to expect.
-// strict: Flag indicating if we should perform strict matching.
-// Returns:
-// boolean: True if it can decode it, false if it can't.
-//
-// Status: BETA / Should be working.
-// Note:
-// Panasonic 48-bit protocol is a modified version of Kaseikyo.
-// Ref:
-// http://www.remotecentral.com/cgi-bin/mboard/rc-pronto/thread.cgi?26152
-// http://www.hifi-remote.com/wiki/index.php?title=Panasonic
-bool IRrecv::decodePanasonic(decode_results *results, uint16_t nbits,
- bool strict, uint32_t manufacturer) {
- if (results->rawlen < 2 * nbits + HEADER + FOOTER - 1)
- return false; // Not enough entries to be a Panasonic message.
- if (strict && nbits != PANASONIC_BITS)
- return false; // Request is out of spec.
-
- uint64_t data = 0;
- uint16_t offset = OFFSET_START;
-
- // Header
- if (!matchMark(results->rawbuf[offset], PANASONIC_HDR_MARK)) return false;
- // Calculate how long the common tick time is based on the header mark.
- uint32_t m_tick = results->rawbuf[offset++] * RAWTICK /
- PANASONIC_HDR_MARK_TICKS;
- if (!matchSpace(results->rawbuf[offset], PANASONIC_HDR_SPACE)) return false;
- // Calculate how long the common tick time is based on the header space.
- uint32_t s_tick = results->rawbuf[offset++] * RAWTICK /
- PANASONIC_HDR_SPACE_TICKS;
-
- // Data
- match_result_t data_result = matchData(&(results->rawbuf[offset]), nbits,
- PANASONIC_BIT_MARK_TICKS * m_tick,
- PANASONIC_ONE_SPACE_TICKS * s_tick,
- PANASONIC_BIT_MARK_TICKS * m_tick,
- PANASONIC_ZERO_SPACE_TICKS * s_tick);
- if (data_result.success == false) return false;
- data = data_result.data;
- offset += data_result.used;
-
- // Footer
- if (!match(results->rawbuf[offset++], PANASONIC_BIT_MARK_TICKS * m_tick))
- return false;
- if (offset < results->rawlen &&
- !matchAtLeast(results->rawbuf[offset], PANASONIC_END_GAP))
- return false;
-
- // Compliance
- uint32_t address = data >> 32;
- uint32_t command = data & 0xFFFFFFFF;
- if (strict) {
- if (address != manufacturer) // Verify the Manufacturer code.
- return false;
- // Verify the checksum.
- uint8_t checksumOrig = data & 0xFF;
- uint8_t checksumCalc = ((data >> 24) ^ (data >> 16) ^ (data >> 8)) & 0xFF;
- if (checksumOrig != checksumCalc)
- return false;
- }
-
- // Success
- results->value = data;
- results->address = address;
- results->command = command;
- results->decode_type = PANASONIC;
- results->bits = nbits;
- return true;
-}
-#endif // (DECODE_PANASONIC || DECODE_DENON)
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Samsung.cpp b/lib/IRremoteESP8266-2.2.1.02/src/ir_Samsung.cpp
deleted file mode 100644
index dbd94bcd486d..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Samsung.cpp
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2009 Ken Shirriff
-// Copyright 2017 David Conran
-
-#include
-#include "IRrecv.h"
-#include "IRsend.h"
-#include "IRtimer.h"
-#include "IRutils.h"
-
-// SSSS AAA MMM SSSS U U N N GGGG
-// S A A M M M S U U NN N G
-// SSS AAAAA M M M SSS U U N N N G GG
-// S A A M M S U U N NN G G
-// SSSS A A M M SSSS UUU N N GGG
-
-// Samsung originally added from https://github.com/shirriff/Arduino-IRremote/
-
-// Constants
-// Ref:
-// http://elektrolab.wz.cz/katalog/samsung_protocol.pdf
-#define SAMSUNG_TICK 560U
-#define SAMSUNG_HDR_MARK_TICKS 8U
-#define SAMSUNG_HDR_MARK (SAMSUNG_HDR_MARK_TICKS * SAMSUNG_TICK)
-#define SAMSUNG_HDR_SPACE_TICKS 8U
-#define SAMSUNG_HDR_SPACE (SAMSUNG_HDR_SPACE_TICKS * SAMSUNG_TICK)
-#define SAMSUNG_BIT_MARK_TICKS 1U
-#define SAMSUNG_BIT_MARK (SAMSUNG_BIT_MARK_TICKS * SAMSUNG_TICK)
-#define SAMSUNG_ONE_SPACE_TICKS 3U
-#define SAMSUNG_ONE_SPACE (SAMSUNG_ONE_SPACE_TICKS * SAMSUNG_TICK)
-#define SAMSUNG_ZERO_SPACE_TICKS 1U
-#define SAMSUNG_ZERO_SPACE (SAMSUNG_ZERO_SPACE_TICKS * SAMSUNG_TICK)
-#define SAMSUNG_RPT_SPACE_TICKS 4U
-#define SAMSUNG_RPT_SPACE (SAMSUNG_RPT_SPACE_TICKS * SAMSUNG_TICK)
-#define SAMSUNG_MIN_MESSAGE_LENGTH_TICKS 193U
-#define SAMSUNG_MIN_MESSAGE_LENGTH (SAMSUNG_MIN_MESSAGE_LENGTH_TICKS * \
- SAMSUNG_TICK)
-#define SAMSUNG_MIN_GAP_TICKS (SAMSUNG_MIN_MESSAGE_LENGTH_TICKS - \
- (SAMSUNG_HDR_MARK_TICKS + SAMSUNG_HDR_SPACE_TICKS + \
- SAMSUNG_BITS * (SAMSUNG_BIT_MARK_TICKS + SAMSUNG_ONE_SPACE_TICKS) + \
- SAMSUNG_BIT_MARK_TICKS))
-#define SAMSUNG_MIN_GAP (SAMSUNG_MIN_GAP_TICKS * SAMSUNG_TICK)
-
-
-
-#if SEND_SAMSUNG
-// Send a Samsung formatted message.
-// Samsung has a separate message to indicate a repeat, like NEC does.
-// TODO(crankyoldgit): Confirm that is actually how Samsung sends a repeat.
-// The refdoc doesn't indicate it is true.
-//
-// Args:
-// data: The message to be sent.
-// nbits: The bit size of the message being sent. typically SAMSUNG_BITS.
-// repeat: The number of times the message is to be repeated.
-//
-// Status: BETA / Should be working.
-//
-// Ref: http://elektrolab.wz.cz/katalog/samsung_protocol.pdf
-void IRsend::sendSAMSUNG(uint64_t data, uint16_t nbits, uint16_t repeat) {
- // Set 38kHz IR carrier frequency & a 1/3 (33%) duty cycle.
- enableIROut(38, 33);
- IRtimer usecTimer = IRtimer();
- // We always send a message, even for repeat=0, hence '<= repeat'.
- for (uint16_t i=0; i <= repeat; i++) {
- usecTimer.reset();
- // Header
- mark(SAMSUNG_HDR_MARK);
- space(SAMSUNG_HDR_SPACE);
- // Data
- sendData(SAMSUNG_BIT_MARK, SAMSUNG_ONE_SPACE, SAMSUNG_BIT_MARK,
- SAMSUNG_ZERO_SPACE, data, nbits, true);
- // Footer
- mark(SAMSUNG_BIT_MARK);
- space(std::max((uint32_t) SAMSUNG_MIN_GAP,
- (uint32_t) (SAMSUNG_MIN_MESSAGE_LENGTH -
- usecTimer.elapsed())));
- }
-}
-
-// Construct a raw Samsung message from the supplied customer(address) &
-// command.
-//
-// Args:
-// customer: The customer code. (aka. Address)
-// command: The command code.
-// Returns:
-// A raw 32-bit Samsung message suitable for sendSAMSUNG().
-//
-// Status: BETA / Should be working.
-uint32_t IRsend::encodeSAMSUNG(uint8_t customer, uint8_t command) {
- customer = reverseBits(customer, sizeof(customer) * 8);
- command = reverseBits(command, sizeof(command) * 8);
- return((command ^ 0xFF) | (command << 8) |
- (customer << 16) | (customer << 24));
-}
-#endif
-
-#if DECODE_SAMSUNG
-// Decode the supplied Samsung message.
-// Samsung messages whilst 32 bits in size, only contain 16 bits of distinct
-// data. e.g. In transmition order:
-// customer_byte + customer_byte(same) + address_byte + invert(address_byte)
-//
-// Args:
-// results: Ptr to the data to decode and where to store the decode result.
-// nbits: Nr. of bits to expect in the data portion. Typically SAMSUNG_BITS.
-// strict: Flag to indicate if we strictly adhere to the specification.
-// Returns:
-// boolean: True if it can decode it, false if it can't.
-//
-// Status: STABLE
-//
-// Note:
-// LG 32bit protocol appears near identical to the Samsung protocol.
-// They differ on their compliance criteria and how they repeat.
-// Ref:
-// http://elektrolab.wz.cz/katalog/samsung_protocol.pdf
-bool IRrecv::decodeSAMSUNG(decode_results *results, uint16_t nbits,
- bool strict) {
- if (results->rawlen < 2 * nbits + HEADER + FOOTER - 1)
- return false; // Can't possibly be a valid Samsung message.
- if (strict && nbits != SAMSUNG_BITS)
- return false; // We expect Samsung to be 32 bits of message.
-
- uint64_t data = 0;
- uint16_t offset = OFFSET_START;
-
- // Header
- if (!matchMark(results->rawbuf[offset], SAMSUNG_HDR_MARK)) return false;
- // Calculate how long the common tick time is based on the header mark.
- uint32_t m_tick = results->rawbuf[offset++] * RAWTICK /
- SAMSUNG_HDR_MARK_TICKS;
- if (!matchSpace(results->rawbuf[offset], SAMSUNG_HDR_SPACE)) return false;
- // Calculate how long the common tick time is based on the header space.
- uint32_t s_tick = results->rawbuf[offset++] * RAWTICK /
- SAMSUNG_HDR_SPACE_TICKS;
- // Data
- match_result_t data_result = matchData(&(results->rawbuf[offset]), nbits,
- SAMSUNG_BIT_MARK_TICKS * m_tick,
- SAMSUNG_ONE_SPACE_TICKS * s_tick,
- SAMSUNG_BIT_MARK_TICKS * m_tick,
- SAMSUNG_ZERO_SPACE_TICKS * s_tick);
- if (data_result.success == false) return false;
- data = data_result.data;
- offset += data_result.used;
- // Footer
- if (!matchMark(results->rawbuf[offset++], SAMSUNG_BIT_MARK_TICKS * m_tick))
- return false;
- if (offset < results->rawlen &&
- !matchAtLeast(results->rawbuf[offset], SAMSUNG_MIN_GAP_TICKS * s_tick))
- return false;
-
- // Compliance
-
- // According to the spec, the customer (address) code is the first 8
- // transmitted bits. It's then repeated. Check for that.
- uint8_t address = data >> 24;
- if (strict && address != ((data >> 16) & 0xFF))
- return false;
- // Spec says the command code is the 3rd block of transmitted 8-bits,
- // followed by the inverted command code.
- uint8_t command = (data & 0xFF00) >> 8;
- if (strict && command != ((data & 0xFF) ^ 0xFF))
- return false;
-
- // Success
- results->bits = nbits;
- results->value = data;
- results->decode_type = SAMSUNG;
- // command & address need to be reversed as they are transmitted LSB first,
- results->command = reverseBits(command, sizeof(command) * 8);
- results->address = reverseBits(address, sizeof(address) * 8);
- return true;
-}
-#endif
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Trotec.cpp b/lib/IRremoteESP8266-2.2.1.02/src/ir_Trotec.cpp
deleted file mode 100644
index ef8e9efa6690..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Trotec.cpp
+++ /dev/null
@@ -1,151 +0,0 @@
-// Copyright 2017 stufisher
-
-#include "ir_Trotec.h"
-#include "IRremoteESP8266.h"
-#include "IRutils.h"
-
-// Constants
-#define TROTEC_HDR_MARK 5952U
-#define TROTEC_HDR_SPACE 7364U
-#define TROTEC_ONE_MARK 592U
-#define TROTEC_ONE_SPACE 1560U
-#define TROTEC_ZERO_MARK 592U
-#define TROTEC_ZERO_SPACE 592U
-#define TROTEC_GAP 6184U
-#define TROTEC_GAP_END 1500U // made up value
-
-#if SEND_TROTEC
-
-void IRsend::sendTrotec(unsigned char data[], uint16_t nbytes,
- uint16_t repeat) {
- if (nbytes < TROTEC_COMMAND_LENGTH)
- return;
-
- enableIROut(36);
-
- for (uint16_t r = 0; r <= repeat; r++) {
- // Header
- mark(TROTEC_HDR_MARK);
- space(TROTEC_HDR_SPACE);
-
- // Data
- for (uint16_t i = 0; i < nbytes; i++)
- sendData(TROTEC_ONE_MARK, TROTEC_ONE_SPACE, TROTEC_ZERO_MARK,
- TROTEC_ZERO_SPACE, data[i], 8, false);
-
- // Footer
- mark(TROTEC_ONE_MARK);
- space(TROTEC_GAP);
- mark(TROTEC_ONE_MARK);
- space(TROTEC_GAP_END);
- }
-}
-
-IRTrotecESP::IRTrotecESP(uint16_t pin) : _irsend(pin) {
- stateReset();
-}
-
-void IRTrotecESP::begin() {
- _irsend.begin();
-}
-
-void IRTrotecESP::send() {
- checksum();
- _irsend.sendTrotec(trotec);
-}
-
-void IRTrotecESP::checksum() {
- uint8_t sum = 0;
- uint8_t i;
-
- for (i = 2; i < 8; i++) sum += trotec[i];
-
- trotec[8] = sum & 0xFF;
-}
-
-void IRTrotecESP::stateReset() {
- for (uint8_t i = 2; i < TROTEC_COMMAND_LENGTH; i++)
- trotec[i] = 0x0;
-
- trotec[0] = TROTEC_INTRO1;
- trotec[1] = TROTEC_INTRO2;
-
- setPower(false);
- setTemp(TROTEC_DEF_TEMP);
- setSpeed(TROTEC_FAN_MED);
- setMode(TROTEC_AUTO);
-}
-
-uint8_t* IRTrotecESP::getRaw() {
- checksum();
- return trotec;
-}
-
-void IRTrotecESP::setPower(bool state) {
- if (state)
- trotec[2] |= (TROTEC_ON << 3);
- else
- trotec[2] &= ~(TROTEC_ON << 3);
-}
-
-uint8_t IRTrotecESP::getPower() {
- return trotec[2] & (TROTEC_ON << 3);
-}
-
-void IRTrotecESP::setSpeed(uint8_t speed) {
- trotec[2] = (trotec[2] & 0xcf) | (speed << 4);
-}
-
-uint8_t IRTrotecESP::getSpeed() {
- return trotec[2] & 0x30;
-}
-
-void IRTrotecESP::setMode(uint8_t mode) {
- trotec[2] = (trotec[2] & 0xfc) | mode;
-}
-
-uint8_t IRTrotecESP::getMode() {
- return trotec[2] & 0x03;
-}
-
-void IRTrotecESP::setTemp(uint8_t temp) {
- if (temp < TROTEC_MIN_TEMP)
- temp = TROTEC_MIN_TEMP;
- else if (temp > TROTEC_MAX_TEMP)
- temp = TROTEC_MAX_TEMP;
-
- trotec[3] = (trotec[3] & 0x80) | (temp - TROTEC_MIN_TEMP);
-}
-
-uint8_t IRTrotecESP::getTemp() {
- return trotec[3] & 0x7f;
-}
-
-void IRTrotecESP::setSleep(bool sleep) {
- if (sleep)
- trotec[3] |= (TROTEC_SLEEP_ON << 7);
- else
- trotec[3] &= ~(TROTEC_SLEEP_ON << 7);
-}
-
-bool IRTrotecESP::getSleep(void) {
- return trotec[3] & (TROTEC_SLEEP_ON << 7);
-}
-
-void IRTrotecESP::setTimer(uint8_t timer) {
- if (timer > TROTEC_MAX_TIMER) timer = TROTEC_MAX_TIMER;
-
- if (timer) {
- trotec[5] |= (TROTEC_TIMER_ON << 6);
- trotec[6] = timer;
- } else {
- trotec[5] &= ~(TROTEC_TIMER_ON << 6);
- trotec[6] = 0;
- }
-}
-
-uint8_t IRTrotecESP::getTimer() {
- return trotec[6];
-}
-
-#endif // SEND_TROTEC
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Trotec.h b/lib/IRremoteESP8266-2.2.1.02/src/ir_Trotec.h
deleted file mode 100644
index 01ac13c598d1..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Trotec.h
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2017 stufisher
-
-#ifndef IR_TROTEC_H_
-#define IR_TROTEC_H_
-
-#include "IRremoteESP8266.h"
-#include "IRsend.h"
-
-// Constants
-// Byte 0
-#define TROTEC_INTRO1 0x12
-
-// Byte 1
-#define TROTEC_INTRO2 0x34
-
-// Byte 2
-#define TROTEC_AUTO 0
-#define TROTEC_COOL 1
-#define TROTEC_DRY 2
-#define TROTEC_FAN 3
-
-#define TROTEC_ON 1
-#define TROTEC_OFF 0
-
-#define TROTEC_FAN_LOW 1
-#define TROTEC_FAN_MED 2
-#define TROTEC_FAN_HIGH 3
-
-// Byte 3
-#define TROTEC_MIN_TEMP 18
-#define TROTEC_MAX_TEMP 32
-#define TROTEC_DEF_TEMP 25
-
-#define TROTEC_SLEEP_ON 1
-
-// Byte 5
-#define TROTEC_TIMER_ON 1
-
-// Byte 6
-#define TROTEC_MIN_TIMER 0
-#define TROTEC_MAX_TIMER 23
-
-#if SEND_TROTEC
-
-class IRTrotecESP {
- public:
- explicit IRTrotecESP(uint16_t pin);
-
- void send();
- void begin();
-
- void setPower(bool state);
- uint8_t getPower();
-
- void setTemp(uint8_t temp);
- uint8_t getTemp();
-
- void setSpeed(uint8_t fan);
- uint8_t getSpeed();
-
- uint8_t getMode();
- void setMode(uint8_t mode);
-
- bool getSleep();
- void setSleep(bool sleep);
-
- uint8_t getTimer();
- void setTimer(uint8_t timer);
-
- uint8_t* getRaw();
-
- private:
- uint8_t trotec[TROTEC_COMMAND_LENGTH];
- void stateReset();
- void checksum();
- IRsend _irsend;
-};
-#endif
-
-#endif // IR_TROTEC_H_
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Whynter.cpp b/lib/IRremoteESP8266-2.2.1.02/src/ir_Whynter.cpp
deleted file mode 100644
index 4efb2c570a92..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Whynter.cpp
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright 2009 Ken Shirriff
-// Copyright 2017 David Conran
-
-#include
-#include "IRrecv.h"
-#include "IRsend.h"
-#include "IRtimer.h"
-#include "IRutils.h"
-
-// W W H H Y Y N N TTTTT EEEEE RRRRR
-// W W H H Y Y NN N T E R R
-// W W W HHHHH Y N N N T EEE RRRR
-// W W W H H Y N NN T E R R
-// WWW H H Y N N T EEEEE R R
-
-// Whynter A/C ARC-110WD added by Francesco Meschia
-// Whynter originally added from https://github.com/shirriff/Arduino-IRremote/
-
-// Constants
-#define WHYNTER_TICK 50U
-#define WHYNTER_HDR_MARK_TICKS 57U
-#define WHYNTER_HDR_MARK (WHYNTER_HDR_MARK_TICKS * WHYNTER_TICK)
-#define WHYNTER_HDR_SPACE_TICKS 57U
-#define WHYNTER_HDR_SPACE (WHYNTER_HDR_SPACE_TICKS * \
- WHYNTER_TICK)
-#define WHYNTER_BIT_MARK_TICKS 15U
-#define WHYNTER_BIT_MARK (WHYNTER_BIT_MARK_TICKS * WHYNTER_TICK)
-#define WHYNTER_ONE_SPACE_TICKS 43U
-#define WHYNTER_ONE_SPACE (WHYNTER_ONE_SPACE_TICKS * \
- WHYNTER_TICK)
-#define WHYNTER_ZERO_SPACE_TICKS 15U
-#define WHYNTER_ZERO_SPACE (WHYNTER_ZERO_SPACE_TICKS * \
- WHYNTER_TICK)
-#define WHYNTER_MIN_COMMAND_LENGTH_TICKS 2160U // Completely made up value.
-#define WHYNTER_MIN_COMMAND_LENGTH (WHYNTER_MIN_COMMAND_LENGTH_TICKS * \
- WHYNTER_TICK)
-#define WHYNTER_MIN_GAP_TICKS (WHYNTER_MIN_COMMAND_LENGTH_TICKS - \
- (2 * (WHYNTER_BIT_MARK_TICKS + WHYNTER_ZERO_SPACE_TICKS) + \
- WHYNTER_BITS * (WHYNTER_BIT_MARK_TICKS + WHYNTER_ONE_SPACE_TICKS)))
-#define WHYNTER_MIN_GAP (WHYNTER_MIN_GAP_TICKS * WHYNTER_TICK)
-
-#if SEND_WHYNTER
-// Send a Whynter message.
-//
-// Args:
-// data: message to be sent.
-// nbits: Nr. of bits of the message to be sent.
-// repeat: Nr. of additional times the message is to be sent.
-//
-// Status: STABLE
-//
-// Ref:
-// https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Whynter.cpp
-void IRsend::sendWhynter(uint64_t data, uint16_t nbits, uint16_t repeat) {
- // Set IR carrier frequency
- enableIROut(38);
- IRtimer usecTimer = IRtimer();
-
- for (uint16_t i = 0; i <= repeat; i++) {
- usecTimer.reset();
- // Header
- mark(WHYNTER_BIT_MARK);
- space(WHYNTER_ZERO_SPACE);
- mark(WHYNTER_HDR_MARK);
- space(WHYNTER_HDR_SPACE);
- // Data
- sendData(WHYNTER_BIT_MARK, WHYNTER_ONE_SPACE, WHYNTER_BIT_MARK,
- WHYNTER_ZERO_SPACE, data, nbits, true);
- // Footer
- mark(WHYNTER_BIT_MARK);
- space(std::max(WHYNTER_MIN_COMMAND_LENGTH - usecTimer.elapsed(),
- WHYNTER_MIN_GAP));
- }
-}
-#endif
-
-#if DECODE_WHYNTER
-// Decode the supplied Whynter message.
-//
-// Args:
-// results: Ptr to the data to decode and where to store the decode result.
-// nbits: Nr. of data bits to expect.
-// strict: Flag indicating if we should perform strict matching.
-// Returns:
-// boolean: True if it can decode it, false if it can't.
-//
-// Status: BETA Strict mode is ALPHA.
-//
-// Ref:
-// https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Whynter.cpp
-bool IRrecv::decodeWhynter(decode_results *results, uint16_t nbits,
- bool strict) {
- if (results->rawlen < 2 * nbits + 2 * HEADER + FOOTER - 1)
- return false; // We don't have enough entries to possibly match.
-
- // Compliance
- if (strict && nbits != WHYNTER_BITS)
- return false; // Incorrect nr. of bits per spec.
-
- uint16_t offset = OFFSET_START;
-
- // Header
- // Sequence begins with a bit mark and a zero space.
- // These are typically small, so we'll prefer to do the calibration
- // on the much larger header mark & space that are next.
- if (!matchMark(results->rawbuf[offset++], WHYNTER_BIT_MARK)) return false;
- if (!matchSpace(results->rawbuf[offset++], WHYNTER_ZERO_SPACE)) return false;
- // Main header mark and space
- if (!matchMark(results->rawbuf[offset], WHYNTER_HDR_MARK)) return false;
- // Calculate how long the common tick time is based on the header mark.
- uint32_t m_tick = results->rawbuf[offset++] * RAWTICK /
- WHYNTER_HDR_MARK_TICKS;
- if (!matchSpace(results->rawbuf[offset], WHYNTER_HDR_SPACE)) return false;
- // Calculate how long the common tick time is based on the header space.
- uint32_t s_tick = results->rawbuf[offset++] * RAWTICK /
- WHYNTER_HDR_SPACE_TICKS;
-
- // Data
- uint64_t data = 0;
- match_result_t data_result = matchData(&(results->rawbuf[offset]), nbits,
- WHYNTER_BIT_MARK_TICKS * m_tick,
- WHYNTER_ONE_SPACE_TICKS * s_tick,
- WHYNTER_BIT_MARK_TICKS * m_tick,
- WHYNTER_ZERO_SPACE_TICKS * s_tick);
- if (data_result.success == false) return false;
- data = data_result.data;
- offset += data_result.used;
-
- // Footer
- if (!matchMark(results->rawbuf[offset++], WHYNTER_BIT_MARK_TICKS * m_tick))
- return false;
- if (offset < results->rawlen &&
- !matchAtLeast(results->rawbuf[offset], WHYNTER_MIN_GAP_TICKS * s_tick))
- return false;
-
- // Success
- results->decode_type = WHYNTER;
- results->bits = nbits;
- results->value = data;
- results->address = 0;
- results->command = 0;
- return true;
-}
-#endif
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/IRsend_test.cpp b/lib/IRremoteESP8266-2.2.1.02/test/IRsend_test.cpp
deleted file mode 100644
index 3b18ae582cd2..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/test/IRsend_test.cpp
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2017 David Conran
-
-#include "IRsend_test.h"
-#include "IRsend.h"
-#include "gtest/gtest.h"
-
-// Tests sendData().
-
-// Test sending zero bits.
-TEST(TestSendData, SendZeroBits) {
- IRsendTest irsend(4);
- irsend.begin();
- irsend.sendData(1, 2, 3, 4, 0b1, 0, true);
- EXPECT_EQ("", irsend.outputStr());
-}
-
-// Test sending zero and one.
-TEST(TestSendData, SendSingleBit) {
- IRsendTest irsend(4);
- irsend.begin();
- irsend.sendData(1, 2, 3, 4, 0b1, 1, true);
- EXPECT_EQ("m1s2", irsend.outputStr());
- irsend.sendData(1, 2, 3, 4, 0b0, 1, true);
- EXPECT_EQ("m3s4", irsend.outputStr());
-}
-
-// Test sending bit order.
-TEST(TestSendData, TestingBitSendOrder) {
- IRsendTest irsend(4);
- irsend.begin();
- irsend.sendData(1, 2, 3, 4, 0b10, 2, true);
- EXPECT_EQ("m1s2m3s4", irsend.outputStr());
- irsend.sendData(1, 2, 3, 4, 0b10, 2, false);
- EXPECT_EQ("m3s4m1s2", irsend.outputStr());
- irsend.sendData(1, 2, 3, 4, 0b0001, 4, false);
- EXPECT_EQ("m1s2m3s4m3s4m3s4", irsend.outputStr());
-}
-
-// Test sending typical data.
-TEST(TestSendData, SendTypicalData) {
- IRsendTest irsend(4);
- irsend.begin();
- irsend.sendData(1, 2, 3, 4, 0b1010110011110000, 16, true);
- EXPECT_EQ("m1s2m3s4m1s2m3s4m1s2m1s2m3s4m3s4m1s2m1s2m1s2m1s2m3s4m3s4m3s4m3s4",
- irsend.outputStr());
- irsend.sendData(1, 2, 3, 4, 0x1234567890ABCDEF, 64, true);
- EXPECT_EQ("m3s4m3s4m3s4m1s2m3s4m3s4m1s2m3s4m3s4m3s4m1s2m1s2m3s4m1s2m3s4m3s4"
- "m3s4m1s2m3s4m1s2m3s4m1s2m1s2m3s4m3s4m1s2m1s2m1s2m1s2m3s4m3s4m3s4"
- "m1s2m3s4m3s4m1s2m3s4m3s4m3s4m3s4m1s2m3s4m1s2m3s4m1s2m3s4m1s2m1s2"
- "m1s2m1s2m3s4m3s4m1s2m1s2m3s4m1s2m1s2m1s2m1s2m3s4m1s2m1s2m1s2m1s2",
- irsend.outputStr());
-}
-
-// Test sending more than expected bits.
-TEST(TestSendData, SendOverLargeData) {
- IRsendTest irsend(4);
- irsend.begin();
- irsend.sendData(1, 2, 3, 4, 0xFFFFFFFFFFFFFFFF, 70, true);
- EXPECT_EQ("m3s4m3s4m3s4m3s4m3s4m3s4"
- "m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2"
- "m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2"
- "m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2"
- "m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2",
- irsend.outputStr());
-}
-
-// Test inverting the output.
-TEST(TestIRSend, InvertedOutput) {
- IRsendTest irsend(4, true);
- irsend.begin();
- irsend.sendData(1, 2, 3, 4, 0b1, 1, true);
- EXPECT_EQ("s1m2", irsend.outputStr());
- irsend.sendData(1, 2, 3, 4, 0b0, 1, true);
- EXPECT_EQ("s3m4", irsend.outputStr());
-}
-
-// Test typical use of sendRaw().
-TEST(TestSendRaw, GeneralUse) {
- IRsendTest irsend(4);
- IRrecv irrecv(0);
-
- irsend.begin();
- // NEC C3E0E0E8 as measured in #204
- uint16_t rawData[67] = {8950, 4500, 550, 1650, 600, 1650, 550, 550, 600, 500,
- 600, 550, 550, 550, 600, 1650, 550, 1650, 600, 1650,
- 600, 1650, 550, 1700, 550, 550, 600, 550, 550, 550,
- 600, 500, 600, 550, 550, 1650, 600, 1650, 600, 1650,
- 550, 550, 600, 500, 600, 500, 600, 550, 550, 550,
- 600, 1650, 550, 1650, 600, 1650, 600, 500, 650, 1600,
- 600, 500, 600, 550, 550, 550, 600};
-
- irsend.sendRaw(rawData, 67, 38);
- EXPECT_EQ(
- "m8950s4500"
- "m550s1650m600s1650m550s550m600s500m600s550m550s550m600s1650m550s1650"
- "m600s1650m600s1650m550s1700m550s550m600s550m550s550m600s500m600s550"
- "m550s1650m600s1650m600s1650m550s550m600s500m600s500m600s550m550s550"
- "m600s1650m550s1650m600s1650m600s500m650s1600m600s500m600s550m550s550"
- "m600", irsend.outputStr());
-
- irsend.reset();
- irsend.sendRaw(rawData, 67, 38);
- irsend.makeDecodeResult();
- EXPECT_EQ(
- "m8950s4500"
- "m550s1650m600s1650m550s550m600s500m600s550m550s550m600s1650m550s1650"
- "m600s1650m600s1650m550s1700m550s550m600s550m550s550m600s500m600s550"
- "m550s1650m600s1650m600s1650m550s550m600s500m600s500m600s550m550s550"
- "m600s1650m550s1650m600s1650m600s500m650s1600m600s500m600s550m550s550"
- "m600", irsend.outputStr());
- ASSERT_TRUE(irrecv.decodeNEC(&irsend.capture, NEC_BITS, false));
- EXPECT_EQ(NEC, irsend.capture.decode_type);
- EXPECT_EQ(32, irsend.capture.bits);
- EXPECT_EQ(0xC3E0E0E8, irsend.capture.value);
-}
-
-// Incorrect handling of decodes from Raw. i.e. There is no gap recorded at
-// the end of a command when using the interrupt code. sendRaw() best emulates
-// this for unit testing purposes. sendGC() and sendXXX() will add the trailing
-// gap. Users won't see this in normal use.
-TEST(TestSendRaw, NoTrailingGap) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- irsend.reset();
- uint16_t rawData[67] = {9000, 4500, 650, 550, 650, 1650, 600, 550, 650, 550,
- 600, 1650, 650, 550, 600, 1650, 650, 1650, 650, 1650,
- 600, 550, 650, 1650, 650, 1650, 650, 550, 600, 1650,
- 650, 1650, 650, 550, 650, 550, 650, 1650, 650, 550,
- 650, 550, 650, 550, 600, 550, 650, 550, 650, 550,
- 650, 1650, 600, 550, 650, 1650, 650, 1650, 650, 1650,
- 650, 1650, 650, 1650, 650, 1650, 600};
- irsend.sendRaw(rawData, 67, 38);
- irsend.makeDecodeResult();
- EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture));
- EXPECT_EQ(NEC, irsend.capture.decode_type);
- EXPECT_EQ(NEC_BITS, irsend.capture.bits);
-}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/IRsend_test.h b/lib/IRremoteESP8266-2.2.1.02/test/IRsend_test.h
deleted file mode 100644
index 94de487af051..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/test/IRsend_test.h
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2017 David Conran
-
-#ifndef TEST_IRSEND_TEST_H_
-#define TEST_IRSEND_TEST_H_
-
-#define __STDC_LIMIT_MACROS
-#include
-#include
-#include
-#include
-#include "IRrecv.h"
-#include "IRsend.h"
-
-#define OUTPUT_BUF 1000U
-#define RAW_BUF 1000U
-class IRsendTest: public IRsend {
- public:
- uint32_t output[OUTPUT_BUF];
- uint16_t last;
- uint16_t rawbuf[RAW_BUF];
- decode_results capture;
-
- explicit IRsendTest(uint16_t x, bool i = false) : IRsend(x, i) {
- reset();
- }
-
- void reset() {
- last = 0;
- output[last] = 0;
- }
-
- std::string outputStr() {
- std::stringstream result;
- if (last == 0 && output[0] == 0)
- return "";
- for (uint16_t i = 0; i <= last; i++) {
- if ((i & 1) != outputOff ) // Odd XOR outputOff
- result << "s";
- else
- result << "m";
- result << output[i];
- }
- reset();
- return result.str();
- }
-
- void makeDecodeResult(uint16_t offset = 0) {
- capture.decode_type = UNKNOWN;
- capture.bits = 0;
- capture.rawlen = last + 1 - offset;
- capture.overflow = (last - offset >= (int16_t) RAW_BUF);
- capture.repeat = false;
- capture.address = 0;
- capture.command = 0;
- capture.value = 0;
- capture.rawbuf = rawbuf;
- for (uint16_t i = 0;
- (i < RAW_BUF - 1) && (offset < OUTPUT_BUF);
- i++, offset++)
- if (output[offset] / RAWTICK > UINT16_MAX)
- rawbuf[i + 1] = UINT16_MAX;
- else
- rawbuf[i + 1] = output[offset] / RAWTICK;
- }
-
- void dumpRawResult() {
- std::cout << std::dec;
- if (capture.rawlen == 0) return;
- std::cout << "uint16_t rawbuf["<< capture.rawlen - 1 << "] = {";
- for (uint16_t i = 1; i < capture.rawlen; i++) {
- if (i % 8 == 1)
- std::cout << std::endl << " ";
- std::cout << (capture.rawbuf[i] * RAWTICK);
- // std::cout << "(" << capture.rawbuf[i] << ")";
- if (i < capture.rawlen - 1)
- std::cout << ", ";
- }
- std::cout << "};" << std::endl;
- }
-
- void addGap(uint32_t usecs) {
- space(usecs);
- }
-
- protected:
- uint16_t mark(uint16_t usec) {
- if (last >= OUTPUT_BUF)
- return 0;
- if (last & 1) // Is odd? (i.e. last call was a space())
- output[++last] = usec;
- else
- output[last] += usec;
- return 0;
- }
-
- void space(uint32_t time) {
- if (last >= OUTPUT_BUF)
- return;
- if (last & 1) { // Is odd? (i.e. last call was a space())
- output[last] += time;
- } else {
- output[++last] = time;
- }
- }
-};
-#endif // TEST_IRSEND_TEST_H_
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/IRutils_test.cpp b/lib/IRremoteESP8266-2.2.1.02/test/IRutils_test.cpp
deleted file mode 100644
index 3b4c4145ab50..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/test/IRutils_test.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2017 David Conran
-
-#include "IRutils.h"
-#include
-#include "gtest/gtest.h"
-
-// Tests reverseBits().
-
-// Tests reverseBits for typical use.
-TEST(ReverseBitsTest, TypicalUse) {
- EXPECT_EQ(0xF, reverseBits(0xF0, 8));
- EXPECT_EQ(0xFFFF, reverseBits(0xFFFF0000, 32));
- EXPECT_EQ(0x555500005555FFFF, reverseBits(0xFFFFAAAA0000AAAA, 64));
- EXPECT_EQ(0, reverseBits(0, 64));
- EXPECT_EQ(0xFFFFFFFFFFFFFFFF, reverseBits(0xFFFFFFFFFFFFFFFF, 64));
-}
-
-// Tests reverseBits for bit size values <= 1
-TEST(ReverseBitsTest, LessThanTwoBitsReversed) {
- EXPECT_EQ(0x12345678, reverseBits(0x12345678, 1));
- EXPECT_EQ(1234, reverseBits(1234, 0));
-}
-
-// Tests reverseBits for bit size larger than a uint64_t.
-TEST(ReverseBitsTest, LargerThan64BitsReversed) {
- EXPECT_EQ(0, reverseBits(0, 65));
- EXPECT_EQ(0xFFFFFFFFFFFFFFFF, reverseBits(0xFFFFFFFFFFFFFFFF, 100));
- EXPECT_EQ(0x555500005555FFFF, reverseBits(0xFFFFAAAA0000AAAA, 3000));
-}
-
-// Tests reverseBits for bit sizes less than all the data stored.
-TEST(ReverseBitsTest, LessBitsReversedThanInputHasSet) {
- EXPECT_EQ(0xF8, reverseBits(0xF1, 4));
- EXPECT_EQ(0xF5, reverseBits(0xFA, 4));
- EXPECT_EQ(0x12345678FFFF0000, reverseBits(0x123456780000FFFF, 32));
-}
-
-// Tests for uint64ToString()
-
-TEST(TestUint64ToString, TrivialCases) {
- EXPECT_EQ("0", uint64ToString(0)); // Default base (10)
- EXPECT_EQ("0", uint64ToString(0, 2)); // Base-2
- EXPECT_EQ("0", uint64ToString(0, 8)); // Base-8
- EXPECT_EQ("0", uint64ToString(0, 10)); // Base-10
- EXPECT_EQ("0", uint64ToString(0, 16)); // Base-16
-
- EXPECT_EQ("1", uint64ToString(1, 2)); // Base-2
- EXPECT_EQ("2", uint64ToString(2, 8)); // Base-8
- EXPECT_EQ("3", uint64ToString(3, 10)); // Base-10
- EXPECT_EQ("4", uint64ToString(4, 16)); // Base-16
-}
-
-TEST(TestUint64ToString, NormalUse) {
- EXPECT_EQ("12345", uint64ToString(12345));
- EXPECT_EQ("100", uint64ToString(4, 2));
- EXPECT_EQ("3039", uint64ToString(12345, 16));
- EXPECT_EQ("123456", uint64ToString(123456));
- EXPECT_EQ("1E240", uint64ToString(123456, 16));
- EXPECT_EQ("FEEDDEADBEEF", uint64ToString(0xfeeddeadbeef, 16));
-}
-
-TEST(TestUint64ToString, Max64Bit) {
- EXPECT_EQ("18446744073709551615", uint64ToString(UINT64_MAX)); // Default
- EXPECT_EQ("1111111111111111111111111111111111111111111111111111111111111111",
- uint64ToString(UINT64_MAX, 2)); // Base-2
- EXPECT_EQ("1777777777777777777777", uint64ToString(UINT64_MAX, 8)); // Base-8
- EXPECT_EQ("18446744073709551615", uint64ToString(UINT64_MAX, 10)); // Base-10
- EXPECT_EQ("FFFFFFFFFFFFFFFF", uint64ToString(UINT64_MAX, 16)); // Base-16
-}
-
-TEST(TestUint64ToString, Max32Bit) {
- EXPECT_EQ("4294967295", uint64ToString(UINT32_MAX)); // Default
- EXPECT_EQ("37777777777", uint64ToString(UINT32_MAX, 8)); // Base-8
- EXPECT_EQ("4294967295", uint64ToString(UINT32_MAX, 10)); // Base-10
- EXPECT_EQ("FFFFFFFF", uint64ToString(UINT32_MAX, 16)); // Base-16
-}
-
-TEST(TestUint64ToString, InterestingCases) {
- // Previous hacky-code didn't handle leading zeros in the lower 32 bits.
- EXPECT_EQ("100000000", uint64ToString(0x100000000, 16));
- EXPECT_EQ("100000001", uint64ToString(0x100000001, 16));
-}
-
-TEST(TestUint64ToString, SillyBases) {
- // If we are given a silly base, we should defer to Base-10.
- EXPECT_EQ("12345", uint64ToString(12345, 0)); // Super silly, makes no sense.
- EXPECT_EQ("12345", uint64ToString(12345, 1)); // We don't do unary.
- EXPECT_EQ("12345", uint64ToString(12345, 100)); // We can't print base-100.
- EXPECT_EQ("12345", uint64ToString(12345, 37)); // Base-37 is one to far.
- EXPECT_EQ("9IX", uint64ToString(12345, 36)); // But we *can* do base-36.
-}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_Daikin_test.cpp b/lib/IRremoteESP8266-2.2.1.02/test/ir_Daikin_test.cpp
deleted file mode 100644
index b516008c1c5a..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_Daikin_test.cpp
+++ /dev/null
@@ -1,419 +0,0 @@
-// Copyright 2017 David Conran
-
-#include "IRsend.h"
-#include "IRsend_test.h"
-#include "ir_Daikin.h"
-#include "gtest/gtest.h"
-
-// Tests for sendDaikin().
-
-// Test sending typical data only.
-TEST(TestSendDaikin, SendDataOnly) {
- IRsendTest irsend(4);
- irsend.begin();
-
- uint8_t daikin_code[DAIKIN_COMMAND_LENGTH] = {
- 0x11, 0xDA, 0x27, 0xF0, 0x00, 0x00, 0x00, 0x20,
- 0x11, 0xDA, 0x27, 0x00, 0x00, 0x41, 0x1E, 0x00,
- 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xE3};
-
- irsend.reset();
- irsend.sendDaikin(daikin_code);
- EXPECT_EQ(
- "m3650s1623"
- "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
- "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
- "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s1280m428s1280m428s1280m428s1280"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s1280m428s428m428s428"
- "m428s29428"
- "m3650s1623"
- "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
- "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
- "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s1280m428s428m428s428m428s428m428s428m428s428m428s1280m428s428"
- "m428s428m428s1280m428s1280m428s1280m428s1280m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s1280m428s1280m428s428m428s1280"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s1280m428s1280"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s1280m428s1280m428s428m428s428m428s428m428s1280m428s1280m428s1280"
- "m428s29428", irsend.outputStr());
-}
-
-// Test sending with repeats.
-TEST(TestSendDaikin, SendWithRepeats) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- uint8_t daikin_code[DAIKIN_COMMAND_LENGTH] = {
- 0x11, 0xDA, 0x27, 0xF0, 0x00, 0x00, 0x00, 0x20,
- 0x11, 0xDA, 0x27, 0x00, 0x00, 0x41, 0x1E, 0x00,
- 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xE3};
- irsend.reset();
-
- irsend.sendDaikin(daikin_code, DAIKIN_COMMAND_LENGTH, 1);
- EXPECT_EQ(
- "m3650s1623"
- "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
- "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
- "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s1280m428s1280m428s1280m428s1280"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s1280m428s428m428s428"
- "m428s29428"
- "m3650s1623"
- "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
- "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
- "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s1280m428s428m428s428m428s428m428s428m428s428m428s1280m428s428"
- "m428s428m428s1280m428s1280m428s1280m428s1280m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s1280m428s1280m428s428m428s1280"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s1280m428s1280"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s1280m428s1280m428s428m428s428m428s428m428s1280m428s1280m428s1280"
- "m428s29428"
- "m3650s1623"
- "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
- "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
- "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s1280m428s1280m428s1280m428s1280"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s1280m428s428m428s428"
- "m428s29428"
- "m3650s1623"
- "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
- "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
- "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s1280m428s428m428s428m428s428m428s428m428s428m428s1280m428s428"
- "m428s428m428s1280m428s1280m428s1280m428s1280m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s1280m428s1280m428s428m428s1280"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s1280m428s1280"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s1280m428s1280m428s428m428s428m428s428m428s1280m428s1280m428s1280"
- "m428s29428", irsend.outputStr());
-}
-
-// Test sending atypical sizes.
-TEST(TestSendDaikin, SendUnexpectedSizes) {
- IRsendTest irsend(4);
- irsend.begin();
-
- uint8_t daikin_short_code[DAIKIN_COMMAND_LENGTH - 1] = {
- 0x11, 0xDA, 0x27, 0xF0, 0x00, 0x00, 0x00, 0x20,
- 0x11, 0xDA, 0x27, 0x00, 0x00, 0x41, 0x1E, 0x00,
- 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00};
-
- irsend.reset();
- irsend.sendDaikin(daikin_short_code, DAIKIN_COMMAND_LENGTH - 1);
- ASSERT_EQ("", irsend.outputStr());
-
- uint8_t daikin_long_code[DAIKIN_COMMAND_LENGTH + 1] = {
- 0x11, 0xDA, 0x27, 0xF0, 0x00, 0x00, 0x00, 0x20,
- 0x11, 0xDA, 0x27, 0x00, 0x00, 0x41, 0x1E, 0x00,
- 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xE3, 0x11};
- irsend.reset();
- irsend.sendDaikin(daikin_long_code, DAIKIN_COMMAND_LENGTH + 1);
- ASSERT_EQ(
- "m3650s1623"
- "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
- "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
- "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s1280m428s1280m428s1280m428s1280"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s1280m428s428m428s428"
- "m428s29428"
- "m3650s1623"
- "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
- "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
- "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s1280m428s428m428s428m428s428m428s428m428s428m428s1280m428s428"
- "m428s428m428s1280m428s1280m428s1280m428s1280m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s1280m428s1280m428s428m428s1280"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s1280m428s1280"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s1280m428s1280m428s428m428s428m428s428m428s1280m428s1280m428s1280"
- "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
- "m428s29428", irsend.outputStr());
-}
-
-// Tests for IRDaikinESP class.
-
-TEST(TestDaikinClass, Power) {
- IRDaikinESP irdaikin(0);
- irdaikin.begin();
-
- irdaikin.on();
- EXPECT_TRUE(irdaikin.getPower());
-
- irdaikin.off();
- EXPECT_FALSE(irdaikin.getPower());
-
- irdaikin.setPower(true);
- EXPECT_TRUE(irdaikin.getPower());
-
- irdaikin.setPower(false);
- EXPECT_FALSE(irdaikin.getPower());
-}
-
-TEST(TestDaikinClass, Temperature) {
- IRDaikinESP irdaikin(0);
- irdaikin.begin();
-
- irdaikin.setTemp(0);
- EXPECT_EQ(DAIKIN_MIN_TEMP, irdaikin.getTemp());
-
- irdaikin.setTemp(255);
- EXPECT_EQ(DAIKIN_MAX_TEMP, irdaikin.getTemp());
-
- irdaikin.setTemp(DAIKIN_MIN_TEMP);
- EXPECT_EQ(DAIKIN_MIN_TEMP, irdaikin.getTemp());
-
- irdaikin.setTemp(DAIKIN_MAX_TEMP);
- EXPECT_EQ(DAIKIN_MAX_TEMP, irdaikin.getTemp());
-
- irdaikin.setTemp(DAIKIN_MIN_TEMP - 1);
- EXPECT_EQ(DAIKIN_MIN_TEMP, irdaikin.getTemp());
-
- irdaikin.setTemp(DAIKIN_MAX_TEMP + 1);
- EXPECT_EQ(DAIKIN_MAX_TEMP, irdaikin.getTemp());
-
- irdaikin.setTemp(DAIKIN_MIN_TEMP + 1);
- EXPECT_EQ(DAIKIN_MIN_TEMP + 1, irdaikin.getTemp());
-
- irdaikin.setTemp(21);
- EXPECT_EQ(21, irdaikin.getTemp());
-
- irdaikin.setTemp(25);
- EXPECT_EQ(25, irdaikin.getTemp());
-
- irdaikin.setTemp(29);
- EXPECT_EQ(29, irdaikin.getTemp());
-}
-
-TEST(TestDaikinClass, OperatingMode) {
- IRDaikinESP irdaikin(0);
- irdaikin.begin();
-
- irdaikin.setMode(DAIKIN_AUTO);
- EXPECT_EQ(DAIKIN_AUTO, irdaikin.getMode());
-
- irdaikin.setMode(DAIKIN_COOL);
- EXPECT_EQ(DAIKIN_COOL, irdaikin.getMode());
-
- irdaikin.setMode(DAIKIN_HEAT);
- EXPECT_EQ(DAIKIN_HEAT, irdaikin.getMode());
-
- irdaikin.setMode(DAIKIN_DRY);
- EXPECT_EQ(DAIKIN_DRY, irdaikin.getMode());
-
- irdaikin.setMode(DAIKIN_FAN);
- EXPECT_EQ(DAIKIN_FAN, irdaikin.getMode());
-
- irdaikin.setMode(DAIKIN_FAN + 1);
- EXPECT_EQ(DAIKIN_AUTO, irdaikin.getMode());
-
- irdaikin.setMode(DAIKIN_AUTO + 1);
- EXPECT_EQ(DAIKIN_AUTO, irdaikin.getMode());
-
- irdaikin.setMode(255);
- EXPECT_EQ(DAIKIN_AUTO, irdaikin.getMode());
-}
-
-TEST(TestDaikinClass, VaneSwing) {
- IRDaikinESP irdaikin(0);
- irdaikin.begin();
-
- irdaikin.setSwingHorizontal(true);
- irdaikin.setSwingVertical(false);
-
- irdaikin.setSwingHorizontal(true);
- EXPECT_TRUE(irdaikin.getSwingHorizontal());
- EXPECT_FALSE(irdaikin.getSwingVertical());
-
- irdaikin.setSwingVertical(true);
- EXPECT_TRUE(irdaikin.getSwingHorizontal());
- EXPECT_TRUE(irdaikin.getSwingVertical());
-
- irdaikin.setSwingHorizontal(false);
- EXPECT_FALSE(irdaikin.getSwingHorizontal());
- EXPECT_TRUE(irdaikin.getSwingVertical());
-
- irdaikin.setSwingVertical(false);
- EXPECT_FALSE(irdaikin.getSwingHorizontal());
- EXPECT_FALSE(irdaikin.getSwingVertical());
-}
-
-TEST(TestDaikinClass, QuietMode) {
- IRDaikinESP irdaikin(0);
- irdaikin.begin();
-
- irdaikin.setQuiet(true);
- EXPECT_TRUE(irdaikin.getQuiet());
-
- irdaikin.setQuiet(false);
- EXPECT_FALSE(irdaikin.getQuiet());
-
- irdaikin.setQuiet(true);
- EXPECT_TRUE(irdaikin.getQuiet());
-
- irdaikin.setPowerful(true);
- EXPECT_FALSE(irdaikin.getQuiet());
-}
-
-TEST(TestDaikinClass, PowerfulMode) {
- IRDaikinESP irdaikin(0);
- irdaikin.begin();
-
- irdaikin.setPowerful(true);
- EXPECT_TRUE(irdaikin.getPowerful());
-
- irdaikin.setPowerful(false);
- EXPECT_FALSE(irdaikin.getPowerful());
-
- irdaikin.setPowerful(true);
- EXPECT_TRUE(irdaikin.getPowerful());
-
- irdaikin.setQuiet(true);
- EXPECT_FALSE(irdaikin.getPowerful());
-}
-
-TEST(TestDaikinClass, FanSpeed) {
- IRDaikinESP irdaikin(0);
- irdaikin.begin();
-
- irdaikin.setFan(0);
- EXPECT_EQ(0, irdaikin.getFan());
-
- irdaikin.setFan(255);
- EXPECT_EQ(DAIKIN_FAN_MAX, irdaikin.getFan());
-
- irdaikin.setFan(DAIKIN_FAN_MAX);
- EXPECT_EQ(DAIKIN_FAN_MAX, irdaikin.getFan());
-
- irdaikin.setFan(DAIKIN_FAN_MAX + 1);
- EXPECT_EQ(DAIKIN_FAN_MAX, irdaikin.getFan());
-
- irdaikin.setFan(DAIKIN_FAN_MAX - 1);
- EXPECT_EQ(DAIKIN_FAN_MAX - 1, irdaikin.getFan());
-
- irdaikin.setFan(DAIKIN_FAN_MIN);
- EXPECT_EQ(DAIKIN_FAN_MIN, irdaikin.getFan());
-
- irdaikin.setFan(DAIKIN_FAN_MIN + 1);
- EXPECT_EQ(DAIKIN_FAN_MIN + 1, irdaikin.getFan());
-
- irdaikin.setFan(3);
- EXPECT_EQ(3, irdaikin.getFan());
-
- irdaikin.setFan(DAIKIN_FAN_AUTO);
- EXPECT_EQ(DAIKIN_FAN_AUTO, irdaikin.getFan());
-}
-
-TEST(TestDaikinClass, MessageConstuction) {
- IRDaikinESP irdaikin(0);
- IRsendTest irsend(4);
- irdaikin.begin();
- irsend.begin();
-
- irdaikin.setFan(DAIKIN_FAN_MIN);
- irdaikin.setMode(DAIKIN_COOL);
- irdaikin.setTemp(27);
- irdaikin.setSwingVertical(false);
- irdaikin.setSwingHorizontal(true);
- irdaikin.setQuiet(false);
- irdaikin.setPower(true);
-
- // Check everything for kicks.
- EXPECT_EQ(DAIKIN_FAN_MIN, irdaikin.getFan());
- EXPECT_EQ(DAIKIN_COOL, irdaikin.getMode());
- EXPECT_EQ(27, irdaikin.getTemp());
- EXPECT_FALSE(irdaikin.getSwingVertical());
- EXPECT_TRUE(irdaikin.getSwingHorizontal());
- EXPECT_FALSE(irdaikin.getQuiet());
- EXPECT_TRUE(irdaikin.getPower());
-
- irsend.reset();
- irsend.sendDaikin(irdaikin.getRaw());
- EXPECT_EQ(
- "m3650s1623"
- "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
- "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
- "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s1280m428s1280m428s1280m428s1280"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s1280m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s29428"
- "m3650s1623"
- "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
- "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
- "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s1280m428s428m428s428m428s428m428s1280m428s1280m428s428m428s428"
- "m428s428m428s1280m428s1280m428s428m428s1280m428s1280m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s1280m428s1280m428s428m428s428"
- "m428s1280m428s1280m428s1280m428s1280m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s1280m428s1280"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
- "m428s428m428s428m428s428m428s1280m428s1280m428s1280m428s1280m428s428"
- "m428s29428", irsend.outputStr());
-}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_Fujitsu_test.cpp b/lib/IRremoteESP8266-2.2.1.02/test/ir_Fujitsu_test.cpp
deleted file mode 100644
index f1b6c04f67ca..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_Fujitsu_test.cpp
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright 2017 Jonny Graham
-
-#include "IRsend.h"
-#include "IRsend_test.h"
-#include "ir_Fujitsu.h"
-#include "gtest/gtest.h"
-
-template
-::testing::AssertionResult ArraysMatch(const T (&expected)[size],
- const T* actual) {
- for (size_t i(0); i < size; ++i) {
- if (expected[i] != actual[i]) {
- int e = expected[i];
- int a = actual[i];
- return ::testing::AssertionFailure() << "array[" << i
- << "] (" << std::hex << a << std::dec << ") != expected[" << i
- << "] (" << std::hex << e << std::dec << ")";
- }
- }
-
- return ::testing::AssertionSuccess();
-}
-// Tests for Mitsubishi A/C methods.
-
-// Test sending typical data only.
-TEST(TestSendFujitsuAC, GetRawDefault) {
- IRFujitsuAC fujitsuACSender = IRFujitsuAC(4);
- fujitsuACSender.setCmd(FUJITSU_AC_CMD_TURN_ON);
- fujitsuACSender.setSwing(FUJITSU_AC_SWING_BOTH);
- fujitsuACSender.setMode(FUJITSU_AC_MODE_COOL);
- fujitsuACSender.setFanSpeed(FUJITSU_AC_FAN_HIGH);
- fujitsuACSender.setTemp(24);
- uint8_t expected[16] = {0x14, 0x63, 0x0, 0x10, 0x10, 0xFE, 0x9, 0x30,
- 0x81, 0x1, 0x31, 0x0, 0x0, 0x0, 0x20, 0xFD};
- EXPECT_TRUE(ArraysMatch(expected, fujitsuACSender.getRaw()));
-}
-
-TEST(TestSendFujitsuAC, GetRawTurnOff) {
- IRFujitsuAC fujitsuACSender = IRFujitsuAC(4);
- fujitsuACSender.off();
- uint8_t expected[7] = {0x14, 0x63, 0x0, 0x10, 0x10, 0x02, 0xFD};
- EXPECT_TRUE(ArraysMatch(expected, fujitsuACSender.getRaw()));
-}
-TEST(TestSendFujitsuAC, GetRawStepHoriz) {
- IRFujitsuAC fujitsuACSender = IRFujitsuAC(4);
- fujitsuACSender.stepHoriz();
- uint8_t expected[7] = {0x14, 0x63, 0x0, 0x10, 0x10, 0x79, 0x86};
- EXPECT_TRUE(ArraysMatch(expected, fujitsuACSender.getRaw()));
-}
-TEST(TestSendFujitsuAC, GetRawStepVert) {
- IRFujitsuAC fujitsuACSender = IRFujitsuAC(4);
- fujitsuACSender.stepVert();
- uint8_t expected[7] = {0x14, 0x63, 0x0, 0x10, 0x10, 0x6C, 0x93};
- EXPECT_TRUE(ArraysMatch(expected, fujitsuACSender.getRaw()));
-}
-
-TEST(TestSendFujitsuAC, GetRawWithSwingHoriz) {
- IRFujitsuAC fujitsuACSender = IRFujitsuAC(4);
- fujitsuACSender.setCmd(FUJITSU_AC_CMD_STAY_ON);
- fujitsuACSender.setSwing(FUJITSU_AC_SWING_HORIZ);
- fujitsuACSender.setMode(FUJITSU_AC_MODE_COOL);
- fujitsuACSender.setFanSpeed(FUJITSU_AC_FAN_QUIET);
- fujitsuACSender.setTemp(25);
- uint8_t expected[16] = {0x14, 0x63, 0x0, 0x10, 0x10, 0xFE, 0x9, 0x30,
- 0x90, 0x1, 0x24, 0x0, 0x0, 0x0, 0x20, 0xFB};
- EXPECT_TRUE(ArraysMatch(expected, fujitsuACSender.getRaw()));
-}
-
-TEST(TestSendFujitsuAC, GetRawWithFan) {
- IRFujitsuAC fujitsuACSender = IRFujitsuAC(4);
- fujitsuACSender.setCmd(FUJITSU_AC_CMD_STAY_ON);
- fujitsuACSender.setSwing(FUJITSU_AC_SWING_HORIZ);
- fujitsuACSender.setMode(FUJITSU_AC_MODE_FAN);
- fujitsuACSender.setFanSpeed(FUJITSU_AC_FAN_MED);
- fujitsuACSender.setTemp(20); // temp doesn't matter for fan
- // but it is sent by the RC anyway
- uint8_t expected[16] = {0x14, 0x63, 0x0, 0x10, 0x10, 0xFE, 0x9, 0x30,
- 0x40, 0x3, 0x22, 0x0, 0x0, 0x0, 0x20, 0x4B};
- EXPECT_TRUE(ArraysMatch(expected, fujitsuACSender.getRaw()));
-}
-
-TEST(TestSendFujitsuAC, GenerateMessage) {
- IRFujitsuAC fujitsuACSender = IRFujitsuAC(4);
- IRsendTest irsend(4);
- fujitsuACSender.begin();
- irsend.begin();
-
- fujitsuACSender.setCmd(FUJITSU_AC_CMD_STAY_ON);
- fujitsuACSender.setSwing(FUJITSU_AC_SWING_BOTH);
- fujitsuACSender.setMode(FUJITSU_AC_MODE_COOL);
- fujitsuACSender.setFanSpeed(FUJITSU_AC_FAN_HIGH);
- fujitsuACSender.setTemp(24);
-
- EXPECT_EQ(FUJITSU_AC_FAN_HIGH, fujitsuACSender.getFanSpeed());
- EXPECT_EQ(FUJITSU_AC_MODE_COOL, fujitsuACSender.getMode());
- EXPECT_EQ(24, fujitsuACSender.getTemp());
- EXPECT_EQ(FUJITSU_AC_SWING_BOTH, fujitsuACSender.getSwing());
- EXPECT_EQ(FUJITSU_AC_CMD_STAY_ON, fujitsuACSender.getCmd());
-
- irsend.reset();
- irsend.sendFujitsuAC(fujitsuACSender.getRaw(), FUJITSU_AC_STATE_LENGTH);
- EXPECT_EQ(
- "m3224s1574m448s367m448s367m448s1182m448s367m448s1182m448s367m448s367m448"
- "s367m448s1182m448s1182m448s367m448s367m448s367m448s1182m448s1182m448s367"
- "m448s367m448s367m448s367m448s367m448s367m448s367m448s367m448s367m448"
- "s367m448s367m448s367m448s367m448s1182m448s367m448s367m448s367m448s367m448"
- "s367m448s367m448s367m448s1182m448s367m448s367m448s367m448s367m448s1182"
- "m448s1182m448s1182m448s1182m448s1182m448s1182m448s1182m448s1182m448s367"
- "m448s367m448s1182m448s367m448s367m448s367m448s367m448s367m448s367m448s367"
- "m448s367m448s1182m448s1182m448s367m448s367m448s367m448s367m448s367m448s367"
- "m448s367m448s367m448s367m448s1182m448s1182m448s367m448s367m448s367m448"
- "s367m448s367m448s367m448s367m448s1182m448s367m448s367m448s367m448s1182m448"
- "s1182m448s367m448s367m448s367m448s367m448s367m448s367m448s367m448s367m448"
- "s367m448s367m448s367m448s367m448s367m448s367m448s367m448s367m448s367m448"
- "s367m448s367m448s367m448s367m448s367m448s367m448s367m448s367m448s367m448"
- "s367m448s367m448s367m448s367m448s367m448s1182m448s367m448s367m448s367m448"
- "s1182m448s1182m448s1182m448s1182m448s1182m448s1182m448s1182m448s8100",
- irsend.outputStr());
-}
-TEST(TestSendFujitsuAC, GenerateShortMessage) {
- IRFujitsuAC fujitsuACSender = IRFujitsuAC(4);
- IRsendTest irsend(4);
- fujitsuACSender.begin();
- irsend.begin();
-
- fujitsuACSender.off();
-
- EXPECT_EQ(FUJITSU_AC_CMD_TURN_OFF, fujitsuACSender.getCmd());
-
- irsend.reset();
- irsend.sendFujitsuAC(fujitsuACSender.getRaw(), FUJITSU_AC_STATE_LENGTH_SHORT);
- EXPECT_EQ(
- "m3224s1574m448s367m448s367m448s1182m448s367m448s1182m448s367m448s367m448"
- "s367m448s1182m448s1182m448s367m448s367m448s367m448s1182m448s1182m448s367"
- "m448s367m448s367m448s367m448s367m448s367m448s367m448s367m448s367m448s367"
- "m448s367m448s367m448s367m448s1182m448s367m448s367m448s367m448s367m448s367"
- "m448s367m448s367m448s1182m448s367m448s367m448s367m448s367m448s1182m448s367"
- "m448s367m448s367m448s367m448s367m448s367m448s1182m448s367m448s1182m448"
- "s1182m448s1182m448s1182m448s1182m448s1182m448s8100",
- irsend.outputStr());
-}
-
-// Issue #275
-TEST(TestSendFujitsuAC, Issue275) {
- IRFujitsuAC fujitsuACSender = IRFujitsuAC(4);
- IRsendTest irsend(4);
- fujitsuACSender.begin();
- irsend.begin();
- irsend.reset();
-
- fujitsuACSender.setCmd(FUJITSU_AC_CMD_TURN_OFF);
- irsend.sendFujitsuAC(fujitsuACSender.getRaw(), FUJITSU_AC_STATE_LENGTH_SHORT);
- EXPECT_EQ(
- // Header
- "m3224s1574"
- // 0 0 1 0 1 0 0 0 (0x28)
- "m448s367m448s367m448s1182m448s367m448s1182m448s367m448s367m448s367"
- // 1 1 0 0 0 1 1 0 (0xC6)
- "m448s1182m448s1182m448s367m448s367m448s367m448s1182m448s1182m448s367"
- // 0 0 0 0 0 0 0 0 (0x00)
- "m448s367m448s367m448s367m448s367m448s367m448s367m448s367m448s367"
- // 0 0 0 0 1 0 0 0 (0x08)
- "m448s367m448s367m448s367m448s367m448s1182m448s367m448s367m448s367"
- // 0 0 0 0 1 0 0 0 (0x08)
- "m448s367m448s367m448s367m448s367m448s1182m448s367m448s367m448s367"
- // 0 1 0 0 0 0 0 0 (0x40)
- "m448s367m448s1182m448s367m448s367m448s367m448s367m448s367m448s367"
- // 1 0 1 1 1 1 1 1 (0xBF)
- "m448s1182m448s367m448s1182m448s1182m448s1182m448s1182m448s1182m448s1182"
- // Footer
- "m448s8100", irsend.outputStr());
-
- irsend.reset();
- // Per report in Issue #275
- uint16_t off[115] = {
- 3350, 1650,
- 450, 400, 450, 450, 450, 1250, 450, 400, 450, 1250, 450, 400, 450, 400,
- 450, 400, 450, 1250, 450, 1250, 450, 400, 450, 400, 450, 400, 450, 1250,
- 450, 1250, 450, 400, 450, 400, 450, 400, 450, 400, 450, 400, 450, 400,
- 450, 400, 450, 400, 450, 400, 450, 400, 450, 400, 450, 400, 450, 400,
- 450, 1250, 450, 400, 450, 400, 450, 400, 450, 400, 450, 400, 450, 400,
- 450, 400, 450, 1250, 450, 400, 450, 400, 450, 400, 450, 400, 450, 1250,
- 450, 400, 450, 400, 450, 400, 450, 400, 450, 400, 450, 400, 450, 1250,
- 450, 400, 450, 1250, 450, 1250, 450, 1250, 450, 1250, 450, 1250,
- 450, 1250, 450};
- irsend.sendRaw(off, 115, 38);
- EXPECT_EQ(
- // Header
- "m3350s1650"
- // 0 0 1 0 1 0 0 0 (0x28)
- "m450s400m450s450m450s1250m450s400m450s1250m450s400m450s400m450s400"
- // 1 1 0 0 0 1 1 0 (0xC6)
- "m450s1250m450s1250m450s400m450s400m450s400m450s1250m450s1250m450s400"
- // 0 0 0 0 0 0 0 0 (0x00)
- "m450s400m450s400m450s400m450s400m450s400m450s400m450s400m450s400"
- // 0 0 0 0 1 0 0 0 (0x08)
- "m450s400m450s400m450s400m450s400m450s1250m450s400m450s400m450s400"
- // 0 0 0 0 1 0 0 0 (0x08)
- "m450s400m450s400m450s400m450s400m450s1250m450s400m450s400m450s400"
- // 0 1 0 0 0 0 0 0 (0x40)
- "m450s400m450s1250m450s400m450s400m450s400m450s400m450s400m450s400"
- // 1 0 1 1 1 1 1 1 (0xBF)
- "m450s1250m450s400m450s1250m450s1250m450s1250m450s1250m450s1250m450s1250"
- // Footer
- "m450",
- irsend.outputStr());
-}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_GlobalCache_test.cpp b/lib/IRremoteESP8266-2.2.1.02/test/ir_GlobalCache_test.cpp
deleted file mode 100644
index c2e9762a2dce..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_GlobalCache_test.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2017 David Conran
-
-#include "IRsend.h"
-#include "IRsend_test.h"
-#include "gtest/gtest.h"
-
-// Tests for sendGlobalCache().
-
-// Test sending a typical command wihtout a repeat.
-TEST(TestSendGlobalCache, NonRepeatingCode) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
- irsend.reset();
-
- // Modified NEC TV "Power On" from Global Cache with no repeats
- uint16_t gc_test[71] = {38000, 1, 1, 342, 172, 21, 22, 21, 21, 21, 65, 21, 21,
- 21, 22, 21, 22, 21, 21, 21, 22, 21, 65, 21, 65, 21,
- 22, 21, 65, 21, 65, 21, 65, 21, 65, 21, 65, 21, 65,
- 21, 22, 21, 22, 21, 21, 21, 22, 21, 22, 21, 65, 21,
- 22, 21, 21, 21, 65, 21, 65, 21, 65, 21, 64, 22, 65,
- 21, 22, 21, 65, 21, 1519};
- irsend.sendGC(gc_test, 71);
- irsend.makeDecodeResult();
- EXPECT_EQ("m8892s4472m546s572m546s546m546s1690m546s546m546s572m546s572"
- "m546s546m546s572m546s1690m546s1690m546s572m546s1690m546s1690"
- "m546s1690m546s1690m546s1690m546s1690m546s572m546s572m546s546"
- "m546s572m546s572m546s1690m546s572m546s546m546s1690m546s1690"
- "m546s1690m546s1664m572s1690m546s572m546s1690m546s39494",
- irsend.outputStr());
- EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture));
- EXPECT_EQ(NEC, irsend.capture.decode_type);
- EXPECT_EQ(NEC_BITS, irsend.capture.bits);
- EXPECT_EQ(0x20DF827D, irsend.capture.value);
- EXPECT_EQ(0x4, irsend.capture.address);
- EXPECT_EQ(0x41, irsend.capture.command);
-}
-
-// Test sending typical command with repeats.
-TEST(TestSendGlobalCache, RepeatCode) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
- irsend.reset();
-
- // Sherwood (NEC-like) "Power On" from Global Cache with 2 repeats
- uint16_t gc_test[75] = {38000, 2, 69, 341, 171, 21, 64, 21, 64, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 64, 21, 64, 21, 21,
- 21, 64, 21, 21, 21, 21, 21, 21, 21, 64, 21, 21, 21,
- 64, 21, 21, 21, 21, 21, 21, 21, 64, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 64, 21, 64, 21, 64, 21, 21, 21,
- 64, 21, 64, 21, 64, 21, 1600, 341, 85, 21, 3647};
- irsend.sendGC(gc_test, 75);
- irsend.makeDecodeResult();
- EXPECT_EQ("m8866s4446m546s1664m546s1664m546s546m546s546m546s546m546s546"
- "m546s546m546s1664m546s1664m546s546m546s1664m546s546m546s546"
- "m546s546m546s1664m546s546m546s1664m546s546m546s546m546s546"
- "m546s1664m546s546m546s546m546s546m546s546m546s1664m546s1664"
- "m546s1664m546s546m546s1664m546s1664m546s1664m546s41600"
- "m8866s2210m546s94822"
- "m8866s2210m546s94822", irsend.outputStr());
- EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture));
- EXPECT_EQ(NEC, irsend.capture.decode_type);
- EXPECT_EQ(NEC_BITS, irsend.capture.bits);
- EXPECT_EQ(0xC1A28877, irsend.capture.value);
- EXPECT_EQ(0x4583, irsend.capture.address);
- EXPECT_EQ(0x11, irsend.capture.command);
-}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_Gree_test.cpp b/lib/IRremoteESP8266-2.2.1.02/test/ir_Gree_test.cpp
deleted file mode 100644
index 80a3dec1d992..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_Gree_test.cpp
+++ /dev/null
@@ -1,192 +0,0 @@
-// Copyright 2017 David Conran
-
-#include "IRsend.h"
-#include "IRsend_test.h"
-#include "gtest/gtest.h"
-
-// Tests for sendGree().
-
-// Test sending typical data only.
-TEST(TestSendGreeChars, SendData) {
- IRsendTest irsend(4);
- irsend.begin();
-
- uint8_t gree_code[GREE_STATE_LENGTH] = {
- 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};
- irsend.reset();
- irsend.sendGree(gree_code);
- EXPECT_EQ(
- "m9000s4000"
- "m620s540m620s1600m620s540m620s540m620s1600m620s540m620s540m620s540"
- "m620s540m620s540m620s1600m620s540m620s1600m620s1600m620s540m620s540"
- "m620s540m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540"
- "m620s540m620s540m620s540m620s1600m620s1600m620s1600m620s1600m620s540"
- "m620s540m620s1600m620s540"
- "m620s19000"
- "m620s540m620s540m620s540m620s540m620s1600m620s540m620s540m620s1600"
- "m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540m620s1600"
- "m620s1600m620s540m620s1600m620s1600m620s540m620s540m620s1600m620s1600"
- "m620s1600m620s1600m620s1600m620s1600m620s540m620s1600m620s1600m620s1600"
- "m620s19000", irsend.outputStr());
-}
-
-TEST(TestSendGreeUint64, SendData) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendGree(0x1234567890ABCDEF);
- EXPECT_EQ(
- "m9000s4000"
- "m620s540m620s1600m620s540m620s540m620s1600m620s540m620s540m620s540"
- "m620s540m620s540m620s1600m620s540m620s1600m620s1600m620s540m620s540"
- "m620s540m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540"
- "m620s540m620s540m620s540m620s1600m620s1600m620s1600m620s1600m620s540"
- "m620s540m620s1600m620s540"
- "m620s19000"
- "m620s540m620s540m620s540m620s540m620s1600m620s540m620s540m620s1600"
- "m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540m620s1600"
- "m620s1600m620s540m620s1600m620s1600m620s540m620s540m620s1600m620s1600"
- "m620s1600m620s1600m620s1600m620s1600m620s540m620s1600m620s1600m620s1600"
- "m620s19000", irsend.outputStr());
-}
-
-// Test sending with repeats.
-TEST(TestSendGreeChars, SendWithRepeats) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- uint8_t gree_code[GREE_STATE_LENGTH] = {
- 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};
- irsend.reset();
-
- irsend.sendGree(gree_code, GREE_STATE_LENGTH, 1);
- EXPECT_EQ(
- "m9000s4000"
- "m620s540m620s1600m620s540m620s540m620s1600m620s540m620s540m620s540"
- "m620s540m620s540m620s1600m620s540m620s1600m620s1600m620s540m620s540"
- "m620s540m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540"
- "m620s540m620s540m620s540m620s1600m620s1600m620s1600m620s1600m620s540"
- "m620s540m620s1600m620s540"
- "m620s19000"
- "m620s540m620s540m620s540m620s540m620s1600m620s540m620s540m620s1600"
- "m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540m620s1600"
- "m620s1600m620s540m620s1600m620s1600m620s540m620s540m620s1600m620s1600"
- "m620s1600m620s1600m620s1600m620s1600m620s540m620s1600m620s1600m620s1600"
- "m620s19000"
- "m9000s4000"
- "m620s540m620s1600m620s540m620s540m620s1600m620s540m620s540m620s540"
- "m620s540m620s540m620s1600m620s540m620s1600m620s1600m620s540m620s540"
- "m620s540m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540"
- "m620s540m620s540m620s540m620s1600m620s1600m620s1600m620s1600m620s540"
- "m620s540m620s1600m620s540"
- "m620s19000"
- "m620s540m620s540m620s540m620s540m620s1600m620s540m620s540m620s1600"
- "m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540m620s1600"
- "m620s1600m620s540m620s1600m620s1600m620s540m620s540m620s1600m620s1600"
- "m620s1600m620s1600m620s1600m620s1600m620s540m620s1600m620s1600m620s1600"
- "m620s19000", irsend.outputStr());
-}
-
-TEST(TestSendGreeUint64, SendWithRepeats) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendGree(0x1234567890ABCDEF, GREE_BITS, 1);
- EXPECT_EQ(
- "m9000s4000"
- "m620s540m620s1600m620s540m620s540m620s1600m620s540m620s540m620s540"
- "m620s540m620s540m620s1600m620s540m620s1600m620s1600m620s540m620s540"
- "m620s540m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540"
- "m620s540m620s540m620s540m620s1600m620s1600m620s1600m620s1600m620s540"
- "m620s540m620s1600m620s540"
- "m620s19000"
- "m620s540m620s540m620s540m620s540m620s1600m620s540m620s540m620s1600"
- "m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540m620s1600"
- "m620s1600m620s540m620s1600m620s1600m620s540m620s540m620s1600m620s1600"
- "m620s1600m620s1600m620s1600m620s1600m620s540m620s1600m620s1600m620s1600"
- "m620s19000"
- "m9000s4000"
- "m620s540m620s1600m620s540m620s540m620s1600m620s540m620s540m620s540"
- "m620s540m620s540m620s1600m620s540m620s1600m620s1600m620s540m620s540"
- "m620s540m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540"
- "m620s540m620s540m620s540m620s1600m620s1600m620s1600m620s1600m620s540"
- "m620s540m620s1600m620s540"
- "m620s19000"
- "m620s540m620s540m620s540m620s540m620s1600m620s540m620s540m620s1600"
- "m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540m620s1600"
- "m620s1600m620s540m620s1600m620s1600m620s540m620s540m620s1600m620s1600"
- "m620s1600m620s1600m620s1600m620s1600m620s540m620s1600m620s1600m620s1600"
- "m620s19000", irsend.outputStr());
-}
-
-// Test sending atypical sizes.
-TEST(TestSendGreeChars, SendUnexpectedSizes) {
- IRsendTest irsend(4);
- irsend.begin();
-
- uint8_t gree_short_code[GREE_STATE_LENGTH - 1] = {
- 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD};
- uint8_t gree_long_code[GREE_STATE_LENGTH + 1] = {
- 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12};
- irsend.reset();
- irsend.sendGree(gree_short_code, GREE_STATE_LENGTH - 1);
- ASSERT_EQ("", irsend.outputStr());
-
- irsend.reset();
- irsend.sendGree(gree_long_code, GREE_STATE_LENGTH + 1);
- ASSERT_EQ(
- "m9000s4000"
- "m620s540m620s1600m620s540m620s540m620s1600m620s540m620s540m620s540"
- "m620s540m620s540m620s1600m620s540m620s1600m620s1600m620s540m620s540"
- "m620s540m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540"
- "m620s540m620s540m620s540m620s1600m620s1600m620s1600m620s1600m620s540"
- "m620s540m620s1600m620s540"
- "m620s19000"
- "m620s540m620s540m620s540m620s540m620s1600m620s540m620s540m620s1600"
- "m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540m620s1600"
- "m620s1600m620s540m620s1600m620s1600m620s540m620s540m620s1600m620s1600"
- "m620s1600m620s1600m620s1600m620s1600m620s540m620s1600m620s1600m620s1600"
- "m620s540m620s1600m620s540m620s540m620s1600m620s540m620s540m620s540"
- "m620s19000", irsend.outputStr());
-}
-
-TEST(TestSendGreeUint64, SendUnexpectedSizes) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendGree(0x1234567890ABCDEF, GREE_BITS - 1);
- ASSERT_EQ("", irsend.outputStr());
-
- irsend.reset();
- irsend.sendGree(0x1234567890ABCDEF, GREE_BITS + 1);
- ASSERT_EQ("", irsend.outputStr());
-}
-
-TEST(TestSendGree, CompareUint64ToCharResults) {
- IRsendTest irsend_chars(4);
- IRsendTest irsend_uint64(0);
-
- uint8_t gree_code[GREE_STATE_LENGTH] = {
- 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};
-
- irsend_chars.begin();
- irsend_uint64.begin();
-
- irsend_chars.reset();
- irsend_uint64.reset();
- irsend_chars.sendGree(gree_code);
- irsend_uint64.sendGree(0x1234567890ABCDEF);
- ASSERT_EQ(irsend_chars.outputStr(), irsend_uint64.outputStr());
-
- uint8_t gree_zero_code[GREE_STATE_LENGTH] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
- irsend_chars.reset();
- irsend_uint64.reset();
- irsend_chars.sendGree(gree_zero_code);
- irsend_uint64.sendGree((uint64_t) 0x0);
- ASSERT_EQ(irsend_chars.outputStr(), irsend_uint64.outputStr());
-}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_Kelvinator_test.cpp b/lib/IRremoteESP8266-2.2.1.02/test/ir_Kelvinator_test.cpp
deleted file mode 100644
index c409c20bac86..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_Kelvinator_test.cpp
+++ /dev/null
@@ -1,432 +0,0 @@
-// Copyright 2017 David Conran
-
-#include "IRsend.h"
-#include "IRsend_test.h"
-#include "ir_Kelvinator.h"
-#include "gtest/gtest.h"
-
-// Tests for sendKelvinator().
-
-// Test sending typical data only.
-TEST(TestSendKelvinator, SendDataOnly) {
- IRsendTest irsend(4);
- irsend.begin();
-
- uint8_t kelv_code[KELVINATOR_STATE_LENGTH] = {
- 0x19, 0x0B, 0x80, 0x50, 0x00, 0x00, 0x00, 0xE0,
- 0x19, 0x0B, 0x80, 0x70, 0x00, 0x00, 0x10, 0xf0};
- irsend.reset();
- irsend.sendKelvinator(kelv_code);
- EXPECT_EQ(
- "m8990s4490"
- "m675s1560m675s520m675s520m675s1560m675s1560m675s520m675s520m675s520"
- "m675s1560m675s1560m675s520m675s1560m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s1560"
- "m675s520m675s520m675s520m675s520m675s1560m675s520m675s1560m675s520"
- "m675s520m675s1560m675s520"
- "m675s19950"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s1560m675s1560m675s1560"
- "m675s39900"
- "m8990s4490"
- "m675s1560m675s520m675s520m675s1560m675s1560m675s520m675s520m675s520"
- "m675s1560m675s1560m675s520m675s1560m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s1560"
- "m675s520m675s520m675s520m675s520m675s1560m675s1560m675s1560m675s520"
- "m675s520m675s1560m675s520"
- "m675s19950"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s1560m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s1560m675s1560m675s1560m675s1560"
- "m675s39900", irsend.outputStr());
-}
-
-// Test sending with repeats.
-TEST(TestSendKelvinator, SendWithRepeats) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- uint8_t kelv_code[KELVINATOR_STATE_LENGTH] = {
- 0x19, 0x0B, 0x80, 0x50, 0x00, 0x00, 0x00, 0xE0,
- 0x19, 0x0B, 0x80, 0x70, 0x00, 0x00, 0x10, 0xf0};
- irsend.reset();
-
- irsend.sendKelvinator(kelv_code, KELVINATOR_STATE_LENGTH, 1);
- EXPECT_EQ(
- "m8990s4490"
- "m675s1560m675s520m675s520m675s1560m675s1560m675s520m675s520m675s520"
- "m675s1560m675s1560m675s520m675s1560m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s1560"
- "m675s520m675s520m675s520m675s520m675s1560m675s520m675s1560m675s520"
- "m675s520m675s1560m675s520"
- "m675s19950"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s1560m675s1560m675s1560"
- "m675s39900"
- "m8990s4490"
- "m675s1560m675s520m675s520m675s1560m675s1560m675s520m675s520m675s520"
- "m675s1560m675s1560m675s520m675s1560m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s1560"
- "m675s520m675s520m675s520m675s520m675s1560m675s1560m675s1560m675s520"
- "m675s520m675s1560m675s520"
- "m675s19950"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s1560m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s1560m675s1560m675s1560m675s1560"
- "m675s39900"
- "m8990s4490"
- "m675s1560m675s520m675s520m675s1560m675s1560m675s520m675s520m675s520"
- "m675s1560m675s1560m675s520m675s1560m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s1560"
- "m675s520m675s520m675s520m675s520m675s1560m675s520m675s1560m675s520"
- "m675s520m675s1560m675s520"
- "m675s19950"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s1560m675s1560m675s1560"
- "m675s39900"
- "m8990s4490"
- "m675s1560m675s520m675s520m675s1560m675s1560m675s520m675s520m675s520"
- "m675s1560m675s1560m675s520m675s1560m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s1560"
- "m675s520m675s520m675s520m675s520m675s1560m675s1560m675s1560m675s520"
- "m675s520m675s1560m675s520"
- "m675s19950"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s1560m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s1560m675s1560m675s1560m675s1560"
- "m675s39900", irsend.outputStr());
-}
-
-// Test sending atypical sizes.
-TEST(TestSendKelvinator, SendUnexpectedSizes) {
- IRsendTest irsend(4);
- irsend.begin();
-
- uint8_t kelv_short_code[15] = {0x19, 0x0B, 0x80, 0x50, 0x00, 0x00, 0x00, 0xE0,
- 0x19, 0x0B, 0x80, 0x70, 0x00, 0x00, 0x10};
- uint8_t kelv_long_code[17] = {0x19, 0x0B, 0x80, 0x50, 0x00, 0x00, 0x00, 0xE0,
- 0x19, 0x0B, 0x80, 0x70, 0x00, 0x00, 0x10, 0xf0,
- 0x00};
- irsend.reset();
- irsend.sendKelvinator(kelv_short_code, 15);
- ASSERT_EQ("", irsend.outputStr());
-
- irsend.reset();
- // Shouldn't be different from the SendDataOnly. We just don't send the
- // extra data.
- irsend.sendKelvinator(kelv_long_code, 17);
- ASSERT_EQ(
- "m8990s4490"
- "m675s1560m675s520m675s520m675s1560m675s1560m675s520m675s520m675s520"
- "m675s1560m675s1560m675s520m675s1560m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s1560"
- "m675s520m675s520m675s520m675s520m675s1560m675s520m675s1560m675s520"
- "m675s520m675s1560m675s520"
- "m675s19950"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s1560m675s1560m675s1560"
- "m675s39900"
- "m8990s4490"
- "m675s1560m675s520m675s520m675s1560m675s1560m675s520m675s520m675s520"
- "m675s1560m675s1560m675s520m675s1560m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s1560"
- "m675s520m675s520m675s520m675s520m675s1560m675s1560m675s1560m675s520"
- "m675s520m675s1560m675s520"
- "m675s19950"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s1560m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s1560m675s1560m675s1560m675s1560"
- "m675s39900", irsend.outputStr());
-}
-
-
-// Tests for IRKelvinatorAC class.
-
-TEST(TestKelvinatorClass, Power) {
- IRKelvinatorAC irkelv(0);
- irkelv.begin();
-
- irkelv.on();
- EXPECT_TRUE(irkelv.getPower());
-
- irkelv.off();
- EXPECT_FALSE(irkelv.getPower());
-
- irkelv.setPower(true);
- EXPECT_TRUE(irkelv.getPower());
-
- irkelv.setPower(false);
- EXPECT_FALSE(irkelv.getPower());
-}
-
-TEST(TestKelvinatorClass, Temperature) {
- IRKelvinatorAC irkelv(0);
- irkelv.begin();
-
- irkelv.setTemp(0);
- EXPECT_EQ(KELVINATOR_MIN_TEMP, irkelv.getTemp());
-
- irkelv.setTemp(255);
- EXPECT_EQ(KELVINATOR_MAX_TEMP, irkelv.getTemp());
-
- irkelv.setTemp(KELVINATOR_MIN_TEMP);
- EXPECT_EQ(KELVINATOR_MIN_TEMP, irkelv.getTemp());
-
- irkelv.setTemp(KELVINATOR_MAX_TEMP);
- EXPECT_EQ(KELVINATOR_MAX_TEMP, irkelv.getTemp());
-
- irkelv.setTemp(KELVINATOR_MIN_TEMP - 1);
- EXPECT_EQ(KELVINATOR_MIN_TEMP, irkelv.getTemp());
-
- irkelv.setTemp(KELVINATOR_MAX_TEMP + 1);
- EXPECT_EQ(KELVINATOR_MAX_TEMP, irkelv.getTemp());
-
- irkelv.setTemp(17);
- EXPECT_EQ(17, irkelv.getTemp());
-
- irkelv.setTemp(21);
- EXPECT_EQ(21, irkelv.getTemp());
-
- irkelv.setTemp(25);
- EXPECT_EQ(25, irkelv.getTemp());
-
- irkelv.setTemp(29);
- EXPECT_EQ(29, irkelv.getTemp());
-}
-
-TEST(TestKelvinatorClass, OperatingMode) {
- IRKelvinatorAC irkelv(0);
- irkelv.begin();
-
- irkelv.setTemp(24);
- irkelv.setMode(KELVINATOR_AUTO);
- EXPECT_EQ(KELVINATOR_AUTO, irkelv.getMode());
- EXPECT_EQ(KELVINATOR_AUTO_TEMP, irkelv.getTemp());
-
- irkelv.setMode(KELVINATOR_COOL);
- EXPECT_EQ(KELVINATOR_COOL, irkelv.getMode());
-
- irkelv.setMode(KELVINATOR_HEAT);
- EXPECT_EQ(KELVINATOR_HEAT, irkelv.getMode());
-
- irkelv.setTemp(24);
- irkelv.setMode(KELVINATOR_DRY);
- EXPECT_EQ(KELVINATOR_DRY, irkelv.getMode());
- EXPECT_EQ(KELVINATOR_AUTO_TEMP, irkelv.getTemp());
-
- irkelv.setMode(KELVINATOR_FAN);
- EXPECT_EQ(KELVINATOR_FAN, irkelv.getMode());
-
- irkelv.setMode(KELVINATOR_HEAT + 1);
- EXPECT_EQ(KELVINATOR_AUTO, irkelv.getMode());
-
- irkelv.setMode(255);
- EXPECT_EQ(KELVINATOR_AUTO, irkelv.getMode());
-}
-
-TEST(TestKelvinatorClass, VaneSwing) {
- IRKelvinatorAC irkelv(0);
- irkelv.begin();
-
- irkelv.setSwingHorizontal(true);
- irkelv.setSwingVertical(false);
-
- irkelv.setSwingHorizontal(true);
- EXPECT_TRUE(irkelv.getSwingHorizontal());
- EXPECT_FALSE(irkelv.getSwingVertical());
-
- irkelv.setSwingVertical(true);
- EXPECT_TRUE(irkelv.getSwingHorizontal());
- EXPECT_TRUE(irkelv.getSwingVertical());
-
- irkelv.setSwingHorizontal(false);
- EXPECT_FALSE(irkelv.getSwingHorizontal());
- EXPECT_TRUE(irkelv.getSwingVertical());
-
- irkelv.setSwingVertical(false);
- EXPECT_FALSE(irkelv.getSwingHorizontal());
- EXPECT_FALSE(irkelv.getSwingVertical());
-}
-
-TEST(TestKelvinatorClass, QuietMode) {
- IRKelvinatorAC irkelv(0);
- irkelv.begin();
-
- irkelv.setQuiet(true);
- EXPECT_TRUE(irkelv.getQuiet());
-
- irkelv.setQuiet(false);
- EXPECT_FALSE(irkelv.getQuiet());
-
- irkelv.setQuiet(true);
- EXPECT_TRUE(irkelv.getQuiet());
-}
-
-TEST(TestKelvinatorClass, IonFilter) {
- IRKelvinatorAC irkelv(0);
- irkelv.begin();
-
- irkelv.setIonFilter(true);
- EXPECT_TRUE(irkelv.getIonFilter());
-
- irkelv.setIonFilter(false);
- EXPECT_FALSE(irkelv.getIonFilter());
-
- irkelv.setIonFilter(true);
- EXPECT_TRUE(irkelv.getIonFilter());
-}
-
-TEST(TestKelvinatorClass, Light) {
- IRKelvinatorAC irkelv(0);
- irkelv.begin();
-
- irkelv.setLight(true);
- EXPECT_TRUE(irkelv.getLight());
-
- irkelv.setLight(false);
- EXPECT_FALSE(irkelv.getLight());
-
- irkelv.setLight(true);
- EXPECT_TRUE(irkelv.getLight());
-}
-
-TEST(TestKelvinatorClass, XFan) {
- IRKelvinatorAC irkelv(0);
- irkelv.begin();
-
- irkelv.setXFan(true);
- EXPECT_TRUE(irkelv.getXFan());
-
- irkelv.setXFan(false);
- EXPECT_FALSE(irkelv.getXFan());
-
- irkelv.setXFan(true);
- EXPECT_TRUE(irkelv.getXFan());
-}
-
-TEST(TestKelvinatorClass, TurboFan) {
- IRKelvinatorAC irkelv(0);
- irkelv.begin();
-
- irkelv.setTurbo(true);
- EXPECT_TRUE(irkelv.getTurbo());
-
- irkelv.setTurbo(false);
- EXPECT_FALSE(irkelv.getTurbo());
-
- irkelv.setFan(2);
- irkelv.setTurbo(true);
- EXPECT_TRUE(irkelv.getTurbo());
-
- // Turbo mode is turned off if the temperature is changed.
- irkelv.setFan(3);
- EXPECT_FALSE(irkelv.getTurbo());
-
- // But only when it is changed, not set to the same value again.
- irkelv.setTurbo(true);
- irkelv.setFan(3);
- EXPECT_TRUE(irkelv.getTurbo());
-}
-
-TEST(TestKelvinatorClass, FanSpeed) {
- IRKelvinatorAC irkelv(0);
- irkelv.begin();
-
- irkelv.setFan(0);
- EXPECT_EQ(0, irkelv.getFan());
-
- irkelv.setFan(255);
- EXPECT_EQ(KELVINATOR_FAN_MAX, irkelv.getFan());
-
- irkelv.setFan(KELVINATOR_FAN_MAX);
- EXPECT_EQ(KELVINATOR_FAN_MAX, irkelv.getFan());
-
- irkelv.setFan(KELVINATOR_FAN_MAX + 1);
- EXPECT_EQ(KELVINATOR_FAN_MAX, irkelv.getFan());
-
- irkelv.setFan(KELVINATOR_FAN_MAX - 1);
- EXPECT_EQ(KELVINATOR_FAN_MAX - 1, irkelv.getFan());
-
- irkelv.setFan(1);
- EXPECT_EQ(1, irkelv.getFan());
-
- irkelv.setFan(1);
- EXPECT_EQ(1, irkelv.getFan());
-
- irkelv.setFan(3);
- EXPECT_EQ(3, irkelv.getFan());
-}
-
-
-TEST(TestKelvinatorClass, MessageConstuction) {
- IRKelvinatorAC irkelv(0);
- IRsendTest irsend(4);
- irkelv.begin();
- irsend.begin();
-
- irkelv.setFan(1);
- irkelv.setMode(KELVINATOR_COOL);
- irkelv.setTemp(27);
- irkelv.setSwingVertical(false);
- irkelv.setSwingHorizontal(true);
- irkelv.setIonFilter(true);
- irkelv.setQuiet(false);
- irkelv.setLight(false);
- irkelv.setPower(true);
- irkelv.setTurbo(false);
- irkelv.setXFan(true);
-
- // Check everything for kicks.
- EXPECT_EQ(1, irkelv.getFan());
- EXPECT_EQ(KELVINATOR_COOL, irkelv.getMode());
- EXPECT_EQ(27, irkelv.getTemp());
- EXPECT_FALSE(irkelv.getSwingVertical());
- EXPECT_TRUE(irkelv.getSwingHorizontal());
- EXPECT_TRUE(irkelv.getIonFilter());
- EXPECT_FALSE(irkelv.getQuiet());
- EXPECT_FALSE(irkelv.getLight());
- EXPECT_TRUE(irkelv.getPower());
- EXPECT_FALSE(irkelv.getTurbo());
- EXPECT_TRUE(irkelv.getXFan());
-
- irsend.reset();
- irsend.sendKelvinator(irkelv.getRaw());
- EXPECT_EQ(
- "m8990s4490"
- "m675s1560m675s520m675s520m675s1560m675s1560m675s520m675s1560m675s520"
- "m675s1560m675s1560m675s520m675s1560m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s1560m675s1560"
- "m675s520m675s520m675s520m675s520m675s1560m675s520m675s1560m675s520"
- "m675s520m675s1560m675s520"
- "m675s19950"
- "m675s520m675s520m675s520m675s520m675s1560m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s1560m675s1560m675s1560m675s1560"
- "m675s39900"
- "m8990s4490"
- "m675s1560m675s520m675s520m675s1560m675s1560m675s520m675s1560m675s520"
- "m675s1560m675s1560m675s520m675s1560m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s1560m675s1560"
- "m675s520m675s520m675s520m675s520m675s1560m675s1560m675s1560m675s520"
- "m675s520m675s1560m675s520"
- "m675s19950"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s520m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s1560m675s520m675s520m675s520"
- "m675s520m675s520m675s520m675s520m675s1560m675s1560m675s1560m675s1560"
- "m675s39900", irsend.outputStr());
-}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_Mitsubishi_test.cpp b/lib/IRremoteESP8266-2.2.1.02/test/ir_Mitsubishi_test.cpp
deleted file mode 100644
index 2f28657fb7fc..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_Mitsubishi_test.cpp
+++ /dev/null
@@ -1,694 +0,0 @@
-// Copyright 2017 David Conran
-
-#include "IRsend.h"
-#include "IRsend_test.h"
-#include "ir_Mitsubishi.h"
-#include "gtest/gtest.h"
-
-// Tests for sendMitsubishi().
-
-// Test sending typical data only.
-TEST(TestSendMitsubishi, SendDataOnly) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendMitsubishi(0xE242);
- EXPECT_EQ(
- "m300s2100m300s2100m300s2100m300s900m300s900m300s900m300s2100m300s900"
- "m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100m300s900"
- "m300s53580"
- "m300s2100m300s2100m300s2100m300s900m300s900m300s900m300s2100m300s900"
- "m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100m300s900"
- "m300s53580", irsend.outputStr());
-
- irsend.reset();
- irsend.sendMitsubishi(0x0);
- EXPECT_EQ(
- "m300s900m300s900m300s900m300s900m300s900m300s900m300s900m300s900"
- "m300s900m300s900m300s900m300s900m300s900m300s900m300s900m300s900"
- "m300s53580"
- "m300s900m300s900m300s900m300s900m300s900m300s900m300s900m300s900"
- "m300s900m300s900m300s900m300s900m300s900m300s900m300s900m300s900"
- "m300s53580", irsend.outputStr());
-
- irsend.reset();
- irsend.sendMitsubishi(0x4321);
- EXPECT_EQ(
- "m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100m300s2100"
- "m300s900m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100"
- "m300s53580"
- "m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100m300s2100"
- "m300s900m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100"
- "m300s53580", irsend.outputStr());
-}
-
-// Test sending with different repeats.
-TEST(TestSendMitsubishi, SendWithRepeats) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendMitsubishi(0xE242, MITSUBISHI_BITS, 0); // 0 repeat.
- EXPECT_EQ(
- "m300s2100m300s2100m300s2100m300s900m300s900m300s900m300s2100m300s900"
- "m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100m300s900"
- "m300s53580", irsend.outputStr());
-
- irsend.reset();
- irsend.sendMitsubishi(0xE242, MITSUBISHI_BITS, 1); // 1 repeat.
- EXPECT_EQ(
- "m300s2100m300s2100m300s2100m300s900m300s900m300s900m300s2100m300s900"
- "m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100m300s900"
- "m300s53580"
- "m300s2100m300s2100m300s2100m300s900m300s900m300s900m300s2100m300s900"
- "m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100m300s900"
- "m300s53580", irsend.outputStr());
- irsend.sendMitsubishi(0xE242, MITSUBISHI_BITS, 2); // 2 repeats.
- EXPECT_EQ(
- "m300s2100m300s2100m300s2100m300s900m300s900m300s900m300s2100m300s900"
- "m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100m300s900"
- "m300s53580"
- "m300s2100m300s2100m300s2100m300s900m300s900m300s900m300s2100m300s900"
- "m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100m300s900"
- "m300s53580"
- "m300s2100m300s2100m300s2100m300s900m300s900m300s900m300s2100m300s900"
- "m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100m300s900"
- "m300s53580", irsend.outputStr());
-}
-
-// Test sending an atypical data size.
-TEST(TestSendMitsubishi, SendUsualSize) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendMitsubishi(0x0, 8);
- EXPECT_EQ(
- "m300s900m300s900m300s900m300s900m300s900m300s900m300s900m300s900"
- "m300s53580"
- "m300s900m300s900m300s900m300s900m300s900m300s900m300s900m300s900"
- "m300s53580", irsend.outputStr());
-
- irsend.reset();
- irsend.sendMitsubishi(0x1234567890ABCDEF, 64);
- EXPECT_EQ(
- "m300s900m300s900m300s900m300s2100m300s900m300s900m300s2100m300s900"
- "m300s900m300s900m300s2100m300s2100m300s900m300s2100m300s900m300s900"
- "m300s900m300s2100m300s900m300s2100m300s900m300s2100m300s2100m300s900"
- "m300s900m300s2100m300s2100m300s2100m300s2100m300s900m300s900m300s900"
- "m300s2100m300s900m300s900m300s2100m300s900m300s900m300s900m300s900"
- "m300s2100m300s900m300s2100m300s900m300s2100m300s900m300s2100m300s2100"
- "m300s2100m300s2100m300s900m300s900m300s2100m300s2100m300s900m300s2100"
- "m300s2100m300s2100m300s2100m300s900m300s2100m300s2100m300s2100m300s2100"
- "m300s53580"
- "m300s900m300s900m300s900m300s2100m300s900m300s900m300s2100m300s900"
- "m300s900m300s900m300s2100m300s2100m300s900m300s2100m300s900m300s900"
- "m300s900m300s2100m300s900m300s2100m300s900m300s2100m300s2100m300s900"
- "m300s900m300s2100m300s2100m300s2100m300s2100m300s900m300s900m300s900"
- "m300s2100m300s900m300s900m300s2100m300s900m300s900m300s900m300s900"
- "m300s2100m300s900m300s2100m300s900m300s2100m300s900m300s2100m300s2100"
- "m300s2100m300s2100m300s900m300s900m300s2100m300s2100m300s900m300s2100"
- "m300s2100m300s2100m300s2100m300s900m300s2100m300s2100m300s2100m300s2100"
- "m300s53580", irsend.outputStr());
-}
-
-// Decode normal Mitsubishi messages.
-TEST(TestDecodeMitsubishi, NormalDecodeWithStrict) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- // Normal Mitsubishi 16-bit message.
- irsend.reset();
- irsend.sendMitsubishi(0xC2B8);
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, MITSUBISHI_BITS, true));
- EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
- EXPECT_EQ(MITSUBISHI_BITS, irsend.capture.bits);
- EXPECT_EQ(0xC2B8, irsend.capture.value);
- EXPECT_EQ(0x0, irsend.capture.address);
- EXPECT_EQ(0x0, irsend.capture.command);
- EXPECT_FALSE(irsend.capture.repeat);
-
- irsend.reset();
- irsend.sendMitsubishi(0x0);
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, MITSUBISHI_BITS, true));
- EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
- EXPECT_EQ(MITSUBISHI_BITS, irsend.capture.bits);
- EXPECT_EQ(0x0, irsend.capture.value);
- EXPECT_EQ(0x0, irsend.capture.address);
- EXPECT_EQ(0x0, irsend.capture.command);
- EXPECT_FALSE(irsend.capture.repeat);
-
- irsend.reset();
- irsend.sendMitsubishi(0xFFFF);
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, MITSUBISHI_BITS, true));
- EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
- EXPECT_EQ(MITSUBISHI_BITS, irsend.capture.bits);
- EXPECT_EQ(0xFFFF, irsend.capture.value);
- EXPECT_EQ(0x0, irsend.capture.address);
- EXPECT_EQ(0x0, irsend.capture.command);
- EXPECT_FALSE(irsend.capture.repeat);
-
- // Non-standard Mitsubishi sizes should fail with strict.
- irsend.reset();
- // 12 bits.
- irsend.sendMitsubishi(0xFFF, 12);
- irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, MITSUBISHI_BITS, true));
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 12, true));
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 64, true));
-
- // 32 bits.
- irsend.sendMitsubishi(0xFFF, 32);
- irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, MITSUBISHI_BITS, true));
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 12, true));
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 32, true));
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 64, true));
-}
-
-// Decode normal repeated Mitsubishi messages.
-TEST(TestDecodeMitsubishi, NormalDecodeWithRepeatAndStrict) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- // Normal Mitsubishi 16-bit message with 2 repeats.
- irsend.reset();
- irsend.sendMitsubishi(0xC2B8, MITSUBISHI_BITS, 2);
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, MITSUBISHI_BITS, true));
- EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
- EXPECT_EQ(MITSUBISHI_BITS, irsend.capture.bits);
- EXPECT_EQ(0xC2B8, irsend.capture.value);
- EXPECT_EQ(0x0, irsend.capture.address);
- EXPECT_EQ(0x0, irsend.capture.command);
- EXPECT_FALSE(irsend.capture.repeat);
-
- // Normal Mitsubishi 16-bit message with 0 repeats.
- irsend.reset();
- irsend.sendMitsubishi(0xC2B8, MITSUBISHI_BITS, 0);
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, MITSUBISHI_BITS, true));
- EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
- EXPECT_EQ(MITSUBISHI_BITS, irsend.capture.bits);
- EXPECT_EQ(0xC2B8, irsend.capture.value);
- EXPECT_EQ(0x0, irsend.capture.address);
- EXPECT_EQ(0x0, irsend.capture.command);
- EXPECT_FALSE(irsend.capture.repeat);
-}
-
-// Decode unsupported Mitsubishi messages.
-TEST(TestDecodeMitsubishi, DecodeWithNonStrictValues) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendMitsubishi(0x0, 8); // Illegal sized Mitsubishi 8-bit message.
- irsend.makeDecodeResult();
- // Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, MITSUBISHI_BITS, true));
- // Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, 8, false));
- EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
- EXPECT_EQ(8, irsend.capture.bits);
- EXPECT_EQ(0x0, irsend.capture.value);
- EXPECT_EQ(0x0, irsend.capture.address);
- EXPECT_EQ(0x0, irsend.capture.command);
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 64, false));
-
- irsend.reset();
- // Illegal sized Mitsubishi 64-bit message.
- irsend.sendMitsubishi(0xFEDCBA9876543210, 64);
- irsend.makeDecodeResult();
- // Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, MITSUBISHI_BITS, true));
- // Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, 64, false));
- EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
- EXPECT_EQ(64, irsend.capture.bits);
- EXPECT_EQ(0xFEDCBA9876543210, irsend.capture.value);
- EXPECT_EQ(0x0, irsend.capture.address);
- EXPECT_EQ(0x0, irsend.capture.command);
- // Should fail when we are after a shorter message than we got.
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 8, false));
-}
-
-// Decode a 'real' example via GlobalCache
-TEST(TestDecodeMitsubishi, DecodeGlobalCacheExample) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- irsend.reset();
- // Mitsubishi "Power On" (16-bit) code from Global Cache.
- uint16_t gc_test[37] = {33000, 1, 1, 10, 70, 10, 70, 10, 70, 10, 30, 10, 30,
- 10, 30, 10, 70, 10, 30, 10, 30, 10, 70, 10, 30,
- 10, 30, 10, 30, 10, 30, 10, 70, 10, 30, 10, 936};
- irsend.sendGC(gc_test, 37);
- irsend.makeDecodeResult();
-
- ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture));
- EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
- EXPECT_EQ(MITSUBISHI_BITS, irsend.capture.bits);
- EXPECT_EQ(0xE242, irsend.capture.value);
- EXPECT_EQ(0x0, irsend.capture.address);
- EXPECT_EQ(0x0, irsend.capture.command);
- EXPECT_FALSE(irsend.capture.repeat);
-}
-
-// Fail to decode a non-Mitsubishi example via GlobalCache
-TEST(TestDecodeMitsubishi, FailToDecodeNonMitsubishiExample) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- irsend.reset();
- // Modified a few entries to unexpected values, based on previous test case.
- uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20, 20, 20, 20,
- 20, 20, 20, 127, 20, 61, 9, 20, 20, 61, 20, 20, 20,
- 61, 20, 61, 20, 61, 20, 20, 20, 20, 20, 20, 20, 884};
- irsend.sendGC(gc_test, 39);
- irsend.makeDecodeResult();
-
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, MITSUBISHI_BITS,
- false));
-}
-
-// Tests for Mitsubishi A/C methods.
-
-// Test sending typical data only.
-TEST(TestSendMitsubishiAC, SendDataOnly) {
- IRsendTest irsend(4);
- irsend.begin();
-
- uint8_t mitsub_code[MITSUBISHI_AC_STATE_LENGTH] = {
- 0x23, 0xCB, 0x26, 0x01, 0x00, 0x20, 0x08, 0x06, 0x30,
- 0x45, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F};
- irsend.reset();
- irsend.sendMitsubishiAC(mitsub_code);
- EXPECT_EQ(
- "m3400s1750"
- "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420"
- "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300"
- "m450s420m450s1300m450s1300m450s420m450s420m450s1300m450s420m450s420"
- "m450s1300m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s1300m450s420m450s420"
- "m450s420m450s420m450s420m450s1300m450s420m450s420m450s420m450s420"
- "m450s420m450s1300m450s1300m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420"
- "m450s1300m450s420m450s1300m450s420m450s420m450s420m450s1300m450s420"
- "m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s1300m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420"
- "m440s17100"
- "m3400s1750"
- "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420"
- "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300"
- "m450s420m450s1300m450s1300m450s420m450s420m450s1300m450s420m450s420"
- "m450s1300m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s1300m450s420m450s420"
- "m450s420m450s420m450s420m450s1300m450s420m450s420m450s420m450s420"
- "m450s420m450s1300m450s1300m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420"
- "m450s1300m450s420m450s1300m450s420m450s420m450s420m450s1300m450s420"
- "m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s1300m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420"
- "m440s17100", irsend.outputStr());
-}
-
-// Test sending with repeats.
-TEST(TestSendMitsubishiAC, SendWithRepeats) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- uint8_t mitsub_code[MITSUBISHI_AC_STATE_LENGTH] = {
- 0x23, 0xCB, 0x26, 0x01, 0x00, 0x20, 0x08, 0x06, 0x30,
- 0x45, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F};
-
- irsend.sendMitsubishiAC(mitsub_code, MITSUBISHI_AC_STATE_LENGTH, 0);
- EXPECT_EQ(
- "m3400s1750"
- "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420"
- "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300"
- "m450s420m450s1300m450s1300m450s420m450s420m450s1300m450s420m450s420"
- "m450s1300m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s1300m450s420m450s420"
- "m450s420m450s420m450s420m450s1300m450s420m450s420m450s420m450s420"
- "m450s420m450s1300m450s1300m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420"
- "m450s1300m450s420m450s1300m450s420m450s420m450s420m450s1300m450s420"
- "m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s1300m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420"
- "m440s17100", irsend.outputStr());
-
- irsend.reset();
- irsend.sendMitsubishiAC(mitsub_code, MITSUBISHI_AC_STATE_LENGTH, 2);
- EXPECT_EQ(
- "m3400s1750"
- "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420"
- "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300"
- "m450s420m450s1300m450s1300m450s420m450s420m450s1300m450s420m450s420"
- "m450s1300m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s1300m450s420m450s420"
- "m450s420m450s420m450s420m450s1300m450s420m450s420m450s420m450s420"
- "m450s420m450s1300m450s1300m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420"
- "m450s1300m450s420m450s1300m450s420m450s420m450s420m450s1300m450s420"
- "m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s1300m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420"
- "m440s17100"
- "m3400s1750"
- "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420"
- "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300"
- "m450s420m450s1300m450s1300m450s420m450s420m450s1300m450s420m450s420"
- "m450s1300m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s1300m450s420m450s420"
- "m450s420m450s420m450s420m450s1300m450s420m450s420m450s420m450s420"
- "m450s420m450s1300m450s1300m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420"
- "m450s1300m450s420m450s1300m450s420m450s420m450s420m450s1300m450s420"
- "m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s1300m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420"
- "m440s17100"
- "m3400s1750"
- "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420"
- "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300"
- "m450s420m450s1300m450s1300m450s420m450s420m450s1300m450s420m450s420"
- "m450s1300m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s1300m450s420m450s420"
- "m450s420m450s420m450s420m450s1300m450s420m450s420m450s420m450s420"
- "m450s420m450s1300m450s1300m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420"
- "m450s1300m450s420m450s1300m450s420m450s420m450s420m450s1300m450s420"
- "m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s1300m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420"
- "m440s17100", irsend.outputStr());
-}
-
-// Test sending atypical sizes.
-TEST(TestSendMitsubishiAC, SendUnexpectedSizes) {
- IRsendTest irsend(4);
- irsend.begin();
-
- uint8_t mitsub_short_code[17] = {0x23, 0xCB, 0x26, 0x01, 0x00, 0x20,
- 0x08, 0x06, 0x30, 0x45, 0x67, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00};
- uint8_t mitsub_long_code[19] = {0x23, 0xCB, 0x26, 0x01, 0x00, 0x20,
- 0x08, 0x06, 0x30, 0x45, 0x67, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
- 0x00};
- irsend.reset();
- irsend.sendMitsubishiAC(mitsub_short_code, 17);
- ASSERT_EQ("", irsend.outputStr());
-
- irsend.reset();
- irsend.sendMitsubishiAC(mitsub_long_code, 19);
- ASSERT_EQ(
- "m3400s1750"
- "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420"
- "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300"
- "m450s420m450s1300m450s1300m450s420m450s420m450s1300m450s420m450s420"
- "m450s1300m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s1300m450s420m450s420"
- "m450s420m450s420m450s420m450s1300m450s420m450s420m450s420m450s420"
- "m450s420m450s1300m450s1300m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420"
- "m450s1300m450s420m450s1300m450s420m450s420m450s420m450s1300m450s420"
- "m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s1300m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m440s17100"
- "m3400s1750"
- "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420"
- "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300"
- "m450s420m450s1300m450s1300m450s420m450s420m450s1300m450s420m450s420"
- "m450s1300m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s1300m450s420m450s420"
- "m450s420m450s420m450s420m450s1300m450s420m450s420m450s420m450s420"
- "m450s420m450s1300m450s1300m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420"
- "m450s1300m450s420m450s1300m450s420m450s420m450s420m450s1300m450s420"
- "m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s1300m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m440s17100", irsend.outputStr());
-}
-
-// Tests for IRMitsubishiAC class.
-
-TEST(TestMitsubishiACClass, Power) {
- IRMitsubishiAC mitsub(0);
- mitsub.begin();
-
- mitsub.on();
- EXPECT_TRUE(mitsub.getPower());
-
- mitsub.off();
- EXPECT_FALSE(mitsub.getPower());
-
- mitsub.setPower(true);
- EXPECT_TRUE(mitsub.getPower());
-
- mitsub.setPower(false);
- EXPECT_FALSE(mitsub.getPower());
-}
-
-TEST(TestMitsubishiACClass, Temperature) {
- IRMitsubishiAC mitsub(0);
- mitsub.begin();
-
- mitsub.setTemp(0);
- EXPECT_EQ(MITSUBISHI_AC_MIN_TEMP, mitsub.getTemp());
-
- mitsub.setTemp(255);
- EXPECT_EQ(MITSUBISHI_AC_MAX_TEMP, mitsub.getTemp());
-
- mitsub.setTemp(MITSUBISHI_AC_MIN_TEMP);
- EXPECT_EQ(MITSUBISHI_AC_MIN_TEMP, mitsub.getTemp());
-
- mitsub.setTemp(MITSUBISHI_AC_MAX_TEMP);
- EXPECT_EQ(MITSUBISHI_AC_MAX_TEMP, mitsub.getTemp());
-
- mitsub.setTemp(MITSUBISHI_AC_MIN_TEMP - 1);
- EXPECT_EQ(MITSUBISHI_AC_MIN_TEMP, mitsub.getTemp());
-
- mitsub.setTemp(MITSUBISHI_AC_MAX_TEMP + 1);
- EXPECT_EQ(MITSUBISHI_AC_MAX_TEMP, mitsub.getTemp());
-
- mitsub.setTemp(17);
- EXPECT_EQ(17, mitsub.getTemp());
-
- mitsub.setTemp(21);
- EXPECT_EQ(21, mitsub.getTemp());
-
- mitsub.setTemp(25);
- EXPECT_EQ(25, mitsub.getTemp());
-
- mitsub.setTemp(30);
- EXPECT_EQ(30, mitsub.getTemp());
-}
-
-TEST(TestMitsubishiACClass, OperatingMode) {
- IRMitsubishiAC mitsub(0);
- mitsub.begin();
-
- mitsub.setMode(MITSUBISHI_AC_AUTO);
- EXPECT_EQ(MITSUBISHI_AC_AUTO, mitsub.getMode());
-
- mitsub.setMode(MITSUBISHI_AC_COOL);
- EXPECT_EQ(MITSUBISHI_AC_COOL, mitsub.getMode());
-
- mitsub.setMode(MITSUBISHI_AC_HEAT);
- EXPECT_EQ(MITSUBISHI_AC_HEAT, mitsub.getMode());
-
- mitsub.setMode(MITSUBISHI_AC_DRY);
- EXPECT_EQ(MITSUBISHI_AC_DRY, mitsub.getMode());
-
- mitsub.setMode(MITSUBISHI_AC_AUTO + 1);
- EXPECT_EQ(MITSUBISHI_AC_AUTO, mitsub.getMode());
-
- mitsub.setMode(255);
- EXPECT_EQ(MITSUBISHI_AC_AUTO, mitsub.getMode());
-}
-
-TEST(TestMitsubishiACClass, VaneMode) {
- IRMitsubishiAC mitsub(0);
- mitsub.begin();
-
- mitsub.setVane(MITSUBISHI_AC_VANE_AUTO);
- EXPECT_EQ(MITSUBISHI_AC_VANE_AUTO, mitsub.getVane());
-
- mitsub.setVane(MITSUBISHI_AC_VANE_AUTO + 1);
- EXPECT_EQ(MITSUBISHI_AC_VANE_AUTO + 1, mitsub.getVane());
-
- mitsub.setVane(MITSUBISHI_AC_VANE_AUTO_MOVE);
- EXPECT_EQ(MITSUBISHI_AC_VANE_AUTO_MOVE, mitsub.getVane());
-
- mitsub.setVane(MITSUBISHI_AC_VANE_AUTO_MOVE + 1);
- EXPECT_EQ(MITSUBISHI_AC_VANE_AUTO_MOVE, mitsub.getVane());
-
- mitsub.setVane(MITSUBISHI_AC_VANE_AUTO_MOVE - 1);
- EXPECT_EQ(MITSUBISHI_AC_VANE_AUTO_MOVE - 1, mitsub.getVane());
-}
-
-TEST(TestMitsubishiACClass, FanSpeed) {
- IRMitsubishiAC mitsub(0);
- mitsub.begin();
-
- mitsub.setFan(MITSUBISHI_AC_FAN_AUTO);
- EXPECT_EQ(MITSUBISHI_AC_FAN_AUTO, mitsub.getFan());
-
- mitsub.setFan(255);
- EXPECT_EQ(MITSUBISHI_AC_FAN_REAL_MAX, mitsub.getFan());
-
- mitsub.setFan(MITSUBISHI_AC_FAN_MAX);
- EXPECT_EQ(MITSUBISHI_AC_FAN_REAL_MAX, mitsub.getFan());
-
- mitsub.setFan(MITSUBISHI_AC_FAN_MAX - 1);
- EXPECT_EQ(MITSUBISHI_AC_FAN_MAX - 1, mitsub.getFan());
-
- mitsub.setFan(1);
- EXPECT_EQ(1, mitsub.getFan());
-
- mitsub.setFan(2);
- EXPECT_EQ(2, mitsub.getFan());
-
- mitsub.setFan(3);
- EXPECT_EQ(3, mitsub.getFan());
-
- mitsub.setFan(4);
- EXPECT_EQ(4, mitsub.getFan());
-
- mitsub.setFan(MITSUBISHI_AC_FAN_SILENT);
- EXPECT_EQ(MITSUBISHI_AC_FAN_SILENT, mitsub.getFan());
-
- mitsub.setFan(MITSUBISHI_AC_FAN_SILENT + 1);
- EXPECT_EQ(MITSUBISHI_AC_FAN_REAL_MAX, mitsub.getFan());
-}
-
-TEST(TestMitsubishiACClass, MessageConstuction) {
- IRMitsubishiAC mitsub(0);
- IRsendTest irsend(4);
- mitsub.begin();
- irsend.begin();
-
- mitsub.setFan(1);
- mitsub.setMode(MITSUBISHI_AC_COOL);
- mitsub.setTemp(27);
- mitsub.setVane(3);
- mitsub.on();
-
- // Check everything for kicks.
- EXPECT_EQ(1, mitsub.getFan());
- EXPECT_EQ(MITSUBISHI_AC_COOL, mitsub.getMode());
- EXPECT_EQ(27, mitsub.getTemp());
- EXPECT_EQ(3, mitsub.getVane());
- EXPECT_TRUE(mitsub.getPower());
-
- irsend.reset();
- irsend.sendMitsubishiAC(mitsub.getRaw());
- EXPECT_EQ(
- "m3400s1750"
- "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420"
- "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300"
- "m450s420m450s1300m450s1300m450s420m450s420m450s1300m450s420m450s420"
- "m450s1300m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s1300m450s420m450s420"
- "m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420m450s420"
- "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420"
- "m450s1300m450s420m450s420m450s1300m450s1300m450s420m450s1300m450s420"
- "m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s1300m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s1300m450s420m450s420m450s1300m450s420"
- "m440s17100"
- "m3400s1750"
- "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420"
- "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300"
- "m450s420m450s1300m450s1300m450s420m450s420m450s1300m450s420m450s420"
- "m450s1300m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s1300m450s420m450s420"
- "m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420m450s420"
- "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420"
- "m450s1300m450s420m450s420m450s1300m450s1300m450s420m450s1300m450s420"
- "m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s1300m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
- "m450s420m450s420m450s420m450s1300m450s420m450s420m450s1300m450s420"
- "m440s17100", irsend.outputStr());
-}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_Nikai_test.cpp b/lib/IRremoteESP8266-2.2.1.02/test/ir_Nikai_test.cpp
deleted file mode 100644
index 0eea2bc40a98..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_Nikai_test.cpp
+++ /dev/null
@@ -1,210 +0,0 @@
-// Copyright 2017 David Conran
-
-#include "IRsend.h"
-#include "IRsend_test.h"
-#include "gtest/gtest.h"
-
-// Tests for sendNikai().
-// Test sending typical data only.
-TEST(TestSendNikai, SendDataOnly) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendNikai(0xD5F2A); // Nikai TV Power Off.
- EXPECT_EQ("m4000s4000"
- "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000"
- "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000"
- "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000"
- "m500s2000m500s1000m500s2000m500s8500",
- irsend.outputStr());
-
- irsend.reset();
-}
-
-// Test sending with different repeats.
-TEST(TestSendNikai, SendWithRepeats) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendNikai(0xD5F2A, NIKAI_BITS, 1); // 1 repeat.
- EXPECT_EQ("m4000s4000"
- "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000"
- "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000"
- "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000"
- "m500s2000m500s1000m500s2000m500s8500"
- "m4000s4000"
- "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000"
- "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000"
- "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000"
- "m500s2000m500s1000m500s2000m500s8500",
- irsend.outputStr());
- irsend.sendNikai(0xD5F2A, NIKAI_BITS, 2); // 2 repeat.
- EXPECT_EQ("m4000s4000"
- "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000"
- "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000"
- "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000"
- "m500s2000m500s1000m500s2000m500s8500"
- "m4000s4000"
- "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000"
- "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000"
- "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000"
- "m500s2000m500s1000m500s2000m500s8500"
- "m4000s4000"
- "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000"
- "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000"
- "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000"
- "m500s2000m500s1000m500s2000m500s8500",
- irsend.outputStr());
-}
-
-// Tests for decodeNikai().
-
-// Decode normal Nikai messages.
-TEST(TestDecodeNikai, NormalDecodeWithStrict) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- // Normal Nikai 24-bit message.
- irsend.reset();
- irsend.sendNikai(0x123456);
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, NIKAI_BITS, true));
- EXPECT_EQ(NIKAI, irsend.capture.decode_type);
- EXPECT_EQ(NIKAI_BITS, irsend.capture.bits);
- EXPECT_EQ(0x123456, irsend.capture.value);
-
- irsend.reset();
- irsend.sendNikai(0x101);
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, NIKAI_BITS, true));
- EXPECT_EQ(NIKAI, irsend.capture.decode_type);
- EXPECT_EQ(NIKAI_BITS, irsend.capture.bits);
- EXPECT_EQ(0x101, irsend.capture.value);
-}
-
-// Decode normal repeated Nikai messages.
-TEST(TestDecodeNikai, NormalDecodeWithRepeatAndStrict) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- // Normal Nikai 24-bit message.
- irsend.reset();
- irsend.sendNikai(0xD5F2A, NIKAI_BITS, 2);
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, NIKAI_BITS, true));
- EXPECT_EQ(NIKAI, irsend.capture.decode_type);
- EXPECT_EQ(NIKAI_BITS, irsend.capture.bits);
- EXPECT_EQ(0xD5F2A, irsend.capture.value);
-}
-
-TEST(TestDecodeNikai, NormalDecodeWithNonStrict) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- // Illegal under length (16-bit) message
- irsend.reset();
- irsend.sendNikai(0x0, 16);
- irsend.makeDecodeResult();
- // Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, NIKAI_BITS, true));
- // And it should fail when we expect more bits.
- ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, NIKAI_BITS, false));
-
- // Should pass if strict off if we ask for correct nr. of bits sent.
- ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, 16, false));
- EXPECT_EQ(NIKAI, irsend.capture.decode_type);
- EXPECT_EQ(16, irsend.capture.bits);
- EXPECT_EQ(0x0, irsend.capture.value);
-
- // Should fail as we are expecting less bits than there are.
- ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, 12, false));
-}
-
-// Decode (non-standard) 64-bit messages.
-// Decode unsupported Nikai messages.
-TEST(TestDecodeNikai, Decode64BitMessages) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- irsend.reset();
- // Illegal size Nikai 64-bit message.
- irsend.sendNikai(0xFFFFFFFFFFFFFFFF, 64);
- irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, NIKAI_BITS, true));
- // Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, 64, false));
- EXPECT_EQ(NIKAI, irsend.capture.decode_type);
- EXPECT_EQ(64, irsend.capture.bits);
- EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
-}
-
-// Decode real example via Issue #309
-TEST(TestDecodeNikai, DecodeExamples) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- irsend.reset();
- // Nikai TV Power Off from Issue #309
- uint16_t rawdata_off[100] = {4060, 3918,
- 508, 2004, 508, 2002, 510, 2002, 508, 2004, 506, 1050, 508, 1048,
- 510, 2004, 508, 1048, 508, 2002, 510, 1050, 508, 2004, 510, 1048,
- 508, 1050, 508, 1048, 508, 1050, 508, 1050, 508, 2004, 508, 2002,
- 510, 1048, 508, 2004, 508, 1050, 506, 2004, 508, 1048, 510, 2002,
- 456, 8446,
- 3956, 3998,
- 508, 2004, 508, 2002, 508, 2004, 508, 1978, 532, 1050, 508, 1050,
- 508, 2002, 508, 1050, 508, 2004, 508, 1050, 508, 2002, 510, 1050,
- 508, 1050, 508, 1048, 508, 1050, 508, 1050, 508, 2002, 510, 2002,
- 508, 1050, 508, 2002, 510, 1050, 508, 2002, 508};
- irsend.sendRaw(rawdata_off, 100, 38);
- irsend.makeDecodeResult();
-
- ASSERT_TRUE(irrecv.decode(&irsend.capture));
- EXPECT_EQ(NIKAI, irsend.capture.decode_type);
- EXPECT_EQ(NIKAI_BITS, irsend.capture.bits);
- EXPECT_EQ(0xD5F2A, irsend.capture.value);
-
- // Nikai TV Volume Up from Issue #309
- uint16_t rawdata_volup[52] = {3972, 4002,
- 504, 1982, 526, 2010, 502, 2010, 502, 2010, 500, 1056, 502, 1056,
- 502, 2010, 500, 1056, 502, 2010, 502, 2010, 500, 2010, 502, 2010,
- 502, 1056, 502, 1056, 502, 1056, 500, 1056, 502, 2010, 502, 2010,
- 500, 1056, 502, 2008, 502, 1054, 504, 1054, 504, 1054, 500, 1056,
- 450};
-
- irsend.reset();
- irsend.sendRaw(rawdata_volup, 52, 38);
- irsend.makeDecodeResult();
-
- ASSERT_TRUE(irrecv.decode(&irsend.capture));
- EXPECT_EQ(NIKAI, irsend.capture.decode_type);
- EXPECT_EQ(NIKAI_BITS, irsend.capture.bits);
- EXPECT_EQ(0xD0F2F, irsend.capture.value);
-}
-
-// Fail to decode a non-Nikai example via GlobalCache
-TEST(TestDecodeNikai, FailToDecodeNonNikaiExample) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- irsend.reset();
- uint16_t gc_test[71] = {38000, 1, 1, 172, 172, 22, 64, 22, 64, 22, 64, 22, 21,
- 22, 21, 22, 21, 22, 11, 22, 21, 22, 128, 22, 64, 22,
- 64, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 64,
- 22, 21, 22, 21, 22, 64, 22, 64, 22, 21, 22, 21, 22,
- 64, 22, 21, 22, 64, 22, 64, 22, 21, 22, 21, 22, 64,
- 22, 64, 22, 21, 22, 1820};
- irsend.sendGC(gc_test, 71);
- irsend.makeDecodeResult();
-
- ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, NIKAI_BITS, false));
-}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_Panasonic_test.cpp b/lib/IRremoteESP8266-2.2.1.02/test/ir_Panasonic_test.cpp
deleted file mode 100644
index 3f27b90bf078..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_Panasonic_test.cpp
+++ /dev/null
@@ -1,457 +0,0 @@
-// Copyright 2017 David Conran
-
-#include "IRsend.h"
-#include "IRsend_test.h"
-#include "gtest/gtest.h"
-
-// Tests for encodePanasonic().
-
-TEST(TestEncodePanasonic, General) {
- IRsendTest irsend(4);
- EXPECT_EQ(0x0, irsend.encodePanasonic(0, 0, 0, 0));
- EXPECT_EQ(0x101010101, irsend.encodePanasonic(1, 1, 1, 1));
- EXPECT_EQ(0xFFFF, irsend.encodePanasonic(0, 0, 0, 0xFF));
- EXPECT_EQ(0xFF00FF, irsend.encodePanasonic(0, 0, 0xFF, 0));
- EXPECT_EQ(0xFF0000FF, irsend.encodePanasonic(0, 0xFF, 0, 0));
- EXPECT_EQ(0xFFFF00000000, irsend.encodePanasonic(0xFFFF, 0, 0, 0));
- EXPECT_EQ(0xFFFFFFFFFFFF, irsend.encodePanasonic(0xFFFF, 0xFF, 0xFF, 0xFF));
- EXPECT_EQ(0x40040190ED7C, irsend.encodePanasonic(0x4004, 0x01, 0x90, 0xED));
-}
-
-
-// Tests for sendPanasonic64().
-
-// Test sending typical data only.
-TEST(TestSendPanasonic64, SendDataOnly) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendPanasonic64(0x0);
- EXPECT_EQ(
- "m3456s1728"
- "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
- "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
- "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
- "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
- "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
- "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
- "m432s129600", irsend.outputStr());
-
- irsend.reset();
- irsend.sendPanasonic64(0x40040190ED7C);
- EXPECT_EQ(
- "m3456s1728"
- "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
- "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
- "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
- "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
- "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
- "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
- "m432s129600", irsend.outputStr());
-
- irsend.reset();
- irsend.sendPanasonic64(0xFFFFFFFFFFFF);
- EXPECT_EQ(
- "m3456s1728"
- "m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296"
- "m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296"
- "m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296"
- "m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296"
- "m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296"
- "m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296"
- "m432s129600", irsend.outputStr());
-}
-
-// Test sending with different repeats.
-TEST(TestSendPanasonic64, SendWithRepeats) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendPanasonic64(0x40040190ED7C, PANASONIC_BITS, 0); // 0 repeats.
- EXPECT_EQ(
- "m3456s1728"
- "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
- "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
- "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
- "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
- "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
- "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
- "m432s129600", irsend.outputStr());
-
- irsend.reset();
- irsend.sendPanasonic64(0x40040190ED7C, PANASONIC_BITS, 1); // 1 repeat.
- EXPECT_EQ(
- "m3456s1728"
- "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
- "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
- "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
- "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
- "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
- "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
- "m432s129600"
- "m3456s1728"
- "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
- "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
- "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
- "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
- "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
- "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
- "m432s129600", irsend.outputStr());
-
- irsend.sendPanasonic64(0x40040190ED7C, PANASONIC_BITS, 2); // 2 repeats.
- EXPECT_EQ(
- "m3456s1728"
- "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
- "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
- "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
- "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
- "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
- "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
- "m432s129600"
- "m3456s1728"
- "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
- "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
- "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
- "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
- "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
- "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
- "m432s129600"
- "m3456s1728"
- "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
- "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
- "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
- "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
- "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
- "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
- "m432s129600", irsend.outputStr());
-}
-
-// Test sending an atypical data size.
-TEST(TestSendPanasonic64, SendUnusualSize) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendPanasonic64(0x0, 8);
- EXPECT_EQ(
- "m3456s1728"
- "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
- "m432s129600", irsend.outputStr());
-
- irsend.reset();
- irsend.sendPanasonic64(0x1234567890ABCDEF, 64);
- EXPECT_EQ(
- "m3456s1728"
- "m432s432m432s432m432s432m432s1296m432s432m432s432m432s1296m432s432"
- "m432s432m432s432m432s1296m432s1296m432s432m432s1296m432s432m432s432"
- "m432s432m432s1296m432s432m432s1296m432s432m432s1296m432s1296m432s432"
- "m432s432m432s1296m432s1296m432s1296m432s1296m432s432m432s432m432s432"
- "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
- "m432s1296m432s432m432s1296m432s432m432s1296m432s432m432s1296m432s1296"
- "m432s1296m432s1296m432s432m432s432m432s1296m432s1296m432s432m432s1296"
- "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s1296m432s1296"
- "m432s129600", irsend.outputStr());
-}
-
-// Tests for sendPanasonic().
-
-TEST(TestSendPanasonic, CompareToSendPanasonic64) {
- IRsendTest panasonic(4);
- IRsendTest panasonic64(0);
-
- panasonic.begin();
- panasonic64.begin();
-
- panasonic.reset();
- panasonic64.reset();
-
- panasonic.sendPanasonic(0x4004, 0x0190ED7C);
- panasonic64.sendPanasonic64(0x40040190ED7C);
- EXPECT_EQ(panasonic64.outputStr(), panasonic.outputStr());
-
- panasonic.sendPanasonic(0x0, 0x0);
- panasonic64.sendPanasonic64(0x0);
- EXPECT_EQ(panasonic64.outputStr(), panasonic.outputStr());
-
- panasonic.sendPanasonic(0x0, 0x0, 8);
- panasonic64.sendPanasonic64(0x0, 8);
- EXPECT_EQ(panasonic64.outputStr(), panasonic.outputStr());
-
- panasonic.sendPanasonic(0x1234, 0x567890AB, 64);
- panasonic64.sendPanasonic64(0x1234567890AB, 64);
- EXPECT_EQ(panasonic64.outputStr(), panasonic.outputStr());
-
- panasonic.sendPanasonic(0x1234, 0x567890AB, PANASONIC_BITS, 2);
- panasonic64.sendPanasonic64(0x1234567890AB, PANASONIC_BITS, 2);
- EXPECT_EQ(panasonic64.outputStr(), panasonic.outputStr());
-}
-
-// Tests for decodePanasonic().
-
-// Decode normal Panasonic messages.
-TEST(TestDecodePanasonic, NormalDecodeWithStrict) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- // Normal Panasonic 48-bit message.
- irsend.reset();
- irsend.sendPanasonic64(0x40040190ED7C);
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, PANASONIC_BITS, true));
- EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
- EXPECT_EQ(PANASONIC_BITS, irsend.capture.bits);
- EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
- EXPECT_EQ(0x4004, irsend.capture.address);
- EXPECT_EQ(0x0190ED7C, irsend.capture.command);
- EXPECT_FALSE(irsend.capture.repeat);
-
- // Synthesised Normal Panasonic 48-bit message.
- irsend.reset();
- irsend.sendPanasonic64(irsend.encodePanasonic(0x4004, 0x12, 0x34, 0x56));
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, PANASONIC_BITS, true));
- EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
- EXPECT_EQ(PANASONIC_BITS, irsend.capture.bits);
- EXPECT_EQ(0x400412345670, irsend.capture.value);
- EXPECT_EQ(0x4004, irsend.capture.address);
- EXPECT_EQ(0x12345670, irsend.capture.command);
- EXPECT_FALSE(irsend.capture.repeat);
-
- // Synthesised Normal Panasonic 48-bit message.
- irsend.reset();
- irsend.sendPanasonic64(irsend.encodePanasonic(0x4004, 0x1, 0x1, 0x1));
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, PANASONIC_BITS, true));
- EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
- EXPECT_EQ(PANASONIC_BITS, irsend.capture.bits);
- EXPECT_EQ(0x400401010101, irsend.capture.value);
- EXPECT_EQ(0x4004, irsend.capture.address);
- EXPECT_EQ(0x1010101, irsend.capture.command);
- EXPECT_FALSE(irsend.capture.repeat);
-}
-
-// Decode normal repeated Panasonic messages.
-TEST(TestDecodePanasonic, NormalDecodeWithRepeatAndStrict) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- // Normal Panasonic 48-bit message with 2 repeats.
- irsend.reset();
- irsend.sendPanasonic64(0x40040190ED7C, PANASONIC_BITS, 2);
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, PANASONIC_BITS, true));
- EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
- EXPECT_EQ(PANASONIC_BITS, irsend.capture.bits);
- EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
- EXPECT_EQ(0x4004, irsend.capture.address);
- EXPECT_EQ(0x190ED7C, irsend.capture.command);
- EXPECT_FALSE(irsend.capture.repeat);
-
- irsend.makeDecodeResult(2 * PANASONIC_BITS + 4);
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, PANASONIC_BITS, true));
- EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
- EXPECT_EQ(PANASONIC_BITS, irsend.capture.bits);
- EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
-
- irsend.makeDecodeResult(2 * (2 * PANASONIC_BITS + 4));
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, PANASONIC_BITS, true));
- EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
- EXPECT_EQ(PANASONIC_BITS, irsend.capture.bits);
- EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
-}
-
-// Decode Panasonic messages with unsupported values.
-TEST(TestDecodePanasonic, DecodeWithNonStrictValues) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendPanasonic64(0x0); // Illegal value Panasonic 48-bit message.
- irsend.makeDecodeResult();
- // Should fail with strict on.
- ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, PANASONIC_BITS, true));
- // Should pass if strict off.
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, PANASONIC_BITS, false));
- EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
- EXPECT_EQ(PANASONIC_BITS, irsend.capture.bits);
- EXPECT_EQ(0x0, irsend.capture.value);
- EXPECT_EQ(0x0, irsend.capture.address);
- EXPECT_EQ(0x0, irsend.capture.command);
-
- irsend.reset();
- // Illegal address/Manufacturer code. The rest is legal.
- irsend.sendPanasonic64(irsend.encodePanasonic(0, 1, 2, 3));
- irsend.makeDecodeResult();
- // Should fail with strict on.
- ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, PANASONIC_BITS, true));
- // Should pass if strict off.
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, PANASONIC_BITS, false));
- EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
- EXPECT_EQ(PANASONIC_BITS, irsend.capture.bits);
- EXPECT_EQ(0x1020300, irsend.capture.value);
- EXPECT_EQ(0x0, irsend.capture.address);
- EXPECT_EQ(0x1020300, irsend.capture.command);
-}
-
-// Decode Panasonic messages with unsupported size/lengths.
-TEST(TestDecodePanasonic, DecodeWithNonStrictSize) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendPanasonic64(0x12345678, 32); // Illegal size Panasonic message.
- irsend.makeDecodeResult();
-
- ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, PANASONIC_BITS, true));
-
- irsend.makeDecodeResult();
- // Should fail with strict when we ask for the wrong bit size.
- ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, 32, true));
- // Should pass if strict off.
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, 32, false));
- EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
- EXPECT_EQ(32, irsend.capture.bits);
- EXPECT_EQ(0x12345678, irsend.capture.value);
- EXPECT_EQ(0x0, irsend.capture.address);
- EXPECT_EQ(0x12345678, irsend.capture.command);
-
- // Illegal over length (56-bit) message.
- irsend.reset();
- irsend.sendPanasonic64(irsend.encodePanasonic(0x4004, 1, 2, 3), 56);
- irsend.makeDecodeResult();
-
- ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, PANASONIC_BITS, true));
- // Shouldn't pass if strict off and wrong bit size.
- ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, PANASONIC_BITS, false));
- // Re-decode with correct bit size.
- ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, 56, true));
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, 56, false));
- EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
- EXPECT_EQ(56, irsend.capture.bits);
- EXPECT_EQ(0x400401020300, irsend.capture.value);
- EXPECT_EQ(0x4004, irsend.capture.address);
- EXPECT_EQ(0x01020300, irsend.capture.command);
-}
-
-// Decode (non-standard) 64-bit messages.
-TEST(TestDecodePanasonic, Decode64BitMessages) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- irsend.reset();
- // Illegal value & size Panasonic 64-bit message.
- irsend.sendPanasonic64(0xFFFFFFFFFFFFFFFF, 64);
- irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, 64, true));
- // Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, 64, false));
- EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
- EXPECT_EQ(64, irsend.capture.bits);
- EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
- EXPECT_EQ(0xFFFFFFFF, irsend.capture.address);
- EXPECT_EQ(0xFFFFFFFF, irsend.capture.command);
-}
-
-// Decode a 'real' example via GlobalCache
-TEST(TestDecodePanasonic, DecodeGlobalCacheExample) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- irsend.reset();
- // Panasonic code from Global Cache.
- uint16_t gc_test[103] = {37000, 1, 1, 126, 64, 16, 17, 16, 49, 15, 16, 16, 16,
- 16, 16, 16, 17, 15, 17, 15, 17, 15, 17, 15, 16, 16,
- 16, 16, 16, 16, 17, 15, 49, 16, 16, 16, 16, 16, 17,
- 15, 17, 15, 17, 15, 17, 15, 16, 16, 16, 16, 16, 16,
- 49, 15, 49, 16, 17, 15, 17, 15, 49, 16, 16, 16, 17,
- 16, 17, 15, 17, 15, 49, 16, 49, 15, 49, 16, 17, 16,
- 49, 15, 49, 16, 17, 15, 48, 16, 16, 16, 49, 15, 48,
- 16, 49, 15, 49, 16, 49, 15, 17, 15, 16, 16, 2721};
- irsend.sendGC(gc_test, 103);
- irsend.makeDecodeResult();
-
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, PANASONIC_BITS, true));
- EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
- EXPECT_EQ(PANASONIC_BITS, irsend.capture.bits);
- EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
- EXPECT_EQ(0x4004, irsend.capture.address);
- EXPECT_EQ(0x0190ED7C, irsend.capture.command);
- EXPECT_FALSE(irsend.capture.repeat);
-
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture));
- EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
- EXPECT_EQ(PANASONIC_BITS, irsend.capture.bits);
- EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
- EXPECT_EQ(0x4004, irsend.capture.address);
- EXPECT_EQ(0x0190ED7C, irsend.capture.command);
- EXPECT_FALSE(irsend.capture.repeat);
-}
-
-// Fail to decode a non-Panasonic example via GlobalCache
-TEST(TestDecodePanasonic, FailToDecodeNonPanasonicExample) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- irsend.reset();
- // Modified a few entries to unexpected values, based on previous test case.
- uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20, 20, 20, 20,
- 20, 20, 20, 127, 20, 61, 9, 20, 20, 61, 20, 20, 20,
- 61, 20, 61, 20, 61, 20, 20, 20, 20, 20, 20, 20, 884};
- irsend.sendGC(gc_test, 39);
- irsend.makeDecodeResult();
-
- ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture));
- ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, PANASONIC_BITS, false));
-}
-
-// Failing to decode Panasonic in Issue #245
-TEST(TestDecodePanasonic, DecodeIssue245) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- irsend.reset();
-
- uint16_t rawData[100] = {3550, 1750, 500, 450, 500, 1300, 500, 450, 500, 450,
- 500, 450, 500, 450, 500, 450, 500, 450, 500, 450,
- 500, 450, 500, 450, 500, 450, 500, 450, 500, 1300,
- 500, 450, 500, 450, 500, 450, 500, 450, 500, 450,
- 500, 450, 500, 450, 500, 450, 500, 450, 500, 1300,
- 500, 450, 500, 450, 500, 450, 500, 450, 500, 450,
- 500, 450, 500, 450, 500, 450, 500, 1300, 500, 450,
- 500, 1300, 500, 1300, 500, 1300, 500, 1300, 500, 450,
- 500, 450, 500, 1300, 500, 450, 500, 1300, 500, 1300,
- 500, 1300, 500, 1300, 500, 450, 500, 1300, 500, 5000};
-
- irsend.sendRaw(rawData, 100, 37);
- irsend.makeDecodeResult();
-
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture));
- EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
- EXPECT_EQ(PANASONIC_BITS, irsend.capture.bits);
- EXPECT_EQ(0x40040100BCBD, irsend.capture.value);
- EXPECT_EQ(0x4004, irsend.capture.address);
- EXPECT_EQ(0x100BCBD, irsend.capture.command);
- EXPECT_FALSE(irsend.capture.repeat);
-
- irsend.reset();
- irsend.sendRaw(rawData, 99, 37);
- irsend.makeDecodeResult();
-
- ASSERT_TRUE(irrecv.decode(&irsend.capture));
- EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
- EXPECT_EQ(PANASONIC_BITS, irsend.capture.bits);
- EXPECT_EQ(0x40040100BCBD, irsend.capture.value);
- EXPECT_EQ(0x4004, irsend.capture.address);
- EXPECT_EQ(0x100BCBD, irsend.capture.command);
- EXPECT_FALSE(irsend.capture.repeat);
-}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_Samsung_test.cpp b/lib/IRremoteESP8266-2.2.1.02/test/ir_Samsung_test.cpp
deleted file mode 100644
index 8c35ebebfe3a..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_Samsung_test.cpp
+++ /dev/null
@@ -1,276 +0,0 @@
-// Copyright 2017 David Conran
-
-#include "IRsend.h"
-#include "IRsend_test.h"
-#include "gtest/gtest.h"
-
-// Tests for sendSAMSUNG().
-
-// Test sending typical data only.
-TEST(TestSendSamsung, SendDataOnly) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendSAMSUNG(0xE0E09966); // Samsung TV Power On.
- EXPECT_EQ("m4480s4480"
- "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560"
- "m560s560m560s1680m560s1680m560s1680m560s560m560s560m560s560"
- "m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
- "m560s560m560s560m560s1680m560s560m560s1680m560s1680m560s560"
- "m560s560m560s1680m560s1680m560s560m560s108080",
- irsend.outputStr());
-
- irsend.reset();
-}
-
-// Test sending with different repeats.
-TEST(TestSendSamsung, SendWithRepeats) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendSAMSUNG(0xE0E09966, SAMSUNG_BITS, 1); // 1 repeat.
- EXPECT_EQ("m4480s4480"
- "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560"
- "m560s560m560s1680m560s1680m560s1680m560s560m560s560m560s560"
- "m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
- "m560s560m560s560m560s1680m560s560m560s1680m560s1680m560s560"
- "m560s560m560s1680m560s1680m560s560m560s108080"
- "m4480s4480"
- "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560"
- "m560s560m560s1680m560s1680m560s1680m560s560m560s560m560s560"
- "m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
- "m560s560m560s560m560s1680m560s560m560s1680m560s1680m560s560"
- "m560s560m560s1680m560s1680m560s560m560s108080"
- , irsend.outputStr());
- irsend.sendSAMSUNG(0xE0E09966, SAMSUNG_BITS, 2); // 2 repeats.
- EXPECT_EQ("m4480s4480"
- "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560"
- "m560s560m560s1680m560s1680m560s1680m560s560m560s560m560s560"
- "m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
- "m560s560m560s560m560s1680m560s560m560s1680m560s1680m560s560"
- "m560s560m560s1680m560s1680m560s560m560s108080"
- "m4480s4480"
- "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560"
- "m560s560m560s1680m560s1680m560s1680m560s560m560s560m560s560"
- "m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
- "m560s560m560s560m560s1680m560s560m560s1680m560s1680m560s560"
- "m560s560m560s1680m560s1680m560s560m560s108080"
- "m4480s4480"
- "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560"
- "m560s560m560s1680m560s1680m560s1680m560s560m560s560m560s560"
- "m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
- "m560s560m560s560m560s1680m560s560m560s1680m560s1680m560s560"
- "m560s560m560s1680m560s1680m560s560m560s108080"
- , irsend.outputStr());
-}
-
-// Tests for encodeSAMSUNG().
-
-TEST(TestEncodeSamsung, NormalEncoding) {
- IRsendTest irsend(4);
- EXPECT_EQ(0xFF, irsend.encodeSAMSUNG(0, 0));
- EXPECT_EQ(0x8080807F, irsend.encodeSAMSUNG(1, 1));
- EXPECT_EQ(0xF8F805FA, irsend.encodeSAMSUNG(0x1F, 0xA0));
- EXPECT_EQ(0xA0A0CC33, irsend.encodeSAMSUNG(0x05, 0x33));
- EXPECT_EQ(0xFFFFFF00, irsend.encodeSAMSUNG(0xFF, 0xFF));
- EXPECT_EQ(0xE0E09966, irsend.encodeSAMSUNG(0x07, 0x99));
-}
-
-// Tests for decodeSAMSUNG().
-
-// Decode normal Samsung messages.
-TEST(TestDecodeSamsung, NormalDecodeWithStrict) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- // Normal Samsung 32-bit message.
- irsend.reset();
- irsend.sendSAMSUNG(0xE0E09966);
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, SAMSUNG_BITS, true));
- EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
- EXPECT_EQ(SAMSUNG_BITS, irsend.capture.bits);
- EXPECT_EQ(0xE0E09966, irsend.capture.value);
- EXPECT_EQ(0x07, irsend.capture.address);
- EXPECT_EQ(0x99, irsend.capture.command);
-
- // Synthesised Normal Samsung 32-bit message.
- irsend.reset();
- irsend.sendSAMSUNG(irsend.encodeSAMSUNG(0x07, 0x99));
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, SAMSUNG_BITS, true));
- EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
- EXPECT_EQ(SAMSUNG_BITS, irsend.capture.bits);
- EXPECT_EQ(0xE0E09966, irsend.capture.value);
- EXPECT_EQ(0x07, irsend.capture.address);
- EXPECT_EQ(0x99, irsend.capture.command);
-
- // Synthesised Normal Samsung 32-bit message.
- irsend.reset();
- irsend.sendSAMSUNG(irsend.encodeSAMSUNG(0x1, 0x1));
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, SAMSUNG_BITS, true));
- EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
- EXPECT_EQ(SAMSUNG_BITS, irsend.capture.bits);
- EXPECT_EQ(0x8080807F, irsend.capture.value);
- EXPECT_EQ(0x1, irsend.capture.address);
- EXPECT_EQ(0x1, irsend.capture.command);
-}
-
-// Decode normal repeated Samsung messages.
-TEST(TestDecodeSamsung, NormalDecodeWithRepeatAndStrict) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- // Normal Samsung 32-bit message.
- irsend.reset();
- irsend.sendSAMSUNG(0xE0E09966, SAMSUNG_BITS, 2);
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, SAMSUNG_BITS, true));
- EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
- EXPECT_EQ(SAMSUNG_BITS, irsend.capture.bits);
- EXPECT_EQ(0xE0E09966, irsend.capture.value);
- EXPECT_EQ(0x07, irsend.capture.address);
- EXPECT_EQ(0x99, irsend.capture.command);
-}
-
-// Decode unsupported Samsung messages.
-TEST(TestDecodeSamsung, DecodeWithNonStrictValues) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendSAMSUNG(0x0); // Illegal value Samsung 32-bit message.
- irsend.makeDecodeResult();
- // Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, SAMSUNG_BITS, true));
- // Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, SAMSUNG_BITS, false));
- EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
- EXPECT_EQ(SAMSUNG_BITS, irsend.capture.bits);
- EXPECT_EQ(0x0, irsend.capture.value);
- EXPECT_EQ(0x0, irsend.capture.address);
- EXPECT_EQ(0x0, irsend.capture.command);
-
- irsend.reset();
- irsend.sendSAMSUNG(0x12345678); // Illegal value Samsung 32-bit message.
- irsend.makeDecodeResult();
- // Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, SAMSUNG_BITS, true));
- // Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, SAMSUNG_BITS, false));
- EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
- EXPECT_EQ(SAMSUNG_BITS, irsend.capture.bits);
- EXPECT_EQ(0x12345678, irsend.capture.value);
- EXPECT_EQ(0x48, irsend.capture.address);
- EXPECT_EQ(0x6A, irsend.capture.command);
-
- // Illegal over length (36-bit) message.
- irsend.reset();
- irsend.sendSAMSUNG(irsend.encodeSAMSUNG(0, 0), 36);
- irsend.makeDecodeResult();
- // Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, SAMSUNG_BITS, true));
- // Shouldn't pass if strict off and wrong expected bit size.
- ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, SAMSUNG_BITS, false));
- // Re-decode with correct bit size.
- ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, 36, true));
- ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, 36, false));
- EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
- EXPECT_EQ(36, irsend.capture.bits);
- EXPECT_EQ(0xFF, irsend.capture.value); // We told it to expect 8 bits less.
- EXPECT_EQ(0x00, irsend.capture.address);
- EXPECT_EQ(0x00, irsend.capture.command);
-
- // Illegal under length (16-bit) message
- irsend.reset();
- irsend.sendSAMSUNG(irsend.encodeSAMSUNG(0x0, 0x0), 16);
- irsend.makeDecodeResult();
- // Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, SAMSUNG_BITS, true));
- // And it should fail when we expect more bits.
- ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, SAMSUNG_BITS, false));
-
- // Should pass if strict off if we ask for correct nr. of bits sent.
- ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, 16, false));
- EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
- EXPECT_EQ(16, irsend.capture.bits);
- EXPECT_EQ(0xFF, irsend.capture.value); // We told it to expect 4 bits less.
- EXPECT_EQ(0x00, irsend.capture.address);
- EXPECT_EQ(0x00, irsend.capture.command);
-
- // Should fail as we are expecting less bits than there are.
- ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, 12, false));
-}
-
-// Decode (non-standard) 64-bit messages.
-// Decode unsupported Samsung messages.
-TEST(TestDecodeSamsung, Decode64BitMessages) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- irsend.reset();
- // Illegal value & size Samsung 64-bit message.
- irsend.sendSAMSUNG(0xFFFFFFFFFFFFFFFF, 64);
- irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, SAMSUNG_BITS, true));
- // Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, 64, false));
- EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
- EXPECT_EQ(64, irsend.capture.bits);
- EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
- EXPECT_EQ(0xFF, irsend.capture.address);
- EXPECT_EQ(0xFF, irsend.capture.command);
-}
-
-// Decode a 'real' example via GlobalCache
-TEST(TestDecodeSamsung, DecodeGlobalCacheExample) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- irsend.reset();
- // Samsung TV Power On from Global Cache.
- uint16_t gc_test[71] = {38000, 1, 1, 172, 172, 22, 64, 22, 64, 22, 64, 22, 21,
- 22, 21, 22, 21, 22, 21, 22, 21, 22, 64, 22, 64, 22,
- 64, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 64,
- 22, 21, 22, 21, 22, 64, 22, 64, 22, 21, 22, 21, 22,
- 64, 22, 21, 22, 64, 22, 64, 22, 21, 22, 21, 22, 64,
- 22, 64, 22, 21, 22, 1820};
- irsend.sendGC(gc_test, 71);
- irsend.makeDecodeResult();
-
- ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture));
- EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
- EXPECT_EQ(SAMSUNG_BITS, irsend.capture.bits);
- EXPECT_EQ(0xE0E09966, irsend.capture.value);
- EXPECT_EQ(0x07, irsend.capture.address);
- EXPECT_EQ(0x99, irsend.capture.command);
-}
-
-// Fail to decode a non-Samsung example via GlobalCache
-TEST(TestDecodeSamsung, FailToDecodeNonSamsungExample) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- irsend.reset();
- // Modified a few entries to unexpected values, based on previous test case.
- uint16_t gc_test[71] = {38000, 1, 1, 172, 172, 22, 64, 22, 64, 22, 64, 22, 21,
- 22, 21, 22, 21, 22, 11, 22, 21, 22, 128, 22, 64, 22,
- 64, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 64,
- 22, 21, 22, 21, 22, 64, 22, 64, 22, 21, 22, 21, 22,
- 64, 22, 21, 22, 64, 22, 64, 22, 21, 22, 21, 22, 64,
- 22, 64, 22, 21, 22, 1820};
- irsend.sendGC(gc_test, 71);
- irsend.makeDecodeResult();
-
- ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, SAMSUNG_BITS, false));
-}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_Sherwood_test.cpp b/lib/IRremoteESP8266-2.2.1.02/test/ir_Sherwood_test.cpp
deleted file mode 100644
index b5750b3b121d..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_Sherwood_test.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2017 David Conran
-
-#include "IRsend.h"
-#include "IRsend_test.h"
-#include "gtest/gtest.h"
-
-// Tests for sendSherwood().
-
-// Test sending typical data only.
-TEST(TestSendSherwood, SendDataOnly) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendSherwood(0xC1A28877);
- EXPECT_EQ("m8960s4480m560s1680m560s1680m560s560m560s560m560s560m560s560"
- "m560s560m560s1680m560s1680m560s560m560s1680m560s560m560s560"
- "m560s560m560s1680m560s560m560s1680m560s560m560s560m560s560"
- "m560s1680m560s560m560s560m560s560m560s560m560s1680m560s1680"
- "m560s1680m560s560m560s1680m560s1680m560s1680m560s108080"
- "m8960s2240m560s108080", irsend.outputStr());
-}
-
-// Test sending typical data with extra repeats.
-TEST(TestSendSherwood, SendDataWithRepeats) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendSherwood(0xC1A28877, 32, 2);
- EXPECT_EQ("m8960s4480m560s1680m560s1680m560s560m560s560m560s560m560s560"
- "m560s560m560s1680m560s1680m560s560m560s1680m560s560m560s560"
- "m560s560m560s1680m560s560m560s1680m560s560m560s560m560s560"
- "m560s1680m560s560m560s560m560s560m560s560m560s1680m560s1680"
- "m560s1680m560s560m560s1680m560s1680m560s1680m560s108080"
- "m8960s2240m560s108080"
- "m8960s2240m560s108080", irsend.outputStr());
-}
-
-// Test sending typical data with explicit no repeats.
-TEST(TestSendSherwood, SendDataWithZeroRepeats) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendSherwood(0xC1A28877, 32, 0);
- // Should have a single NEC repeat, as we always send one.
- EXPECT_EQ("m8960s4480m560s1680m560s1680m560s560m560s560m560s560m560s560"
- "m560s560m560s1680m560s1680m560s560m560s1680m560s560m560s560"
- "m560s560m560s1680m560s560m560s1680m560s560m560s560m560s560"
- "m560s1680m560s560m560s560m560s560m560s560m560s1680m560s1680"
- "m560s1680m560s560m560s1680m560s1680m560s1680m560s108080"
- "m8960s2240m560s108080", irsend.outputStr());
-}
-
-// Test that a typical Sherwood send decodes as the appropriate NEC value.
-TEST(TestSendSherwood, DecodesAsNEC) {
- IRsendTest irsend(4);
- IRrecv irrecv(0);
- irsend.begin();
-
- irsend.reset();
- irsend.sendSherwood(0xC1A28877);
- irsend.makeDecodeResult();
-
- EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture));
- EXPECT_EQ(NEC, irsend.capture.decode_type);
- EXPECT_EQ(NEC_BITS, irsend.capture.bits);
- EXPECT_EQ(0xC1A28877, irsend.capture.value);
- EXPECT_EQ(0x4583, irsend.capture.address);
- EXPECT_EQ(0x11, irsend.capture.command);
-}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_Sony_test.cpp b/lib/IRremoteESP8266-2.2.1.02/test/ir_Sony_test.cpp
deleted file mode 100644
index 76d35144161f..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_Sony_test.cpp
+++ /dev/null
@@ -1,323 +0,0 @@
-// Copyright 2017 David Conran
-
-#include "IRsend.h"
-#include "IRsend_test.h"
-#include "gtest/gtest.h"
-
-// Tests for sendSony().
-
-// Test sending typical data only.
-TEST(TestSendSony, SendDataOnly) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendSony(0);
- // We expect three 20-bit commands to be sent.
- EXPECT_EQ("m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m600s600"
- "m600s600m600s600m600s600m600s600m600s600m600s600m600s600m600s600"
- "m600s600m600s600m600s600m600s600m600s45600"
- "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m600s600"
- "m600s600m600s600m600s600m600s600m600s600m600s600m600s600m600s600"
- "m600s600m600s600m600s600m600s600m600s45600"
- "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m600s600"
- "m600s600m600s600m600s600m600s600m600s600m600s600m600s600m600s600"
- "m600s600m600s600m600s600m600s600m600s45600", irsend.outputStr());
-
- irsend.reset();
- irsend.sendSony(0x240C, SONY_20_BITS);
- // We expect three 20-bit commands to be sent.
- EXPECT_EQ("m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
- "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
- "m600s600m1200s600m1200s600m600s600m600s45600"
- "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
- "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
- "m600s600m1200s600m1200s600m600s600m600s45600"
- "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
- "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
- "m600s600m1200s600m1200s600m600s600m600s45600", irsend.outputStr());
-
- irsend.reset();
- irsend.sendSony(0x240C, SONY_15_BITS);
- // We expect three 15-bit commands to be sent.
- EXPECT_EQ("m2400s600m600s600m1200s600m600s600m600s600m1200s600m600s600"
- "m600s600m600s600m600s600m600s600m600s600m1200s600m1200s600m600s600"
- "m600s45600"
- "m2400s600m600s600m1200s600m600s600m600s600m1200s600m600s600"
- "m600s600m600s600m600s600m600s600m600s600m1200s600m1200s600m600s600"
- "m600s45600"
- "m2400s600m600s600m1200s600m600s600m600s600m1200s600m600s600"
- "m600s600m600s600m600s600m600s600m600s600m1200s600m1200s600m600s600"
- "m600s45600", irsend.outputStr());
-
- irsend.reset();
- irsend.sendSony(0xA90, SONY_12_BITS);
- // We expect three 15-bit commands to be sent.
- EXPECT_EQ("m2400s600m1200s600m600s600m1200s600m600s600m1200s600m600s600"
- "m600s600m1200s600m600s600m600s600m600s600m600s45600"
- "m2400s600m1200s600m600s600m1200s600m600s600m1200s600m600s600"
- "m600s600m1200s600m600s600m600s600m600s600m600s45600"
- "m2400s600m1200s600m600s600m1200s600m600s600m1200s600m600s600"
- "m600s600m1200s600m600s600m600s600m600s600m600s45600",
- irsend.outputStr());
-}
-
-// Test sending with different repeats.
-TEST(TestSendSony, SendWithDiffRepeats) {
- IRsendTest irsend(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendSony(0x240C, SONY_20_BITS, 0); // Send a command with 0 repeats.
- EXPECT_EQ("m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
- "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
- "m600s600m1200s600m1200s600m600s600m600s45600", irsend.outputStr());
- irsend.sendSony(0x240C, SONY_20_BITS, 1); // Send a command with 1 repeat.
- EXPECT_EQ("m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
- "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
- "m600s600m1200s600m1200s600m600s600m600s45600"
- "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
- "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
- "m600s600m1200s600m1200s600m600s600m600s45600", irsend.outputStr());
- irsend.sendSony(0x240C, SONY_20_BITS, 3); // Send a command with 3 repeats.
- EXPECT_EQ("m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
- "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
- "m600s600m1200s600m1200s600m600s600m600s45600"
- "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
- "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
- "m600s600m1200s600m1200s600m600s600m600s45600"
- "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
- "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
- "m600s600m1200s600m1200s600m600s600m600s45600"
- "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
- "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
- "m600s600m1200s600m1200s600m600s600m600s45600", irsend.outputStr());
-}
-
-// Tests for encodeSony().
-
-TEST(TestEncodeSony, NormalSonyEncoding) {
- IRsendTest irsend(4);
- EXPECT_EQ(0x0, irsend.encodeSony(SONY_12_BITS, 0, 0));
- EXPECT_EQ(0xA90, irsend.encodeSony(SONY_12_BITS, 21, 1));
- EXPECT_EQ(0xFFF, irsend.encodeSony(SONY_12_BITS, 0x7F, 0x1F));
-
- EXPECT_EQ(0x0, irsend.encodeSony(SONY_15_BITS, 0, 0));
- EXPECT_EQ(0x5480, irsend.encodeSony(SONY_15_BITS, 21, 1));
- EXPECT_EQ(0x5455, irsend.encodeSony(SONY_15_BITS, 21, 0xAA));
- EXPECT_EQ(0x7FFF, irsend.encodeSony(SONY_15_BITS, 0x7F, 0xFF));
-
- EXPECT_EQ(0x0, irsend.encodeSony(SONY_20_BITS, 0, 0, 0));
- EXPECT_EQ(0x81080, irsend.encodeSony(SONY_20_BITS, 1, 1, 1));
- EXPECT_EQ(0xFFFFF, irsend.encodeSony(SONY_20_BITS, 0x7F, 0x1F, 0xFF));
-}
-
-TEST(TestEncodeSony, SonyEncodingWithOversizedValues) {
- IRsendTest irsend(4);
- EXPECT_EQ(0xFFF, irsend.encodeSony(SONY_12_BITS, 0xFFFF, 0xFFFF));
-
- EXPECT_EQ(0x7FFF, irsend.encodeSony(SONY_15_BITS, 0xFFFF, 0xFFFF));
-
- EXPECT_EQ(0xFFFFF, irsend.encodeSony(SONY_20_BITS, 0xFFFF, 0xFFFF, 0xFFFF));
-}
-
-// Tests for decodeSony().
-
-// Decode normal Sony messages.
-TEST(TestDecodeSony, NormalSonyDecodeWithStrict) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- // Synthesised Normal Sony 20-bit message.
- irsend.reset();
- irsend.sendSony(irsend.encodeSony(SONY_20_BITS, 0x1, 0x1, 0x1));
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSony(&irsend.capture, SONY_20_BITS, true));
- EXPECT_EQ(SONY, irsend.capture.decode_type);
- EXPECT_EQ(SONY_20_BITS, irsend.capture.bits);
- EXPECT_EQ(0x81080, irsend.capture.value);
- EXPECT_EQ(0x1, irsend.capture.address);
- EXPECT_EQ(0x81, irsend.capture.command);
-
- // Synthesised Normal Sony 15-bit message.
- irsend.reset();
- irsend.sendSony(irsend.encodeSony(SONY_15_BITS, 21, 1), SONY_15_BITS);
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSony(&irsend.capture, SONY_15_BITS, true));
- EXPECT_EQ(SONY, irsend.capture.decode_type);
- EXPECT_EQ(SONY_15_BITS, irsend.capture.bits);
- EXPECT_EQ(0x5480, irsend.capture.value);
- EXPECT_EQ(1, irsend.capture.address);
- EXPECT_EQ(21, irsend.capture.command);
-
- // Synthesised Normal Sony 12-bit message.
- irsend.reset();
- irsend.sendSony(irsend.encodeSony(SONY_12_BITS, 21, 1), SONY_12_BITS);
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSony(&irsend.capture, SONY_12_BITS, true));
- EXPECT_EQ(SONY, irsend.capture.decode_type);
- EXPECT_EQ(SONY_12_BITS, irsend.capture.bits);
- EXPECT_EQ(0xA90, irsend.capture.value);
- EXPECT_EQ(1, irsend.capture.address);
- EXPECT_EQ(21, irsend.capture.command);
-}
-
-// Decode unexpected Sony messages. i.e longer than minimum etc.
-TEST(TestDecodeSony, SonyDecodeWithUnexpectedLegalSize) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- // Synthesised Normal Sony 20-bit message decoded when looking for 12-bits
- irsend.reset();
- irsend.sendSony(irsend.encodeSony(SONY_20_BITS, 0x1, 0x1, 0x1));
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSony(&irsend.capture, SONY_MIN_BITS));
- EXPECT_EQ(SONY, irsend.capture.decode_type);
- EXPECT_EQ(SONY_20_BITS, irsend.capture.bits);
- EXPECT_EQ(0x81080, irsend.capture.value);
- EXPECT_EQ(0x1, irsend.capture.address);
- EXPECT_EQ(0x81, irsend.capture.command);
-
- // Synthesised Normal Sony 12-bit message when expecting 20-bits.
- irsend.reset();
- irsend.sendSony(irsend.encodeSony(SONY_12_BITS, 21, 1), SONY_12_BITS);
- irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSony(&irsend.capture, SONY_20_BITS));
- EXPECT_EQ(SONY, irsend.capture.decode_type);
- EXPECT_EQ(SONY_12_BITS, irsend.capture.bits);
- EXPECT_EQ(0xA90, irsend.capture.value);
- EXPECT_EQ(1, irsend.capture.address);
- EXPECT_EQ(21, irsend.capture.command);
-
- // 12-bit message should be regected when using strict and a different size.
- irsend.reset();
- irsend.sendSony(irsend.encodeSony(SONY_12_BITS, 21, 1), SONY_12_BITS);
- irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_20_BITS, true));
- ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_15_BITS, true));
-
- // 15-bit message should be regected when using strict and a different size.
- irsend.reset();
- irsend.sendSony(irsend.encodeSony(SONY_15_BITS, 21, 1), SONY_15_BITS);
- irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_12_BITS, true));
- ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_20_BITS, true));
-
- // 20-bit message should be regected when using strict and a different size.
- irsend.reset();
- irsend.sendSony(irsend.encodeSony(SONY_20_BITS, 1, 1, 1), SONY_20_BITS);
- irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_12_BITS, true));
- ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_15_BITS, true));
-}
-
-// Decode unsupported Sony messages. i.e non-standard sizes.
-TEST(TestDecodeSony, SonyDecodeWithIllegalSize) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- irsend.reset();
- irsend.sendSony(0xFF, 8); // Illegal 8-bit Sony-like message.
- irsend.makeDecodeResult();
- // Should fail with strict on.
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_MIN_BITS, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_12_BITS, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_15_BITS, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_20_BITS, true));
- // Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeSony(&irsend.capture));
- EXPECT_EQ(SONY, irsend.capture.decode_type);
- EXPECT_EQ(8, irsend.capture.bits);
- EXPECT_EQ(0xFF, irsend.capture.value);
- EXPECT_EQ(0x0, irsend.capture.address);
- EXPECT_EQ(0x0, irsend.capture.command);
-
- irsend.reset();
- irsend.sendSony(0x1FFF, 13); // Illegal 13-bit Sony-like message.
- irsend.makeDecodeResult();
- // Should fail with strict on.
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_MIN_BITS, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_12_BITS, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_15_BITS, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_20_BITS, true));
- // Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeSony(&irsend.capture));
- EXPECT_EQ(SONY, irsend.capture.decode_type);
- EXPECT_EQ(13, irsend.capture.bits);
- EXPECT_EQ(0x1FFF, irsend.capture.value);
- EXPECT_EQ(0x0, irsend.capture.address);
- EXPECT_EQ(0x0, irsend.capture.command);
-
- irsend.reset();
- irsend.sendSony(0x1FFFF, 17); // Illegal 17-bit Sony-like message.
- irsend.makeDecodeResult();
- // Should fail with strict on.
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_MIN_BITS, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_12_BITS, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_15_BITS, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_20_BITS, true));
- // Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeSony(&irsend.capture));
- EXPECT_EQ(SONY, irsend.capture.decode_type);
- EXPECT_EQ(17, irsend.capture.bits);
- EXPECT_EQ(0x1FFFF, irsend.capture.value);
- EXPECT_EQ(0x0, irsend.capture.address);
- EXPECT_EQ(0x0, irsend.capture.command);
-
- irsend.reset();
- irsend.sendSony(0x1FFFFF, 21); // Illegal 21-bit Sony-like message.
- irsend.makeDecodeResult();
- // Should fail with strict on.
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_MIN_BITS, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_12_BITS, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_15_BITS, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, SONY_20_BITS, true));
- // Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeSony(&irsend.capture));
- EXPECT_EQ(SONY, irsend.capture.decode_type);
- EXPECT_EQ(21, irsend.capture.bits);
- EXPECT_EQ(0x1FFFFF, irsend.capture.value);
- EXPECT_EQ(0x0, irsend.capture.address);
- EXPECT_EQ(0x0, irsend.capture.command);
-
- irsend.reset();
- // Illegal 64-bit (max) Sony-like message.
- irsend.sendSony(0xFFFFFFFFFFFFFFFF, 64, 0);
- irsend.makeDecodeResult();
- // Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeSony(&irsend.capture));
- EXPECT_EQ(SONY, irsend.capture.decode_type);
- EXPECT_EQ(64, irsend.capture.bits);
- EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
- EXPECT_EQ(0x0, irsend.capture.address);
- EXPECT_EQ(0x0, irsend.capture.command);
-}
-
-
-// Decode unsupported Sony messages. i.e non-standard sizes.
-TEST(TestDecodeSony, DecodeGlobalCacheExample) {
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
-
- irsend.reset();
- // Sony "Power On" from Global Cache.
- uint16_t gc_test[29] = {40000, 1, 1, 96, 24, 24, 24, 48, 24, 48, 24, 48, 24,
- 24, 24, 48, 24, 24, 24, 48, 24, 24, 24, 24, 24, 24,
- 24, 24, 1013};
- irsend.sendGC(gc_test, 29);
- irsend.makeDecodeResult();
-
- // Without strict.
- ASSERT_TRUE(irrecv.decodeSony(&irsend.capture));
- EXPECT_EQ(SONY, irsend.capture.decode_type);
- EXPECT_EQ(12, irsend.capture.bits);
- EXPECT_EQ(0x750, irsend.capture.value);
- EXPECT_EQ(0x1, irsend.capture.address);
- EXPECT_EQ(0x2E, irsend.capture.command);
- // With strict and correct size.
- ASSERT_TRUE(irrecv.decodeSony(&irsend.capture, SONY_12_BITS, true));
-}
diff --git a/lib/IRremoteESP8266-2.2.1.02/tools/gc_decode.cpp b/lib/IRremoteESP8266-2.2.1.02/tools/gc_decode.cpp
deleted file mode 100644
index 9c3d316cabf3..000000000000
--- a/lib/IRremoteESP8266-2.2.1.02/tools/gc_decode.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-// Quick and dirty tool to decode GlobalCache (GC) codes
-// Copyright 2017 Jorge Cisneros
-
-#include
-#include
-#include
-#include
-#include "IRsend.h"
-#include "IRsend_test.h"
-
-#define MAX_GC_CODE_LENGHT 512
-
-void str_to_uint16(char *str, uint16_t *res) {
- char *end;
- errno = 0;
- intmax_t val = strtoimax(str, &end, 10);
- if (errno == ERANGE || val < 0 || val > UINT16_MAX ||
- end == str || *end != '\0')
- return;
- *res = (uint16_t) val;
-}
-
-std::string encoding(decode_results *results) {
- switch (results->decode_type) {
- default:
- case UNKNOWN: return "UNKNOWN"; break;
- case NEC: return "NEC"; break;
- case NEC_LIKE: return "NEC (non-strict)"; break;
- case SONY: return "SONY"; break;
- case RC5: return "RC5"; break;
- case RC5X: return "RC5X"; break;
- case RC6: return "RC6"; break;
- case RCMM: return "RCMM"; break;
- case DISH: return "DISH"; break;
- case SHARP: return "SHARP"; break;
- case JVC: return "JVC"; break;
- case SANYO: return "SANYO"; break;
- case SANYO_LC7461: return "SANYO_LC7461"; break;
- case MITSUBISHI: return "MITSUBISHI"; break;
- case SAMSUNG: return "SAMSUNG"; break;
- case LG: return "LG"; break;
- case WHYNTER: return "WHYNTER"; break;
- case AIWA_RC_T501: return "AIWA_RC_T501"; break;
- case PANASONIC: return "PANASONIC"; break;
- case DENON: return "DENON"; break;
- case COOLIX: return "COOLIX"; break;
- case NIKAI: return "NIKAI"; break;
- }
-}
-
-void usage_error(char * name) {
- std::cerr << "Usage: " << name << " [-raw] " << std::endl;
-}
-
-int main(int argc, char * argv[]) {
- int argv_offset = 1;
- bool dumpraw = false;
-
- // Check the invocation/calling usage.
- if (argc < 2 || argc > 3) {
- usage_error(argv[0]);
- return 1;
- }
- if (strncmp("-raw", argv[argv_offset], 4) == 0) {
- dumpraw = true;
- argv_offset++;
- }
- if (argc - argv_offset != 1) {
- usage_error(argv[0]);
- return 1;
- }
-
- uint16_t gc_test[MAX_GC_CODE_LENGHT];
- int index = 0;
- char *pch;
- char *saveptr1;
-
- pch = strtok_r(argv[argv_offset], ",", &saveptr1);
- while (pch != NULL && index < MAX_GC_CODE_LENGHT) {
- str_to_uint16(pch, &gc_test[index]);
- pch = strtok_r(NULL, ",", &saveptr1);
- index++;
- }
-
- IRsendTest irsend(4);
- IRrecv irrecv(4);
- irsend.begin();
- irsend.reset();
-
- irsend.sendGC(gc_test, index);
- irsend.makeDecodeResult();
- irrecv.decode(&irsend.capture);
-
- std::cout << "Code GC length " << index << std::endl
- << "Code type " << irsend.capture.decode_type
- << " (" << encoding(&irsend.capture) << ")" << std::endl
- << "Code bits " << irsend.capture.bits << std::endl
- << "Code value 0x" << std::hex << irsend.capture.value << std::endl
- << "Code address 0x" << std::hex << irsend.capture.address << std::endl
- << "Code command 0x" << std::hex << irsend.capture.command << std::endl;
-
- if (dumpraw || irsend.capture.decode_type == UNKNOWN)
- irsend.dumpRawResult();
-
- return 0;
-}
diff --git a/lib/IRremoteESP8266-2.2.1.02/.github/CONTRIBUTING.md b/lib/IRremoteESP8266-2.5.2.03/.github/CONTRIBUTING.md
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/.github/CONTRIBUTING.md
rename to lib/IRremoteESP8266-2.5.2.03/.github/CONTRIBUTING.md
diff --git a/lib/IRremoteESP8266-2.2.1.02/.github/Contributors.md b/lib/IRremoteESP8266-2.5.2.03/.github/Contributors.md
similarity index 91%
rename from lib/IRremoteESP8266-2.2.1.02/.github/Contributors.md
rename to lib/IRremoteESP8266-2.5.2.03/.github/Contributors.md
index 151a0c03d116..5f75ea3b49bd 100644
--- a/lib/IRremoteESP8266-2.2.1.02/.github/Contributors.md
+++ b/lib/IRremoteESP8266-2.5.2.03/.github/Contributors.md
@@ -10,6 +10,8 @@
- [Jonny Graham](https://github.com/jonnygraham/)
- [Stu Fisher](https://github.com/stufisher/)
- [Jorge Cisneros](https://github.com/jorgecis/)
+- [Denes Varga](https://github.com/denxhun/)
+- [Brett T. Warden](https://github.com/bwarden/)
All contributors can be found on the [contributors site](https://github.com/markszabo/IRremoteESP8266/graphs/contributors).
diff --git a/lib/IRremoteESP8266-2.2.1.02/.github/issue_template.md b/lib/IRremoteESP8266-2.5.2.03/.github/issue_template.md
similarity index 84%
rename from lib/IRremoteESP8266-2.2.1.02/.github/issue_template.md
rename to lib/IRremoteESP8266-2.5.2.03/.github/issue_template.md
index 664b995708a4..024a0398c418 100644
--- a/lib/IRremoteESP8266-2.2.1.02/.github/issue_template.md
+++ b/lib/IRremoteESP8266-2.5.2.03/.github/issue_template.md
@@ -1,7 +1,7 @@
_(Please use this template for reporting issues. You can delete what ever is not relevant. Giving us this information will help us help you faster. Please also read the [FAQ](https://github.com/markszabo/IRremoteESP8266/wiki/Frequently-Asked-Questions) & [Troubleshooting Guide](https://github.com/markszabo/IRremoteESP8266/wiki/Troubleshooting-Guide). Your problem may already have an answer there.)_
### Version/revison of the library used
-_Typically located in the `library.json` file in the root directory of the library.
+_Typically located in the `library.json` & `src/IRremoteESP8266.h` files in the root directory of the library.
e.g. v2.0.0, or 'master' as at 1st of June, 2017. etc._
### Expected behavior
@@ -30,10 +30,13 @@ _What can we do to (pref. reliably) repeat what is happening?_
_Include all relevant code snippets or links to the actual code files. Tip: [How to quote your code so it is still readable](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#code)._
#### Circuit diagram and hardware used (if applicable)
-_Link to an image of the circuit diagram used._
+_Link to an image of the circuit diagram used. Part number of the IR receiver module etc._
### I have followed the steps in the [Troubleshooting Guide](https://github.com/markszabo/IRremoteESP8266/wiki/Troubleshooting-Guide) & read the [FAQ](https://github.com/markszabo/IRremoteESP8266/wiki/Frequently-Asked-Questions)
_Yes/No._
+### Has this library/code previously worked as expected for you?
+_Yes/No. If "Yes", which version last worked for you?_
+
### Other useful information
_More information is always welcome. Be verbose._
diff --git a/lib/IRremoteESP8266-2.2.1.02/.gitignore b/lib/IRremoteESP8266-2.5.2.03/.gitignore
similarity index 88%
rename from lib/IRremoteESP8266-2.2.1.02/.gitignore
rename to lib/IRremoteESP8266-2.5.2.03/.gitignore
index 6d57ebaab1bf..23e21ca3e322 100644
--- a/lib/IRremoteESP8266-2.2.1.02/.gitignore
+++ b/lib/IRremoteESP8266-2.5.2.03/.gitignore
@@ -23,6 +23,9 @@ lib/googletest/**/*
# GCC pre-compiled headers.
**/*.gch
+# Python compiled files
+**/*.pyc
+
# Unit Test builds
test/*.o
test/*.a
@@ -32,8 +35,12 @@ test/*_test
tools/*.o
tools/*.a
tools/gc_decode
+tools/mode2_decode
.pioenvs
.piolibdeps
.clang_complete
.gcc-flags.json
+
+#Cygwin builds
+*.exe
diff --git a/lib/IRremoteESP8266-2.2.1.02/.gitmodules b/lib/IRremoteESP8266-2.5.2.03/.gitmodules
similarity index 85%
rename from lib/IRremoteESP8266-2.2.1.02/.gitmodules
rename to lib/IRremoteESP8266-2.5.2.03/.gitmodules
index 80925b865c5a..c28fe0509892 100644
--- a/lib/IRremoteESP8266-2.2.1.02/.gitmodules
+++ b/lib/IRremoteESP8266-2.5.2.03/.gitmodules
@@ -1,3 +1,4 @@
[submodule "lib/googletest"]
path = lib/googletest
url = https://github.com/google/googletest.git
+ branch = v1.8.x
diff --git a/lib/IRremoteESP8266-2.5.2.03/.style.yapf b/lib/IRremoteESP8266-2.5.2.03/.style.yapf
new file mode 100644
index 000000000000..65fa0ee33805
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/.style.yapf
@@ -0,0 +1,3 @@
+[style]
+based_on_style: google
+indent_width: 2
diff --git a/lib/IRremoteESP8266-2.2.1.02/.travis.yml b/lib/IRremoteESP8266-2.5.2.03/.travis.yml
similarity index 94%
rename from lib/IRremoteESP8266-2.2.1.02/.travis.yml
rename to lib/IRremoteESP8266-2.5.2.03/.travis.yml
index 33d91ba471ea..4331425e9ca4 100644
--- a/lib/IRremoteESP8266-2.2.1.02/.travis.yml
+++ b/lib/IRremoteESP8266-2.5.2.03/.travis.yml
@@ -20,6 +20,7 @@ install:
- arduino --board $BD --save-prefs
- arduino --pref "compiler.warning_level=all" --save-prefs
- sudo apt-get install jq
+ - sudo pip install pylint
script:
# Check that everything compiles.
- arduino --verify --board $BD $PWD/examples/IRrecvDemo/IRrecvDemo.ino
@@ -38,14 +39,17 @@ script:
- arduino --verify --board $BD $PWD/examples/LGACSend/LGACSend.ino
- arduino --verify --board $BD $PWD/examples/TurnOnArgoAC/TurnOnArgoAC.ino
- arduino --verify --board $BD $PWD/examples/IRMQTTServer/IRMQTTServer.ino
+ - arduino --verify --board $BD $PWD/examples/TurnOnToshibaAC/TurnOnToshibaAC.ino
# Also check the tools programs compile.
- (cd tools; make all)
# Check for lint issues.
- shopt -s nullglob
- python cpplint.py --extensions=c,cc,cpp,ino --headers=h,hpp {src,test,tools}/*.{h,c,cc,cpp,hpp,ino} examples/*/*.{h,c,cc,cpp,hpp,ino}
+ - pylint {src,test,tools}/*.py
- shopt -u nullglob
# Build and run the unit tests.
- (cd test; make run)
+ - (cd tools; make run_tests)
# Check the version numbers match.
- LIB_VERSION=$(egrep "^#define\s+_IRREMOTEESP8266_VERSION_\s+" src/IRremoteESP8266.h | cut -d\" -f2)
- test ${LIB_VERSION} == "$(jq -r .version library.json)"
diff --git a/lib/IRremoteESP8266-2.2.1.02/CPPLINT.cfg b/lib/IRremoteESP8266-2.5.2.03/CPPLINT.cfg
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/CPPLINT.cfg
rename to lib/IRremoteESP8266-2.5.2.03/CPPLINT.cfg
diff --git a/lib/IRremoteESP8266-2.2.1.02/LICENSE.txt b/lib/IRremoteESP8266-2.5.2.03/LICENSE.txt
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/LICENSE.txt
rename to lib/IRremoteESP8266-2.5.2.03/LICENSE.txt
diff --git a/lib/IRremoteESP8266-2.5.2.03/README.md b/lib/IRremoteESP8266-2.5.2.03/README.md
new file mode 100644
index 000000000000..bb9d5a9d8137
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/README.md
@@ -0,0 +1,78 @@
+# IRremote ESP8266 Library
+
+[![Build Status](https://travis-ci.org/markszabo/IRremoteESP8266.svg?branch=master)](https://travis-ci.org/markszabo/IRremoteESP8266)
+[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/markszabo/IRremoteESP8266.svg)](http://isitmaintained.com/project/markszabo/IRremoteESP8266 "Average time to resolve an issue")
+[![Percentage of issues still open](http://isitmaintained.com/badge/open/markszabo/IRremoteESP8266.svg)](http://isitmaintained.com/project/markszabo/IRremoteESP8266 "Percentage of issues still open")
+[![GitLicense](https://gitlicense.com/badge/markszabo/IRremoteESP8266)](https://gitlicense.com/license/markszabo/IRremoteESP8266)
+
+This library enables you to **send _and_ receive** infra-red signals on an [ESP8266 using the Arduino framework](https://github.com/esp8266/Arduino) using common 940nm IR LEDs and common IR receiver modules. e.g. TSOP{17,22,24,36,38,44,48}* etc.
+
+## v2.5.2 Now Available
+Version 2.5.2 of the library is now [available](https://github.com/markszabo/IRremoteESP8266/releases/latest). You can view the [Release Notes](ReleaseNotes.md) for all the significant changes.
+
+#### Upgrading from pre-v2.0
+Usage of the library has been slightly changed in v2.0. You will need to change your usage to work with v2.0 and beyond. You can read more about the changes required on our [Upgrade to v2.0](https://github.com/markszabo/IRremoteESP8266/wiki/Upgrading-to-v2.0) page.
+
+#### Upgrading from pre-v2.5
+The library has changed from using constants declared as `#define` to
+[const](https://google.github.io/styleguide/cppguide.html#Constant_Names) with
+the appropriate naming per the
+[C++ style guide](https://google.github.io/styleguide/cppguide.html).
+This may potentially cause old programs to not compile.
+The most likely externally used `#define`s have been _aliased_ for limited
+backward compatibility for projects using the old style. Going forward, only the
+new `kConstantName` style will be supported for new protocol additions.
+
+In the unlikely case it does break your code, then you may have been referencing
+something you likely should not have. You should be able to quickly determine
+the new name from the old. e.g. `CONSTANT_NAME` to `kConstantName`.
+Use common sense or examining the library's code if this does affect code.
+
+## Troubleshooting
+Before reporting an issue or asking for help, please try to follow our [Troubleshooting Guide](https://github.com/markszabo/IRremoteESP8266/wiki/Troubleshooting-Guide) first.
+
+## Frequently Asked Questions
+Some common answers to common questions and problems are on our [F.A.Q. wiki page](https://github.com/markszabo/IRremoteESP8266/wiki/Frequently-Asked-Questions).
+
+## Installation
+##### Official releases via the Arduino IDE v1.8+ (Windows & Linux)
+1. Click the _"Sketch"_ -> _"Include Library"_ -> _"Manage Libraries..."_ Menu items.
+1. Enter `IRremoteESP8266` into the _"Filter your search..."_ top right search box.
+1. Click on the IRremoteESP8266 result of the search.
+1. Select the version you wish to install and click _"Install"_.
+
+##### Manual Installation for Windows
+1. Click on _"Clone or Download"_ button, then _"[Download ZIP](https://github.com/markszabo/IRremoteESP8266/archive->master.zip)"_ on the page.
+1. Extract the contents of the downloaded zip file.
+1. Rename the extracted folder to _"IRremoteESP8266"_.
+1. Move this folder to your libraries directory. (under windows: `C:\Users\YOURNAME\Documents\Arduino\libraries\`)
+1. Restart your Arduino IDE.
+1. Check out the examples.
+
+##### Using Git to install library ( Linux )
+```
+cd ~/Arduino/libraries
+git clone https://github.com/markszabo/IRremoteESP8266.git
+```
+###### To Update to the latest version of the library
+```
+cd ~/Arduino/libraries/IRremoteESP8266 && git pull
+```
+
+## Contributing
+If you want to [contribute](.github/CONTRIBUTING.md#how-can-i-contribute) to this project, consider:
+- [Report](.github/CONTRIBUTING.md#reporting-bugs) bugs and errors
+- Ask for enhancements
+- Improve our documentation
+- [Create issues](.github/CONTRIBUTING.md#reporting-bugs) and [pull requests](.github/CONTRIBUTING.md#pull-requests)
+- Tell other people about this library
+
+## Contributors
+Available [here](.github/Contributors.md)
+
+## Library History
+This library was originally based on Ken Shirriff's work (https://github.com/shirriff/Arduino-IRremote/)
+
+[Mark Szabo](https://github.com/markszabo/IRremoteESP8266) has updated the IRsend class to work on ESP8266 and [Sebastien Warin](https://github.com/sebastienwarin/IRremoteESP8266) the receiving & decoding part (IRrecv class).
+
+As of v2.0, the library was almost entirely re-written with the ESP8266's resources in mind.
diff --git a/lib/IRremoteESP8266-2.5.2.03/ReleaseNotes.md b/lib/IRremoteESP8266-2.5.2.03/ReleaseNotes.md
new file mode 100644
index 000000000000..56e84dd89a96
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/ReleaseNotes.md
@@ -0,0 +1,308 @@
+# Release Notes
+
+## _v2.5.2 (20181021)_
+
+**[Bug Fixes]**
+- Add missing send() method to IRPanasonicAC class. (#545)
+- Add missing sendWhirlpoolAC() to IRMQTTServer.ino (#558)
+
+**[Features]**
+- Add IR receiving support to IRMQTTServer. (#543)
+- Pioneer support (#547)
+- Add support for a second LG protocol variant. (#552)
+- Support for short Panasonic A/C messages. (#553)
+- Add support for Panasonic CKP series A/Cs. (#554)
+- Experimental timer/clock support for Panasonic A/Cs. (#546)
+- Add Made With Magic (MWM) support (#557)
+
+**[Misc]**
+- Grammar and typo fixes (#541, #549)
+- Increase Panasonic A/C message tolerances. (#542)
+- Added command mode2_decode in tools/ (#557)
+- General code style cleanup (#560)
+
+
+## _v2.5.1 (20181002)_
+
+**[Bug Fixes]**
+- Correct the byte used for Samsung AC Swing. (#529)
+- Fix not sending Samsung A/C messages in IRMQTTServer. (#529)
+
+**[Features]**
+- Experimental support for Electra A/C messages. (#528)
+- Experimental support for Panasonic A/C messages. (#535)
+- Samsung A/C fixes & improvements (#529)
+- IRMQTTServer v0.6.0 (#530)
+
+**[Misc]**
+- Change required WifiManager lib version to v0.14
+- Add alias for RAWTICK to kRawTick. (#535)
+- Update sendLutron() status. (#515)
+- Remove leftover debug message in IRrecvDumpV2 (#526)
+
+
+## _v2.5.0 (20180919)_
+
+**[Bug Fixes]**
+- Fix HTML menu error for GICABLE in IRMQTTServer. (#516)
+- Fix Mitsubishi A/C mode setting. (#514)
+- Add missing ',' in auto analyse tool generated code. (#513)
+- Fix Fujitsu checksum validation. (#501)
+- Remove errant Repeat debug statement in IRMQTTServer. (#507)
+
+**[Features]**
+- Mitsubishi A/C decode improvements. (#514)
+- Basic support for Whirlpool A/C messages. (#511)
+- Basic support for Samsung A/C messages. (#512)
+- Experimental support for detailed Samsung A/C messages. (#521)
+- Experimental support for detailed Coolix A/C messages. (#518)
+- Experimental support for Lutron protocol. (#516)
+- Calculate and use average values for timings in analysing tool. (#513)
+
+**[Misc]**
+- Style change from using #define's for constants to `const kConstantName`.
+- Improve the JVC example code.
+
+
+## _v2.4.3 (20180727)_
+
+**[Bug Fixes]**
+- Handle Space Gaps better in auto analyse tool. (#482)
+- Correct min repeat for GICABLE in IRMQTTServer. (#494)
+
+**[Features]**
+- Add static IP config option to IRMQTTServer (#480)
+- Full decoding/encoding support for the Haier YRW02 A/C. (#485 #486 #487)
+
+**[Misc]**
+- Update LG (28-bit) HDR mark and space timings. (#492)
+- Spelling and grammar fixes (#491)
+
+
+## _v2.4.2 (20180601)_
+
+**[Bug Fixes]**
+- Timing Fix: Update the period offset compensation.
+
+**[Features]**
+- Improvements for IRMQTTServer example (#466)
+
+
+## _v2.4.1 (20180520)_
+
+**[Bug Fixes]**
+- Fix crash in IRMQTTServer when compiled under Arduino IDE. (#455)
+- Default bit length not set for RCMM in IRMQTTServer example. (#456)
+- Bad acknowledgements for some A/C protocols in IRMQTTServer example. (#460)
+
+**[Features]**
+- Allow disabling the use of delay() calls. (#450)
+- Initial support for G.I. Cable protocol. (#458)
+- Support of Hitachi A/C 13 & 53 byte messages. (#461)
+
+**[Misc]**
+- Auto Analyse Raw Data script converted to Python. (#454)
+
+## _v2.4.0 (20180407)_
+
+**[Bug Fixes]**
+- Add missing WiFi.begin() call to IRGCTCPServer example. (#433)
+- Add missing sendHaierAC() to IRMQTTServer example. (#434 & #444)
+- Make mqtt clientid unique in IRMQTTServer example. (#444)
+
+**[Features]**
+
+- Initial Mitsubishi projector protocol support. (#442)
+- Experimental support of Hitachi A/C messages. (#445)
+- Improve transmission pulse modulation support.
+ Allow disabling of transmission frequency modulation.(#439)
+
+**[Misc]**
+- IRMQTTServer example improvements. (#444)
+
+
+## _v2.3.3 (20180302)_
+
+**[Bug Fixes]**
+- Ensure the IR LED is off before we start. (#405)
+
+**[Features]**
+- Experimental decode support for Gree HVAC units (#397)
+- Initial support for Haier A/Cs. (#409)
+- Improve timing accuracy of unit tests. (#403)
+- Rework matchData() to handle equal total data bit time protocols. (#408)
+
+**[Misc]**
+- Add startup text to IRrecvDumpV2 and IRrecvDemo (#412)
+- Tweak timings on Fujitsu A/C header (#418)
+- AutoAnalyseRawData.sh: Add some support for handling larger than 64 bit codes. (#419)
+- Use better comments for send GPIO in examples. (#425)
+
+
+## _v2.3.2 (20180126)_
+
+**[Bug Fixes]**
+- Integer underflow caused device not to respond in `sendJVC()` (#401)
+
+**[Features]**
+- Initial support for sending & receiving Carrier HVAC codes. (#387)
+- Add Pronto HEX code support to _gc_decode_ tool. (#388)
+
+**[Misc]**
+- Make mDNS independent of MQTT in IRMQTTServer example code. (#390 #391)
+
+
+## _v2.3.1 (20171229)_
+
+**[Bug Fixes]**
+- Setting `#define SEND_FUJITSU_AC false` caused a compilation error (#375)
+- Integer underflow caused huge `space()` in `sendGeneric()` (#381)
+
+**[Features]**
+- Support sending & receiving Lasertag codes. (#374)
+- Reduce the library footprint by using a new `sendGeneric()` routine. (#373)
+
+**[Misc]**
+- Lots of grammar & typo fixes. (#378)
+- Update keywords.txt for Arduino IDE users (#371)
+- Update pins in examples so they are compatible with Adafruit boards. (#383)
+
+
+## _v2.3.0 (20171208)_
+
+**[Bug Fixes]**
+- Panasonic-based protocols had incorrect message gap. (#358)
+- Formatting error for large rawData values in example code. (#355)
+- Off-by-one error in payload_copy malloc. (#337)
+- Off-by-one error in unit test helper routines (#363)
+
+**[Features]**
+- Support sending and receiving Midea A/C codes.
+- Support for receiving Kelvinator A/C codes. (#332)
+- Support more operation features for Daikin A/Cs.
+- Support for decoding Daikin A/Cs.
+- Support sending and receiving Toshiba A/Cs. (#333)
+- Support sending and receiving AR-DB1 Fujitsu A/C codes. (#367)
+- Add new AutoAnalyseRawData.sh & RawToGlobalCache.sh tools (#345) (#343)
+- Support for MagiQuest wands. (#365)
+
+**[Misc]**
+- Add checksum verification to Kelvinator A/C decodes. (#348)
+- Changes to the threshold reporting of UNKNOWN messages (#347)
+- Major re-work of Daikin A/C support.
+- Sending for all A/Cs added to MQTT example code.
+- MQTT example code improvements. (#334)
+- IRrecvDumpV2 significant output improvements. (#363)
+- Improved unit test coverage for the library.
+
+
+## _v2.2.1 (20171025)_
+
+**[Features]**
+- Support for sending and decoding Nikai TV messages. (#311, #313)
+- gc_decode: External utility to decode Global Cache codes. (#308, #312)
+- IRMQTTServer: Example code to send IR messages via HTTP & MQTT. (#316, #323)
+- Improve converting 64bit values to hexadecimal. (#318)
+
+**[Misc]**
+- IRrecvDump.ino code is now deprecated. Use IRrecvDumpV2.ino instead. (#314)
+
+
+## _v2.2.0 (20170922)_
+
+**[Bug Fixes]**
+- Add printing output of RC-MM and RC-5X protocols in example code. (#284)
+- LG timing improvements based on observations (#291)
+
+**[Features]**
+- Automatic capture timing calibration for some protocols. (#268)
+- Support for creating & sending Trotec AC codes. (#279)
+- Support for creating & sending Argo Ulisse 13 DCI codes. (#280 #300)
+- Move to 2 microsecond timing resolution for capture of codes. (#287)
+- Capture buffer changes:
+- Size at runtime. (#276)
+- Message timeout at runtime. (#294)
+- Simplify creating & using a second buffer (#303)
+- New example code:
+ - Trotec A/C (#279)
+ - LG A/C units (#289)
+ - Argo Ulisse 13 DCI codes. (#300)
+
+
+## _v2.1.1 (20170711)_
+
+**[Bug Fixes]**
+- GlobalCache incorrectly using hardware offset for period calc. (#267)
+
+**[Features]**
+- Support reporting of 'NEC'-like 32-bit protocols. e.g. Apple TV remote (#265)
+- Add an example of sendRaw() to IRsendDemo.ino (#270)
+
+
+## _v2.1.0 (20170704)_
+
+**[Features]**
+- Support for sending Pronto IR codes. (#248)
+- Support for sending Fujitsu A/C codes. (#88)
+- Minor improvements to examples.
+
+
+## _v2.0.3 (20170618)_
+
+**[Bug fixes]**
+- Capture buffer could become corrupt after large message, breaking subsequent decodes. (#253)
+
+
+## _v2.0.2 (20170615)_
+
+**[Bug fixes]**
+- Correct decode issue introduced in v2.0.1 affecting multiple protocol decoders (#243)
+- Correct post-message gap for the Panasonic protocol(s) (#245)
+- Incorrect display of the decoded uint64_t value in the example code. (#245)
+
+
+## _v2.0.1 (20170614)_
+
+**[Bug fixes]**
+- Decoding protocols when it doesn't detect a post-command gap, and there is no more data. (#243)
+- Incorrect minimum size calculation when there is no post-command gap. (#243)
+
+
+## _v2.0.0 - 64 bit support and major improvements (20170612)_
+
+**[Misc]**
+- This is almost a complete re-write of the library.
+
+**[Features]**
+- All suitable protocols now handle 64-bit data messages and are repeatable via an optional argument.
+- Unit tests for all protocols.
+- Far better and stricter decoding for most protocols.
+- Address & command decoding for protocols where that information is available.
+- Much more precise timing for generation of signals sent.
+- Lower duty-cycles for some protocols.
+- Several new protocols added, and some new sending and decoding routines for existing ones.
+- Ability to optionally chose which protocols are included, enabling faster decoding and smaller code footprints if desired.
+- Support for far larger capture buffers. (e.g. RAWLEN > 256)
+
+**[Bug fixes]**
+- Numerous bug fixes.
+
+
+## _v1.2.0 (20170429)_
+
+**[Features]**
+- Add ability to copy IR capture buffer, and continue capturing. Means faster and better IR command decoding.
+- Reduce IRAM usage by 28 bytes.
+- Improve capture of RC-MM & Panasonic protocols.
+- Upgrade IRrecvDumpV2 to new IR capture buffer. Much fewer corrupted/truncated IR messages.
+
+
+## _v1.1.1 (20170413)_
+
+**[Bug fixes]**
+- Fix a reported problem when sending the LG protocol. Preemptive fix for possible similar cases.
+- Fix minor issues in examples.
+
+**[Features]**
+- Add documentation to some examples to aid new people.
+- Add ALPHA support for RC-MM protocol. (Known to be currently not 100% working.)
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/IRGCSendDemo/IRGCSendDemo.ino b/lib/IRremoteESP8266-2.5.2.03/examples/IRGCSendDemo/IRGCSendDemo.ino
similarity index 66%
rename from lib/IRremoteESP8266-2.2.1.02/examples/IRGCSendDemo/IRGCSendDemo.ino
rename to lib/IRremoteESP8266-2.5.2.03/examples/IRGCSendDemo/IRGCSendDemo.ino
index b36938e3dae6..03c80e18b72c 100644
--- a/lib/IRremoteESP8266-2.2.1.02/examples/IRGCSendDemo/IRGCSendDemo.ino
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/IRGCSendDemo/IRGCSendDemo.ino
@@ -11,7 +11,8 @@
* Based on Ken Shirriff's IrsendDemo
* Version 0.1 July, 2009
*
- * An IR LED circuit *MUST* be connected to ESP8266 pin 4 (D2).
+ * An IR LED circuit *MUST* be connected to the ESP8266 on a pin
+ * as specified by IR_LED below.
*
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
*
@@ -23,12 +24,13 @@
* have enough current to drive the IR LED effectively.
* * Make sure you have the IR LED polarity correct.
* See: https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity
- * * Typical digital camera/phones can be used to see if the IR LED is flashed.
- * Replace the IR LED with a normal LED if you don't have a digital camera
- * when debugging.
+ * * Typical digital camera/phones can be used to see if the IR LED is
+ * flashed. Replace the IR LED with a normal LED if you don't have a digital
+ * camera when debugging.
* * Avoid using the following pins unless you really know what you are doing:
* * Pin 0/D3: Can interfere with the boot/program mode & support circuits.
- * * Pin 1/TX/TXD0: Any serial transmissions from the ESP8266 will interfere.
+ * * Pin 1/TX/TXD0: Any serial transmissions from the ESP8266 will
+ * interfere.
* * Pin 3/RX/RXD0: Any serial transmissions to the ESP8266 will interfere.
* * ESP-01 modules are tricky. We suggest you use a module with more GPIOs
* for your first time. e.g. ESP-12 etc.
@@ -44,12 +46,15 @@
// These codes can be found in GC's Control Tower database.
uint16_t Samsung_power_toggle[71] = {
- 38000, 1, 1, 170, 170, 20, 63, 20, 63, 20, 63, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 63, 20, 63, 20, 63, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 63, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 63, 20,
- 20, 20, 63, 20, 63, 20, 63, 20, 63, 20, 63, 20, 63, 20, 1798};
+ 38000, 1, 1, 170, 170, 20, 63, 20, 63, 20, 63, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 63, 20, 63, 20, 63, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 63, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 63, 20, 20, 20, 63, 20,
+ 63, 20, 63, 20, 63, 20, 63, 20, 63, 20, 1798};
-IRsend irsend(4); // An IR LED is controlled by GPIO pin 4 (D2)
+#define IR_LED 4 // ESP8266 GPIO pin to use. Recommended: 4 (D2).
+
+IRsend irsend(IR_LED); // Set the GPIO to be used to sending the message.
void setup() {
irsend.begin();
@@ -58,6 +63,10 @@ void setup() {
void loop() {
Serial.println("Toggling power");
+#if SEND_GLOBALCACHE
irsend.sendGC(Samsung_power_toggle, 71);
+#else // SEND_GLOBALCACHE
+ Serial.println("Can't send because SEND_GLOBALCACHE has been disabled.");
+#endif // SEND_GLOBALCACHE
delay(10000);
}
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/IRGCSendDemo/platformio.ini b/lib/IRremoteESP8266-2.5.2.03/examples/IRGCSendDemo/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/examples/IRGCSendDemo/platformio.ini
rename to lib/IRremoteESP8266-2.5.2.03/examples/IRGCSendDemo/platformio.ini
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/IRGCTCPServer/IRGCTCPServer.ino b/lib/IRremoteESP8266-2.5.2.03/examples/IRGCTCPServer/IRGCTCPServer.ino
similarity index 89%
rename from lib/IRremoteESP8266-2.2.1.02/examples/IRGCTCPServer/IRGCTCPServer.ino
rename to lib/IRremoteESP8266-2.5.2.03/examples/IRGCTCPServer/IRGCTCPServer.ino
index 2fd38be42a40..69f7299fb7c5 100644
--- a/lib/IRremoteESP8266-2.2.1.02/examples/IRGCTCPServer/IRGCTCPServer.ino
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/IRGCTCPServer/IRGCTCPServer.ino
@@ -9,7 +9,7 @@
* For more codes, visit: https://irdb.globalcache.com/
*
* How to use this program:
- * 1) Update "ssid" and "password" below for your WIFI network.
+ * 1) Update "kSsid" and "kPassword" below for your WIFI network.
* 2) Compile and upload the sketch to your ESP8266 module.
* 3) (Optional) Use the serial connection to confirm it started and get the
* IP address.
@@ -46,14 +46,16 @@
#include
#include
-const char* ssid = "..."; // Put your WIFI SSID here.
-const char* password = "..."; // Put your WIFI password here.
+const char* kSsid = "..."; // Put your WIFI SSID here.
+const char* kPassword = "..."; // Put your WIFI Password here.
WiFiServer server(4998); // Uses port 4998.
WiFiClient client;
uint16_t *code_array;
-IRsend irsend(4); // An IR LED is controlled by GPIO pin 4 (D2)
+#define IR_LED 4 // ESP8266 GPIO pin to use. Recommended: 4 (D2).
+
+IRsend irsend(IR_LED); // Set the GPIO to be used to sending the message.
void sendGCString(String str) {
int16_t index;
@@ -89,7 +91,9 @@ void sendGCString(String str) {
count++;
} while (index != -1);
+#if SEND_GLOBALCACHE
irsend.sendGC(code_array, count); // All done. Send it.
+#endif // SEND_GLOBALCACHE
free(code_array); // Free up the memory allocated.
}
@@ -99,7 +103,7 @@ void setup() {
delay(100);
Serial.println(" ");
Serial.println("IR TCP Server");
-
+ WiFi.begin(kSsid, kPassword);
while (WiFi.status() != WL_CONNECTED) {
delay(900);
Serial.print(".");
@@ -107,7 +111,7 @@ void setup() {
server.begin();
IPAddress myAddress = WiFi.localIP();
- Serial.println(myAddress);
+ Serial.println(myAddress.toString());
irsend.begin();
}
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/IRGCTCPServer/platformio.ini b/lib/IRremoteESP8266-2.5.2.03/examples/IRGCTCPServer/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/examples/IRGCTCPServer/platformio.ini
rename to lib/IRremoteESP8266-2.5.2.03/examples/IRGCTCPServer/platformio.ini
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/IRMQTTServer/IRMQTTServer.ino b/lib/IRremoteESP8266-2.5.2.03/examples/IRMQTTServer/IRMQTTServer.ino
similarity index 55%
rename from lib/IRremoteESP8266-2.2.1.02/examples/IRMQTTServer/IRMQTTServer.ino
rename to lib/IRremoteESP8266-2.5.2.03/examples/IRMQTTServer/IRMQTTServer.ino
index e2c1f81d800f..7851cf5dc27d 100644
--- a/lib/IRremoteESP8266-2.2.1.02/examples/IRMQTTServer/IRMQTTServer.ino
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/IRMQTTServer/IRMQTTServer.ino
@@ -1,9 +1,11 @@
/*
- * Send arbitary IR codes via a web server or MQTT.
- * Copyright David Conran 2016
- * Version 0.3 Oct, 2017
+ * Send & receive arbitrary IR codes via a web server or MQTT.
+ * Copyright David Conran 2016, 2017, 2018
*
- * NOTE: An IR LED circuit *MUST* be connected to ESP8266 pin 4 (D2). See IR_LED
+ * NOTE: An IR LED circuit *MUST* be connected to ESP8266 GPIO4 (D2) if
+ * you want to send IR messages. See IR_LED below.
+ * A compatible IR RX modules *MUST* be connected to ESP8266 GPIO14 (D5)
+ * if you want to capture & decode IR nessages. See IR_RX below.
*
* WARN: This is very advanced & complicated example code. Not for beginners.
* You are strongly suggested to try & look at other example code first.
@@ -11,10 +13,14 @@
* # Instructions
*
* ## Before First Boot (i.e. Compile time)
- * - Set the MQTT_SERVER define below to the address of your MQTT server.
+ * - Either:
+ * o Set the MQTT_SERVER define below to the address of your MQTT server.
+ * or
+ * o Disable MQTT by commenting out the line "#define MQTT_ENABLE" down below.
+ *
* - Arduino IDE:
* o Install the following libraries via Library Manager
- * - WiFiManager (https://github.com/tzapu/WiFiManager)
+ * - WiFiManager (https://github.com/tzapu/WiFiManager) (Version >= 0.14)
* - PubSubClient (https://pubsubclient.knolleary.net/)
* o You MUST change to have the following (or larger) value:
* #define MQTT_MAX_PACKET_SIZE 512
@@ -63,13 +69,17 @@
* GlobalCache (31) & "40000,1,1,96,..." (Sony Vol Up)
* 25,Rrepeats,hex_code_string e.g. 25,R1,0000,006E,0022,0002,0155,00AA,0015,0040,0015,0040,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0040,0015,0040,0015,0015,0015,0040,0015,0015,0015,0015,0015,0015,0015,0040,0015,0015,0015,0015,0015,0040,0015,0040,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0040,0015,0015,0015,0015,0015,0040,0015,0040,0015,0040,0015,0040,0015,0040,0015,0640,0155,0055,0015,0E40
* Pronto (25), 1 repeat, & "0000 006E 0022 0002 ..." (Sherwood Amp Tape Input)
- * 18,really_long_hexcode e.g. 18,190B8050000000E0190B8070000010f0
+ * ac_protocol_num,really_long_hexcode e.g. 18,190B8050000000E0190B8070000010F0
* Kelvinator (18) Air Con on, Low Fan, 25 deg etc.
+ * NOTE: Ensure you zero-pad to the correct number of
+ * digits for the bit/byte size you want to send
+ * as some A/C units have units have different
+ * sized messages. e.g. Fujitsu A/C units.
* In short:
* No spaces after/before commas.
* Values are comma separated.
* The first value is always in Decimal.
- * For simple protocols, the next value (hexcode) is always hexidecimal.
+ * For simple protocols, the next value (hexcode) is always hexadecimal.
* The optional bit size is in decimal.
*
* Unix command line usage example:
@@ -87,6 +97,19 @@
* # Listen to MQTT acknowledgements.
* $ mosquitto_sub -h 10.20.0.253 -t ir_server/sent
*
+ * Incoming IR messages (from an IR remote control) will be transmitted to
+ * the MQTT topic 'ir_server/received'. The MQTT message will be formatted
+ * similar to what is required to for the 'sent' topic.
+ * e.g. "3,C1A2F00F,32" (Protocol,Value,Bits) for simple codes
+ * or "18,110B805000000060110B807000001070" (Protocol,Value) for complex codes
+ * Note: If the protocol is listed as -1, then that is an UNKNOWN IR protocol.
+ * You can't use that to recreate/resend an IR message. It's only for
+ * matching purposes and shouldn't be trusted.
+ *
+ * Unix command line usage example:
+ * # Listen via MQTT for IR messages captured by this server.
+ * $ mosquitto_sub -h 10.20.0.253 -t ir_server/received
+ *
* If DEBUG is turned on, there is additional information printed on the Serial
* Port.
*
@@ -111,6 +134,7 @@
#include
#include
#include
+#include
#include
#include
#ifdef MQTT_ENABLE
@@ -124,22 +148,43 @@
#include
#include
-// Configuration paramters
-#define IR_LED 4 // GPIO the IR LED is connected to/controlled by. GPIO 4 = D2.
-#define HTTP_PORT 80 // The port the HTTP server is listening on.
+// Configuration parameters
+// GPIO the IR LED is connected to/controlled by. GPIO 4 = D2.
+#define IR_LED 4
+// define IR_LED 3 // For an ESP-01 we suggest you use RX/GPIO3/Pin 7.
+//
+// GPIO the IR RX module is connected to/controlled by. GPIO 14 = D5.
+// Comment this out to disable receiving/decoding IR messages entirely.
+#define IR_RX 14
+const uint16_t kHttpPort = 80; // The TCP port the HTTP server is listening on.
+// Name of the device you want in mDNS.
+// NOTE: Changing this will change the MQTT path too unless you override it
+// via MQTTprefix below.
+#define HOSTNAME "ir_server"
+
+// We obtain our network config via DHCP by default but allow an easy way to
+// use a static IP config.
+#define USE_STATIC_IP false // Change to 'true' if you don't want to use DHCP.
+#if USE_STATIC_IP
+const IPAddress kIPAddress = IPAddress(10, 0, 1, 78);
+const IPAddress kGateway = IPAddress(10, 0, 1, 1);
+const IPAddress kSubnetMask = IPAddress(255, 255, 255, 0);
+#endif // USE_STATIC_IP
#ifdef MQTT_ENABLE
// Address of your MQTT server.
#define MQTT_SERVER "10.20.0.253" // <=- CHANGE ME
-#define MQTT_PORT 1883 // Default port used by MQTT servers.
+const uint16_t kMqttPort = 1883; // Default port used by MQTT servers.
// Set if your MQTT server requires a Username & Password to connect.
const char* mqtt_user = "";
const char* mqtt_password = "";
-#define MQTT_RECONNECT_TIME 5000 // Delay(ms) between reconnect tries.
+const uint32_t kMqttReconnectTime = 5000; // Delay(ms) between reconnect tries.
-#define MQTTprefix "ir_server"
+#define MQTTprefix HOSTNAME // Change this if you want the MQTT topic to be
+ // independent of the hostname.
#define MQTTack MQTTprefix "/sent" // Topic we send back acknowledgements on
#define MQTTcommand MQTTprefix "/send" // Topic we get new commands from.
+#define MQTTrecv MQTTprefix "/received" // Topic we send received IRs to.
#endif // MQTT_ENABLE
// HTML arguments we will parse for IR code information.
@@ -147,27 +192,71 @@ const char* mqtt_password = "";
#define argData "code"
#define argBits "bits"
#define argRepeat "repeats"
-#define DEBUG True
+// Let's use a larger than normal buffer so we can handle AirCon remote codes.
+const uint16_t kCaptureBufferSize = 1024;
+#if DECODE_AC
+// Some A/C units have gaps in their protocols of ~40ms. e.g. Kelvinator
+// A value this large may swallow repeats of some protocols
+const uint8_t kCaptureTimeout = 50;
+#else // DECODE_AC
+// Suits most messages, while not swallowing many repeats.
+const uint8_t kCaptureTimeout = 15;
+#endif // DECODE_AC
+// Ignore unknown messages with <10 pulses
+const uint16_t kMinUnknownSize = 20;
+
+#define _MY_VERSION_ "v0.7.0"
+
+// Disable debug output if any of the IR pins are on the TX (D1) pin.
+#if (IR_LED != 1 && IR_RX != 1)
+#undef DEBUG
+#define DEBUG true // Change to 'false' to disable all serial output.
+#else
+#undef DEBUG
+#define DEBUG false
+#endif
+// NOTE: Make sure you set your Serial Monitor to the same speed.
+#define BAUD_RATE 115200 // Serial port Baud rate.
// Globals
-ESP8266WebServer server(HTTP_PORT);
+ESP8266WebServer server(kHttpPort);
IRsend irsend = IRsend(IR_LED);
+#ifdef IR_RX
+IRrecv irrecv(IR_RX, kCaptureBufferSize, kCaptureTimeout, true);
+decode_results capture; // Somewhere to store inbound IR messages.
+#endif // IR_RX
MDNSResponder mdns;
WiFiClient espClient;
WiFiManager wifiManager;
uint16_t *codeArray;
-uint32_t lastReconnectAttempt = 0; // MQTT last attemps reconnection number
+uint32_t lastReconnectAttempt = 0; // MQTT last attempt reconnection number
bool boot = true;
-bool ir_lock = false; // Primative locking for gating the IR LED.
+bool ir_lock = false; // Primitive locking for gating the IR LED.
+uint32_t sendReqCounter = 0;
+bool lastSendSucceeded = false; // Store the success status of the last send.
+uint32_t lastSendTime = 0;
+int8_t offset; // The calculated period offset for this chip and library.
#ifdef MQTT_ENABLE
+String lastMqttCmd = "None";
+uint32_t lastMqttCmdTime = 0;
+uint32_t lastConnectedTime = 0;
+uint32_t lastDisconnectedTime = 0;
+uint32_t mqttDisconnectCounter = 0;
+bool wasConnected = true;
+#ifdef IR_RX
+String lastIrReceived = "None";
+uint32_t lastIrReceivedTime = 0;
+uint32_t irRecvCounter = 0;
+#endif // IR_RX
+
+
// MQTT client parameters
void callback(char* topic, byte* payload, unsigned int length);
-PubSubClient mqtt_client(MQTT_SERVER, MQTT_PORT, callback, espClient);
+PubSubClient mqtt_client(MQTT_SERVER, kMqttPort, callback, espClient);
// Create a unique MQTT client id.
-const char* mqtt_clientid = String(MQTTprefix +
- String(ESP.getChipId(), HEX)).c_str();
+String mqtt_clientid = MQTTprefix + String(ESP.getChipId(), HEX);
#endif // MQTT_ENABLE
// Debug messages get sent to the serial port.
@@ -178,6 +267,50 @@ void debug(String str) {
#endif // DEBUG
}
+String timeSince(uint32_t const start) {
+ if (start == 0)
+ return "Never";
+ uint32_t diff = 0;
+ uint32_t now = millis();
+ if (start < now)
+ diff = now - start;
+ else
+ diff = UINT32_MAX - start + now;
+ diff /= 1000; // Convert to seconds.
+ if (diff == 0) return "Now";
+
+ // Note: millis() can only count up to 45 days, so uint8_t is safe.
+ uint8_t days = diff / (60 * 60 * 24);
+ uint8_t hours = (diff / (60 * 60)) % 24;
+ uint8_t minutes = (diff / 60) % 60;
+ uint8_t seconds = diff % 60;
+
+ String result = "";
+ if (days)
+ result += String(days) + " day";
+ if (days > 1) result += "s";
+ if (hours)
+ result += " " + String(hours) + " hour";
+ if (hours > 1) result += "s";
+ if (minutes)
+ result += " " + String(minutes) + " minute";
+ if (minutes > 1) result += "s";
+ if (seconds)
+ result += " " + String(seconds) + " second";
+ if (seconds > 1) result += "s";
+ result.trim();
+ return result + " ago";
+}
+
+// Quick and dirty check for any unsafe chars in a string
+// that may cause HTML shenanigans. e.g. An XSS.
+bool hasUnsafeHTMLChars(String input) {
+ static char unsafe[] = "';!-\"<>=&{}()";
+ for (uint8_t i = 0; unsafe[i]; i++)
+ if (input.indexOf(unsafe[i]) != -1) return true;
+ return false;
+}
+
// Root web page with example usage etc.
void handleRoot() {
server.send(200, "text/html",
@@ -185,13 +318,43 @@ void handleRoot() {
""
"ESP8266 IR MQTT Server "
" "
- "Connection details "
- "IP address: " + WiFi.localIP().toString() + "
"
+ "Information "
+ "IP address: " + WiFi.localIP().toString() + " "
+ "Booted: " + timeSince(1) + " " +
+ "Version: " _MY_VERSION_ " "
+ "Period Offset: " + String(offset) + "us "
+ "IR Lib Version: " _IRREMOTEESP8266_VERSION_ " "
+ "ESP8266 Core Version: " + ESP.getCoreVersion() + " "
+ "IR Send GPIO: " + String(IR_LED) + " "
+ "Total send requests: " + String(sendReqCounter) + " "
+ "Last message sent: " + String(lastSendSucceeded ? "Ok" : "FAILED") +
+ " (" + timeSince(lastSendTime) + ") "
+#ifdef IR_RX
+ "IR Recv GPIO: " + String(IR_RX) + " "
+ "Total IR Received: " + String(irRecvCounter) + " "
+ "Last IR Received: " + lastIrReceived +
+ " (" + timeSince(lastIrReceivedTime) + ") "
+#endif // IR_RX
+ "
"
#ifdef MQTT_ENABLE
- "MQTT server: " MQTT_SERVER ":" + String(MQTT_PORT) + " ("+
- (mqtt_client.connected() ? "Connected" : "Disconnected") + ") "
+ "
MQTT Information "
+ "Server: " MQTT_SERVER ":" + String(kMqttPort) + " (" +
+ (mqtt_client.connected() ? "Connected " + timeSince(lastDisconnectedTime)
+ : "Disconnected " + timeSince(lastConnectedTime)) +
+ ") "
+ "Disconnections: " + String(mqttDisconnectCounter - 1) + " "
+ "Client id: " + mqtt_clientid + " "
"Command topic: " MQTTcommand " "
- "Acknowledgements topic: " MQTTack "
"
+ "Acknowledgements topic: " MQTTack " "
+#ifdef IR_RX
+ "IR Received topic: " MQTTrecv " "
+#endif // IR_RX
+ "Last MQTT command seen: " +
+ // lastMqttCmd is unescaped untrusted input.
+ // Avoid any possible HTML/XSS when displaying it.
+ (hasUnsafeHTMLChars(lastMqttCmd) ?
+ "Contains unsafe HTML characters " : lastMqttCmd) +
+ " (" + timeSince(lastMqttCmdTime) + ")
"
#endif // MQTT_ENABLE
" "
"Hardcoded examples "
@@ -222,15 +385,24 @@ void handleRoot() {
"Type: "
""
"Aiwa RC T501 "
+ "Carrier AC "
"Coolix "
"Denon "
"Dish "
+ "GICable "
"JVC "
+ "Lasertag "
"LG "
+ "LG2 "
+ "Lutron "
+ "MagiQuest "
+ "Midea "
"Mitsubishi "
+ "Mitsubishi2 "
"NEC " // Default
"Nikai "
"Panasonic "
+ "Pioneer "
"RC-5 "
"RC-5X "
"RC-6 "
@@ -259,8 +431,10 @@ void handleRoot() {
"24 "
"28 "
"32 "
+ "35 "
"36 "
"48 "
+ "56 "
" "
" Repeats: "
@@ -305,11 +479,32 @@ void handleRoot() {
" "
""
" "
- "Send a Kelvinator A/C IR message "
+ "
Send an Air Conditioner IR message "
"
"
" "
@@ -340,26 +535,245 @@ void handleReset() {
delay(1000);
}
-// Parse a Kelvinator A/C Hex String/code and send it.
-void parseStringAndSendKelv(const String str) {
- // str should be a 32 digit hexidecimal string.
- uint8_t offset = 0;
- uint8_t codeArray[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+// Parse an Air Conditioner A/C Hex String/code and send it.
+// Args:
+// irType: Nr. of the protocol we need to send.
+// str: A hexadecimal string containing the state to be sent.
+// Returns:
+// bool: Successfully sent or not.
+bool parseStringAndSendAirCon(const uint16_t irType, const String str) {
+ uint8_t strOffset = 0;
+ uint8_t state[kStateSizeMax] = {0}; // All array elements are set to 0.
+ uint16_t stateSize = 0;
+
if (str.startsWith("0x") || str.startsWith("0X"))
- offset = 2;
- for (int i = 0; i < 32; i++) {
- unsigned char c = tolower(str[i + offset]);
- uint8_t entry = 0;
+ strOffset = 2;
+ // Calculate how many hexadecimal characters there are.
+ uint16_t inputLength = str.length() - strOffset;
+ if (inputLength == 0) {
+ debug("Zero length AirCon code encountered. Ignored.");
+ return false; // No input. Abort.
+ }
+
+ switch (irType) { // Get the correct state size for the protocol.
+ case KELVINATOR:
+ stateSize = kKelvinatorStateLength;
+ break;
+ case TOSHIBA_AC:
+ stateSize = kToshibaACStateLength;
+ break;
+ case DAIKIN:
+ stateSize = kDaikinStateLength;
+ break;
+ case ELECTRA_AC:
+ stateSize = kElectraAcStateLength;
+ break;
+ case MITSUBISHI_AC:
+ stateSize = kMitsubishiACStateLength;
+ break;
+ case PANASONIC_AC:
+ stateSize = kPanasonicAcStateLength;
+ break;
+ case TROTEC:
+ stateSize = kTrotecStateLength;
+ break;
+ case ARGO:
+ stateSize = kArgoStateLength;
+ break;
+ case GREE:
+ stateSize = kGreeStateLength;
+ break;
+ case FUJITSU_AC:
+ // Fujitsu has four distinct & different size states, so make a best guess
+ // which one we are being presented with based on the number of
+ // hexadecimal digits provided. i.e. Zero-pad if you need to to get
+ // the correct length/byte size.
+ stateSize = inputLength / 2; // Every two hex chars is a byte.
+ // Use at least the minimum size.
+ stateSize = std::max(stateSize,
+ (uint16_t) (kFujitsuAcStateLengthShort - 1));
+ // If we think it isn't a "short" message.
+ if (stateSize > kFujitsuAcStateLengthShort)
+ // Then it has to be at least the smaller version of the "normal" size.
+ stateSize = std::max(stateSize, (uint16_t) (kFujitsuAcStateLength - 1));
+ // Lastly, it should never exceed the maximum "normal" size.
+ stateSize = std::min(stateSize, kFujitsuAcStateLength);
+ break;
+ case HAIER_AC:
+ stateSize = kHaierACStateLength;
+ break;
+ case HAIER_AC_YRW02:
+ stateSize = kHaierACYRW02StateLength;
+ break;
+ case HITACHI_AC:
+ stateSize = kHitachiAcStateLength;
+ break;
+ case HITACHI_AC1:
+ stateSize = kHitachiAc1StateLength;
+ break;
+ case HITACHI_AC2:
+ stateSize = kHitachiAc2StateLength;
+ break;
+ case WHIRLPOOL_AC:
+ stateSize = kWhirlpoolAcStateLength;
+ break;
+ case SAMSUNG_AC:
+ // Samsung has two distinct & different size states, so make a best guess
+ // which one we are being presented with based on the number of
+ // hexadecimal digits provided. i.e. Zero-pad if you need to to get
+ // the correct length/byte size.
+ stateSize = inputLength / 2; // Every two hex chars is a byte.
+ // Use at least the minimum size.
+ stateSize = std::max(stateSize, (uint16_t) (kSamsungAcStateLength));
+ // If we think it isn't a "normal" message.
+ if (stateSize > kSamsungAcStateLength)
+ // Then it probably the extended size.
+ stateSize = std::max(stateSize,
+ (uint16_t) (kSamsungAcExtendedStateLength));
+ // Lastly, it should never exceed the maximum "extended" size.
+ stateSize = std::min(stateSize, kSamsungAcExtendedStateLength);
+ break;
+ case MWM:
+ // MWM has variable size states, so make a best guess
+ // which one we are being presented with based on the number of
+ // hexadecimal digits provided. i.e. Zero-pad if you need to to get
+ // the correct length/byte size.
+ stateSize = inputLength / 2; // Every two hex chars is a byte.
+ // Use at least the minimum size.
+ stateSize = std::max(stateSize, (uint16_t) 3);
+ // Cap the maximum size.
+ stateSize = std::min(stateSize, kStateSizeMax);
+ break;
+ default: // Not a protocol we expected. Abort.
+ debug("Unexpected AirCon protocol detected. Ignoring.");
+ return false;
+ }
+ if (inputLength > stateSize * 2) {
+ debug("AirCon code to large for the given protocol.");
+ return false;
+ }
+
+ // Ptr to the least significant byte of the resulting state for this protocol.
+ uint8_t *statePtr = &state[stateSize - 1];
+
+ // Convert the string into a state array of the correct length.
+ for (uint16_t i = 0; i < inputLength; i++) {
+ // Grab the next least sigificant hexadecimal digit from the string.
+ uint8_t c = tolower(str[inputLength + strOffset - i - 1]);
if (isxdigit(c)) {
if (isdigit(c))
- codeArray[i / 2] += c - '0';
+ c -= '0';
else
- codeArray[i / 2] += c - 'a' + 10;
+ c = c - 'a' + 10;
+ } else {
+ debug("Aborting! Non-hexadecimal char found in AirCon state: " + str);
+ return false;
+ }
+ if (i % 2 == 1) { // Odd: Upper half of the byte.
+ *statePtr += (c << 4);
+ statePtr--; // Advance up to the next least significant byte of state.
+ } else { // Even: Lower half of the byte.
+ *statePtr = c;
}
- if (i % 2 == 0)
- codeArray[i / 2] <<= 4;
}
- irsend.sendKelvinator(reinterpret_cast(codeArray));
+
+ // Make the appropriate call for the protocol type.
+ switch (irType) {
+#if SEND_KELVINATOR
+ case KELVINATOR:
+ irsend.sendKelvinator(reinterpret_cast(state));
+ break;
+#endif
+#if SEND_TOSHIBA_AC
+ case TOSHIBA_AC:
+ irsend.sendToshibaAC(reinterpret_cast(state));
+ break;
+#endif
+#if SEND_DAIKIN
+ case DAIKIN:
+ irsend.sendDaikin(reinterpret_cast(state));
+ break;
+#endif
+#if MITSUBISHI_AC
+ case MITSUBISHI_AC:
+ irsend.sendMitsubishiAC(reinterpret_cast(state));
+ break;
+#endif
+#if SEND_TROTEC
+ case TROTEC:
+ irsend.sendTrotec(reinterpret_cast(state));
+ break;
+#endif
+#if SEND_ARGO
+ case ARGO:
+ irsend.sendArgo(reinterpret_cast(state));
+ break;
+#endif
+#if SEND_GREE
+ case GREE:
+ irsend.sendGree(reinterpret_cast(state));
+ break;
+#endif
+#if SEND_FUJITSU_AC
+ case FUJITSU_AC:
+ irsend.sendFujitsuAC(reinterpret_cast(state), stateSize);
+ break;
+#endif
+#if SEND_HAIER_AC
+ case HAIER_AC:
+ irsend.sendHaierAC(reinterpret_cast(state));
+ break;
+#endif
+#if SEND_HAIER_AC_YRW02
+ case HAIER_AC_YRW02:
+ irsend.sendHaierACYRW02(reinterpret_cast(state));
+ break;
+#endif
+#if SEND_HITACHI_AC
+ case HITACHI_AC:
+ irsend.sendHitachiAC(reinterpret_cast(state));
+ break;
+#endif
+#if SEND_HITACHI_AC1
+ case HITACHI_AC1:
+ irsend.sendHitachiAC1(reinterpret_cast(state));
+ break;
+#endif
+#if SEND_HITACHI_AC2
+ case HITACHI_AC2:
+ irsend.sendHitachiAC2(reinterpret_cast(state));
+ break;
+#endif
+#if SEND_WHIRLPOOL_AC
+ case WHIRLPOOL_AC:
+ irsend.sendWhirlpoolAC(reinterpret_cast(state));
+ break;
+#endif
+#if SEND_SAMSUNG_AC
+ case SAMSUNG_AC:
+ irsend.sendSamsungAC(reinterpret_cast(state), stateSize);
+ break;
+#endif
+#if SEND_ELECTRA_AC
+ case ELECTRA_AC:
+ irsend.sendElectraAC(reinterpret_cast(state));
+ break;
+#endif
+#if SEND_PANASONIC_AC
+ case PANASONIC_AC:
+ irsend.sendPanasonicAC(reinterpret_cast(state));
+ break;
+#endif
+#if SEND_MWM_
+ case MWM:
+ irsend.sendMWM(reinterpret_cast(state), stateSize);
+ break;
+#endif
+ default:
+ debug("Unexpected AirCon type in send request. Not sent.");
+ return false;
+ }
+ return true; // We were successful as far as we can tell.
}
// Count how many values are in the String.
@@ -399,6 +813,7 @@ uint16_t * newCodeArray(const uint16_t size) {
return result;
}
+#if SEND_GLOBALCACHE
// Parse a GlobalCache String/code and send it.
// Args:
// str: A GlobalCache formatted String of comma separated numbers.
@@ -407,7 +822,9 @@ uint16_t * newCodeArray(const uint16_t size) {
// 20,20,20,20,20,20,20,20,20,20,20,20,20,63,20,20,20,63,20,63,20,
// 63,20,63,20,63,20,63,20,1798"
// Note: The leading "1:1,1," of normal GC codes should be removed.
-void parseStringAndSendGC(const String str) {
+// Returns:
+// bool: Successfully sent or not.
+bool parseStringAndSendGC(const String str) {
uint16_t count;
uint16_t *code_array;
String tmp_str;
@@ -437,22 +854,29 @@ void parseStringAndSendGC(const String str) {
irsend.sendGC(code_array, count); // All done. Send it.
free(code_array); // Free up the memory allocated.
+ if (count > 0)
+ return true; // We sent something.
+ return false; // We probably didn't.
}
+#endif // SEND_GLOBALCACHE
+#if SEND_PRONTO
// Parse a Pronto Hex String/code and send it.
// Args:
-// str: A comma-separated String of nr. of repeats, then hexidecimal numbers.
+// str: A comma-separated String of nr. of repeats, then hexadecimal numbers.
// e.g. "R1,0000,0067,0000,0015,0060,0018,0018,0018,0030,0018,0030,0018,
// 0030,0018,0018,0018,0030,0018,0018,0018,0018,0018,0030,0018,
// 0018,0018,0030,0018,0030,0018,0030,0018,0018,0018,0018,0018,
// 0030,0018,0018,0018,0018,0018,0030,0018,0018,03f6"
// or
// "0000,0067,0000,0015,0060,0018". i.e. without the Repeat value
-// Requires at least PRONTO_MIN_LENGTH comma-separated values.
+// Requires at least kProntoMinLength comma-separated values.
// sendPronto() only supports raw pronto code types, thus so does this.
// repeats: Nr. of times the message is to be repeated.
// This value is ignored if an embeddd repeat is found in str.
-void parseStringAndSendPronto(const String str, uint16_t repeats) {
+// Returns:
+// bool: Successfully sent or not.
+bool parseStringAndSendPronto(const String str, uint16_t repeats) {
uint16_t count;
uint16_t *code_array;
int16_t index = -1;
@@ -470,8 +894,8 @@ void parseStringAndSendPronto(const String str, uint16_t repeats) {
count--; // We don't count the repeats value as part of the code array.
}
- // We need at least PRONTO_MIN_LENGTH values for the code part.
- if (count < PRONTO_MIN_LENGTH) return;
+ // We need at least kProntoMinLength values for the code part.
+ if (count < kProntoMinLength) return false;
// Now we know how many there are, allocate the memory to store them all.
code_array = newCodeArray(count);
@@ -481,7 +905,7 @@ void parseStringAndSendPronto(const String str, uint16_t repeats) {
count = 0;
do {
index = str.indexOf(',', start_from);
- // Convert the hexidecimal value string to an unsigned integer.
+ // Convert the hexadecimal value string to an unsigned integer.
code_array[count] = strtoul(str.substring(start_from, index).c_str(),
NULL, 16);
start_from = index + 1;
@@ -490,15 +914,22 @@ void parseStringAndSendPronto(const String str, uint16_t repeats) {
irsend.sendPronto(code_array, count, repeats); // All done. Send it.
free(code_array); // Free up the memory allocated.
+ if (count > 0)
+ return true; // We sent something.
+ return false; // We probably didn't.
}
+#endif // SEND_PRONTO
-// Parse a IRremote Raw Hex String/code and send it.
+#if SEND_RAW
+// Parse an IRremote Raw Hex String/code and send it.
// Args:
// str: A comma-separated String containing the freq and raw IR data.
// e.g. "38000,9000,4500,600,1450,600,900,650,1500,..."
// Requires at least two comma-separated values.
// First value is the transmission frequency in Hz or kHz.
-void parseStringAndSendRaw(const String str) {
+// Returns:
+// bool: Successfully sent or not.
+bool parseStringAndSendRaw(const String str) {
uint16_t count;
uint16_t freq = 38000; // Default to 38kHz.
uint16_t *raw_array;
@@ -508,7 +939,7 @@ void parseStringAndSendRaw(const String str) {
// We expect the frequency as the first comma separated value, so we need at
// least two values. If not, bail out.
- if (count < 2) return;
+ if (count < 2) return false;
count--; // We don't count the frequency value as part of the raw array.
// Now we know how many there are, allocate the memory to store them all.
@@ -530,7 +961,11 @@ void parseStringAndSendRaw(const String str) {
irsend.sendRaw(raw_array, count, freq); // All done. Send it.
free(raw_array); // Free up the memory allocated.
+ if (count > 0)
+ return true; // We sent something.
+ return false; // We probably didn't.
}
+#endif // SEND_RAW
// Parse the URL args to find the IR code.
void handleIr() {
@@ -553,7 +988,8 @@ void handleIr() {
repeat = atoi(server.arg(i).c_str());
}
debug("New code received via HTTP");
- sendIRCode(ir_type, data, data_str.c_str(), nbits, repeat);
+ lastSendSucceeded = sendIRCode(ir_type, data, data_str.c_str(), nbits,
+ repeat);
handleRoot();
}
@@ -576,6 +1012,10 @@ void setup_wifi() {
// We start by connecting to a WiFi network
wifiManager.setTimeout(300); // Time out after 5 mins.
+#if USE_STATIC_IP
+ // Use a static IP config rather than the one supplied via DHCP.
+ wifiManager.setSTAStaticIPConfig(kIPAddress, kGateway, kSubnetMask);
+#endif // USE_STATIC_IP
if (!wifiManager.autoConnect()) {
debug("Wifi failed to connect and hit timeout.");
delay(3000);
@@ -584,14 +1024,27 @@ void setup_wifi() {
delay(5000);
}
- debug("WiFi connected. IP address: " + WiFi.localIP());
+ debug("WiFi connected. IP address: " + WiFi.localIP().toString());
}
void setup(void) {
irsend.begin();
+ offset = irsend.calibrate();
+#if IR_RX
+#if DECODE_HASH
+ // Ignore messages with less than minimum on or off pulses.
+ irrecv.setUnknownThreshold(kMinUnknownSize);
+#endif // DECODE_HASH
+ irrecv.enableIRIn(); // Start the receiver
+#endif // IR_RX
#ifdef DEBUG
- Serial.begin(115200);
+ // Use SERIAL_TX_ONLY so that the RX pin can be freed up for GPIO/IR use.
+ Serial.begin(BAUD_RATE, SERIAL_8N1, SERIAL_TX_ONLY);
+ while (!Serial) // Wait for the serial connection to be establised.
+ delay(50);
+ Serial.println();
+ debug("IRMQTTServer " _MY_VERSION_" has booted.");
#endif // DEBUG
setup_wifi();
@@ -601,7 +1054,7 @@ void setup(void) {
lastReconnectAttempt = 0;
- if (mdns.begin(MQTTprefix, WiFi.localIP())) {
+ if (mdns.begin(HOSTNAME, WiFi.localIP())) {
debug("MDNS responder started");
}
@@ -667,12 +1120,13 @@ bool reconnect() {
while (!mqtt_client.connected() && tries <= 3) {
int connected = false;
// Attempt to connect
- debug("Attempting MQTT connection to " MQTT_SERVER ":" + String(MQTT_PORT) +
+ debug("Attempting MQTT connection to " MQTT_SERVER ":" + String(kMqttPort) +
"... ");
if (mqtt_user && mqtt_password)
- connected = mqtt_client.connect(mqtt_clientid, mqtt_user, mqtt_password);
+ connected = mqtt_client.connect(mqtt_clientid.c_str(), mqtt_user,
+ mqtt_password);
else
- connected = mqtt_client.connect(mqtt_clientid);
+ connected = mqtt_client.connect(mqtt_clientid.c_str());
if (connected) {
// Once connected, publish an announcement...
mqtt_client.publish(MQTTack, "Connected");
@@ -692,32 +1146,57 @@ bool reconnect() {
#endif // MQTT_ENABLE
void loop(void) {
- server.handleClient();
+ server.handleClient(); // Handle any web activity
#ifdef MQTT_ENABLE
+ uint32_t now = millis();
// MQTT client connection management
if (!mqtt_client.connected()) {
- uint32_t now = millis();
- // Reconnect if it's longer than MQTT_RECONNECT_TIME since we last tried.
- if (now - lastReconnectAttempt > MQTT_RECONNECT_TIME) {
+ if (wasConnected) {
+ lastDisconnectedTime = now;
+ wasConnected = false;
+ mqttDisconnectCounter++;
+ }
+ // Reconnect if it's longer than kMqttReconnectTime since we last tried.
+ if (now - lastReconnectAttempt > kMqttReconnectTime) {
lastReconnectAttempt = now;
debug("client mqtt not connected, trying to connect");
// Attempt to reconnect
if (reconnect()) {
lastReconnectAttempt = 0;
+ wasConnected = true;
if (boot) {
mqtt_client.publish(MQTTack, "IR Server just booted");
boot = false;
} else {
- mqtt_client.publish(MQTTack, "IR Server just (re)connected to MQTT");
+ String text = "IR Server just (re)connected to MQTT. "
+ "Lost connection about " + timeSince(lastConnectedTime);
+ mqtt_client.publish(MQTTack, text.c_str());
}
+ lastConnectedTime = now;
+ debug("successful client mqtt connection");
}
}
} else {
+ lastConnectedTime = now;
// MQTT loop
mqtt_client.loop();
}
#endif // MQTT_ENABLE
+#ifdef IR_RX
+ // Check if an IR code has been received via the IR RX module.
+ if (irrecv.decode(&capture)) {
+ lastIrReceivedTime = millis();
+ lastIrReceived = String(capture.decode_type) + "," +
+ resultToHexidecimal(&capture);
+ // If it isn't an AC code, add the bits.
+ if (!hasACState(capture.decode_type))
+ lastIrReceived += "," + String(capture.bits);
+ mqtt_client.publish(MQTTrecv, lastIrReceived.c_str());
+ irRecvCounter++;
+ debug("Incoming IR message sent to MQTT: " + lastIrReceived);
+ }
+#endif // IR_RX
delay(100);
}
@@ -749,149 +1228,291 @@ uint64_t getUInt64fromHex(char const *str) {
// code_str: The unparsed code to be sent. Used by complex protocol encodings.
// bits: Nr. of bits in the protocol. 0 means use the protocol's default.
// repeat: Nr. of times the message is to be repeated. (Not all protcols.)
-void sendIRCode(int const ir_type, uint64_t const code, char const * code_str,
+// Returns:
+// bool: Successfully sent or not.
+bool sendIRCode(int const ir_type, uint64_t const code, char const * code_str,
uint16_t bits, uint16_t repeat) {
// Create a pseudo-lock so we don't try to send two codes at the same time.
while (ir_lock)
delay(20);
ir_lock = true;
+ bool success = true; // Assume success.
+
// send the IR message.
switch (ir_type) {
+#if SEND_RC5
case RC5: // 1
if (bits == 0)
- bits = RC5_BITS;
+ bits = kRC5Bits;
irsend.sendRC5(code, bits, repeat);
break;
+#endif
+#if SEND_RC6
case RC6: // 2
if (bits == 0)
- bits = RC6_MODE0_BITS;
+ bits = kRC6Mode0Bits;
irsend.sendRC6(code, bits, repeat);
break;
+#endif
+#if SEND_NEC
case NEC: // 3
if (bits == 0)
- bits = NEC_BITS;
+ bits = kNECBits;
irsend.sendNEC(code, bits, repeat);
break;
+#endif
+#if SEND_SONY
case SONY: // 4
if (bits == 0)
- bits = SONY_12_BITS;
- repeat = std::max(repeat, (uint16_t) SONY_MIN_REPEAT);
+ bits = kSony12Bits;
+ repeat = std::max(repeat, kSonyMinRepeat);
irsend.sendSony(code, bits, repeat);
break;
+#endif
+#if SEND_PANASONIC
case PANASONIC: // 5
if (bits == 0)
- bits = PANASONIC_BITS;
+ bits = kPanasonicBits;
irsend.sendPanasonic64(code, bits, repeat);
break;
+#endif
+#if SEND_JVC
case JVC: // 6
if (bits == 0)
- bits = JVC_BITS;
+ bits = kJvcBits;
irsend.sendJVC(code, bits, repeat);
break;
+#endif
+#if SEND_SAMSUNG
case SAMSUNG: // 7
if (bits == 0)
- bits = SAMSUNG_BITS;
+ bits = kSamsungBits;
irsend.sendSAMSUNG(code, bits, repeat);
break;
+#endif
+#if SEND_WHYNTER
case WHYNTER: // 8
if (bits == 0)
- bits = WHYNTER_BITS;
+ bits = kWhynterBits;
irsend.sendWhynter(code, bits, repeat);
break;
+#endif
+#if SEND_AIWA_RC_T501
case AIWA_RC_T501: // 9
if (bits == 0)
- bits = AIWA_RC_T501_BITS;
- repeat = std::max(repeat, (uint16_t) AIWA_RC_T501_MIN_REPEAT);
+ bits = kAiwaRcT501Bits;
+ repeat = std::max(repeat, kAiwaRcT501MinRepeats);
irsend.sendAiwaRCT501(code, bits, repeat);
break;
+#endif
+#if SEND_LG
case LG: // 10
if (bits == 0)
- bits = LG_BITS;
+ bits = kLgBits;
irsend.sendLG(code, bits, repeat);
break;
+#endif
+#if SEND_MITSUBISHI
case MITSUBISHI: // 12
if (bits == 0)
- bits = MITSUBISHI_BITS;
- repeat = std::max(repeat, (uint16_t) MITSUBISHI_MIN_REPEAT);
+ bits = kMitsubishiBits;
+ repeat = std::max(repeat, kMitsubishiMinRepeat);
irsend.sendMitsubishi(code, bits, repeat);
break;
+#endif
+#if SEND_DISH
case DISH: // 13
if (bits == 0)
- bits = DISH_BITS;
- repeat = std::max(repeat, (uint16_t) DISH_MIN_REPEAT);
+ bits = kDishBits;
+ repeat = std::max(repeat, kDishMinRepeat);
irsend.sendDISH(code, bits, repeat);
break;
+#endif
+#if SEND_SHARP
case SHARP: // 14
if (bits == 0)
- bits = SHARP_BITS;
+ bits = kSharpBits;
irsend.sendSharpRaw(code, bits, repeat);
break;
+#endif
+#if SEND_COOLIX
case COOLIX: // 15
if (bits == 0)
- bits = COOLIX_BITS;
+ bits = kCoolixBits;
irsend.sendCOOLIX(code, bits, repeat);
break;
+#endif
+ case DAIKIN: // 16
+ case KELVINATOR: // 18
+ case MITSUBISHI_AC: // 20
+ case GREE: // 24
+ case ARGO: // 27
+ case TROTEC: // 28
+ case TOSHIBA_AC: // 32
+ case FUJITSU_AC: // 33
+ case HAIER_AC: // 38
+ case HAIER_AC_YRW02: // 44
+ case HITACHI_AC: // 40
+ case HITACHI_AC1: // 41
+ case HITACHI_AC2: // 42
+ case WHIRLPOOL_AC: // 45
+ case SAMSUNG_AC: // 46
+ case ELECTRA_AC: // 48
+ case PANASONIC_AC: // 49
+ case MWM: // 52
+ success = parseStringAndSendAirCon(ir_type, code_str);
+ break;
+#if SEND_DENON
case DENON: // 17
if (bits == 0)
bits = DENON_BITS;
irsend.sendDenon(code, bits, repeat);
break;
- case KELVINATOR: // 18
- parseStringAndSendKelv(code_str);
- break;
+#endif
+#if SEND_SHERWOOD
case SHERWOOD: // 19
if (bits == 0)
- bits = SHERWOOD_BITS;
- repeat = std::max(repeat, (uint16_t) SHERWOOD_MIN_REPEAT);
+ bits = kSherwoodBits;
+ repeat = std::max(repeat, kSherwoodMinRepeat);
irsend.sendSherwood(code, bits, repeat);
break;
+#endif
+#if SEND_RCMM
case RCMM: // 21
if (bits == 0)
- bits == RCMM_BITS;
+ bits = kRCMMBits;
irsend.sendRCMM(code, bits, repeat);
break;
+#endif
+#if SEND_SANYO
case SANYO_LC7461: // 22
if (bits == 0)
- bits = SANYO_LC7461_BITS;
+ bits = kSanyoLC7461Bits;
irsend.sendSanyoLC7461(code, bits, repeat);
break;
+#endif
+#if SEND_RC5
case RC5X: // 23
if (bits == 0)
- bits = RC5X_BITS;
+ bits = kRC5XBits;
irsend.sendRC5(code, bits, repeat);
+ break;
+#endif
+#if SEND_PRONTO
case PRONTO: // 25
- parseStringAndSendPronto(code_str, repeat);
+ success = parseStringAndSendPronto(code_str, repeat);
break;
+#endif
+#if SEND_NIKAI
case NIKAI: // 29
if (bits == 0)
- bits = NIKAI_BITS;
+ bits = kNikaiBits;
irsend.sendNikai(code, bits, repeat);
break;
+#endif
+#if SEND_RAW
case RAW: // 30
- parseStringAndSendRaw(code_str);
+ success = parseStringAndSendRaw(code_str);
break;
+#endif
+#if SEND_GLOBALCACHE
case GLOBALCACHE: // 31
- parseStringAndSendGC(code_str);
+ success = parseStringAndSendGC(code_str);
break;
- }
+#endif
+#if SEND_MIDEA
+ case MIDEA: // 34
+ if (bits == 0)
+ bits = kMideaBits;
+ irsend.sendMidea(code, bits, repeat);
+ break;
+#endif
+#if SEND_MAGIQUEST
+ case MAGIQUEST: // 35
+ if (bits == 0)
+ bits = kMagiquestBits;
+ irsend.sendMagiQuest(code, bits, repeat);
+ break;
+#endif
+#if SEND_LASERTAG
+ case LASERTAG: // 36
+ if (bits == 0)
+ bits = kLasertagBits;
+ irsend.sendLasertag(code, bits, repeat);
+ break;
+#endif
+#if SEND_CARRIER_AC
+ case CARRIER_AC: // 37
+ if (bits == 0)
+ bits = kCarrierAcBits;
+ irsend.sendCarrierAC(code, bits, repeat);
+ break;
+#endif
+#if SEND_MITSUBISHI2
+ case MITSUBISHI2: // 39
+ if (bits == 0)
+ bits = kMitsubishiBits;
+ repeat = std::max(repeat, kMitsubishiMinRepeat);
+ irsend.sendMitsubishi2(code, bits, repeat);
+ break;
+#endif
+#if SEND_GICABLE
+ case GICABLE: // 43
+ if (bits == 0)
+ bits = kGicableBits;
+ repeat = std::max(repeat, kGicableMinRepeat);
+ irsend.sendGICable(code, bits, repeat);
+ break;
+#endif
+#if SEND_LUTRON
+ case LUTRON: // 47
+ if (bits == 0)
+ bits = kLutronBits;
+ irsend.sendLutron(code, bits, repeat);
+ break;
+#endif
+#if SEND_PIONEER
+ case PIONEER: // 50
+ if (bits == 0)
+ bits = kPioneerBits;
+ irsend.sendPioneer(code, bits, repeat);
+ break;
+#endif
+#if SEND_LG
+ case LG2: // 51
+ if (bits == 0)
+ bits = kLgBits;
+ irsend.sendLG2(code, bits, repeat);
+ break;
+#endif
+ default:
+ // If we got here, we didn't know how to send it.
+ success = false;
+ }
+ lastSendTime = millis();
// Release the lock.
ir_lock = false;
- // Indicate that we sent the message.
- debug("Sent the IR message.");
+ // Indicate that we sent the message or not.
+ if (success) {
+ sendReqCounter++;
+ debug("Sent the IR message:");
+ } else {
+ debug("Failed to send IR Message:");
+ }
debug("Type: " + String(ir_type));
- switch (ir_type) {
- case KELVINATOR:
- case PRONTO:
- case RAW:
- case GLOBALCACHE:
- debug("Code: ");
- debug(code_str);
- debug("Repeats: " + String(repeat));
- // Confirm what we were asked to send was sent.
+ // For "long" codes we basically repeat what we got.
+ if (hasACState((decode_type_t) ir_type) ||
+ ir_type == PRONTO ||
+ ir_type == RAW ||
+ ir_type == GLOBALCACHE) {
+ debug("Code: ");
+ debug(code_str);
+ // Confirm what we were asked to send was sent.
#ifdef MQTT_ENABLE
+ if (success) {
if (ir_type == PRONTO && repeat > 0)
mqtt_client.publish(MQTTack, (String(ir_type) + ",R" +
String(repeat) + "," +
@@ -899,20 +1520,21 @@ void sendIRCode(int const ir_type, uint64_t const code, char const * code_str,
else
mqtt_client.publish(MQTTack, (String(ir_type) + "," +
String(code_str)).c_str());
+ }
#endif // MQTT_ENABLE
- break;
- default:
- debug("Code: 0x" + uint64ToString(code, 16));
- debug("Bits: " + String(bits));
- debug("Repeats: " + String(repeat));
-
+ } else { // For "short" codes, we break it down a bit more before we report.
+ debug("Code: 0x" + uint64ToString(code, 16));
+ debug("Bits: " + String(bits));
+ debug("Repeats: " + String(repeat));
#ifdef MQTT_ENABLE
+ if (success)
mqtt_client.publish(MQTTack, (String(ir_type) + "," +
uint64ToString(code, 16)
+ "," + String(bits) + "," +
String(repeat)).c_str());
#endif // MQTT_ENABLE
}
+ return success;
}
#ifdef MQTT_ENABLE
@@ -924,9 +1546,12 @@ void receivingMQTT(String const topic_name, String const callback_str) {
debug("Receiving data by MQTT topic " + topic_name);
- // Make a copy of the callback string as strtok destorys it.
+ // Make a copy of the callback string as strtok destroys it.
char* callback_c_str = strdup(callback_str.c_str());
debug("MQTT Payload (raw): " + callback_str);
+ // Save the message as the last command seen (global).
+ lastMqttCmd = callback_str;
+ lastMqttCmdTime = millis();
// Get the numeric protocol type.
int ir_type = strtoul(strtok_r(callback_c_str, ",", &tok_ptr), NULL, 10);
@@ -952,9 +1577,10 @@ void receivingMQTT(String const topic_name, String const callback_str) {
// send received MQTT value by IR signal
- sendIRCode(ir_type, code,
- callback_str.substring(callback_str.indexOf(",") + 1).c_str(),
- nbits, repeat);
+ lastSendSucceeded = sendIRCode(
+ ir_type, code,
+ callback_str.substring(callback_str.indexOf(",") + 1).c_str(),
+ nbits, repeat);
}
// Callback function, when the gateway receive an MQTT value on the topics
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/IRMQTTServer/platformio.ini b/lib/IRremoteESP8266-2.5.2.03/examples/IRMQTTServer/platformio.ini
similarity index 96%
rename from lib/IRremoteESP8266-2.2.1.02/examples/IRMQTTServer/platformio.ini
rename to lib/IRremoteESP8266-2.5.2.03/examples/IRMQTTServer/platformio.ini
index c87e5696236b..27b44ddca5fd 100644
--- a/lib/IRremoteESP8266-2.2.1.02/examples/IRMQTTServer/platformio.ini
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/IRMQTTServer/platformio.ini
@@ -7,7 +7,7 @@ build_flags = -DMQTT_MAX_PACKET_SIZE=512
lib_deps_builtin =
lib_deps_external =
PubSubClient
- WifiManager@0.12
+ WifiManager@0.14
[env:nodemcuv2]
platform = espressif8266
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/IRServer/IRServer.ino b/lib/IRremoteESP8266-2.5.2.03/examples/IRServer/IRServer.ino
similarity index 88%
rename from lib/IRremoteESP8266-2.2.1.02/examples/IRServer/IRServer.ino
rename to lib/IRremoteESP8266-2.5.2.03/examples/IRServer/IRServer.ino
index 82f2e7dd7205..b378d3bd582c 100644
--- a/lib/IRremoteESP8266-2.2.1.02/examples/IRServer/IRServer.ino
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/IRServer/IRServer.ino
@@ -3,7 +3,8 @@
* Version 0.2 June, 2017
* Copyright 2015 Mark Szabo
*
- * An IR LED circuit *MUST* be connected to ESP8266 pin 4 (D2).
+ * An IR LED circuit *MUST* be connected to the ESP8266 on a pin
+ * as specified by kIrLed below.
*
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
*
@@ -35,13 +36,15 @@
#include
#include
-const char* ssid = ".....";
-const char* password = ".....";
+const char* kSsid = ".....";
+const char* kPassword = ".....";
MDNSResponder mdns;
ESP8266WebServer server(80);
-IRsend irsend(4); // An IR LED is controlled by GPIO pin 4 (D2)
+const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
+
+IRsend irsend(kIrLed); // Set the GPIO to be used to sending the message.
void handleRoot() {
server.send(200, "text/html",
@@ -61,7 +64,9 @@ void handleIr() {
for (uint8_t i = 0; i < server.args(); i++) {
if (server.argName(i) == "code") {
uint32_t code = strtoul(server.arg(i).c_str(), NULL, 10);
+#if SEND_NEC
irsend.sendNEC(code, 32);
+#endif // SEND_NEC
}
}
handleRoot();
@@ -85,7 +90,7 @@ void setup(void) {
irsend.begin();
Serial.begin(115200);
- WiFi.begin(ssid, password);
+ WiFi.begin(kSsid, kPassword);
Serial.println("");
// Wait for connection
@@ -95,9 +100,9 @@ void setup(void) {
}
Serial.println("");
Serial.print("Connected to ");
- Serial.println(ssid);
+ Serial.println(kSsid);
Serial.print("IP address: ");
- Serial.println(WiFi.localIP());
+ Serial.println(WiFi.localIP().toString());
if (mdns.begin("esp8266", WiFi.localIP())) {
Serial.println("MDNS responder started");
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/IRServer/platformio.ini b/lib/IRremoteESP8266-2.5.2.03/examples/IRServer/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/examples/IRServer/platformio.ini
rename to lib/IRremoteESP8266-2.5.2.03/examples/IRServer/platformio.ini
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/IRrecvDemo/IRrecvDemo.ino b/lib/IRremoteESP8266-2.5.2.03/examples/IRrecvDemo/IRrecvDemo.ino
similarity index 66%
rename from lib/IRremoteESP8266-2.2.1.02/examples/IRrecvDemo/IRrecvDemo.ino
rename to lib/IRremoteESP8266-2.5.2.03/examples/IRrecvDemo/IRrecvDemo.ino
index ae9ed66f9f43..09babe4febe0 100644
--- a/lib/IRremoteESP8266-2.2.1.02/examples/IRrecvDemo/IRrecvDemo.ino
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/IRrecvDemo/IRrecvDemo.ino
@@ -1,6 +1,9 @@
/*
* IRremoteESP8266: IRrecvDemo - demonstrates receiving IR codes with IRrecv
- * An IR detector/demodulator must be connected to the input RECV_PIN.
+ * This is very simple teaching code to show you how to use the library.
+ * If you are trying to decode your Infra-Red remote(s) for later replay,
+ * use the IRrecvDumpV2.ino example code instead of this.
+ * An IR detector/demodulator must be connected to the input kRecvPin.
* Copyright 2009 Ken Shirriff, http://arcfn.com
* Example circuit diagram:
* https://github.com/markszabo/IRremoteESP8266/wiki#ir-receiving
@@ -22,15 +25,20 @@
// An IR detector/demodulator is connected to GPIO pin 14(D5 on a NodeMCU
// board).
-uint16_t RECV_PIN = 14;
+const uint16_t kRecvPin = 14;
-IRrecv irrecv(RECV_PIN);
+IRrecv irrecv(kRecvPin);
decode_results results;
void setup() {
Serial.begin(115200);
irrecv.enableIRIn(); // Start the receiver
+ while (!Serial) // Wait for the serial connection to be establised.
+ delay(50);
+ Serial.println();
+ Serial.print("IRrecvDemo is now running and waiting for IR message on Pin ");
+ Serial.println(kRecvPin);
}
void loop() {
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/IRrecvDemo/platformio.ini b/lib/IRremoteESP8266-2.5.2.03/examples/IRrecvDemo/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/examples/IRrecvDemo/platformio.ini
rename to lib/IRremoteESP8266-2.5.2.03/examples/IRrecvDemo/platformio.ini
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/IRrecvDump/IRrecvDump.ino b/lib/IRremoteESP8266-2.5.2.03/examples/IRrecvDump/IRrecvDump.ino
similarity index 96%
rename from lib/IRremoteESP8266-2.2.1.02/examples/IRrecvDump/IRrecvDump.ino
rename to lib/IRremoteESP8266-2.5.2.03/examples/IRrecvDump/IRrecvDump.ino
index 85644969550d..34f10dc83fe8 100644
--- a/lib/IRremoteESP8266-2.2.1.02/examples/IRrecvDump/IRrecvDump.ino
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/IRrecvDump/IRrecvDump.ino
@@ -86,10 +86,10 @@ void dump(decode_results *results) {
if (i % 100 == 0)
yield(); // Preemptive yield every 100th entry to feed the WDT.
if (i & 1) {
- Serial.print(results->rawbuf[i] * RAWTICK, DEC);
+ Serial.print(results->rawbuf[i] * kRawTick, DEC);
} else {
Serial.print(", ");
- Serial.print((uint32_t) results->rawbuf[i] * RAWTICK, DEC);
+ Serial.print((uint32_t) results->rawbuf[i] * kRawTick, DEC);
}
}
Serial.println("};");
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/IRrecvDump/platformio.ini b/lib/IRremoteESP8266-2.5.2.03/examples/IRrecvDump/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/examples/IRrecvDump/platformio.ini
rename to lib/IRremoteESP8266-2.5.2.03/examples/IRrecvDump/platformio.ini
diff --git a/lib/IRremoteESP8266-2.5.2.03/examples/IRrecvDumpV2/IRrecvDumpV2.ino b/lib/IRremoteESP8266-2.5.2.03/examples/IRrecvDumpV2/IRrecvDumpV2.ino
new file mode 100644
index 000000000000..d72e0814ce45
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/IRrecvDumpV2/IRrecvDumpV2.ino
@@ -0,0 +1,262 @@
+/*
+ * IRremoteESP8266: IRrecvDumpV2 - dump details of IR codes with IRrecv
+ * An IR detector/demodulator must be connected to the input kRecvPin.
+ *
+ * Copyright 2009 Ken Shirriff, http://arcfn.com
+ * Copyright 2017 David Conran
+ *
+ * Example circuit diagram:
+ * https://github.com/markszabo/IRremoteESP8266/wiki#ir-receiving
+ *
+ * Changes:
+ * Version 0.4 July, 2018
+ * - Minor improvements and more A/C unit support.
+ * Version 0.3 November, 2017
+ * - Support for A/C decoding for some protcols.
+ * Version 0.2 April, 2017
+ * - Decode from a copy of the data so we can start capturing faster thus
+ * reduce the likelihood of miscaptures.
+ * Based on Ken Shirriff's IrsendDemo Version 0.1 July, 2009,
+ */
+
+#ifndef UNIT_TEST
+#include
+#endif
+#include
+#include
+#include
+// The following are only needed for extended decoding of A/C Messages
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+// ==================== start of TUNEABLE PARAMETERS ====================
+// An IR detector/demodulator is connected to GPIO pin 14
+// e.g. D5 on a NodeMCU board.
+const uint16_t kRecvPin = 14;
+
+// The Serial connection baud rate.
+// i.e. Status message will be sent to the PC at this baud rate.
+// Try to avoid slow speeds like 9600, as you will miss messages and
+// cause other problems. 115200 (or faster) is recommended.
+// NOTE: Make sure you set your Serial Monitor to the same speed.
+const uint32_t kBaudRate = 115200;
+
+// As this program is a special purpose capture/decoder, let us use a larger
+// than normal buffer so we can handle Air Conditioner remote codes.
+const uint16_t kCaptureBufferSize = 1024;
+
+// kTimeout is the Nr. of milli-Seconds of no-more-data before we consider a
+// message ended.
+// This parameter is an interesting trade-off. The longer the timeout, the more
+// complex a message it can capture. e.g. Some device protocols will send
+// multiple message packets in quick succession, like Air Conditioner remotes.
+// Air Coniditioner protocols often have a considerable gap (20-40+ms) between
+// packets.
+// The downside of a large timeout value is a lot of less complex protocols
+// send multiple messages when the remote's button is held down. The gap between
+// them is often also around 20+ms. This can result in the raw data be 2-3+
+// times larger than needed as it has captured 2-3+ messages in a single
+// capture. Setting a low timeout value can resolve this.
+// So, choosing the best kTimeout value for your use particular case is
+// quite nuanced. Good luck and happy hunting.
+// NOTE: Don't exceed kMaxTimeoutMs. Typically 130ms.
+#if DECODE_AC
+// Some A/C units have gaps in their protocols of ~40ms. e.g. Kelvinator
+// A value this large may swallow repeats of some protocols
+const uint8_t kTimeout = 50;
+#else // DECODE_AC
+// Suits most messages, while not swallowing many repeats.
+const uint8_t kTimeout = 15;
+#endif // DECODE_AC
+// Alternatives:
+// const uint8_t kTimeout = 90;
+// Suits messages with big gaps like XMP-1 & some aircon units, but can
+// accidentally swallow repeated messages in the rawData[] output.
+//
+// const uint8_t kTimeout = kMaxTimeoutMs;
+// This will set it to our currently allowed maximum.
+// Values this high are problematic because it is roughly the typical boundary
+// where most messages repeat.
+// e.g. It will stop decoding a message and start sending it to serial at
+// precisely the time when the next message is likely to be transmitted,
+// and may miss it.
+
+// Set the smallest sized "UNKNOWN" message packets we actually care about.
+// This value helps reduce the false-positive detection rate of IR background
+// noise as real messages. The chances of background IR noise getting detected
+// as a message increases with the length of the kTimeout value. (See above)
+// The downside of setting this message too large is you can miss some valid
+// short messages for protocols that this library doesn't yet decode.
+//
+// Set higher if you get lots of random short UNKNOWN messages when nothing
+// should be sending a message.
+// Set lower if you are sure your setup is working, but it doesn't see messages
+// from your device. (e.g. Other IR remotes work.)
+// NOTE: Set this value very high to effectively turn off UNKNOWN detection.
+const uint16_t kMinUnknownSize = 12;
+// ==================== end of TUNEABLE PARAMETERS ====================
+
+// Use turn on the save buffer feature for more complete capture coverage.
+IRrecv irrecv(kRecvPin, kCaptureBufferSize, kTimeout, true);
+
+decode_results results; // Somewhere to store the results
+
+// Display the human readable state of an A/C message if we can.
+void dumpACInfo(decode_results *results) {
+ String description = "";
+#if DECODE_DAIKIN
+ if (results->decode_type == DAIKIN) {
+ IRDaikinESP ac(0);
+ ac.setRaw(results->state);
+ description = ac.toString();
+ }
+#endif // DECODE_DAIKIN
+#if DECODE_FUJITSU_AC
+ if (results->decode_type == FUJITSU_AC) {
+ IRFujitsuAC ac(0);
+ ac.setRaw(results->state, results->bits / 8);
+ description = ac.toString();
+ }
+#endif // DECODE_FUJITSU_AC
+#if DECODE_KELVINATOR
+ if (results->decode_type == KELVINATOR) {
+ IRKelvinatorAC ac(0);
+ ac.setRaw(results->state);
+ description = ac.toString();
+ }
+#endif // DECODE_KELVINATOR
+#if DECODE_MITSUBISHI_AC
+ if (results->decode_type == MITSUBISHI_AC) {
+ IRMitsubishiAC ac(0);
+ ac.setRaw(results->state);
+ description = ac.toString();
+ }
+#endif // DECODE_MITSUBISHI_AC
+#if DECODE_TOSHIBA_AC
+ if (results->decode_type == TOSHIBA_AC) {
+ IRToshibaAC ac(0);
+ ac.setRaw(results->state);
+ description = ac.toString();
+ }
+#endif // DECODE_TOSHIBA_AC
+#if DECODE_GREE
+ if (results->decode_type == GREE) {
+ IRGreeAC ac(0);
+ ac.setRaw(results->state);
+ description = ac.toString();
+ }
+#endif // DECODE_GREE
+#if DECODE_MIDEA
+ if (results->decode_type == MIDEA) {
+ IRMideaAC ac(0);
+ ac.setRaw(results->value); // Midea uses value instead of state.
+ description = ac.toString();
+ }
+#endif // DECODE_MIDEA
+#if DECODE_HAIER_AC
+ if (results->decode_type == HAIER_AC) {
+ IRHaierAC ac(0);
+ ac.setRaw(results->state);
+ description = ac.toString();
+ }
+#endif // DECODE_HAIER_AC
+#if DECODE_HAIER_AC_YRW02
+ if (results->decode_type == HAIER_AC_YRW02) {
+ IRHaierACYRW02 ac(0);
+ ac.setRaw(results->state);
+ description = ac.toString();
+ }
+#endif // DECODE_HAIER_AC_YRW02
+#if DECODE_SAMSUNG_AC
+ if (results->decode_type == SAMSUNG_AC) {
+ IRSamsungAc ac(0);
+ ac.setRaw(results->state);
+ description = ac.toString();
+ }
+#endif // DECODE_SAMSUNG_AC
+#if DECODE_COOLIX
+ if (results->decode_type == COOLIX) {
+ IRCoolixAC ac(0);
+ ac.setRaw(results->value); // Coolix uses value instead of state.
+ description = ac.toString();
+ }
+#endif // DECODE_COOLIX
+#if DECODE_PANASONIC_AC
+ if (results->decode_type == PANASONIC_AC &&
+ results->bits > kPanasonicAcShortBits) {
+ IRPanasonicAc ac(0);
+ ac.setRaw(results->state);
+ description = ac.toString();
+ }
+#endif // DECODE_PANASONIC_AC
+#if DECODE_HITACHI_AC
+ if (results->decode_type == HITACHI_AC) {
+ IRHitachiAc ac(0);
+ ac.setRaw(results->state);
+ description = ac.toString();
+ }
+#endif // DECODE_HITACHI_AC
+ // If we got a human-readable description of the message, display it.
+ if (description != "") Serial.println("Mesg Desc.: " + description);
+}
+
+// The section of code run only once at start-up.
+void setup() {
+ Serial.begin(kBaudRate, SERIAL_8N1, SERIAL_TX_ONLY);
+ while (!Serial) // Wait for the serial connection to be establised.
+ delay(50);
+ Serial.println();
+ Serial.print("IRrecvDumpV2 is now running and waiting for IR input on Pin ");
+ Serial.println(kRecvPin);
+
+#if DECODE_HASH
+ // Ignore messages with less than minimum on or off pulses.
+ irrecv.setUnknownThreshold(kMinUnknownSize);
+#endif // DECODE_HASH
+ irrecv.enableIRIn(); // Start the receiver
+}
+
+// The repeating section of the code
+//
+void loop() {
+ // Check if the IR code has been received.
+ if (irrecv.decode(&results)) {
+ // Display a crude timestamp.
+ uint32_t now = millis();
+ Serial.printf("Timestamp : %06u.%03u\n", now / 1000, now % 1000);
+ if (results.overflow)
+ Serial.printf(
+ "WARNING: IR code is too big for buffer (>= %d). "
+ "This result shouldn't be trusted until this is resolved. "
+ "Edit & increase kCaptureBufferSize.\n",
+ kCaptureBufferSize);
+ // Display the basic output of what we found.
+ Serial.print(resultToHumanReadableBasic(&results));
+ dumpACInfo(&results); // Display any extra A/C info if we have it.
+ yield(); // Feed the WDT as the text output can take a while to print.
+
+ // Display the library version the message was captured with.
+ Serial.print("Library : v");
+ Serial.println(_IRREMOTEESP8266_VERSION_);
+ Serial.println();
+
+ // Output RAW timing info of the result.
+ Serial.println(resultToTimingInfo(&results));
+ yield(); // Feed the WDT (again)
+
+ // Output the results as source code
+ Serial.println(resultToSourceCode(&results));
+ Serial.println(""); // Blank line between entries
+ yield(); // Feed the WDT (again)
+ }
+}
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/IRrecvDumpV2/platformio.ini b/lib/IRremoteESP8266-2.5.2.03/examples/IRrecvDumpV2/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/examples/IRrecvDumpV2/platformio.ini
rename to lib/IRremoteESP8266-2.5.2.03/examples/IRrecvDumpV2/platformio.ini
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/IRsendDemo/IRsendDemo.ino b/lib/IRremoteESP8266-2.5.2.03/examples/IRsendDemo/IRsendDemo.ino
similarity index 87%
rename from lib/IRremoteESP8266-2.2.1.02/examples/IRsendDemo/IRsendDemo.ino
rename to lib/IRremoteESP8266-2.5.2.03/examples/IRsendDemo/IRsendDemo.ino
index 1a688cba382c..892016b3eec1 100644
--- a/lib/IRremoteESP8266-2.2.1.02/examples/IRsendDemo/IRsendDemo.ino
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/IRsendDemo/IRsendDemo.ino
@@ -4,7 +4,8 @@
* Based on Ken Shirriff's IrsendDemo Version 0.1 July, 2009,
* Copyright 2009 Ken Shirriff, http://arcfn.com
*
- * An IR LED circuit *MUST* be connected to ESP8266 pin 4 (D2).
+ * An IR LED circuit *MUST* be connected to the ESP8266 on a pin
+ * as specified by kIrLed below.
*
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
*
@@ -33,7 +34,9 @@
#include
#include
-IRsend irsend(4); // An IR LED is controlled by GPIO pin 4 (D2)
+const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
+
+IRsend irsend(kIrLed); // Set the GPIO to be used to sending the message.
// Example of data captured by IRrecvDumpV2.ino
uint16_t rawData[67] = {9000, 4500, 650, 550, 650, 1650, 600, 550, 650, 550,
@@ -50,13 +53,19 @@ void setup() {
}
void loop() {
+#if SEND_NEC
Serial.println("NEC");
irsend.sendNEC(0x00FFE01FUL, 32);
+#endif // SEND_NEC
delay(2000);
+#if SEND_SONY
Serial.println("Sony");
irsend.sendSony(0xa90, 12, 2);
+#endif // SEND_SONY
delay(2000);
+#if SEND_RAW
Serial.println("a rawData capture from IRrecvDumpV2");
irsend.sendRaw(rawData, 67, 38); // Send a raw data capture at 38kHz.
+#endif // SEND_RAW
delay(2000);
}
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/IRsendDemo/platformio.ini b/lib/IRremoteESP8266-2.5.2.03/examples/IRsendDemo/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/examples/IRsendDemo/platformio.ini
rename to lib/IRremoteESP8266-2.5.2.03/examples/IRsendDemo/platformio.ini
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/IRsendProntoDemo/IRsendProntoDemo.ino b/lib/IRremoteESP8266-2.5.2.03/examples/IRsendProntoDemo/IRsendProntoDemo.ino
similarity index 93%
rename from lib/IRremoteESP8266-2.2.1.02/examples/IRsendProntoDemo/IRsendProntoDemo.ino
rename to lib/IRremoteESP8266-2.5.2.03/examples/IRsendProntoDemo/IRsendProntoDemo.ino
index 0a7a014a76d1..3bef2179e042 100644
--- a/lib/IRremoteESP8266-2.2.1.02/examples/IRsendProntoDemo/IRsendProntoDemo.ino
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/IRsendProntoDemo/IRsendProntoDemo.ino
@@ -6,7 +6,7 @@
* Version 1.0 June, 2017
*
* An IR LED circuit *MUST* be connected to ESP8266 pin 4 (D2), unless you
- * change the irsend() value below.
+ * change the kIrLed value below.
*
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
*
@@ -35,7 +35,9 @@
#include
#include
-IRsend irsend(4); // An IR LED is controlled by GPIO pin 4 (D2)
+const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
+
+IRsend irsend(kIrLed); // Set the GPIO to be used to sending the message.
// Panasonic Plasma TV Descrete code (Power On).
// Acquired from:
@@ -96,10 +98,15 @@ void setup() {
}
void loop() {
+#if SEND_PRONTO
Serial.println("Sending a Samsung TV 'on' command.");
irsend.sendPronto(samsungProntoCode, 72);
delay(2000);
Serial.println("Sending a Panasonic Plasma TV 'on' command.");
irsend.sendPronto(panasonicProntoCode, 104);
delay(2000);
+#else // SEND_PRONTO
+ Serial.println("Can't send because SEND_PRONTO has been disabled.");
+ delay(10000);
+#endif // SEND_PRONTO
}
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/IRsendProntoDemo/platformio.ini b/lib/IRremoteESP8266-2.5.2.03/examples/IRsendProntoDemo/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/examples/IRsendProntoDemo/platformio.ini
rename to lib/IRremoteESP8266-2.5.2.03/examples/IRsendProntoDemo/platformio.ini
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/JVCPanasonicSendDemo/JVCPanasonicSendDemo.ino b/lib/IRremoteESP8266-2.5.2.03/examples/JVCPanasonicSendDemo/JVCPanasonicSendDemo.ino
similarity index 64%
rename from lib/IRremoteESP8266-2.2.1.02/examples/JVCPanasonicSendDemo/JVCPanasonicSendDemo.ino
rename to lib/IRremoteESP8266-2.5.2.03/examples/JVCPanasonicSendDemo/JVCPanasonicSendDemo.ino
index 9c7068000a79..ee2422915b68 100644
--- a/lib/IRremoteESP8266-2.2.1.02/examples/JVCPanasonicSendDemo/JVCPanasonicSendDemo.ino
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/JVCPanasonicSendDemo/JVCPanasonicSendDemo.ino
@@ -4,7 +4,8 @@
* Based on Ken Shirriff's IrsendDemo Version 0.1 July, 2009, Copyright 2009 Ken Shirriff, http://arcfn.com
* JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post)
*
- * An IR LED circuit *MUST* be connected to ESP8266 pin 4 (D2).
+ * An IR LED circuit *MUST* be connected to the ESP8266 on a pin
+ * as specified by kIrLed below.
*
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
*
@@ -33,12 +34,13 @@
#include
#include
-#define PanasonicAddress 0x4004 // Panasonic address (Pre data)
-#define PanasonicPower 0x100BCBD // Panasonic Power button
+const uint16_t kPanasonicAddress = 0x4004; // Panasonic address (Pre data)
+const uint32_t kPanasonicPower = 0x100BCBD; // Panasonic Power button
+const uint16_t kJVCPower = 0xC5E8;
-#define JVCPower 0xC5E8
+const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
-IRsend irsend(4); // An IR LED is controlled by GPIO pin 4 (D2)
+IRsend irsend(kIrLed); // Set the GPIO to be used to sending the message.
void setup() {
irsend.begin();
@@ -46,11 +48,16 @@ void setup() {
void loop() {
// This should turn your TV on and off
- irsend.sendPanasonic(PanasonicAddress, PanasonicPower);
+#if SEND_PANASONIC
+ irsend.sendPanasonic(kPanasonicAddress, kPanasonicPower);
+#else // SEND_PANASONIC
+ Serial.println("Can't send because SEND_PANASONIC has been disabled.");
+#endif // SEND_PANASONIC
- irsend.sendJVC(JVCPower, 16, 0); // hex value, 16 bits, no repeat
- // see http://www.sbprojects.com/knowledge/ir/jvc.php for information
- delayMicroseconds(50);
- irsend.sendJVC(JVCPower, 16, 1); // hex value, 16 bits, repeat
- delayMicroseconds(50);
+#if SEND_JVC
+ irsend.sendJVC(kJVCPower, 16, 1); // hex value, 16 bits, single repeat
+#else // SEND_JVC
+ Serial.println("Can't send because SEND_JVC has been disabled.");
+#endif // SEND_JVC
+ delay(10000); // Wait 10 seconds before we repeat everything.
}
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/JVCPanasonicSendDemo/platformio.ini b/lib/IRremoteESP8266-2.5.2.03/examples/JVCPanasonicSendDemo/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/examples/JVCPanasonicSendDemo/platformio.ini
rename to lib/IRremoteESP8266-2.5.2.03/examples/JVCPanasonicSendDemo/platformio.ini
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/LGACSend/LGACSend.ino b/lib/IRremoteESP8266-2.5.2.03/examples/LGACSend/LGACSend.ino
similarity index 95%
rename from lib/IRremoteESP8266-2.2.1.02/examples/LGACSend/LGACSend.ino
rename to lib/IRremoteESP8266-2.5.2.03/examples/LGACSend/LGACSend.ino
index 7cced0c88d5f..9139983c9145 100644
--- a/lib/IRremoteESP8266-2.2.1.02/examples/LGACSend/LGACSend.ino
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/LGACSend/LGACSend.ino
@@ -45,7 +45,11 @@ void Ac_Send_Code(uint32_t code) {
Serial.print(" : ");
Serial.println(code, HEX);
+#if SEND_LG
irsend.sendLG(code, 28);
+#else // SEND_LG
+ Serial.println("Can't send because SEND_LG has been disabled.");
+#endif // SEND_LG
}
void Ac_Activate(unsigned int temperature, unsigned int air_flow,
@@ -60,9 +64,9 @@ void Ac_Activate(unsigned int temperature, unsigned int air_flow,
else
ac_msbits4 = 0; // cooling
unsigned int ac_msbits5 = (temperature < 15) ? 0 : temperature - 15;
- unsigned int ac_msbits6;
+ unsigned int ac_msbits6 = 0;
- if (0 <= air_flow && air_flow <= 2) {
+ if (air_flow <= 2) {
if (kAc_Type == 0)
ac_msbits6 = kAc_Flow_Tower[air_flow];
else
@@ -128,7 +132,7 @@ void setup() {
}
void loop() {
- char b;
+ char b = ' ';
Serial.println("# a : mode or temp b : air_flow, temp, swing, clean,"
" cooling/heating");
Serial.println("# 0 : off 0");
@@ -158,7 +162,7 @@ void loop() {
default:
Serial.println("b="); // Prompt User for input
while (Serial.available() == 0) {}
- char b = Serial.read();
+ b = Serial.read();
}
/*
@@ -171,8 +175,8 @@ void loop() {
# 4 : air_flow 0 ~ 3 : flow
# + : temp + 1
# - : temp - 1
- # c : cooling
- # h : heating
+ # c : cooling
+ # h : heating
# m : change cooling to air clean, air clean to cooling
*/
Serial.print("a : ");
@@ -194,7 +198,7 @@ void loop() {
Ac_Change_Air_Swing(1);
break;
case '3': // 1 : clean on, power on
- if (b == '0' | b == '1')
+ if (b == '0' || b == '1')
Ac_Air_Clean(b);
break;
case '4':
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/TurnOnArgoAC/platformio.ini b/lib/IRremoteESP8266-2.5.2.03/examples/LGACSend/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/examples/TurnOnArgoAC/platformio.ini
rename to lib/IRremoteESP8266-2.5.2.03/examples/LGACSend/platformio.ini
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/TurnOnArgoAC/TurnOnArgoAC.ino b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnArgoAC/TurnOnArgoAC.ino
similarity index 72%
rename from lib/IRremoteESP8266-2.2.1.02/examples/TurnOnArgoAC/TurnOnArgoAC.ino
rename to lib/IRremoteESP8266-2.5.2.03/examples/TurnOnArgoAC/TurnOnArgoAC.ino
index a2e450ac5637..3993d11510b0 100644
--- a/lib/IRremoteESP8266-2.2.1.02/examples/TurnOnArgoAC/TurnOnArgoAC.ino
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnArgoAC/TurnOnArgoAC.ino
@@ -1,5 +1,6 @@
-/* Copyright 2017 crankyoldgit
-* An IR LED circuit *MUST* be connected to ESP8266 pin 4 (D2).
+/* Copyright 2017, 2018 crankyoldgit
+* An IR LED circuit *MUST* be connected to the ESP8266 on a pin
+* as specified by kIrLed below.
*
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
*
@@ -29,10 +30,11 @@
#include
#include
-IRArgoAC argoir(4); // An IR LED is controlled by GPIO pin 4 (D2)
+const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
+IRArgoAC ac(kIrLed); // Set the GPIO to be used to sending the message.
void setup() {
- argoir.begin();
+ ac.begin();
Serial.begin(115200);
}
@@ -40,13 +42,17 @@ void loop() {
Serial.println("Sending...");
// Set up what we want to send. See ir_Argo.cpp for all the options.
- argoir.setPower(true);
- argoir.setFan(ARGO_FAN_1);
- argoir.setCoolMode(ARGO_COOL_AUTO);
- argoir.setTemp(25);
+ ac.setPower(true);
+ ac.setFan(kArgoFan1);
+ ac.setCoolMode(kArgoCoolAuto);
+ ac.setTemp(25);
+#if SEND_ARGO
// Now send the IR signal.
- argoir.send();
+ ac.send();
+#else // SEND_ARGO
+ Serial.println("Can't send because SEND_ARGO has been disabled.");
+#endif // SEND_ARGO
delay(5000);
}
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/TurnOnDaikinAC/platformio.ini b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnArgoAC/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/examples/TurnOnDaikinAC/platformio.ini
rename to lib/IRremoteESP8266-2.5.2.03/examples/TurnOnArgoAC/platformio.ini
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/TurnOnDaikinAC/TurnOnDaikinAC.ino b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnDaikinAC/TurnOnDaikinAC.ino
similarity index 64%
rename from lib/IRremoteESP8266-2.2.1.02/examples/TurnOnDaikinAC/TurnOnDaikinAC.ino
rename to lib/IRremoteESP8266-2.5.2.03/examples/TurnOnDaikinAC/TurnOnDaikinAC.ino
index eb5cda5e7e29..b3ab757de458 100644
--- a/lib/IRremoteESP8266-2.2.1.02/examples/TurnOnDaikinAC/TurnOnDaikinAC.ino
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnDaikinAC/TurnOnDaikinAC.ino
@@ -1,6 +1,7 @@
-/* Copyright 2016 sillyfrog
+/* Copyright 2017 sillyfrog
*
-* An IR LED circuit *MUST* be connected to ESP8266 pin 4 (D2).
+* An IR LED circuit *MUST* be connected to the ESP8266 on a pin
+* as specified by kIrLed below.
*
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
*
@@ -30,10 +31,11 @@
#include
#include
-IRDaikinESP dakinir(D2); // An IR LED is controlled by GPIO pin 4 (D2)
+const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
+IRDaikinESP ac(kIrLed); // Set the GPIO to be used to sending the message
void setup() {
- dakinir.begin();
+ ac.begin();
Serial.begin(115200);
}
@@ -42,15 +44,26 @@ void loop() {
Serial.println("Sending...");
// Set up what we want to send. See ir_Daikin.cpp for all the options.
- dakinir.on();
- dakinir.setFan(1);
- dakinir.setMode(DAIKIN_COOL);
- dakinir.setTemp(25);
- dakinir.setSwingVertical(0);
- dakinir.setSwingHorizontal(0);
+ ac.on();
+ ac.setFan(1);
+ ac.setMode(kDaikinCool);
+ ac.setTemp(25);
+ ac.setSwingVertical(false);
+ ac.setSwingHorizontal(false);
+
+ // Set the current time to 1:33PM (13:33)
+ // Time works in minutes past midnight
+ ac.setCurrentTime(13 * 60 + 33);
+ // Turn off about 1 hour later at 2:30PM (14:30)
+ ac.enableOffTimer(14 * 60 + 30);
+
+ // Display what we are going to send.
+ Serial.println(ac.toString());
// Now send the IR signal.
- dakinir.send();
+#if SEND_DAIKIN
+ ac.send();
+#endif // SEND_DAIKIN
- delay(5000);
+ delay(15000);
}
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/TurnOnFujitsuAC/platformio.ini b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnDaikinAC/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/examples/TurnOnFujitsuAC/platformio.ini
rename to lib/IRremoteESP8266-2.5.2.03/examples/TurnOnDaikinAC/platformio.ini
diff --git a/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnFujitsuAC/TurnOnFujitsuAC.ino b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnFujitsuAC/TurnOnFujitsuAC.ino
new file mode 100644
index 000000000000..823a3f485617
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnFujitsuAC/TurnOnFujitsuAC.ino
@@ -0,0 +1,50 @@
+// Copyright 2017 Jonny Graham, 2018 David Conran
+#ifndef UNIT_TEST
+#include
+#endif
+#include
+#include
+#include
+
+const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
+IRFujitsuAC ac(kIrLed);
+
+void printState() {
+ // Display the settings.
+ Serial.println("Fujitsu A/C remote is in the following state:");
+ Serial.printf(" %s\n", ac.toString().c_str());
+ // Display the encoded IR sequence.
+ unsigned char* ir_code = ac.getRaw();
+ Serial.print("IR Code: 0x");
+ for (uint8_t i = 0; i < ac.getStateLength(); i++)
+ Serial.printf("%02X", ir_code[i]);
+ Serial.println();
+}
+
+void setup() {
+ ac.begin();
+ Serial.begin(115200);
+ delay(200);
+
+ // Set up what we want to send. See ir_Fujitsu.cpp for all the options.
+ Serial.println("Default state of the remote.");
+ printState();
+ Serial.println("Setting desired state for A/C.");
+ ac.setCmd(kFujitsuAcCmdTurnOn);
+ ac.setSwing(kFujitsuAcSwingBoth);
+ ac.setMode(kFujitsuAcModeCool);
+ ac.setFanSpeed(kFujitsuAcFanHigh);
+ ac.setTemp(24); // 24C
+}
+
+void loop() {
+ // Now send the IR signal.
+ Serial.println("Sending IR command to A/C ...");
+#if SEND_FUJITSU_AC
+ ac.send();
+#else // SEND_FUJITSU_AC
+ Serial.println("Can't send because SEND_FUJITSU_AC has been disabled.");
+#endif // SEND_FUJITSU_AC
+ printState();
+ delay(5000);
+}
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/TurnOnKelvinatorAC/platformio.ini b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnFujitsuAC/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/examples/TurnOnKelvinatorAC/platformio.ini
rename to lib/IRremoteESP8266-2.5.2.03/examples/TurnOnFujitsuAC/platformio.ini
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino
similarity index 63%
rename from lib/IRremoteESP8266-2.2.1.02/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino
rename to lib/IRremoteESP8266-2.5.2.03/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino
index 393ba28ff768..b9b700741483 100644
--- a/lib/IRremoteESP8266-2.2.1.02/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino
@@ -1,6 +1,7 @@
-/* Copyright 2016 David Conran
+/* Copyright 2016, 2018 David Conran
*
-* An IR LED circuit *MUST* be connected to ESP8266 pin 4 (D2).
+* An IR LED circuit *MUST* be connected to the ESP8266 on a pin
+* as specified by kIrLed below.
*
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
*
@@ -29,29 +30,23 @@
#include
#include
-IRKelvinatorAC kelvir(D2); // An IR LED is controlled by GPIO pin 4 (D2)
+const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
+IRKelvinatorAC ac(kIrLed); // Set the GPIO to be used for sending messages.
void printState() {
// Display the settings.
Serial.println("Kelvinator A/C remote is in the following state:");
- Serial.printf(" Basic\n Power: %d, Mode: %d, Temp: %dC, Fan Speed: %d\n",
- kelvir.getPower(), kelvir.getMode(), kelvir.getTemp(),
- kelvir.getFan());
- Serial.printf(" Options\n X-Fan: %d, Light: %d, Ion Filter: %d\n",
- kelvir.getXFan(), kelvir.getLight(), kelvir.getIonFilter());
- Serial.printf(" Swing (V): %d, Swing (H): %d, Turbo: %d, Quiet: %d\n",
- kelvir.getSwingVertical(), kelvir.getSwingHorizontal(),
- kelvir.getTurbo(), kelvir.getQuiet());
+ Serial.printf(" %s\n", ac.toString().c_str());
// Display the encoded IR sequence.
- unsigned char* ir_code = kelvir.getRaw();
+ unsigned char* ir_code = ac.getRaw();
Serial.print("IR Code: 0x");
- for (uint8_t i = 0; i < KELVINATOR_STATE_LENGTH; i++)
+ for (uint8_t i = 0; i < kKelvinatorStateLength; i++)
Serial.printf("%02X", ir_code[i]);
Serial.println();
}
void setup() {
- kelvir.begin();
+ ac.begin();
Serial.begin(115200);
delay(200);
@@ -60,21 +55,23 @@ void setup() {
Serial.println("Default state of the remote.");
printState();
Serial.println("Setting desired state for A/C.");
- kelvir.on();
- kelvir.setFan(1);
- kelvir.setMode(KELVINATOR_COOL);
- kelvir.setTemp(26);
- kelvir.setSwingVertical(false);
- kelvir.setSwingHorizontal(true);
- kelvir.setXFan(true);
- kelvir.setIonFilter(false);
- kelvir.setLight(true);
+ ac.on();
+ ac.setFan(1);
+ ac.setMode(kKelvinatorCool);
+ ac.setTemp(26);
+ ac.setSwingVertical(false);
+ ac.setSwingHorizontal(true);
+ ac.setXFan(true);
+ ac.setIonFilter(false);
+ ac.setLight(true);
}
void loop() {
// Now send the IR signal.
+#if SEND_KELVINATOR
Serial.println("Sending IR command to A/C ...");
- kelvir.send();
+ ac.send();
+#endif // SEND_KELVINATOR
printState();
delay(5000);
}
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/TurnOnMitsubishiAC/platformio.ini b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnKelvinatorAC/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/examples/TurnOnMitsubishiAC/platformio.ini
rename to lib/IRremoteESP8266-2.5.2.03/examples/TurnOnKelvinatorAC/platformio.ini
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/TurnOnMitsubishiAC/TurnOnMitsubishiAC.ino b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnMitsubishiAC/TurnOnMitsubishiAC.ino
similarity index 72%
rename from lib/IRremoteESP8266-2.2.1.02/examples/TurnOnMitsubishiAC/TurnOnMitsubishiAC.ino
rename to lib/IRremoteESP8266-2.5.2.03/examples/TurnOnMitsubishiAC/TurnOnMitsubishiAC.ino
index 1ea9b0d31193..e719af68e62a 100644
--- a/lib/IRremoteESP8266-2.2.1.02/examples/TurnOnMitsubishiAC/TurnOnMitsubishiAC.ino
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnMitsubishiAC/TurnOnMitsubishiAC.ino
@@ -1,6 +1,7 @@
-/* Copyright 2017 David Conran
+/* Copyright 2017, 2018 David Conran
*
-* An IR LED circuit *MUST* be connected to ESP8266 pin 4 (D2).
+* An IR LED circuit *MUST* be connected to the ESP8266 on a pin
+* as specified by kIrLed below.
*
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
*
@@ -29,25 +30,23 @@
#include
#include
-IRMitsubishiAC mitsubir(D2); // An IR LED is controlled by GPIO pin 4 (D2)
+const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
+IRMitsubishiAC ac(kIrLed); // Set the GPIO used for sending messages.
void printState() {
// Display the settings.
Serial.println("Mitsubishi A/C remote is in the following state:");
- Serial.printf(" Power: %d, Mode: %d, Temp: %dC, Fan Speed: %d," \
- " Vane Mode: %d\n",
- mitsubir.getPower(), mitsubir.getMode(), mitsubir.getTemp(),
- mitsubir.getFan(), mitsubir.getVane());
+ Serial.printf(" %s\n", ac.toString().c_str());
// Display the encoded IR sequence.
- unsigned char* ir_code = mitsubir.getRaw();
+ unsigned char* ir_code = ac.getRaw();
Serial.print("IR Code: 0x");
- for (uint8_t i = 0; i < MITSUBISHI_AC_STATE_LENGTH; i++)
+ for (uint8_t i = 0; i < kMitsubishiACStateLength; i++)
Serial.printf("%02X", ir_code[i]);
Serial.println();
}
void setup() {
- mitsubir.begin();
+ ac.begin();
Serial.begin(115200);
delay(200);
@@ -55,17 +54,19 @@ void setup() {
Serial.println("Default state of the remote.");
printState();
Serial.println("Setting desired state for A/C.");
- mitsubir.on();
- mitsubir.setFan(1);
- mitsubir.setMode(MITSUBISHI_AC_COOL);
- mitsubir.setTemp(26);
- mitsubir.setVane(MITSUBISHI_AC_VANE_AUTO);
+ ac.on();
+ ac.setFan(1);
+ ac.setMode(kMitsubishiAcCool);
+ ac.setTemp(26);
+ ac.setVane(kMitsubishiAcVaneAuto);
}
void loop() {
// Now send the IR signal.
+#if SEND_MITSUBISHI_AC
Serial.println("Sending IR command to A/C ...");
- mitsubir.send();
+ ac.send();
+#endif // SEND_MITSUBISHI_AC
printState();
delay(5000);
}
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/TurnOnTrotecAC/platformio.ini b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnMitsubishiAC/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/examples/TurnOnTrotecAC/platformio.ini
rename to lib/IRremoteESP8266-2.5.2.03/examples/TurnOnMitsubishiAC/platformio.ini
diff --git a/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnToshibaAC/TurnOnToshibaAC.ino b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnToshibaAC/TurnOnToshibaAC.ino
new file mode 100644
index 000000000000..d78178098e30
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnToshibaAC/TurnOnToshibaAC.ino
@@ -0,0 +1,71 @@
+/* Copyright 2017, 2018 David Conran
+*
+* An IR LED circuit *MUST* be connected to the ESP8266 on a pin
+* as specified by kIrLed below.
+*
+* TL;DR: The IR LED needs to be driven by a transistor for a good result.
+*
+* Suggested circuit:
+* https://github.com/markszabo/IRremoteESP8266/wiki#ir-sending
+*
+* Common mistakes & tips:
+* * Don't just connect the IR LED directly to the pin, it won't
+* have enough current to drive the IR LED effectively.
+* * Make sure you have the IR LED polarity correct.
+* See: https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity
+* * Typical digital camera/phones can be used to see if the IR LED is flashed.
+* Replace the IR LED with a normal LED if you don't have a digital camera
+* when debugging.
+* * Avoid using the following pins unless you really know what you are doing:
+* * Pin 0/D3: Can interfere with the boot/program mode & support circuits.
+* * Pin 1/TX/TXD0: Any serial transmissions from the ESP8266 will interfere.
+* * Pin 3/RX/RXD0: Any serial transmissions to the ESP8266 will interfere.
+* * ESP-01 modules are tricky. We suggest you use a module with more GPIOs
+* for your first time. e.g. ESP-12 etc.
+*/
+#ifndef UNIT_TEST
+#include
+#endif
+#include
+#include
+#include
+
+const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
+IRToshibaAC ac(kIrLed); // Set the GPIO to be used for sending messages.
+
+void printState() {
+ // Display the settings.
+ Serial.println("Toshiba A/C remote is in the following state:");
+ Serial.printf(" %s\n", ac.toString().c_str());
+ // Display the encoded IR sequence.
+ unsigned char* ir_code = ac.getRaw();
+ Serial.print("IR Code: 0x");
+ for (uint8_t i = 0; i < kToshibaACStateLength; i++)
+ Serial.printf("%02X", ir_code[i]);
+ Serial.println();
+}
+
+void setup() {
+ ac.begin();
+ Serial.begin(115200);
+ delay(200);
+
+ // Set up what we want to send. See ir_Toshiba.cpp for all the options.
+ Serial.println("Default state of the remote.");
+ printState();
+ Serial.println("Setting desired state for A/C.");
+ ac.on();
+ ac.setFan(1);
+ ac.setMode(kToshibaAcCool);
+ ac.setTemp(26);
+}
+
+void loop() {
+ // Now send the IR signal.
+#if SEND_TOSHIBA_AC
+ Serial.println("Sending IR command to A/C ...");
+ ac.send();
+#endif // SEND_TOSHIBA_AC
+ printState();
+ delay(5000);
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnToshibaAC/platformio.ini b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnToshibaAC/platformio.ini
new file mode 100644
index 000000000000..eeb8d1f2eb93
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnToshibaAC/platformio.ini
@@ -0,0 +1,17 @@
+[platformio]
+lib_extra_dirs = ../../
+src_dir=.
+
+[common]
+build_flags =
+lib_deps_builtin =
+lib_deps_external =
+
+[env:nodemcuv2]
+platform = espressif8266
+framework = arduino
+board = nodemcuv2
+build_flags = ${common.build_flags}
+lib_deps =
+ ${common.lib_deps_builtin}
+ ${common.lib_deps_external}
diff --git a/lib/IRremoteESP8266-2.2.1.02/examples/TurnOnTrotecAC/TurnOnTrotecAC.ino b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnTrotecAC/TurnOnTrotecAC.ino
similarity index 74%
rename from lib/IRremoteESP8266-2.2.1.02/examples/TurnOnTrotecAC/TurnOnTrotecAC.ino
rename to lib/IRremoteESP8266-2.5.2.03/examples/TurnOnTrotecAC/TurnOnTrotecAC.ino
index 2476ff557af9..b7881eead1e6 100644
--- a/lib/IRremoteESP8266-2.2.1.02/examples/TurnOnTrotecAC/TurnOnTrotecAC.ino
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnTrotecAC/TurnOnTrotecAC.ino
@@ -1,5 +1,6 @@
/* Copyright 2017 stufisher
-* An IR LED circuit *MUST* be connected to ESP8266 pin 4 (D2).
+* An IR LED circuit *MUST* be connected to the ESP8266 on a pin
+* as specified by kIrLed below.
*
* TL;DR: The IR LED needs to be driven by a transistor for a good result.
*
@@ -29,10 +30,11 @@
#include
#include
-IRTrotecESP trotecir(D2); // An IR LED is controlled by GPIO pin 4 (D2)
+const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
+IRTrotecESP ac(kIrLed); // Set the GPIO to be used for sending messages.
void setup() {
- trotecir.begin();
+ ac.begin();
Serial.begin(115200);
}
@@ -40,13 +42,17 @@ void loop() {
Serial.println("Sending...");
// Set up what we want to send. See ir_Trotec.cpp for all the options.
- trotecir.setPower(true);
- trotecir.setSpeed(TROTEC_FAN_LOW);
- trotecir.setMode(TROTEC_COOL);
- trotecir.setTemp(25);
+ ac.setPower(true);
+ ac.setSpeed(kTrotecFanLow);
+ ac.setMode(kTrotecCool);
+ ac.setTemp(25);
// Now send the IR signal.
- trotecir.send();
+#if SEND_TROTEC
+ ac.send();
+#else // SEND_TROTEC
+ Serial.println("Can't send because SEND_TROTEC has been disabled.");
+#endif // SEND_TROTEC
delay(5000);
}
diff --git a/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnTrotecAC/platformio.ini b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnTrotecAC/platformio.ini
new file mode 100644
index 000000000000..eeb8d1f2eb93
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/examples/TurnOnTrotecAC/platformio.ini
@@ -0,0 +1,17 @@
+[platformio]
+lib_extra_dirs = ../../
+src_dir=.
+
+[common]
+build_flags =
+lib_deps_builtin =
+lib_deps_external =
+
+[env:nodemcuv2]
+platform = espressif8266
+framework = arduino
+board = nodemcuv2
+build_flags = ${common.build_flags}
+lib_deps =
+ ${common.lib_deps_builtin}
+ ${common.lib_deps_external}
diff --git a/lib/IRremoteESP8266-2.5.2.03/keywords.txt b/lib/IRremoteESP8266-2.5.2.03/keywords.txt
new file mode 100644
index 000000000000..ac3f43fe1809
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/keywords.txt
@@ -0,0 +1,1645 @@
+#########################################
+# Syntax Coloring Map For IRremoteESP8266
+#########################################
+
+################################################
+# WARNING: Do NOT edit this file directly.
+# It is generated by 'tools/mkkeywords'
+# e.g. tools/mkkeywords > keywords.txt
+################################################
+
+#######################################################
+# The Arduino IDE requires the use of a tab separator
+# between the name and identifier. Without this tab the
+# keyword is not highlighted.
+#
+# Reference: https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5:-Library-specification#keywords
+#######################################################
+
+#######################################
+# Datatypes & Classes (KEYWORD1)
+#######################################
+
+IRArgoAC KEYWORD1
+IRCoolixAC KEYWORD1
+IRDaikinESP KEYWORD1
+IRFujitsuAC KEYWORD1
+IRGreeAC KEYWORD1
+IRHaierAC KEYWORD1
+IRHaierACYRW02 KEYWORD1
+IRKelvinatorAC KEYWORD1
+IRMideaAC KEYWORD1
+IRMitsubishiAC KEYWORD1
+IRPanasonicAc KEYWORD1
+IRSamsungAc KEYWORD1
+IRToshibaAC KEYWORD1
+IRTrotecESP KEYWORD1
+IRrecv KEYWORD1
+IRsend KEYWORD1
+IRtimer KEYWORD1
+decode_results KEYWORD1
+ir_params_t KEYWORD1
+match_result_t KEYWORD1
+
+#######################################
+# Methods and Functions (KEYWORD2)
+#######################################
+
+_delayMicroseconds KEYWORD2
+add KEYWORD2
+addbit KEYWORD2
+begin KEYWORD2
+buildFromState KEYWORD2
+buildState KEYWORD2
+calcBlockChecksum KEYWORD2
+calcChecksum KEYWORD2
+calcLGChecksum KEYWORD2
+calcUSecPeriod KEYWORD2
+calculateChecksum KEYWORD2
+calibrate KEYWORD2
+cancelOffTimer KEYWORD2
+cancelOnTimer KEYWORD2
+cancelTimers KEYWORD2
+checkheader KEYWORD2
+checksum KEYWORD2
+clearBit KEYWORD2
+clearSensorTemp KEYWORD2
+compare KEYWORD2
+copyIrParams KEYWORD2
+decode KEYWORD2
+decodeAiwaRCT501 KEYWORD2
+decodeCOOLIX KEYWORD2
+decodeCarrierAC KEYWORD2
+decodeDISH KEYWORD2
+decodeDaikin KEYWORD2
+decodeDenon KEYWORD2
+decodeElectraAC KEYWORD2
+decodeFujitsuAC KEYWORD2
+decodeGICable KEYWORD2
+decodeGree KEYWORD2
+decodeHaierAC KEYWORD2
+decodeHaierACYRW02 KEYWORD2
+decodeHash KEYWORD2
+decodeHitachiAC KEYWORD2
+decodeJVC KEYWORD2
+decodeKelvinator KEYWORD2
+decodeLG KEYWORD2
+decodeLasertag KEYWORD2
+decodeLutron KEYWORD2
+decodeMWM KEYWORD2
+decodeMagiQuest KEYWORD2
+decodeMidea KEYWORD2
+decodeMitsubishi KEYWORD2
+decodeMitsubishi2 KEYWORD2
+decodeMitsubishiAC KEYWORD2
+decodeNEC KEYWORD2
+decodeNikai KEYWORD2
+decodePanasonic KEYWORD2
+decodePanasonicAC KEYWORD2
+decodePioneer KEYWORD2
+decodeRC5 KEYWORD2
+decodeRC6 KEYWORD2
+decodeRCMM KEYWORD2
+decodeSAMSUNG KEYWORD2
+decodeSamsungAC KEYWORD2
+decodeSanyo KEYWORD2
+decodeSanyoLC7461 KEYWORD2
+decodeSharp KEYWORD2
+decodeSony KEYWORD2
+decodeToshibaAC KEYWORD2
+decodeWhirlpoolAC KEYWORD2
+decodeWhynter KEYWORD2
+disableIRIn KEYWORD2
+disableOffTimer KEYWORD2
+disableOnTimer KEYWORD2
+elapsed KEYWORD2
+enableIRIn KEYWORD2
+enableIROut KEYWORD2
+enableOffTimer KEYWORD2
+enableOnTimer KEYWORD2
+encodeJVC KEYWORD2
+encodeLG KEYWORD2
+encodeMagiQuest KEYWORD2
+encodeNEC KEYWORD2
+encodePanasonic KEYWORD2
+encodePioneer KEYWORD2
+encodeRC5 KEYWORD2
+encodeRC5X KEYWORD2
+encodeRC6 KEYWORD2
+encodeSAMSUNG KEYWORD2
+encodeSanyoLC7461 KEYWORD2
+encodeSharp KEYWORD2
+encodeSony KEYWORD2
+encodeTime KEYWORD2
+fixChecksum KEYWORD2
+fixup KEYWORD2
+getBeep KEYWORD2
+getBit KEYWORD2
+getBufSize KEYWORD2
+getButton KEYWORD2
+getClean KEYWORD2
+getClock KEYWORD2
+getCmd KEYWORD2
+getCommand KEYWORD2
+getCoolMode KEYWORD2
+getCorrectedRawLength KEYWORD2
+getCurrTime KEYWORD2
+getCurrentTime KEYWORD2
+getEcono KEYWORD2
+getEye KEYWORD2
+getFan KEYWORD2
+getFanSpeed KEYWORD2
+getFlap KEYWORD2
+getHealth KEYWORD2
+getHeatMode KEYWORD2
+getIonFilter KEYWORD2
+getLed KEYWORD2
+getLight KEYWORD2
+getMax KEYWORD2
+getMode KEYWORD2
+getMold KEYWORD2
+getNight KEYWORD2
+getOffTime KEYWORD2
+getOffTimer KEYWORD2
+getOffTimerEnabled KEYWORD2
+getOnTime KEYWORD2
+getOnTimer KEYWORD2
+getOnTimerEnabled KEYWORD2
+getPower KEYWORD2
+getPowerful KEYWORD2
+getQuiet KEYWORD2
+getRClevel KEYWORD2
+getRaw KEYWORD2
+getSensor KEYWORD2
+getSensorTemp KEYWORD2
+getSleep KEYWORD2
+getSpeed KEYWORD2
+getStartClock KEYWORD2
+getStateLength KEYWORD2
+getStopClock KEYWORD2
+getSwing KEYWORD2
+getSwingHorizontal KEYWORD2
+getSwingVertical KEYWORD2
+getSwingVerticalAuto KEYWORD2
+getSwingVerticalPosition KEYWORD2
+getTemp KEYWORD2
+getTempRaw KEYWORD2
+getTime KEYWORD2
+getTimer KEYWORD2
+getTurbo KEYWORD2
+getVane KEYWORD2
+getXFan KEYWORD2
+getZoneFollow KEYWORD2
+getiFeel KEYWORD2
+hasACState KEYWORD2
+invertBits KEYWORD2
+isOffTimerEnabled KEYWORD2
+isOnTimerEnabled KEYWORD2
+ledOff KEYWORD2
+ledOn KEYWORD2
+mark KEYWORD2
+match KEYWORD2
+matchAtLeast KEYWORD2
+matchData KEYWORD2
+matchMark KEYWORD2
+matchSpace KEYWORD2
+off KEYWORD2
+on KEYWORD2
+printState KEYWORD2
+readbits KEYWORD2
+renderTime KEYWORD2
+reset KEYWORD2
+resultToHexidecimal KEYWORD2
+resultToHumanReadableBasic KEYWORD2
+resultToSourceCode KEYWORD2
+resultToTimingInfo KEYWORD2
+resume KEYWORD2
+reverseBits KEYWORD2
+send KEYWORD2
+sendAiwaRCT501 KEYWORD2
+sendArgo KEYWORD2
+sendCOOLIX KEYWORD2
+sendCarrierAC KEYWORD2
+sendDISH KEYWORD2
+sendDaikin KEYWORD2
+sendData KEYWORD2
+sendDenon KEYWORD2
+sendElectraAC KEYWORD2
+sendExtended KEYWORD2
+sendFujitsuAC KEYWORD2
+sendGC KEYWORD2
+sendGICable KEYWORD2
+sendGeneric KEYWORD2
+sendGree KEYWORD2
+sendHaierAC KEYWORD2
+sendHaierACYRW02 KEYWORD2
+sendHitachiAC KEYWORD2
+sendHitachiAC1 KEYWORD2
+sendHitachiAC2 KEYWORD2
+sendJVC KEYWORD2
+sendKelvinator KEYWORD2
+sendLG KEYWORD2
+sendLG2 KEYWORD2
+sendLasertag KEYWORD2
+sendLutron KEYWORD2
+sendMWM KEYWORD2
+sendMagiQuest KEYWORD2
+sendMidea KEYWORD2
+sendMitsubishi KEYWORD2
+sendMitsubishi2 KEYWORD2
+sendMitsubishiAC KEYWORD2
+sendNEC KEYWORD2
+sendNikai KEYWORD2
+sendPanasonic KEYWORD2
+sendPanasonic64 KEYWORD2
+sendPanasonicAC KEYWORD2
+sendPioneer KEYWORD2
+sendPronto KEYWORD2
+sendRC5 KEYWORD2
+sendRC6 KEYWORD2
+sendRCMM KEYWORD2
+sendRaw KEYWORD2
+sendSAMSUNG KEYWORD2
+sendSamsungAC KEYWORD2
+sendSanyoLC7461 KEYWORD2
+sendSharp KEYWORD2
+sendSharpRaw KEYWORD2
+sendSherwood KEYWORD2
+sendSony KEYWORD2
+sendToshibaAC KEYWORD2
+sendTrotec KEYWORD2
+sendWhirlpoolAC KEYWORD2
+sendWhynter KEYWORD2
+serialPrintUint64 KEYWORD2
+setBeep KEYWORD2
+setBit KEYWORD2
+setButton KEYWORD2
+setClean KEYWORD2
+setClock KEYWORD2
+setCmd KEYWORD2
+setCommand KEYWORD2
+setCoolMode KEYWORD2
+setCurrTime KEYWORD2
+setCurrentTime KEYWORD2
+setEcono KEYWORD2
+setEye KEYWORD2
+setFan KEYWORD2
+setFanSpeed KEYWORD2
+setFlap KEYWORD2
+setHealth KEYWORD2
+setHeatMode KEYWORD2
+setIonFilter KEYWORD2
+setLed KEYWORD2
+setLight KEYWORD2
+setMax KEYWORD2
+setMode KEYWORD2
+setModel KEYWORD2
+setMold KEYWORD2
+setNight KEYWORD2
+setOffTimer KEYWORD2
+setOnTimer KEYWORD2
+setPower KEYWORD2
+setPowerful KEYWORD2
+setQuiet KEYWORD2
+setRaw KEYWORD2
+setRoomTemp KEYWORD2
+setSensor KEYWORD2
+setSensorTemp KEYWORD2
+setSensorTempRaw KEYWORD2
+setSleep KEYWORD2
+setSpeed KEYWORD2
+setStartClock KEYWORD2
+setStopClock KEYWORD2
+setSwing KEYWORD2
+setSwingHorizontal KEYWORD2
+setSwingVertical KEYWORD2
+setTemp KEYWORD2
+setTempRaw KEYWORD2
+setTime KEYWORD2
+setTimer KEYWORD2
+setTurbo KEYWORD2
+setUnknownThreshold KEYWORD2
+setVane KEYWORD2
+setXFan KEYWORD2
+setZoneFollow KEYWORD2
+setiFeel KEYWORD2
+space KEYWORD2
+stateReset KEYWORD2
+stepHoriz KEYWORD2
+stepVert KEYWORD2
+sumBytes KEYWORD2
+ticksHigh KEYWORD2
+ticksLow KEYWORD2
+timeToString KEYWORD2
+toString KEYWORD2
+toggleRC5 KEYWORD2
+toggleRC6 KEYWORD2
+typeToString KEYWORD2
+uint64ToString KEYWORD2
+validChecksum KEYWORD2
+
+#######################################
+# Constants (LITERAL1)
+#######################################
+
+AIWA_RC_T501 LITERAL1
+AIWA_RC_T501_BITS LITERAL1
+ALLOW_DELAY_CALLS LITERAL1
+ARDB1 LITERAL1
+ARGO LITERAL1
+ARGO_COMMAND_LENGTH LITERAL1
+ARGO_COOL_AUTO LITERAL1
+ARGO_COOL_OFF LITERAL1
+ARGO_COOL_ON LITERAL1
+ARGO_COOl_HUM LITERAL1
+ARGO_FAN_1 LITERAL1
+ARGO_FAN_2 LITERAL1
+ARGO_FAN_3 LITERAL1
+ARGO_FAN_AUTO LITERAL1
+ARGO_FLAP_1 LITERAL1
+ARGO_FLAP_2 LITERAL1
+ARGO_FLAP_3 LITERAL1
+ARGO_FLAP_4 LITERAL1
+ARGO_FLAP_5 LITERAL1
+ARGO_FLAP_6 LITERAL1
+ARGO_FLAP_AUTO LITERAL1
+ARGO_FLAP_FULL LITERAL1
+ARGO_HEAT_AUTO LITERAL1
+ARGO_HEAT_BLINK LITERAL1
+ARGO_HEAT_ON LITERAL1
+ARGO_MAX_TEMP LITERAL1
+ARGO_MIN_TEMP LITERAL1
+ARRAH2E LITERAL1
+CARRIER_AC LITERAL1
+CARRIER_AC_BITS LITERAL1
+COOLIX LITERAL1
+COOLIX_BITS LITERAL1
+DAIKIN LITERAL1
+DAIKIN_AUTO LITERAL1
+DAIKIN_COMMAND_LENGTH LITERAL1
+DAIKIN_COOL LITERAL1
+DAIKIN_DEBUG LITERAL1
+DAIKIN_DRY LITERAL1
+DAIKIN_FAN LITERAL1
+DAIKIN_FAN_AUTO LITERAL1
+DAIKIN_FAN_MAX LITERAL1
+DAIKIN_FAN_MIN LITERAL1
+DAIKIN_FAN_QUIET LITERAL1
+DAIKIN_HEAT LITERAL1
+DAIKIN_MAX_TEMP LITERAL1
+DAIKIN_MIN_TEMP LITERAL1
+DECODE_AC LITERAL1
+DECODE_AIWA_RC_T501 LITERAL1
+DECODE_ARGO LITERAL1
+DECODE_CARRIER_AC LITERAL1
+DECODE_COOLIX LITERAL1
+DECODE_DAIKIN LITERAL1
+DECODE_DENON LITERAL1
+DECODE_DISH LITERAL1
+DECODE_ELECTRA_AC LITERAL1
+DECODE_FUJITSU_AC LITERAL1
+DECODE_GICABLE LITERAL1
+DECODE_GLOBALCACHE LITERAL1
+DECODE_GREE LITERAL1
+DECODE_HAIER_AC LITERAL1
+DECODE_HAIER_AC_YRW02 LITERAL1
+DECODE_HASH LITERAL1
+DECODE_HITACHI_AC LITERAL1
+DECODE_HITACHI_AC1 LITERAL1
+DECODE_HITACHI_AC2 LITERAL1
+DECODE_JVC LITERAL1
+DECODE_KELVINATOR LITERAL1
+DECODE_LASERTAG LITERAL1
+DECODE_LG LITERAL1
+DECODE_LUTRON LITERAL1
+DECODE_MAGIQUEST LITERAL1
+DECODE_MIDEA LITERAL1
+DECODE_MITSUBISHI LITERAL1
+DECODE_MITSUBISHI2 LITERAL1
+DECODE_MITSUBISHI_AC LITERAL1
+DECODE_MWM LITERAL1
+DECODE_NEC LITERAL1
+DECODE_NIKAI LITERAL1
+DECODE_PANASONIC LITERAL1
+DECODE_PANASONIC_AC LITERAL1
+DECODE_PIONEER LITERAL1
+DECODE_PRONTO LITERAL1
+DECODE_RC5 LITERAL1
+DECODE_RC6 LITERAL1
+DECODE_RCMM LITERAL1
+DECODE_SAMSUNG LITERAL1
+DECODE_SAMSUNG_AC LITERAL1
+DECODE_SANYO LITERAL1
+DECODE_SHARP LITERAL1
+DECODE_SHERWOOD LITERAL1
+DECODE_SONY LITERAL1
+DECODE_TOSHIBA_AC LITERAL1
+DECODE_TROTEC LITERAL1
+DECODE_WHIRLPOOL_AC LITERAL1
+DECODE_WHYNTER LITERAL1
+DENON LITERAL1
+DENON_48_BITS LITERAL1
+DENON_BITS LITERAL1
+DENON_LEGACY_BITS LITERAL1
+DISH LITERAL1
+DISH_BITS LITERAL1
+ELECTRA_AC LITERAL1
+FUJITSU_AC LITERAL1
+FUJITSU_AC_BITS LITERAL1
+FUJITSU_AC_CMD_STAY_ON LITERAL1
+FUJITSU_AC_CMD_STEP_HORIZ LITERAL1
+FUJITSU_AC_CMD_STEP_VERT LITERAL1
+FUJITSU_AC_CMD_TURN_OFF LITERAL1
+FUJITSU_AC_CMD_TURN_ON LITERAL1
+FUJITSU_AC_FAN_AUTO LITERAL1
+FUJITSU_AC_FAN_HIGH LITERAL1
+FUJITSU_AC_FAN_LOW LITERAL1
+FUJITSU_AC_FAN_MED LITERAL1
+FUJITSU_AC_FAN_QUIET LITERAL1
+FUJITSU_AC_MAX_TEMP LITERAL1
+FUJITSU_AC_MIN_BITS LITERAL1
+FUJITSU_AC_MIN_REPEAT LITERAL1
+FUJITSU_AC_MIN_TEMP LITERAL1
+FUJITSU_AC_MODE_AUTO LITERAL1
+FUJITSU_AC_MODE_COOL LITERAL1
+FUJITSU_AC_MODE_DRY LITERAL1
+FUJITSU_AC_MODE_FAN LITERAL1
+FUJITSU_AC_MODE_HEAT LITERAL1
+FUJITSU_AC_STATE_LENGTH LITERAL1
+FUJITSU_AC_STATE_LENGTH_SHORT LITERAL1
+FUJITSU_AC_SWING_BOTH LITERAL1
+FUJITSU_AC_SWING_HORIZ LITERAL1
+FUJITSU_AC_SWING_OFF LITERAL1
+FUJITSU_AC_SWING_VERT LITERAL1
+GICABLE LITERAL1
+GICABLE_BITS LITERAL1
+GLOBALCACHE LITERAL1
+GREE LITERAL1
+GREE_AUTO LITERAL1
+GREE_COOL LITERAL1
+GREE_DRY LITERAL1
+GREE_FAN LITERAL1
+GREE_FAN_MAX LITERAL1
+GREE_HEAT LITERAL1
+GREE_MAX_TEMP LITERAL1
+GREE_MIN_TEMP LITERAL1
+GREE_STATE_LENGTH LITERAL1
+GREE_SWING_AUTO LITERAL1
+GREE_SWING_DOWN LITERAL1
+GREE_SWING_DOWN_AUTO LITERAL1
+GREE_SWING_LAST_POS LITERAL1
+GREE_SWING_MIDDLE LITERAL1
+GREE_SWING_MIDDLE_AUTO LITERAL1
+GREE_SWING_MIDDLE_DOWN LITERAL1
+GREE_SWING_MIDDLE_UP LITERAL1
+GREE_SWING_UP LITERAL1
+GREE_SWING_UP_AUTO LITERAL1
+HAIER_AC LITERAL1
+HAIER_AC_AUTO LITERAL1
+HAIER_AC_CMD_FAN LITERAL1
+HAIER_AC_CMD_HEALTH LITERAL1
+HAIER_AC_CMD_MODE LITERAL1
+HAIER_AC_CMD_OFF LITERAL1
+HAIER_AC_CMD_ON LITERAL1
+HAIER_AC_CMD_SLEEP LITERAL1
+HAIER_AC_CMD_SWING LITERAL1
+HAIER_AC_CMD_TEMP_DOWN LITERAL1
+HAIER_AC_CMD_TEMP_UP LITERAL1
+HAIER_AC_CMD_TIMER_CANCEL LITERAL1
+HAIER_AC_CMD_TIMER_SET LITERAL1
+HAIER_AC_COOL LITERAL1
+HAIER_AC_DEF_TEMP LITERAL1
+HAIER_AC_DRY LITERAL1
+HAIER_AC_FAN LITERAL1
+HAIER_AC_FAN_AUTO LITERAL1
+HAIER_AC_FAN_HIGH LITERAL1
+HAIER_AC_FAN_LOW LITERAL1
+HAIER_AC_FAN_MED LITERAL1
+HAIER_AC_HEAT LITERAL1
+HAIER_AC_MAX_TEMP LITERAL1
+HAIER_AC_MIN_TEMP LITERAL1
+HAIER_AC_STATE_LENGTH LITERAL1
+HAIER_AC_SWING_CHG LITERAL1
+HAIER_AC_SWING_DOWN LITERAL1
+HAIER_AC_SWING_OFF LITERAL1
+HAIER_AC_SWING_UP LITERAL1
+HAIER_AC_YRW02 LITERAL1
+HAIER_AC_YRW02_AUTO LITERAL1
+HAIER_AC_YRW02_BUTTON_FAN LITERAL1
+HAIER_AC_YRW02_BUTTON_HEALTH LITERAL1
+HAIER_AC_YRW02_BUTTON_MODE LITERAL1
+HAIER_AC_YRW02_BUTTON_POWER LITERAL1
+HAIER_AC_YRW02_BUTTON_SLEEP LITERAL1
+HAIER_AC_YRW02_BUTTON_SWING LITERAL1
+HAIER_AC_YRW02_BUTTON_TEMP_DOWN LITERAL1
+HAIER_AC_YRW02_BUTTON_TEMP_UP LITERAL1
+HAIER_AC_YRW02_BUTTON_TURBO LITERAL1
+HAIER_AC_YRW02_COOL LITERAL1
+HAIER_AC_YRW02_DRY LITERAL1
+HAIER_AC_YRW02_FAN LITERAL1
+HAIER_AC_YRW02_FAN_AUTO LITERAL1
+HAIER_AC_YRW02_FAN_HIGH LITERAL1
+HAIER_AC_YRW02_FAN_LOW LITERAL1
+HAIER_AC_YRW02_FAN_MED LITERAL1
+HAIER_AC_YRW02_HEAT LITERAL1
+HAIER_AC_YRW02_STATE_LENGTH LITERAL1
+HAIER_AC_YRW02_SWING_AUTO LITERAL1
+HAIER_AC_YRW02_SWING_BOTTOM LITERAL1
+HAIER_AC_YRW02_SWING_DOWN LITERAL1
+HAIER_AC_YRW02_SWING_MIDDLE LITERAL1
+HAIER_AC_YRW02_SWING_OFF LITERAL1
+HAIER_AC_YRW02_SWING_TOP LITERAL1
+HAIER_AC_YRW02_TURBO_HIGH LITERAL1
+HAIER_AC_YRW02_TURBO_LOW LITERAL1
+HAIER_AC_YRW02_TURBO_OFF LITERAL1
+HIGH LITERAL1
+HITACHI_AC LITERAL1
+HITACHI_AC1 LITERAL1
+HITACHI_AC1_BITS LITERAL1
+HITACHI_AC1_STATE_LENGTH LITERAL1
+HITACHI_AC2 LITERAL1
+HITACHI_AC2_BITS LITERAL1
+HITACHI_AC2_STATE_LENGTH LITERAL1
+HITACHI_AC_BITS LITERAL1
+HITACHI_AC_STATE_LENGTH LITERAL1
+ICACHE_RAM_ATTR LITERAL1
+JVC LITERAL1
+JVC_BITS LITERAL1
+KELVINATOR LITERAL1
+KELVINATOR_AUTO LITERAL1
+KELVINATOR_AUTO_TEMP LITERAL1
+KELVINATOR_BASIC_FAN_MAX LITERAL1
+KELVINATOR_COOL LITERAL1
+KELVINATOR_DRY LITERAL1
+KELVINATOR_FAN LITERAL1
+KELVINATOR_FAN_AUTO LITERAL1
+KELVINATOR_FAN_MAX LITERAL1
+KELVINATOR_HEAT LITERAL1
+KELVINATOR_MAX_TEMP LITERAL1
+KELVINATOR_MIN_TEMP LITERAL1
+KELVINATOR_STATE_LENGTH LITERAL1
+LASERTAG LITERAL1
+LASERTAG_BITS LITERAL1
+LG LITERAL1
+LG2 LITERAL1
+LG32_BITS LITERAL1
+LG_BITS LITERAL1
+LOW LITERAL1
+LUTRON LITERAL1
+MAGIQUEST LITERAL1
+MAGIQUEST_BITS LITERAL1
+MIDEA LITERAL1
+MIDEA_AC_AUTO LITERAL1
+MIDEA_AC_COOL LITERAL1
+MIDEA_AC_DRY LITERAL1
+MIDEA_AC_FAN LITERAL1
+MIDEA_AC_FAN_AUTO LITERAL1
+MIDEA_AC_FAN_HI LITERAL1
+MIDEA_AC_FAN_LOW LITERAL1
+MIDEA_AC_FAN_MED LITERAL1
+MIDEA_AC_HEAT LITERAL1
+MIDEA_AC_MAX_TEMP_C LITERAL1
+MIDEA_AC_MAX_TEMP_F LITERAL1
+MIDEA_AC_MIN_TEMP_C LITERAL1
+MIDEA_AC_MIN_TEMP_F LITERAL1
+MIDEA_AC_POWER LITERAL1
+MIDEA_AC_SLEEP LITERAL1
+MIDEA_BITS LITERAL1
+MITSUBISHI LITERAL1
+MITSUBISHI2 LITERAL1
+MITSUBISHI_AC LITERAL1
+MITSUBISHI_AC_AUTO LITERAL1
+MITSUBISHI_AC_COOL LITERAL1
+MITSUBISHI_AC_DRY LITERAL1
+MITSUBISHI_AC_FAN_AUTO LITERAL1
+MITSUBISHI_AC_FAN_MAX LITERAL1
+MITSUBISHI_AC_FAN_REAL_MAX LITERAL1
+MITSUBISHI_AC_FAN_SILENT LITERAL1
+MITSUBISHI_AC_HEAT LITERAL1
+MITSUBISHI_AC_MAX_TEMP LITERAL1
+MITSUBISHI_AC_MIN_TEMP LITERAL1
+MITSUBISHI_AC_POWER LITERAL1
+MITSUBISHI_AC_STATE_LENGTH LITERAL1
+MITSUBISHI_AC_VANE_AUTO LITERAL1
+MITSUBISHI_AC_VANE_AUTO_MOVE LITERAL1
+MITSUBISHI_BITS LITERAL1
+MWM LITERAL1
+NEC LITERAL1
+NEC_BITS LITERAL1
+NEC_LIKE LITERAL1
+NIKAI LITERAL1
+NIKAI_BITS LITERAL1
+ONCE LITERAL1
+PANASONIC LITERAL1
+PANASONIC_AC LITERAL1
+PANASONIC_BITS LITERAL1
+PIONEER LITERAL1
+PRONTO LITERAL1
+RAW LITERAL1
+RAWTICK LITERAL1
+RC5 LITERAL1
+RC5X LITERAL1
+RC5X_BITS LITERAL1
+RC5_BITS LITERAL1
+RC6 LITERAL1
+RC6_36_BITS LITERAL1
+RC6_MODE0_BITS LITERAL1
+RCMM LITERAL1
+RCMM_BITS LITERAL1
+SAMSUNG LITERAL1
+SAMSUNG_AC LITERAL1
+SAMSUNG_BITS LITERAL1
+SANYO LITERAL1
+SANYO_LC7461 LITERAL1
+SANYO_LC7461_BITS LITERAL1
+SANYO_SA8650B_BITS LITERAL1
+SEND_AIWA_RC_T501 LITERAL1
+SEND_ARGO LITERAL1
+SEND_CARRIER_AC LITERAL1
+SEND_COOLIX LITERAL1
+SEND_DAIKIN LITERAL1
+SEND_DENON LITERAL1
+SEND_DISH LITERAL1
+SEND_ELECTRA_AC LITERAL1
+SEND_FUJITSU_AC LITERAL1
+SEND_GICABLE LITERAL1
+SEND_GLOBALCACHE LITERAL1
+SEND_GREE LITERAL1
+SEND_HAIER_AC LITERAL1
+SEND_HAIER_AC_YRW02 LITERAL1
+SEND_HITACHI_AC LITERAL1
+SEND_HITACHI_AC1 LITERAL1
+SEND_HITACHI_AC2 LITERAL1
+SEND_JVC LITERAL1
+SEND_KELVINATOR LITERAL1
+SEND_LASERTAG LITERAL1
+SEND_LG LITERAL1
+SEND_LUTRON LITERAL1
+SEND_MAGIQUEST LITERAL1
+SEND_MIDEA LITERAL1
+SEND_MITSUBISHI LITERAL1
+SEND_MITSUBISHI2 LITERAL1
+SEND_MITSUBISHI_AC LITERAL1
+SEND_MWM LITERAL1
+SEND_NEC LITERAL1
+SEND_NIKAI LITERAL1
+SEND_PANASONIC LITERAL1
+SEND_PANASONIC_AC LITERAL1
+SEND_PIONEER LITERAL1
+SEND_PRONTO LITERAL1
+SEND_RAW LITERAL1
+SEND_RC5 LITERAL1
+SEND_RC6 LITERAL1
+SEND_RCMM LITERAL1
+SEND_SAMSUNG LITERAL1
+SEND_SAMSUNG_AC LITERAL1
+SEND_SANYO LITERAL1
+SEND_SHARP LITERAL1
+SEND_SHERWOOD LITERAL1
+SEND_SONY LITERAL1
+SEND_TOSHIBA_AC LITERAL1
+SEND_TROTEC LITERAL1
+SEND_WHIRLPOOL_AC LITERAL1
+SEND_WHYNTER LITERAL1
+SHARP LITERAL1
+SHARP_BITS LITERAL1
+SHERWOOD LITERAL1
+SHERWOOD_BITS LITERAL1
+SONY LITERAL1
+SONY_12_BITS LITERAL1
+SONY_15_BITS LITERAL1
+SONY_20_BITS LITERAL1
+TIMEOUT_MS LITERAL1
+TOSHIBA_AC LITERAL1
+TOSHIBA_AC_AUTO LITERAL1
+TOSHIBA_AC_COOL LITERAL1
+TOSHIBA_AC_DRY LITERAL1
+TOSHIBA_AC_FAN_AUTO LITERAL1
+TOSHIBA_AC_FAN_MAX LITERAL1
+TOSHIBA_AC_HEAT LITERAL1
+TOSHIBA_AC_MAX_TEMP LITERAL1
+TOSHIBA_AC_MIN_TEMP LITERAL1
+TOSHIBA_AC_POWER LITERAL1
+TOSHIBA_AC_STATE_LENGTH LITERAL1
+TROTEC LITERAL1
+TROTEC_AUTO LITERAL1
+TROTEC_COMMAND_LENGTH LITERAL1
+TROTEC_COOL LITERAL1
+TROTEC_DRY LITERAL1
+TROTEC_FAN LITERAL1
+TROTEC_FAN_HIGH LITERAL1
+TROTEC_FAN_LOW LITERAL1
+TROTEC_FAN_MED LITERAL1
+TROTEC_MAX_TEMP LITERAL1
+TROTEC_MAX_TIMER LITERAL1
+TROTEC_MIN_TEMP LITERAL1
+TROTEC_MIN_TIMER LITERAL1
+UNKNOWN LITERAL1
+UNUSED LITERAL1
+WHIRLPOOL_AC LITERAL1
+WHYNTER LITERAL1
+WHYNTER_BITS LITERAL1
+kAiwaRcT501Bits LITERAL1
+kAiwaRcT501MinRepeats LITERAL1
+kAiwaRcT501PostBits LITERAL1
+kAiwaRcT501PostData LITERAL1
+kAiwaRcT501PreBits LITERAL1
+kAiwaRcT501PreData LITERAL1
+kArgoBitMark LITERAL1
+kArgoCoolAuto LITERAL1
+kArgoCoolHum LITERAL1
+kArgoCoolOff LITERAL1
+kArgoCoolOn LITERAL1
+kArgoFan1 LITERAL1
+kArgoFan2 LITERAL1
+kArgoFan3 LITERAL1
+kArgoFanAuto LITERAL1
+kArgoFlap1 LITERAL1
+kArgoFlap2 LITERAL1
+kArgoFlap3 LITERAL1
+kArgoFlap4 LITERAL1
+kArgoFlap5 LITERAL1
+kArgoFlap6 LITERAL1
+kArgoFlapAuto LITERAL1
+kArgoFlapFull LITERAL1
+kArgoHdrMark LITERAL1
+kArgoHdrSpace LITERAL1
+kArgoHeatAuto LITERAL1
+kArgoHeatBlink LITERAL1
+kArgoHeatOn LITERAL1
+kArgoMaxTemp LITERAL1
+kArgoMinTemp LITERAL1
+kArgoOneSpace LITERAL1
+kArgoStateLength LITERAL1
+kArgoZeroSpace LITERAL1
+kCarrierAcBitMark LITERAL1
+kCarrierAcBits LITERAL1
+kCarrierAcGap LITERAL1
+kCarrierAcHdrMark LITERAL1
+kCarrierAcHdrSpace LITERAL1
+kCarrierAcMinRepeat LITERAL1
+kCarrierAcOneSpace LITERAL1
+kCarrierAcZeroSpace LITERAL1
+kCoolixAuto LITERAL1
+kCoolixBitMark LITERAL1
+kCoolixBitMarkTicks LITERAL1
+kCoolixBits LITERAL1
+kCoolixClean LITERAL1
+kCoolixCool LITERAL1
+kCoolixDefaultState LITERAL1
+kCoolixDry LITERAL1
+kCoolixFan LITERAL1
+kCoolixFanAuto LITERAL1
+kCoolixFanFixed LITERAL1
+kCoolixFanMask LITERAL1
+kCoolixFanMax LITERAL1
+kCoolixFanMed LITERAL1
+kCoolixFanMin LITERAL1
+kCoolixFanTempCode LITERAL1
+kCoolixFanZoneFollow LITERAL1
+kCoolixHdrMark LITERAL1
+kCoolixHdrMarkTicks LITERAL1
+kCoolixHdrSpace LITERAL1
+kCoolixHdrSpaceTicks LITERAL1
+kCoolixHeat LITERAL1
+kCoolixLed LITERAL1
+kCoolixMinGap LITERAL1
+kCoolixMinGapTicks LITERAL1
+kCoolixModeMask LITERAL1
+kCoolixOff LITERAL1
+kCoolixOneSpace LITERAL1
+kCoolixOneSpaceTicks LITERAL1
+kCoolixPrefix LITERAL1
+kCoolixSensorTempIgnoreCode LITERAL1
+kCoolixSensorTempMask LITERAL1
+kCoolixSensorTempMax LITERAL1
+kCoolixSensorTempMin LITERAL1
+kCoolixSleep LITERAL1
+kCoolixSwing LITERAL1
+kCoolixTempMap LITERAL1
+kCoolixTempMask LITERAL1
+kCoolixTempMax LITERAL1
+kCoolixTempMin LITERAL1
+kCoolixTempRange LITERAL1
+kCoolixTick LITERAL1
+kCoolixTurbo LITERAL1
+kCoolixUnknown LITERAL1
+kCoolixZeroSpace LITERAL1
+kCoolixZeroSpaceTicks LITERAL1
+kCoolixZoneFollowMask LITERAL1
+kDaikinAuto LITERAL1
+kDaikinBitEcono LITERAL1
+kDaikinBitEye LITERAL1
+kDaikinBitMark LITERAL1
+kDaikinBitMold LITERAL1
+kDaikinBitOffTimer LITERAL1
+kDaikinBitOnTimer LITERAL1
+kDaikinBitPower LITERAL1
+kDaikinBitPowerful LITERAL1
+kDaikinBitSensor LITERAL1
+kDaikinBitSilent LITERAL1
+kDaikinBits LITERAL1
+kDaikinByteEcono LITERAL1
+kDaikinByteEye LITERAL1
+kDaikinByteMold LITERAL1
+kDaikinByteOffTimer LITERAL1
+kDaikinByteOnTimer LITERAL1
+kDaikinBytePower LITERAL1
+kDaikinBytePowerful LITERAL1
+kDaikinByteSensor LITERAL1
+kDaikinByteSilent LITERAL1
+kDaikinCool LITERAL1
+kDaikinCurBit LITERAL1
+kDaikinCurIndex LITERAL1
+kDaikinDry LITERAL1
+kDaikinFan LITERAL1
+kDaikinFanAuto LITERAL1
+kDaikinFanMax LITERAL1
+kDaikinFanMin LITERAL1
+kDaikinFanQuiet LITERAL1
+kDaikinFirstHeader64 LITERAL1
+kDaikinGap LITERAL1
+kDaikinHdrMark LITERAL1
+kDaikinHdrSpace LITERAL1
+kDaikinHeat LITERAL1
+kDaikinMarkExcess LITERAL1
+kDaikinMaxTemp LITERAL1
+kDaikinMinTemp LITERAL1
+kDaikinOneSpace LITERAL1
+kDaikinRawBits LITERAL1
+kDaikinStateLength LITERAL1
+kDaikinTolerance LITERAL1
+kDaikinZeroSpace LITERAL1
+kDenonBitMark LITERAL1
+kDenonBitMarkTicks LITERAL1
+kDenonBits LITERAL1
+kDenonHdrMark LITERAL1
+kDenonHdrMarkTicks LITERAL1
+kDenonHdrSpace LITERAL1
+kDenonHdrSpaceTicks LITERAL1
+kDenonLegacyBits LITERAL1
+kDenonManufacturer LITERAL1
+kDenonMinCommandLengthTicks LITERAL1
+kDenonMinGap LITERAL1
+kDenonMinGapTicks LITERAL1
+kDenonOneSpace LITERAL1
+kDenonOneSpaceTicks LITERAL1
+kDenonTick LITERAL1
+kDenonZeroSpace LITERAL1
+kDenonZeroSpaceTicks LITERAL1
+kDishBitMark LITERAL1
+kDishBitMarkTicks LITERAL1
+kDishBits LITERAL1
+kDishHdrMark LITERAL1
+kDishHdrMarkTicks LITERAL1
+kDishHdrSpace LITERAL1
+kDishHdrSpaceTicks LITERAL1
+kDishMinRepeat LITERAL1
+kDishOneSpace LITERAL1
+kDishOneSpaceTicks LITERAL1
+kDishRptSpace LITERAL1
+kDishRptSpaceTicks LITERAL1
+kDishTick LITERAL1
+kDishZeroSpace LITERAL1
+kDishZeroSpaceTicks LITERAL1
+kDutyDefault LITERAL1
+kDutyMax LITERAL1
+kElectraAcBitMark LITERAL1
+kElectraAcBits LITERAL1
+kElectraAcHdrMark LITERAL1
+kElectraAcHdrSpace LITERAL1
+kElectraAcMessageGap LITERAL1
+kElectraAcOneSpace LITERAL1
+kElectraAcStateLength LITERAL1
+kElectraAcZeroSpace LITERAL1
+kFnvBasis32 LITERAL1
+kFnvPrime32 LITERAL1
+kFooter LITERAL1
+kFujitsuAcBitMark LITERAL1
+kFujitsuAcBits LITERAL1
+kFujitsuAcCmdStayOn LITERAL1
+kFujitsuAcCmdStepHoriz LITERAL1
+kFujitsuAcCmdStepVert LITERAL1
+kFujitsuAcCmdTurnOff LITERAL1
+kFujitsuAcCmdTurnOn LITERAL1
+kFujitsuAcFanAuto LITERAL1
+kFujitsuAcFanHigh LITERAL1
+kFujitsuAcFanLow LITERAL1
+kFujitsuAcFanMed LITERAL1
+kFujitsuAcFanQuiet LITERAL1
+kFujitsuAcHdrMark LITERAL1
+kFujitsuAcHdrSpace LITERAL1
+kFujitsuAcMaxTemp LITERAL1
+kFujitsuAcMinBits LITERAL1
+kFujitsuAcMinGap LITERAL1
+kFujitsuAcMinRepeat LITERAL1
+kFujitsuAcMinTemp LITERAL1
+kFujitsuAcModeAuto LITERAL1
+kFujitsuAcModeCool LITERAL1
+kFujitsuAcModeDry LITERAL1
+kFujitsuAcModeFan LITERAL1
+kFujitsuAcModeHeat LITERAL1
+kFujitsuAcOneSpace LITERAL1
+kFujitsuAcStateLength LITERAL1
+kFujitsuAcStateLengthShort LITERAL1
+kFujitsuAcSwingBoth LITERAL1
+kFujitsuAcSwingHoriz LITERAL1
+kFujitsuAcSwingOff LITERAL1
+kFujitsuAcSwingVert LITERAL1
+kFujitsuAcZeroSpace LITERAL1
+kGicableBitMark LITERAL1
+kGicableBits LITERAL1
+kGicableHdrMark LITERAL1
+kGicableHdrSpace LITERAL1
+kGicableMinCommandLength LITERAL1
+kGicableMinGap LITERAL1
+kGicableMinRepeat LITERAL1
+kGicableOneSpace LITERAL1
+kGicableRptSpace LITERAL1
+kGicableZeroSpace LITERAL1
+kGlobalCacheFreqIndex LITERAL1
+kGlobalCacheMaxRepeat LITERAL1
+kGlobalCacheMinUsec LITERAL1
+kGlobalCacheRptIndex LITERAL1
+kGlobalCacheRptStartIndex LITERAL1
+kGlobalCacheStartIndex LITERAL1
+kGreeAuto LITERAL1
+kGreeBitMark LITERAL1
+kGreeBits LITERAL1
+kGreeBlockFooter LITERAL1
+kGreeBlockFooterBits LITERAL1
+kGreeCool LITERAL1
+kGreeDry LITERAL1
+kGreeFan LITERAL1
+kGreeFanMask LITERAL1
+kGreeFanMax LITERAL1
+kGreeHdrMark LITERAL1
+kGreeHdrSpace LITERAL1
+kGreeHeat LITERAL1
+kGreeLightMask LITERAL1
+kGreeMaxTemp LITERAL1
+kGreeMinTemp LITERAL1
+kGreeModeMask LITERAL1
+kGreeMsgSpace LITERAL1
+kGreeOneSpace LITERAL1
+kGreePower1Mask LITERAL1
+kGreePower2Mask LITERAL1
+kGreeSleepMask LITERAL1
+kGreeStateLength LITERAL1
+kGreeSwingAuto LITERAL1
+kGreeSwingAutoMask LITERAL1
+kGreeSwingDown LITERAL1
+kGreeSwingDownAuto LITERAL1
+kGreeSwingLastPos LITERAL1
+kGreeSwingMiddle LITERAL1
+kGreeSwingMiddleAuto LITERAL1
+kGreeSwingMiddleDown LITERAL1
+kGreeSwingMiddleUp LITERAL1
+kGreeSwingPosMask LITERAL1
+kGreeSwingUp LITERAL1
+kGreeSwingUpAuto LITERAL1
+kGreeTurboMask LITERAL1
+kGreeXfanMask LITERAL1
+kGreeZeroSpace LITERAL1
+kHaierACBits LITERAL1
+kHaierACStateLength LITERAL1
+kHaierACYRW02Bits LITERAL1
+kHaierACYRW02StateLength LITERAL1
+kHaierAcAuto LITERAL1
+kHaierAcBitMark LITERAL1
+kHaierAcCmdFan LITERAL1
+kHaierAcCmdHealth LITERAL1
+kHaierAcCmdMode LITERAL1
+kHaierAcCmdOff LITERAL1
+kHaierAcCmdOn LITERAL1
+kHaierAcCmdSleep LITERAL1
+kHaierAcCmdSwing LITERAL1
+kHaierAcCmdTempDown LITERAL1
+kHaierAcCmdTempUp LITERAL1
+kHaierAcCmdTimerCancel LITERAL1
+kHaierAcCmdTimerSet LITERAL1
+kHaierAcCool LITERAL1
+kHaierAcDefTemp LITERAL1
+kHaierAcDry LITERAL1
+kHaierAcFan LITERAL1
+kHaierAcFanAuto LITERAL1
+kHaierAcFanHigh LITERAL1
+kHaierAcFanLow LITERAL1
+kHaierAcFanMed LITERAL1
+kHaierAcHdr LITERAL1
+kHaierAcHdrGap LITERAL1
+kHaierAcHeat LITERAL1
+kHaierAcMaxTemp LITERAL1
+kHaierAcMaxTime LITERAL1
+kHaierAcMinGap LITERAL1
+kHaierAcMinTemp LITERAL1
+kHaierAcOneSpace LITERAL1
+kHaierAcPrefix LITERAL1
+kHaierAcSwingChg LITERAL1
+kHaierAcSwingDown LITERAL1
+kHaierAcSwingOff LITERAL1
+kHaierAcSwingUp LITERAL1
+kHaierAcYrw02Auto LITERAL1
+kHaierAcYrw02ButtonFan LITERAL1
+kHaierAcYrw02ButtonHealth LITERAL1
+kHaierAcYrw02ButtonMode LITERAL1
+kHaierAcYrw02ButtonPower LITERAL1
+kHaierAcYrw02ButtonSleep LITERAL1
+kHaierAcYrw02ButtonSwing LITERAL1
+kHaierAcYrw02ButtonTempDown LITERAL1
+kHaierAcYrw02ButtonTempUp LITERAL1
+kHaierAcYrw02ButtonTurbo LITERAL1
+kHaierAcYrw02Cool LITERAL1
+kHaierAcYrw02Dry LITERAL1
+kHaierAcYrw02Fan LITERAL1
+kHaierAcYrw02FanAuto LITERAL1
+kHaierAcYrw02FanHigh LITERAL1
+kHaierAcYrw02FanLow LITERAL1
+kHaierAcYrw02FanMed LITERAL1
+kHaierAcYrw02Heat LITERAL1
+kHaierAcYrw02Power LITERAL1
+kHaierAcYrw02Prefix LITERAL1
+kHaierAcYrw02Sleep LITERAL1
+kHaierAcYrw02SwingAuto LITERAL1
+kHaierAcYrw02SwingBottom LITERAL1
+kHaierAcYrw02SwingDown LITERAL1
+kHaierAcYrw02SwingMiddle LITERAL1
+kHaierAcYrw02SwingOff LITERAL1
+kHaierAcYrw02SwingTop LITERAL1
+kHaierAcYrw02TurboHigh LITERAL1
+kHaierAcYrw02TurboLow LITERAL1
+kHaierAcYrw02TurboOff LITERAL1
+kHaierAcZeroSpace LITERAL1
+kHeader LITERAL1
+kHitachiAc1Bits LITERAL1
+kHitachiAc1HdrMark LITERAL1
+kHitachiAc1HdrSpace LITERAL1
+kHitachiAc1StateLength LITERAL1
+kHitachiAc2Bits LITERAL1
+kHitachiAc2StateLength LITERAL1
+kHitachiAcBitMark LITERAL1
+kHitachiAcBits LITERAL1
+kHitachiAcHdrMark LITERAL1
+kHitachiAcHdrSpace LITERAL1
+kHitachiAcMinGap LITERAL1
+kHitachiAcOneSpace LITERAL1
+kHitachiAcStateLength LITERAL1
+kHitachiAcZeroSpace LITERAL1
+kIdleState LITERAL1
+kJvcBitMark LITERAL1
+kJvcBitMarkTicks LITERAL1
+kJvcBits LITERAL1
+kJvcHdrMark LITERAL1
+kJvcHdrMarkTicks LITERAL1
+kJvcHdrSpace LITERAL1
+kJvcHdrSpaceTicks LITERAL1
+kJvcMinGap LITERAL1
+kJvcMinGapTicks LITERAL1
+kJvcOneSpace LITERAL1
+kJvcOneSpaceTicks LITERAL1
+kJvcRptLength LITERAL1
+kJvcRptLengthTicks LITERAL1
+kJvcTick LITERAL1
+kJvcZeroSpace LITERAL1
+kJvcZeroSpaceTicks LITERAL1
+kKelvinatorAuto LITERAL1
+kKelvinatorAutoTemp LITERAL1
+kKelvinatorBasicFanMask LITERAL1
+kKelvinatorBasicFanMax LITERAL1
+kKelvinatorBitMark LITERAL1
+kKelvinatorBitMarkTicks LITERAL1
+kKelvinatorBits LITERAL1
+kKelvinatorChecksumStart LITERAL1
+kKelvinatorCmdFooter LITERAL1
+kKelvinatorCmdFooterBits LITERAL1
+kKelvinatorCool LITERAL1
+kKelvinatorDry LITERAL1
+kKelvinatorFan LITERAL1
+kKelvinatorFanAuto LITERAL1
+kKelvinatorFanMask LITERAL1
+kKelvinatorFanMax LITERAL1
+kKelvinatorFanOffset LITERAL1
+kKelvinatorGapSpace LITERAL1
+kKelvinatorGapSpaceTicks LITERAL1
+kKelvinatorHdrMark LITERAL1
+kKelvinatorHdrMarkTicks LITERAL1
+kKelvinatorHdrSpace LITERAL1
+kKelvinatorHdrSpaceTicks LITERAL1
+kKelvinatorHeat LITERAL1
+kKelvinatorIonFilter LITERAL1
+kKelvinatorIonFilterOffset LITERAL1
+kKelvinatorLight LITERAL1
+kKelvinatorLightOffset LITERAL1
+kKelvinatorMaxTemp LITERAL1
+kKelvinatorMinTemp LITERAL1
+kKelvinatorModeMask LITERAL1
+kKelvinatorOneSpace LITERAL1
+kKelvinatorOneSpaceTicks LITERAL1
+kKelvinatorPower LITERAL1
+kKelvinatorQuiet LITERAL1
+kKelvinatorQuietOffset LITERAL1
+kKelvinatorSleep1And3 LITERAL1
+kKelvinatorStateLength LITERAL1
+kKelvinatorTick LITERAL1
+kKelvinatorTurbo LITERAL1
+kKelvinatorTurboOffset LITERAL1
+kKelvinatorVentSwing LITERAL1
+kKelvinatorVentSwingH LITERAL1
+kKelvinatorVentSwingOffset LITERAL1
+kKelvinatorVentSwingV LITERAL1
+kKelvinatorXfan LITERAL1
+kKelvinatorXfanOffset LITERAL1
+kKelvinatorZeroSpace LITERAL1
+kKelvinatorZeroSpaceTicks LITERAL1
+kLasertagBits LITERAL1
+kLasertagDelta LITERAL1
+kLasertagExcess LITERAL1
+kLasertagMinGap LITERAL1
+kLasertagMinRepeat LITERAL1
+kLasertagMinSamples LITERAL1
+kLasertagTick LITERAL1
+kLasertagTolerance LITERAL1
+kLg2BitMark LITERAL1
+kLg2BitMarkTicks LITERAL1
+kLg2HdrMark LITERAL1
+kLg2HdrMarkTicks LITERAL1
+kLg2HdrSpace LITERAL1
+kLg2HdrSpaceTicks LITERAL1
+kLg32Bits LITERAL1
+kLg32HdrMark LITERAL1
+kLg32HdrMarkTicks LITERAL1
+kLg32HdrSpace LITERAL1
+kLg32HdrSpaceTicks LITERAL1
+kLg32RptHdrMark LITERAL1
+kLg32RptHdrMarkTicks LITERAL1
+kLgBitMark LITERAL1
+kLgBitMarkTicks LITERAL1
+kLgBits LITERAL1
+kLgHdrMark LITERAL1
+kLgHdrMarkTicks LITERAL1
+kLgHdrSpace LITERAL1
+kLgHdrSpaceTicks LITERAL1
+kLgMinGap LITERAL1
+kLgMinGapTicks LITERAL1
+kLgMinMessageLength LITERAL1
+kLgMinMessageLengthTicks LITERAL1
+kLgOneSpace LITERAL1
+kLgOneSpaceTicks LITERAL1
+kLgRptSpace LITERAL1
+kLgRptSpaceTicks LITERAL1
+kLgTick LITERAL1
+kLgZeroSpace LITERAL1
+kLgZeroSpaceTicks LITERAL1
+kLutronBits LITERAL1
+kLutronDelta LITERAL1
+kLutronGap LITERAL1
+kLutronTick LITERAL1
+kMWMDelta LITERAL1
+kMWMExcess LITERAL1
+kMWMMaxWidth LITERAL1
+kMWMMinGap LITERAL1
+kMWMMinSamples LITERAL1
+kMWMTick LITERAL1
+kMWMTolerance LITERAL1
+kMagiQuestGap LITERAL1
+kMagiQuestMarkOne LITERAL1
+kMagiQuestMarkZero LITERAL1
+kMagiQuestOneRatio LITERAL1
+kMagiQuestSpaceOne LITERAL1
+kMagiQuestSpaceZero LITERAL1
+kMagiQuestTotalUsec LITERAL1
+kMagiQuestZeroRatio LITERAL1
+kMagiquestBits LITERAL1
+kMark LITERAL1
+kMarkExcess LITERAL1
+kMarkState LITERAL1
+kMaxAccurateUsecDelay LITERAL1
+kMaxTimeoutMs LITERAL1
+kMideaACAuto LITERAL1
+kMideaACChecksumMask LITERAL1
+kMideaACCool LITERAL1
+kMideaACDry LITERAL1
+kMideaACFan LITERAL1
+kMideaACFanAuto LITERAL1
+kMideaACFanHigh LITERAL1
+kMideaACFanLow LITERAL1
+kMideaACFanMask LITERAL1
+kMideaACFanMed LITERAL1
+kMideaACHeat LITERAL1
+kMideaACMaxTempC LITERAL1
+kMideaACMaxTempF LITERAL1
+kMideaACMinTempC LITERAL1
+kMideaACMinTempF LITERAL1
+kMideaACModeMask LITERAL1
+kMideaACPower LITERAL1
+kMideaACSleep LITERAL1
+kMideaACStateMask LITERAL1
+kMideaACTempMask LITERAL1
+kMideaBitMark LITERAL1
+kMideaBitMarkTicks LITERAL1
+kMideaBits LITERAL1
+kMideaHdrMark LITERAL1
+kMideaHdrMarkTicks LITERAL1
+kMideaHdrSpace LITERAL1
+kMideaHdrSpaceTicks LITERAL1
+kMideaMinGap LITERAL1
+kMideaMinGapTicks LITERAL1
+kMideaMinRepeat LITERAL1
+kMideaOneSpace LITERAL1
+kMideaOneSpaceTicks LITERAL1
+kMideaTick LITERAL1
+kMideaTolerance LITERAL1
+kMideaZeroSpace LITERAL1
+kMideaZeroSpaceTicks LITERAL1
+kMitsubishi2BitMark LITERAL1
+kMitsubishi2HdrMark LITERAL1
+kMitsubishi2HdrSpace LITERAL1
+kMitsubishi2MinGap LITERAL1
+kMitsubishi2OneSpace LITERAL1
+kMitsubishi2ZeroSpace LITERAL1
+kMitsubishiACBits LITERAL1
+kMitsubishiACMinRepeat LITERAL1
+kMitsubishiACStateLength LITERAL1
+kMitsubishiAcAuto LITERAL1
+kMitsubishiAcBitMark LITERAL1
+kMitsubishiAcCool LITERAL1
+kMitsubishiAcDry LITERAL1
+kMitsubishiAcFanAuto LITERAL1
+kMitsubishiAcFanMax LITERAL1
+kMitsubishiAcFanRealMax LITERAL1
+kMitsubishiAcFanSilent LITERAL1
+kMitsubishiAcHdrMark LITERAL1
+kMitsubishiAcHdrSpace LITERAL1
+kMitsubishiAcHeat LITERAL1
+kMitsubishiAcMaxTemp LITERAL1
+kMitsubishiAcMinTemp LITERAL1
+kMitsubishiAcNoTimer LITERAL1
+kMitsubishiAcOneSpace LITERAL1
+kMitsubishiAcPower LITERAL1
+kMitsubishiAcRptMark LITERAL1
+kMitsubishiAcRptSpace LITERAL1
+kMitsubishiAcStartStopTimer LITERAL1
+kMitsubishiAcStartTimer LITERAL1
+kMitsubishiAcStopTimer LITERAL1
+kMitsubishiAcVaneAuto LITERAL1
+kMitsubishiAcVaneAutoMove LITERAL1
+kMitsubishiAcZeroSpace LITERAL1
+kMitsubishiBitMark LITERAL1
+kMitsubishiBitMarkTicks LITERAL1
+kMitsubishiBits LITERAL1
+kMitsubishiMinCommandLength LITERAL1
+kMitsubishiMinCommandLengthTicks LITERAL1
+kMitsubishiMinGap LITERAL1
+kMitsubishiMinGapTicks LITERAL1
+kMitsubishiMinRepeat LITERAL1
+kMitsubishiOneSpace LITERAL1
+kMitsubishiOneSpaceTicks LITERAL1
+kMitsubishiTick LITERAL1
+kMitsubishiZeroSpace LITERAL1
+kMitsubishiZeroSpaceTicks LITERAL1
+kNECBits LITERAL1
+kNecBitMark LITERAL1
+kNecBitMarkTicks LITERAL1
+kNecHdrMark LITERAL1
+kNecHdrMarkTicks LITERAL1
+kNecHdrSpace LITERAL1
+kNecHdrSpaceTicks LITERAL1
+kNecMinCommandLength LITERAL1
+kNecMinCommandLengthTicks LITERAL1
+kNecMinGap LITERAL1
+kNecMinGapTicks LITERAL1
+kNecOneSpace LITERAL1
+kNecOneSpaceTicks LITERAL1
+kNecRptLength LITERAL1
+kNecRptSpace LITERAL1
+kNecRptSpaceTicks LITERAL1
+kNecTick LITERAL1
+kNecZeroSpace LITERAL1
+kNecZeroSpaceTicks LITERAL1
+kNikaiBitMark LITERAL1
+kNikaiBitMarkTicks LITERAL1
+kNikaiBits LITERAL1
+kNikaiHdrMark LITERAL1
+kNikaiHdrMarkTicks LITERAL1
+kNikaiHdrSpace LITERAL1
+kNikaiHdrSpaceTicks LITERAL1
+kNikaiMinGap LITERAL1
+kNikaiMinGapTicks LITERAL1
+kNikaiOneSpace LITERAL1
+kNikaiOneSpaceTicks LITERAL1
+kNikaiTick LITERAL1
+kNikaiZeroSpace LITERAL1
+kNikaiZeroSpaceTicks LITERAL1
+kNoRepeat LITERAL1
+kPanasonicAcAuto LITERAL1
+kPanasonicAcBits LITERAL1
+kPanasonicAcChecksumInit LITERAL1
+kPanasonicAcCool LITERAL1
+kPanasonicAcDry LITERAL1
+kPanasonicAcExcess LITERAL1
+kPanasonicAcFan LITERAL1
+kPanasonicAcFanAuto LITERAL1
+kPanasonicAcFanMax LITERAL1
+kPanasonicAcFanMin LITERAL1
+kPanasonicAcFanModeTemp LITERAL1
+kPanasonicAcFanOffset LITERAL1
+kPanasonicAcHeat LITERAL1
+kPanasonicAcMaxTemp LITERAL1
+kPanasonicAcMessageGap LITERAL1
+kPanasonicAcMinTemp LITERAL1
+kPanasonicAcOffTimer LITERAL1
+kPanasonicAcOnTimer LITERAL1
+kPanasonicAcPower LITERAL1
+kPanasonicAcPowerful LITERAL1
+kPanasonicAcPowerfulCkp LITERAL1
+kPanasonicAcQuiet LITERAL1
+kPanasonicAcQuietCkp LITERAL1
+kPanasonicAcSection1Length LITERAL1
+kPanasonicAcSectionGap LITERAL1
+kPanasonicAcShortBits LITERAL1
+kPanasonicAcStateLength LITERAL1
+kPanasonicAcStateShortLength LITERAL1
+kPanasonicAcSwingHAuto LITERAL1
+kPanasonicAcSwingHFullLeft LITERAL1
+kPanasonicAcSwingHFullRight LITERAL1
+kPanasonicAcSwingHLeft LITERAL1
+kPanasonicAcSwingHMiddle LITERAL1
+kPanasonicAcSwingHRight LITERAL1
+kPanasonicAcSwingVAuto LITERAL1
+kPanasonicAcSwingVDown LITERAL1
+kPanasonicAcSwingVUp LITERAL1
+kPanasonicAcTimeMax LITERAL1
+kPanasonicAcTimeSpecial LITERAL1
+kPanasonicAcTolerance LITERAL1
+kPanasonicBitMark LITERAL1
+kPanasonicBitMarkTicks LITERAL1
+kPanasonicBits LITERAL1
+kPanasonicCkp LITERAL1
+kPanasonicDke LITERAL1
+kPanasonicEndGap LITERAL1
+kPanasonicFreq LITERAL1
+kPanasonicHdrMark LITERAL1
+kPanasonicHdrMarkTicks LITERAL1
+kPanasonicHdrSpace LITERAL1
+kPanasonicHdrSpaceTicks LITERAL1
+kPanasonicJke LITERAL1
+kPanasonicKnownGoodState LITERAL1
+kPanasonicLke LITERAL1
+kPanasonicManufacturer LITERAL1
+kPanasonicMinCommandLength LITERAL1
+kPanasonicMinCommandLengthTicks LITERAL1
+kPanasonicMinGap LITERAL1
+kPanasonicMinGapTicks LITERAL1
+kPanasonicNke LITERAL1
+kPanasonicOneSpace LITERAL1
+kPanasonicOneSpaceTicks LITERAL1
+kPanasonicTick LITERAL1
+kPanasonicUnknown LITERAL1
+kPanasonicZeroSpace LITERAL1
+kPanasonicZeroSpaceTicks LITERAL1
+kPeriodOffset LITERAL1
+kPioneerBits LITERAL1
+kProntoDataOffset LITERAL1
+kProntoFreqFactor LITERAL1
+kProntoFreqOffset LITERAL1
+kProntoMinLength LITERAL1
+kProntoSeq1LenOffset LITERAL1
+kProntoSeq2LenOffset LITERAL1
+kProntoTypeOffset LITERAL1
+kRC5Bits LITERAL1
+kRC5RawBits LITERAL1
+kRC5XBits LITERAL1
+kRC6Mode0Bits LITERAL1
+kRC6_36Bits LITERAL1
+kRCMMBits LITERAL1
+kRawBuf LITERAL1
+kRawTick LITERAL1
+kRc5MinCommandLength LITERAL1
+kRc5MinGap LITERAL1
+kRc5SamplesMin LITERAL1
+kRc5T1 LITERAL1
+kRc5ToggleMask LITERAL1
+kRc6HdrMark LITERAL1
+kRc6HdrMarkTicks LITERAL1
+kRc6HdrSpace LITERAL1
+kRc6HdrSpaceTicks LITERAL1
+kRc6RptLength LITERAL1
+kRc6RptLengthTicks LITERAL1
+kRc6Tick LITERAL1
+kRc6ToggleMask LITERAL1
+kRc6_36ToggleMask LITERAL1
+kRcmmBitMark LITERAL1
+kRcmmBitMarkTicks LITERAL1
+kRcmmBitSpace0 LITERAL1
+kRcmmBitSpace0Ticks LITERAL1
+kRcmmBitSpace1 LITERAL1
+kRcmmBitSpace1Ticks LITERAL1
+kRcmmBitSpace2 LITERAL1
+kRcmmBitSpace2Ticks LITERAL1
+kRcmmBitSpace3 LITERAL1
+kRcmmBitSpace3Ticks LITERAL1
+kRcmmExcess LITERAL1
+kRcmmHdrMark LITERAL1
+kRcmmHdrMarkTicks LITERAL1
+kRcmmHdrSpace LITERAL1
+kRcmmHdrSpaceTicks LITERAL1
+kRcmmMinGap LITERAL1
+kRcmmMinGapTicks LITERAL1
+kRcmmRptLength LITERAL1
+kRcmmRptLengthTicks LITERAL1
+kRcmmTick LITERAL1
+kRcmmTolerance LITERAL1
+kRepeat LITERAL1
+kSamsungACSectionLength LITERAL1
+kSamsungAcAuto LITERAL1
+kSamsungAcAutoTemp LITERAL1
+kSamsungAcBeepMask LITERAL1
+kSamsungAcBitMark LITERAL1
+kSamsungAcBits LITERAL1
+kSamsungAcCleanMask10 LITERAL1
+kSamsungAcCleanMask11 LITERAL1
+kSamsungAcCool LITERAL1
+kSamsungAcDry LITERAL1
+kSamsungAcExtendedBits LITERAL1
+kSamsungAcExtendedStateLength LITERAL1
+kSamsungAcFan LITERAL1
+kSamsungAcFanAuto LITERAL1
+kSamsungAcFanAuto2 LITERAL1
+kSamsungAcFanHigh LITERAL1
+kSamsungAcFanLow LITERAL1
+kSamsungAcFanMask LITERAL1
+kSamsungAcFanMed LITERAL1
+kSamsungAcFanTurbo LITERAL1
+kSamsungAcHdrMark LITERAL1
+kSamsungAcHdrSpace LITERAL1
+kSamsungAcHeat LITERAL1
+kSamsungAcMaxTemp LITERAL1
+kSamsungAcMinTemp LITERAL1
+kSamsungAcModeMask LITERAL1
+kSamsungAcOneSpace LITERAL1
+kSamsungAcPowerMask1 LITERAL1
+kSamsungAcPowerMask2 LITERAL1
+kSamsungAcPowerSection LITERAL1
+kSamsungAcQuietMask11 LITERAL1
+kSamsungAcSectionGap LITERAL1
+kSamsungAcSectionMark LITERAL1
+kSamsungAcSectionSpace LITERAL1
+kSamsungAcSections LITERAL1
+kSamsungAcStateLength LITERAL1
+kSamsungAcSwingMask LITERAL1
+kSamsungAcSwingMove LITERAL1
+kSamsungAcSwingStop LITERAL1
+kSamsungAcTempMask LITERAL1
+kSamsungAcZeroSpace LITERAL1
+kSamsungBitMark LITERAL1
+kSamsungBitMarkTicks LITERAL1
+kSamsungBits LITERAL1
+kSamsungHdrMark LITERAL1
+kSamsungHdrMarkTicks LITERAL1
+kSamsungHdrSpace LITERAL1
+kSamsungHdrSpaceTicks LITERAL1
+kSamsungMinGap LITERAL1
+kSamsungMinGapTicks LITERAL1
+kSamsungMinMessageLength LITERAL1
+kSamsungMinMessageLengthTicks LITERAL1
+kSamsungOneSpace LITERAL1
+kSamsungOneSpaceTicks LITERAL1
+kSamsungRptSpace LITERAL1
+kSamsungRptSpaceTicks LITERAL1
+kSamsungTick LITERAL1
+kSamsungZeroSpace LITERAL1
+kSamsungZeroSpaceTicks LITERAL1
+kSanyoLC7461AddressBits LITERAL1
+kSanyoLC7461Bits LITERAL1
+kSanyoLC7461CommandBits LITERAL1
+kSanyoLc7461AddressMask LITERAL1
+kSanyoLc7461BitMark LITERAL1
+kSanyoLc7461CommandMask LITERAL1
+kSanyoLc7461HdrMark LITERAL1
+kSanyoLc7461HdrSpace LITERAL1
+kSanyoLc7461MinCommandLength LITERAL1
+kSanyoLc7461MinGap LITERAL1
+kSanyoLc7461OneSpace LITERAL1
+kSanyoLc7461ZeroSpace LITERAL1
+kSanyoSA8650BBits LITERAL1
+kSanyoSa8650bDoubleSpaceUsecs LITERAL1
+kSanyoSa8650bHdrMark LITERAL1
+kSanyoSa8650bHdrSpace LITERAL1
+kSanyoSa8650bOneMark LITERAL1
+kSanyoSa8650bRptLength LITERAL1
+kSanyoSa8650bZeroMark LITERAL1
+kSharpAddressBits LITERAL1
+kSharpAddressMask LITERAL1
+kSharpBitMark LITERAL1
+kSharpBitMarkTicks LITERAL1
+kSharpBits LITERAL1
+kSharpCommandBits LITERAL1
+kSharpCommandMask LITERAL1
+kSharpGap LITERAL1
+kSharpGapTicks LITERAL1
+kSharpOneSpace LITERAL1
+kSharpOneSpaceTicks LITERAL1
+kSharpTick LITERAL1
+kSharpToggleMask LITERAL1
+kSharpZeroSpace LITERAL1
+kSharpZeroSpaceTicks LITERAL1
+kSherwoodBits LITERAL1
+kSherwoodMinRepeat LITERAL1
+kSingleRepeat LITERAL1
+kSony12Bits LITERAL1
+kSony15Bits LITERAL1
+kSony20Bits LITERAL1
+kSonyHdrMark LITERAL1
+kSonyHdrMarkTicks LITERAL1
+kSonyMinBits LITERAL1
+kSonyMinGap LITERAL1
+kSonyMinGapTicks LITERAL1
+kSonyMinRepeat LITERAL1
+kSonyOneMark LITERAL1
+kSonyOneMarkTicks LITERAL1
+kSonyRptLength LITERAL1
+kSonyRptLengthTicks LITERAL1
+kSonySpace LITERAL1
+kSonySpaceTicks LITERAL1
+kSonyTick LITERAL1
+kSonyZeroMark LITERAL1
+kSonyZeroMarkTicks LITERAL1
+kSpace LITERAL1
+kSpaceState LITERAL1
+kStartOffset LITERAL1
+kStateSizeMax LITERAL1
+kStopState LITERAL1
+kTimeoutMs LITERAL1
+kTolerance LITERAL1
+kToshibaACBits LITERAL1
+kToshibaACMinRepeat LITERAL1
+kToshibaACStateLength LITERAL1
+kToshibaAcAuto LITERAL1
+kToshibaAcBitMark LITERAL1
+kToshibaAcCool LITERAL1
+kToshibaAcDry LITERAL1
+kToshibaAcFanAuto LITERAL1
+kToshibaAcFanMax LITERAL1
+kToshibaAcHdrMark LITERAL1
+kToshibaAcHdrSpace LITERAL1
+kToshibaAcHeat LITERAL1
+kToshibaAcMaxTemp LITERAL1
+kToshibaAcMinGap LITERAL1
+kToshibaAcMinTemp LITERAL1
+kToshibaAcOneSpace LITERAL1
+kToshibaAcPower LITERAL1
+kToshibaAcZeroSpace LITERAL1
+kTrotecAuto LITERAL1
+kTrotecCool LITERAL1
+kTrotecDefTemp LITERAL1
+kTrotecDry LITERAL1
+kTrotecFan LITERAL1
+kTrotecFanHigh LITERAL1
+kTrotecFanLow LITERAL1
+kTrotecFanMed LITERAL1
+kTrotecGap LITERAL1
+kTrotecGapEnd LITERAL1
+kTrotecHdrMark LITERAL1
+kTrotecHdrSpace LITERAL1
+kTrotecIntro1 LITERAL1
+kTrotecIntro2 LITERAL1
+kTrotecMaxTemp LITERAL1
+kTrotecMaxTimer LITERAL1
+kTrotecMinTemp LITERAL1
+kTrotecMinTimer LITERAL1
+kTrotecOff LITERAL1
+kTrotecOn LITERAL1
+kTrotecOneMark LITERAL1
+kTrotecOneSpace LITERAL1
+kTrotecSleepOn LITERAL1
+kTrotecStateLength LITERAL1
+kTrotecTimerOn LITERAL1
+kTrotecZeroMark LITERAL1
+kTrotecZeroSpace LITERAL1
+kUnknownThreshold LITERAL1
+kWhirlpoolAcBitMark LITERAL1
+kWhirlpoolAcBits LITERAL1
+kWhirlpoolAcGap LITERAL1
+kWhirlpoolAcHdrMark LITERAL1
+kWhirlpoolAcHdrSpace LITERAL1
+kWhirlpoolAcMinGap LITERAL1
+kWhirlpoolAcOneSpace LITERAL1
+kWhirlpoolAcSections LITERAL1
+kWhirlpoolAcStateLength LITERAL1
+kWhirlpoolAcZeroSpace LITERAL1
+kWhynterBitMark LITERAL1
+kWhynterBitMarkTicks LITERAL1
+kWhynterBits LITERAL1
+kWhynterHdrMark LITERAL1
+kWhynterHdrMarkTicks LITERAL1
+kWhynterHdrSpace LITERAL1
+kWhynterHdrSpaceTicks LITERAL1
+kWhynterMinCommandLength LITERAL1
+kWhynterMinCommandLengthTicks LITERAL1
+kWhynterMinGap LITERAL1
+kWhynterMinGapTicks LITERAL1
+kWhynterOneSpace LITERAL1
+kWhynterOneSpaceTicks LITERAL1
+kWhynterTick LITERAL1
+kWhynterZeroSpace LITERAL1
+kWhynterZeroSpaceTicks LITERAL1
diff --git a/lib/IRremoteESP8266-2.2.1.02/library.json b/lib/IRremoteESP8266-2.5.2.03/library.json
similarity index 97%
rename from lib/IRremoteESP8266-2.2.1.02/library.json
rename to lib/IRremoteESP8266-2.5.2.03/library.json
index b8141a2ebe37..3fc14f027e16 100644
--- a/lib/IRremoteESP8266-2.2.1.02/library.json
+++ b/lib/IRremoteESP8266-2.5.2.03/library.json
@@ -1,6 +1,6 @@
{
"name": "IRremoteESP8266",
- "version": "2.2.1",
+ "version": "2.5.2",
"keywords": "infrared, ir, remote, esp8266",
"description": "Send and receive infrared signals with multiple protocols (ESP8266)",
"repository":
diff --git a/lib/IRremoteESP8266-2.2.1.02/library.properties b/lib/IRremoteESP8266-2.5.2.03/library.properties
similarity index 96%
rename from lib/IRremoteESP8266-2.2.1.02/library.properties
rename to lib/IRremoteESP8266-2.5.2.03/library.properties
index ae6f93da7b2b..e71dc41542ef 100644
--- a/lib/IRremoteESP8266-2.2.1.02/library.properties
+++ b/lib/IRremoteESP8266-2.5.2.03/library.properties
@@ -1,5 +1,5 @@
name=IRremoteESP8266
-version=2.2.1
+version=2.5.2
author=Sebastien Warin, Mark Szabo, Ken Shirriff, David Conran
maintainer=Mark Szabo, David Conran, Sebastien Warin, Roi Dayan, Massimiliano Pinto
sentence=Send and receive infrared signals with multiple protocols (ESP8266)
diff --git a/lib/IRremoteESP8266-2.2.1.02/platformio.ini b/lib/IRremoteESP8266-2.5.2.03/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/platformio.ini
rename to lib/IRremoteESP8266-2.5.2.03/platformio.ini
diff --git a/lib/IRremoteESP8266-2.5.2.03/pylintrc b/lib/IRremoteESP8266-2.5.2.03/pylintrc
new file mode 100644
index 000000000000..987c6abf9dd7
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/pylintrc
@@ -0,0 +1,12 @@
+[REPORTS]
+
+# Tells whether to display a full report or only the messages
+reports=no
+
+[FORMAT]
+
+# Maximum number of characters on a single line.
+max-line-length=80
+
+# String used as indentation unit.
+indent-string=' '
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/CPPLINT.cfg b/lib/IRremoteESP8266-2.5.2.03/src/CPPLINT.cfg
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/src/CPPLINT.cfg
rename to lib/IRremoteESP8266-2.5.2.03/src/CPPLINT.cfg
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/IRrecv.cpp b/lib/IRremoteESP8266-2.5.2.03/src/IRrecv.cpp
similarity index 59%
rename from lib/IRremoteESP8266-2.2.1.02/src/IRrecv.cpp
rename to lib/IRremoteESP8266-2.5.2.03/src/IRrecv.cpp
index d8e390633f0c..b2c98439694b 100644
--- a/lib/IRremoteESP8266-2.2.1.02/src/IRrecv.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/src/IRrecv.cpp
@@ -7,13 +7,14 @@
#include
#ifndef UNIT_TEST
extern "C" {
- #include
- #include
+#include
+#include
}
#include
#endif
#include
#include "IRremoteESP8266.h"
+#include "IRutils.h"
#ifdef UNIT_TEST
#undef ICACHE_RAM_ATTR
@@ -34,8 +35,7 @@ irparams_t *irparams_save; // A copy of the interrupt state while decoding.
#ifndef UNIT_TEST
static void ICACHE_RAM_ATTR read_timeout(void *arg __attribute__((unused))) {
os_intr_lock();
- if (irparams.rawlen)
- irparams.rcvstate = STATE_STOP;
+ if (irparams.rawlen) irparams.rcvstate = kStopState;
os_intr_unlock();
}
@@ -57,25 +57,24 @@ static void ICACHE_RAM_ATTR gpio_intr() {
if (rawlen >= irparams.bufsize) {
irparams.overflow = true;
- irparams.rcvstate = STATE_STOP;
+ irparams.rcvstate = kStopState;
}
- if (irparams.rcvstate == STATE_STOP)
- return;
+ if (irparams.rcvstate == kStopState) return;
- if (irparams.rcvstate == STATE_IDLE) {
- irparams.rcvstate = STATE_MARK;
+ if (irparams.rcvstate == kIdleState) {
+ irparams.rcvstate = kMarkState;
irparams.rawbuf[rawlen] = 1;
} else {
if (now < start)
- irparams.rawbuf[rawlen] = (UINT32_MAX - start + now) / RAWTICK;
+ irparams.rawbuf[rawlen] = (UINT32_MAX - start + now) / kRawTick;
else
- irparams.rawbuf[rawlen] = (now - start) / RAWTICK;
+ irparams.rawbuf[rawlen] = (now - start) / kRawTick;
}
irparams.rawlen++;
start = now;
- #define ONCE 0
+#define ONCE 0
os_timer_arm(&timer, irparams.timeout, ONCE);
}
#endif // UNIT_TEST
@@ -85,23 +84,24 @@ static void ICACHE_RAM_ATTR gpio_intr() {
// Class constructor
// Args:
// recvpin: GPIO pin the IR receiver module's data pin is connected to.
-// bufsize: Nr. of entries to have in the capture buffer. (Default: RAWBUF)
+// bufsize: Nr. of entries to have in the capture buffer. (Default: kRawBuf)
// timeout: Nr. of milli-Seconds of no signal before we stop capturing data.
-// (Default: TIMEOUT_MS)
+// (Default: kTimeoutMs)
// save_buffer: Use a second (save) buffer to decode from. (Def: false)
// Returns:
-// A IRrecv class object.
+// An IRrecv class object.
IRrecv::IRrecv(uint16_t recvpin, uint16_t bufsize, uint8_t timeout,
bool save_buffer) {
irparams.recvpin = recvpin;
irparams.bufsize = bufsize;
// Ensure we are going to be able to store all possible values in the
// capture buffer.
- irparams.timeout = std::min(timeout, (uint8_t) MAX_TIMEOUT_MS);
+ irparams.timeout = std::min(timeout, (uint8_t)kMaxTimeoutMs);
irparams.rawbuf = new uint16_t[bufsize];
if (irparams.rawbuf == NULL) {
- DPRINTLN("Could not allocate memory for the primary IR buffer.\n"
- "Try a smaller size for CAPTURE_BUFFER_SIZE.\nRebooting!");
+ DPRINTLN(
+ "Could not allocate memory for the primary IR buffer.\n"
+ "Try a smaller size for CAPTURE_BUFFER_SIZE.\nRebooting!");
#ifndef UNIT_TEST
ESP.restart(); // Mem alloc failure. Reboot.
#endif
@@ -112,8 +112,9 @@ IRrecv::IRrecv(uint16_t recvpin, uint16_t bufsize, uint8_t timeout,
irparams_save->rawbuf = new uint16_t[bufsize];
// Check we allocated the memory successfully.
if (irparams_save->rawbuf == NULL) {
- DPRINTLN("Could not allocate memory for the second IR buffer.\n"
- "Try a smaller size for CAPTURE_BUFFER_SIZE.\nRebooting!");
+ DPRINTLN(
+ "Could not allocate memory for the second IR buffer.\n"
+ "Try a smaller size for CAPTURE_BUFFER_SIZE.\nRebooting!");
#ifndef UNIT_TEST
ESP.restart(); // Mem alloc failure. Reboot.
#endif
@@ -121,13 +122,16 @@ IRrecv::IRrecv(uint16_t recvpin, uint16_t bufsize, uint8_t timeout,
} else {
irparams_save = NULL;
}
+#if DECODE_HASH
+ unknown_threshold = kUnknownThreshold;
+#endif // DECODE_HASH
}
// Class destructor
IRrecv::~IRrecv(void) {
- delete [] irparams.rawbuf;
+ delete[] irparams.rawbuf;
if (irparams_save != NULL) {
- delete [] irparams_save->rawbuf;
+ delete[] irparams_save->rawbuf;
delete irparams_save;
}
}
@@ -156,7 +160,7 @@ void IRrecv::disableIRIn() {
}
void IRrecv::resume() {
- irparams.rcvstate = STATE_IDLE;
+ irparams.rcvstate = kIdleState;
irparams.rawlen = 0;
irparams.overflow = false;
}
@@ -164,15 +168,15 @@ void IRrecv::resume() {
// Make a copy of the interrupt state & buffer data.
// Needed because irparams is marked as volatile, thus memcpy() isn't allowed.
// Only call this when you know the interrupt handlers won't modify anything.
-// i.e. In STATE_STOP.
+// i.e. In kStopState.
//
// Args:
// src: Pointer to an irparams_t structure to copy from.
// dst: Pointer to an irparams_t structure to copy to.
void IRrecv::copyIrParams(volatile irparams_t *src, irparams_t *dst) {
// Typecast src and dst addresses to (char *)
- char *csrc = (char *) src; // NOLINT(readability/casting)
- char *cdst = (char *) dst; // NOLINT(readability/casting)
+ char *csrc = (char *)src; // NOLINT(readability/casting)
+ char *cdst = (char *)dst; // NOLINT(readability/casting)
// Save the pointer to the destination's rawbuf so we don't lose it as
// the for-loop/copy after this will overwrite it with src's rawbuf pointer.
@@ -181,22 +185,25 @@ void IRrecv::copyIrParams(volatile irparams_t *src, irparams_t *dst) {
dst_rawbuf_ptr = dst->rawbuf;
// Copy contents of src[] to dst[]
- for (uint16_t i = 0; i < sizeof(irparams_t); i++)
- cdst[i] = csrc[i];
+ for (uint16_t i = 0; i < sizeof(irparams_t); i++) cdst[i] = csrc[i];
// Restore the buffer pointer
dst->rawbuf = dst_rawbuf_ptr;
// Copy the rawbuf
- for (uint16_t i = 0; i < dst->bufsize; i++)
- dst->rawbuf[i] = src->rawbuf[i];
+ for (uint16_t i = 0; i < dst->bufsize; i++) dst->rawbuf[i] = src->rawbuf[i];
}
// Obtain the maximum number of entries possible in the capture buffer.
// i.e. It's size.
-uint16_t IRrecv::getBufSize() {
- return irparams.bufsize;
+uint16_t IRrecv::getBufSize() { return irparams.bufsize; }
+
+#if DECODE_HASH
+// Set the minimum length we will consider for reporting UNKNOWN message types.
+void IRrecv::setUnknownThreshold(uint16_t length) {
+ unknown_threshold = length;
}
+#endif // DECODE_HASH
// Decodes the received IR message.
// If the interrupt state is saved, we will immediately resume waiting
@@ -213,8 +220,7 @@ uint16_t IRrecv::getBufSize() {
bool IRrecv::decode(decode_results *results, irparams_t *save) {
// Proceed only if an IR message been received.
#ifndef UNIT_TEST
- if (irparams.rcvstate != STATE_STOP)
- return false;
+ if (irparams.rcvstate != kStopState) return false;
#endif
// Clear the entry we are currently pointing to when we got the timeout.
@@ -230,8 +236,7 @@ bool IRrecv::decode(decode_results *results, irparams_t *save) {
bool resumed = false; // Flag indicating if we have resumed.
// If we were requested to use a save buffer previously, do so.
- if (save == NULL)
- save = irparams_save;
+ if (save == NULL) save = irparams_save;
if (save == NULL) {
// We haven't been asked to copy it so use the existing memory.
@@ -263,8 +268,7 @@ bool IRrecv::decode(decode_results *results, irparams_t *save) {
// Try decodeAiwaRCT501() before decodeSanyoLC7461() & decodeNEC()
// because the protocols are similar. This protocol is more specific than
// those ones, so should got before them.
- if (decodeAiwaRCT501(results))
- return true;
+ if (decodeAiwaRCT501(results)) return true;
#endif
#if DECODE_SANYO
DPRINTLN("Attempting Sanyo LC7461 decode");
@@ -272,97 +276,135 @@ bool IRrecv::decode(decode_results *results, irparams_t *save) {
// similar in timings & structure, but the Sanyo one is much longer than the
// NEC protocol (42 vs 32 bits) so this one should be tried first to try to
// reduce false detection as a NEC packet.
- if (decodeSanyoLC7461(results))
- return true;
+ if (decodeSanyoLC7461(results)) return true;
+#endif
+#if DECODE_CARRIER_AC
+ DPRINTLN("Attempting Carrier AC decode");
+ // Try decodeCarrierAC() before decodeNEC() because the protocols are
+ // similar in timings & structure, but the Carrier one is much longer than the
+ // NEC protocol (3x32 bits vs 1x32 bits) so this one should be tried first to
+ // try to reduce false detection as a NEC packet.
+ if (decodeCarrierAC(results)) return true;
+#endif
+#if DECODE_PIONEER
+ DPRINTLN("Attempting Pioneer decode");
+ // Try decodePioneer() before decodeNEC() because the protocols are
+ // similar in timings & structure, but the Pioneer one is much longer than the
+ // NEC protocol (2x32 bits vs 1x32 bits) so this one should be tried first to
+ // try to reduce false detection as a NEC packet.
+ if (decodePioneer(results)) return true;
#endif
#if DECODE_NEC
DPRINTLN("Attempting NEC decode");
- if (decodeNEC(results))
- return true;
+ if (decodeNEC(results)) return true;
#endif
#if DECODE_SONY
DPRINTLN("Attempting Sony decode");
- if (decodeSony(results))
- return true;
+ if (decodeSony(results)) return true;
#endif
#if DECODE_MITSUBISHI
DPRINTLN("Attempting Mitsubishi decode");
- if (decodeMitsubishi(results))
- return true;
+ if (decodeMitsubishi(results)) return true;
+#endif
+#if DECODE_MITSUBISHI_AC
+ DPRINTLN("Attempting Mitsubishi AC decode");
+ if (decodeMitsubishiAC(results)) return true;
+#endif
+#if DECODE_MITSUBISHI2
+ DPRINTLN("Attempting Mitsubishi2 decode");
+ if (decodeMitsubishi2(results)) return true;
#endif
#if DECODE_RC5
DPRINTLN("Attempting RC5 decode");
- if (decodeRC5(results))
- return true;
+ if (decodeRC5(results)) return true;
#endif
#if DECODE_RC6
DPRINTLN("Attempting RC6 decode");
- if (decodeRC6(results))
- return true;
+ if (decodeRC6(results)) return true;
#endif
#if DECODE_RCMM
DPRINTLN("Attempting RC-MM decode");
- if (decodeRCMM(results))
- return true;
+ if (decodeRCMM(results)) return true;
+#endif
+#if DECODE_FUJITSU_AC
+ // Fujitsu A/C needs to precede Panasonic and Denon as it has a short
+ // message which looks exactly the same as a Panasonic/Denon message.
+ DPRINTLN("Attempting Fujitsu A/C decode");
+ if (decodeFujitsuAC(results)) return true;
#endif
#if DECODE_DENON
// Denon needs to precede Panasonic as it is a special case of Panasonic.
-#ifdef DEBUG
DPRINTLN("Attempting Denon decode");
-#endif
- if (decodeDenon(results, DENON_48_BITS) ||
- decodeDenon(results, DENON_BITS) ||
- decodeDenon(results, DENON_LEGACY_BITS))
+ if (decodeDenon(results, DENON_48_BITS) || decodeDenon(results, DENON_BITS) ||
+ decodeDenon(results, kDenonLegacyBits))
return true;
#endif
#if DECODE_PANASONIC
DPRINTLN("Attempting Panasonic decode");
- if (decodePanasonic(results))
- return true;
+ if (decodePanasonic(results)) return true;
#endif
#if DECODE_LG
DPRINTLN("Attempting LG (28-bit) decode");
- if (decodeLG(results, LG_BITS, true))
- return true;
+ if (decodeLG(results, kLgBits, true)) return true;
DPRINTLN("Attempting LG (32-bit) decode");
// LG32 should be tried before Samsung
- if (decodeLG(results, LG32_BITS, true))
- return true;
+ if (decodeLG(results, kLg32Bits, true)) return true;
+#endif
+#if DECODE_GICABLE
+ // Note: Needs to happen before JVC decode, because it looks similar except
+ // with a required NEC-like repeat code.
+ DPRINTLN("Attempting GICable decode");
+ if (decodeGICable(results)) return true;
#endif
#if DECODE_JVC
DPRINTLN("Attempting JVC decode");
- if (decodeJVC(results))
- return true;
+ if (decodeJVC(results)) return true;
#endif
#if DECODE_SAMSUNG
DPRINTLN("Attempting SAMSUNG decode");
- if (decodeSAMSUNG(results))
- return true;
+ if (decodeSAMSUNG(results)) return true;
#endif
#if DECODE_WHYNTER
DPRINTLN("Attempting Whynter decode");
- if (decodeWhynter(results))
- return true;
+ if (decodeWhynter(results)) return true;
#endif
#if DECODE_DISH
DPRINTLN("Attempting DISH decode");
- if (decodeDISH(results))
- return true;
+ if (decodeDISH(results)) return true;
#endif
#if DECODE_SHARP
DPRINTLN("Attempting Sharp decode");
- if (decodeSharp(results))
- return true;
+ if (decodeSharp(results)) return true;
#endif
#if DECODE_COOLIX
DPRINTLN("Attempting Coolix decode");
- if (decodeCOOLIX(results))
- return true;
+ if (decodeCOOLIX(results)) return true;
#endif
#if DECODE_NIKAI
DPRINTLN("Attempting Nikai decode");
- if (decodeNikai(results))
- return true;
+ if (decodeNikai(results)) return true;
+#endif
+#if DECODE_KELVINATOR
+ // Kelvinator based-devices use a similar code to Gree ones, to avoid false
+ // matches this needs to happen before decodeGree().
+ DPRINTLN("Attempting Kelvinator decode");
+ if (decodeKelvinator(results)) return true;
+#endif
+#if DECODE_DAIKIN
+ DPRINTLN("Attempting Daikin decode");
+ if (decodeDaikin(results)) return true;
+#endif
+#if DECODE_TOSHIBA_AC
+ DPRINTLN("Attempting Toshiba AC decode");
+ if (decodeToshibaAC(results)) return true;
+#endif
+#if DECODE_MIDEA
+ DPRINTLN("Attempting Midea decode");
+ if (decodeMidea(results)) return true;
+#endif
+#if DECODE_MAGIQUEST
+ DPRINTLN("Attempting Magiquest decode");
+ if (decodeMagiQuest(results)) return true;
#endif
/* NOTE: Disabled due to poor quality.
#if DECODE_SANYO
@@ -380,18 +422,81 @@ bool IRrecv::decode(decode_results *results, irparams_t *save) {
// This needs to be done after all other codes that use strict and some
// other protocols that are NEC-like as well, as turning off strict may
// cause this to match other valid protocols.
- DPRINTLN("Attempting NEC (non-stict) decode");
- if (decodeNEC(results, NEC_BITS, false)) {
+ DPRINTLN("Attempting NEC (non-strict) decode");
+ if (decodeNEC(results, kNECBits, false)) {
results->decode_type = NEC_LIKE;
return true;
}
#endif
+#if DECODE_LASERTAG
+ DPRINTLN("Attempting Lasertag decode");
+ if (decodeLasertag(results)) return true;
+#endif
+#if DECODE_GREE
+ // Gree based-devices use a similar code to Kelvinator ones, to avoid false
+ // matches this needs to happen after decodeKelvinator().
+ DPRINTLN("Attempting Gree decode");
+ if (decodeGree(results)) return true;
+#endif
+#if DECODE_HAIER_AC
+ DPRINTLN("Attempting Haier AC decode");
+ if (decodeHaierAC(results)) return true;
+#endif
+#if DECODE_HAIER_AC_YRW02
+ DPRINTLN("Attempting Haier AC YR-W02 decode");
+ if (decodeHaierACYRW02(results)) return true;
+#endif
+#if DECODE_HITACHI_AC2
+ // HitachiAC2 should be checked before HitachiAC
+ DPRINTLN("Attempting Hitachi AC2 decode");
+ if (decodeHitachiAC(results, kHitachiAc2Bits)) return true;
+#endif
+#if DECODE_HITACHI_AC
+ DPRINTLN("Attempting Hitachi AC decode");
+ if (decodeHitachiAC(results, kHitachiAcBits)) return true;
+#endif
+#if DECODE_HITACHI_AC1
+ DPRINTLN("Attempting Hitachi AC1 decode");
+ if (decodeHitachiAC(results, kHitachiAc1Bits)) return true;
+#endif
+#if DECODE_WHIRLPOOL_AC
+ DPRINTLN("Attempting Whirlpool AC decode");
+ if (decodeWhirlpoolAC(results)) return true;
+#endif
+#if DECODE_SAMSUNG_AC
+ DPRINTLN("Attempting Samsung AC (extended) decode");
+ // Check the extended size first, as it should fail fast due to longer length.
+ if (decodeSamsungAC(results, kSamsungAcExtendedBits, false)) return true;
+ // Now check for the more common length.
+ DPRINTLN("Attempting Samsung AC decode");
+ if (decodeSamsungAC(results, kSamsungAcBits)) return true;
+#endif
+#if DECODE_ELECTRA_AC
+ DPRINTLN("Attempting Electra AC decode");
+ if (decodeElectraAC(results)) return true;
+#endif
+#if DECODE_PANASONIC_AC
+ DPRINTLN("Attempting Panasonic AC decode");
+ if (decodePanasonicAC(results)) return true;
+ DPRINTLN("Attempting Panasonic AC short decode");
+ if (decodePanasonicAC(results, kPanasonicAcShortBits)) return true;
+#endif
+#if DECODE_LUTRON
+ DPRINTLN("Attempting Lutron decode");
+ if (decodeLutron(results)) return true;
+#endif
+#if DECODE_MWM
+ DPRINTLN("Attempting MWM decode");
+ if (decodeMWM(results)) return true;
+#endif
+#if DECODE_HASH
// decodeHash returns a hash on any input.
// Thus, it needs to be last in the list.
// If you add any decodes, add them before this.
if (decodeHash(results)) {
return true;
}
+#endif // DECODE_HASH
// Throw away and start over
if (!resumed) // Check if we have already resumed.
resume();
@@ -403,11 +508,13 @@ bool IRrecv::decode(decode_results *results, irparams_t *save) {
// Args:
// usecs: Nr. of uSeconds.
// tolerance: Percent as an integer. e.g. 10 is 10%
+// delta: A non-scaling amount to reduce usecs by.
// Returns:
// Nr. of ticks.
-uint32_t IRrecv::ticksLow(uint32_t usecs, uint8_t tolerance) {
+uint32_t IRrecv::ticksLow(uint32_t usecs, uint8_t tolerance, uint16_t delta) {
// max() used to ensure the result can't drop below 0 before the cast.
- return((uint32_t) std::max((int32_t) (usecs * (1.0 - tolerance / 100.0)), 0));
+ return ((uint32_t)std::max(
+ (int32_t)(usecs * (1.0 - tolerance / 100.0) - delta), 0));
}
// Calculate the upper bound of the nr. of ticks.
@@ -415,49 +522,52 @@ uint32_t IRrecv::ticksLow(uint32_t usecs, uint8_t tolerance) {
// Args:
// usecs: Nr. of uSeconds.
// tolerance: Percent as an integer. e.g. 10 is 10%
+// delta: A non-scaling amount to increase usecs by.
// Returns:
// Nr. of ticks.
-uint32_t IRrecv::ticksHigh(uint32_t usecs, uint8_t tolerance) {
- return((uint32_t) (usecs * (1.0 + tolerance / 100.0)) + 1);
+uint32_t IRrecv::ticksHigh(uint32_t usecs, uint8_t tolerance, uint16_t delta) {
+ return ((uint32_t)(usecs * (1.0 + tolerance / 100.0)) + 1 + delta);
}
// Check if we match a pulse(measured) with the desired within
-// +/-tolerance percent.
+// +/-tolerance percent and/or +/- a fixed delta range.
//
// Args:
// measured: The recorded period of the signal pulse.
// desired: The expected period (in useconds) we are matching against.
// tolerance: A percentage expressed as an integer. e.g. 10 is 10%.
+// delta: A non-scaling (+/-) error margin (in useconds).
//
// Returns:
// Boolean: true if it matches, false if it doesn't.
-bool IRrecv::match(uint32_t measured, uint32_t desired,
- uint8_t tolerance) {
- measured *= RAWTICK; // Convert to uSecs.
+bool IRrecv::match(uint32_t measured, uint32_t desired, uint8_t tolerance,
+ uint16_t delta) {
+ measured *= kRawTick; // Convert to uSecs.
DPRINT("Matching: ");
- DPRINT(ticksLow(desired, tolerance));
+ DPRINT(ticksLow(desired, tolerance, delta));
DPRINT(" <= ");
DPRINT(measured);
DPRINT(" <= ");
- DPRINTLN(ticksHigh(desired, tolerance));
- return (measured >= ticksLow(desired, tolerance) &&
- measured <= ticksHigh(desired, tolerance));
+ DPRINTLN(ticksHigh(desired, tolerance, delta));
+ return (measured >= ticksLow(desired, tolerance, delta) &&
+ measured <= ticksHigh(desired, tolerance, delta));
}
-
// Check if we match a pulse(measured) of at least desired within
-// +/-tolerance percent.
+// tolerance percent and/or a fixed delta margin.
//
// Args:
// measured: The recorded period of the signal pulse.
// desired: The expected period (in useconds) we are matching against.
// tolerance: A percentage expressed as an integer. e.g. 10 is 10%.
+// delta: A non-scaling amount to reduce usecs by.
+
//
// Returns:
// Boolean: true if it matches, false if it doesn't.
bool IRrecv::matchAtLeast(uint32_t measured, uint32_t desired,
- uint8_t tolerance) {
- measured *= RAWTICK; // Convert to uSecs.
+ uint8_t tolerance, uint16_t delta) {
+ measured *= kRawTick; // Convert to uSecs.
DPRINT("Matching ATLEAST ");
DPRINT(measured);
DPRINT(" vs ");
@@ -465,17 +575,18 @@ bool IRrecv::matchAtLeast(uint32_t measured, uint32_t desired,
DPRINT(". Matching: ");
DPRINT(measured);
DPRINT(" >= ");
- DPRINT(ticksLow(std::min(desired, MS_TO_USEC(irparams.timeout)), tolerance));
+ DPRINT(ticksLow(std::min(desired, MS_TO_USEC(irparams.timeout)), tolerance,
+ delta));
DPRINT(" [min(");
- DPRINT(ticksLow(desired, tolerance));
+ DPRINT(ticksLow(desired, tolerance, delta));
DPRINT(", ");
- DPRINT(ticksLow(MS_TO_USEC(irparams.timeout), tolerance));
+ DPRINT(ticksLow(MS_TO_USEC(irparams.timeout), tolerance, delta));
DPRINTLN(")]");
// We really should never get a value of 0, except as the last value
// in the buffer. If that is the case, then assume infinity and return true.
if (measured == 0) return true;
return measured >= ticksLow(std::min(desired, MS_TO_USEC(irparams.timeout)),
- tolerance);
+ tolerance, delta);
}
// Check if we match a mark signal(measured) with the desired within
@@ -489,10 +600,10 @@ bool IRrecv::matchAtLeast(uint32_t measured, uint32_t desired,
//
// Returns:
// Boolean: true if it matches, false if it doesn't.
-bool IRrecv::matchMark(uint32_t measured, uint32_t desired,
- uint8_t tolerance, int16_t excess) {
+bool IRrecv::matchMark(uint32_t measured, uint32_t desired, uint8_t tolerance,
+ int16_t excess) {
DPRINT("Matching MARK ");
- DPRINT(measured * RAWTICK);
+ DPRINT(measured * kRawTick);
DPRINT(" vs ");
DPRINT(desired);
DPRINT(" + ");
@@ -512,10 +623,10 @@ bool IRrecv::matchMark(uint32_t measured, uint32_t desired,
//
// Returns:
// Boolean: true if it matches, false if it doesn't.
-bool IRrecv::matchSpace(uint32_t measured, uint32_t desired,
- uint8_t tolerance, int16_t excess) {
+bool IRrecv::matchSpace(uint32_t measured, uint32_t desired, uint8_t tolerance,
+ int16_t excess) {
DPRINT("Matching SPACE ");
- DPRINT(measured * RAWTICK);
+ DPRINT(measured * kRawTick);
DPRINT(" vs ");
DPRINT(desired);
DPRINT(" - ");
@@ -550,15 +661,15 @@ int16_t IRrecv::compare(uint16_t oldval, uint16_t newval) {
return 1;
}
+#if DECODE_HASH
/* Converts the raw code values into a 32-bit hash code.
* Hopefully this code is unique for each button.
* This isn't a "real" decoding, just an arbitrary value.
*/
bool IRrecv::decodeHash(decode_results *results) {
- // Require at least 6 samples to prevent triggering on noise
- if (results->rawlen < 6)
- return false;
- int32_t hash = FNV_BASIS_32;
+ // Require at least some samples to prevent triggering on noise
+ if (results->rawlen < unknown_threshold) return false;
+ int32_t hash = kFnvBasis32;
// 'rawlen - 2' to avoid the look ahead from going out of bounds.
// Should probably be -3 to avoid comparing the trailing space entry,
// however it is left this way for compatibility with previously captured
@@ -566,7 +677,7 @@ bool IRrecv::decodeHash(decode_results *results) {
for (uint16_t i = 1; i < results->rawlen - 2; i++) {
int16_t value = compare(results->rawbuf[i], results->rawbuf[i + 2]);
// Add value into the hash
- hash = (hash * FNV_PRIME_32) ^ value;
+ hash = (hash * kFnvPrime32) ^ value;
}
results->value = hash & 0xFFFFFFFF;
results->bits = results->rawlen / 2;
@@ -575,9 +686,11 @@ bool IRrecv::decodeHash(decode_results *results) {
results->decode_type = UNKNOWN;
return true;
}
+#endif // DECODE_HASH
// Match & decode the typical data section of an IR message.
-// The data value constructed as the Most Significant Bit first.
+// The data value is stored in the least significant bits reguardless of the
+// bit ordering requested.
//
// Args:
// data_ptr: A pointer to where we are at in the capture buffer.
@@ -586,46 +699,35 @@ bool IRrecv::decodeHash(decode_results *results) {
// onespace: Nr. of uSeconds in an expected space signal for a '1' bit.
// zeromark: Nr. of uSeconds in an expected mark signal for a '0' bit.
// zerospace: Nr. of uSeconds in an expected space signal for a '0' bit.
+// tolerance: Percentage error margin to allow. (Def: kTolerance)
+// excess: Nr. of useconds. (Def: kMarkExcess)
+// MSBfirst: Bit order to save the data in. (Def: true)
// Returns:
// A match_result_t structure containing the success (or not), the data value,
// and how many buffer entries were used.
-match_result_t IRrecv::matchData(volatile uint16_t *data_ptr, uint16_t nbits,
- uint16_t onemark, uint32_t onespace,
- uint16_t zeromark, uint32_t zerospace) {
+match_result_t IRrecv::matchData(
+ volatile uint16_t *data_ptr, const uint16_t nbits, const uint16_t onemark,
+ const uint32_t onespace, const uint16_t zeromark, const uint32_t zerospace,
+ const uint8_t tolerance, const int16_t excess, const bool MSBfirst) {
match_result_t result;
- result.success = false;
+ result.success = false; // Fail by default.
result.data = 0;
- if (onemark == zeromark) { // Is this space encoded data format?
- for (result.used = 0;
- result.used < nbits * 2;
- result.used += 2, data_ptr++) {
- if (!matchMark(*data_ptr, onemark))
- return result; // Fail
- data_ptr++;
- if (matchSpace(*data_ptr, onespace))
- result.data = (result.data << 1) | 1;
- else if (matchSpace(*data_ptr, zerospace))
- result.data <<= 1;
- else
- return result; // Fail
- }
- result.success = true;
- } else if (onespace == zerospace) { // Is this mark encoded data format?
- for (result.used = 0;
- result.used < nbits * 2;
- result.used += 2, data_ptr++) {
- if (matchMark(*data_ptr, onemark))
- result.data = (result.data << 1) | 1;
- else if (matchMark(*data_ptr, zeromark))
- result.data <<= 1;
- else
- return result; // Fail
- data_ptr++;
- if (!matchSpace(*data_ptr, onespace))
- return result; // Fail
+ for (result.used = 0; result.used < nbits * 2;
+ result.used += 2, data_ptr += 2) {
+ // Is the bit a '1'?
+ if (matchMark(*data_ptr, onemark, tolerance, excess) &&
+ matchSpace(*(data_ptr + 1), onespace, tolerance, excess)) {
+ result.data = (result.data << 1) | 1;
+ } else if (matchMark(*data_ptr, zeromark, tolerance, excess) &&
+ matchSpace(*(data_ptr + 1), zerospace, tolerance, excess)) {
+ result.data <<= 1; // The bit is a '0'.
+ } else {
+ if (!MSBfirst) result.data = reverseBits(result.data, result.used / 2);
+ return result; // It's neither, so fail.
}
- result.success = true;
}
+ result.success = true;
+ if (!MSBfirst) result.data = reverseBits(result.data, nbits);
return result;
}
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/IRrecv.h b/lib/IRremoteESP8266-2.5.2.03/src/IRrecv.h
new file mode 100644
index 000000000000..c0f5e781aa90
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/IRrecv.h
@@ -0,0 +1,335 @@
+// Copyright 2009 Ken Shirriff
+// Copyright 2015 Mark Szabo
+// Copyright 2015 Sebastien Warin
+// Copyright 2017 David Conran
+
+#ifndef IRRECV_H_
+#define IRRECV_H_
+
+#ifndef UNIT_TEST
+#include
+#endif
+#include
+#define __STDC_LIMIT_MACROS
+#include
+#include "IRremoteESP8266.h"
+
+// Constants
+const uint16_t kHeader = 2; // Usual nr. of header entries.
+const uint16_t kFooter = 2; // Usual nr. of footer (stop bits) entries.
+const uint16_t kStartOffset = 1; // Usual rawbuf entry to start from.
+#define MS_TO_USEC(x) (x * 1000U) // Convert milli-Seconds to micro-Seconds.
+// Marks tend to be 100us too long, and spaces 100us too short
+// when received due to sensor lag.
+const uint16_t kMarkExcess = 50;
+const uint16_t kRawBuf = 100; // Default length of raw capture buffer
+const uint64_t kRepeat = UINT64_MAX;
+// Default min size of reported UNKNOWN messages.
+const uint16_t kUnknownThreshold = 6;
+
+// receiver states
+const uint8_t kIdleState = 2;
+const uint8_t kMarkState = 3;
+const uint8_t kSpaceState = 4;
+const uint8_t kStopState = 5;
+const uint8_t kTolerance = 25; // default percent tolerance in measurements.
+const uint16_t kRawTick = 2; // Capture tick to uSec factor.
+#define RAWTICK kRawTick // Deprecated. For legacy user code support only.
+// How long (ms) before we give up wait for more data?
+// Don't exceed kMaxTimeoutMs without a good reason.
+// That is the capture buffers maximum value size. (UINT16_MAX / kRawTick)
+// Typically messages/protocols tend to repeat around the 100ms timeframe,
+// thus we should timeout before that to give us some time to try to decode
+// before we need to start capturing a possible new message.
+// Typically 15ms suits most applications. However, some protocols demand a
+// higher value. e.g. 90ms for XMP-1 and some aircon units.
+const uint8_t kTimeoutMs = 15; // In MilliSeconds.
+#define TIMEOUT_MS kTimeoutMs // For legacy documentation.
+const uint16_t kMaxTimeoutMs = kRawTick * (UINT16_MAX / MS_TO_USEC(1));
+
+// Use FNV hash algorithm: http://isthe.com/chongo/tech/comp/fnv/#FNV-param
+const uint32_t kFnvPrime32 = 16777619UL;
+const uint32_t kFnvBasis32 = 2166136261UL;
+
+#if DECODE_AC
+// Hitachi AC is the current largest state size.
+const uint16_t kStateSizeMax = kHitachiAc2StateLength;
+#else
+// Just define something
+const uint16_t kStateSizeMax = 0;
+#endif
+
+// Types
+// information for the interrupt handler
+typedef struct {
+ uint8_t recvpin; // pin for IR data from detector
+ uint8_t rcvstate; // state machine
+ uint16_t timer; // state timer, counts 50uS ticks.
+ uint16_t bufsize; // max. nr. of entries in the capture buffer.
+ uint16_t *rawbuf; // raw data
+ // uint16_t is used for rawlen as it saves 3 bytes of iram in the interrupt
+ // handler. Don't ask why, I don't know. It just does.
+ uint16_t rawlen; // counter of entries in rawbuf.
+ uint8_t overflow; // Buffer overflow indicator.
+ uint8_t timeout; // Nr. of milliSeconds before we give up.
+} irparams_t;
+
+// results from a data match
+typedef struct {
+ bool success; // Was the match successful?
+ uint64_t data; // The data found.
+ uint16_t used; // How many buffer positions were used.
+} match_result_t;
+
+// Classes
+
+// Results returned from the decoder
+class decode_results {
+ public:
+ decode_type_t decode_type; // NEC, SONY, RC5, UNKNOWN
+ // value, address, & command are all mutually exclusive with state.
+ // i.e. They MUST NOT be used at the same time as state, so we can use a union
+ // structure to save us a handful of valuable bytes of memory.
+ union {
+ struct {
+ uint64_t value; // Decoded value
+ uint32_t address; // Decoded device address.
+ uint32_t command; // Decoded command.
+ };
+ uint8_t state[kStateSizeMax]; // Multi-byte results.
+ };
+ uint16_t bits; // Number of bits in decoded value
+ volatile uint16_t *rawbuf; // Raw intervals in .5 us ticks
+ uint16_t rawlen; // Number of records in rawbuf.
+ bool overflow;
+ bool repeat; // Is the result a repeat code?
+};
+
+// main class for receiving IR
+class IRrecv {
+ public:
+ explicit IRrecv(uint16_t recvpin, uint16_t bufsize = kRawBuf,
+ uint8_t timeout = kTimeoutMs,
+ bool save_buffer = false); // Constructor
+ ~IRrecv(); // Destructor
+ bool decode(decode_results *results, irparams_t *save = NULL);
+ void enableIRIn();
+ void disableIRIn();
+ void resume();
+ uint16_t getBufSize();
+#if DECODE_HASH
+ void setUnknownThreshold(uint16_t length);
+#endif
+ static bool match(uint32_t measured, uint32_t desired,
+ uint8_t tolerance = kTolerance, uint16_t delta = 0);
+ static bool matchMark(uint32_t measured, uint32_t desired,
+ uint8_t tolerance = kTolerance,
+ int16_t excess = kMarkExcess);
+ static bool matchSpace(uint32_t measured, uint32_t desired,
+ uint8_t tolerance = kTolerance,
+ int16_t excess = kMarkExcess);
+#ifndef UNIT_TEST
+
+ private:
+#endif
+ irparams_t *irparams_save;
+#if DECODE_HASH
+ uint16_t unknown_threshold;
+#endif
+ // These are called by decode
+ void copyIrParams(volatile irparams_t *src, irparams_t *dst);
+ int16_t compare(uint16_t oldval, uint16_t newval);
+ static uint32_t ticksLow(uint32_t usecs, uint8_t tolerance = kTolerance,
+ uint16_t delta = 0);
+ static uint32_t ticksHigh(uint32_t usecs, uint8_t tolerance = kTolerance,
+ uint16_t delta = 0);
+ bool matchAtLeast(uint32_t measured, uint32_t desired,
+ uint8_t tolerance = kTolerance, uint16_t delta = 0);
+ match_result_t matchData(volatile uint16_t *data_ptr, const uint16_t nbits,
+ const uint16_t onemark, const uint32_t onespace,
+ const uint16_t zeromark, const uint32_t zerospace,
+ const uint8_t tolerance = kTolerance,
+ const int16_t excess = kMarkExcess,
+ const bool MSBfirst = true);
+ bool decodeHash(decode_results *results);
+#if (DECODE_NEC || DECODE_SHERWOOD || DECODE_AIWA_RC_T501 || SEND_SANYO)
+ bool decodeNEC(decode_results *results, uint16_t nbits = kNECBits,
+ bool strict = true);
+#endif
+#if DECODE_SONY
+ bool decodeSony(decode_results *results, uint16_t nbits = kSonyMinBits,
+ bool strict = false);
+#endif
+#if DECODE_SANYO
+ // DISABLED due to poor quality.
+ // bool decodeSanyo(decode_results *results,
+ // uint16_t nbits = kSanyoSA8650BBits,
+ // bool strict = false);
+ bool decodeSanyoLC7461(decode_results *results,
+ uint16_t nbits = kSanyoLC7461Bits, bool strict = true);
+#endif
+#if DECODE_MITSUBISHI
+ bool decodeMitsubishi(decode_results *results,
+ uint16_t nbits = kMitsubishiBits, bool strict = true);
+#endif
+#if DECODE_MITSUBISHI2
+ bool decodeMitsubishi2(decode_results *results,
+ uint16_t nbits = kMitsubishiBits, bool strict = true);
+#endif
+#if DECODE_MITSUBISHI_AC
+ bool decodeMitsubishiAC(decode_results *results,
+ uint16_t nbits = kMitsubishiACBits,
+ bool strict = false);
+#endif
+#if (DECODE_RC5 || DECODE_R6 || DECODE_LASERTAG || DECODE_MWM)
+ int16_t getRClevel(decode_results *results, uint16_t *offset, uint16_t *used,
+ uint16_t bitTime, uint8_t tolerance = kTolerance,
+ int16_t excess = kMarkExcess, uint16_t delta = 0,
+ uint8_t maxwidth = 3);
+#endif
+#if DECODE_RC5
+ bool decodeRC5(decode_results *results, uint16_t nbits = kRC5XBits,
+ bool strict = true);
+#endif
+#if DECODE_RC6
+ bool decodeRC6(decode_results *results, uint16_t nbits = kRC6Mode0Bits,
+ bool strict = false);
+#endif
+#if DECODE_RCMM
+ bool decodeRCMM(decode_results *results, uint16_t nbits = kRCMMBits,
+ bool strict = false);
+#endif
+#if (DECODE_PANASONIC || DECODE_DENON)
+ bool decodePanasonic(decode_results *results, uint16_t nbits = kPanasonicBits,
+ bool strict = false,
+ uint32_t manufacturer = kPanasonicManufacturer);
+#endif
+#if DECODE_LG
+ bool decodeLG(decode_results *results, uint16_t nbits = kLgBits,
+ bool strict = false);
+#endif
+#if DECODE_JVC
+ bool decodeJVC(decode_results *results, uint16_t nbits = kJvcBits,
+ bool strict = true);
+#endif
+#if DECODE_SAMSUNG
+ bool decodeSAMSUNG(decode_results *results, uint16_t nbits = kSamsungBits,
+ bool strict = true);
+#endif
+#if DECODE_SAMSUNG_AC
+ bool decodeSamsungAC(decode_results *results, uint16_t nbits = kSamsungAcBits,
+ bool strict = true);
+#endif
+#if DECODE_WHYNTER
+ bool decodeWhynter(decode_results *results, uint16_t nbits = kWhynterBits,
+ bool strict = true);
+#endif
+#if DECODE_COOLIX
+ bool decodeCOOLIX(decode_results *results, uint16_t nbits = kCoolixBits,
+ bool strict = true);
+#endif
+#if DECODE_DENON
+ bool decodeDenon(decode_results *results, uint16_t nbits = DENON_BITS,
+ bool strict = true);
+#endif
+#if DECODE_DISH
+ bool decodeDISH(decode_results *results, uint16_t nbits = kDishBits,
+ bool strict = true);
+#endif
+#if (DECODE_SHARP || DECODE_DENON)
+ bool decodeSharp(decode_results *results, uint16_t nbits = kSharpBits,
+ bool strict = true, bool expansion = true);
+#endif
+#if DECODE_AIWA_RC_T501
+ bool decodeAiwaRCT501(decode_results *results,
+ uint16_t nbits = kAiwaRcT501Bits, bool strict = true);
+#endif
+#if DECODE_NIKAI
+ bool decodeNikai(decode_results *results, uint16_t nbits = kNikaiBits,
+ bool strict = true);
+#endif
+#if DECODE_MAGIQUEST
+ bool decodeMagiQuest(decode_results *results, uint16_t nbits = kMagiquestBits,
+ bool strict = true);
+#endif
+#if DECODE_KELVINATOR
+ bool decodeKelvinator(decode_results *results,
+ uint16_t nbits = kKelvinatorBits, bool strict = true);
+#endif
+#if DECODE_DAIKIN
+ bool decodeDaikin(decode_results *results, uint16_t nbits = kDaikinRawBits,
+ bool strict = true);
+#endif
+#if DECODE_TOSHIBA_AC
+ bool decodeToshibaAC(decode_results *results,
+ uint16_t nbytes = kToshibaACBits, bool strict = true);
+#endif
+#if DECODE_MIDEA
+ bool decodeMidea(decode_results *results, uint16_t nbits = kMideaBits,
+ bool strict = true);
+#endif
+#if DECODE_FUJITSU_AC
+ bool decodeFujitsuAC(decode_results *results, uint16_t nbits = kFujitsuAcBits,
+ bool strict = false);
+#endif
+#if DECODE_LASERTAG
+ bool decodeLasertag(decode_results *results, uint16_t nbits = kLasertagBits,
+ bool strict = true);
+#endif
+#if DECODE_CARRIER_AC
+ bool decodeCarrierAC(decode_results *results, uint16_t nbits = kCarrierAcBits,
+ bool strict = true);
+#endif
+#if DECODE_GREE
+ bool decodeGree(decode_results *results, uint16_t nbits = kGreeBits,
+ bool strict = true);
+#endif
+#if (DECODE_HAIER_AC | DECODE_HAIER_AC_YRW02)
+ bool decodeHaierAC(decode_results *results, uint16_t nbits = kHaierACBits,
+ bool strict = true);
+#endif
+#if DECODE_HAIER_AC_YRW02
+ bool decodeHaierACYRW02(decode_results *results,
+ uint16_t nbits = kHaierACYRW02Bits,
+ bool strict = true);
+#endif
+#if (DECODE_HITACHI_AC || DECODE_HITACHI_AC2)
+ bool decodeHitachiAC(decode_results *results, uint16_t nbits = kHitachiAcBits,
+ bool strict = true);
+#endif
+#if DECODE_HITACHI_AC1
+ bool decodeHitachiAC1(decode_results *results,
+ uint16_t nbits = kHitachiAc1Bits, bool strict = true);
+#endif
+#if DECODE_GICABLE
+ bool decodeGICable(decode_results *results, uint16_t nbits = kGicableBits,
+ bool strict = true);
+#endif
+#if DECODE_WHIRLPOOL_AC
+ bool decodeWhirlpoolAC(decode_results *results,
+ uint16_t nbits = kWhirlpoolAcBits, bool strict = true);
+#endif
+#if DECODE_LUTRON
+ bool decodeLutron(decode_results *results, uint16_t nbits = kLutronBits,
+ bool strict = true);
+#endif
+#if DECODE_ELECTRA_AC
+ bool decodeElectraAC(decode_results *results, uint16_t nbits = kElectraAcBits,
+ bool strict = true);
+#endif
+#if DECODE_PANASONIC_AC
+ bool decodePanasonicAC(decode_results *results,
+ uint16_t nbits = kPanasonicAcBits, bool strict = true);
+#endif
+#if DECODE_PIONEER
+ bool decodePioneer(decode_results *results,
+ const uint16_t nbits = kPioneerBits,
+ const bool strict = true);
+#endif
+#if DECODE_MWM
+ bool decodeMWM(decode_results *results, uint16_t nbits = 24,
+ bool strict = true);
+#endif
+};
+
+#endif // IRRECV_H_
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/IRremoteESP8266.h b/lib/IRremoteESP8266-2.5.2.03/src/IRremoteESP8266.h
new file mode 100644
index 000000000000..e228cbcb0a4f
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/IRremoteESP8266.h
@@ -0,0 +1,601 @@
+ /***************************************************
+ * IRremote for ESP8266
+ *
+ * Based on the IRremote library for Arduino by Ken Shirriff
+ * Version 0.11 August, 2009
+ * Copyright 2009 Ken Shirriff
+ * For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
+ *
+ * Edited by Mitra to add new controller SANYO
+ *
+ * Interrupt code based on NECIRrcv by Joe Knapp
+ * http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1210243556
+ * Also influenced by http://zovirl.com/2008/11/12/building-a-universal-remote-with-an-arduino/
+ *
+ * JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post)
+ * LG added by Darryl Smith (based on the JVC protocol)
+ * Whynter A/C ARC-110WD added by Francesco Meschia
+ * Coolix A/C / heatpump added by (send) bakrus & (decode) crankyoldgit
+ * Denon: sendDenon, decodeDenon added by Massimiliano Pinto
+ (from https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Denon.cpp)
+ * Kelvinator A/C and Sherwood added by crankyoldgit
+ * Mitsubishi (TV) sending added by crankyoldgit
+ * Pronto code sending added by crankyoldgit
+ * Mitsubishi & Toshiba A/C added by crankyoldgit
+ * (derived from https://github.com/r45635/HVAC-IR-Control)
+ * DISH decode by marcosamarinho
+ * Gree Heatpump sending added by Ville Skyttä (scop)
+ * (derived from https://github.com/ToniA/arduino-heatpumpir/blob/master/GreeHeatpumpIR.cpp)
+ * Updated by markszabo (https://github.com/markszabo/IRremoteESP8266) for sending IR code on ESP8266
+ * Updated by Sebastien Warin (http://sebastien.warin.fr) for receiving IR code on ESP8266
+ *
+ * Updated by sillyfrog for Daikin, adopted from
+ * (https://github.com/mharizanov/Daikin-AC-remote-control-over-the-Internet/)
+ * Fujitsu A/C code added by jonnygraham
+ * Trotec AC code by stufisher
+ * Carrier & Haier AC code by crankyoldgit
+ *
+ * GPL license, all text above must be included in any redistribution
+ ****************************************************/
+
+#ifndef IRREMOTEESP8266_H_
+#define IRREMOTEESP8266_H_
+
+#define __STDC_LIMIT_MACROS
+#include
+#ifdef UNIT_TEST
+#include
+#endif
+
+// Library Version
+#define _IRREMOTEESP8266_VERSION_ "2.5.2"
+// Supported IR protocols
+// Each protocol you include costs memory and, during decode, costs time
+// Disable (set to false) all the protocols you do not need/want!
+// The Air Conditioner protocols are the most expensive memory-wise.
+//
+/*
+#define DECODE_HASH true // Semi-unique code for unknown messages
+
+#define SEND_RAW true
+
+#define DECODE_NEC true
+#define SEND_NEC true
+
+#define DECODE_SHERWOOD true // Doesn't exist. Actually is DECODE_NEC
+#define SEND_SHERWOOD true
+
+#define DECODE_RC5 true
+#define SEND_RC5 true
+
+#define DECODE_RC6 true
+#define SEND_RC6 true
+
+#define DECODE_RCMM true
+#define SEND_RCMM true
+
+#define DECODE_SONY true
+#define SEND_SONY true
+
+#define DECODE_PANASONIC true
+#define SEND_PANASONIC true
+
+#define DECODE_JVC true
+#define SEND_JVC true
+
+#define DECODE_SAMSUNG true
+#define SEND_SAMSUNG true
+
+#define DECODE_SAMSUNG_AC true
+#define SEND_SAMSUNG_AC true
+
+#define DECODE_WHYNTER true
+#define SEND_WHYNTER true
+
+#define DECODE_AIWA_RC_T501 true
+#define SEND_AIWA_RC_T501 true
+
+#define DECODE_LG true
+#define SEND_LG true
+
+#define DECODE_SANYO true
+#define SEND_SANYO true
+
+#define DECODE_MITSUBISHI true
+#define SEND_MITSUBISHI true
+
+#define DECODE_MITSUBISHI2 true
+#define SEND_MITSUBISHI2 true
+
+#define DECODE_DISH true
+#define SEND_DISH true
+
+#define DECODE_SHARP true
+#define SEND_SHARP true
+
+#define DECODE_DENON true
+#define SEND_DENON true
+
+#define DECODE_KELVINATOR true
+#define SEND_KELVINATOR true
+
+#define DECODE_MITSUBISHI_AC true // Beta.
+#define SEND_MITSUBISHI_AC true
+
+#define DECODE_FUJITSU_AC true
+#define SEND_FUJITSU_AC true
+
+#define DECODE_DAIKIN true
+#define SEND_DAIKIN true
+
+#define DECODE_COOLIX true
+#define SEND_COOLIX true
+
+#define DECODE_GLOBALCACHE false // Not written.
+#define SEND_GLOBALCACHE true
+
+#define DECODE_GREE true
+#define SEND_GREE true
+
+#define DECODE_PRONTO false // Not written.
+#define SEND_PRONTO true
+
+#define DECODE_ARGO false // Not written.
+#define SEND_ARGO true
+
+#define DECODE_TROTEC false // Not implemented.
+#define SEND_TROTEC true
+
+#define DECODE_NIKAI true
+#define SEND_NIKAI true
+
+#define DECODE_TOSHIBA_AC true
+#define SEND_TOSHIBA_AC true
+
+#define DECODE_MAGIQUEST true
+#define SEND_MAGIQUEST true
+
+#define DECODE_MIDEA true
+#define SEND_MIDEA true
+
+#define DECODE_LASERTAG true
+#define SEND_LASERTAG true
+
+#define DECODE_CARRIER_AC true
+#define SEND_CARRIER_AC true
+
+#define DECODE_HAIER_AC true
+#define SEND_HAIER_AC true
+
+#define DECODE_HITACHI_AC true
+#define SEND_HITACHI_AC true
+
+#define DECODE_HITACHI_AC1 true
+#define SEND_HITACHI_AC1 true
+
+#define DECODE_HITACHI_AC2 true
+#define SEND_HITACHI_AC2 true
+
+#define DECODE_GICABLE true
+#define SEND_GICABLE true
+
+#define DECODE_HAIER_AC_YRW02 true
+#define SEND_HAIER_AC_YRW02 true
+
+#define DECODE_WHIRLPOOL_AC true
+#define SEND_WHIRLPOOL_AC true
+
+#define DECODE_LUTRON true
+#define SEND_LUTRON true
+
+#define DECODE_ELECTRA_AC true
+#define SEND_ELECTRA_AC true
+
+#define DECODE_PANASONIC_AC true
+#define SEND_PANASONIC_AC true
+
+#define DECODE_MWM true
+#define SEND_MWM true
+
+#define DECODE_PIONEER true
+#define SEND_PIONEER true
+*/
+
+// Tasmota supported protocols (less protocols is less code size)
+#define DECODE_HASH true // Semi-unique code for unknown messages
+
+#define SEND_RAW true
+
+#define DECODE_NEC true
+#define SEND_NEC true
+
+#define DECODE_SHERWOOD false // Doesn't exist. Actually is DECODE_NEC
+#define SEND_SHERWOOD false
+
+#define DECODE_RC5 true
+#define SEND_RC5 true
+
+#define DECODE_RC6 true
+#define SEND_RC6 true
+
+#define DECODE_RCMM false
+#define SEND_RCMM false
+
+#define DECODE_SONY true
+#define SEND_SONY true
+
+#define DECODE_PANASONIC true
+#define SEND_PANASONIC true
+
+#define DECODE_JVC true
+#define SEND_JVC true
+
+#define DECODE_SAMSUNG true
+#define SEND_SAMSUNG true
+
+#define DECODE_SAMSUNG_AC false
+#define SEND_SAMSUNG_AC false
+
+#define DECODE_WHYNTER false
+#define SEND_WHYNTER false
+
+#define DECODE_AIWA_RC_T501 false
+#define SEND_AIWA_RC_T501 false
+
+#define DECODE_LG true
+#define SEND_LG true
+
+#define DECODE_SANYO false
+#define SEND_SANYO false
+
+#define DECODE_MITSUBISHI false
+#define SEND_MITSUBISHI false
+
+#define DECODE_MITSUBISHI2 false
+#define SEND_MITSUBISHI2 false
+
+#define DECODE_DISH false
+#define SEND_DISH true
+
+#define DECODE_SHARP false
+#define SEND_SHARP false
+
+#define DECODE_DENON false
+#define SEND_DENON false
+
+#define DECODE_KELVINATOR false
+#define SEND_KELVINATOR false
+
+#define DECODE_MITSUBISHI_AC false // Beta.
+#define SEND_MITSUBISHI_AC true
+
+#define DECODE_FUJITSU_AC false
+#define SEND_FUJITSU_AC true
+
+#define DECODE_DAIKIN false
+#define SEND_DAIKIN false
+
+#define DECODE_COOLIX false
+#define SEND_COOLIX false
+
+#define DECODE_GLOBALCACHE false // Not written.
+#define SEND_GLOBALCACHE false
+
+#define DECODE_GREE false
+#define SEND_GREE false
+
+#define DECODE_PRONTO false // Not written.
+#define SEND_PRONTO false
+
+#define DECODE_ARGO false // Not written.
+#define SEND_ARGO false
+
+#define DECODE_TROTEC false // Not implemented.
+#define SEND_TROTEC false
+
+#define DECODE_NIKAI false
+#define SEND_NIKAI false
+
+#define DECODE_TOSHIBA_AC false
+#define SEND_TOSHIBA_AC false
+
+#define DECODE_MAGIQUEST false
+#define SEND_MAGIQUEST false
+
+#define DECODE_MIDEA false
+#define SEND_MIDEA false
+
+#define DECODE_LASERTAG false
+#define SEND_LASERTAG false
+
+#define DECODE_CARRIER_AC false
+#define SEND_CARRIER_AC false
+
+#define DECODE_HAIER_AC false
+#define SEND_HAIER_AC false
+
+#define DECODE_HITACHI_AC false
+#define SEND_HITACHI_AC false
+
+#define DECODE_HITACHI_AC1 false
+#define SEND_HITACHI_AC1 false
+
+#define DECODE_HITACHI_AC2 false
+#define SEND_HITACHI_AC2 false
+
+#define DECODE_GICABLE false
+#define SEND_GICABLE false
+
+#define DECODE_HAIER_AC_YRW02 false
+#define SEND_HAIER_AC_YRW02 false
+
+#define DECODE_WHIRLPOOL_AC false
+#define SEND_WHIRLPOOL_AC false
+
+#define DECODE_LUTRON false
+#define SEND_LUTRON false
+
+#define DECODE_ELECTRA_AC false
+#define SEND_ELECTRA_AC false
+
+#define DECODE_PANASONIC_AC false
+#define SEND_PANASONIC_AC false
+
+#define DECODE_MWM false
+#define SEND_MWM false
+
+#define DECODE_PIONEER false
+#define SEND_PIONEER false
+
+#if (DECODE_ARGO || DECODE_DAIKIN || DECODE_FUJITSU_AC || DECODE_GREE || \
+ DECODE_KELVINATOR || DECODE_MITSUBISHI_AC || DECODE_TOSHIBA_AC || \
+ DECODE_TROTEC || DECODE_HAIER_AC || DECODE_HITACHI_AC || \
+ DECODE_HITACHI_AC1 || DECODE_HITACHI_AC2 || DECODE_HAIER_AC_YRW02 || \
+ DECODE_WHIRLPOOL_AC || DECODE_SAMSUNG_AC || DECODE_ELECTRA_AC || \
+ DECODE_PANASONIC_AC || DECODE_MWM)
+#define DECODE_AC true // We need some common infrastructure for decoding A/Cs.
+#else
+#define DECODE_AC false // We don't need that infrastructure.
+#endif
+
+// Use millisecond 'delay()' calls where we can to avoid tripping the WDT.
+// Note: If you plan to send IR messages in the callbacks of the AsyncWebserver
+// library, you need to set ALLOW_DELAY_CALLS to false.
+// Ref: https://github.com/markszabo/IRremoteESP8266/issues/430
+#define ALLOW_DELAY_CALLS true
+
+/*
+ * Always add to the end of the list and should never remove entries
+ * or change order. Projects may save the type number for later usage
+ * so numbering should always stay the same.
+ */
+enum decode_type_t {
+ UNKNOWN = -1,
+ UNUSED = 0,
+ RC5,
+ RC6,
+ NEC,
+ SONY,
+ PANASONIC,
+ JVC,
+ SAMSUNG,
+ WHYNTER,
+ AIWA_RC_T501,
+ LG,
+ SANYO,
+ MITSUBISHI,
+ DISH,
+ SHARP,
+ COOLIX,
+ DAIKIN,
+ DENON,
+ KELVINATOR,
+ SHERWOOD,
+ MITSUBISHI_AC,
+ RCMM,
+ SANYO_LC7461,
+ RC5X,
+ GREE,
+ PRONTO, // Technically not a protocol, but an encoding.
+ NEC_LIKE,
+ ARGO,
+ TROTEC,
+ NIKAI,
+ RAW, // Technically not a protocol, but an encoding.
+ GLOBALCACHE, // Technically not a protocol, but an encoding.
+ TOSHIBA_AC,
+ FUJITSU_AC,
+ MIDEA,
+ MAGIQUEST,
+ LASERTAG,
+ CARRIER_AC,
+ HAIER_AC,
+ MITSUBISHI2,
+ HITACHI_AC,
+ HITACHI_AC1,
+ HITACHI_AC2,
+ GICABLE,
+ HAIER_AC_YRW02,
+ WHIRLPOOL_AC,
+ SAMSUNG_AC,
+ LUTRON,
+ ELECTRA_AC,
+ PANASONIC_AC,
+ PIONEER,
+ LG2,
+ MWM,
+};
+
+// Message lengths & required repeat values
+const uint16_t kNoRepeat = 0;
+const uint16_t kSingleRepeat = 1;
+
+const uint16_t kAiwaRcT501Bits = 15;
+const uint16_t kAiwaRcT501MinRepeats = kSingleRepeat;
+const uint16_t kArgoStateLength = 12;
+const uint16_t kCoolixBits = 24;
+const uint16_t kCarrierAcBits = 32;
+const uint16_t kCarrierAcMinRepeat = kNoRepeat;
+// Daikin has a lot of static stuff that is discarded
+const uint16_t kDaikinRawBits = 583;
+const uint16_t kDaikinStateLength = 27;
+const uint16_t kDaikinBits = kDaikinStateLength * 8;
+const uint16_t kDenonBits = 15;
+const uint16_t kDenonLegacyBits = 14;
+const uint16_t kDishBits = 16;
+const uint16_t kDishMinRepeat = 3;
+const uint16_t kElectraAcStateLength = 13;
+const uint16_t kElectraAcBits = kElectraAcStateLength * 8;
+const uint16_t kFujitsuAcMinRepeat = kNoRepeat;
+const uint16_t kFujitsuAcStateLength = 16;
+const uint16_t kFujitsuAcStateLengthShort = 7;
+const uint16_t kFujitsuAcBits = kFujitsuAcStateLength * 8;
+const uint16_t kFujitsuAcMinBits = (kFujitsuAcStateLengthShort - 1) * 8;
+const uint16_t kGicableBits = 16;
+const uint16_t kGicableMinRepeat = kSingleRepeat;
+const uint16_t kGreeStateLength = 8;
+const uint16_t kGreeBits = kGreeStateLength * 8;
+const uint16_t kHaierACStateLength = 9;
+const uint16_t kHaierACBits = kHaierACStateLength * 8;
+const uint16_t kHaierACYRW02StateLength = 14;
+const uint16_t kHaierACYRW02Bits = kHaierACYRW02StateLength * 8;
+const uint16_t kHitachiAcStateLength = 28;
+const uint16_t kHitachiAcBits = kHitachiAcStateLength * 8;
+const uint16_t kHitachiAc1StateLength = 13;
+const uint16_t kHitachiAc1Bits = kHitachiAc1StateLength * 8;
+const uint16_t kHitachiAc2StateLength = 53;
+const uint16_t kHitachiAc2Bits = kHitachiAc2StateLength * 8;
+const uint16_t kJvcBits = 16;
+const uint16_t kKelvinatorStateLength = 16;
+const uint16_t kKelvinatorBits = kKelvinatorStateLength * 8;
+const uint16_t kLasertagBits = 13;
+const uint16_t kLasertagMinRepeat = kNoRepeat;
+const uint16_t kLgBits = 28;
+const uint16_t kLg32Bits = 32;
+const uint16_t kLutronBits = 35;
+const uint16_t kMagiquestBits = 56;
+const uint16_t kMideaBits = 48;
+const uint16_t kMideaMinRepeat = kNoRepeat;
+const uint16_t kMitsubishiBits = 16;
+// TODO(anyone): Verify that the Mitsubishi repeat is really needed.
+// Based on marcosamarinho's code.
+const uint16_t kMitsubishiMinRepeat = kSingleRepeat;
+const uint16_t kMitsubishiACStateLength = 18;
+const uint16_t kMitsubishiACBits = kMitsubishiACStateLength * 8;
+const uint16_t kMitsubishiACMinRepeat = kSingleRepeat;
+const uint16_t kNikaiBits = 24;
+const uint16_t kNECBits = 32;
+const uint16_t kPanasonicBits = 48;
+const uint32_t kPanasonicManufacturer = 0x4004;
+const uint16_t kPanasonicAcStateLength = 27;
+const uint16_t kPanasonicAcStateShortLength = 16;
+const uint16_t kPanasonicAcBits = kPanasonicAcStateLength * 8;
+const uint16_t kPanasonicAcShortBits = kPanasonicAcStateShortLength * 8;
+const uint16_t kPioneerBits = 64;
+const uint16_t kProntoMinLength = 6;
+const uint16_t kRC5RawBits = 14;
+const uint16_t kRC5Bits = kRC5RawBits - 2;
+const uint16_t kRC5XBits = kRC5RawBits - 1;
+const uint16_t kRC6Mode0Bits = 20; // Excludes the 'start' bit.
+const uint16_t kRC6_36Bits = 36; // Excludes the 'start' bit.
+const uint16_t kRCMMBits = 24;
+const uint16_t kSamsungBits = 32;
+const uint16_t kSamsungAcStateLength = 14;
+const uint16_t kSamsungAcBits = kSamsungAcStateLength * 8;
+const uint16_t kSamsungAcExtendedStateLength = 21;
+const uint16_t kSamsungAcExtendedBits = kSamsungAcExtendedStateLength * 8;
+const uint16_t kSanyoSA8650BBits = 12;
+const uint16_t kSanyoLC7461AddressBits = 13;
+const uint16_t kSanyoLC7461CommandBits = 8;
+const uint16_t kSanyoLC7461Bits = (kSanyoLC7461AddressBits +
+ kSanyoLC7461CommandBits) * 2;
+const uint8_t kSharpAddressBits = 5;
+const uint8_t kSharpCommandBits = 8;
+const uint16_t kSharpBits = kSharpAddressBits + kSharpCommandBits + 2; // 15
+const uint8_t kSherwoodBits = kNECBits;
+const uint16_t kSherwoodMinRepeat = kSingleRepeat;
+const uint16_t kSony12Bits = 12;
+const uint16_t kSony15Bits = 15;
+const uint16_t kSony20Bits = 20;
+const uint16_t kSonyMinBits = 12;
+const uint16_t kSonyMinRepeat = 2;
+const uint16_t kToshibaACStateLength = 9;
+const uint16_t kToshibaACBits = kToshibaACStateLength * 8;
+const uint16_t kToshibaACMinRepeat = kSingleRepeat;
+const uint16_t kTrotecStateLength = 9;
+const uint16_t kWhirlpoolAcStateLength = 21;
+const uint16_t kWhirlpoolAcBits = kWhirlpoolAcStateLength * 8;
+const uint16_t kWhynterBits = 32;
+
+// Legacy defines. (Deprecated)
+#define AIWA_RC_T501_BITS kAiwaRcT501Bits
+#define ARGO_COMMAND_LENGTH kArgoStateLength
+#define COOLIX_BITS kCoolixBits
+#define CARRIER_AC_BITS kCarrierAcBits
+#define DAIKIN_COMMAND_LENGTH kDaikinStateLength
+#define DENON_BITS kDenonBits
+#define DENON_48_BITS kPanasonicBits
+#define DENON_LEGACY_BITS kDenonLegacyBits
+#define DISH_BITS kDishBits
+#define FUJITSU_AC_MIN_REPEAT kFujitsuAcMinRepeat
+#define FUJITSU_AC_STATE_LENGTH kFujitsuAcStateLength
+#define FUJITSU_AC_STATE_LENGTH_SHORT kFujitsuAcStateLengthShort
+#define FUJITSU_AC_BITS kFujitsuAcBits
+#define FUJITSU_AC_MIN_BITS kFujitsuAcMinBits
+#define GICABLE_BITS kGicableBits
+#define GREE_STATE_LENGTH kGreeStateLength
+#define HAIER_AC_STATE_LENGTH kHaierACStateLength
+#define HAIER_AC_YRW02_STATE_LENGTH kHaierACYRW02StateLength
+#define HITACHI_AC_STATE_LENGTH kHitachiAcStateLength
+#define HITACHI_AC_BITS kHitachiAcBits
+#define HITACHI_AC1_STATE_LENGTH kHitachiAc1StateLength
+#define HITACHI_AC1_BITS kHitachiAc1Bits
+#define HITACHI_AC2_STATE_LENGTH kHitachiAc2StateLength
+#define HITACHI_AC2_BITS kHitachiAc2Bits
+#define JVC_BITS kJvcBits
+#define KELVINATOR_STATE_LENGTH kKelvinatorStateLength
+#define LASERTAG_BITS kLasertagBits
+#define LG_BITS kLgBits
+#define LG32_BITS kLg32Bits
+#define MAGIQUEST_BITS kMagiquestBits
+#define MIDEA_BITS kMideaBits
+#define MITSUBISHI_BITS kMitsubishiBits
+#define MITSUBISHI_AC_STATE_LENGTH kMitsubishiACStateLength
+#define NEC_BITS kNECBits
+#define NIKAI_BITS kNikaiBits
+#define PANASONIC_BITS kPanasonicBits
+#define RC5_BITS kRC5Bits
+#define RC5X_BITS kRC5XBits
+#define RC6_MODE0_BITS kRC6Mode0Bits
+#define RC6_36_BITS kRC6_36Bits
+#define RCMM_BITS kRCMMBits
+#define SANYO_LC7461_BITS kSanyoLC7461Bits
+#define SAMSUNG_BITS kSamsungBits
+#define SANYO_SA8650B_BITS kSanyoSA8650BBits
+#define SHARP_BITS kSharpBits
+#define SHERWOOD_BITS kSherwoodBits
+#define SONY_12_BITS kSony12Bits
+#define SONY_15_BITS kSony15Bits
+#define SONY_20_BITS kSony20Bits
+#define TOSHIBA_AC_STATE_LENGTH kToshibaACStateLength
+#define TROTEC_COMMAND_LENGTH kTrotecStateLength
+#define WHYNTER_BITS kWhynterBits
+
+// Turn on Debugging information by uncommenting the following line.
+// #define DEBUG 1
+
+#ifdef DEBUG
+#ifdef UNIT_TEST
+#define DPRINT(x) do { std::cout << x; } while (0)
+#define DPRINTLN(x) do { std::cout << x << std::endl; } while (0)
+#endif // UNIT_TEST
+#ifdef ARDUINO
+#define DPRINT(x) do { Serial.print(x); } while (0)
+#define DPRINTLN(x) do { Serial.println(x); } while (0)
+#endif // ARDUINO
+#else // DEBUG
+#define DPRINT(x)
+#define DPRINTLN(x)
+#endif // DEBUG
+
+#endif // IRREMOTEESP8266_H_
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/IRsend.cpp b/lib/IRremoteESP8266-2.5.2.03/src/IRsend.cpp
new file mode 100644
index 000000000000..96f95172da0f
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/IRsend.cpp
@@ -0,0 +1,601 @@
+// Copyright 2009 Ken Shirriff
+// Copyright 2015 Mark Szabo
+// Copyright 2017 David Conran
+
+#include "IRsend.h"
+#ifndef UNIT_TEST
+#include
+#else
+#define __STDC_LIMIT_MACROS
+#include
+#endif
+#include
+#ifdef UNIT_TEST
+#include
+#endif
+#include "IRtimer.h"
+
+// Originally from https://github.com/shirriff/Arduino-IRremote/
+// Updated by markszabo (https://github.com/markszabo/IRremoteESP8266) for
+// sending IR code on ESP8266
+
+// IRsend ----------------------------------------------------------------------
+// Create an IRsend object.
+//
+// Args:
+// IRsendPin: Which GPIO pin to use when sending an IR command.
+// inverted: *DANGER* Optional flag to invert the output. (default = false)
+// e.g. LED is illuminated when GPIO is LOW rather than HIGH.
+// Setting this to something other than the default could
+// easily destroy your IR LED if you are overdriving it.
+// Unless you *REALLY* know what you are doing, don't change this.
+// use_modulation: Do we do frequency modulation during transmission?
+// i.e. If not, assume a 100% duty cycle. Ignore attempts
+// to change the duty cycle etc.
+// Returns:
+// An IRsend object.
+IRsend::IRsend(uint16_t IRsendPin, bool inverted, bool use_modulation)
+ : IRpin(IRsendPin), periodOffset(kPeriodOffset) {
+ if (inverted) {
+ outputOn = LOW;
+ outputOff = HIGH;
+ } else {
+ outputOn = HIGH;
+ outputOff = LOW;
+ }
+ modulation = use_modulation;
+ if (modulation)
+ _dutycycle = kDutyDefault;
+ else
+ _dutycycle = kDutyMax;
+}
+
+// Enable the pin for output.
+void IRsend::begin() {
+#ifndef UNIT_TEST
+ pinMode(IRpin, OUTPUT);
+#endif
+ ledOff(); // Ensure the LED is in a known safe state when we start.
+}
+
+// Turn off the IR LED.
+void IRsend::ledOff() {
+#ifndef UNIT_TEST
+ digitalWrite(IRpin, outputOff);
+#endif
+}
+
+// Turn on the IR LED.
+void IRsend::ledOn() {
+#ifndef UNIT_TEST
+ digitalWrite(IRpin, outputOn);
+#endif
+}
+
+// Calculate the period for a given frequency. (T = 1/f)
+//
+// Args:
+// freq: Frequency in Hz.
+// use_offset: Should we use the calculated offset or not?
+// Returns:
+// nr. of uSeconds.
+uint32_t IRsend::calcUSecPeriod(uint32_t hz, bool use_offset) {
+ if (hz == 0) hz = 1; // Avoid Zero hz. Divide by Zero is nasty.
+ uint32_t period =
+ (1000000UL + hz / 2) / hz; // The equiv of round(1000000/hz).
+ // Apply the offset and ensure we don't result in a <= 0 value.
+ if (use_offset)
+ return std::max((uint32_t)1, period + periodOffset);
+ else
+ return std::max((uint32_t)1, period);
+}
+
+// Set the output frequency modulation and duty cycle.
+//
+// Args:
+// freq: The freq we want to modulate at. Assumes < 1000 means kHz else Hz.
+// duty: Percentage duty cycle of the LED. e.g. 25 = 25% = 1/4 on, 3/4 off.
+// This is ignored if modulation is disabled at object instantiation.
+//
+// Note:
+// Integer timing functions & math mean we can't do fractions of
+// microseconds timing. Thus minor changes to the freq & duty values may have
+// limited effect. You've been warned.
+void IRsend::enableIROut(uint32_t freq, uint8_t duty) {
+ // Set the duty cycle to use if we want freq. modulation.
+ if (modulation) {
+ _dutycycle = std::min(duty, kDutyMax);
+ } else {
+ _dutycycle = kDutyMax;
+ }
+ if (freq < 1000) // Were we given kHz? Supports the old call usage.
+ freq *= 1000;
+ uint32_t period = calcUSecPeriod(freq);
+ // Nr. of uSeconds the LED will be on per pulse.
+ onTimePeriod = (period * _dutycycle) / kDutyMax;
+ // Nr. of uSeconds the LED will be off per pulse.
+ offTimePeriod = period - onTimePeriod;
+}
+
+#if ALLOW_DELAY_CALLS
+// An ESP8266 RTOS watch-dog timer friendly version of delayMicroseconds().
+// Args:
+// usec: Nr. of uSeconds to delay for.
+void IRsend::_delayMicroseconds(uint32_t usec) {
+ // delayMicroseconds() is only accurate to 16383us.
+ // Ref: https://www.arduino.cc/en/Reference/delayMicroseconds
+ if (usec <= kMaxAccurateUsecDelay) {
+#ifndef UNIT_TEST
+ delayMicroseconds(usec);
+#endif
+ } else {
+#ifndef UNIT_TEST
+ // Invoke a delay(), where possible, to avoid triggering the WDT.
+ delay(usec / 1000UL); // Delay for as many whole milliseconds as we can.
+ // Delay the remaining sub-millisecond.
+ delayMicroseconds(static_cast(usec % 1000UL));
+#endif
+ }
+}
+#else // ALLOW_DELAY_CALLS
+// A version of delayMicroseconds() that handles large values and does NOT use
+// the watch-dog friendly delay() calls where appropriate.
+// Args:
+// usec: Nr. of uSeconds to delay for.
+//
+// NOTE: Use this only if you know what you are doing as it may cause the WDT
+// to reset the ESP8266.
+void IRsend::_delayMicroseconds(uint32_t usec) {
+ for (; usec > kMaxAccurateUsecDelay; usec -= kMaxAccurateUsecDelay)
+#ifndef UNIT_TEST
+ delayMicroseconds(kMaxAccurateUsecDelay);
+ delayMicroseconds(static_cast(usec));
+#endif // UNIT_TEST
+}
+#endif // ALLOW_DELAY_CALLS
+
+// Modulate the IR LED for the given period (usec) and at the duty cycle set.
+//
+// Args:
+// usec: The period of time to modulate the IR LED for, in microseconds.
+// Returns:
+// Nr. of pulses actually sent.
+//
+// Note:
+// The ESP8266 has no good way to do hardware PWM, so we have to do it all
+// in software. There is a horrible kludge/brilliant hack to use the second
+// serial TX line to do fairly accurate hardware PWM, but it is only
+// available on a single specific GPIO and only available on some modules.
+// e.g. It's not available on the ESP-01 module.
+// Hence, for greater compatibility & choice, we don't use that method.
+// Ref:
+// https://www.analysir.com/blog/2017/01/29/updated-esp8266-nodemcu-backdoor-upwm-hack-for-ir-signals/
+uint16_t IRsend::mark(uint16_t usec) {
+ // Handle the simple case of no required frequency modulation.
+ if (!modulation || _dutycycle >= 100) {
+ ledOn();
+ _delayMicroseconds(usec);
+ ledOff();
+ return 1;
+ }
+
+ // Not simple, so do it assuming frequency modulation.
+ uint16_t counter = 0;
+ IRtimer usecTimer = IRtimer();
+ // Cache the time taken so far. This saves us calling time, and we can be
+ // assured that we can't have odd math problems. i.e. unsigned under/overflow.
+ uint32_t elapsed = usecTimer.elapsed();
+
+ while (elapsed < usec) { // Loop until we've met/exceeded our required time.
+ ledOn();
+ // Calculate how long we should pulse on for.
+ // e.g. Are we to close to the end of our requested mark time (usec)?
+ _delayMicroseconds(std::min((uint32_t)onTimePeriod, usec - elapsed));
+ ledOff();
+ counter++;
+ if (elapsed + onTimePeriod >= usec)
+ return counter; // LED is now off & we've passed our allotted time.
+ // Wait for the lesser of the rest of the duty cycle, or the time remaining.
+ _delayMicroseconds(
+ std::min(usec - elapsed - onTimePeriod, (uint32_t)offTimePeriod));
+ elapsed = usecTimer.elapsed(); // Update & recache the actual elapsed time.
+ }
+ return counter;
+}
+
+// Turn the pin (LED) off for a given time.
+// Sends an IR space for the specified number of microseconds.
+// A space is no output, so the PWM output is disabled.
+//
+// Args:
+// time: Time in microseconds (us).
+void IRsend::space(uint32_t time) {
+ ledOff();
+ if (time == 0) return;
+ _delayMicroseconds(time);
+}
+
+// Calculate & set any offsets to account for execution times.
+//
+// Args:
+// hz: The frequency to calibrate at >= 1000Hz. Default is 38000Hz.
+//
+// Returns:
+// The calculated period offset (in uSeconds) which is now in use. e.g. -5.
+//
+// Status: Stable / Working.
+//
+// NOTE:
+// This will generate an 65535us mark() IR LED signal.
+// This only needs to be called once, if at all.
+int8_t IRsend::calibrate(uint16_t hz) {
+ if (hz < 1000) // Were we given kHz? Supports the old call usage.
+ hz *= 1000;
+ periodOffset = 0; // Turn off any existing offset while we calibrate.
+ enableIROut(hz);
+ IRtimer usecTimer = IRtimer(); // Start a timer *just* before we do the call.
+ uint16_t pulses = mark(UINT16_MAX); // Generate a PWM of 65,535 us. (Max.)
+ uint32_t timeTaken = usecTimer.elapsed(); // Record the time it took.
+ // While it shouldn't be necessary, assume at least 1 pulse, to avoid a
+ // divide by 0 situation.
+ pulses = std::max(pulses, (uint16_t)1U);
+ uint32_t calcPeriod = calcUSecPeriod(hz); // e.g. @38kHz it should be 26us.
+ // Assuming 38kHz for the example calculations:
+ // In a 65535us pulse, we should have 2520.5769 pulses @ 26us periods.
+ // e.g. 65535.0us / 26us = 2520.5769
+ // This should have caused approx 2520 loops through the main loop in mark().
+ // The average over that many interations should give us a reasonable
+ // approximation at what offset we need to use to account for instruction
+ // execution times.
+ //
+ // Calculate the actual period from the actual time & the actual pulses
+ // generated.
+ double_t actualPeriod = (double_t)timeTaken / (double_t)pulses;
+ // Store the difference between the actual time per period vs. calculated.
+ periodOffset = (int8_t)((double_t)calcPeriod - actualPeriod);
+ return periodOffset;
+}
+
+// Generic method for sending data that is common to most protocols.
+// Will send leading or trailing 0's if the nbits is larger than the number
+// of bits in data.
+//
+// Args:
+// onemark: Nr. of usecs for the led to be pulsed for a '1' bit.
+// onespace: Nr. of usecs for the led to be fully off for a '1' bit.
+// zeromark: Nr. of usecs for the led to be pulsed for a '0' bit.
+// zerospace: Nr. of usecs for the led to be fully off for a '0' bit.
+// data: The data to be transmitted.
+// nbits: Nr. of bits of data to be sent.
+// MSBfirst: Flag for bit transmission order. Defaults to MSB->LSB order.
+void IRsend::sendData(uint16_t onemark, uint32_t onespace, uint16_t zeromark,
+ uint32_t zerospace, uint64_t data, uint16_t nbits,
+ bool MSBfirst) {
+ if (nbits == 0) // If we are asked to send nothing, just return.
+ return;
+ if (MSBfirst) { // Send the MSB first.
+ // Send 0's until we get down to a bit size we can actually manage.
+ while (nbits > sizeof(data) * 8) {
+ mark(zeromark);
+ space(zerospace);
+ nbits--;
+ }
+ // Send the supplied data.
+ for (uint64_t mask = 1ULL << (nbits - 1); mask; mask >>= 1)
+ if (data & mask) { // Send a 1
+ mark(onemark);
+ space(onespace);
+ } else { // Send a 0
+ mark(zeromark);
+ space(zerospace);
+ }
+ } else { // Send the Least Significant Bit (LSB) first / MSB last.
+ for (uint16_t bit = 0; bit < nbits; bit++, data >>= 1)
+ if (data & 1) { // Send a 1
+ mark(onemark);
+ space(onespace);
+ } else { // Send a 0
+ mark(zeromark);
+ space(zerospace);
+ }
+ }
+}
+
+// Generic method for sending simple protocol messages.
+// Will send leading or trailing 0's if the nbits is larger than the number
+// of bits in data.
+//
+// Args:
+// headermark: Nr. of usecs for the led to be pulsed for the header mark.
+// A value of 0 means no header mark.
+// headerspace: Nr. of usecs for the led to be off after the header mark.
+// A value of 0 means no header space.
+// onemark: Nr. of usecs for the led to be pulsed for a '1' bit.
+// onespace: Nr. of usecs for the led to be fully off for a '1' bit.
+// zeromark: Nr. of usecs for the led to be pulsed for a '0' bit.
+// zerospace: Nr. of usecs for the led to be fully off for a '0' bit.
+// footermark: Nr. of usecs for the led to be pulsed for the footer mark.
+// A value of 0 means no footer mark.
+// gap: Nr. of usecs for the led to be off after the footer mark.
+// This is effectively the gap between messages.
+// A value of 0 means no gap space.
+// data: The data to be transmitted.
+// nbits: Nr. of bits of data to be sent.
+// frequency: The frequency we want to modulate at.
+// Assumes < 1000 means kHz otherwise it is in Hz.
+// Most common value is 38000 or 38, for 38kHz.
+// MSBfirst: Flag for bit transmission order. Defaults to MSB->LSB order.
+// repeat: Nr. of extra times the message will be sent.
+// e.g. 0 = 1 message sent, 1 = 1 initial + 1 repeat = 2 messages
+// dutycycle: Percentage duty cycle of the LED.
+// e.g. 25 = 25% = 1/4 on, 3/4 off.
+// If you are not sure, try 50 percent.
+void IRsend::sendGeneric(const uint16_t headermark, const uint32_t headerspace,
+ const uint16_t onemark, const uint32_t onespace,
+ const uint16_t zeromark, const uint32_t zerospace,
+ const uint16_t footermark, const uint32_t gap,
+ const uint64_t data, const uint16_t nbits,
+ const uint16_t frequency, const bool MSBfirst,
+ const uint16_t repeat, const uint8_t dutycycle) {
+ sendGeneric(headermark, headerspace, onemark, onespace, zeromark, zerospace,
+ footermark, gap, 0U, data, nbits, frequency, MSBfirst, repeat,
+ dutycycle);
+}
+
+// Generic method for sending simple protocol messages.
+// Will send leading or trailing 0's if the nbits is larger than the number
+// of bits in data.
+//
+// Args:
+// headermark: Nr. of usecs for the led to be pulsed for the header mark.
+// A value of 0 means no header mark.
+// headerspace: Nr. of usecs for the led to be off after the header mark.
+// A value of 0 means no header space.
+// onemark: Nr. of usecs for the led to be pulsed for a '1' bit.
+// onespace: Nr. of usecs for the led to be fully off for a '1' bit.
+// zeromark: Nr. of usecs for the led to be pulsed for a '0' bit.
+// zerospace: Nr. of usecs for the led to be fully off for a '0' bit.
+// footermark: Nr. of usecs for the led to be pulsed for the footer mark.
+// A value of 0 means no footer mark.
+// gap: Min. nr. of usecs for the led to be off after the footer mark.
+// This is effectively the absolute minimum gap between messages.
+// mesgtime: Min. nr. of usecs a single message needs to be.
+// This is effectively the min. total length of a single message.
+// data: The data to be transmitted.
+// nbits: Nr. of bits of data to be sent.
+// frequency: The frequency we want to modulate at.
+// Assumes < 1000 means kHz otherwise it is in Hz.
+// Most common value is 38000 or 38, for 38kHz.
+// MSBfirst: Flag for bit transmission order. Defaults to MSB->LSB order.
+// repeat: Nr. of extra times the message will be sent.
+// e.g. 0 = 1 message sent, 1 = 1 initial + 1 repeat = 2 messages
+// dutycycle: Percentage duty cycle of the LED.
+// e.g. 25 = 25% = 1/4 on, 3/4 off.
+// If you are not sure, try 50 percent.
+void IRsend::sendGeneric(const uint16_t headermark, const uint32_t headerspace,
+ const uint16_t onemark, const uint32_t onespace,
+ const uint16_t zeromark, const uint32_t zerospace,
+ const uint16_t footermark, const uint32_t gap,
+ const uint32_t mesgtime, const uint64_t data,
+ const uint16_t nbits, const uint16_t frequency,
+ const bool MSBfirst, const uint16_t repeat,
+ const uint8_t dutycycle) {
+ // Setup
+ enableIROut(frequency, dutycycle);
+ IRtimer usecs = IRtimer();
+
+ // We always send a message, even for repeat=0, hence '<= repeat'.
+ for (uint16_t r = 0; r <= repeat; r++) {
+ usecs.reset();
+
+ // Header
+ if (headermark) mark(headermark);
+ if (headerspace) space(headerspace);
+
+ // Data
+ sendData(onemark, onespace, zeromark, zerospace, data, nbits, MSBfirst);
+
+ // Footer
+ if (footermark) mark(footermark);
+ uint32_t elapsed = usecs.elapsed();
+ // Avoid potential unsigned integer underflow. e.g. when mesgtime is 0.
+ if (elapsed >= mesgtime)
+ space(gap);
+ else
+ space(std::max(gap, mesgtime - elapsed));
+ }
+}
+
+// Generic method for sending simple protocol messages.
+//
+// Args:
+// headermark: Nr. of usecs for the led to be pulsed for the header mark.
+// A value of 0 means no header mark.
+// headerspace: Nr. of usecs for the led to be off after the header mark.
+// A value of 0 means no header space.
+// onemark: Nr. of usecs for the led to be pulsed for a '1' bit.
+// onespace: Nr. of usecs for the led to be fully off for a '1' bit.
+// zeromark: Nr. of usecs for the led to be pulsed for a '0' bit.
+// zerospace: Nr. of usecs for the led to be fully off for a '0' bit.
+// footermark: Nr. of usecs for the led to be pulsed for the footer mark.
+// A value of 0 means no footer mark.
+// gap: Nr. of usecs for the led to be off after the footer mark.
+// This is effectively the gap between messages.
+// A value of 0 means no gap space.
+// dataptr: Pointer to the data to be transmitted.
+// nbytes: Nr. of bytes of data to be sent.
+// frequency: The frequency we want to modulate at.
+// Assumes < 1000 means kHz otherwise it is in Hz.
+// Most common value is 38000 or 38, for 38kHz.
+// MSBfirst: Flag for bit transmission order. Defaults to MSB->LSB order.
+// repeat: Nr. of extra times the message will be sent.
+// e.g. 0 = 1 message sent, 1 = 1 initial + 1 repeat = 2 messages
+// dutycycle: Percentage duty cycle of the LED.
+// e.g. 25 = 25% = 1/4 on, 3/4 off.
+// If you are not sure, try 50 percent.
+void IRsend::sendGeneric(const uint16_t headermark, const uint32_t headerspace,
+ const uint16_t onemark, const uint32_t onespace,
+ const uint16_t zeromark, const uint32_t zerospace,
+ const uint16_t footermark, const uint32_t gap,
+ const uint8_t *dataptr, const uint16_t nbytes,
+ const uint16_t frequency, const bool MSBfirst,
+ const uint16_t repeat, const uint8_t dutycycle) {
+ // Setup
+ enableIROut(frequency, dutycycle);
+ // We always send a message, even for repeat=0, hence '<= repeat'.
+ for (uint16_t r = 0; r <= repeat; r++) {
+ // Header
+ if (headermark) mark(headermark);
+ if (headerspace) space(headerspace);
+
+ // Data
+ for (uint16_t i = 0; i < nbytes; i++)
+ sendData(onemark, onespace, zeromark, zerospace, *(dataptr + i), 8,
+ MSBfirst);
+
+ // Footer
+ if (footermark) mark(footermark);
+ space(gap);
+ }
+}
+
+#if SEND_RAW
+// Send a raw IRremote message.
+//
+// Args:
+// buf: An array of uint16_t's that has microseconds elements.
+// len: Nr. of elements in the buf[] array.
+// hz: Frequency to send the message at. (kHz < 1000; Hz >= 1000)
+//
+// Status: STABLE / Known working.
+//
+// Notes:
+// Even elements are Mark times (On), Odd elements are Space times (Off).
+//
+// Ref:
+// examples/IRrecvDumpV2/IRrecvDumpV2.ino
+void IRsend::sendRaw(uint16_t buf[], uint16_t len, uint16_t hz) {
+ // Set IR carrier frequency
+ enableIROut(hz);
+ for (uint16_t i = 0; i < len; i++) {
+ if (i & 1) { // Odd bit.
+ space(buf[i]);
+ } else { // Even bit.
+ mark(buf[i]);
+ }
+ }
+ ledOff(); // We potentially have ended with a mark(), so turn of the LED.
+}
+#endif // SEND_RAW
+
+#ifndef UNIT_TEST
+void IRsend::send(uint16_t type, uint64_t data, uint16_t nbits) {
+ switch (type) {
+#if SEND_NEC
+ case NEC:
+ sendNEC(data, nbits);
+ break;
+#endif
+#if SEND_SONY
+ case SONY:
+ sendSony(data, nbits);
+ break;
+#endif
+#if SEND_RC5
+ case RC5:
+ sendRC5(data, nbits);
+ break;
+#endif
+#if SEND_RC6
+ case RC6:
+ sendRC6(data, nbits);
+ break;
+#endif
+#if SEND_DISH
+ case DISH:
+ sendDISH(data, nbits);
+ break;
+#endif
+#if SEND_JVC
+ case JVC:
+ sendJVC(data, nbits);
+ break;
+#endif
+#if SEND_SAMSUNG
+ case SAMSUNG:
+ sendSAMSUNG(data, nbits);
+ break;
+#endif
+#if SEND_LG
+ case LG:
+ sendLG(data, nbits);
+ break;
+#endif
+#if SEND_LG
+ case LG2:
+ sendLG2(data, nbits);
+ break;
+#endif
+#if SEND_WHYNTER
+ case WHYNTER:
+ sendWhynter(data, nbits);
+ break;
+#endif
+#if SEND_COOLIX
+ case COOLIX:
+ sendCOOLIX(data, nbits);
+ break;
+#endif
+#if SEND_DENON
+ case DENON:
+ sendDenon(data, nbits);
+ break;
+#endif
+#if SEND_SHERWOOD
+ case SHERWOOD:
+ sendSherwood(data, nbits);
+ break;
+#endif
+#if SEND_RCMM
+ case RCMM:
+ sendRCMM(data, nbits);
+ break;
+#endif
+#if SEND_MITSUBISHI
+ case MITSUBISHI:
+ sendMitsubishi(data, nbits);
+ break;
+#endif
+#if SEND_MITSUBISHI2
+ case MITSUBISHI2:
+ sendMitsubishi2(data, nbits);
+ break;
+#endif
+#if SEND_SHARP
+ case SHARP:
+ sendSharpRaw(data, nbits);
+ break;
+#endif
+#if SEND_AIWA_RC_T501
+ case AIWA_RC_T501:
+ sendAiwaRCT501(data, nbits);
+ break;
+#endif
+#if SEND_MIDEA
+ case MIDEA:
+ sendMidea(data, nbits);
+ break;
+#endif
+#if SEND_GICABLE
+ case GICABLE:
+ sendGICable(data, nbits);
+ break;
+#endif
+#if SEND_PIONEER
+ case PIONEER:
+ sendPioneer(data, nbits);
+ break;
+#endif
+ }
+}
+#endif
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/IRsend.h b/lib/IRremoteESP8266-2.5.2.03/src/IRsend.h
new file mode 100644
index 000000000000..8e2dc248e178
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/IRsend.h
@@ -0,0 +1,333 @@
+// Copyright 2009 Ken Shirriff
+// Copyright 2015 Mark Szabo
+// Copyright 2017 David Conran
+#ifndef IRSEND_H_
+#define IRSEND_H_
+
+#define __STDC_LIMIT_MACROS
+#include
+#include "IRremoteESP8266.h"
+
+// Originally from https://github.com/shirriff/Arduino-IRremote/
+// Updated by markszabo (https://github.com/markszabo/IRremoteESP8266) for
+// sending IR code on ESP8266
+
+#if TEST || UNIT_TEST
+#define VIRTUAL virtual
+#else
+#define VIRTUAL
+#endif
+
+// Constants
+// Offset (in microseconds) to use in Period time calculations to account for
+// code excution time in producing the software PWM signal.
+// Value was calculated on Wemos D1 mini using v2.4.1 with v2.4.0 ESP core
+const int8_t kPeriodOffset = -5;
+const uint8_t kDutyDefault = 50; // Percentage
+const uint8_t kDutyMax = 100; // Percentage
+// delayMicroseconds() is only accurate to 16383us.
+// Ref: https://www.arduino.cc/en/Reference/delayMicroseconds
+const uint16_t kMaxAccurateUsecDelay = 16383;
+
+// Classes
+class IRsend {
+ public:
+ explicit IRsend(uint16_t IRsendPin, bool inverted = false,
+ bool use_modulation = true);
+ void begin();
+ void enableIROut(uint32_t freq, uint8_t duty = kDutyDefault);
+ VIRTUAL void _delayMicroseconds(uint32_t usec);
+ VIRTUAL uint16_t mark(uint16_t usec);
+ VIRTUAL void space(uint32_t usec);
+ int8_t calibrate(uint16_t hz = 38000U);
+ void sendRaw(uint16_t buf[], uint16_t len, uint16_t hz);
+ void sendData(uint16_t onemark, uint32_t onespace, uint16_t zeromark,
+ uint32_t zerospace, uint64_t data, uint16_t nbits,
+ bool MSBfirst = true);
+ void sendGeneric(const uint16_t headermark, const uint32_t headerspace,
+ const uint16_t onemark, const uint32_t onespace,
+ const uint16_t zeromark, const uint32_t zerospace,
+ const uint16_t footermark, const uint32_t gap,
+ const uint64_t data, const uint16_t nbits,
+ const uint16_t frequency, const bool MSBfirst,
+ const uint16_t repeat, const uint8_t dutycycle);
+ void sendGeneric(const uint16_t headermark, const uint32_t headerspace,
+ const uint16_t onemark, const uint32_t onespace,
+ const uint16_t zeromark, const uint32_t zerospace,
+ const uint16_t footermark, const uint32_t gap,
+ const uint32_t mesgtime, const uint64_t data,
+ const uint16_t nbits, const uint16_t frequency,
+ const bool MSBfirst, const uint16_t repeat,
+ const uint8_t dutycycle);
+ void sendGeneric(const uint16_t headermark, const uint32_t headerspace,
+ const uint16_t onemark, const uint32_t onespace,
+ const uint16_t zeromark, const uint32_t zerospace,
+ const uint16_t footermark, const uint32_t gap,
+ const uint8_t *dataptr, const uint16_t nbytes,
+ const uint16_t frequency, const bool MSBfirst,
+ const uint16_t repeat, const uint8_t dutycycle);
+ void send(uint16_t type, uint64_t data, uint16_t nbits);
+#if (SEND_NEC || SEND_SHERWOOD || SEND_AIWA_RC_T501 || SEND_SANYO)
+ void sendNEC(uint64_t data, uint16_t nbits = kNECBits,
+ uint16_t repeat = kNoRepeat);
+ uint32_t encodeNEC(uint16_t address, uint16_t command);
+#endif
+#if SEND_SONY
+ // sendSony() should typically be called with repeat=2 as Sony devices
+ // expect the code to be sent at least 3 times. (code + 2 repeats = 3 codes)
+ // Legacy use of this procedure was to only send a single code so call it with
+ // repeat=0 for backward compatibility. As of v2.0 it defaults to sending
+ // a Sony command that will be accepted be a device.
+ void sendSony(uint64_t data, uint16_t nbits = kSony20Bits,
+ uint16_t repeat = kSonyMinRepeat);
+ uint32_t encodeSony(uint16_t nbits, uint16_t command, uint16_t address,
+ uint16_t extended = 0);
+#endif
+#if SEND_SHERWOOD
+ void sendSherwood(uint64_t data, uint16_t nbits = kSherwoodBits,
+ uint16_t repeat = kSherwoodMinRepeat);
+#endif
+#if SEND_SAMSUNG
+ void sendSAMSUNG(uint64_t data, uint16_t nbits = kSamsungBits,
+ uint16_t repeat = kNoRepeat);
+ uint32_t encodeSAMSUNG(uint8_t customer, uint8_t command);
+#endif
+#if SEND_SAMSUNG_AC
+ void sendSamsungAC(unsigned char data[],
+ uint16_t nbytes = kSamsungAcStateLength,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_LG
+ void sendLG(uint64_t data, uint16_t nbits = kLgBits,
+ uint16_t repeat = kNoRepeat);
+ void sendLG2(uint64_t data, uint16_t nbits = kLgBits,
+ uint16_t repeat = kNoRepeat);
+ uint32_t encodeLG(uint16_t address, uint16_t command);
+#endif
+#if (SEND_SHARP || SEND_DENON)
+ uint32_t encodeSharp(uint16_t address, uint16_t command,
+ uint16_t expansion = 1, uint16_t check = 0,
+ bool MSBfirst = false);
+ void sendSharp(uint16_t address, uint16_t command,
+ uint16_t nbits = kSharpBits, uint16_t repeat = kNoRepeat);
+ void sendSharpRaw(uint64_t data, uint16_t nbits = kSharpBits,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_JVC
+ void sendJVC(uint64_t data, uint16_t nbits = kJvcBits,
+ uint16_t repeat = kNoRepeat);
+ uint16_t encodeJVC(uint8_t address, uint8_t command);
+#endif
+#if SEND_DENON
+ void sendDenon(uint64_t data, uint16_t nbits = DENON_BITS,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_SANYO
+ uint64_t encodeSanyoLC7461(uint16_t address, uint8_t command);
+ void sendSanyoLC7461(uint64_t data, uint16_t nbits = kSanyoLC7461Bits,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_DISH
+ // sendDISH() should typically be called with repeat=3 as DISH devices
+ // expect the code to be sent at least 4 times. (code + 3 repeats = 4 codes)
+ // Legacy use of this procedure was only to send a single code
+ // so use repeat=0 for backward compatibility.
+ void sendDISH(uint64_t data, uint16_t nbits = kDishBits,
+ uint16_t repeat = kDishMinRepeat);
+#endif
+#if (SEND_PANASONIC || SEND_DENON)
+ void sendPanasonic64(uint64_t data, uint16_t nbits = kPanasonicBits,
+ uint16_t repeat = kNoRepeat);
+ void sendPanasonic(uint16_t address, uint32_t data,
+ uint16_t nbits = kPanasonicBits,
+ uint16_t repeat = kNoRepeat);
+ uint64_t encodePanasonic(uint16_t manufacturer, uint8_t device,
+ uint8_t subdevice, uint8_t function);
+#endif
+#if SEND_RC5
+ void sendRC5(uint64_t data, uint16_t nbits = kRC5XBits,
+ uint16_t repeat = kNoRepeat);
+ uint16_t encodeRC5(uint8_t address, uint8_t command,
+ bool key_released = false);
+ uint16_t encodeRC5X(uint8_t address, uint8_t command,
+ bool key_released = false);
+ uint64_t toggleRC5(uint64_t data);
+#endif
+#if SEND_RC6
+ void sendRC6(uint64_t data, uint16_t nbits = kRC6Mode0Bits,
+ uint16_t repeat = kNoRepeat);
+ uint64_t encodeRC6(uint32_t address, uint8_t command,
+ uint16_t mode = kRC6Mode0Bits);
+ uint64_t toggleRC6(uint64_t data, uint16_t nbits = kRC6Mode0Bits);
+#endif
+#if SEND_RCMM
+ void sendRCMM(uint64_t data, uint16_t nbits = kRCMMBits,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_COOLIX
+ void sendCOOLIX(uint64_t data, uint16_t nbits = kCoolixBits,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_WHYNTER
+ void sendWhynter(uint64_t data, uint16_t nbits = kWhynterBits,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_MITSUBISHI
+ void sendMitsubishi(uint64_t data, uint16_t nbits = kMitsubishiBits,
+ uint16_t repeat = kMitsubishiMinRepeat);
+#endif
+#if SEND_MITSUBISHI2
+ void sendMitsubishi2(uint64_t data, uint16_t nbits = kMitsubishiBits,
+ uint16_t repeat = kMitsubishiMinRepeat);
+#endif
+#if SEND_MITSUBISHI_AC
+ void sendMitsubishiAC(unsigned char data[],
+ uint16_t nbytes = kMitsubishiACStateLength,
+ uint16_t repeat = kMitsubishiACMinRepeat);
+#endif
+#if SEND_FUJITSU_AC
+ void sendFujitsuAC(unsigned char data[], uint16_t nbytes,
+ uint16_t repeat = kFujitsuAcMinRepeat);
+#endif
+#if SEND_GLOBALCACHE
+ void sendGC(uint16_t buf[], uint16_t len);
+#endif
+#if SEND_KELVINATOR
+ void sendKelvinator(unsigned char data[],
+ uint16_t nbytes = kKelvinatorStateLength,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_DAIKIN
+ void sendDaikin(unsigned char data[], uint16_t nbytes = kDaikinStateLength,
+ uint16_t repeat = kNoRepeat);
+ void sendDaikinGapHeader();
+#endif
+#if SEND_AIWA_RC_T501
+ void sendAiwaRCT501(uint64_t data, uint16_t nbits = kAiwaRcT501Bits,
+ uint16_t repeat = kAiwaRcT501MinRepeats);
+#endif
+#if SEND_GREE
+ void sendGree(uint64_t data, uint16_t nbits = kGreeBits,
+ uint16_t repeat = kNoRepeat);
+ void sendGree(uint8_t data[], uint16_t nbytes = kGreeStateLength,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_PRONTO
+ void sendPronto(uint16_t data[], uint16_t len, uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_ARGO
+ void sendArgo(unsigned char data[], uint16_t nbytes = kArgoStateLength,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_TROTEC
+ void sendTrotec(unsigned char data[], uint16_t nbytes = kTrotecStateLength,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_NIKAI
+ void sendNikai(uint64_t data, uint16_t nbits = kNikaiBits,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_TOSHIBA_AC
+ void sendToshibaAC(unsigned char data[],
+ uint16_t nbytes = kToshibaACStateLength,
+ uint16_t repeat = kToshibaACMinRepeat);
+#endif
+#if SEND_MIDEA
+ void sendMidea(uint64_t data, uint16_t nbits = kMideaBits,
+ uint16_t repeat = kMideaMinRepeat);
+#endif
+#if SEND_MAGIQUEST
+ void sendMagiQuest(uint64_t data, uint16_t nbits = kMagiquestBits,
+ uint16_t repeat = kNoRepeat);
+ uint64_t encodeMagiQuest(uint32_t wand_id, uint16_t magnitude);
+#endif
+#if SEND_LASERTAG
+ void sendLasertag(uint64_t data, uint16_t nbits = kLasertagBits,
+ uint16_t repeat = kLasertagMinRepeat);
+#endif
+#if SEND_CARRIER_AC
+ void sendCarrierAC(uint64_t data, uint16_t nbits = kCarrierAcBits,
+ uint16_t repeat = kCarrierAcMinRepeat);
+#endif
+#if (SEND_HAIER_AC || SEND_HAIER_AC_YRW02)
+ void sendHaierAC(unsigned char data[], uint16_t nbytes = kHaierACStateLength,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_HAIER_AC_YRW02
+ void sendHaierACYRW02(unsigned char data[],
+ uint16_t nbytes = kHaierACYRW02StateLength,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_HITACHI_AC
+ void sendHitachiAC(unsigned char data[],
+ uint16_t nbytes = kHitachiAcStateLength,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_HITACHI_AC1
+ void sendHitachiAC1(unsigned char data[],
+ uint16_t nbytes = kHitachiAc1StateLength,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_HITACHI_AC2
+ void sendHitachiAC2(unsigned char data[],
+ uint16_t nbytes = kHitachiAc2StateLength,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_GICABLE
+ void sendGICable(uint64_t data, uint16_t nbits = kGicableBits,
+ uint16_t repeat = kGicableMinRepeat);
+#endif
+#if SEND_WHIRLPOOL_AC
+ void sendWhirlpoolAC(unsigned char data[],
+ uint16_t nbytes = kWhirlpoolAcStateLength,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_LUTRON
+ void sendLutron(uint64_t data, uint16_t nbits = kLutronBits,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_ELECTRA_AC
+ void sendElectraAC(unsigned char data[],
+ uint16_t nbytes = kElectraAcStateLength,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_PANASONIC_AC
+ void sendPanasonicAC(unsigned char data[],
+ uint16_t nbytes = kPanasonicAcStateLength,
+ uint16_t repeat = kNoRepeat);
+#endif
+#if SEND_PIONEER
+ void sendPioneer(const uint64_t data, const uint16_t nbits = kPioneerBits,
+ const uint16_t repeat = kNoRepeat);
+ uint64_t encodePioneer(uint16_t address, uint16_t command);
+#endif
+#if SEND_MWM
+ void sendMWM(unsigned char data[], uint16_t nbytes,
+ uint16_t repeat = kNoRepeat);
+#endif
+
+ protected:
+#ifdef UNIT_TEST
+#ifndef HIGH
+#define HIGH 0x1
+#endif
+#ifndef LOW
+#define LOW 0x0
+#endif
+#endif // UNIT_TEST
+ uint8_t outputOn;
+ uint8_t outputOff;
+ VIRTUAL void ledOff();
+ VIRTUAL void ledOn();
+
+ private:
+ uint16_t onTimePeriod;
+ uint16_t offTimePeriod;
+ uint16_t IRpin;
+ int8_t periodOffset;
+ uint8_t _dutycycle;
+ bool modulation;
+ uint32_t calcUSecPeriod(uint32_t hz, bool use_offset = true);
+};
+
+#endif // IRSEND_H_
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/IRtimer.cpp b/lib/IRremoteESP8266-2.5.2.03/src/IRtimer.cpp
similarity index 52%
rename from lib/IRremoteESP8266-2.2.1.02/src/IRtimer.cpp
rename to lib/IRremoteESP8266-2.5.2.03/src/IRtimer.cpp
index cc5cdfaff298..029637cbb94d 100644
--- a/lib/IRremoteESP8266-2.2.1.02/src/IRtimer.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/src/IRtimer.cpp
@@ -5,18 +5,21 @@
#include
#endif
+#ifdef UNIT_TEST
+// Used to help simulate elapsed time in unit tests.
+extern uint32_t _IRtimer_unittest_now;
+#endif // UNIT_TEST
+
// This class performs a simple time in useconds since instantiated.
// Handles when the system timer wraps around (once).
-IRtimer::IRtimer() {
- reset();
-}
+IRtimer::IRtimer() { reset(); }
void IRtimer::reset() {
#ifndef UNIT_TEST
start = micros();
#else
- start = 0;
+ start = _IRtimer_unittest_now;
#endif
}
@@ -24,10 +27,15 @@ uint32_t IRtimer::elapsed() {
#ifndef UNIT_TEST
uint32_t now = micros();
#else
- uint32_t now = 0;
+ uint32_t now = _IRtimer_unittest_now;
#endif
- if (start <= now) // Check if the system timer has wrapped.
+ if (start <= now) // Check if the system timer has wrapped.
return now - start; // No wrap.
else
return UINT32_MAX - start + now; // Has wrapped.
}
+
+// Only used in unit testing.
+#ifdef UNIT_TEST
+void IRtimer::add(uint32_t usecs) { _IRtimer_unittest_now += usecs; }
+#endif // UNIT_TEST
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/IRtimer.h b/lib/IRremoteESP8266-2.5.2.03/src/IRtimer.h
similarity index 78%
rename from lib/IRremoteESP8266-2.2.1.02/src/IRtimer.h
rename to lib/IRremoteESP8266-2.5.2.03/src/IRtimer.h
index 6cf7f7dc825d..baca1cf74d3e 100644
--- a/lib/IRremoteESP8266-2.2.1.02/src/IRtimer.h
+++ b/lib/IRremoteESP8266-2.5.2.03/src/IRtimer.h
@@ -12,6 +12,9 @@ class IRtimer {
IRtimer();
void reset();
uint32_t elapsed();
+#ifdef UNIT_TEST
+ static void add(uint32_t usecs);
+#endif // UNIT_TEST
private:
uint32_t start;
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/IRutils.cpp b/lib/IRremoteESP8266-2.5.2.03/src/IRutils.cpp
new file mode 100644
index 000000000000..7864625a58f7
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/IRutils.cpp
@@ -0,0 +1,470 @@
+// Copyright 2017 David Conran
+
+#include "IRutils.h"
+#ifndef UNIT_TEST
+#include
+#endif
+
+#define __STDC_LIMIT_MACROS
+#include
+#include
+#ifndef ARDUINO
+#include
+#endif
+#include "IRrecv.h"
+#include "IRremoteESP8266.h"
+
+// Reverse the order of the requested least significant nr. of bits.
+// Args:
+// input: Bit pattern/integer to reverse.
+// nbits: Nr. of bits to reverse.
+// Returns:
+// The reversed bit pattern.
+uint64_t reverseBits(uint64_t input, uint16_t nbits) {
+ if (nbits <= 1) return input; // Reversing <= 1 bits makes no change at all.
+ // Cap the nr. of bits to rotate to the max nr. of bits in the input.
+ nbits = std::min(nbits, (uint16_t)(sizeof(input) * 8));
+ uint64_t output = 0;
+ for (uint16_t i = 0; i < nbits; i++) {
+ output <<= 1;
+ output |= (input & 1);
+ input >>= 1;
+ }
+ // Merge any remaining unreversed bits back to the top of the reversed bits.
+ return (input << nbits) | output;
+}
+
+// Convert a uint64_t (unsigned long long) to a string.
+// Arduino String/toInt/Serial.print() can't handle printing 64 bit values.
+//
+// Args:
+// input: The value to print
+// base: The output base.
+// Returns:
+// A string representation of the integer.
+// Note: Based on Arduino's Print::printNumber()
+#ifdef ARDUINO // Arduino's & C++'s string implementations can't co-exist.
+String uint64ToString(uint64_t input, uint8_t base) {
+ String result = "";
+#else
+std::string uint64ToString(uint64_t input, uint8_t base) {
+ std::string result = "";
+#endif
+ // prevent issues if called with base <= 1
+ if (base < 2) base = 10;
+ // Check we have a base that we can actually print.
+ // i.e. [0-9A-Z] == 36
+ if (base > 36) base = 10;
+
+ do {
+ char c = input % base;
+ input /= base;
+
+ if (c < 10)
+ c += '0';
+ else
+ c += 'A' - 10;
+ result = c + result;
+ } while (input);
+ return result;
+}
+
+#ifdef ARDUINO
+// Print a uint64_t/unsigned long long to the Serial port
+// Serial.print() can't handle printing long longs. (uint64_t)
+//
+// Args:
+// input: The value to print
+// base: The output base.
+void serialPrintUint64(uint64_t input, uint8_t base) {
+ Serial.print(uint64ToString(input, base));
+}
+#endif
+
+// Convert a protocol type (enum etc) to a human readable string.
+// Args:
+// protocol: Nr. (enum) of the protocol.
+// isRepeat: A flag indicating if it is a repeat message of the protocol.
+// Returns:
+// A string containing the protocol name.
+#ifdef ARDUINO // Arduino's & C++'s string implementations can't co-exist.
+String typeToString(const decode_type_t protocol, const bool isRepeat) {
+ String result = "";
+#else
+std::string typeToString(const decode_type_t protocol, const bool isRepeat) {
+ std::string result = "";
+#endif
+ switch (protocol) {
+ default:
+ case UNKNOWN:
+ result = "UNKNOWN";
+ break;
+ case UNUSED:
+ result = "UNUSED";
+ break;
+ case AIWA_RC_T501:
+ result = "AIWA_RC_T501";
+ break;
+ case ARGO:
+ result = "ARGO";
+ break;
+ case CARRIER_AC:
+ result = "CARRIER_AC";
+ break;
+ case COOLIX:
+ result = "COOLIX";
+ break;
+ case DAIKIN:
+ result = "DAIKIN";
+ break;
+ case DENON:
+ result = "DENON";
+ break;
+ case DISH:
+ result = "DISH";
+ break;
+ case ELECTRA_AC:
+ result = "ELECTRA_AC";
+ break;
+ case FUJITSU_AC:
+ result = "FUJITSU_AC";
+ break;
+ case GICABLE:
+ result = "GICABLE";
+ break;
+ case GLOBALCACHE:
+ result = "GLOBALCACHE";
+ break;
+ case GREE:
+ result = "GREE";
+ break;
+ case HAIER_AC:
+ result = "HAIER_AC";
+ break;
+ case HAIER_AC_YRW02:
+ result = "HAIER_AC_YRW02";
+ break;
+ case HITACHI_AC:
+ result = "HITACHI_AC";
+ break;
+ case HITACHI_AC1:
+ result = "HITACHI_AC1";
+ break;
+ case HITACHI_AC2:
+ result = "HITACHI_AC2";
+ break;
+ case JVC:
+ result = "JVC";
+ break;
+ case KELVINATOR:
+ result = "KELVINATOR";
+ break;
+ case LG:
+ result = "LG";
+ break;
+ case LG2:
+ result = "LG2";
+ break;
+ case LASERTAG:
+ result = "LASERTAG";
+ break;
+ case LUTRON:
+ result = "LUTRON";
+ break;
+ case MAGIQUEST:
+ result = "MAGIQUEST";
+ break;
+ case MIDEA:
+ result = "MIDEA";
+ break;
+ case MITSUBISHI:
+ result = "MITSUBISHI";
+ break;
+ case MITSUBISHI2:
+ result = "MITSUBISHI2";
+ break;
+ case MITSUBISHI_AC:
+ result = "MITSUBISHI_AC";
+ break;
+ case MWM:
+ result = "MWM";
+ break;
+ case NEC:
+ result = "NEC";
+ break;
+ case NEC_LIKE:
+ result = "NEC (non-strict)";
+ break;
+ case NIKAI:
+ result = "NIKAI";
+ break;
+ case PANASONIC:
+ result = "PANASONIC";
+ break;
+ case PANASONIC_AC:
+ result = "PANASONIC_AC";
+ break;
+ case PIONEER:
+ result = "PIONEER";
+ break;
+ case PRONTO:
+ result = "PRONTO";
+ break;
+ case RAW:
+ result = "RAW";
+ break;
+ case RC5:
+ result = "RC5";
+ break;
+ case RC5X:
+ result = "RC5X";
+ break;
+ case RC6:
+ result = "RC6";
+ break;
+ case RCMM:
+ result = "RCMM";
+ break;
+ case SAMSUNG:
+ result = "SAMSUNG";
+ break;
+ case SAMSUNG_AC:
+ result = "SAMSUNG_AC";
+ break;
+ case SANYO:
+ result = "SANYO";
+ break;
+ case SANYO_LC7461:
+ result = "SANYO_LC7461";
+ break;
+ case SHARP:
+ result = "SHARP";
+ break;
+ case SHERWOOD:
+ result = "SHERWOOD";
+ break;
+ case SONY:
+ result = "SONY";
+ break;
+ case TOSHIBA_AC:
+ result = "TOSHIBA_AC";
+ break;
+ case TROTEC:
+ result = "TROTEC";
+ break;
+ case WHIRLPOOL_AC:
+ result = "WHIRLPOOL_AC";
+ break;
+ case WHYNTER:
+ result = "WHYNTER";
+ break;
+ }
+ if (isRepeat) result += " (Repeat)";
+ return result;
+}
+
+// Does the given protocol use a complex state as part of the decode?
+bool hasACState(const decode_type_t protocol) {
+ switch (protocol) {
+ case DAIKIN:
+ case ELECTRA_AC:
+ case FUJITSU_AC:
+ case GREE:
+ case HAIER_AC:
+ case HAIER_AC_YRW02:
+ case HITACHI_AC:
+ case HITACHI_AC1:
+ case HITACHI_AC2:
+ case KELVINATOR:
+ case MITSUBISHI_AC:
+ case MWM:
+ case PANASONIC_AC:
+ case SAMSUNG_AC:
+ case TOSHIBA_AC:
+ case WHIRLPOOL_AC:
+ return true;
+ default:
+ return false;
+ }
+}
+
+// Return the corrected length of a 'raw' format array structure
+// after over-large values are converted into multiple entries.
+// Args:
+// results: A ptr to a decode result.
+// Returns:
+// A uint16_t containing the length.
+uint16_t getCorrectedRawLength(const decode_results *results) {
+ uint16_t extended_length = results->rawlen - 1;
+ for (uint16_t i = 0; i < results->rawlen - 1; i++) {
+ uint32_t usecs = results->rawbuf[i] * kRawTick;
+ // Add two extra entries for multiple larger than UINT16_MAX it is.
+ extended_length += (usecs / (UINT16_MAX + 1)) * 2;
+ }
+ return extended_length;
+}
+
+// Return a string containing the key values of a decode_results structure
+// in a C/C++ code style format.
+#ifdef ARDUINO
+String resultToSourceCode(const decode_results *results) {
+ String output = "";
+#else
+std::string resultToSourceCode(const decode_results *results) {
+ std::string output = "";
+#endif
+ // Start declaration
+ output += "uint16_t "; // variable type
+ output += "rawData["; // array name
+ output += uint64ToString(getCorrectedRawLength(results), 10);
+ // array size
+ output += "] = {"; // Start declaration
+
+ // Dump data
+ for (uint16_t i = 1; i < results->rawlen; i++) {
+ uint32_t usecs;
+ for (usecs = results->rawbuf[i] * kRawTick; usecs > UINT16_MAX;
+ usecs -= UINT16_MAX) {
+ output += uint64ToString(UINT16_MAX);
+ if (i % 2)
+ output += ", 0, ";
+ else
+ output += ", 0, ";
+ }
+ output += uint64ToString(usecs, 10);
+ if (i < results->rawlen - 1)
+ output += ", "; // ',' not needed on the last one
+ if (i % 2 == 0) output += " "; // Extra if it was even.
+ }
+
+ // End declaration
+ output += "};";
+
+ // Comment
+ output += " // " + typeToString(results->decode_type, results->repeat);
+ // Only display the value if the decode type doesn't have an A/C state.
+ if (!hasACState(results->decode_type))
+ output += " " + uint64ToString(results->value, 16);
+ output += "\n";
+
+ // Now dump "known" codes
+ if (results->decode_type != UNKNOWN) {
+ if (hasACState(results->decode_type)) {
+#if DECODE_AC
+ uint16_t nbytes = results->bits / 8;
+ output += "uint8_t state[" + uint64ToString(nbytes) + "] = {";
+ for (uint16_t i = 0; i < nbytes; i++) {
+ output += "0x";
+ if (results->state[i] < 0x10) output += "0";
+ output += uint64ToString(results->state[i], 16);
+ if (i < nbytes - 1) output += ", ";
+ }
+ output += "};\n";
+#endif // DECODE_AC
+ } else {
+ // Simple protocols
+ // Some protocols have an address &/or command.
+ // NOTE: It will ignore the atypical case when a message has been
+ // decoded but the address & the command are both 0.
+ if (results->address > 0 || results->command > 0) {
+ output += "uint32_t address = 0x" +
+ uint64ToString(results->address, 16) + ";\n";
+ output += "uint32_t command = 0x" +
+ uint64ToString(results->command, 16) + ";\n";
+ }
+ // Most protocols have data
+ output +=
+ "uint64_t data = 0x" + uint64ToString(results->value, 16) + ";\n";
+ }
+ }
+ return output;
+}
+
+// Dump out the decode_results structure.
+//
+#ifdef ARDUINO
+String resultToTimingInfo(const decode_results *results) {
+ String output = "";
+ String value = "";
+#else
+std::string resultToTimingInfo(const decode_results *results) {
+ std::string output = "";
+ std::string value = "";
+#endif
+ output += "Raw Timing[" + uint64ToString(results->rawlen - 1, 10) + "]:\n";
+
+ for (uint16_t i = 1; i < results->rawlen; i++) {
+ if (i % 2 == 0)
+ output += "-"; // even
+ else
+ output += " +"; // odd
+ value = uint64ToString(results->rawbuf[i] * kRawTick);
+ // Space pad the value till it is at least 6 chars long.
+ while (value.length() < 6) value = " " + value;
+ output += value;
+ if (i < results->rawlen - 1) output += ", "; // ',' not needed for last one
+ if (!(i % 8)) output += "\n"; // Newline every 8 entries.
+ }
+ output += "\n";
+ return output;
+}
+
+// Convert the decode_results structure's value/state to simple hexadecimal.
+//
+#ifdef ARDUINO
+String resultToHexidecimal(const decode_results *result) {
+ String output = "";
+#else
+std::string resultToHexidecimal(const decode_results *result) {
+ std::string output = "";
+#endif
+ if (hasACState(result->decode_type)) {
+#if DECODE_AC
+ for (uint16_t i = 0; result->bits > i * 8; i++) {
+ if (result->state[i] < 0x10) output += "0"; // Zero pad
+ output += uint64ToString(result->state[i], 16);
+ }
+#endif // DECODE_AC
+ } else {
+ output += uint64ToString(result->value, 16);
+ }
+ return output;
+}
+
+// Dump out the decode_results structure.
+//
+#ifdef ARDUINO
+String resultToHumanReadableBasic(const decode_results *results) {
+ String output = "";
+#else
+std::string resultToHumanReadableBasic(const decode_results *results) {
+ std::string output = "";
+#endif
+ // Show Encoding standard
+ output +=
+ "Encoding : " + typeToString(results->decode_type, results->repeat) +
+ "\n";
+
+ // Show Code & length
+ output += "Code : ";
+ output += resultToHexidecimal(results);
+ output += " (" + uint64ToString(results->bits) + " bits)\n";
+ return output;
+}
+
+uint8_t sumBytes(uint8_t *start, const uint16_t length, const uint8_t init) {
+ uint8_t checksum = init;
+ uint8_t *ptr;
+ for (ptr = start; ptr - start < length; ptr++) checksum += *ptr;
+ return checksum;
+}
+
+uint64_t invertBits(const uint64_t data, const uint16_t nbits) {
+ // No change if we are asked to invert no bits.
+ if (nbits == 0) return data;
+ uint64_t result = ~data;
+ // If we are asked to invert all the bits or more than we have, it's simple.
+ if (nbits >= sizeof(data) * 8) return result;
+ // Mask off any unwanted bits and return the result.
+ return (result & ((1ULL << nbits) - 1));
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/IRutils.h b/lib/IRremoteESP8266-2.5.2.03/src/IRutils.h
new file mode 100644
index 000000000000..c17375d98121
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/IRutils.h
@@ -0,0 +1,41 @@
+#ifndef IRUTILS_H_
+#define IRUTILS_H_
+
+// Copyright 2017 David Conran
+
+#ifndef UNIT_TEST
+#include
+#endif
+#define __STDC_LIMIT_MACROS
+#include
+#ifndef ARDUINO
+#include
+#endif
+#include "IRremoteESP8266.h"
+#include "IRrecv.h"
+
+uint64_t reverseBits(uint64_t input, uint16_t nbits);
+#ifdef ARDUINO // Arduino's & C++'s string implementations can't co-exist.
+String uint64ToString(uint64_t input, uint8_t base = 10);
+String typeToString(const decode_type_t protocol,
+ const bool isRepeat = false);
+void serialPrintUint64(uint64_t input, uint8_t base = 10);
+String resultToSourceCode(const decode_results *results);
+String resultToTimingInfo(const decode_results *results);
+String resultToHumanReadableBasic(const decode_results *results);
+String resultToHexidecimal(const decode_results *result);
+#else
+std::string uint64ToString(uint64_t input, uint8_t base = 10);
+std::string typeToString(const decode_type_t protocol,
+ const bool isRepeat = false);
+std::string resultToSourceCode(const decode_results *results);
+std::string resultToTimingInfo(const decode_results *results);
+std::string resultToHumanReadableBasic(const decode_results *results);
+std::string resultToHexidecimal(const decode_results *result);
+#endif
+bool hasACState(const decode_type_t protocol);
+uint16_t getCorrectedRawLength(const decode_results *results);
+uint8_t sumBytes(uint8_t *start, const uint16_t length, const uint8_t init = 0);
+uint64_t invertBits(const uint64_t data, const uint16_t nbits);
+
+#endif // IRUTILS_H_
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Aiwa.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Aiwa.cpp
similarity index 76%
rename from lib/IRremoteESP8266-2.2.1.02/src/ir_Aiwa.cpp
rename to lib/IRremoteESP8266-2.5.2.03/src/ir_Aiwa.cpp
index 99a97e18769e..617711a99f86 100644
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Aiwa.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Aiwa.cpp
@@ -2,7 +2,6 @@
#include "IRrecv.h"
#include "IRsend.h"
-#include "IRtimer.h"
// AAA IIIII W W AAA
// A A I W W A A
@@ -14,20 +13,20 @@
// Added by David Conran. (Inspired by IRremoteESP8266's implementation:
// https://github.com/z3t0/Arduino-IRremote)
-#define AIWA_RC_T501_PRE_BITS 26U
-#define AIWA_RC_T501_POST_BITS 1U
+const uint16_t kAiwaRcT501PreBits = 26;
+const uint16_t kAiwaRcT501PostBits = 1;
// NOTE: These are the compliment (inverted) of lirc values as
// lirc uses a '0' for a mark, and a '1' for a space.
-#define AIWA_RC_T501_PRE_DATA 0x1D8113FULL // 26-bits
-#define AIWA_RC_T501_POST_DATA 1ULL
+const uint64_t kAiwaRcT501PreData = 0x1D8113FULL; // 26-bits
+const uint64_t kAiwaRcT501PostData = 1ULL;
#if SEND_AIWA_RC_T501
-// Send a Aiwa RC T501 formatted message.
+// Send an Aiwa RC T501 formatted message.
//
// Args:
// data: The message to be sent.
// nbits: The number of bits of the message to be sent.
-// Typically AIWA_RC_T501_BITS. Max is 37 = (64 - 27)
+// Typically kAiwaRcT501Bits. Max is 37 = (64 - 27)
// repeat: The number of times the command is to be repeated.
//
// Status: BETA / Should work.
@@ -38,10 +37,9 @@ void IRsend::sendAiwaRCT501(uint64_t data, uint16_t nbits, uint16_t repeat) {
// Appears to be an extended NEC1 protocol. i.e. 42 bits instead of 32 bits.
// So use sendNEC instead, however the twist is it has a fixed 26 bit
// prefix, and a fixed postfix bit.
- uint64_t new_data = (
- (AIWA_RC_T501_PRE_DATA << (nbits + AIWA_RC_T501_POST_BITS)) |
- (data << AIWA_RC_T501_POST_BITS) | AIWA_RC_T501_POST_DATA);
- nbits += AIWA_RC_T501_PRE_BITS + AIWA_RC_T501_POST_BITS;
+ uint64_t new_data = ((kAiwaRcT501PreData << (nbits + kAiwaRcT501PostBits)) |
+ (data << kAiwaRcT501PostBits) | kAiwaRcT501PostData);
+ nbits += kAiwaRcT501PreBits + kAiwaRcT501PostBits;
if (nbits > sizeof(new_data) * 8)
return; // We are overflowing. Abort, and don't send.
sendNEC(new_data, nbits, repeat);
@@ -53,7 +51,7 @@ void IRsend::sendAiwaRCT501(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
-// nbits: The number of data bits to expect. Typically AIWA_RC_T501_BITS.
+// nbits: The number of data bits to expect. Typically kAiwaRcT501Bits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
// boolean: True if it can decode it, false if it can't.
@@ -72,12 +70,11 @@ void IRsend::sendAiwaRCT501(uint64_t data, uint16_t nbits, uint16_t repeat) {
bool IRrecv::decodeAiwaRCT501(decode_results *results, uint16_t nbits,
bool strict) {
// Compliance
- if (strict && nbits != AIWA_RC_T501_BITS)
+ if (strict && nbits != kAiwaRcT501Bits)
return false; // Doesn't match our protocol defn.
// Add on the pre & post bits to our requested bit length.
- uint16_t expected_nbits = nbits + AIWA_RC_T501_PRE_BITS +
- AIWA_RC_T501_POST_BITS;
+ uint16_t expected_nbits = nbits + kAiwaRcT501PreBits + kAiwaRcT501PostBits;
uint64_t new_data;
if (expected_nbits > sizeof(new_data) * 8)
return false; // We can't possibly match something that big.
@@ -89,24 +86,23 @@ bool IRrecv::decodeAiwaRCT501(decode_results *results, uint16_t nbits,
new_data = results->value;
if (actual_bits < expected_nbits)
return false; // The data we caught was undersized. Throw it back.
- if ((new_data & 0x1ULL) != AIWA_RC_T501_POST_DATA)
+ if ((new_data & 0x1ULL) != kAiwaRcT501PostData)
return false; // The post data doesn't match, so it can't be this protocol.
// Trim off the post data bit.
- new_data >>= AIWA_RC_T501_POST_BITS;
- actual_bits -= AIWA_RC_T501_POST_BITS;
+ new_data >>= kAiwaRcT501PostBits;
+ actual_bits -= kAiwaRcT501PostBits;
// Extract out our likely new value and put it back in the results.
- actual_bits -= AIWA_RC_T501_PRE_BITS;
+ actual_bits -= kAiwaRcT501PreBits;
results->value = new_data & ((1ULL << actual_bits) - 1);
// Check the prefix data matches.
new_data >>= actual_bits; // Trim off the new data to expose the prefix.
- if (new_data != AIWA_RC_T501_PRE_DATA) // Check the prefix.
+ if (new_data != kAiwaRcT501PreData) // Check the prefix.
return false;
// Compliance
- if (strict && results->bits != expected_nbits)
- return false;
+ if (strict && results->bits != expected_nbits) return false;
// Success
results->decode_type = AIWA_RC_T501;
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Argo.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Argo.cpp
similarity index 69%
rename from lib/IRremoteESP8266-2.2.1.02/src/ir_Argo.cpp
rename to lib/IRremoteESP8266-2.5.2.03/src/ir_Argo.cpp
index 0129c723144a..8a3e69f72ef8 100644
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Argo.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Argo.cpp
@@ -11,53 +11,40 @@ Copyright 2017 Schmolders
// Constants
// using SPACE modulation. MARK is always const 400u
-#define ARGO_PREAMBLE_1 6400U // Mark
-#define ARGO_PREAMBLE_2 3300U // Space
-#define ARGO_MARK 400U
-#define ARGO_ONE_SPACE 2200U
-#define ARGO_ZERO_SPACE 900U
+const uint16_t kArgoHdrMark = 6400;
+const uint16_t kArgoHdrSpace = 3300;
+const uint16_t kArgoBitMark = 400;
+const uint16_t kArgoOneSpace = 2200;
+const uint16_t kArgoZeroSpace = 900;
#if SEND_ARGO
-// Send a Argo A/C message.
+// Send an Argo A/C message.
//
// Args:
-// data: An array of ARGO_COMMAND_LENGTH bytes containing the IR command.
+// data: An array of kArgoStateLength bytes containing the IR command.
//
// Status: ALPHA / Untested.
-//
-// Overloading the IRSend Function
void IRsend::sendArgo(unsigned char data[], uint16_t nbytes, uint16_t repeat) {
// Check if we have enough bytes to send a proper message.
- if (nbytes < ARGO_COMMAND_LENGTH) return;
- // Set IR carrier frequency
- enableIROut(38);
- for (uint16_t r = 0; r <= repeat; r++) {
- // Header
- // TODO(kaschmo): validate
- mark(ARGO_PREAMBLE_1);
- space(ARGO_PREAMBLE_2);
- // send data, defined in IRSend.cpp
- for (uint16_t i = 0; i < nbytes; i++)
- sendData(ARGO_MARK, ARGO_ONE_SPACE, ARGO_MARK,
- ARGO_ZERO_SPACE, data[i], 8, false);
- // send LSB first reverses the bit order in array for sending.
- }
+ if (nbytes < kArgoStateLength) return;
+ // TODO(kaschmo): validate
+ sendGeneric(kArgoHdrMark, kArgoHdrSpace, kArgoBitMark, kArgoOneSpace,
+ kArgoBitMark, kArgoZeroSpace, 0, 0, // No Footer.
+ data, nbytes, 38, false, repeat, kDutyDefault);
}
+#endif // SEND_ARGO
-IRArgoAC::IRArgoAC(uint16_t pin) : _irsend(pin) {
- stateReset();
-}
+IRArgoAC::IRArgoAC(uint16_t pin) : _irsend(pin) { stateReset(); }
-void IRArgoAC::begin() {
- _irsend.begin();
-}
+void IRArgoAC::begin() { _irsend.begin(); }
+#if SEND_ARGO
void IRArgoAC::send() {
- // Serial.println("Sending IR code"); // Only for Debug
checksum(); // Create valid checksum before sending
_irsend.sendArgo(argo);
}
+#endif // SEND_ARGO
void IRArgoAC::checksum() {
uint8_t sum = 2; // Corresponds to byte 11 being constant 0b01
@@ -65,20 +52,18 @@ void IRArgoAC::checksum() {
// Only add up bytes to 9. byte 10 is 0b01 constant anyway.
// Assume that argo array is MSB first (left)
- for (i = 0; i < 10; i++)
- sum += argo[i];
+ for (i = 0; i < 10; i++) sum += argo[i];
sum = sum % 256; // modulo 256
// Append sum to end of array
// Set const part of checksum bit 10
argo[10] = 0b00000010;
argo[10] += sum << 2; // Shift up 2 bits and append to byte 10
- argo[11] = sum >> 6; // Shift down 6 bits and add in two LSBs of bit 11
+ argo[11] = sum >> 6; // Shift down 6 bits and add in two LSBs of bit 11
}
void IRArgoAC::stateReset() {
- for (uint8_t i = 0; i < ARGO_COMMAND_LENGTH; i++)
- argo[i] = 0x0;
+ for (uint8_t i = 0; i < kArgoStateLength; i++) argo[i] = 0x0;
// Argo Message. Store MSB left.
// Default message:
@@ -91,8 +76,8 @@ void IRArgoAC::stateReset() {
this->off();
this->setTemp(20);
this->setRoomTemp(25);
- this->setCoolMode(ARGO_COOL_AUTO);
- this->setFan(ARGO_FAN_AUTO);
+ this->setCoolMode(kArgoCoolAuto);
+ this->setFan(kArgoFanAuto);
}
uint8_t* IRArgoAC::getRaw() {
@@ -123,9 +108,7 @@ void IRArgoAC::setPower(bool state) {
off();
}
-uint8_t IRArgoAC::getPower() {
- return ac_state;
-}
+uint8_t IRArgoAC::getPower() { return ac_state; }
void IRArgoAC::setMax(bool state) {
max_mode = state;
@@ -135,17 +118,15 @@ void IRArgoAC::setMax(bool state) {
argo[9] &= 0b11110111;
}
-bool IRArgoAC::getMax() {
- return max_mode;
-}
+bool IRArgoAC::getMax() { return max_mode; }
// Set the temp in deg C
// Sending 0 equals +4
void IRArgoAC::setTemp(uint8_t temp) {
- if (temp < ARGO_MIN_TEMP)
- temp = ARGO_MIN_TEMP;
- else if (temp > ARGO_MAX_TEMP)
- temp = ARGO_MAX_TEMP;
+ if (temp < kArgoMinTemp)
+ temp = kArgoMinTemp;
+ else if (temp > kArgoMaxTemp)
+ temp = kArgoMaxTemp;
// Store in attributes
set_temp = temp;
@@ -161,9 +142,7 @@ void IRArgoAC::setTemp(uint8_t temp) {
argo[3] += temp >> 2; // remove lowest to bits and append in 0-2
}
-uint8_t IRArgoAC::getTemp() {
- return set_temp;
-}
+uint8_t IRArgoAC::getTemp() { return set_temp; }
// Set the speed of the fan
void IRArgoAC::setFan(uint8_t fan) {
@@ -175,18 +154,14 @@ void IRArgoAC::setFan(uint8_t fan) {
argo[3] += fan << 3;
}
-uint8_t IRArgoAC::getFan() {
- return fan_mode;
-}
+uint8_t IRArgoAC::getFan() { return fan_mode; }
void IRArgoAC::setFlap(uint8_t flap) {
flap_mode = flap;
// TODO(kaschmo): set correct bits for flap mode
}
-uint8_t IRArgoAC::getFlap() {
- return flap_mode;
-}
+uint8_t IRArgoAC::getFlap() { return flap_mode; }
uint8_t IRArgoAC::getMode() {
// return cooling 0, heating 1
@@ -203,9 +178,7 @@ void IRArgoAC::setCoolMode(uint8_t mode) {
argo[2] += mode << 3;
}
-uint8_t IRArgoAC::getCoolMode() {
- return cool_mode;
-}
+uint8_t IRArgoAC::getCoolMode() { return cool_mode; }
void IRArgoAC::setHeatMode(uint8_t mode) {
ac_mode = 1; // Set ac mode to heating
@@ -218,9 +191,7 @@ void IRArgoAC::setHeatMode(uint8_t mode) {
argo[2] += mode << 3;
}
-uint8_t IRArgoAC::getHeatMode() {
- return heat_mode;
-}
+uint8_t IRArgoAC::getHeatMode() { return heat_mode; }
void IRArgoAC::setNight(bool state) {
night_mode = state;
@@ -231,9 +202,7 @@ void IRArgoAC::setNight(bool state) {
argo[9] &= 0b11111011;
}
-bool IRArgoAC::getNight() {
- return night_mode;
-}
+bool IRArgoAC::getNight() { return night_mode; }
void IRArgoAC::setiFeel(bool state) {
ifeel_mode = state;
@@ -244,9 +213,7 @@ void IRArgoAC::setiFeel(bool state) {
argo[9] &= 0b01111111;
}
-bool IRArgoAC::getiFeel() {
- return ifeel_mode;
-}
+bool IRArgoAC::getiFeel() { return ifeel_mode; }
void IRArgoAC::setTime() {
// TODO(kaschmo): use function call from checksum to set time first
@@ -261,4 +228,3 @@ void IRArgoAC::setRoomTemp(uint8_t temp) {
argo[3] += temp << 5; // Append to bit 5,6,7
argo[4] += temp >> 3; // Remove lowest 3 bits and append in 0,1
}
-#endif // SEND_ARGO
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Argo.h b/lib/IRremoteESP8266-2.5.2.03/src/ir_Argo.h
similarity index 51%
rename from lib/IRremoteESP8266-2.2.1.02/src/ir_Argo.h
rename to lib/IRremoteESP8266-2.5.2.03/src/ir_Argo.h
index a25199208d63..b49fc35177cd 100644
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Argo.h
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Argo.h
@@ -29,40 +29,59 @@
// Constants. Store MSB left.
-#define ARGO_COOL_ON 0U // 0b000
-#define ARGO_COOL_OFF 3U // 0b110
-#define ARGO_COOL_AUTO 2U // 0b010
-#define ARGO_COOl_HUM 1U // 0b100
+const uint8_t kArgoCoolOn = 0; // 0b000
+const uint8_t kArgoCoolOff = 3; // 0b110
+const uint8_t kArgoCoolAuto = 2; // 0b010
+const uint8_t kArgoCoolHum = 1; // 0b100
+const uint8_t kArgoHeatOn = 0; // 0b001
+const uint8_t kArgoHeatAuto = 1; // 0b101
+const uint8_t kArgoHeatBlink = 2; // 0b011 // ??no idea what mode that is
+const uint8_t kArgoMinTemp = 10; // Celsius offset +4
+const uint8_t kArgoMaxTemp = 32; // Celsius
+const uint8_t kArgoFanAuto = 0; // 0b00
+const uint8_t kArgoFan3 = 3; // 0b11
+const uint8_t kArgoFan2 = 2; // 0b01
+const uint8_t kArgoFan1 = 1; // 0b10
+const uint8_t kArgoFlapAuto = 0; // 0b000
+const uint8_t kArgoFlap1 = 1; // 0b100
+const uint8_t kArgoFlap2 = 2; // 0b010
+const uint8_t kArgoFlap3 = 3; // 0b110
+const uint8_t kArgoFlap4 = 4; // 0b001
+const uint8_t kArgoFlap5 = 5; // 0b101
+const uint8_t kArgoFlap6 = 6; // 0b011
+const uint8_t kArgoFlapFull = 7; // 0b111
+
+// Legacy defines. (Deperecated)
+#define ARGO_COOL_ON kArgoCoolOn
+#define ARGO_COOL_OFF kArgoCoolOff
+#define ARGO_COOL_AUTO kArgoCoolAuto
+#define ARGO_COOl_HUM kArgoCoolHum
+#define ARGO_HEAT_ON kArgoHeatOn
+#define ARGO_HEAT_AUTO kArgoHeatAuto
+#define ARGO_HEAT_BLINK kArgoHeatBlink
+#define ARGO_MIN_TEMP kArgoMinTemp
+#define ARGO_MAX_TEMP kArgoMaxTemp
+#define ARGO_FAN_AUTO kArgoFanAuto
+#define ARGO_FAN_3 kArgoFan3
+#define ARGO_FAN_2 kArgoFan2
+#define ARGO_FAN_1 kArgoFan1
+#define ARGO_FLAP_AUTO kArgoFlapAuto
+#define ARGO_FLAP_1 kArgoFlap1
+#define ARGO_FLAP_2 kArgoFlap2
+#define ARGO_FLAP_3 kArgoFlap3
+#define ARGO_FLAP_4 kArgoFlap4
+#define ARGO_FLAP_5 kArgoFlap5
+#define ARGO_FLAP_6 kArgoFlap6
+#define ARGO_FLAP_FULL kArgoFlapFull
-#define ARGO_HEAT_ON 0U // 0b001
-#define ARGO_HEAT_AUTO 1U // 0b101
-#define ARGO_HEAT_BLINK 2U // 0b011 // ??no idea what mode that is
-
-#define ARGO_MIN_TEMP 10U // Celsius offset +4
-#define ARGO_MAX_TEMP 32U // Celsius
-
-#define ARGO_FAN_AUTO 0U // 0b00
-#define ARGO_FAN_3 3U // 0b11
-#define ARGO_FAN_2 2U // 0b01
-#define ARGO_FAN_1 1U // 0b10
-
-#define ARGO_FLAP_AUTO 0U // 0b000
-#define ARGO_FLAP_1 1U // 0b100
-#define ARGO_FLAP_2 2U // 0b010
-#define ARGO_FLAP_3 3U // 0b110
-#define ARGO_FLAP_4 4U // 0b001
-#define ARGO_FLAP_5 5U // 0b101
-#define ARGO_FLAP_6 6U // 0b011
-#define ARGO_FLAP_FULL 7U // 0b111
-
-
-#if SEND_ARGO
class IRArgoAC {
public:
explicit IRArgoAC(uint16_t pin);
+#if SEND_ARGO
void send();
+#endif // SEND_ARGO
void begin();
void on();
void off();
@@ -102,7 +121,7 @@ class IRArgoAC {
private:
// # of bytes per command
- uint8_t argo[ARGO_COMMAND_LENGTH]; // Defined in IRremoteESP8266.h
+ uint8_t argo[kArgoStateLength]; // Defined in IRremoteESP8266.h
void stateReset();
void checksum();
IRsend _irsend; // instance of the IR send class
@@ -119,6 +138,5 @@ class IRArgoAC {
uint8_t max_mode; // on/off
uint8_t ifeel_mode; // on/off
};
-#endif // SEND_ARGO
#endif // IR_ARGO_H_
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Carrier.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Carrier.cpp
new file mode 100644
index 000000000000..350d61cc1ec3
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Carrier.cpp
@@ -0,0 +1,111 @@
+// Copyright 2018 David Conran
+
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRutils.h"
+
+// CCCCC AAA RRRRRR RRRRRR IIIII EEEEEEE RRRRRR
+// CC C AAAAA RR RR RR RR III EE RR RR
+// CC AA AA RRRRRR RRRRRR III EEEEE RRRRRR
+// CC C AAAAAAA RR RR RR RR III EE RR RR
+// CCCCC AA AA RR RR RR RR IIIII EEEEEEE RR RR
+
+// Suits Carrier/Surrey HVAC models:
+// 42QG5A55970 (remote)
+// 619EGX0090E0 / 619EGX0120E0 / 619EGX0180E0 / 619EGX0220E0 (indoor units)
+// 53NGK009/012 (inverter)
+
+// Constants
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/385
+const uint16_t kCarrierAcHdrMark = 8532;
+const uint16_t kCarrierAcHdrSpace = 4228;
+const uint16_t kCarrierAcBitMark = 628;
+const uint16_t kCarrierAcOneSpace = 1320;
+const uint16_t kCarrierAcZeroSpace = 532;
+const uint16_t kCarrierAcGap = 20000;
+
+#if SEND_CARRIER_AC
+// Send a Carrier HVAC formatted message.
+//
+// Args:
+// data: The message to be sent.
+// nbits: The bit size of the message being sent. typically kCarrierAcBits.
+// repeat: The number of times the message is to be repeated.
+//
+// Status: BETA / Appears to work on real devices.
+//
+void IRsend::sendCarrierAC(uint64_t data, uint16_t nbits, uint16_t repeat) {
+ for (uint16_t r = 0; r <= repeat; r++) {
+ uint64_t temp_data = data;
+ // Carrier sends the data block three times. normal + inverted + normal.
+ for (uint16_t i = 0; i < 3; i++) {
+ sendGeneric(kCarrierAcHdrMark, kCarrierAcHdrSpace, kCarrierAcBitMark,
+ kCarrierAcOneSpace, kCarrierAcBitMark, kCarrierAcZeroSpace,
+ kCarrierAcBitMark, kCarrierAcGap, temp_data, nbits, 38, true,
+ 0, kDutyDefault);
+ temp_data = invertBits(temp_data, nbits);
+ }
+ }
+}
+#endif
+
+#if DECODE_CARRIER_AC
+// Decode the supplied Carrier HVAC message.
+// Carrier HVAC messages contain only 32 bits, but it is sent three(3) times.
+// i.e. normal + inverted + normal
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: Nr. of bits to expect in the data portion.
+// Typically kCarrierAcBits.
+// strict: Flag to indicate if we strictly adhere to the specification.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: ALPHA / Untested.
+//
+bool IRrecv::decodeCarrierAC(decode_results *results, uint16_t nbits,
+ bool strict) {
+ if (results->rawlen < ((2 * nbits + kHeader + kFooter) * 3) - 1)
+ return false; // Can't possibly be a valid Carrier message.
+ if (strict && nbits != kCarrierAcBits)
+ return false; // We expect Carrier to be 32 bits of message.
+
+ uint64_t data = 0;
+ uint64_t prev_data = 0;
+ uint16_t offset = kStartOffset;
+
+ for (uint8_t i = 0; i < 3; i++) {
+ prev_data = data;
+ // Header
+ if (!matchMark(results->rawbuf[offset++], kCarrierAcHdrMark)) return false;
+ if (!matchSpace(results->rawbuf[offset++], kCarrierAcHdrSpace))
+ return false;
+ // Data
+ match_result_t data_result =
+ matchData(&(results->rawbuf[offset]), nbits, kCarrierAcBitMark,
+ kCarrierAcOneSpace, kCarrierAcBitMark, kCarrierAcZeroSpace);
+ if (data_result.success == false) return false;
+ data = data_result.data;
+ offset += data_result.used;
+ // Footer
+ if (!matchMark(results->rawbuf[offset++], kCarrierAcBitMark)) return false;
+ if (offset < results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset++], kCarrierAcGap))
+ return false;
+ // Compliance.
+ if (strict) {
+ // Check if the data is an inverted copy of the previous data.
+ if (i > 0 && prev_data != invertBits(data, nbits)) return false;
+ }
+ }
+
+ // Success
+ results->bits = nbits;
+ results->value = data;
+ results->decode_type = CARRIER_AC;
+ results->address = data >> 16;
+ results->command = data & 0xFFFF;
+ return true;
+}
+#endif
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Coolix.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Coolix.cpp
new file mode 100644
index 000000000000..ee539af25660
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Coolix.cpp
@@ -0,0 +1,423 @@
+// Copyright bakrus
+// Copyright 2017 David Conran
+
+#include "ir_Coolix.h"
+#include
+#ifndef ARDUINO
+#include
+#endif
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRutils.h"
+
+// CCCCC OOOOO OOOOO LL IIIII XX XX
+// CC C OO OO OO OO LL III XX XX
+// CC OO OO OO OO LL III XXXX
+// CC C OO OO OO OO LL III XX XX
+// CCCCC OOOO0 OOOO0 LLLLLLL IIIII XX XX
+
+// Coolix A/C / heatpump added by (send) bakrus & (decode) crankyoldgit
+//
+// Supports:
+// RG57K7(B)/BGEF remote control for Beko BINR 070/071 split-type aircon.
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/484
+
+// Constants
+// Pulse parms are *50-100 for the Mark and *50+100 for the space
+// First MARK is the one after the long gap
+// pulse parameters in usec
+const uint16_t kCoolixTick = 560; // Approximately 21 cycles at 38kHz
+const uint16_t kCoolixBitMarkTicks = 1;
+const uint16_t kCoolixBitMark = kCoolixBitMarkTicks * kCoolixTick;
+const uint16_t kCoolixOneSpaceTicks = 3;
+const uint16_t kCoolixOneSpace = kCoolixOneSpaceTicks * kCoolixTick;
+const uint16_t kCoolixZeroSpaceTicks = 1;
+const uint16_t kCoolixZeroSpace = kCoolixZeroSpaceTicks * kCoolixTick;
+const uint16_t kCoolixHdrMarkTicks = 8;
+const uint16_t kCoolixHdrMark = kCoolixHdrMarkTicks * kCoolixTick;
+const uint16_t kCoolixHdrSpaceTicks = 8;
+const uint16_t kCoolixHdrSpace = kCoolixHdrSpaceTicks * kCoolixTick;
+const uint16_t kCoolixMinGapTicks = kCoolixHdrMarkTicks + kCoolixZeroSpaceTicks;
+const uint16_t kCoolixMinGap = kCoolixMinGapTicks * kCoolixTick;
+
+#if SEND_COOLIX
+// Send a Coolix message
+//
+// Args:
+// data: Contents of the message to be sent.
+// nbits: Nr. of bits of data to be sent. Typically kCoolixBits.
+// repeat: Nr. of additional times the message is to be sent.
+//
+// Status: BETA / Probably works.
+//
+// Ref:
+// https://github.com/z3t0/Arduino-IRremote/blob/master/ir_COOLIX.cpp
+// TODO(anyone): Verify repeat functionality against a real unit.
+void IRsend::sendCOOLIX(uint64_t data, uint16_t nbits, uint16_t repeat) {
+ if (nbits % 8 != 0) return; // nbits is required to be a multiple of 8.
+
+ // Set IR carrier frequency
+ enableIROut(38);
+
+ for (uint16_t r = 0; r <= repeat; r++) {
+ // Header
+ mark(kCoolixHdrMark);
+ space(kCoolixHdrSpace);
+
+ // Data
+ // Break data into byte segments, starting at the Most Significant
+ // Byte. Each byte then being sent normal, then followed inverted.
+ for (uint16_t i = 8; i <= nbits; i += 8) {
+ // Grab a bytes worth of data.
+ uint8_t segment = (data >> (nbits - i)) & 0xFF;
+ // Normal
+ sendData(kCoolixBitMark, kCoolixOneSpace, kCoolixBitMark,
+ kCoolixZeroSpace, segment, 8, true);
+ // Inverted.
+ sendData(kCoolixBitMark, kCoolixOneSpace, kCoolixBitMark,
+ kCoolixZeroSpace, segment ^ 0xFF, 8, true);
+ }
+
+ // Footer
+ mark(kCoolixBitMark);
+ space(kCoolixMinGap); // Pause before repeating
+ }
+}
+#endif
+
+// IRCoolixAC class
+// Supports:
+// RG57K7(B)/BGEF remote control for Beko BINR 070/071 split-type aircon.
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/484
+IRCoolixAC::IRCoolixAC(uint16_t pin) : _irsend(pin) { stateReset(); }
+
+void IRCoolixAC::stateReset() { remote_state = kCoolixDefaultState; }
+
+void IRCoolixAC::begin() { _irsend.begin(); }
+
+#if SEND_COOLIX
+void IRCoolixAC::send() { _irsend.sendCOOLIX(remote_state); }
+#endif // SEND_COOLIX
+
+uint32_t IRCoolixAC::getRaw() { return remote_state; }
+
+void IRCoolixAC::setRaw(const uint32_t new_code) { remote_state = new_code; }
+
+void IRCoolixAC::setTempRaw(const uint8_t code) {
+ remote_state &= ~kCoolixTempMask; // Clear the old temp.
+ remote_state |= (code << 4);
+}
+
+uint8_t IRCoolixAC::getTempRaw() {
+ return (remote_state & kCoolixTempMask) >> 4;
+}
+
+void IRCoolixAC::setTemp(const uint8_t desired) {
+ // Range check.
+ uint8_t temp = std::min(desired, kCoolixTempMax);
+ temp = std::max(temp, kCoolixTempMin);
+ setTempRaw(kCoolixTempMap[temp - kCoolixTempMin]);
+}
+
+uint8_t IRCoolixAC::getTemp() {
+ uint8_t code = getTempRaw();
+ uint8_t i;
+ for (i = 0; i < kCoolixTempRange; i++)
+ if (kCoolixTempMap[i] == code) return kCoolixTempMin + i;
+ return kCoolixUnknown; // Not a temp we expected.
+}
+
+void IRCoolixAC::setSensorTempRaw(const uint8_t code) {
+ remote_state &= ~kCoolixSensorTempMask; // Clear previous sensor temp.
+ remote_state |= ((code & 0xF) << 8);
+}
+
+void IRCoolixAC::setSensorTemp(const uint8_t desired) {
+ uint8_t temp = desired;
+ temp = std::min(temp, kCoolixSensorTempMax);
+ temp = std::max(temp, kCoolixSensorTempMin);
+ setSensorTempRaw(temp - kCoolixSensorTempMin);
+ setZoneFollow(true); // Setting a Sensor temp means you want to Zone Follow.
+}
+
+uint8_t IRCoolixAC::getSensorTemp() {
+ return ((remote_state & kCoolixSensorTempMask) >> 8) + kCoolixSensorTempMin;
+}
+
+bool IRCoolixAC::getPower() {
+ // There is only an off state. Everything else is "on".
+ return remote_state != kCoolixOff;
+}
+
+void IRCoolixAC::setPower(const bool power) {
+ if (!power) remote_state = kCoolixOff;
+ // There really is no distinct "on" setting, so do nothing.
+}
+
+bool IRCoolixAC::getSwing() { return remote_state == kCoolixSwing; }
+
+void IRCoolixAC::setSwing() {
+ // Assumes that repeated sending "swing" toggles the action on the device.
+ remote_state = kCoolixSwing;
+}
+
+bool IRCoolixAC::getSleep() { return remote_state == kCoolixSleep; }
+
+void IRCoolixAC::setSleep() { remote_state = kCoolixSleep; }
+
+bool IRCoolixAC::getTurbo() { return remote_state == kCoolixTurbo; }
+
+void IRCoolixAC::setTurbo() {
+ // Assumes that repeated sending "turbo" toggles the action on the device.
+ remote_state = kCoolixTurbo;
+}
+
+bool IRCoolixAC::getLed() { return remote_state == kCoolixLed; }
+
+void IRCoolixAC::setLed() {
+ // Assumes that repeated sending "Led" toggles the action on the device.
+ remote_state = kCoolixLed;
+}
+
+bool IRCoolixAC::getClean() { return remote_state == kCoolixClean; }
+
+void IRCoolixAC::setClean() { remote_state = kCoolixClean; }
+
+bool IRCoolixAC::getZoneFollow() {
+ return remote_state & kCoolixZoneFollowMask;
+}
+
+// Internal use only.
+void IRCoolixAC::setZoneFollow(bool state) {
+ if (state) {
+ remote_state |= kCoolixZoneFollowMask;
+ } else {
+ remote_state &= ~kCoolixZoneFollowMask;
+ }
+}
+
+void IRCoolixAC::clearSensorTemp() {
+ setZoneFollow(false);
+ setSensorTempRaw(kCoolixSensorTempIgnoreCode);
+}
+
+void IRCoolixAC::setMode(const uint8_t mode) {
+ uint32_t actualmode = mode;
+ // Fan mode is a special case of Dry.
+ if (mode == kCoolixFan) actualmode = kCoolixDry;
+ switch (actualmode) {
+ case kCoolixCool:
+ case kCoolixAuto:
+ case kCoolixHeat:
+ case kCoolixDry:
+ remote_state = (remote_state & ~kCoolixModeMask) | (actualmode << 2);
+ // Force the temp into a known-good state.
+ setTemp(getTemp());
+ }
+ if (mode == kCoolixFan) setTempRaw(kCoolixFanTempCode);
+}
+
+uint8_t IRCoolixAC::getMode() {
+ uint8_t mode = (remote_state & kCoolixModeMask) >> 2;
+ if (mode == kCoolixDry)
+ if (getTempRaw() == kCoolixFanTempCode) return kCoolixFan;
+ return mode;
+}
+
+uint8_t IRCoolixAC::getFan() { return (remote_state & kCoolixFanMask) >> 13; }
+
+void IRCoolixAC::setFan(const uint8_t speed) {
+ uint8_t newspeed = speed;
+ switch (speed) {
+ case kCoolixFanMin:
+ case kCoolixFanMed:
+ case kCoolixFanMax:
+ case kCoolixFanAuto:
+ case kCoolixFanZoneFollow:
+ case kCoolixFanFixed:
+ break;
+ default: // Unknown speed requested.
+ newspeed = kCoolixFanAuto;
+ }
+ remote_state &= ~kCoolixFanMask;
+ remote_state |= ((newspeed << 13) & kCoolixFanMask);
+}
+
+// Convert the internal state into a human readable string.
+#ifdef ARDUINO
+String IRCoolixAC::toString() {
+ String result = "";
+#else
+std::string IRCoolixAC::toString() {
+ std::string result = "";
+#endif // ARDUINO
+ result += "Power: ";
+ if (getPower()) {
+ result += "On";
+ } else {
+ result += "Off";
+ return result; // If it's off, there is no other info.
+ }
+ result += ", Fan: " + uint64ToString(getFan());
+ switch (getFan()) {
+ case kCoolixFanAuto:
+ result += " (AUTO)";
+ break;
+ case kCoolixFanMax:
+ result += " (MAX)";
+ break;
+ case kCoolixFanMin:
+ result += " (MIN)";
+ break;
+ case kCoolixFanMed:
+ result += " (MED)";
+ break;
+ case kCoolixFanZoneFollow:
+ result += " (ZONEFOLLOW)";
+ break;
+ case kCoolixFanFixed:
+ result += " (FIXED)";
+ break;
+ default:
+ result += " (UNKNOWN)";
+ }
+ // Special modes.
+ if (getSwing()) {
+ result += ", Swing: Toggle";
+ return result;
+ }
+ if (getSleep()) {
+ result += ", Sleep: Toggle";
+ return result;
+ }
+ if (getTurbo()) {
+ result += ", Turbo: Toggle";
+ return result;
+ }
+ if (getLed()) {
+ result += ", Led: Toggle";
+ return result;
+ }
+ if (getClean()) {
+ result += ", Mode: Self clean";
+ return result;
+ }
+ result += ", Mode: " + uint64ToString(getMode());
+ switch (getMode()) {
+ case kCoolixAuto:
+ result += " (AUTO)";
+ break;
+ case kCoolixCool:
+ result += " (COOL)";
+ break;
+ case kCoolixHeat:
+ result += " (HEAT)";
+ break;
+ case kCoolixDry:
+ result += " (DRY)";
+ break;
+ case kCoolixFan:
+ result += " (FAN)";
+ break;
+ default:
+ result += " (UNKNOWN)";
+ }
+ if (getMode() != kCoolixFan) // Fan mode doesn't have a temperature.
+ result += ", Temp: " + uint64ToString(getTemp()) + "C";
+ result += ", Zone Follow: ";
+ if (getZoneFollow())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Sensor Temp: ";
+ if (getSensorTemp() > kCoolixSensorTempMax)
+ result += "Ignored";
+ else
+ result += uint64ToString(getSensorTemp()) + "C";
+ return result;
+}
+
+#if DECODE_COOLIX
+// Decode the supplied Coolix message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: The number of data bits to expect. Typically kCoolixBits.
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: BETA / Probably working.
+bool IRrecv::decodeCOOLIX(decode_results *results, uint16_t nbits,
+ bool strict) {
+ // The protocol sends the data normal + inverted, alternating on
+ // each byte. Hence twice the number of expected data bits.
+ if (results->rawlen < 2 * 2 * nbits + kHeader + kFooter - 1)
+ return false; // Can't possibly be a valid COOLIX message.
+ if (strict && nbits != kCoolixBits)
+ return false; // Not strictly a COOLIX message.
+ if (nbits % 8 != 0) // nbits has to be a multiple of nr. of bits in a byte.
+ return false;
+
+ uint64_t data = 0;
+ uint64_t inverted = 0;
+ uint16_t offset = kStartOffset;
+
+ if (nbits > sizeof(data) * 8)
+ return false; // We can't possibly capture a Coolix packet that big.
+
+ // Header
+ if (!matchMark(results->rawbuf[offset], kCoolixHdrMark)) return false;
+ // Calculate how long the common tick time is based on the header mark.
+ uint32_t m_tick = results->rawbuf[offset++] * kRawTick / kCoolixHdrMarkTicks;
+ if (!matchSpace(results->rawbuf[offset], kCoolixHdrSpace)) return false;
+ // Calculate how long the common tick time is based on the header space.
+ uint32_t s_tick = results->rawbuf[offset++] * kRawTick / kCoolixHdrSpaceTicks;
+
+ // Data
+ // Twice as many bits as there are normal plus inverted bits.
+ for (uint16_t i = 0; i < nbits * 2; i++, offset++) {
+ bool flip = (i / 8) % 2;
+ if (!matchMark(results->rawbuf[offset++], kCoolixBitMarkTicks * m_tick))
+ return false;
+ if (matchSpace(results->rawbuf[offset], kCoolixOneSpaceTicks * s_tick)) {
+ if (flip)
+ inverted = (inverted << 1) | 1;
+ else
+ data = (data << 1) | 1;
+ } else if (matchSpace(results->rawbuf[offset],
+ kCoolixZeroSpaceTicks * s_tick)) {
+ if (flip)
+ inverted <<= 1;
+ else
+ data <<= 1;
+ } else {
+ return false;
+ }
+ }
+
+ // Footer
+ if (!matchMark(results->rawbuf[offset++], kCoolixBitMarkTicks * m_tick))
+ return false;
+ if (offset < results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset], kCoolixMinGapTicks * s_tick))
+ return false;
+
+ // Compliance
+ uint64_t orig = data; // Save a copy of the data.
+ if (strict) {
+ for (uint16_t i = 0; i < nbits; i += 8, data >>= 8, inverted >>= 8)
+ if ((data & 0xFF) != ((inverted & 0xFF) ^ 0xFF)) return false;
+ }
+
+ // Success
+ results->decode_type = COOLIX;
+ results->bits = nbits;
+ results->value = orig;
+ results->address = 0;
+ results->command = 0;
+ return true;
+}
+#endif
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Coolix.h b/lib/IRremoteESP8266-2.5.2.03/src/ir_Coolix.h
new file mode 100644
index 000000000000..ee455207485c
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Coolix.h
@@ -0,0 +1,139 @@
+// Coolix A/C
+//
+// Copyright 2018 David Conran
+
+#ifndef IR_COOLIX_H_
+#define IR_COOLIX_H_
+
+#define __STDC_LIMIT_MACROS
+#include
+#ifndef UNIT_TEST
+#include
+#else
+#include
+#endif
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+
+// CCCCC OOOOO OOOOO LL IIIII XX XX
+// CC C OO OO OO OO LL III XX XX
+// CC OO OO OO OO LL III XXXX
+// CC C OO OO OO OO LL III XX XX
+// CCCCC OOOO0 OOOO0 LLLLLLL IIIII XX XX
+
+// Supports:
+// RG57K7(B)/BGEF remote control for Beko BINR 070/071 split-type aircon.
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/484
+// Kudos:
+// Hamper: For the breakdown and mapping of the bit values.
+
+// Constants
+// Modes
+const uint8_t kCoolixCool = 0b00;
+const uint8_t kCoolixDry = 0b01;
+const uint8_t kCoolixAuto = 0b10;
+const uint8_t kCoolixHeat = 0b11;
+const uint8_t kCoolixFan = 4; // Synthetic.
+const uint32_t kCoolixModeMask = 0b000000000000000000001100; // 0xC
+const uint32_t kCoolixZoneFollowMask = 0b000010000000000000000000; // 0x80000
+// Fan Control
+const uint8_t kCoolixFanMin = 0b100;
+const uint8_t kCoolixFanMed = 0b010;
+const uint8_t kCoolixFanMax = 0b001;
+const uint8_t kCoolixFanAuto = 0b101;
+const uint8_t kCoolixFanZoneFollow = 0b110;
+const uint8_t kCoolixFanFixed = 0b111;
+const uint32_t kCoolixFanMask = 0b000000001110000000000000; // 0x00E000
+// Temperature
+const uint8_t kCoolixTempMin = 17; // Celsius
+const uint8_t kCoolixTempMax = 30; // Celsius
+const uint8_t kCoolixTempRange = kCoolixTempMax - kCoolixTempMin + 1;
+const uint8_t kCoolixFanTempCode = 0b1110; // Part of Fan Mode.
+const uint32_t kCoolixTempMask = 0b11110000;
+const uint8_t kCoolixTempMap[kCoolixTempRange] = {
+ 0b0000, // 17C
+ 0b0001, // 18c
+ 0b0011, // 19C
+ 0b0010, // 20C
+ 0b0110, // 21C
+ 0b0111, // 22C
+ 0b0101, // 23C
+ 0b0100, // 24C
+ 0b1100, // 25C
+ 0b1101, // 26C
+ 0b1001, // 27C
+ 0b1000, // 28C
+ 0b1010, // 29C
+ 0b1011 // 30C
+};
+const uint8_t kCoolixSensorTempMin = 16; // Celsius
+const uint8_t kCoolixSensorTempMax = 30; // Celsius
+const uint8_t kCoolixSensorTempIgnoreCode = 0b1111;
+const uint32_t kCoolixSensorTempMask = 0b000000000000111100000000; // 0xF00
+// Fixed states/messages.
+const uint8_t kCoolixPrefix = 0b1011; // 0xB
+const uint8_t kCoolixUnknown = 0xFF;
+const uint32_t kCoolixOff = 0b101100100111101111100000; // 0xB27BE0
+const uint32_t kCoolixSwing = 0b101100100110101111100000; // 0xB26BE0
+const uint32_t kCoolixSleep = 0b101100101110000000000011; // 0xB2E003
+const uint32_t kCoolixTurbo = 0b101101011111010110100010; // 0xB5F5A2
+const uint32_t kCoolixLed = 0b101101011111010110100101; // 0xB5F5A5
+const uint32_t kCoolixClean = 0b101101011111010110101010; // 0xB5F5AA
+// On, 25C, Mode: Auto, Fan: Auto, Zone Follow: Off, Sensor Temp: Ignore.
+const uint32_t kCoolixDefaultState = 0b101100101011111111001000; // 0xB2BFC8
+
+// Classes
+class IRCoolixAC {
+ public:
+ explicit IRCoolixAC(uint16_t pin);
+
+ void stateReset();
+#if SEND_COOLIX
+ void send();
+#endif // SEND_COOLIX
+ void begin();
+ void on();
+ void off();
+ void setPower(const bool state);
+ bool getPower();
+ void setTemp(const uint8_t temp);
+ uint8_t getTemp();
+ void setSensorTemp(const uint8_t desired);
+ uint8_t getSensorTemp();
+ void clearSensorTemp();
+ void setFan(const uint8_t fan);
+ uint8_t getFan();
+ void setMode(const uint8_t mode);
+ uint8_t getMode();
+ void setSwing();
+ bool getSwing();
+ void setSleep();
+ bool getSleep();
+ void setTurbo();
+ bool getTurbo();
+ void setLed();
+ bool getLed();
+ void setClean();
+ bool getClean();
+ bool getZoneFollow();
+ uint32_t getRaw();
+ void setRaw(const uint32_t new_code);
+
+#ifdef ARDUINO
+ String toString();
+#else
+ std::string toString();
+#endif
+
+ private:
+ // The state of the IR remote in IR code form.
+ uint32_t remote_state;
+ IRsend _irsend;
+ void setTempRaw(const uint8_t code);
+ uint8_t getTempRaw();
+ void setSensorTempRaw(const uint8_t code);
+ void setZoneFollow(const bool state);
+};
+
+#endif // IR_COOLIX_H_
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Daikin.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Daikin.cpp
new file mode 100644
index 000000000000..b94b4a63aa00
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Daikin.cpp
@@ -0,0 +1,750 @@
+/*
+An Arduino sketch to emulate IR Daikin ARC433** remote control unit
+Read more at:
+http://harizanov.com/2012/02/control-daikin-air-conditioner-over-the-internet/
+
+Copyright 2016 sillyfrog
+Copyright 2017 sillyfrog, crankyoldgit
+*/
+
+#include "ir_Daikin.h"
+#include
+#ifndef ARDUINO
+#include
+#endif
+#include "IRrecv.h"
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+#include "IRutils.h"
+
+// DDDDD AAA IIIII KK KK IIIII NN NN
+// DD DD AAAAA III KK KK III NNN NN
+// DD DD AA AA III KKKK III NN N NN
+// DD DD AAAAAAA III KK KK III NN NNN
+// DDDDDD AA AA IIIII KK KK IIIII NN NN
+
+// Constants
+// Ref:
+// https://github.com/mharizanov/Daikin-AC-remote-control-over-the-Internet/tree/master/IRremote
+// http://rdlab.cdmt.vn/project-2013/daikin-ir-protocol
+
+#if SEND_DAIKIN
+// Original header
+// static uint8_t header1[DAIKIN_HEADER1_LENGTH];
+// header1[0] = 0b00010001;
+// header1[1] = 0b11011010;
+// header1[2] = 0b00100111;
+// header1[3] = 0b00000000;
+// header1[4] = 0b11000101;
+// header1[5] = 0b00000000;
+// header1[6] = 0b00000000;
+// header1[7] = 0b11010111;
+
+// Send a Daikin A/C message.
+//
+// Args:
+// data: An array of kDaikinStateLength bytes containing the IR command.
+//
+// Status: STABLE
+//
+// Ref:
+// IRDaikinESP.cpp
+// https://github.com/mharizanov/Daikin-AC-remote-control-over-the-Internet/tree/master/IRremote
+void IRsend::sendDaikin(unsigned char data[], uint16_t nbytes,
+ uint16_t repeat) {
+ if (nbytes < kDaikinStateLength)
+ return; // Not enough bytes to send a proper message.
+
+ for (uint16_t r = 0; r <= repeat; r++) {
+ // Send the header, 0b00000
+ sendGeneric(0, 0, // No header for the header
+ kDaikinBitMark, kDaikinOneSpace, kDaikinBitMark,
+ kDaikinZeroSpace, kDaikinBitMark, kDaikinZeroSpace + kDaikinGap,
+ (uint64_t)0b00000, 5, 38, false, 0, 50);
+ // Leading header
+ // Do this as a constant to save RAM and keep in flash memory
+ sendGeneric(kDaikinHdrMark, kDaikinHdrSpace, kDaikinBitMark,
+ kDaikinOneSpace, kDaikinBitMark, kDaikinZeroSpace,
+ kDaikinBitMark, kDaikinZeroSpace + kDaikinGap,
+ kDaikinFirstHeader64, 64, 38, false, 0, 50);
+ // Data #1
+ sendGeneric(kDaikinHdrMark, kDaikinHdrSpace, kDaikinBitMark,
+ kDaikinOneSpace, kDaikinBitMark, kDaikinZeroSpace,
+ kDaikinBitMark, kDaikinZeroSpace + kDaikinGap, data, 8, 38,
+ false, 0, 50);
+ // Data #2
+ sendGeneric(kDaikinHdrMark, kDaikinHdrSpace, kDaikinBitMark,
+ kDaikinOneSpace, kDaikinBitMark, kDaikinZeroSpace,
+ kDaikinBitMark, kDaikinZeroSpace + kDaikinGap, data + 8,
+ nbytes - 8, 38, false, 0, 50);
+ }
+}
+#endif // SEND_DAIKIN
+
+IRDaikinESP::IRDaikinESP(uint16_t pin) : _irsend(pin) { stateReset(); }
+
+void IRDaikinESP::begin() { _irsend.begin(); }
+
+#if SEND_DAIKIN
+void IRDaikinESP::send() {
+ checksum();
+ _irsend.sendDaikin(daikin);
+}
+#endif // SEND_DAIKIN
+
+// Calculate the checksum for a given data block.
+// Args:
+// block: Ptr to the start of the data block.
+// length: Nr. of bytes to checksum.
+// Returns:
+// A byte containing the calculated checksum.
+uint8_t IRDaikinESP::calcBlockChecksum(const uint8_t *block,
+ const uint16_t length) {
+ uint8_t sum = 0;
+ // Daikin checksum is just the addition of all the data bytes
+ // in the block but capped to 8 bits.
+ for (uint16_t i = 0; i < length; i++, block++) sum += *block;
+ return sum & 0xFFU;
+}
+
+// Verify the checksum is valid for a given state.
+// Args:
+// state: The array to verify the checksum of.
+// length: The size of the state.
+// Returns:
+// A boolean.
+bool IRDaikinESP::validChecksum(const uint8_t state[], const uint16_t length) {
+ if (length < 8 || state[7] != calcBlockChecksum(state, 7)) return false;
+ if (length < 10 ||
+ state[length - 1] != calcBlockChecksum(state + 8, length - 9))
+ return false;
+ return true;
+}
+
+// Calculate and set the checksum values for the internal state.
+void IRDaikinESP::checksum() {
+ daikin[7] = calcBlockChecksum(daikin, 7);
+ daikin[26] = calcBlockChecksum(daikin + 8, 17);
+}
+
+void IRDaikinESP::stateReset() {
+ for (uint8_t i = 0; i < kDaikinStateLength; i++) daikin[i] = 0x0;
+
+ daikin[0] = 0x11;
+ daikin[1] = 0xDA;
+ daikin[2] = 0x27;
+ daikin[4] = 0x42;
+ // daikin[7] is a checksum byte, it will be set by checksum().
+ daikin[8] = 0x11;
+ daikin[9] = 0xDA;
+ daikin[10] = 0x27;
+ daikin[13] = 0x49;
+ daikin[14] = 0x1E;
+ daikin[16] = 0xB0;
+ daikin[19] = 0x06;
+ daikin[20] = 0x60;
+ daikin[23] = 0xC0;
+ // daikin[26] is a checksum byte, it will be set by checksum().
+ checksum();
+}
+
+uint8_t *IRDaikinESP::getRaw() {
+ checksum(); // Ensure correct settings before sending.
+ return daikin;
+}
+
+void IRDaikinESP::setRaw(uint8_t new_code[]) {
+ for (uint8_t i = 0; i < kDaikinStateLength; i++) daikin[i] = new_code[i];
+}
+
+void IRDaikinESP::on() {
+ // state = ON;
+ setBit(kDaikinBytePower, kDaikinBitPower);
+}
+
+void IRDaikinESP::off() {
+ // state = OFF;
+ clearBit(kDaikinBytePower, kDaikinBitPower);
+}
+
+void IRDaikinESP::setPower(bool state) {
+ if (state)
+ on();
+ else
+ off();
+}
+
+bool IRDaikinESP::getPower() {
+ return (getBit(kDaikinBytePower, kDaikinBitPower) > 0);
+}
+
+// Set the temp in deg C
+void IRDaikinESP::setTemp(uint8_t temp) {
+ if (temp < kDaikinMinTemp)
+ temp = kDaikinMinTemp;
+ else if (temp > kDaikinMaxTemp)
+ temp = kDaikinMaxTemp;
+ daikin[14] = temp * 2;
+}
+
+uint8_t IRDaikinESP::getTemp() { return daikin[14] / 2; }
+
+// Set the speed of the fan, 1-5 or kDaikinFanAuto or kDaikinFanQuiet
+void IRDaikinESP::setFan(uint8_t fan) {
+ // Set the fan speed bits, leave low 4 bits alone
+ uint8_t fanset;
+ if (fan == kDaikinFanQuiet || fan == kDaikinFanAuto)
+ fanset = fan;
+ else if (fan < kDaikinFanMin || fan > kDaikinFanMax)
+ fanset = kDaikinFanAuto;
+ else
+ fanset = 2 + fan;
+ daikin[16] &= 0x0F;
+ daikin[16] |= (fanset << 4);
+}
+
+uint8_t IRDaikinESP::getFan() {
+ uint8_t fan = daikin[16] >> 4;
+ if (fan != kDaikinFanQuiet && fan != kDaikinFanAuto) fan -= 2;
+ return fan;
+}
+
+uint8_t IRDaikinESP::getMode() {
+ /*
+ kDaikinCool
+ kDaikinHeat
+ kDaikinFan
+ kDaikinAuto
+ kDaikinDry
+ */
+ return daikin[13] >> 4;
+}
+
+void IRDaikinESP::setMode(uint8_t mode) {
+ switch (mode) {
+ case kDaikinCool:
+ case kDaikinHeat:
+ case kDaikinFan:
+ case kDaikinDry:
+ break;
+ default:
+ mode = kDaikinAuto;
+ }
+ mode <<= 4;
+ daikin[13] &= 0b10001111;
+ daikin[13] |= mode;
+}
+
+void IRDaikinESP::setSwingVertical(bool state) {
+ if (state)
+ daikin[16] |= 0x0F;
+ else
+ daikin[16] &= 0xF0;
+}
+
+bool IRDaikinESP::getSwingVertical() { return daikin[16] & 0x01; }
+
+void IRDaikinESP::setSwingHorizontal(bool state) {
+ if (state)
+ daikin[17] |= 0x0F;
+ else
+ daikin[17] &= 0xF0;
+}
+
+bool IRDaikinESP::getSwingHorizontal() { return daikin[17] & 0x01; }
+
+void IRDaikinESP::setQuiet(bool state) {
+ if (state) {
+ setBit(kDaikinByteSilent, kDaikinBitSilent);
+ // Powerful & Quiet mode being on are mutually exclusive.
+ setPowerful(false);
+ } else {
+ clearBit(kDaikinByteSilent, kDaikinBitSilent);
+ }
+}
+
+bool IRDaikinESP::getQuiet() {
+ return (getBit(kDaikinByteSilent, kDaikinBitSilent) > 0);
+}
+
+void IRDaikinESP::setPowerful(bool state) {
+ if (state) {
+ setBit(kDaikinBytePowerful, kDaikinBitPowerful);
+ // Powerful, Quiet, & Econo mode being on are mutually exclusive.
+ setQuiet(false);
+ setEcono(false);
+ } else {
+ clearBit(kDaikinBytePowerful, kDaikinBitPowerful);
+ }
+}
+
+bool IRDaikinESP::getPowerful() {
+ return (getBit(kDaikinBytePowerful, kDaikinBitPowerful) > 0);
+}
+
+void IRDaikinESP::setSensor(bool state) {
+ if (state)
+ setBit(kDaikinByteSensor, kDaikinBitSensor);
+ else
+ clearBit(kDaikinByteSensor, kDaikinBitSensor);
+}
+
+bool IRDaikinESP::getSensor() {
+ return (getBit(kDaikinByteSensor, kDaikinBitSensor) > 0);
+}
+
+void IRDaikinESP::setEcono(bool state) {
+ if (state) {
+ setBit(kDaikinByteEcono, kDaikinBitEcono);
+ // Powerful & Econo mode being on are mutually exclusive.
+ setPowerful(false);
+ } else {
+ clearBit(kDaikinByteEcono, kDaikinBitEcono);
+ }
+}
+
+bool IRDaikinESP::getEcono() {
+ return (getBit(kDaikinByteEcono, kDaikinBitEcono) > 0);
+}
+
+void IRDaikinESP::setEye(bool state) {
+ if (state)
+ setBit(kDaikinByteEye, kDaikinBitEye);
+ else
+ clearBit(kDaikinByteEye, kDaikinBitEye);
+}
+
+bool IRDaikinESP::getEye() {
+ return (getBit(kDaikinByteEye, kDaikinBitEye) > 0);
+}
+
+void IRDaikinESP::setMold(bool state) {
+ if (state)
+ setBit(kDaikinByteMold, kDaikinBitMold);
+ else
+ clearBit(kDaikinByteMold, kDaikinBitMold);
+}
+
+bool IRDaikinESP::getMold() {
+ return (getBit(kDaikinByteMold, kDaikinBitMold) > 0);
+}
+
+void IRDaikinESP::setBit(uint8_t byte, uint8_t bitmask) {
+ daikin[byte] |= bitmask;
+}
+
+void IRDaikinESP::clearBit(uint8_t byte, uint8_t bitmask) {
+ bitmask = ~bitmask;
+ daikin[byte] &= bitmask;
+}
+
+uint8_t IRDaikinESP::getBit(uint8_t byte, uint8_t bitmask) {
+ return daikin[byte] & bitmask;
+}
+
+// starttime: Number of minutes after midnight, in 10 minutes increments
+void IRDaikinESP::enableOnTimer(uint16_t starttime) {
+ setBit(kDaikinByteOnTimer, kDaikinBitOnTimer);
+ daikin[18] = (uint8_t)(starttime & 0x00FF);
+ // only keep 4 bits
+ daikin[19] &= 0xF0;
+ daikin[19] |= (uint8_t)((starttime >> 8) & 0x0F);
+}
+
+void IRDaikinESP::disableOnTimer() {
+ enableOnTimer(0x600);
+ clearBit(kDaikinByteOnTimer, kDaikinBitOnTimer);
+}
+
+uint16_t IRDaikinESP::getOnTime() {
+ uint16_t ret;
+ ret = daikin[19] & 0x0F;
+ ret = ret << 8;
+ ret += daikin[18];
+ return ret;
+}
+
+bool IRDaikinESP::getOnTimerEnabled() {
+ return getBit(kDaikinByteOnTimer, kDaikinBitOnTimer);
+}
+
+// endtime: Number of minutes after midnight, in 10 minutes increments
+void IRDaikinESP::enableOffTimer(uint16_t endtime) {
+ setBit(kDaikinByteOffTimer, kDaikinBitOffTimer);
+ daikin[20] = (uint8_t)((endtime >> 4) & 0xFF);
+ daikin[19] &= 0x0F;
+ daikin[19] |= (uint8_t)((endtime & 0x000F) << 4);
+}
+
+void IRDaikinESP::disableOffTimer() {
+ enableOffTimer(0x600);
+ clearBit(kDaikinByteOffTimer, kDaikinBitOffTimer);
+}
+
+uint16_t IRDaikinESP::getOffTime() {
+ uint16_t ret, tmp;
+ ret = daikin[20];
+ ret <<= 4;
+ tmp = daikin[19] & 0xF0;
+ tmp >>= 4;
+ ret += tmp;
+ return ret;
+}
+
+bool IRDaikinESP::getOffTimerEnabled() {
+ return getBit(kDaikinByteOffTimer, kDaikinBitOffTimer);
+}
+
+void IRDaikinESP::setCurrentTime(uint16_t numMins) {
+ if (numMins > 24 * 60) numMins = 0; // If > 23:59, set to 00:00
+ daikin[5] = (uint8_t)(numMins & 0x00FF);
+ // only keep 4 bits
+ daikin[6] &= 0xF0;
+ daikin[6] |= (uint8_t)((numMins >> 8) & 0x0F);
+}
+
+uint16_t IRDaikinESP::getCurrentTime() {
+ uint16_t ret;
+ ret = daikin[6] & 0x0F;
+ ret <<= 8;
+ ret += daikin[5];
+ return ret;
+}
+
+#ifdef ARDUINO
+String IRDaikinESP::renderTime(uint16_t timemins) {
+ String ret;
+#else // ARDUINO
+std::string IRDaikinESP::renderTime(uint16_t timemins) {
+ std::string ret;
+#endif // ARDUINO
+ uint16_t hours, mins;
+ hours = timemins / 60;
+ ret = uint64ToString(hours) + ":";
+ mins = timemins - (hours * 60);
+ if (mins < 10) ret += "0";
+ ret += uint64ToString(mins);
+ return ret;
+}
+
+// Convert the internal state into a human readable string.
+#ifdef ARDUINO
+String IRDaikinESP::toString() {
+ String result = "";
+#else // ARDUINO
+std::string IRDaikinESP::toString() {
+ std::string result = "";
+#endif // ARDUINO
+ result += "Power: ";
+ if (getPower())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Mode: " + uint64ToString(getMode());
+ switch (getMode()) {
+ case kDaikinAuto:
+ result += " (AUTO)";
+ break;
+ case kDaikinCool:
+ result += " (COOL)";
+ break;
+ case kDaikinHeat:
+ result += " (HEAT)";
+ break;
+ case kDaikinDry:
+ result += " (DRY)";
+ break;
+ case kDaikinFan:
+ result += " (FAN)";
+ break;
+ default:
+ result += " (UNKNOWN)";
+ }
+ result += ", Temp: " + uint64ToString(getTemp()) + "C";
+ result += ", Fan: " + uint64ToString(getFan());
+ switch (getFan()) {
+ case kDaikinFanAuto:
+ result += " (AUTO)";
+ break;
+ case kDaikinFanQuiet:
+ result += " (QUIET)";
+ break;
+ case kDaikinFanMin:
+ result += " (MIN)";
+ break;
+ case kDaikinFanMax:
+ result += " (MAX)";
+ break;
+ }
+ result += ", Powerful: ";
+ if (getPowerful())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Quiet: ";
+ if (getQuiet())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Sensor: ";
+ if (getSensor())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Eye: ";
+ if (getEye())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Mold: ";
+ if (getMold())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Swing (Horizontal): ";
+ if (getSwingHorizontal())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Swing (Vertical): ";
+ if (getSwingVertical())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Current Time: " + renderTime(getCurrentTime());
+ result += ", On Time: ";
+ if (getOnTimerEnabled())
+ result += renderTime(getOnTime());
+ else
+ result += "Off";
+ result += ", Off Time: ";
+ if (getOffTimerEnabled())
+ result += renderTime(getOffTime());
+ else
+ result += "Off";
+
+ return result;
+}
+
+#if DAIKIN_DEBUG
+// Print what we have
+void IRDaikinESP::printState() {
+#ifdef ARDUINO
+ String strbits;
+#else // ARDUINO
+ std::string strbits;
+#endif // ARDUINO
+ DPRINTLN("Raw Bits:");
+ for (uint8_t i = 0; i < kDaikinStateLength; i++) {
+ strbits = uint64ToString(daikin[i], BIN);
+ while (strbits.length() < 8) strbits = "0" + strbits;
+ DPRINT(strbits);
+ DPRINT(" ");
+ }
+ DPRINTLN("");
+ DPRINTLN(toString());
+}
+#endif // DAIKIN_DEBUG
+
+/*
+ * Return most important bits to allow replay
+ * layout is:
+ * 0: Power
+ * 1-3: Mode
+ * 4-7: Fan speed/mode
+ * 8-14: Target Temperature
+ * 15: Econo
+ * 16: Powerful
+ * 17: Quiet
+ * 18: Sensor
+ * 19: Swing Vertical
+ * 20-31: Current time (mins since midnight)
+ * */
+uint32_t IRDaikinESP::getCommand() {
+ uint32_t ret = 0;
+ uint32_t tmp = 0;
+ if (getPower()) ret |= 0b00000000000000000000000000000001;
+ tmp = getMode();
+ tmp = tmp << 1;
+ ret |= tmp;
+
+ tmp = getFan();
+ tmp <<= 4;
+ ret |= tmp;
+
+ tmp = getTemp();
+ tmp <<= 8;
+ ret |= tmp;
+
+ if (getEcono()) ret |= 0b00000000000000001000000000000000;
+ if (getPowerful()) ret |= 0b00000000000000010000000000000000;
+ if (getQuiet()) ret |= 0b00000000000000100000000000000000;
+ if (getSensor()) ret |= 0b00000000000001000000000000000000;
+ if (getSwingVertical()) ret |= 0b00000000000010000000000000000000;
+ ret |= (getCurrentTime() << 20);
+ return ret;
+}
+
+void IRDaikinESP::setCommand(uint32_t value) {
+ uint32_t tmp = 0;
+ if (value & 0b00000000000000000000000000000001) setPower(true);
+ tmp = value & 0b00000000000000000000000000001110;
+ tmp >>= 1;
+ setMode(tmp);
+
+ tmp = value & 0b00000000000000000000000011110000;
+ tmp >>= 4;
+ setFan(tmp);
+
+ tmp = value & 0b00000000000000000111111100000000;
+ tmp >>= 8;
+ setTemp(tmp);
+
+ if (value & 0b00000000000000001000000000000000) setEcono(true);
+ if (value & 0b00000000000000010000000000000000) setPowerful(true);
+ if (value & 0b00000000000000100000000000000000) setQuiet(true);
+ if (value & 0b00000000000001000000000000000000) setSensor(true);
+ if (value & 0b00000000000010000000000000000000) setSwingVertical(true);
+
+ value >>= 20;
+ setCurrentTime(value);
+}
+
+#if DECODE_DAIKIN
+
+void addbit(bool val, unsigned char data[]) {
+ uint8_t curbit = data[kDaikinCurBit];
+ uint8_t curindex = data[kDaikinCurIndex];
+ if (val) {
+ unsigned char bit = 1;
+ bit = bit << curbit;
+ data[curindex] |= bit;
+ }
+ curbit++;
+ if (curbit == 8) {
+ curbit = 0;
+ curindex++;
+ }
+ data[kDaikinCurBit] = curbit;
+ data[kDaikinCurIndex] = curindex;
+}
+
+bool checkheader(decode_results *results, uint16_t *offset) {
+ if (!IRrecv::matchMark(results->rawbuf[(*offset)++], kDaikinBitMark,
+ kDaikinTolerance, kDaikinMarkExcess))
+ return false;
+ if (!IRrecv::matchSpace(results->rawbuf[(*offset)++],
+ kDaikinZeroSpace + kDaikinGap, kDaikinTolerance,
+ kDaikinMarkExcess))
+ return false;
+ if (!IRrecv::matchMark(results->rawbuf[(*offset)++], kDaikinHdrMark,
+ kDaikinTolerance, kDaikinMarkExcess))
+ return false;
+ if (!IRrecv::matchSpace(results->rawbuf[(*offset)++], kDaikinHdrSpace,
+ kDaikinTolerance, kDaikinMarkExcess))
+ return false;
+
+ return true;
+}
+
+bool readbits(decode_results *results, uint16_t *offset,
+ unsigned char daikin_code[], uint16_t countbits) {
+ for (uint16_t i = 0; i < countbits && *offset < results->rawlen - 1;
+ i++, (*offset)++) {
+ if (!IRrecv::matchMark(results->rawbuf[(*offset)++], kDaikinBitMark,
+ kDaikinTolerance, kDaikinMarkExcess))
+ return false;
+ if (IRrecv::matchSpace(results->rawbuf[*offset], kDaikinOneSpace,
+ kDaikinTolerance, kDaikinMarkExcess))
+ addbit(1, daikin_code);
+ else if (IRrecv::matchSpace(results->rawbuf[*offset], kDaikinZeroSpace,
+ kDaikinTolerance, kDaikinMarkExcess))
+ addbit(0, daikin_code);
+ else
+ return false;
+ }
+ return true;
+}
+
+// Decode the supplied Daikin A/C message.
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: Nr. of bits to expect in the data portion. (kDaikinRawBits)
+// strict: Flag to indicate if we strictly adhere to the specification.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: BETA / Should be working.
+//
+// Notes:
+// If DAIKIN_DEBUG enabled, will print all the set options and values.
+//
+// Ref:
+// https://github.com/mharizanov/Daikin-AC-remote-control-over-the-Internet/tree/master/IRremote
+bool IRrecv::decodeDaikin(decode_results *results, uint16_t nbits,
+ bool strict) {
+ if (results->rawlen < kDaikinRawBits) return false;
+
+ // Compliance
+ if (strict && nbits != kDaikinRawBits) return false;
+
+ uint16_t offset = kStartOffset;
+ unsigned char daikin_code[kDaikinStateLength + 2];
+ for (uint8_t i = 0; i < kDaikinStateLength + 2; i++) daikin_code[i] = 0;
+
+ // Header (#1)
+ for (uint8_t i = 0; i < 10; i++) {
+ if (!matchMark(results->rawbuf[offset++], kDaikinBitMark)) return false;
+ }
+ if (!checkheader(results, &offset)) return false;
+
+ // Data (#1)
+ if (!readbits(results, &offset, daikin_code, 8 * 8)) return false;
+
+ // Ignore everything that has just been captured as it is not needed.
+ // Some remotes may not send this portion, my remote did, but it's not
+ // required.
+ for (uint8_t i = 0; i < kDaikinStateLength + 2; i++) daikin_code[i] = 0;
+
+ // Header (#2)
+ if (!checkheader(results, &offset)) return false;
+
+ // Data (#2)
+ if (!readbits(results, &offset, daikin_code, 8 * 8)) return false;
+
+ // Header (#3)
+ if (!checkheader(results, &offset)) return false;
+
+ // Data (#3), read up everything else
+ if (!readbits(results, &offset, daikin_code, kDaikinBits - (8 * 8)))
+ return false;
+
+ // Footer
+ if (!matchMark(results->rawbuf[offset++], kDaikinBitMark)) return false;
+ if (offset < results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset], kDaikinGap))
+ return false;
+
+ // Compliance
+ if (strict) {
+ if (!IRDaikinESP::validChecksum(daikin_code)) return false;
+ }
+
+ // Success
+#if DAIKIN_DEBUG
+ IRDaikinESP dako = IRDaikinESP(0);
+ dako.setRaw(daikin_code);
+#ifdef ARDUINO
+ yield();
+#endif // ARDUINO
+ dako.printState();
+#endif // DAIKIN_DEBUG
+
+ // Copy across the bits to state
+ for (uint8_t i = 0; i < kDaikinStateLength; i++)
+ results->state[i] = daikin_code[i];
+ results->bits = kDaikinStateLength * 8;
+ results->decode_type = DAIKIN;
+ return true;
+}
+#endif // DECODE_DAIKIN
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Daikin.h b/lib/IRremoteESP8266-2.5.2.03/src/ir_Daikin.h
new file mode 100644
index 000000000000..7094990d85a4
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Daikin.h
@@ -0,0 +1,208 @@
+// Copyright 2016 sillyfrog
+// Copyright 2017 sillyfrog, crankyoldgit
+#ifndef IR_DAIKIN_H_
+#define IR_DAIKIN_H_
+
+#ifndef UNIT_TEST
+#include
+#else
+#include
+#endif
+#include "IRrecv.h"
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+
+// Option to disable the additional Daikin debug info to conserve memory
+#define DAIKIN_DEBUG false
+
+// DDDDD AAA IIIII KK KK IIIII NN NN
+// DD DD AAAAA III KK KK III NNN NN
+// DD DD AA AA III KKKK III NN N NN
+// DD DD AAAAAAA III KK KK III NN NNN
+// DDDDDD AA AA IIIII KK KK IIIII NN NN
+
+/*
+ Daikin AC map
+ byte 5=Current time, mins past midnight, low bits
+ byte 6
+ b0-b3=Current time, mins past midnight, high bits
+ byte 7= checksum of the first part (and last byte before a 29ms pause)
+ byte 13=mode
+ b7 = 0
+ b6+b5+b4 = Mode
+ Modes: b6+b5+b4
+ 011 = Cool
+ 100 = Heat (temp 23)
+ 110 = FAN (temp not shown, but 25)
+ 000 = Fully Automatic (temp 25)
+ 010 = DRY (temp 0xc0 = 96 degrees c)
+ b3 = 1
+ b2 = OFF timer set
+ b1 = ON timer set
+ b0 = Air Conditioner ON
+ byte 14=temp*2 (Temp should be between 10 - 32)
+ byte 16=Fan
+ FAN control
+ b7+b6+b5+b4 = Fan speed
+ Fan: b7+b6+b5+b4
+ 0×3 = 1 bar
+ 0×4 = 2 bar
+ 0×5 = 3 bar
+ 0×6 = 4 bar
+ 0×7 = 5 bar
+ 0xa = Auto
+ 0xb = Quite
+ b3+b2+b1+b0 = Swing control up/down
+ Swing control up/down:
+ 0000 = Swing up/down off
+ 1111 = Swing up/down on
+ byte 17
+ Swing control left/right:
+ 0000 = Swing left/right off
+ 1111 = Swing left/right on
+ byte 18=On timer mins past midnight, low bits
+ byte 19
+ b0-b3=On timer mins past midnight, high bits
+ b4-b7=Off timer mins past midnight, low bits
+ byte 20=Off timer mins past midnight, high bits
+ byte 21=Aux -> Powerful (bit 1), Silent (bit 5)
+ byte 24=Aux2
+ b1: Sensor
+ b2: Econo mode
+ b7: Intelligent eye on
+ byte 25=Aux3
+ b1: Mold Proof
+ byte 26= checksum of the second part
+*/
+
+// Constants
+const uint8_t kDaikinAuto = 0b000;
+const uint8_t kDaikinDry = 0b010;
+const uint8_t kDaikinCool = 0b011;
+const uint8_t kDaikinHeat = 0b100;
+const uint8_t kDaikinFan = 0b110;
+const uint8_t kDaikinMinTemp = 10; // Celsius
+const uint8_t kDaikinMaxTemp = 32; // Celsius
+const uint8_t kDaikinFanMin = 1;
+const uint8_t kDaikinFanMax = 5;
+const uint8_t kDaikinFanAuto = 0b1010;
+const uint8_t kDaikinFanQuiet = 0b1011;
+const uint8_t kDaikinBytePower = 13;
+const uint8_t kDaikinBitPower = 0b00000001;
+const uint8_t kDaikinBytePowerful = 21;
+const uint8_t kDaikinBitPowerful = 0b00000001;
+const uint8_t kDaikinByteSilent = 21;
+const uint8_t kDaikinBitSilent = 0b00100000;
+const uint8_t kDaikinByteSensor = 24;
+const uint8_t kDaikinBitSensor = 0b00000010;
+const uint8_t kDaikinByteEcono = 24;
+const uint8_t kDaikinBitEcono = 0b00000100;
+const uint8_t kDaikinByteEye = 24;
+const uint8_t kDaikinBitEye = 0b10000000;
+const uint8_t kDaikinByteMold = 25;
+const uint8_t kDaikinBitMold = 0b00000010;
+const uint8_t kDaikinByteOffTimer = 13;
+const uint8_t kDaikinBitOffTimer = 0b00000100;
+const uint8_t kDaikinByteOnTimer = 13;
+const uint8_t kDaikinBitOnTimer = 0b00000010;
+const uint8_t kDaikinCurBit = kDaikinStateLength;
+const uint8_t kDaikinCurIndex = kDaikinStateLength + 1;
+const uint8_t kDaikinTolerance = 35;
+const uint16_t kDaikinMarkExcess = kMarkExcess;
+const uint16_t kDaikinHdrMark = 3650; // kDaikinBitMark * 8
+const uint16_t kDaikinHdrSpace = 1623; // kDaikinBitMark * 4
+const uint16_t kDaikinBitMark = 428;
+const uint16_t kDaikinZeroSpace = 428;
+const uint16_t kDaikinOneSpace = 1280;
+const uint16_t kDaikinGap = 29000;
+// Note bits in each octet swapped so can be sent as a single value
+const uint64_t kDaikinFirstHeader64 =
+ 0b1101011100000000000000001100010100000000001001111101101000010001;
+
+// Legacy defines.
+#define DAIKIN_COOL kDaikinCool
+#define DAIKIN_HEAT kDaikinHeat
+#define DAIKIN_FAN kDaikinFan
+#define DAIKIN_AUTO kDaikinAuto
+#define DAIKIN_DRY kDaikinDry
+#define DAIKIN_MIN_TEMP kDaikinMinTemp
+#define DAIKIN_MAX_TEMP kDaikinMaxTemp
+#define DAIKIN_FAN_MIN kDaikinFanMin
+#define DAIKIN_FAN_MAX kDaikinFanMax
+#define DAIKIN_FAN_AUTO kDaikinFanAuto
+#define DAIKIN_FAN_QUIET kDaikinFanQuiet
+
+class IRDaikinESP {
+ public:
+ explicit IRDaikinESP(uint16_t pin);
+
+#if SEND_DAIKIN
+ void send();
+#endif
+ void begin();
+ void on();
+ void off();
+ void setPower(bool state);
+ bool getPower();
+ void setTemp(uint8_t temp);
+ uint8_t getTemp();
+ void setFan(uint8_t fan);
+ uint8_t getFan();
+ uint8_t getMode();
+ void setMode(uint8_t mode);
+ void setSwingVertical(bool state);
+ bool getSwingVertical();
+ void setSwingHorizontal(bool state);
+ bool getSwingHorizontal();
+ bool getQuiet();
+ void setQuiet(bool state);
+ bool getPowerful();
+ void setPowerful(bool state);
+ void setSensor(bool state);
+ bool getSensor();
+ void setEcono(bool state);
+ bool getEcono();
+ void setEye(bool state);
+ bool getEye();
+ void setMold(bool state);
+ bool getMold();
+ void enableOnTimer(uint16_t starttime);
+ void disableOnTimer();
+ uint16_t getOnTime();
+ bool getOnTimerEnabled();
+ void enableOffTimer(uint16_t endtime);
+ void disableOffTimer();
+ uint16_t getOffTime();
+ bool getOffTimerEnabled();
+ void setCurrentTime(uint16_t time);
+ uint16_t getCurrentTime();
+ uint8_t* getRaw();
+ void setRaw(uint8_t new_code[]);
+#if DAIKIN_DEBUG
+ void printState();
+#endif // DAIKIN_DEBUG
+ uint32_t getCommand();
+ void setCommand(uint32_t value);
+ static bool validChecksum(const uint8_t state[],
+ const uint16_t length = kDaikinStateLength);
+#ifdef ARDUINO
+ String toString();
+ static String renderTime(uint16_t timemins);
+#else
+ std::string toString();
+ static std::string renderTime(uint16_t timemins);
+#endif
+
+ private:
+ // # of bytes per command
+ uint8_t daikin[kDaikinStateLength];
+ void stateReset();
+ static uint8_t calcBlockChecksum(const uint8_t* block, const uint16_t length);
+ void checksum();
+ void setBit(uint8_t byte, uint8_t bitmask);
+ void clearBit(uint8_t byte, uint8_t bitmask);
+ uint8_t getBit(uint8_t byte, uint8_t bitmask);
+ IRsend _irsend;
+};
+
+#endif // IR_DAIKIN_H_
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Denon.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Denon.cpp
similarity index 59%
rename from lib/IRremoteESP8266-2.2.1.02/src/ir_Denon.cpp
rename to lib/IRremoteESP8266-2.5.2.03/src/ir_Denon.cpp
index 538e5af101c4..6798e022e3d1 100644
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Denon.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Denon.cpp
@@ -4,7 +4,6 @@
#include
#include "IRrecv.h"
#include "IRsend.h"
-#include "IRtimer.h"
#include "IRutils.h"
// DDDD EEEEE N N OOO N N
@@ -19,25 +18,25 @@
// Constants
// Ref:
// https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Denon.cpp
-#define DENON_TICK 263U
-#define DENON_HDR_MARK_TICKS 1U
-#define DENON_HDR_MARK (DENON_HDR_MARK_TICKS * DENON_TICK)
-#define DENON_HDR_SPACE_TICKS 3U
-#define DENON_HDR_SPACE (DENON_HDR_SPACE_TICKS * DENON_TICK)
-#define DENON_BIT_MARK_TICKS 1U
-#define DENON_BIT_MARK (DENON_BIT_MARK_TICKS * DENON_TICK)
-#define DENON_ONE_SPACE_TICKS 7U
-#define DENON_ONE_SPACE (DENON_ONE_SPACE_TICKS * DENON_TICK)
-#define DENON_ZERO_SPACE_TICKS 3U
-#define DENON_ZERO_SPACE (DENON_ZERO_SPACE_TICKS * DENON_TICK)
-#define DENON_MIN_COMMAND_LENGTH_TICKS 510U
-#define DENON_MIN_COMMAND_LENGTH (DENON_MIN_COMMAND_LENGTH_TICKS * DENON_TICK)
-#define DENON_MIN_GAP_TICKS (DENON_MIN_COMMAND_LENGTH_TICKS - \
- (DENON_HDR_MARK_TICKS + DENON_HDR_SPACE_TICKS + \
- DENON_BITS * (DENON_BIT_MARK_TICKS + DENON_ONE_SPACE_TICKS) + \
- DENON_BIT_MARK_TICKS))
-#define DENON_MIN_GAP (DENON_MIN_GAP_TICKS * DENON_TICK)
-#define DENON_MANUFACTURER 0x2A4CULL
+const uint16_t kDenonTick = 263;
+const uint16_t kDenonHdrMarkTicks = 1;
+const uint16_t kDenonHdrMark = kDenonHdrMarkTicks * kDenonTick;
+const uint16_t kDenonHdrSpaceTicks = 3;
+const uint16_t kDenonHdrSpace = kDenonHdrSpaceTicks * kDenonTick;
+const uint16_t kDenonBitMarkTicks = 1;
+const uint16_t kDenonBitMark = kDenonBitMarkTicks * kDenonTick;
+const uint16_t kDenonOneSpaceTicks = 7;
+const uint16_t kDenonOneSpace = kDenonOneSpaceTicks * kDenonTick;
+const uint16_t kDenonZeroSpaceTicks = 3;
+const uint16_t kDenonZeroSpace = kDenonZeroSpaceTicks * kDenonTick;
+const uint16_t kDenonMinCommandLengthTicks = 510;
+const uint16_t kDenonMinGapTicks =
+ kDenonMinCommandLengthTicks -
+ (kDenonHdrMarkTicks + kDenonHdrSpaceTicks +
+ kDenonBits * (kDenonBitMarkTicks + kDenonOneSpaceTicks) +
+ kDenonBitMarkTicks);
+const uint32_t kDenonMinGap = kDenonMinGapTicks * kDenonTick;
+const uint64_t kDenonManufacturer = 0x2A4CULL;
#if SEND_DENON
// Send a Denon message
@@ -56,9 +55,9 @@
// https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Denon.cpp
// http://assets.denon.com/documentmaster/us/denon%20master%20ir%20hex.xls
void IRsend::sendDenon(uint64_t data, uint16_t nbits, uint16_t repeat) {
- if (nbits >= PANASONIC_BITS) // Is this really Panasonic?
+ if (nbits >= kPanasonicBits) // Is this really Panasonic?
sendPanasonic64(data, nbits, repeat);
- else if (nbits == DENON_LEGACY_BITS)
+ else if (nbits == kDenonLegacyBits)
// Support legacy (broken) calls of sendDenon().
sendSharpRaw(data & (~0x2000ULL), nbits + 1, repeat);
else
@@ -85,7 +84,7 @@ bool IRrecv::decodeDenon(decode_results *results, uint16_t nbits, bool strict) {
switch (nbits) {
case DENON_BITS:
case DENON_48_BITS:
- case DENON_LEGACY_BITS:
+ case kDenonLegacyBits:
break;
default:
return false;
@@ -100,40 +99,36 @@ bool IRrecv::decodeDenon(decode_results *results, uint16_t nbits, bool strict) {
// manufacturer code.
if (!decodeSharp(results, nbits, true, false) &&
- !decodePanasonic(results, nbits, true, DENON_MANUFACTURER)) {
+ !decodePanasonic(results, nbits, true, kDenonManufacturer)) {
// We couldn't decode it as expected, so try the old legacy method.
// NOTE: I don't think this following protocol actually exists.
// Looks like a partial version of the Sharp protocol.
// Check we have enough data
- if (results->rawlen < 2 * nbits + HEADER + FOOTER - 1)
- return false;
- if (strict && nbits != DENON_LEGACY_BITS)
- return false;
+ if (results->rawlen < 2 * nbits + kHeader + kFooter - 1) return false;
+ if (strict && nbits != kDenonLegacyBits) return false;
uint64_t data = 0;
- uint16_t offset = OFFSET_START;
+ uint16_t offset = kStartOffset;
// Header
- if (!matchMark(results->rawbuf[offset], DENON_HDR_MARK)) return false;
+ if (!matchMark(results->rawbuf[offset], kDenonHdrMark)) return false;
// Calculate how long the common tick time is based on the header mark.
- uint32_t m_tick = results->rawbuf[offset++] * RAWTICK /
- DENON_HDR_MARK_TICKS;
- if (!matchSpace(results->rawbuf[offset], DENON_HDR_SPACE)) return false;
- uint32_t s_tick = results->rawbuf[offset++] * RAWTICK /
- DENON_HDR_SPACE_TICKS;
+ uint32_t m_tick = results->rawbuf[offset++] * kRawTick / kDenonHdrMarkTicks;
+ if (!matchSpace(results->rawbuf[offset], kDenonHdrSpace)) return false;
+ uint32_t s_tick =
+ results->rawbuf[offset++] * kRawTick / kDenonHdrSpaceTicks;
// Data
- match_result_t data_result = matchData(&(results->rawbuf[offset]), nbits,
- DENON_BIT_MARK_TICKS * m_tick,
- DENON_ONE_SPACE_TICKS * s_tick,
- DENON_BIT_MARK_TICKS * m_tick,
- DENON_ZERO_SPACE_TICKS * s_tick);
+ match_result_t data_result =
+ matchData(&(results->rawbuf[offset]), nbits,
+ kDenonBitMarkTicks * m_tick, kDenonOneSpaceTicks * s_tick,
+ kDenonBitMarkTicks * m_tick, kDenonZeroSpaceTicks * s_tick);
if (data_result.success == false) return false;
data = data_result.data;
offset += data_result.used;
// Footer
- if (!matchMark(results->rawbuf[offset++], DENON_BIT_MARK_TICKS * m_tick))
+ if (!matchMark(results->rawbuf[offset++], kDenonBitMarkTicks * m_tick))
return false;
// Success
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Dish.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Dish.cpp
similarity index 59%
rename from lib/IRremoteESP8266-2.2.1.02/src/ir_Dish.cpp
rename to lib/IRremoteESP8266-2.5.2.03/src/ir_Dish.cpp
index 4555db92ff6c..040aa3bf714c 100644
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Dish.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Dish.cpp
@@ -3,7 +3,6 @@
#include "IRrecv.h"
#include "IRsend.h"
-#include "IRtimer.h"
#include "IRutils.h"
// DDDD IIIII SSSS H H
@@ -19,19 +18,19 @@
// Ref:
// https://github.com/marcosamarinho/IRremoteESP8266/blob/master/ir_Dish.cpp
// http://www.hifi-remote.com/wiki/index.php?title=Dish
-#define DISH_TICK 100U
-#define DISH_HDR_MARK_TICKS 4U
-#define DISH_HDR_MARK (DISH_HDR_MARK_TICKS * DISH_TICK)
-#define DISH_HDR_SPACE_TICKS 61U
-#define DISH_HDR_SPACE (DISH_HDR_SPACE_TICKS * DISH_TICK)
-#define DISH_BIT_MARK_TICKS 4U
-#define DISH_BIT_MARK (DISH_BIT_MARK_TICKS * DISH_TICK)
-#define DISH_ONE_SPACE_TICKS 17U
-#define DISH_ONE_SPACE (DISH_ONE_SPACE_TICKS * DISH_TICK)
-#define DISH_ZERO_SPACE_TICKS 28U
-#define DISH_ZERO_SPACE (DISH_ZERO_SPACE_TICKS * DISH_TICK)
-#define DISH_RPT_SPACE_TICKS DISH_HDR_SPACE_TICKS
-#define DISH_RPT_SPACE (DISH_RPT_SPACE_TICKS * DISH_TICK)
+const uint16_t kDishTick = 100;
+const uint16_t kDishHdrMarkTicks = 4;
+const uint16_t kDishHdrMark = kDishHdrMarkTicks * kDishTick;
+const uint16_t kDishHdrSpaceTicks = 61;
+const uint16_t kDishHdrSpace = kDishHdrSpaceTicks * kDishTick;
+const uint16_t kDishBitMarkTicks = 4;
+const uint16_t kDishBitMark = kDishBitMarkTicks * kDishTick;
+const uint16_t kDishOneSpaceTicks = 17;
+const uint16_t kDishOneSpace = kDishOneSpaceTicks * kDishTick;
+const uint16_t kDishZeroSpaceTicks = 28;
+const uint16_t kDishZeroSpace = kDishZeroSpaceTicks * kDishTick;
+const uint16_t kDishRptSpaceTicks = kDishHdrSpaceTicks;
+const uint16_t kDishRptSpace = kDishRptSpaceTicks * kDishTick;
#if SEND_DISH
// Send an IR command to a DISH NETWORK device.
@@ -56,20 +55,15 @@
// Ref:
// http://www.hifi-remote.com/wiki/index.php?title=Dish
void IRsend::sendDISH(uint64_t data, uint16_t nbits, uint16_t repeat) {
- // Set 57.6kHz IR carrier frequency, duty cycle is unknown.
- enableIROut(57600);
- // Header
- mark(DISH_HDR_MARK);
- space(DISH_HDR_SPACE);
- // We always send a command, even for repeat=0, hence '<= repeat'.
- for (uint16_t i = 0; i <= repeat; i++) {
- // Data
- sendData(DISH_BIT_MARK, DISH_ONE_SPACE, DISH_BIT_MARK, DISH_ZERO_SPACE,
- data, nbits, true);
- // Footer
- mark(DISH_BIT_MARK);
- space(DISH_RPT_SPACE);
- }
+ enableIROut(57600); // Set modulation freq. to 57.6kHz.
+ // Header is only ever sent once.
+ mark(kDishHdrMark);
+ space(kDishHdrSpace);
+
+ sendGeneric(0, 0, // No headers from here on in.
+ kDishBitMark, kDishOneSpace, kDishBitMark, kDishZeroSpace,
+ kDishBitMark, kDishRptSpace, data, nbits, 57600, true, repeat,
+ 50);
}
#endif
@@ -78,7 +72,7 @@ void IRsend::sendDISH(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
-// nbits: Nr. of bits to expect in the data portion. Typically DISH_BITS.
+// nbits: Nr. of bits to expect in the data portion. Typically kDishBits.
// strict: Flag to indicate if we strictly adhere to the specification.
// Returns:
// boolean: True if it can decode it, false if it can't.
@@ -94,34 +88,32 @@ void IRsend::sendDISH(uint64_t data, uint16_t nbits, uint16_t repeat) {
// http://lirc.sourceforge.net/remotes/echostar/301_501_3100_5100_58xx_59xx
// https://github.com/marcosamarinho/IRremoteESP8266/blob/master/ir_Dish.cpp
bool IRrecv::decodeDISH(decode_results *results, uint16_t nbits, bool strict) {
- if (results->rawlen < 2 * nbits + HEADER + FOOTER - 1)
+ if (results->rawlen < 2 * nbits + kHeader + kFooter - 1)
return false; // Not enough entries to be valid.
- if (strict && nbits != DISH_BITS)
- return false; // Not strictly compliant.
+ if (strict && nbits != kDishBits) return false; // Not strictly compliant.
uint64_t data = 0;
- uint16_t offset = OFFSET_START;
+ uint16_t offset = kStartOffset;
// Header
- if (!match(results->rawbuf[offset], DISH_HDR_MARK)) return false;
+ if (!match(results->rawbuf[offset], kDishHdrMark)) return false;
// Calculate how long the common tick time is based on the header mark.
- uint32_t m_tick = results->rawbuf[offset++] * RAWTICK / DISH_HDR_MARK_TICKS;
- if (!matchSpace(results->rawbuf[offset], DISH_HDR_SPACE)) return false;
+ uint32_t m_tick = results->rawbuf[offset++] * kRawTick / kDishHdrMarkTicks;
+ if (!matchSpace(results->rawbuf[offset], kDishHdrSpace)) return false;
// Calculate how long the common tick time is based on the header space.
- uint32_t s_tick = results->rawbuf[offset++] * RAWTICK / DISH_HDR_SPACE_TICKS;
+ uint32_t s_tick = results->rawbuf[offset++] * kRawTick / kDishHdrSpaceTicks;
// Data
- match_result_t data_result = matchData(&(results->rawbuf[offset]), nbits,
- DISH_BIT_MARK_TICKS * m_tick,
- DISH_ONE_SPACE_TICKS * s_tick,
- DISH_BIT_MARK_TICKS * m_tick,
- DISH_ZERO_SPACE_TICKS * s_tick);
+ match_result_t data_result =
+ matchData(&(results->rawbuf[offset]), nbits, kDishBitMarkTicks * m_tick,
+ kDishOneSpaceTicks * s_tick, kDishBitMarkTicks * m_tick,
+ kDishZeroSpaceTicks * s_tick);
if (data_result.success == false) return false;
data = data_result.data;
offset += data_result.used;
// Footer
- if (!matchMark(results->rawbuf[offset++], DISH_BIT_MARK_TICKS * m_tick))
+ if (!matchMark(results->rawbuf[offset++], kDishBitMarkTicks * m_tick))
return false;
// Compliance
@@ -129,7 +121,7 @@ bool IRrecv::decodeDISH(decode_results *results, uint16_t nbits, bool strict) {
// The DISH protocol calls for a repeated message, so strictly speaking
// there should be a code following this. Only require it if we are set to
// strict matching.
- if (!matchSpace(results->rawbuf[offset], DISH_RPT_SPACE_TICKS * s_tick))
+ if (!matchSpace(results->rawbuf[offset], kDishRptSpaceTicks * s_tick))
return false;
}
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Electra.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Electra.cpp
new file mode 100644
index 000000000000..df69be748dab
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Electra.cpp
@@ -0,0 +1,112 @@
+// Copyright 2018 David Conran
+
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRutils.h"
+
+// EEEEEEE LL EEEEEEE CCCCC TTTTTTT RRRRRR AAA
+// EE LL EE CC C TTT RR RR AAAAA
+// EEEEE LL EEEEE CC TTT RRRRRR AA AA
+// EE LL EE CC C TTT RR RR AAAAAAA
+// EEEEEEE LLLLLLL EEEEEEE CCCCC TTT RR RR AA AA
+
+// Electra A/C added by crankyoldgit
+//
+// Equipment it seems compatible with:
+// *
+
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/527
+
+// Constants
+const uint16_t kElectraAcHdrMark = 9166;
+const uint16_t kElectraAcBitMark = 646;
+const uint16_t kElectraAcHdrSpace = 4470;
+const uint16_t kElectraAcOneSpace = 1647;
+const uint16_t kElectraAcZeroSpace = 547;
+const uint32_t kElectraAcMessageGap = 100000; // Completely made-up guess.
+
+#if SEND_ELECTRA_AC
+// Send a Electra message
+//
+// Args:
+// data: Contents of the message to be sent. (Guessing MSBF order)
+// nbits: Nr. of bits of data to be sent. Typically kElectraAcBits.
+// repeat: Nr. of additional times the message is to be sent.
+//
+// Status: Alpha / Needs testing against a real device.
+//
+void IRsend::sendElectraAC(uint8_t data[], uint16_t nbytes, uint16_t repeat) {
+ for (uint16_t r = 0; r <= repeat; r++)
+ sendGeneric(kElectraAcHdrMark, kElectraAcHdrSpace, kElectraAcBitMark,
+ kElectraAcOneSpace, kElectraAcBitMark, kElectraAcZeroSpace,
+ kElectraAcBitMark, kElectraAcMessageGap, data, nbytes,
+ 38000, // Complete guess of the modulation frequency.
+ true, 0, 50);
+}
+#endif
+
+#if DECODE_ELECTRA_AC
+// Decode the supplied Electra A/C message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: The number of data bits to expect. Typically kElectraAcBits.
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: Alpha / Needs testing against a real device.
+//
+bool IRrecv::decodeElectraAC(decode_results *results, uint16_t nbits,
+ bool strict) {
+ if (nbits % 8 != 0) // nbits has to be a multiple of nr. of bits in a byte.
+ return false;
+
+ if (strict) {
+ if (nbits != kElectraAcBits)
+ return false; // Not strictly a ELECTRA_AC message.
+ }
+
+ // The protocol sends the data normal + inverted, alternating on
+ // each byte. Hence twice the number of expected data bits.
+ if (results->rawlen < 2 * nbits + kHeader + kFooter - 1)
+ return false; // Can't possibly be a valid ELECTRA_AC message.
+
+ uint16_t offset = kStartOffset;
+
+ // Message Header
+ if (!matchMark(results->rawbuf[offset++], kElectraAcHdrMark)) return false;
+ if (!matchSpace(results->rawbuf[offset++], kElectraAcHdrSpace)) return false;
+
+ // Data Section
+ match_result_t data_result;
+ uint16_t dataBitsSoFar = 0;
+ // Keep reading bytes until we either run out of section or state to fill.
+ for (uint16_t i = 0; offset <= results->rawlen - 16 && i < nbits / 8;
+ i++, dataBitsSoFar += 8, offset += data_result.used) {
+ data_result = matchData(&(results->rawbuf[offset]), 8, kElectraAcBitMark,
+ kElectraAcOneSpace, kElectraAcBitMark,
+ kElectraAcZeroSpace, kTolerance, 0, true);
+ if (data_result.success == false) return false; // Fail
+ results->state[i] = data_result.data;
+ }
+
+ // Message Footer
+ if (!matchMark(results->rawbuf[offset++], kElectraAcBitMark)) return false;
+ if (offset <= results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset++], kElectraAcMessageGap))
+ return false;
+
+ // Compliance
+ if (strict && dataBitsSoFar != nbits) return false;
+
+ // Success
+ results->decode_type = ELECTRA_AC;
+ results->bits = dataBitsSoFar;
+ // No need to record the state as we stored it as we decoded it.
+ // As we use result->state, we don't record value, address, or command as it
+ // is a union data type.
+ return true;
+}
+#endif // DECODE_ELECTRA_AC
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Fujitsu.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Fujitsu.cpp
new file mode 100644
index 000000000000..7c1b998348b4
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Fujitsu.cpp
@@ -0,0 +1,519 @@
+// Copyright 2017 Jonny Graham, David Conran
+#include "ir_Fujitsu.h"
+#include
+#ifndef ARDUINO
+#include
+#endif
+#include "IRsend.h"
+#include "IRutils.h"
+
+// Fujitsu A/C support added by Jonny Graham & David Conran
+
+// Equipment it seems compatible with:
+// * Fujitsu ASYG30LFCA with remote AR-RAH2E
+// * Fujitsu AST9RSGCW with remote AR-DB1
+// *
+
+// Ref:
+// These values are based on averages of measurements
+const uint16_t kFujitsuAcHdrMark = 3324;
+const uint16_t kFujitsuAcHdrSpace = 1574;
+const uint16_t kFujitsuAcBitMark = 448;
+const uint16_t kFujitsuAcOneSpace = 1182;
+const uint16_t kFujitsuAcZeroSpace = 390;
+const uint16_t kFujitsuAcMinGap = 8100;
+
+#if SEND_FUJITSU_AC
+// Send a Fujitsu A/C message.
+//
+// Args:
+// data: An array of bytes containing the IR command.
+// nbytes: Nr. of bytes of data in the array. Typically one of:
+// kFujitsuAcStateLength
+// kFujitsuAcStateLength - 1
+// kFujitsuAcStateLengthShort
+// kFujitsuAcStateLengthShort - 1
+// repeat: Nr. of times the message is to be repeated.
+// (Default = kFujitsuAcMinRepeat).
+//
+// Status: BETA / Appears to be working.
+//
+void IRsend::sendFujitsuAC(unsigned char data[], uint16_t nbytes,
+ uint16_t repeat) {
+ sendGeneric(kFujitsuAcHdrMark, kFujitsuAcHdrSpace, kFujitsuAcBitMark,
+ kFujitsuAcOneSpace, kFujitsuAcBitMark, kFujitsuAcZeroSpace,
+ kFujitsuAcBitMark, kFujitsuAcMinGap, data, nbytes, 38, false,
+ repeat, 50);
+}
+#endif // SEND_FUJITSU_AC
+
+// Code to emulate Fujitsu A/C IR remote control unit.
+
+// Initialise the object.
+IRFujitsuAC::IRFujitsuAC(uint16_t pin, fujitsu_ac_remote_model_t model)
+ : _irsend(pin) {
+ setModel(model);
+ stateReset();
+}
+
+void IRFujitsuAC::setModel(fujitsu_ac_remote_model_t model) {
+ _model = model;
+ switch (model) {
+ case ARDB1:
+ _state_length = kFujitsuAcStateLength - 1;
+ _state_length_short = kFujitsuAcStateLengthShort - 1;
+ break;
+ default:
+ _state_length = kFujitsuAcStateLength;
+ _state_length_short = kFujitsuAcStateLengthShort;
+ }
+}
+
+// Reset the state of the remote to a known good state/sequence.
+void IRFujitsuAC::stateReset() {
+ _temp = 24;
+ _fanSpeed = kFujitsuAcFanHigh;
+ _mode = kFujitsuAcModeCool;
+ _swingMode = kFujitsuAcSwingBoth;
+ _cmd = kFujitsuAcCmdTurnOn;
+ buildState();
+}
+
+// Configure the pin for output.
+void IRFujitsuAC::begin() { _irsend.begin(); }
+
+#if SEND_FUJITSU_AC
+// Send the current desired state to the IR LED.
+void IRFujitsuAC::send() {
+ getRaw();
+ _irsend.sendFujitsuAC(remote_state, getStateLength());
+}
+#endif // SEND_FUJITSU_AC
+
+void IRFujitsuAC::buildState() {
+ remote_state[0] = 0x14;
+ remote_state[1] = 0x63;
+ remote_state[2] = 0x00;
+ remote_state[3] = 0x10;
+ remote_state[4] = 0x10;
+ bool fullCmd = false;
+ switch (_cmd) {
+ case kFujitsuAcCmdTurnOff:
+ remote_state[5] = 0x02;
+ break;
+ case kFujitsuAcCmdStepHoriz:
+ remote_state[5] = 0x79;
+ break;
+ case kFujitsuAcCmdStepVert:
+ remote_state[5] = 0x6C;
+ break;
+ default:
+ switch (_model) {
+ case ARRAH2E:
+ remote_state[5] = 0xFE;
+ break;
+ case ARDB1:
+ remote_state[5] = 0xFC;
+ break;
+ }
+ fullCmd = true;
+ break;
+ }
+ if (fullCmd) { // long codes
+ uint8_t tempByte = _temp - kFujitsuAcMinTemp;
+ // Nr. of bytes in the message after this byte.
+ remote_state[6] = _state_length - 7;
+
+ remote_state[7] = 0x30;
+ remote_state[8] = (_cmd == kFujitsuAcCmdTurnOn) | (tempByte << 4);
+ remote_state[9] = _mode | 0 << 4; // timer off
+ remote_state[10] = _fanSpeed | _swingMode << 4;
+ remote_state[11] = 0; // timerOff values
+ remote_state[12] = 0; // timerOff/On values
+ remote_state[13] = 0; // timerOn values
+ if (_model == ARRAH2E)
+ remote_state[14] = 0x20;
+ else
+ remote_state[14] = 0x00;
+
+ uint8_t checksum = 0;
+ uint8_t checksum_complement = 0;
+ if (_model == ARRAH2E) {
+ checksum = sumBytes(remote_state + _state_length_short,
+ _state_length - _state_length_short - 1);
+ } else if (_model == ARDB1) {
+ checksum = sumBytes(remote_state, _state_length - 1);
+ checksum_complement = 0x9B;
+ }
+ // and negate the checksum and store it in the last byte.
+ remote_state[_state_length - 1] = checksum_complement - checksum;
+ } else { // short codes
+ if (_model == ARRAH2E)
+ // The last byte is the inverse of penultimate byte
+ remote_state[_state_length_short - 1] =
+ ~remote_state[_state_length_short - 2];
+ // Zero the rest of the state.
+ for (uint8_t i = _state_length_short; i < kFujitsuAcStateLength; i++)
+ remote_state[i] = 0;
+ }
+}
+
+uint8_t IRFujitsuAC::getStateLength() {
+ buildState(); // Force an update of the internal state.
+ if ((_model == ARRAH2E && remote_state[5] != 0xFE) ||
+ (_model == ARDB1 && remote_state[5] != 0xFC))
+ return _state_length_short;
+ else
+ return _state_length;
+}
+
+// Return a pointer to the internal state date of the remote.
+uint8_t* IRFujitsuAC::getRaw() {
+ buildState();
+ return remote_state;
+}
+
+void IRFujitsuAC::buildFromState(const uint16_t length) {
+ switch (length) {
+ case kFujitsuAcStateLength - 1:
+ case kFujitsuAcStateLengthShort - 1:
+ setModel(ARDB1);
+ break;
+ default:
+ setModel(ARRAH2E);
+ }
+ switch (remote_state[6]) {
+ case 8:
+ setModel(ARDB1);
+ break;
+ case 9:
+ setModel(ARRAH2E);
+ break;
+ }
+ setTemp((remote_state[8] >> 4) + kFujitsuAcMinTemp);
+ if (remote_state[8] & 0x1)
+ setCmd(kFujitsuAcCmdTurnOn);
+ else
+ setCmd(kFujitsuAcCmdStayOn);
+ setMode(remote_state[9] & 0b111);
+ setFanSpeed(remote_state[10] & 0b111);
+ setSwing(remote_state[10] >> 4);
+ switch (remote_state[5]) {
+ case kFujitsuAcCmdTurnOff:
+ case kFujitsuAcCmdStepHoriz:
+ case kFujitsuAcCmdStepVert:
+ setCmd(remote_state[5]);
+ break;
+ }
+}
+
+bool IRFujitsuAC::setRaw(const uint8_t newState[], const uint16_t length) {
+ if (length > kFujitsuAcStateLength) return false;
+ for (uint16_t i = 0; i < kFujitsuAcStateLength; i++) {
+ if (i < length)
+ remote_state[i] = newState[i];
+ else
+ remote_state[i] = 0;
+ }
+ buildFromState(length);
+ return true;
+}
+
+// Set the requested power state of the A/C to off.
+void IRFujitsuAC::off() { _cmd = kFujitsuAcCmdTurnOff; }
+
+void IRFujitsuAC::stepHoriz() {
+ switch (_model) {
+ case ARDB1:
+ break; // This remote doesn't have a horizontal option.
+ default:
+ _cmd = kFujitsuAcCmdStepHoriz;
+ }
+}
+
+void IRFujitsuAC::stepVert() { _cmd = kFujitsuAcCmdStepVert; }
+
+// Set the requested command of the A/C.
+void IRFujitsuAC::setCmd(uint8_t cmd) {
+ switch (cmd) {
+ case kFujitsuAcCmdTurnOff:
+ case kFujitsuAcCmdTurnOn:
+ case kFujitsuAcCmdStayOn:
+ case kFujitsuAcCmdStepVert:
+ _cmd = cmd;
+ break;
+ case kFujitsuAcCmdStepHoriz:
+ if (_model != ARDB1) // AR-DB1 remote doesn't have step horizontal.
+ _cmd = cmd;
+ // FALLTHRU
+ default:
+ _cmd = kFujitsuAcCmdStayOn;
+ break;
+ }
+}
+
+uint8_t IRFujitsuAC::getCmd() { return _cmd; }
+
+bool IRFujitsuAC::getPower() { return _cmd != kFujitsuAcCmdTurnOff; }
+
+// Set the temp. in deg C
+void IRFujitsuAC::setTemp(uint8_t temp) {
+ temp = std::max((uint8_t)kFujitsuAcMinTemp, temp);
+ temp = std::min((uint8_t)kFujitsuAcMaxTemp, temp);
+ _temp = temp;
+}
+
+uint8_t IRFujitsuAC::getTemp() { return _temp; }
+
+// Set the speed of the fan
+void IRFujitsuAC::setFanSpeed(uint8_t fanSpeed) {
+ if (fanSpeed > kFujitsuAcFanQuiet)
+ fanSpeed = kFujitsuAcFanHigh; // Set the fan to maximum if out of range.
+ _fanSpeed = fanSpeed;
+}
+uint8_t IRFujitsuAC::getFanSpeed() { return _fanSpeed; }
+
+// Set the requested climate operation mode of the a/c unit.
+void IRFujitsuAC::setMode(uint8_t mode) {
+ if (mode > kFujitsuAcModeHeat)
+ mode = kFujitsuAcModeHeat; // Set the mode to maximum if out of range.
+ _mode = mode;
+}
+
+uint8_t IRFujitsuAC::getMode() { return _mode; }
+// Set the requested swing operation mode of the a/c unit.
+void IRFujitsuAC::setSwing(uint8_t swingMode) {
+ switch (_model) {
+ case ARDB1:
+ // Set the mode to max if out of range
+ if (swingMode > kFujitsuAcSwingVert) swingMode = kFujitsuAcSwingVert;
+ break;
+ case ARRAH2E:
+ default:
+ // Set the mode to max if out of range
+ if (swingMode > kFujitsuAcSwingBoth) swingMode = kFujitsuAcSwingBoth;
+ }
+ _swingMode = swingMode;
+}
+
+uint8_t IRFujitsuAC::getSwing() { return _swingMode; }
+
+bool IRFujitsuAC::validChecksum(uint8_t state[], uint16_t length) {
+ uint8_t sum = 0;
+ uint8_t sum_complement = 0;
+ uint8_t checksum = state[length - 1];
+ switch (length) {
+ case kFujitsuAcStateLengthShort: // ARRAH2E
+ return state[length - 1] == (uint8_t)~state[length - 2];
+ case kFujitsuAcStateLength - 1: // ARDB1
+ sum = sumBytes(state, length - 1);
+ sum_complement = 0x9B;
+ break;
+ case kFujitsuAcStateLength: // ARRAH2E
+ sum = sumBytes(state + kFujitsuAcStateLengthShort,
+ length - 1 - kFujitsuAcStateLengthShort);
+ break;
+ default: // Includes ARDB1 short.
+ return true; // Assume the checksum is valid for other lengths.
+ }
+ return checksum == (uint8_t)(sum_complement - sum); // Does it match?
+}
+
+// Convert the internal state into a human readable string.
+#ifdef ARDUINO
+String IRFujitsuAC::toString() {
+ String result = "";
+#else
+std::string IRFujitsuAC::toString() {
+ std::string result = "";
+#endif // ARDUINO
+ result += "Power: ";
+ if (getPower())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Mode: " + uint64ToString(getMode());
+ switch (getMode()) {
+ case kFujitsuAcModeAuto:
+ result += " (AUTO)";
+ break;
+ case kFujitsuAcModeCool:
+ result += " (COOL)";
+ break;
+ case kFujitsuAcModeHeat:
+ result += " (HEAT)";
+ break;
+ case kFujitsuAcModeDry:
+ result += " (DRY)";
+ break;
+ case kFujitsuAcModeFan:
+ result += " (FAN)";
+ break;
+ default:
+ result += " (UNKNOWN)";
+ }
+ result += ", Temp: " + uint64ToString(getTemp()) + "C";
+ result += ", Fan: " + uint64ToString(getFanSpeed());
+ switch (getFanSpeed()) {
+ case kFujitsuAcFanAuto:
+ result += " (AUTO)";
+ break;
+ case kFujitsuAcFanHigh:
+ result += " (HIGH)";
+ break;
+ case kFujitsuAcFanMed:
+ result += " (MED)";
+ break;
+ case kFujitsuAcFanLow:
+ result += " (LOW)";
+ break;
+ case kFujitsuAcFanQuiet:
+ result += " (QUIET)";
+ break;
+ }
+ result += ", Swing: ";
+ switch (getSwing()) {
+ case kFujitsuAcSwingOff:
+ result += "Off";
+ break;
+ case kFujitsuAcSwingVert:
+ result += "Vert";
+ break;
+ case kFujitsuAcSwingHoriz:
+ result += "Horiz";
+ break;
+ case kFujitsuAcSwingBoth:
+ result += "Vert + Horiz";
+ break;
+ default:
+ result += "UNKNOWN";
+ }
+ result += ", Command: ";
+ switch (getCmd()) {
+ case kFujitsuAcCmdStepHoriz:
+ result += "Step vane horizontally";
+ break;
+ case kFujitsuAcCmdStepVert:
+ result += "Step vane vertically";
+ break;
+ default:
+ result += "N/A";
+ }
+ return result;
+}
+
+#if DECODE_FUJITSU_AC
+// Decode a Fujitsu AC IR message if possible.
+// Places successful decode information in the results pointer.
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: The number of data bits to expect. Typically kFujitsuAcBits.
+// strict: Flag to indicate if we strictly adhere to the specification.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: ALPHA / Untested.
+//
+// Ref:
+//
+bool IRrecv::decodeFujitsuAC(decode_results* results, uint16_t nbits,
+ bool strict) {
+ uint16_t offset = kStartOffset;
+ uint16_t dataBitsSoFar = 0;
+
+ // Have we got enough data to successfully decode?
+ if (results->rawlen < (2 * kFujitsuAcMinBits) + kHeader + kFooter - 1)
+ return false; // Can't possibly be a valid message.
+
+ // Compliance
+ if (strict) {
+ switch (nbits) {
+ case kFujitsuAcBits:
+ case kFujitsuAcBits - 8:
+ case kFujitsuAcMinBits:
+ case kFujitsuAcMinBits + 8:
+ break;
+ default:
+ return false; // Must be called with the correct nr. of bits.
+ }
+ }
+
+ // Header
+ if (!matchMark(results->rawbuf[offset++], kFujitsuAcHdrMark)) return false;
+ if (!matchSpace(results->rawbuf[offset++], kFujitsuAcHdrSpace)) return false;
+
+ // Data (Fixed signature)
+ match_result_t data_result =
+ matchData(&(results->rawbuf[offset]), kFujitsuAcMinBits - 8,
+ kFujitsuAcBitMark, kFujitsuAcOneSpace, kFujitsuAcBitMark,
+ kFujitsuAcZeroSpace, kTolerance, kMarkExcess, false);
+ if (data_result.success == false) return false; // Fail
+ if (data_result.data != 0x1010006314) return false; // Signature failed.
+ dataBitsSoFar += kFujitsuAcMinBits - 8;
+ offset += data_result.used;
+ results->state[0] = 0x14;
+ results->state[1] = 0x63;
+ results->state[2] = 0x00;
+ results->state[3] = 0x10;
+ results->state[4] = 0x10;
+
+ // Keep reading bytes until we either run out of message or state to fill.
+ for (uint16_t i = 5;
+ offset <= results->rawlen - 16 && i < kFujitsuAcStateLength;
+ i++, dataBitsSoFar += 8, offset += data_result.used) {
+ data_result = matchData(
+ &(results->rawbuf[offset]), 8, kFujitsuAcBitMark, kFujitsuAcOneSpace,
+ kFujitsuAcBitMark, kFujitsuAcZeroSpace, kTolerance, kMarkExcess, false);
+ if (data_result.success == false) break; // Fail
+ results->state[i] = data_result.data;
+ }
+
+ // Footer
+ if (offset > results->rawlen ||
+ !matchMark(results->rawbuf[offset++], kFujitsuAcBitMark))
+ return false;
+ // The space is optional if we are out of capture.
+ if (offset < results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset], kFujitsuAcMinGap))
+ return false;
+
+ // Compliance
+ if (strict) {
+ if (dataBitsSoFar != nbits) return false;
+ }
+
+ results->decode_type = FUJITSU_AC;
+ results->bits = dataBitsSoFar;
+
+ // Compliance
+ switch (dataBitsSoFar) {
+ case kFujitsuAcMinBits:
+ // Check if this values indicate that this should have been a long state
+ // message.
+ if (results->state[5] == 0xFC) return false;
+ return true; // Success
+ case kFujitsuAcMinBits + 8:
+ // Check if this values indicate that this should have been a long state
+ // message.
+ if (results->state[5] == 0xFE) return false;
+ // The last byte needs to be the inverse of the penultimate byte.
+ if (results->state[5] != (uint8_t)~results->state[6]) return false;
+ return true; // Success
+ case kFujitsuAcBits - 8:
+ // Long messages of this size require this byte be correct.
+ if (results->state[5] != 0xFC) return false;
+ break;
+ case kFujitsuAcBits:
+ // Long messages of this size require this byte be correct.
+ if (results->state[5] != 0xFE) return false;
+ break;
+ default:
+ return false; // Unexpected size.
+ }
+ if (!IRFujitsuAC::validChecksum(results->state, dataBitsSoFar / 8))
+ return false;
+
+ // Success
+ return true; // All good.
+}
+#endif // DECODE_FUJITSU_AC
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Fujitsu.h b/lib/IRremoteESP8266-2.5.2.03/src/ir_Fujitsu.h
new file mode 100644
index 000000000000..bba634be622b
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Fujitsu.h
@@ -0,0 +1,123 @@
+// Copyright 2017 Jonny Graham
+// Copyright 2018 David Conran
+#ifndef IR_FUJITSU_H_
+#define IR_FUJITSU_H_
+
+#define __STDC_LIMIT_MACROS
+#include
+#ifdef ARDUINO
+#include
+#else
+#include
+#endif
+#include "IRrecv.h"
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+
+// FUJITSU A/C support added by Jonny Graham
+
+// Constants
+const uint8_t kFujitsuAcModeAuto = 0x00;
+const uint8_t kFujitsuAcModeCool = 0x01;
+const uint8_t kFujitsuAcModeDry = 0x02;
+const uint8_t kFujitsuAcModeFan = 0x03;
+const uint8_t kFujitsuAcModeHeat = 0x04;
+
+const uint8_t kFujitsuAcCmdStayOn = 0x00;
+const uint8_t kFujitsuAcCmdTurnOn = 0x01;
+const uint8_t kFujitsuAcCmdTurnOff = 0x02;
+const uint8_t kFujitsuAcCmdStepHoriz = 0x79;
+const uint8_t kFujitsuAcCmdStepVert = 0x6C;
+
+const uint8_t kFujitsuAcFanAuto = 0x00;
+const uint8_t kFujitsuAcFanHigh = 0x01;
+const uint8_t kFujitsuAcFanMed = 0x02;
+const uint8_t kFujitsuAcFanLow = 0x03;
+const uint8_t kFujitsuAcFanQuiet = 0x04;
+
+const uint8_t kFujitsuAcMinTemp = 16; // 16C
+const uint8_t kFujitsuAcMaxTemp = 30; // 30C
+
+const uint8_t kFujitsuAcSwingOff = 0x00;
+const uint8_t kFujitsuAcSwingVert = 0x01;
+const uint8_t kFujitsuAcSwingHoriz = 0x02;
+const uint8_t kFujitsuAcSwingBoth = 0x03;
+
+// Legacy defines.
+#define FUJITSU_AC_MODE_AUTO kFujitsuAcModeAuto
+#define FUJITSU_AC_MODE_COOL kFujitsuAcModeCool
+#define FUJITSU_AC_MODE_DRY kFujitsuAcModeDry
+#define FUJITSU_AC_MODE_FAN kFujitsuAcModeFan
+#define FUJITSU_AC_MODE_HEAT kFujitsuAcModeHeat
+#define FUJITSU_AC_CMD_STAY_ON kFujitsuAcCmdStayOn
+#define FUJITSU_AC_CMD_TURN_ON kFujitsuAcCmdTurnOn
+#define FUJITSU_AC_CMD_TURN_OFF kFujitsuAcCmdTurnOff
+#define FUJITSU_AC_CMD_STEP_HORIZ kFujitsuAcCmdStepHoriz
+#define FUJITSU_AC_CMD_STEP_VERT kFujitsuAcCmdStepVert
+#define FUJITSU_AC_FAN_AUTO kFujitsuAcFanAuto
+#define FUJITSU_AC_FAN_HIGH kFujitsuAcFanHigh
+#define FUJITSU_AC_FAN_MED kFujitsuAcFanMed
+#define FUJITSU_AC_FAN_LOW kFujitsuAcFanLow
+#define FUJITSU_AC_FAN_QUIET kFujitsuAcFanQuiet
+#define FUJITSU_AC_MIN_TEMP kFujitsuAcMinTemp
+#define FUJITSU_AC_MAX_TEMP kFujitsuAcMaxTemp
+#define FUJITSU_AC_SWING_OFF kFujitsuAcSwingOff
+#define FUJITSU_AC_SWING_VERT kFujitsuAcSwingVert
+#define FUJITSU_AC_SWING_HORIZ kFujitsuAcSwingHoriz
+#define FUJITSU_AC_SWING_BOTH kFujitsuAcSwingBoth
+
+enum fujitsu_ac_remote_model_t {
+ ARRAH2E = 1,
+ ARDB1,
+};
+
+class IRFujitsuAC {
+ public:
+ explicit IRFujitsuAC(uint16_t pin, fujitsu_ac_remote_model_t model = ARRAH2E);
+
+ void setModel(fujitsu_ac_remote_model_t model);
+ void stateReset();
+#if SEND_FUJITSU_AC
+ void send();
+#endif // SEND_FUJITSU_AC
+ void begin();
+ void off();
+ void stepHoriz();
+ void stepVert();
+ void setCmd(uint8_t cmd);
+ uint8_t getCmd();
+ void setTemp(uint8_t temp);
+ uint8_t getTemp();
+ void setFanSpeed(uint8_t fan);
+ uint8_t getFanSpeed();
+ void setMode(uint8_t mode);
+ uint8_t getMode();
+ void setSwing(uint8_t mode);
+ uint8_t getSwing();
+ uint8_t* getRaw();
+ bool setRaw(const uint8_t newState[], const uint16_t length);
+ uint8_t getStateLength();
+ static bool validChecksum(uint8_t* state, uint16_t length);
+ bool getPower();
+#ifdef ARDUINO
+ String toString();
+#else
+ std::string toString();
+#endif
+
+ private:
+ uint8_t remote_state[kFujitsuAcStateLength];
+ IRsend _irsend;
+ uint8_t _temp;
+ uint8_t _fanSpeed;
+ uint8_t _mode;
+ uint8_t _swingMode;
+ uint8_t _cmd;
+ fujitsu_ac_remote_model_t _model;
+ uint8_t _state_length;
+ uint8_t _state_length_short;
+ void buildState();
+ void buildFromState(const uint16_t length);
+};
+
+#endif // IR_FUJITSU_H_
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_GICable.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_GICable.cpp
new file mode 100644
index 000000000000..229e4e5bbcf4
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_GICable.cpp
@@ -0,0 +1,116 @@
+// Copyright 2018 David Conran
+
+#define __STDC_LIMIT_MACROS
+#include
+#include
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRutils.h"
+
+// GGGG IIIII CCCCC AAA BBBBB LL EEEEEEE
+// GG GG III CC C AAAAA BB B LL EE
+// GG III CC AA AA BBBBBB LL EEEEE
+// GG GG ... III ... CC C AAAAAAA BB BB LL EE
+// GGGGGG ... IIIII ... CCCCC AA AA BBBBBB LLLLLLL EEEEEEE
+//
+// Ref:
+// https://github.com/cyborg5/IRLib2/blob/master/IRLibProtocols/IRLib_P09_GICable.h
+// https://github.com/markszabo/IRremoteESP8266/issues/447
+
+// Constants
+const uint16_t kGicableHdrMark = 9000;
+const uint16_t kGicableHdrSpace = 4400;
+const uint16_t kGicableBitMark = 550;
+const uint16_t kGicableOneSpace = 4400;
+const uint16_t kGicableZeroSpace = 2200;
+const uint16_t kGicableRptSpace = 2200;
+const uint32_t kGicableMinCommandLength = 99600;
+const uint32_t kGicableMinGap =
+ kGicableMinCommandLength -
+ (kGicableHdrMark + kGicableHdrSpace +
+ kGicableBits * (kGicableBitMark + kGicableOneSpace) + kGicableBitMark);
+
+#if SEND_GICABLE
+// Send a raw G.I. Cable formatted message.
+//
+// Args:
+// data: The message to be sent.
+// nbits: The number of bits of the message to be sent.
+// Typically kGicableBits.
+// repeat: The number of times the command is to be repeated.
+//
+// Status: Alpha / Untested.
+//
+// Ref:
+void IRsend::sendGICable(uint64_t data, uint16_t nbits, uint16_t repeat) {
+ sendGeneric(kGicableHdrMark, kGicableHdrSpace, kGicableBitMark,
+ kGicableOneSpace, kGicableBitMark, kGicableZeroSpace,
+ kGicableBitMark, kGicableMinGap, kGicableMinCommandLength, data,
+ nbits, 39, true, 0, // Repeats are handled later.
+ 50);
+ // Message repeat sequence.
+ if (repeat)
+ sendGeneric(kGicableHdrMark, kGicableRptSpace, 0, 0, 0,
+ 0, // No actual data sent.
+ kGicableBitMark, kGicableMinGap, kGicableMinCommandLength, 0,
+ 0, // No data to be sent.
+ 39, true, repeat - 1, 50);
+}
+#endif // SEND_GICABLE
+
+#if DECODE_GICABLE
+// Decode the supplied G.I. Cable message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: The number of data bits to expect. Typically kGicableBits.
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: Alpha / Not tested against a real device.
+bool IRrecv::decodeGICable(decode_results *results, uint16_t nbits,
+ bool strict) {
+ if (results->rawlen < 2 * (nbits + kHeader + kFooter) - 1)
+ return false; // Can't possibly be a valid GICABLE message.
+ if (strict && nbits != kGicableBits)
+ return false; // Not strictly an GICABLE message.
+
+ uint64_t data = 0;
+ uint16_t offset = kStartOffset;
+
+ // Header
+ if (!matchMark(results->rawbuf[offset++], kGicableHdrMark)) return false;
+ if (!matchSpace(results->rawbuf[offset++], kGicableHdrSpace)) return false;
+
+ // Data
+ match_result_t data_result =
+ matchData(&(results->rawbuf[offset]), nbits, kGicableBitMark,
+ kGicableOneSpace, kGicableBitMark, kGicableZeroSpace);
+ if (data_result.success == false) return false;
+ data = data_result.data;
+ offset += data_result.used;
+
+ // Footer
+ if (!matchMark(results->rawbuf[offset++], kGicableBitMark)) return false;
+ if (offset < results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset++], kGicableMinGap))
+ return false;
+
+ // Compliance
+ if (strict) {
+ // We expect a repeat frame.
+ if (!matchMark(results->rawbuf[offset++], kGicableHdrMark)) return false;
+ if (!matchSpace(results->rawbuf[offset++], kGicableRptSpace)) return false;
+ if (!matchMark(results->rawbuf[offset++], kGicableBitMark)) return false;
+ }
+
+ // Success
+ results->bits = nbits;
+ results->value = data;
+ results->decode_type = GICABLE;
+ results->command = 0;
+ results->address = 0;
+ return true;
+}
+#endif // DECODE_GICABLE
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_GlobalCache.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_GlobalCache.cpp
similarity index 66%
rename from lib/IRremoteESP8266-2.2.1.02/src/ir_GlobalCache.cpp
rename to lib/IRremoteESP8266-2.5.2.03/src/ir_GlobalCache.cpp
index 019413b96112..daa9dd22c9a8 100644
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_GlobalCache.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_GlobalCache.cpp
@@ -3,7 +3,6 @@
#include
#include "IRsend.h"
-#include "IRtimer.h"
// GGG L OOOO BBBB AA L CCCC AA CCCC H H EEEEEE
// G G L O O B B AAAA L C C AAAA C C H H E
@@ -15,12 +14,12 @@
// (http://www.hishamkhalifa.com)
// Constants
-#define GLOBALCACHE_MAX_REPEAT 50U
-#define GLOBALCACHE_MIN_USEC 80U
-#define GLOBALCACHE_FREQ_INDEX 0U
-#define GLOBALCACHE_RPT_INDEX GLOBALCACHE_FREQ_INDEX + 1U
-#define GLOBALCACHE_RPT_START_INDEX GLOBALCACHE_RPT_INDEX + 1U
-#define GLOBALCACHE_START_INDEX GLOBALCACHE_RPT_START_INDEX + 1U
+const uint16_t kGlobalCacheMaxRepeat = 50;
+const uint32_t kGlobalCacheMinUsec = 80;
+const uint8_t kGlobalCacheFreqIndex = 0;
+const uint8_t kGlobalCacheRptIndex = kGlobalCacheFreqIndex + 1;
+const uint8_t kGlobalCacheRptStartIndex = kGlobalCacheRptIndex + 1;
+const uint8_t kGlobalCacheStartIndex = kGlobalCacheRptStartIndex + 1;
#if SEND_GLOBALCACHE
// Send a shortened GlobalCache (GC) IRdb/control tower formatted message.
@@ -41,24 +40,23 @@
// Ref:
// https://irdb.globalcache.com/Home/Database
void IRsend::sendGC(uint16_t buf[], uint16_t len) {
- uint16_t hz = buf[GLOBALCACHE_FREQ_INDEX]; // GC frequency is in Hz.
+ uint16_t hz = buf[kGlobalCacheFreqIndex]; // GC frequency is in Hz.
enableIROut(hz);
uint32_t periodic_time = calcUSecPeriod(hz, false);
- uint8_t emits = std::min(buf[GLOBALCACHE_RPT_INDEX],
- (uint16_t) GLOBALCACHE_MAX_REPEAT);
+ uint8_t emits =
+ std::min(buf[kGlobalCacheRptIndex], (uint16_t)kGlobalCacheMaxRepeat);
// Repeat
for (uint8_t repeat = 0; repeat < emits; repeat++) {
- // First time through, start at the beginning (GLOBALCACHE_START_INDEX),
+ // First time through, start at the beginning (kGlobalCacheStartIndex),
// otherwise for repeats, we start a specified offset from that.
- uint16_t offset = GLOBALCACHE_START_INDEX;
- if (repeat)
- offset += buf[GLOBALCACHE_RPT_START_INDEX] - 1;
+ uint16_t offset = kGlobalCacheStartIndex;
+ if (repeat) offset += buf[kGlobalCacheRptStartIndex] - 1;
// Data
for (; offset < len; offset++) {
// Convert periodic units to microseconds.
- // Minimum is GLOBALCACHE_MIN_USEC for actual GC units.
- uint32_t microseconds = std::max(buf[offset] * periodic_time,
- GLOBALCACHE_MIN_USEC);
+ // Minimum is kGlobalCacheMinUsec for actual GC units.
+ uint32_t microseconds =
+ std::max(buf[offset] * periodic_time, kGlobalCacheMinUsec);
// These codes start at an odd index (not even as with sendRaw).
if (offset & 1) // Odd bit.
mark(microseconds);
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Gree.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Gree.cpp
new file mode 100644
index 000000000000..df8afada6fa9
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Gree.cpp
@@ -0,0 +1,478 @@
+// Copyright 2017 Ville Skyttä (scop)
+// Copyright 2017, 2018 David Conran
+//
+// Code to emulate Gree protocol compatible HVAC devices.
+// Should be compatible with:
+// * Heat pumps carrying the "Ultimate" brand name.
+// * EKOKAI air conditioners.
+//
+
+#include "ir_Gree.h"
+#include
+#ifndef ARDUINO
+#include
+#endif
+#include "IRrecv.h"
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+#include "IRutils.h"
+#include "ir_Kelvinator.h"
+
+// GGGG RRRRRR EEEEEEE EEEEEEE
+// GG GG RR RR EE EE
+// GG RRRRRR EEEEE EEEEE
+// GG GG RR RR EE EE
+// GGGGGG RR RR EEEEEEE EEEEEEE
+
+// Constants
+// Ref: https://github.com/ToniA/arduino-heatpumpir/blob/master/GreeHeatpumpIR.h
+const uint16_t kGreeHdrMark = 9000;
+const uint16_t kGreeHdrSpace = 4000;
+const uint16_t kGreeBitMark = 620;
+const uint16_t kGreeOneSpace = 1600;
+const uint16_t kGreeZeroSpace = 540;
+const uint16_t kGreeMsgSpace = 19000;
+const uint8_t kGreeBlockFooter = 0b010;
+const uint8_t kGreeBlockFooterBits = 3;
+
+#if SEND_GREE
+// Send a Gree Heat Pump message.
+//
+// Args:
+// data: An array of bytes containing the IR command.
+// nbytes: Nr. of bytes of data in the array. (>=kGreeStateLength)
+// repeat: Nr. of times the message is to be repeated. (Default = 0).
+//
+// Status: ALPHA / Untested.
+//
+// Ref:
+// https://github.com/ToniA/arduino-heatpumpir/blob/master/GreeHeatpumpIR.cpp
+void IRsend::sendGree(unsigned char data[], uint16_t nbytes, uint16_t repeat) {
+ if (nbytes < kGreeStateLength)
+ return; // Not enough bytes to send a proper message.
+
+ for (uint16_t r = 0; r <= repeat; r++) {
+ // Block #1
+ sendGeneric(kGreeHdrMark, kGreeHdrSpace, kGreeBitMark, kGreeOneSpace,
+ kGreeBitMark, kGreeZeroSpace, 0, 0, // No Footer.
+ data, 4, 38, false, 0, 50);
+ // Footer #1
+ sendGeneric(0, 0, // No Header
+ kGreeBitMark, kGreeOneSpace, kGreeBitMark, kGreeZeroSpace,
+ kGreeBitMark, kGreeMsgSpace, 0b010, 3, 38, true, 0, false);
+
+ // Block #2
+ sendGeneric(0, 0, // No Header for Block #2
+ kGreeBitMark, kGreeOneSpace, kGreeBitMark, kGreeZeroSpace,
+ kGreeBitMark, kGreeMsgSpace, data + 4, nbytes - 4, 38, false, 0,
+ 50);
+ }
+}
+
+// Send a Gree Heat Pump message.
+//
+// Args:
+// data: The raw message to be sent.
+// nbits: Nr. of bits of data in the message. (Default is kGreeBits)
+// repeat: Nr. of times the message is to be repeated. (Default = 0).
+//
+// Status: ALPHA / Untested.
+//
+// Ref:
+// https://github.com/ToniA/arduino-heatpumpir/blob/master/GreeHeatpumpIR.cpp
+void IRsend::sendGree(uint64_t data, uint16_t nbits, uint16_t repeat) {
+ if (nbits != kGreeBits)
+ return; // Wrong nr. of bits to send a proper message.
+ // Set IR carrier frequency
+ enableIROut(38);
+
+ for (uint16_t r = 0; r <= repeat; r++) {
+ // Header
+ mark(kGreeHdrMark);
+ space(kGreeHdrSpace);
+
+ // Data
+ for (int16_t i = 8; i <= nbits; i += 8) {
+ sendData(kGreeBitMark, kGreeOneSpace, kGreeBitMark, kGreeZeroSpace,
+ (data >> (nbits - i)) & 0xFF, 8, false);
+ if (i == nbits / 2) {
+ // Send the mid-message Footer.
+ sendData(kGreeBitMark, kGreeOneSpace, kGreeBitMark, kGreeZeroSpace,
+ 0b010, 3);
+ mark(kGreeBitMark);
+ space(kGreeMsgSpace);
+ }
+ }
+ // Footer
+ mark(kGreeBitMark);
+ space(kGreeMsgSpace);
+ }
+}
+#endif // SEND_GREE
+
+IRGreeAC::IRGreeAC(uint16_t pin) : _irsend(pin) { stateReset(); }
+
+void IRGreeAC::stateReset() {
+ // This resets to a known-good state to Power Off, Fan Auto, Mode Auto, 25C.
+ for (uint8_t i = 0; i < kGreeStateLength; i++) remote_state[i] = 0x0;
+ remote_state[1] = 0x09;
+ remote_state[2] = 0x20;
+ remote_state[3] = 0x50;
+ remote_state[5] = 0x20;
+ remote_state[7] = 0x50;
+}
+
+void IRGreeAC::fixup() {
+ checksum(); // Calculate the checksums
+}
+
+void IRGreeAC::begin() { _irsend.begin(); }
+
+#if SEND_GREE
+void IRGreeAC::send() {
+ fixup(); // Ensure correct settings before sending.
+ _irsend.sendGree(remote_state);
+}
+#endif // SEND_GREE
+
+uint8_t* IRGreeAC::getRaw() {
+ fixup(); // Ensure correct settings before sending.
+ return remote_state;
+}
+
+void IRGreeAC::setRaw(uint8_t new_code[]) {
+ for (uint8_t i = 0; i < kGreeStateLength; i++) {
+ remote_state[i] = new_code[i];
+ }
+}
+
+void IRGreeAC::checksum(const uint16_t length) {
+ // Gree uses the same checksum alg. as Kelvinator's block checksum.
+ uint8_t sum = IRKelvinatorAC::calcBlockChecksum(remote_state, length);
+ remote_state[length - 1] = (sum << 4) | (remote_state[length - 1] & 0xFU);
+}
+
+// Verify the checksum is valid for a given state.
+// Args:
+// state: The array to verify the checksum of.
+// length: The size of the state.
+// Returns:
+// A boolean.
+bool IRGreeAC::validChecksum(const uint8_t state[], const uint16_t length) {
+ // Top 4 bits of the last byte in the state is the state's checksum.
+ if (state[length - 1] >> 4 ==
+ IRKelvinatorAC::calcBlockChecksum(state, length))
+ return true;
+ else
+ return false;
+}
+
+void IRGreeAC::on() {
+ remote_state[0] |= kGreePower1Mask;
+ remote_state[2] |= kGreePower2Mask;
+}
+
+void IRGreeAC::off() {
+ remote_state[0] &= ~kGreePower1Mask;
+ remote_state[2] &= ~kGreePower2Mask;
+}
+
+void IRGreeAC::setPower(const bool state) {
+ if (state)
+ on();
+ else
+ off();
+}
+
+bool IRGreeAC::getPower() {
+ return (remote_state[0] & kGreePower1Mask) &&
+ (remote_state[2] & kGreePower2Mask);
+}
+
+// Set the temp. in deg C
+void IRGreeAC::setTemp(const uint8_t temp) {
+ uint8_t new_temp = std::max((uint8_t)kGreeMinTemp, temp);
+ new_temp = std::min((uint8_t)kGreeMaxTemp, new_temp);
+ if (getMode() == kGreeAuto) new_temp = 25;
+ remote_state[1] = (remote_state[1] & 0xF0U) | (new_temp - kGreeMinTemp);
+}
+
+// Return the set temp. in deg C
+uint8_t IRGreeAC::getTemp() {
+ return ((remote_state[1] & 0xFU) + kGreeMinTemp);
+}
+
+// Set the speed of the fan, 0-3, 0 is auto, 1-3 is the speed
+void IRGreeAC::setFan(const uint8_t speed) {
+ uint8_t fan = std::min((uint8_t)kGreeFanMax, speed); // Bounds check
+
+ if (getMode() == kGreeDry) fan = 1; // DRY mode is always locked to fan 1.
+ // Set the basic fan values.
+ remote_state[0] &= ~kGreeFanMask;
+ remote_state[0] |= (fan << 4);
+}
+
+uint8_t IRGreeAC::getFan() { return ((remote_state[0] & kGreeFanMask) >> 4); }
+
+void IRGreeAC::setMode(const uint8_t new_mode) {
+ uint8_t mode = new_mode;
+ switch (mode) {
+ case kGreeAuto:
+ // AUTO is locked to 25C
+ setTemp(25);
+ break;
+ case kGreeDry:
+ // DRY always sets the fan to 1.
+ setFan(1);
+ break;
+ case kGreeCool:
+ case kGreeFan:
+ case kGreeHeat:
+ break;
+ default:
+ // If we get an unexpected mode, default to AUTO.
+ mode = kGreeAuto;
+ }
+ remote_state[0] &= ~kGreeModeMask;
+ remote_state[0] |= mode;
+}
+
+uint8_t IRGreeAC::getMode() { return (remote_state[0] & kGreeModeMask); }
+
+void IRGreeAC::setLight(const bool state) {
+ remote_state[2] &= ~kGreeLightMask;
+ remote_state[2] |= (state << 5);
+}
+
+bool IRGreeAC::getLight() { return remote_state[2] & kGreeLightMask; }
+
+void IRGreeAC::setXFan(const bool state) {
+ remote_state[2] &= ~kGreeXfanMask;
+ remote_state[2] |= (state << 7);
+}
+
+bool IRGreeAC::getXFan() { return remote_state[2] & kGreeXfanMask; }
+
+void IRGreeAC::setSleep(const bool state) {
+ remote_state[0] &= ~kGreeSleepMask;
+ remote_state[0] |= (state << 7);
+}
+
+bool IRGreeAC::getSleep() { return remote_state[0] & kGreeSleepMask; }
+
+void IRGreeAC::setTurbo(const bool state) {
+ remote_state[2] &= ~kGreeTurboMask;
+ remote_state[2] |= (state << 4);
+}
+
+bool IRGreeAC::getTurbo() { return remote_state[2] & kGreeTurboMask; }
+
+void IRGreeAC::setSwingVertical(const bool automatic, const uint8_t position) {
+ remote_state[0] &= ~kGreeSwingAutoMask;
+ remote_state[0] |= (automatic << 6);
+ uint8_t new_position = position;
+ if (!automatic) {
+ switch (position) {
+ case kGreeSwingUp:
+ case kGreeSwingMiddleUp:
+ case kGreeSwingMiddle:
+ case kGreeSwingMiddleDown:
+ case kGreeSwingDown:
+ break;
+ default:
+ new_position = kGreeSwingLastPos;
+ }
+ } else {
+ switch (position) {
+ case kGreeSwingAuto:
+ case kGreeSwingDownAuto:
+ case kGreeSwingMiddleAuto:
+ case kGreeSwingUpAuto:
+ break;
+ default:
+ new_position = kGreeSwingAuto;
+ }
+ }
+ remote_state[4] &= ~kGreeSwingPosMask;
+ remote_state[4] |= new_position;
+}
+
+bool IRGreeAC::getSwingVerticalAuto() {
+ return remote_state[0] & kGreeSwingAutoMask;
+}
+
+uint8_t IRGreeAC::getSwingVerticalPosition() {
+ return remote_state[4] & kGreeSwingPosMask;
+}
+
+// Convert the internal state into a human readable string.
+#ifdef ARDUINO
+String IRGreeAC::toString() {
+ String result = "";
+#else
+std::string IRGreeAC::toString() {
+ std::string result = "";
+#endif // ARDUINO
+ result += "Power: ";
+ if (getPower())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Mode: " + uint64ToString(getMode());
+ switch (getMode()) {
+ case kGreeAuto:
+ result += " (AUTO)";
+ break;
+ case kGreeCool:
+ result += " (COOL)";
+ break;
+ case kGreeHeat:
+ result += " (HEAT)";
+ break;
+ case kGreeDry:
+ result += " (DRY)";
+ break;
+ case kGreeFan:
+ result += " (FAN)";
+ break;
+ default:
+ result += " (UNKNOWN)";
+ }
+ result += ", Temp: " + uint64ToString(getTemp()) + "C";
+ result += ", Fan: " + uint64ToString(getFan());
+ switch (getFan()) {
+ case 0:
+ result += " (AUTO)";
+ break;
+ case kGreeFanMax:
+ result += " (MAX)";
+ break;
+ }
+ result += ", Turbo: ";
+ if (getTurbo())
+ result += "On";
+ else
+ result += "Off";
+ result += ", XFan: ";
+ if (getXFan())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Light: ";
+ if (getLight())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Sleep: ";
+ if (getSleep())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Swing Vertical Mode: ";
+ if (getSwingVerticalAuto())
+ result += "Auto";
+ else
+ result += "Manual";
+ result +=
+ ", Swing Vertical Pos: " + uint64ToString(getSwingVerticalPosition());
+ switch (getSwingVerticalPosition()) {
+ case kGreeSwingLastPos:
+ result += " (Last Pos)";
+ break;
+ case kGreeSwingAuto:
+ result += " (Auto)";
+ break;
+ }
+ return result;
+}
+
+#if DECODE_GREE
+// Decode the supplied Gree message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: The number of data bits to expect. Typically kGreeBits.
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: ALPHA / Untested.
+bool IRrecv::decodeGree(decode_results* results, uint16_t nbits, bool strict) {
+ if (results->rawlen <
+ 2 * (nbits + kGreeBlockFooterBits) + (kHeader + kFooter + 1))
+ return false; // Can't possibly be a valid Gree message.
+ if (strict && nbits != kGreeBits)
+ return false; // Not strictly a Gree message.
+
+ uint32_t data;
+ uint16_t offset = kStartOffset;
+
+ // There are two blocks back-to-back in a full Gree IR message
+ // sequence.
+ int8_t state_pos = 0;
+ match_result_t data_result;
+
+ // Header
+ if (!matchMark(results->rawbuf[offset++], kGreeHdrMark)) return false;
+ if (!matchSpace(results->rawbuf[offset++], kGreeHdrSpace)) return false;
+ // Data Block #1 (32 bits)
+ data_result =
+ matchData(&(results->rawbuf[offset]), 32, kGreeBitMark, kGreeOneSpace,
+ kGreeBitMark, kGreeZeroSpace, kTolerance, kMarkExcess, false);
+ if (data_result.success == false) return false;
+ data = data_result.data;
+ offset += data_result.used;
+
+ // Record Data Block #1 in the state.
+ for (uint16_t i = 0; i < 4; i++, data >>= 8)
+ results->state[state_pos + i] = data & 0xFF;
+ state_pos += 4;
+
+ // Block #1 footer (3 bits, B010)
+ data_result = matchData(&(results->rawbuf[offset]), kGreeBlockFooterBits,
+ kGreeBitMark, kGreeOneSpace, kGreeBitMark,
+ kGreeZeroSpace, kTolerance, kMarkExcess, false);
+ if (data_result.success == false) return false;
+ if (data_result.data != kGreeBlockFooter) return false;
+ offset += data_result.used;
+
+ // Inter-block gap.
+ if (!matchMark(results->rawbuf[offset++], kGreeBitMark)) return false;
+ if (!matchSpace(results->rawbuf[offset++], kGreeMsgSpace)) return false;
+
+ // Data Block #2 (32 bits)
+ data_result =
+ matchData(&(results->rawbuf[offset]), 32, kGreeBitMark, kGreeOneSpace,
+ kGreeBitMark, kGreeZeroSpace, kTolerance, kMarkExcess, false);
+ if (data_result.success == false) return false;
+ data = data_result.data;
+ offset += data_result.used;
+
+ // Record Data Block #2 in the state.
+ for (uint16_t i = 0; i < 4; i++, data >>= 8)
+ results->state[state_pos + i] = data & 0xFF;
+ state_pos += 4;
+
+ // Footer.
+ if (!matchMark(results->rawbuf[offset++], kGreeBitMark)) return false;
+ if (offset <= results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset], kGreeMsgSpace))
+ return false;
+
+ // Compliance
+ if (strict) {
+ // Correct size/length)
+ if (state_pos != kGreeStateLength) return false;
+ // Verify the message's checksum is correct.
+ if (!IRGreeAC::validChecksum(results->state)) return false;
+ }
+
+ // Success
+ results->decode_type = GREE;
+ results->bits = state_pos * 8;
+ // No need to record the state as we stored it as we decoded it.
+ // As we use result->state, we don't record value, address, or command as it
+ // is a union data type.
+ return true;
+}
+#endif // DECODE_GREE
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Gree.h b/lib/IRremoteESP8266-2.5.2.03/src/ir_Gree.h
new file mode 100644
index 000000000000..73f69eb31b47
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Gree.h
@@ -0,0 +1,130 @@
+// Kelvinator A/C
+//
+// Copyright 2016 David Conran
+
+#ifndef IR_GREE_H_
+#define IR_GREE_H_
+
+#define __STDC_LIMIT_MACROS
+#include
+#ifndef UNIT_TEST
+#include
+#else
+#include
+#endif
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+
+// GGGG RRRRRR EEEEEEE EEEEEEE
+// GG GG RR RR EE EE
+// GG RRRRRR EEEEE EEEEE
+// GG GG RR RR EE EE
+// GGGGGG RR RR EEEEEEE EEEEEEE
+
+// Constants
+const uint8_t kGreeAuto = 0;
+const uint8_t kGreeCool = 1;
+const uint8_t kGreeDry = 2;
+const uint8_t kGreeFan = 3;
+const uint8_t kGreeHeat = 4;
+
+// Byte 0
+const uint8_t kGreeModeMask = 0b00000111;
+const uint8_t kGreePower1Mask = 0b00001000;
+const uint8_t kGreeFanMask = 0b00110000;
+const uint8_t kGreeSwingAutoMask = 0b01000000;
+const uint8_t kGreeSleepMask = 0b10000000;
+// Byte 2
+const uint8_t kGreeTurboMask = 0b00010000;
+const uint8_t kGreeLightMask = 0b00100000;
+const uint8_t kGreePower2Mask = 0b01000000;
+const uint8_t kGreeXfanMask = 0b10000000;
+// Byte 4
+const uint8_t kGreeSwingPosMask = 0b00001111;
+
+const uint8_t kGreeMinTemp = 16; // Celsius
+const uint8_t kGreeMaxTemp = 30; // Celsius
+const uint8_t kGreeFanMax = 3;
+
+const uint8_t kGreeSwingLastPos = 0b00000000;
+const uint8_t kGreeSwingAuto = 0b00000001;
+const uint8_t kGreeSwingUp = 0b00000010;
+const uint8_t kGreeSwingMiddleUp = 0b00000011;
+const uint8_t kGreeSwingMiddle = 0b00000100;
+const uint8_t kGreeSwingMiddleDown = 0b00000101;
+const uint8_t kGreeSwingDown = 0b00000110;
+const uint8_t kGreeSwingDownAuto = 0b00000111;
+const uint8_t kGreeSwingMiddleAuto = 0b00001001;
+const uint8_t kGreeSwingUpAuto = 0b00001011;
+
+// Legacy defines.
+#define GREE_AUTO kGreeAuto
+#define GREE_COOL kGreeCool
+#define GREE_DRY kGreeDry
+#define GREE_FAN kGreeFan
+#define GREE_HEAT kGreeHeat
+#define GREE_MIN_TEMP kGreeMinTemp
+#define GREE_MAX_TEMP kGreeMaxTemp
+#define GREE_FAN_MAX kGreeFanMax
+#define GREE_SWING_LAST_POS kGreeSwingLastPos
+#define GREE_SWING_AUTO kGreeSwingAuto
+#define GREE_SWING_UP kGreeSwingUp
+#define GREE_SWING_MIDDLE_UP kGreeSwingMiddleUp
+#define GREE_SWING_MIDDLE kGreeSwingMiddle
+#define GREE_SWING_MIDDLE_DOWN kGreeSwingMiddleDown
+#define GREE_SWING_DOWN kGreeSwingDown
+#define GREE_SWING_DOWN_AUTO kGreeSwingDownAuto
+#define GREE_SWING_MIDDLE_AUTO kGreeSwingMiddleAuto
+#define GREE_SWING_UP_AUTO kGreeSwingUpAuto
+
+// Classes
+class IRGreeAC {
+ public:
+ explicit IRGreeAC(uint16_t pin);
+
+ void stateReset();
+#if SEND_GREE
+ void send();
+#endif // SEND_GREE
+ void begin();
+ void on();
+ void off();
+ void setPower(const bool state);
+ bool getPower();
+ void setTemp(const uint8_t temp);
+ uint8_t getTemp();
+ void setFan(const uint8_t speed);
+ uint8_t getFan();
+ void setMode(const uint8_t new_mode);
+ uint8_t getMode();
+ void setLight(const bool state);
+ bool getLight();
+ void setXFan(const bool state);
+ bool getXFan();
+ void setSleep(const bool state);
+ bool getSleep();
+ void setTurbo(const bool state);
+ bool getTurbo();
+ void setSwingVertical(const bool automatic, const uint8_t position);
+ bool getSwingVerticalAuto();
+ uint8_t getSwingVerticalPosition();
+
+ uint8_t* getRaw();
+ void setRaw(uint8_t new_code[]);
+ static bool validChecksum(const uint8_t state[],
+ const uint16_t length = kGreeStateLength);
+#ifdef ARDUINO
+ String toString();
+#else
+ std::string toString();
+#endif
+
+ private:
+ // The state of the IR remote in IR code form.
+ uint8_t remote_state[kGreeStateLength];
+ void checksum(const uint16_t length = kGreeStateLength);
+ void fixup();
+ IRsend _irsend;
+};
+
+#endif // IR_GREE_H_
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Haier.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Haier.cpp
new file mode 100644
index 000000000000..2c47e4eac2a5
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Haier.cpp
@@ -0,0 +1,865 @@
+// Copyright 2018 crankyoldgit
+// The specifics of reverse engineering the protocols details:
+// * HSU07-HEA03 by kuzin2006.
+// * YR-W02/HSU-09HMC203 by non7top.
+
+#include "ir_Haier.h"
+#ifndef UNIT_TEST
+#include
+#else
+#include
+#endif
+#include "IRremoteESP8266.h"
+#include "IRutils.h"
+
+// HH HH AAA IIIII EEEEEEE RRRRRR
+// HH HH AAAAA III EE RR RR
+// HHHHHHH AA AA III EEEEE RRRRRR
+// HH HH AAAAAAA III EE RR RR
+// HH HH AA AA IIIII EEEEEEE RR RR
+
+// Supported devices:
+// * Haier HSU07-HEA03 Remote control.
+// * Haier YR-W02 Remote control
+// * Haier HSU-09HMC203 A/C unit.
+
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/404
+// https://www.dropbox.com/s/mecyib3lhdxc8c6/IR%20data%20reverse%20engineering.xlsx?dl=0
+// https://github.com/markszabo/IRremoteESP8266/issues/485
+// https://www.dropbox.com/sh/w0bt7egp0fjger5/AADRFV6Wg4wZskJVdFvzb8Z0a?dl=0&preview=haer2.ods
+
+// Constants
+const uint16_t kHaierAcHdr = 3000;
+const uint16_t kHaierAcHdrGap = 4300;
+const uint16_t kHaierAcBitMark = 520;
+const uint16_t kHaierAcOneSpace = 1650;
+const uint16_t kHaierAcZeroSpace = 650;
+const uint32_t kHaierAcMinGap = 150000; // Completely made up value.
+
+#if (SEND_HAIER_AC || SEND_HAIER_AC_YRW02)
+// Send a Haier A/C message. (HSU07-HEA03 remote)
+//
+// Args:
+// data: An array of bytes containing the IR command.
+// nbytes: Nr. of bytes of data in the array. (>=kHaierACStateLength)
+// repeat: Nr. of times the message is to be repeated. (Default = 0).
+//
+// Status: Beta / Probably working.
+//
+void IRsend::sendHaierAC(unsigned char data[], uint16_t nbytes,
+ uint16_t repeat) {
+ if (nbytes < kHaierACStateLength) return;
+
+ for (uint16_t r = 0; r <= repeat; r++) {
+ enableIROut(38000);
+ mark(kHaierAcHdr);
+ space(kHaierAcHdr);
+ sendGeneric(kHaierAcHdr, kHaierAcHdrGap, kHaierAcBitMark, kHaierAcOneSpace,
+ kHaierAcBitMark, kHaierAcZeroSpace, kHaierAcBitMark,
+ kHaierAcMinGap, data, nbytes, 38, true,
+ 0, // Repeats handled elsewhere
+ 50);
+ }
+}
+#endif // (SEND_HAIER_AC || SEND_HAIER_AC_YRW02)
+
+#if SEND_HAIER_AC_YRW02
+// Send a Haier YR-W02 remote A/C message.
+//
+// Args:
+// data: An array of bytes containing the IR command.
+// nbytes: Nr. of bytes of data in the array. (>=kHaierACYRW02StateLength)
+// repeat: Nr. of times the message is to be repeated. (Default = 0).
+//
+// Status: Alpha / Untested on a real device.
+//
+void IRsend::sendHaierACYRW02(unsigned char data[], uint16_t nbytes,
+ uint16_t repeat) {
+ if (nbytes >= kHaierACYRW02StateLength) sendHaierAC(data, nbytes, repeat);
+}
+#endif // SEND_HAIER_AC_YRW02
+
+// Class for emulating a Haier HSU07-HEA03 remote
+IRHaierAC::IRHaierAC(uint16_t pin) : _irsend(pin) { stateReset(); }
+
+void IRHaierAC::begin() { _irsend.begin(); }
+
+#if SEND_HAIER_AC
+void IRHaierAC::send() {
+ checksum();
+ _irsend.sendHaierAC(remote_state);
+}
+#endif // SEND_HAIER_AC
+
+void IRHaierAC::checksum() {
+ remote_state[8] = sumBytes(remote_state, kHaierACStateLength - 1);
+}
+
+bool IRHaierAC::validChecksum(uint8_t state[], const uint16_t length) {
+ if (length < 2) return false; // 1 byte of data can't have a checksum.
+ return (state[length - 1] == sumBytes(state, length - 1));
+}
+
+void IRHaierAC::stateReset() {
+ for (uint8_t i = 1; i < kHaierACStateLength; i++) remote_state[i] = 0x0;
+ remote_state[0] = kHaierAcPrefix;
+ remote_state[2] = 0b00100000;
+
+ setTemp(kHaierAcDefTemp);
+ setFan(kHaierAcFanAuto);
+ setMode(kHaierAcAuto);
+ setCommand(kHaierAcCmdOn);
+}
+
+uint8_t* IRHaierAC::getRaw() {
+ checksum();
+ return remote_state;
+}
+
+void IRHaierAC::setRaw(uint8_t new_code[]) {
+ for (uint8_t i = 0; i < kHaierACStateLength; i++) {
+ remote_state[i] = new_code[i];
+ }
+}
+
+void IRHaierAC::setCommand(uint8_t state) {
+ remote_state[1] &= 0b11110000;
+ switch (state) {
+ case kHaierAcCmdOff:
+ case kHaierAcCmdOn:
+ case kHaierAcCmdMode:
+ case kHaierAcCmdFan:
+ case kHaierAcCmdTempUp:
+ case kHaierAcCmdTempDown:
+ case kHaierAcCmdSleep:
+ case kHaierAcCmdTimerSet:
+ case kHaierAcCmdTimerCancel:
+ case kHaierAcCmdHealth:
+ case kHaierAcCmdSwing:
+ remote_state[1] |= (state & 0b00001111);
+ }
+}
+
+uint8_t IRHaierAC::getCommand() { return remote_state[1] & (0b00001111); }
+
+void IRHaierAC::setFan(uint8_t speed) {
+ uint8_t new_speed = kHaierAcFanAuto;
+ switch (speed) {
+ case kHaierAcFanLow:
+ new_speed = 3;
+ break;
+ case kHaierAcFanMed:
+ new_speed = 1;
+ break;
+ case kHaierAcFanHigh:
+ new_speed = 2;
+ break;
+ default:
+ new_speed = kHaierAcFanAuto; // Default to auto for anything else.
+ }
+
+ if (speed != getFan()) setCommand(kHaierAcCmdFan);
+ remote_state[5] &= 0b11111100;
+ remote_state[5] |= new_speed;
+}
+
+uint8_t IRHaierAC::getFan() {
+ switch (remote_state[5] & 0b00000011) {
+ case 1:
+ return kHaierAcFanMed;
+ case 2:
+ return kHaierAcFanHigh;
+ case 3:
+ return kHaierAcFanLow;
+ default:
+ return kHaierAcFanAuto;
+ }
+}
+
+void IRHaierAC::setMode(uint8_t mode) {
+ uint8_t new_mode = mode;
+ setCommand(kHaierAcCmdMode);
+ if (mode > kHaierAcFan) // If out of range, default to auto mode.
+ new_mode = kHaierAcAuto;
+ remote_state[7] &= 0b00011111;
+ remote_state[7] |= (new_mode << 5);
+}
+
+uint8_t IRHaierAC::getMode() { return (remote_state[7] & 0b11100000) >> 5; }
+
+void IRHaierAC::setTemp(const uint8_t celsius) {
+ uint8_t temp = celsius;
+ if (temp < kHaierAcMinTemp)
+ temp = kHaierAcMinTemp;
+ else if (temp > kHaierAcMaxTemp)
+ temp = kHaierAcMaxTemp;
+
+ uint8_t old_temp = getTemp();
+ if (old_temp == temp) return;
+ if (old_temp > temp)
+ setCommand(kHaierAcCmdTempDown);
+ else
+ setCommand(kHaierAcCmdTempUp);
+
+ remote_state[1] &= 0b00001111; // Clear the previous temp.
+ remote_state[1] |= ((temp - kHaierAcMinTemp) << 4);
+}
+
+uint8_t IRHaierAC::getTemp() {
+ return ((remote_state[1] & 0b11110000) >> 4) + kHaierAcMinTemp;
+}
+
+void IRHaierAC::setHealth(bool state) {
+ setCommand(kHaierAcCmdHealth);
+ remote_state[4] &= 0b11011111;
+ remote_state[4] |= (state << 5);
+}
+
+bool IRHaierAC::getHealth(void) { return remote_state[4] & (1 << 5); }
+
+void IRHaierAC::setSleep(bool state) {
+ setCommand(kHaierAcCmdSleep);
+ remote_state[7] &= 0b10111111;
+ remote_state[7] |= (state << 6);
+}
+
+bool IRHaierAC::getSleep(void) { return remote_state[7] & 0b01000000; }
+
+uint16_t IRHaierAC::getTime(const uint8_t ptr[]) {
+ return (ptr[0] & 0b00011111) * 60 + (ptr[1] & 0b00111111);
+}
+
+int16_t IRHaierAC::getOnTimer() {
+ if (remote_state[3] & 0b10000000) // Check if the timer is turned on.
+ return getTime(remote_state + 6);
+ else
+ return -1;
+}
+
+int16_t IRHaierAC::getOffTimer() {
+ if (remote_state[3] & 0b01000000) // Check if the timer is turned on.
+ return getTime(remote_state + 4);
+ else
+ return -1;
+}
+
+uint16_t IRHaierAC::getCurrTime() { return getTime(remote_state + 2); }
+
+void IRHaierAC::setTime(uint8_t ptr[], const uint16_t nr_mins) {
+ uint16_t mins = nr_mins;
+ if (nr_mins > kHaierAcMaxTime) mins = kHaierAcMaxTime;
+
+ // Hours
+ ptr[0] &= 0b11100000;
+ ptr[0] |= (mins / 60);
+ // Minutes
+ ptr[1] &= 0b11000000;
+ ptr[1] |= (mins % 60);
+}
+
+void IRHaierAC::setOnTimer(const uint16_t nr_mins) {
+ setCommand(kHaierAcCmdTimerSet);
+ remote_state[3] |= 0b10000000;
+ setTime(remote_state + 6, nr_mins);
+}
+
+void IRHaierAC::setOffTimer(const uint16_t nr_mins) {
+ setCommand(kHaierAcCmdTimerSet);
+ remote_state[3] |= 0b01000000;
+ setTime(remote_state + 4, nr_mins);
+}
+
+void IRHaierAC::cancelTimers() {
+ setCommand(kHaierAcCmdTimerCancel);
+ remote_state[3] &= 0b00111111;
+}
+
+void IRHaierAC::setCurrTime(const uint16_t nr_mins) {
+ setTime(remote_state + 2, nr_mins);
+}
+
+uint8_t IRHaierAC::getSwing() { return (remote_state[2] & 0b11000000) >> 6; }
+
+void IRHaierAC::setSwing(const uint8_t state) {
+ if (state == getSwing()) return; // Nothing to do.
+ setCommand(kHaierAcCmdSwing);
+ switch (state) {
+ case kHaierAcSwingOff:
+ case kHaierAcSwingUp:
+ case kHaierAcSwingDown:
+ case kHaierAcSwingChg:
+ remote_state[2] &= 0b00111111;
+ remote_state[2] |= (state << 6);
+ break;
+ }
+}
+
+// Convert a Haier time into a human readable string.
+#ifdef ARDUINO
+String IRHaierAC::timeToString(const uint16_t nr_mins) {
+ String result = "";
+#else
+std::string IRHaierAC::timeToString(const uint16_t nr_mins) {
+ std::string result = "";
+#endif // ARDUINO
+
+ if (nr_mins / 24 < 10) result += "0"; // Zero pad.
+ result += uint64ToString(nr_mins / 60);
+ result += ":";
+ if (nr_mins % 60 < 10) result += "0"; // Zero pad.
+ result += uint64ToString(nr_mins % 60);
+ return result;
+}
+
+// Convert the internal state into a human readable string.
+#ifdef ARDUINO
+String IRHaierAC::toString() {
+ String result = "";
+#else
+std::string IRHaierAC::toString() {
+ std::string result = "";
+#endif // ARDUINO
+ uint8_t cmd = getCommand();
+ result += "Command: " + uint64ToString(cmd) + " (";
+ switch (cmd) {
+ case kHaierAcCmdOff:
+ result += "Off";
+ break;
+ case kHaierAcCmdOn:
+ result += "On";
+ break;
+ case kHaierAcCmdMode:
+ result += "Mode";
+ break;
+ case kHaierAcCmdFan:
+ result += "Fan";
+ break;
+ case kHaierAcCmdTempUp:
+ result += "Temp Up";
+ break;
+ case kHaierAcCmdTempDown:
+ result += "Temp Down";
+ break;
+ case kHaierAcCmdSleep:
+ result += "Sleep";
+ break;
+ case kHaierAcCmdTimerSet:
+ result += "Timer Set";
+ break;
+ case kHaierAcCmdTimerCancel:
+ result += "Timer Cancel";
+ break;
+ case kHaierAcCmdHealth:
+ result += "Health";
+ break;
+ case kHaierAcCmdSwing:
+ result += "Swing";
+ break;
+ default:
+ result += "Unknown";
+ }
+ result += ")";
+ result += ", Mode: " + uint64ToString(getMode());
+ switch (getMode()) {
+ case kHaierAcAuto:
+ result += " (AUTO)";
+ break;
+ case kHaierAcCool:
+ result += " (COOL)";
+ break;
+ case kHaierAcHeat:
+ result += " (HEAT)";
+ break;
+ case kHaierAcDry:
+ result += " (DRY)";
+ break;
+ case kHaierAcFan:
+ result += " (FAN)";
+ break;
+ default:
+ result += " (UNKNOWN)";
+ }
+ result += ", Temp: " + uint64ToString(getTemp()) + "C";
+ result += ", Fan: " + uint64ToString(getFan());
+ switch (getFan()) {
+ case kHaierAcFanAuto:
+ result += " (AUTO)";
+ break;
+ case kHaierAcFanHigh:
+ result += " (MAX)";
+ break;
+ }
+ result += ", Swing: " + uint64ToString(getSwing()) + " (";
+ switch (getSwing()) {
+ case kHaierAcSwingOff:
+ result += "Off";
+ break;
+ case kHaierAcSwingUp:
+ result += "Up";
+ break;
+ case kHaierAcSwingDown:
+ result += "Down";
+ break;
+ case kHaierAcSwingChg:
+ result += "Chg";
+ break;
+ default:
+ result += "Unknown";
+ }
+ result += ")";
+ result += ", Sleep: ";
+ if (getSleep())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Health: ";
+ if (getHealth())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Current Time: " + timeToString(getCurrTime());
+ result += ", On Timer: ";
+ if (getOnTimer() >= 0)
+ result += timeToString(getOnTimer());
+ else
+ result += "Off";
+ result += ", Off Timer: ";
+ if (getOffTimer() >= 0)
+ result += timeToString(getOffTimer());
+ else
+ result += "Off";
+
+ return result;
+}
+// End of IRHaierAC class.
+
+// Class for emulating a Haier YRW02 remote
+IRHaierACYRW02::IRHaierACYRW02(uint16_t pin) : _irsend(pin) { stateReset(); }
+
+void IRHaierACYRW02::begin() { _irsend.begin(); }
+
+#if SEND_HAIER_AC_YRW02
+void IRHaierACYRW02::send() {
+ checksum();
+ _irsend.sendHaierACYRW02(remote_state);
+}
+#endif // SEND_HAIER_AC_YRW02
+
+void IRHaierACYRW02::checksum() {
+ remote_state[kHaierACYRW02StateLength - 1] =
+ sumBytes(remote_state, kHaierACYRW02StateLength - 1);
+}
+
+bool IRHaierACYRW02::validChecksum(uint8_t state[], const uint16_t length) {
+ if (length < 2) return false; // 1 byte of data can't have a checksum.
+ return (state[length - 1] == sumBytes(state, length - 1));
+}
+
+void IRHaierACYRW02::stateReset() {
+ for (uint8_t i = 1; i < kHaierACYRW02StateLength; i++) remote_state[i] = 0x0;
+ remote_state[0] = kHaierAcYrw02Prefix;
+
+ setTemp(kHaierAcDefTemp);
+ setHealth(true);
+ setTurbo(kHaierAcYrw02TurboOff);
+ setSleep(false);
+ setFan(kHaierAcYrw02FanAuto);
+ setSwing(kHaierAcYrw02SwingOff);
+ setMode(kHaierAcYrw02Auto);
+ setPower(true);
+}
+
+uint8_t* IRHaierACYRW02::getRaw() {
+ checksum();
+ return remote_state;
+}
+
+void IRHaierACYRW02::setRaw(uint8_t new_code[]) {
+ for (uint8_t i = 0; i < kHaierACYRW02StateLength; i++) {
+ remote_state[i] = new_code[i];
+ }
+}
+
+void IRHaierACYRW02::setButton(uint8_t button) {
+ switch (button) {
+ case kHaierAcYrw02ButtonTempUp:
+ case kHaierAcYrw02ButtonTempDown:
+ case kHaierAcYrw02ButtonSwing:
+ case kHaierAcYrw02ButtonFan:
+ case kHaierAcYrw02ButtonPower:
+ case kHaierAcYrw02ButtonMode:
+ case kHaierAcYrw02ButtonHealth:
+ case kHaierAcYrw02ButtonTurbo:
+ case kHaierAcYrw02ButtonSleep:
+ remote_state[12] &= 0b11110000;
+ remote_state[12] |= (button & 0b00001111);
+ }
+}
+
+uint8_t IRHaierACYRW02::getButton() { return remote_state[12] & (0b00001111); }
+
+void IRHaierACYRW02::setMode(uint8_t mode) {
+ uint8_t new_mode = mode;
+ setButton(kHaierAcYrw02ButtonMode);
+ switch (mode) {
+ case kHaierAcYrw02Auto:
+ case kHaierAcYrw02Cool:
+ case kHaierAcYrw02Dry:
+ case kHaierAcYrw02Heat:
+ case kHaierAcYrw02Fan:
+ break;
+ default: // If unexpected, default to auto mode.
+ new_mode = kHaierAcYrw02Auto;
+ }
+ remote_state[7] &= 0b0001111;
+ remote_state[7] |= (new_mode << 4);
+}
+
+uint8_t IRHaierACYRW02::getMode() { return remote_state[7] >> 4; }
+
+void IRHaierACYRW02::setTemp(const uint8_t celcius) {
+ uint8_t temp = celcius;
+ if (temp < kHaierAcMinTemp)
+ temp = kHaierAcMinTemp;
+ else if (temp > kHaierAcMaxTemp)
+ temp = kHaierAcMaxTemp;
+
+ uint8_t old_temp = getTemp();
+ if (old_temp == temp) return;
+ if (old_temp > temp)
+ setButton(kHaierAcYrw02ButtonTempDown);
+ else
+ setButton(kHaierAcYrw02ButtonTempUp);
+
+ remote_state[1] &= 0b00001111; // Clear the previous temp.
+ remote_state[1] |= ((temp - kHaierAcMinTemp) << 4);
+}
+
+uint8_t IRHaierACYRW02::getTemp() {
+ return ((remote_state[1] & 0b11110000) >> 4) + kHaierAcMinTemp;
+}
+
+void IRHaierACYRW02::setHealth(bool state) {
+ setButton(kHaierAcYrw02ButtonHealth);
+ remote_state[3] &= 0b11111101;
+ remote_state[3] |= (state << 1);
+}
+
+bool IRHaierACYRW02::getHealth(void) { return remote_state[3] & 0b00000010; }
+
+bool IRHaierACYRW02::getPower() { return remote_state[4] & kHaierAcYrw02Power; }
+
+void IRHaierACYRW02::setPower(bool state) {
+ setButton(kHaierAcYrw02ButtonPower);
+ if (state)
+ remote_state[4] |= kHaierAcYrw02Power;
+ else
+ remote_state[4] &= ~kHaierAcYrw02Power;
+}
+
+void IRHaierACYRW02::on() { setPower(true); }
+
+void IRHaierACYRW02::off() { setPower(false); }
+
+bool IRHaierACYRW02::getSleep() { return remote_state[8] & kHaierAcYrw02Sleep; }
+
+void IRHaierACYRW02::setSleep(bool state) {
+ setButton(kHaierAcYrw02ButtonSleep);
+ if (state)
+ remote_state[8] |= kHaierAcYrw02Sleep;
+ else
+ remote_state[8] &= ~kHaierAcYrw02Sleep;
+}
+
+uint8_t IRHaierACYRW02::getTurbo() { return remote_state[6] >> 6; }
+
+void IRHaierACYRW02::setTurbo(uint8_t speed) {
+ switch (speed) {
+ case kHaierAcYrw02TurboOff:
+ case kHaierAcYrw02TurboLow:
+ case kHaierAcYrw02TurboHigh:
+ remote_state[6] &= 0b00111111;
+ remote_state[6] |= (speed << 6);
+ setButton(kHaierAcYrw02ButtonTurbo);
+ }
+}
+
+uint8_t IRHaierACYRW02::getFan() { return remote_state[5] >> 4; }
+
+void IRHaierACYRW02::setFan(uint8_t speed) {
+ switch (speed) {
+ case kHaierAcYrw02FanLow:
+ case kHaierAcYrw02FanMed:
+ case kHaierAcYrw02FanHigh:
+ case kHaierAcYrw02FanAuto:
+ remote_state[5] &= 0b00001111;
+ remote_state[5] |= (speed << 4);
+ setButton(kHaierAcYrw02ButtonFan);
+ }
+}
+
+uint8_t IRHaierACYRW02::getSwing() { return remote_state[1] & 0b00001111; }
+
+void IRHaierACYRW02::setSwing(uint8_t state) {
+ uint8_t newstate = state;
+ switch (state) {
+ case kHaierAcYrw02SwingOff:
+ case kHaierAcYrw02SwingAuto:
+ case kHaierAcYrw02SwingTop:
+ case kHaierAcYrw02SwingMiddle:
+ case kHaierAcYrw02SwingBottom:
+ case kHaierAcYrw02SwingDown:
+ setButton(kHaierAcYrw02ButtonSwing);
+ break;
+ default:
+ return; // Unexpected value so don't do anything.
+ }
+
+ // Heat mode has no MIDDLE setting, use BOTTOM instead.
+ if (state == kHaierAcYrw02SwingMiddle && getMode() == kHaierAcYrw02Heat)
+ newstate = kHaierAcYrw02SwingBottom;
+
+ // BOTTOM is only allowed if we are in Heat mode, otherwise MIDDLE.
+ if (state == kHaierAcYrw02SwingBottom && getMode() != kHaierAcYrw02Heat)
+ newstate = kHaierAcYrw02SwingMiddle;
+
+ remote_state[1] &= 0b11110000;
+ remote_state[1] |= newstate;
+}
+
+// Convert the internal state into a human readable string.
+#ifdef ARDUINO
+String IRHaierACYRW02::toString() {
+ String result = "";
+#else
+std::string IRHaierACYRW02::toString() {
+ std::string result = "";
+#endif // ARDUINO
+ result += "Power: ";
+ if (getPower())
+ result += "On";
+ else
+ result += "Off";
+ uint8_t cmd = getButton();
+ result += ", Button: " + uint64ToString(cmd) + " (";
+ switch (cmd) {
+ case kHaierAcYrw02ButtonPower:
+ result += "Power";
+ break;
+ case kHaierAcYrw02ButtonMode:
+ result += "Mode";
+ break;
+ case kHaierAcYrw02ButtonFan:
+ result += "Fan";
+ break;
+ case kHaierAcYrw02ButtonTempUp:
+ result += "Temp Up";
+ break;
+ case kHaierAcYrw02ButtonTempDown:
+ result += "Temp Down";
+ break;
+ case kHaierAcYrw02ButtonSleep:
+ result += "Sleep";
+ break;
+ case kHaierAcYrw02ButtonHealth:
+ result += "Health";
+ break;
+ case kHaierAcYrw02ButtonSwing:
+ result += "Swing";
+ break;
+ case kHaierAcYrw02ButtonTurbo:
+ result += "Turbo";
+ break;
+ default:
+ result += "Unknown";
+ }
+ result += ")";
+ result += ", Mode: " + uint64ToString(getMode());
+ switch (getMode()) {
+ case kHaierAcYrw02Auto:
+ result += " (Auto)";
+ break;
+ case kHaierAcYrw02Cool:
+ result += " (Cool)";
+ break;
+ case kHaierAcYrw02Heat:
+ result += " (Heat)";
+ break;
+ case kHaierAcYrw02Dry:
+ result += " (Dry)";
+ break;
+ case kHaierAcYrw02Fan:
+ result += " (Fan)";
+ break;
+ default:
+ result += " (UNKNOWN)";
+ }
+ result += ", Temp: " + uint64ToString(getTemp()) + "C";
+ result += ", Fan: " + uint64ToString(getFan());
+ switch (getFan()) {
+ case kHaierAcYrw02FanAuto:
+ result += " (Auto)";
+ break;
+ case kHaierAcYrw02FanHigh:
+ result += " (High)";
+ break;
+ case kHaierAcYrw02FanLow:
+ result += " (Low)";
+ break;
+ case kHaierAcYrw02FanMed:
+ result += " (Med)";
+ break;
+ default:
+ result += " (Unknown)";
+ }
+ result += ", Turbo: " + uint64ToString(getTurbo()) + " (";
+ switch (getTurbo()) {
+ case kHaierAcYrw02TurboOff:
+ result += "Off";
+ break;
+ case kHaierAcYrw02TurboLow:
+ result += "Low";
+ break;
+ case kHaierAcYrw02TurboHigh:
+ result += "High";
+ break;
+ default:
+ result += "Unknown";
+ }
+ result += ")";
+ result += ", Swing: " + uint64ToString(getSwing()) + " (";
+ switch (getSwing()) {
+ case kHaierAcYrw02SwingOff:
+ result += "Off";
+ break;
+ case kHaierAcYrw02SwingAuto:
+ result += "Auto";
+ break;
+ case kHaierAcYrw02SwingBottom:
+ result += "Bottom";
+ break;
+ case kHaierAcYrw02SwingDown:
+ result += "Down";
+ break;
+ case kHaierAcYrw02SwingTop:
+ result += "Top";
+ break;
+ case kHaierAcYrw02SwingMiddle:
+ result += "Middle";
+ break;
+ default:
+ result += "Unknown";
+ }
+ result += ")";
+ result += ", Sleep: ";
+ if (getSleep())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Health: ";
+ if (getHealth())
+ result += "On";
+ else
+ result += "Off";
+
+ return result;
+}
+// End of IRHaierACYRW02 class.
+
+#if (DECODE_HAIER_AC || DECODE_HAIER_AC_YRW02)
+// Decode the supplied Haier HSU07-HEA03 remote message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: The number of data bits to expect. Typically kHaierACBits.
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: BETA / Appears to be working.
+//
+bool IRrecv::decodeHaierAC(decode_results* results, uint16_t nbits,
+ bool strict) {
+ if (nbits % 8 != 0) // nbits has to be a multiple of nr. of bits in a byte.
+ return false;
+
+ if (strict) {
+ if (nbits != kHaierACBits)
+ return false; // Not strictly a HAIER_AC message.
+ }
+
+ if (results->rawlen < (2 * nbits + kHeader) + kFooter - 1)
+ return false; // Can't possibly be a valid HAIER_AC message.
+
+ uint16_t offset = kStartOffset;
+
+ // Header
+ if (!matchMark(results->rawbuf[offset++], kHaierAcHdr)) return false;
+ if (!matchSpace(results->rawbuf[offset++], kHaierAcHdr)) return false;
+ if (!matchMark(results->rawbuf[offset++], kHaierAcHdr)) return false;
+ if (!matchSpace(results->rawbuf[offset++], kHaierAcHdrGap)) return false;
+
+ // Data
+ for (uint16_t i = 0; i < nbits / 8; i++) {
+ match_result_t data_result =
+ matchData(&(results->rawbuf[offset]), 8, kHaierAcBitMark,
+ kHaierAcOneSpace, kHaierAcBitMark, kHaierAcZeroSpace);
+ if (data_result.success == false) return false;
+ offset += data_result.used;
+ results->state[i] = (uint8_t)data_result.data;
+ }
+
+ // Footer
+ if (!matchMark(results->rawbuf[offset++], kHaierAcBitMark)) return false;
+ if (offset < results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset++], kHaierAcMinGap))
+ return false;
+
+ // Compliance
+ if (strict) {
+ if (results->state[0] != kHaierAcPrefix) return false;
+ if (!IRHaierAC::validChecksum(results->state, nbits / 8)) return false;
+ }
+
+ // Success
+ results->decode_type = HAIER_AC;
+ results->bits = nbits;
+ return true;
+}
+#endif // (DECODE_HAIER_AC || DECODE_HAIER_AC_YRW02)
+
+#if DECODE_HAIER_AC_YRW02
+// Decode the supplied Haier YR-W02 remote A/C message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: The number of data bits to expect. Typically kHaierACYRW02Bits.
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: BETA / Appears to be working.
+//
+bool IRrecv::decodeHaierACYRW02(decode_results* results, uint16_t nbits,
+ bool strict) {
+ if (strict) {
+ if (nbits != kHaierACYRW02Bits)
+ return false; // Not strictly a HAIER_AC_YRW02 message.
+ }
+
+ // The protocol is almost exactly the same as HAIER_AC
+ if (!decodeHaierAC(results, nbits, false)) return false;
+
+ // Compliance
+ if (strict) {
+ if (results->state[0] != kHaierAcYrw02Prefix) return false;
+ if (!IRHaierACYRW02::validChecksum(results->state, nbits / 8)) return false;
+ }
+
+ // Success
+ // It looks correct, but we haven't check the checksum etc.
+ results->decode_type = HAIER_AC_YRW02;
+ return true;
+}
+#endif // DECODE_HAIER_AC_YRW02
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Haier.h b/lib/IRremoteESP8266-2.5.2.03/src/ir_Haier.h
new file mode 100644
index 000000000000..fdc15a3a8ebe
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Haier.h
@@ -0,0 +1,297 @@
+// Copyright 2018 crankyoldgit
+// The specifics of reverse engineering the protocol details by kuzin2006
+
+#ifndef IR_HAIER_H_
+#define IR_HAIER_H_
+
+#ifndef UNIT_TEST
+#include
+#else
+#include
+#endif
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+
+// HH HH AAA IIIII EEEEEEE RRRRRR
+// HH HH AAAAA III EE RR RR
+// HHHHHHH AA AA III EEEEE RRRRRR
+// HH HH AAAAAAA III EE RR RR
+// HH HH AA AA IIIII EEEEEEE RR RR
+
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/404
+// https://www.dropbox.com/s/mecyib3lhdxc8c6/IR%20data%20reverse%20engineering.xlsx?dl=0
+// https://github.com/markszabo/IRremoteESP8266/issues/485
+// https://www.dropbox.com/sh/w0bt7egp0fjger5/AADRFV6Wg4wZskJVdFvzb8Z0a?dl=0&preview=haer2.ods
+
+// Constants
+
+// Haier HSU07-HEA03 remote
+// Byte 0
+const uint8_t kHaierAcPrefix = 0b10100101;
+
+// Byte 1
+const uint8_t kHaierAcMinTemp = 16;
+const uint8_t kHaierAcDefTemp = 25;
+const uint8_t kHaierAcMaxTemp = 30;
+const uint8_t kHaierAcCmdOff = 0b00000000;
+const uint8_t kHaierAcCmdOn = 0b00000001;
+const uint8_t kHaierAcCmdMode = 0b00000010;
+const uint8_t kHaierAcCmdFan = 0b00000011;
+const uint8_t kHaierAcCmdTempUp = 0b00000110;
+const uint8_t kHaierAcCmdTempDown = 0b00000111;
+const uint8_t kHaierAcCmdSleep = 0b00001000;
+const uint8_t kHaierAcCmdTimerSet = 0b00001001;
+const uint8_t kHaierAcCmdTimerCancel = 0b00001010;
+const uint8_t kHaierAcCmdHealth = 0b00001100;
+const uint8_t kHaierAcCmdSwing = 0b00001101;
+
+// Byte 2
+const uint8_t kHaierAcSwingOff = 0b00000000;
+const uint8_t kHaierAcSwingUp = 0b00000001;
+const uint8_t kHaierAcSwingDown = 0b00000010;
+const uint8_t kHaierAcSwingChg = 0b00000011;
+
+// Byte 6
+const uint8_t kHaierAcAuto = 0;
+const uint8_t kHaierAcCool = 1;
+const uint8_t kHaierAcDry = 2;
+const uint8_t kHaierAcHeat = 3;
+const uint8_t kHaierAcFan = 4;
+
+const uint8_t kHaierAcFanAuto = 0;
+const uint8_t kHaierAcFanLow = 1;
+const uint8_t kHaierAcFanMed = 2;
+const uint8_t kHaierAcFanHigh = 3;
+
+const uint16_t kHaierAcMaxTime = (23 * 60) + 59;
+
+// Legacy Haier AC defines.
+#define HAIER_AC_MIN_TEMP kHaierAcMinTemp
+#define HAIER_AC_DEF_TEMP kHaierAcDefTemp
+#define HAIER_AC_MAX_TEMP kHaierAcMaxTemp
+#define HAIER_AC_CMD_OFF kHaierAcCmdOff
+#define HAIER_AC_CMD_ON kHaierAcCmdOn
+#define HAIER_AC_CMD_MODE kHaierAcCmdMode
+#define HAIER_AC_CMD_FAN kHaierAcCmdFan
+#define HAIER_AC_CMD_TEMP_UP kHaierAcCmdTempUp
+#define HAIER_AC_CMD_TEMP_DOWN kHaierAcCmdTempDown
+#define HAIER_AC_CMD_SLEEP kHaierAcCmdSleep
+#define HAIER_AC_CMD_TIMER_SET kHaierAcCmdTimerSet
+#define HAIER_AC_CMD_TIMER_CANCEL kHaierAcCmdTimerCancel
+#define HAIER_AC_CMD_HEALTH kHaierAcCmdHealth
+#define HAIER_AC_CMD_SWING kHaierAcCmdSwing
+#define HAIER_AC_SWING_OFF kHaierAcSwingOff
+#define HAIER_AC_SWING_UP kHaierAcSwingUp
+#define HAIER_AC_SWING_DOWN kHaierAcSwingDown
+#define HAIER_AC_SWING_CHG kHaierAcSwingChg
+#define HAIER_AC_AUTO kHaierAcAuto
+#define HAIER_AC_COOL kHaierAcCool
+#define HAIER_AC_DRY kHaierAcDry
+#define HAIER_AC_HEAT kHaierAcHeat
+#define HAIER_AC_FAN kHaierAcFan
+#define HAIER_AC_FAN_AUTO kHaierAcFanAuto
+#define HAIER_AC_FAN_LOW kHaierAcFanLow
+#define HAIER_AC_FAN_MED kHaierAcFanMed
+#define HAIER_AC_FAN_HIGH kHaierAcFanHigh
+
+// Haier YRW02 remote
+// Byte 0
+const uint8_t kHaierAcYrw02Prefix = 0xA6;
+
+// Byte 1
+// Bits 0-3
+// 0x0 = 16DegC, ... 0xE = 30DegC
+// Bits 4-7 - Swing
+const uint8_t kHaierAcYrw02SwingOff = 0x0;
+const uint8_t kHaierAcYrw02SwingTop = 0x1;
+const uint8_t kHaierAcYrw02SwingMiddle = 0x2; // Not available in heat mode.
+const uint8_t kHaierAcYrw02SwingBottom = 0x3; // Only available in heat mode.
+const uint8_t kHaierAcYrw02SwingDown = 0xA;
+const uint8_t kHaierAcYrw02SwingAuto = 0xC; // Airflow
+
+// Byte 3
+// Bit 7 - Health mode
+
+// Byte 4
+const uint8_t kHaierAcYrw02Power = 0b01000000;
+
+// Byte 5
+// Bits 0-3
+const uint8_t kHaierAcYrw02FanHigh = 0x2;
+const uint8_t kHaierAcYrw02FanMed = 0x4;
+const uint8_t kHaierAcYrw02FanLow = 0x6;
+const uint8_t kHaierAcYrw02FanAuto = 0xA;
+
+// Byte 6
+// Bits 0-1
+const uint8_t kHaierAcYrw02TurboOff = 0x0;
+const uint8_t kHaierAcYrw02TurboHigh = 0x1;
+const uint8_t kHaierAcYrw02TurboLow = 0x2;
+
+// Byte 7
+// Bits 0-3
+const uint8_t kHaierAcYrw02Auto = 0x0;
+const uint8_t kHaierAcYrw02Cool = 0x2;
+const uint8_t kHaierAcYrw02Dry = 0x4;
+const uint8_t kHaierAcYrw02Heat = 0x8;
+const uint8_t kHaierAcYrw02Fan = 0xC;
+
+// Byte 8
+const uint8_t kHaierAcYrw02Sleep = 0b10000000;
+
+// Byte 12
+// Bits 4-7
+const uint8_t kHaierAcYrw02ButtonTempUp = 0x0;
+const uint8_t kHaierAcYrw02ButtonTempDown = 0x1;
+const uint8_t kHaierAcYrw02ButtonSwing = 0x2;
+const uint8_t kHaierAcYrw02ButtonFan = 0x4;
+const uint8_t kHaierAcYrw02ButtonPower = 0x5;
+const uint8_t kHaierAcYrw02ButtonMode = 0x6;
+const uint8_t kHaierAcYrw02ButtonHealth = 0x7;
+const uint8_t kHaierAcYrw02ButtonTurbo = 0x8;
+const uint8_t kHaierAcYrw02ButtonSleep = 0xB;
+
+// Legacy Haier YRW02 remote defines.
+#define HAIER_AC_YRW02_SWING_OFF kHaierAcYrw02SwingOff
+#define HAIER_AC_YRW02_SWING_TOP kHaierAcYrw02SwingTop
+#define HAIER_AC_YRW02_SWING_MIDDLE kHaierAcYrw02SwingMiddle
+#define HAIER_AC_YRW02_SWING_BOTTOM kHaierAcYrw02SwingBottom
+#define HAIER_AC_YRW02_SWING_DOWN kHaierAcYrw02SwingDown
+#define HAIER_AC_YRW02_SWING_AUTO kHaierAcYrw02SwingAuto
+#define HAIER_AC_YRW02_FAN_HIGH kHaierAcYrw02FanHigh
+#define HAIER_AC_YRW02_FAN_MED kHaierAcYrw02FanMed
+#define HAIER_AC_YRW02_FAN_LOW kHaierAcYrw02FanLow
+#define HAIER_AC_YRW02_FAN_AUTO kHaierAcYrw02FanAuto
+#define HAIER_AC_YRW02_TURBO_OFF kHaierAcYrw02TurboOff
+#define HAIER_AC_YRW02_TURBO_HIGH kHaierAcYrw02TurboHigh
+#define HAIER_AC_YRW02_TURBO_LOW kHaierAcYrw02TurboLow
+#define HAIER_AC_YRW02_AUTO kHaierAcYrw02Auto
+#define HAIER_AC_YRW02_COOL kHaierAcYrw02Cool
+#define HAIER_AC_YRW02_DRY kHaierAcYrw02Dry
+#define HAIER_AC_YRW02_HEAT kHaierAcYrw02Heat
+#define HAIER_AC_YRW02_FAN kHaierAcYrw02Fan
+#define HAIER_AC_YRW02_BUTTON_TEMP_UP kHaierAcYrw02ButtonTempUp
+#define HAIER_AC_YRW02_BUTTON_TEMP_DOWN kHaierAcYrw02ButtonTempDown
+#define HAIER_AC_YRW02_BUTTON_SWING kHaierAcYrw02ButtonSwing
+#define HAIER_AC_YRW02_BUTTON_FAN kHaierAcYrw02ButtonFan
+#define HAIER_AC_YRW02_BUTTON_POWER kHaierAcYrw02ButtonPower
+#define HAIER_AC_YRW02_BUTTON_MODE kHaierAcYrw02ButtonMode
+#define HAIER_AC_YRW02_BUTTON_HEALTH kHaierAcYrw02ButtonHealth
+#define HAIER_AC_YRW02_BUTTON_TURBO kHaierAcYrw02ButtonTurbo
+#define HAIER_AC_YRW02_BUTTON_SLEEP kHaierAcYrw02ButtonSleep
+
+class IRHaierAC {
+ public:
+ explicit IRHaierAC(uint16_t pin);
+
+#if SEND_HAIER_AC
+ void send();
+#endif // SEND_HAIER_AC
+ void begin();
+
+ void setCommand(const uint8_t command);
+ uint8_t getCommand();
+
+ void setTemp(const uint8_t temp);
+ uint8_t getTemp();
+
+ void setFan(const uint8_t speed);
+ uint8_t getFan();
+
+ uint8_t getMode();
+ void setMode(const uint8_t mode);
+
+ bool getSleep();
+ void setSleep(const bool state);
+ bool getHealth();
+ void setHealth(const bool state);
+
+ int16_t getOnTimer();
+ void setOnTimer(const uint16_t mins);
+ int16_t getOffTimer();
+ void setOffTimer(const uint16_t mins);
+ void cancelTimers();
+
+ uint16_t getCurrTime();
+ void setCurrTime(const uint16_t mins);
+
+ uint8_t getSwing();
+ void setSwing(const uint8_t state);
+
+ uint8_t* getRaw();
+ void setRaw(uint8_t new_code[]);
+ static bool validChecksum(uint8_t state[],
+ const uint16_t length = kHaierACStateLength);
+#ifdef ARDUINO
+ String toString();
+ static String timeToString(const uint16_t nr_mins);
+#else
+ std::string toString();
+ static std::string timeToString(const uint16_t nr_mins);
+#endif
+
+ private:
+ uint8_t remote_state[kHaierACStateLength];
+ void stateReset();
+ void checksum();
+ static uint16_t getTime(const uint8_t ptr[]);
+ static void setTime(uint8_t ptr[], const uint16_t nr_mins);
+ IRsend _irsend;
+};
+
+class IRHaierACYRW02 {
+ public:
+ explicit IRHaierACYRW02(uint16_t pin);
+
+#if SEND_HAIER_AC_YRW02
+ void send();
+#endif // SEND_HAIER_AC_YRW02
+ void begin();
+
+ void setButton(const uint8_t button);
+ uint8_t getButton();
+
+ void setTemp(const uint8_t temp);
+ uint8_t getTemp();
+
+ void setFan(const uint8_t speed);
+ uint8_t getFan();
+
+ uint8_t getMode();
+ void setMode(const uint8_t mode);
+
+ bool getPower();
+ void setPower(const bool state);
+ void on();
+ void off();
+
+ bool getSleep();
+ void setSleep(const bool state);
+ bool getHealth();
+ void setHealth(const bool state);
+
+ uint8_t getTurbo();
+ void setTurbo(const uint8_t speed);
+
+ uint8_t getSwing();
+ void setSwing(const uint8_t state);
+
+ uint8_t* getRaw();
+ void setRaw(uint8_t new_code[]);
+ static bool validChecksum(uint8_t state[],
+ const uint16_t length = kHaierACYRW02StateLength);
+#ifdef ARDUINO
+ String toString();
+#else
+ std::string toString();
+#endif
+
+ private:
+ uint8_t remote_state[kHaierACYRW02StateLength];
+ void stateReset();
+ void checksum();
+ IRsend _irsend;
+};
+
+#endif // IR_HAIER_H_
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Hitachi.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Hitachi.cpp
new file mode 100644
index 000000000000..111051974c84
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Hitachi.cpp
@@ -0,0 +1,424 @@
+// Copyright 2018 David Conran
+//
+// Code to emulate Hitachi protocol compatible devices.
+// Should be compatible with:
+// * Hitachi RAS-35THA6 remote
+//
+
+#include "ir_Hitachi.h"
+#include
+#ifndef ARDUINO
+#include
+#endif
+#include "IRrecv.h"
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+#include "IRutils.h"
+
+// HH HH IIIII TTTTTTT AAA CCCCC HH HH IIIII
+// HH HH III TTT AAAAA CC C HH HH III
+// HHHHHHH III TTT AA AA CC HHHHHHH III
+// HH HH III TTT AAAAAAA CC C HH HH III
+// HH HH IIIII TTT AA AA CCCCC HH HH IIIII
+
+// Constants
+// Ref: https://github.com/markszabo/IRremoteESP8266/issues/417
+const uint16_t kHitachiAcHdrMark = 3300;
+const uint16_t kHitachiAcHdrSpace = 1700;
+const uint16_t kHitachiAc1HdrMark = 3400;
+const uint16_t kHitachiAc1HdrSpace = 3400;
+const uint16_t kHitachiAcBitMark = 400;
+const uint16_t kHitachiAcOneSpace = 1250;
+const uint16_t kHitachiAcZeroSpace = 500;
+const uint32_t kHitachiAcMinGap = 100000; // Completely made up value.
+
+#if (SEND_HITACHI_AC || SEND_HITACHI_AC2)
+// Send a Hitachi A/C message.
+//
+// Args:
+// data: An array of bytes containing the IR command.
+// nbytes: Nr. of bytes of data in the array. (>=kHitachiAcStateLength)
+// repeat: Nr. of times the message is to be repeated. (Default = 0).
+//
+// Status: ALPHA / Untested.
+//
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/417
+void IRsend::sendHitachiAC(unsigned char data[], uint16_t nbytes,
+ uint16_t repeat) {
+ if (nbytes < kHitachiAcStateLength)
+ return; // Not enough bytes to send a proper message.
+ sendGeneric(kHitachiAcHdrMark, kHitachiAcHdrSpace, kHitachiAcBitMark,
+ kHitachiAcOneSpace, kHitachiAcBitMark, kHitachiAcZeroSpace,
+ kHitachiAcBitMark, kHitachiAcMinGap, data, nbytes, 38, true,
+ repeat, 50);
+}
+#endif // (SEND_HITACHI_AC || SEND_HITACHI_AC2)
+
+#if SEND_HITACHI_AC1
+// Send a Hitachi A/C 13-byte message.
+//
+// For devices:
+// Hitachi A/C Series VI (Circa 2007) / Remote: LT0541-HTA
+//
+// Args:
+// data: An array of bytes containing the IR command.
+// nbytes: Nr. of bytes of data in the array. (>=kHitachiAc1StateLength)
+// repeat: Nr. of times the message is to be repeated. (Default = 0).
+//
+// Status: BETA / Appears to work.
+//
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/453
+// Basically the same as sendHitatchiAC() except different size and header.
+void IRsend::sendHitachiAC1(unsigned char data[], uint16_t nbytes,
+ uint16_t repeat) {
+ if (nbytes < kHitachiAc1StateLength)
+ return; // Not enough bytes to send a proper message.
+ sendGeneric(kHitachiAc1HdrMark, kHitachiAc1HdrSpace, kHitachiAcBitMark,
+ kHitachiAcOneSpace, kHitachiAcBitMark, kHitachiAcZeroSpace,
+ kHitachiAcBitMark, kHitachiAcMinGap, data, nbytes, 38, true,
+ repeat, 50);
+}
+#endif // SEND_HITACHI_AC1
+
+#if SEND_HITACHI_AC2
+// Send a Hitachi A/C 53-byte message.
+//
+// For devices:
+// Hitachi A/C Series VI (Circa 2007) / Remote: LT0541-HTA
+//
+// Args:
+// data: An array of bytes containing the IR command.
+// nbytes: Nr. of bytes of data in the array. (>=kHitachiAc2StateLength)
+// repeat: Nr. of times the message is to be repeated. (Default = 0).
+//
+// Status: BETA / Appears to work.
+//
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/417
+// Basically the same as sendHitatchiAC() except different size.
+void IRsend::sendHitachiAC2(unsigned char data[], uint16_t nbytes,
+ uint16_t repeat) {
+ if (nbytes < kHitachiAc2StateLength)
+ return; // Not enough bytes to send a proper message.
+ sendHitachiAC(data, nbytes, repeat);
+}
+#endif // SEND_HITACHI_AC2
+
+// Class for handling the remote control oh a Hitachi 28 byte A/C message.
+// Inspired by:
+// https://github.com/ToniA/arduino-heatpumpir/blob/master/HitachiHeatpumpIR.cpp
+
+IRHitachiAc::IRHitachiAc(uint16_t pin) : _irsend(pin) { stateReset(); }
+
+void IRHitachiAc::stateReset() {
+ remote_state[0] = 0x80;
+ remote_state[1] = 0x08;
+ remote_state[2] = 0x0C;
+ remote_state[3] = 0x02;
+ remote_state[4] = 0xFD;
+ remote_state[5] = 0x80;
+ remote_state[6] = 0x7F;
+ remote_state[7] = 0x88;
+ remote_state[8] = 0x48;
+ remote_state[9] = 0x10;
+ for (uint8_t i = 10; i < kHitachiAcStateLength; i++) remote_state[i] = 0x00;
+ remote_state[14] = 0x60;
+ remote_state[15] = 0x60;
+ remote_state[24] = 0x80;
+ setTemp(23);
+}
+
+void IRHitachiAc::begin() { _irsend.begin(); }
+
+uint8_t IRHitachiAc::calcChecksum(const uint8_t state[],
+ const uint16_t length) {
+ int8_t sum = 62;
+ for (uint16_t i = 0; i < length - 1; i++) sum -= reverseBits(state[i], 8);
+ return reverseBits((uint8_t)sum, 8);
+}
+
+void IRHitachiAc::checksum(const uint16_t length) {
+ remote_state[length - 1] = calcChecksum(remote_state, length);
+}
+
+bool IRHitachiAc::validChecksum(const uint8_t state[], const uint16_t length) {
+ if (length < 2) return true; // Assume true for lengths that are too short.
+ return (state[length - 1] == calcChecksum(state, length));
+}
+
+uint8_t *IRHitachiAc::getRaw() {
+ checksum();
+ return remote_state;
+}
+
+void IRHitachiAc::setRaw(const uint8_t new_code[], const uint16_t length) {
+ for (uint8_t i = 0; i < length && i < kHitachiAcStateLength; i++)
+ remote_state[i] = new_code[i];
+}
+
+#if SEND_HITACHI_AC
+void IRHitachiAc::send() {
+ checksum();
+ _irsend.sendHitachiAC(remote_state);
+}
+#endif // SEND_HITACHI_AC
+
+bool IRHitachiAc::getPower() { return (remote_state[17] & 0x01); }
+
+void IRHitachiAc::setPower(const bool on) {
+ if (on)
+ remote_state[17] |= 0x01;
+ else
+ remote_state[17] &= 0xFE;
+}
+
+void IRHitachiAc::on() { setPower(true); }
+
+void IRHitachiAc::off() { setPower(false); }
+
+uint8_t IRHitachiAc::getMode() { return reverseBits(remote_state[10], 8); }
+
+void IRHitachiAc::setMode(const uint8_t mode) {
+ uint8_t newmode = mode;
+ switch (mode) {
+ case kHitachiAcFan:
+ // Fan mode sets a special temp.
+ setTemp(64);
+ break;
+ case kHitachiAcAuto:
+ case kHitachiAcHeat:
+ case kHitachiAcCool:
+ case kHitachiAcDry:
+ break;
+ default:
+ newmode = kHitachiAcAuto;
+ }
+ remote_state[10] = reverseBits(newmode, 8);
+ if (mode != kHitachiAcFan) setTemp(_previoustemp);
+ setFan(getFan()); // Reset the fan speed after the mode change.
+}
+
+uint8_t IRHitachiAc::getTemp() { return reverseBits(remote_state[11], 8) >> 1; }
+
+void IRHitachiAc::setTemp(const uint8_t celsius) {
+ uint8_t temp;
+ if (celsius != 64) _previoustemp = celsius;
+ switch (celsius) {
+ case 64:
+ temp = celsius;
+ break;
+ default:
+ temp = std::min(celsius, kHitachiAcMaxTemp);
+ temp = std::max(temp, kHitachiAcMinTemp);
+ }
+ remote_state[11] = reverseBits(temp << 1, 8);
+ if (temp == kHitachiAcMinTemp)
+ remote_state[9] = 0x90;
+ else
+ remote_state[9] = 0x10;
+}
+
+uint8_t IRHitachiAc::getFan() { return reverseBits(remote_state[13], 8); }
+
+void IRHitachiAc::setFan(const uint8_t speed) {
+ uint8_t fanmin = kHitachiAcFanAuto;
+ uint8_t fanmax = kHitachiAcFanHigh;
+ switch (getMode()) {
+ case kHitachiAcDry: // Only 2 x low speeds in Dry mode.
+ fanmin = kHitachiAcFanLow;
+ fanmax = kHitachiAcFanLow + 1;
+ break;
+ case kHitachiAcFan:
+ fanmin = kHitachiAcFanLow; // No Auto in Fan mode.
+ break;
+ }
+ uint8_t newspeed = std::max(speed, fanmin);
+ newspeed = std::min(newspeed, fanmax);
+ remote_state[13] = reverseBits(newspeed, 8);
+}
+
+bool IRHitachiAc::getSwingVertical() { return remote_state[14] & 0x80; }
+
+void IRHitachiAc::setSwingVertical(const bool on) {
+ if (on)
+ remote_state[14] |= 0x80;
+ else
+ remote_state[14] &= 0x7F;
+}
+
+bool IRHitachiAc::getSwingHorizontal() { return remote_state[15] & 0x80; }
+
+void IRHitachiAc::setSwingHorizontal(const bool on) {
+ if (on)
+ remote_state[15] |= 0x80;
+ else
+ remote_state[15] &= 0x7F;
+}
+
+// Convert the internal state into a human readable string.
+#ifdef ARDUINO
+String IRHitachiAc::toString() {
+ String result = "";
+#else
+std::string IRHitachiAc::toString() {
+ std::string result = "";
+#endif // ARDUINO
+ result += "Power: ";
+ if (getPower())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Mode: " + uint64ToString(getMode());
+ switch (getMode()) {
+ case kHitachiAcAuto:
+ result += " (AUTO)";
+ break;
+ case kHitachiAcCool:
+ result += " (COOL)";
+ break;
+ case kHitachiAcHeat:
+ result += " (HEAT)";
+ break;
+ case kHitachiAcDry:
+ result += " (DRY)";
+ break;
+ case kHitachiAcFan:
+ result += " (FAN)";
+ break;
+ default:
+ result += " (UNKNOWN)";
+ }
+ result += ", Temp: " + uint64ToString(getTemp()) + "C";
+ result += ", Fan: " + uint64ToString(getFan());
+ switch (getFan()) {
+ case kHitachiAcFanAuto:
+ result += " (AUTO)";
+ break;
+ case kHitachiAcFanLow:
+ result += " (LOW)";
+ break;
+ case kHitachiAcFanHigh:
+ result += " (HIGH)";
+ break;
+ default:
+ result += " (UNKNOWN)";
+ break;
+ }
+ result += ", Swing (Vertical): ";
+ if (getSwingVertical())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Swing (Horizontal): ";
+ if (getSwingHorizontal())
+ result += "On";
+ else
+ result += "Off";
+ return result;
+}
+
+#if (DECODE_HITACHI_AC || DECODE_HITACHI_AC1 || DECODE_HITACHI_AC2)
+// Decode the supplied Hitachi A/C message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: The number of data bits to expect.
+// Typically kHitachiAcBits, kHitachiAc1Bits, kHitachiAc2Bits
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: ALPHA / Untested.
+//
+// Supported devices:
+// Hitachi A/C Series VI (Circa 2007) / Remote: LT0541-HTA
+//
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/417
+// https://github.com/markszabo/IRremoteESP8266/issues/453
+bool IRrecv::decodeHitachiAC(decode_results *results, uint16_t nbits,
+ bool strict) {
+ const uint8_t kTolerance = 30;
+ if (results->rawlen < 2 * nbits + kHeader + kFooter - 1)
+ return false; // Can't possibly be a valid HitachiAC message.
+ if (strict) {
+ switch (nbits) {
+ case kHitachiAcBits:
+ case kHitachiAc1Bits:
+ case kHitachiAc2Bits:
+ break; // Okay to continue.
+ default:
+ return false; // Not strictly a Hitachi message.
+ }
+ }
+ uint16_t offset = kStartOffset;
+ uint16_t dataBitsSoFar = 0;
+ match_result_t data_result;
+
+ // Header
+ if (nbits == kHitachiAc1Bits) {
+ if (!matchMark(results->rawbuf[offset++], kHitachiAc1HdrMark, kTolerance))
+ return false;
+ if (!matchSpace(results->rawbuf[offset++], kHitachiAc1HdrSpace, kTolerance))
+ return false;
+ } else { // Everything else.
+ if (!matchMark(results->rawbuf[offset++], kHitachiAcHdrMark, kTolerance))
+ return false;
+ if (!matchSpace(results->rawbuf[offset++], kHitachiAcHdrSpace, kTolerance))
+ return false;
+ }
+ // Data
+ // Keep reading bytes until we either run out of message or state to fill.
+ for (uint16_t i = 0; offset <= results->rawlen - 16 && i < nbits / 8;
+ i++, dataBitsSoFar += 8, offset += data_result.used) {
+ data_result = matchData(&(results->rawbuf[offset]), 8, kHitachiAcBitMark,
+ kHitachiAcOneSpace, kHitachiAcBitMark,
+ kHitachiAcZeroSpace, kTolerance);
+ if (data_result.success == false) break; // Fail
+ results->state[i] = (uint8_t)data_result.data;
+ }
+
+ // Footer
+ if (!matchMark(results->rawbuf[offset++], kHitachiAcBitMark, kTolerance))
+ return false;
+ if (offset <= results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset], kHitachiAcMinGap, kTolerance))
+ return false;
+
+ // Compliance
+ if (strict) {
+ // Re-check we got the correct size/length due to the way we read the data.
+ switch (dataBitsSoFar / 8) {
+ case kHitachiAcStateLength:
+ case kHitachiAc1StateLength:
+ case kHitachiAc2StateLength:
+ break; // Continue
+ default:
+ return false;
+ }
+ if (dataBitsSoFar / 8 == kHitachiAcStateLength &&
+ !IRHitachiAc::validChecksum(results->state, kHitachiAcStateLength))
+ return false;
+ }
+
+ // Success
+ switch (dataBitsSoFar) {
+ case kHitachiAc1Bits:
+ results->decode_type = HITACHI_AC1;
+ break;
+ case kHitachiAc2Bits:
+ results->decode_type = HITACHI_AC2;
+ break;
+ case kHitachiAcBits:
+ default:
+ results->decode_type = HITACHI_AC;
+ }
+ results->bits = dataBitsSoFar;
+ // No need to record the state as we stored it as we decoded it.
+ // As we use result->state, we don't record value, address, or command as it
+ // is a union data type.
+ return true;
+}
+#endif // (DECODE_HITACHI_AC || DECODE_HITACHI_AC1 || DECODE_HITACHI_AC2)
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Hitachi.h b/lib/IRremoteESP8266-2.5.2.03/src/ir_Hitachi.h
new file mode 100644
index 000000000000..eddab59e43c6
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Hitachi.h
@@ -0,0 +1,76 @@
+// Hitachi A/C
+//
+// Copyright 2018 David Conran
+
+#ifndef IR_HITACHI_H_
+#define IR_HITACHI_H_
+
+#define __STDC_LIMIT_MACROS
+#include
+#ifndef UNIT_TEST
+#include
+#else
+#include
+#endif
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+
+// Constants
+const uint8_t kHitachiAcAuto = 2;
+const uint8_t kHitachiAcHeat = 3;
+const uint8_t kHitachiAcCool = 4;
+const uint8_t kHitachiAcDry = 5;
+const uint8_t kHitachiAcFan = 0xC;
+const uint8_t kHitachiAcFanAuto = 1;
+const uint8_t kHitachiAcFanLow = 2;
+const uint8_t kHitachiAcFanHigh = 5;
+const uint8_t kHitachiAcMinTemp = 16; // 16C
+const uint8_t kHitachiAcMaxTemp = 32; // 32C
+const uint8_t kHitachiAcAutoTemp = 23; // 23C
+
+// Classes
+class IRHitachiAc {
+ public:
+ explicit IRHitachiAc(uint16_t pin);
+
+ void stateReset();
+#if SEND_HITACHI_AC
+ void send();
+#endif // SEND_HITACHI_AC
+ void begin();
+ void on();
+ void off();
+ void setPower(const bool on);
+ bool getPower();
+ void setTemp(const uint8_t temp);
+ uint8_t getTemp();
+ void setFan(const uint8_t speed);
+ uint8_t getFan();
+ void setMode(const uint8_t mode);
+ uint8_t getMode();
+ void setSwingVertical(const bool on);
+ bool getSwingVertical();
+ void setSwingHorizontal(const bool on);
+ bool getSwingHorizontal();
+ uint8_t* getRaw();
+ void setRaw(const uint8_t new_code[],
+ const uint16_t length = kHitachiAcStateLength);
+ static bool validChecksum(const uint8_t state[],
+ const uint16_t length = kHitachiAcStateLength);
+ static uint8_t calcChecksum(const uint8_t state[],
+ const uint16_t length = kHitachiAcStateLength);
+#ifdef ARDUINO
+ String toString();
+#else
+ std::string toString();
+#endif
+
+ private:
+ // The state of the IR remote in IR code form.
+ uint8_t remote_state[kHitachiAcStateLength];
+ void checksum(const uint16_t length = kHitachiAcStateLength);
+ IRsend _irsend;
+ uint8_t _previoustemp;
+};
+
+#endif // IR_HITACHI_H_
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_JVC.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_JVC.cpp
similarity index 57%
rename from lib/IRremoteESP8266-2.2.1.02/src/ir_JVC.cpp
rename to lib/IRremoteESP8266-2.5.2.03/src/ir_JVC.cpp
index 194e3925010f..47df29dc45f0 100644
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_JVC.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_JVC.cpp
@@ -19,31 +19,31 @@
// Constants
// Ref:
// http://www.sbprojects.com/knowledge/ir/jvc.php
-#define JVC_TICK 75U
-#define JVC_HDR_MARK_TICKS 112U
-#define JVC_HDR_MARK (JVC_HDR_MARK_TICKS * JVC_TICK)
-#define JVC_HDR_SPACE_TICKS 56U
-#define JVC_HDR_SPACE (JVC_HDR_SPACE_TICKS * JVC_TICK)
-#define JVC_BIT_MARK_TICKS 7U
-#define JVC_BIT_MARK (JVC_BIT_MARK_TICKS * JVC_TICK)
-#define JVC_ONE_SPACE_TICKS 23U
-#define JVC_ONE_SPACE (JVC_ONE_SPACE_TICKS * JVC_TICK)
-#define JVC_ZERO_SPACE_TICKS 7U
-#define JVC_ZERO_SPACE (JVC_ZERO_SPACE_TICKS * JVC_TICK)
-#define JVC_RPT_LENGTH_TICKS 800U
-#define JVC_RPT_LENGTH (JVC_RPT_LENGTH_TICKS * JVC_TICK)
-#define JVC_MIN_GAP_TICKS (JVC_RPT_LENGTH_TICKS - \
- (JVC_HDR_MARK_TICKS + JVC_HDR_SPACE_TICKS + \
- JVC_BITS * (JVC_BIT_MARK_TICKS + JVC_ONE_SPACE_TICKS) + \
- JVC_BIT_MARK_TICKS))
-#define JVC_MIN_GAP (JVC_MIN_GAP_TICKS * JVC_TICK)
+const uint16_t kJvcTick = 75;
+const uint16_t kJvcHdrMarkTicks = 112;
+const uint16_t kJvcHdrMark = kJvcHdrMarkTicks * kJvcTick;
+const uint16_t kJvcHdrSpaceTicks = 56;
+const uint16_t kJvcHdrSpace = kJvcHdrSpaceTicks * kJvcTick;
+const uint16_t kJvcBitMarkTicks = 7;
+const uint16_t kJvcBitMark = kJvcBitMarkTicks * kJvcTick;
+const uint16_t kJvcOneSpaceTicks = 23;
+const uint16_t kJvcOneSpace = kJvcOneSpaceTicks * kJvcTick;
+const uint16_t kJvcZeroSpaceTicks = 7;
+const uint16_t kJvcZeroSpace = kJvcZeroSpaceTicks * kJvcTick;
+const uint16_t kJvcRptLengthTicks = 800;
+const uint16_t kJvcRptLength = kJvcRptLengthTicks * kJvcTick;
+const uint16_t kJvcMinGapTicks =
+ kJvcRptLengthTicks -
+ (kJvcHdrMarkTicks + kJvcHdrSpaceTicks +
+ kJvcBits * (kJvcBitMarkTicks + kJvcOneSpaceTicks) + kJvcBitMarkTicks);
+const uint16_t kJvcMinGap = kJvcMinGapTicks * kJvcTick;
#if SEND_JVC
// Send a JVC message.
//
// Args:
// data: The contents of the command you want to send.
-// nbits: The bit size of the command being sent. (JVC_BITS)
+// nbits: The bit size of the command being sent. (kJvcBits)
// repeat: The number of times you want the command to be repeated.
//
// Status: STABLE.
@@ -57,18 +57,21 @@ void IRsend::sendJVC(uint64_t data, uint16_t nbits, uint16_t repeat) {
IRtimer usecs = IRtimer();
// Header
// Only sent for the first message.
- mark(JVC_HDR_MARK);
- space(JVC_HDR_SPACE);
+ mark(kJvcHdrMark);
+ space(kJvcHdrSpace);
// We always send the data & footer at least once, hence '<= repeat'.
for (uint16_t i = 0; i <= repeat; i++) {
- // Data
- sendData(JVC_BIT_MARK, JVC_ONE_SPACE, JVC_BIT_MARK, JVC_ZERO_SPACE,
- data, nbits, true);
- // Footer
- mark(JVC_BIT_MARK);
+ sendGeneric(0, 0, // No Header
+ kJvcBitMark, kJvcOneSpace, kJvcBitMark, kJvcZeroSpace,
+ kJvcBitMark, kJvcMinGap, data, nbits, 38, true,
+ 0, // Repeats are handles elsewhere.
+ 33);
// Wait till the end of the repeat time window before we send another code.
- space(std::max(JVC_MIN_GAP, JVC_RPT_LENGTH - usecs.elapsed()));
+ uint32_t elapsed = usecs.elapsed();
+ // Avoid potential unsigned integer underflow.
+ // e.g. when elapsed > kJvcRptLength.
+ if (elapsed < kJvcRptLength) space(kJvcRptLength - elapsed);
usecs.reset();
}
}
@@ -95,7 +98,7 @@ uint16_t IRsend::encodeJVC(uint8_t address, uint8_t command) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
-// nbits: Nr. of bits of data to expect. Typically JVC_BITS.
+// nbits: Nr. of bits of data to expect. Typically kJvcBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
// boolean: True if it can decode it, false if it can't.
@@ -106,50 +109,48 @@ uint16_t IRsend::encodeJVC(uint8_t address, uint8_t command) {
// JVC repeat codes don't have a header.
// Ref:
// http://www.sbprojects.com/knowledge/ir/jvc.php
-bool IRrecv::decodeJVC(decode_results *results, uint16_t nbits, bool strict) {
- if (strict && nbits != JVC_BITS)
+bool IRrecv::decodeJVC(decode_results *results, uint16_t nbits, bool strict) {
+ if (strict && nbits != kJvcBits)
return false; // Must be called with the correct nr. of bits.
- if (results->rawlen < 2 * nbits + FOOTER - 1)
+ if (results->rawlen < 2 * nbits + kFooter - 1)
return false; // Can't possibly be a valid JVC message.
uint64_t data = 0;
- uint16_t offset = OFFSET_START;
+ uint16_t offset = kStartOffset;
bool isRepeat = true;
uint32_t m_tick;
uint32_t s_tick;
// Header
// (Optional as repeat codes don't have the header)
- if (matchMark(results->rawbuf[offset], JVC_HDR_MARK)) {
+ if (matchMark(results->rawbuf[offset], kJvcHdrMark)) {
isRepeat = false;
- m_tick = results->rawbuf[offset++] * RAWTICK / JVC_HDR_MARK_TICKS;
+ m_tick = results->rawbuf[offset++] * kRawTick / kJvcHdrMarkTicks;
if (results->rawlen < 2 * nbits + 4)
return false; // Can't possibly be a valid JVC message with a header.
- if (!matchSpace(results->rawbuf[offset], JVC_HDR_SPACE))
- return false;
- s_tick = results->rawbuf[offset++] * RAWTICK / JVC_HDR_SPACE_TICKS;
+ if (!matchSpace(results->rawbuf[offset], kJvcHdrSpace)) return false;
+ s_tick = results->rawbuf[offset++] * kRawTick / kJvcHdrSpaceTicks;
} else {
// We can't easily auto-calibrate as there is no header, so assume
// the default tick time.
- m_tick = JVC_TICK;
- s_tick = JVC_TICK;
+ m_tick = kJvcTick;
+ s_tick = kJvcTick;
}
// Data
- match_result_t data_result = matchData(&(results->rawbuf[offset]), nbits,
- JVC_BIT_MARK_TICKS * m_tick,
- JVC_ONE_SPACE_TICKS * s_tick,
- JVC_BIT_MARK_TICKS * m_tick,
- JVC_ZERO_SPACE_TICKS * s_tick);
+ match_result_t data_result =
+ matchData(&(results->rawbuf[offset]), nbits, kJvcBitMarkTicks * m_tick,
+ kJvcOneSpaceTicks * s_tick, kJvcBitMarkTicks * m_tick,
+ kJvcZeroSpaceTicks * s_tick);
if (data_result.success == false) return false;
data = data_result.data;
offset += data_result.used;
// Footer
- if (!matchMark(results->rawbuf[offset++], JVC_BIT_MARK_TICKS * m_tick))
+ if (!matchMark(results->rawbuf[offset++], kJvcBitMarkTicks * m_tick))
return false;
if (offset < results->rawlen &&
- !matchAtLeast(results->rawbuf[offset], JVC_MIN_GAP_TICKS * s_tick))
+ !matchAtLeast(results->rawbuf[offset], kJvcMinGapTicks * s_tick))
return false;
// Success
@@ -157,7 +158,7 @@ bool IRrecv::decodeJVC(decode_results *results, uint16_t nbits, bool strict) {
results->bits = nbits;
results->value = data;
// command & address are transmitted LSB first, so we need to reverse them.
- results->address = reverseBits(data >> 8, 8); // The first 8 bits sent.
+ results->address = reverseBits(data >> 8, 8); // The first 8 bits sent.
results->command = reverseBits(data & 0xFF, 8); // The last 8 bits sent.
results->repeat = isRepeat;
return true;
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Kelvinator.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Kelvinator.cpp
new file mode 100644
index 000000000000..ddf61b097aba
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Kelvinator.cpp
@@ -0,0 +1,550 @@
+// Copyright 2016 David Conran
+//
+// Code to emulate IR Kelvinator YALIF remote control unit, which should control
+// at least the following Kelvinator A/C units:
+// KSV26CRC, KSV26HRC, KSV35CRC, KSV35HRC, KSV53HRC, KSV62HRC, KSV70CRC,
+// KSV70HRC, KSV80HRC.
+//
+// Note:
+// * Unsupported:
+// - All Sleep modes.
+// - All Timer modes.
+// - "I Feel" button & mode.
+// - Energy Saving mode.
+// - Low Heat mode.
+// - Fahrenheit.
+
+#include "ir_Kelvinator.h"
+#include
+#ifndef ARDUINO
+#include
+#endif
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRutils.h"
+
+// KK KK EEEEEEE LL VV VV IIIII NN NN AAA TTTTTTT OOOOO RRRRRR
+// KK KK EE LL VV VV III NNN NN AAAAA TTT OO OO RR RR
+// KKKK EEEEE LL VV VV III NN N NN AA AA TTT OO OO RRRRRR
+// KK KK EE LL VV VV III NN NNN AAAAAAA TTT OO OO RR RR
+// KK KK EEEEEEE LLLLLLL VVV IIIII NN NN AA AA TTT OOOO0 RR RR
+
+// Constants
+
+const uint16_t kKelvinatorTick = 85;
+const uint16_t kKelvinatorHdrMarkTicks = 106;
+const uint16_t kKelvinatorHdrMark = kKelvinatorHdrMarkTicks * kKelvinatorTick;
+const uint16_t kKelvinatorHdrSpaceTicks = 53;
+const uint16_t kKelvinatorHdrSpace = kKelvinatorHdrSpaceTicks * kKelvinatorTick;
+const uint16_t kKelvinatorBitMarkTicks = 8;
+const uint16_t kKelvinatorBitMark = kKelvinatorBitMarkTicks * kKelvinatorTick;
+const uint16_t kKelvinatorOneSpaceTicks = 18;
+const uint16_t kKelvinatorOneSpace = kKelvinatorOneSpaceTicks * kKelvinatorTick;
+const uint16_t kKelvinatorZeroSpaceTicks = 6;
+const uint16_t kKelvinatorZeroSpace =
+ kKelvinatorZeroSpaceTicks * kKelvinatorTick;
+const uint16_t kKelvinatorGapSpaceTicks = 235;
+const uint16_t kKelvinatorGapSpace = kKelvinatorGapSpaceTicks * kKelvinatorTick;
+
+const uint8_t kKelvinatorCmdFooter = 2;
+const uint8_t kKelvinatorCmdFooterBits = 3;
+
+const uint8_t kKelvinatorPower = 8;
+const uint8_t kKelvinatorModeMask = 0xF8;
+const uint8_t kKelvinatorFanOffset = 4;
+const uint8_t kKelvinatorBasicFanMask = 0xFF ^ (3U << kKelvinatorFanOffset);
+const uint8_t kKelvinatorFanMask = 0xFF ^ (7U << kKelvinatorFanOffset);
+const uint8_t kKelvinatorChecksumStart = 10;
+const uint8_t kKelvinatorVentSwingOffset = 6;
+const uint8_t kKelvinatorVentSwing = 1 << kKelvinatorVentSwingOffset;
+const uint8_t kKelvinatorVentSwingV = 1;
+const uint8_t kKelvinatorVentSwingH = 1 << 4;
+const uint8_t kKelvinatorSleep1And3 = 1 << 7;
+const uint8_t kKelvinatorQuietOffset = 7;
+const uint8_t kKelvinatorQuiet = 1 << kKelvinatorQuietOffset;
+const uint8_t kKelvinatorIonFilterOffset = 6;
+const uint8_t kKelvinatorIonFilter = 1 << kKelvinatorIonFilterOffset;
+const uint8_t kKelvinatorLightOffset = 5;
+const uint8_t kKelvinatorLight = 1 << kKelvinatorLightOffset;
+const uint8_t kKelvinatorXfanOffset = 7;
+const uint8_t kKelvinatorXfan = 1 << kKelvinatorXfanOffset;
+const uint8_t kKelvinatorTurboOffset = 4;
+const uint8_t kKelvinatorTurbo = 1 << kKelvinatorTurboOffset;
+
+#if SEND_KELVINATOR
+// Send a Kelvinator A/C message.
+//
+// Args:
+// data: An array of bytes containing the IR command.
+// nbytes: Nr. of bytes of data in the array. (>=kKelvinatorStateLength)
+// repeat: Nr. of times the message is to be repeated. (Default = 0).
+//
+// Status: STABLE / Known working.
+//
+void IRsend::sendKelvinator(unsigned char data[], uint16_t nbytes,
+ uint16_t repeat) {
+ if (nbytes < kKelvinatorStateLength)
+ return; // Not enough bytes to send a proper message.
+
+ for (uint16_t r = 0; r <= repeat; r++) {
+ // Command Block #1 (4 bytes)
+ sendGeneric(kKelvinatorHdrMark, kKelvinatorHdrSpace, kKelvinatorBitMark,
+ kKelvinatorOneSpace, kKelvinatorBitMark, kKelvinatorZeroSpace,
+ 0, 0, // No Footer yet.
+ data, 4, 38, false, 0, 50);
+ // Send Footer for the command block (3 bits (b010))
+ sendGeneric(0, 0, // No Header
+ kKelvinatorBitMark, kKelvinatorOneSpace, kKelvinatorBitMark,
+ kKelvinatorZeroSpace, kKelvinatorBitMark, kKelvinatorGapSpace,
+ kKelvinatorCmdFooter, kKelvinatorCmdFooterBits, 38, false, 0,
+ 50);
+ // Data Block #1 (4 bytes)
+ sendGeneric(0, 0, // No header
+ kKelvinatorBitMark, kKelvinatorOneSpace, kKelvinatorBitMark,
+ kKelvinatorZeroSpace, kKelvinatorBitMark,
+ kKelvinatorGapSpace * 2, data + 4, 4, 38, false, 0, 50);
+ // Command Block #2 (4 bytes)
+ sendGeneric(kKelvinatorHdrMark, kKelvinatorHdrSpace, kKelvinatorBitMark,
+ kKelvinatorOneSpace, kKelvinatorBitMark, kKelvinatorZeroSpace,
+ 0, 0, // No Footer yet.
+ data + 8, 4, 38, false, 0, 50);
+ // Send Footer for the command block (3 bits (B010))
+ sendGeneric(0, 0, // No Header
+ kKelvinatorBitMark, kKelvinatorOneSpace, kKelvinatorBitMark,
+ kKelvinatorZeroSpace, kKelvinatorBitMark, kKelvinatorGapSpace,
+ kKelvinatorCmdFooter, kKelvinatorCmdFooterBits, 38, false, 0,
+ 50);
+ // Data Block #2 (4 bytes)
+ sendGeneric(0, 0, // No header
+ kKelvinatorBitMark, kKelvinatorOneSpace, kKelvinatorBitMark,
+ kKelvinatorZeroSpace, kKelvinatorBitMark,
+ kKelvinatorGapSpace * 2, data + 12, 4, 38, false, 0, 50);
+ }
+}
+#endif // SEND_KELVINATOR
+
+IRKelvinatorAC::IRKelvinatorAC(uint16_t pin) : _irsend(pin) { stateReset(); }
+
+void IRKelvinatorAC::stateReset() {
+ for (uint8_t i = 0; i < kKelvinatorStateLength; i++) remote_state[i] = 0x0;
+ remote_state[3] = 0x50;
+ remote_state[11] = 0x70;
+}
+
+void IRKelvinatorAC::begin() { _irsend.begin(); }
+
+void IRKelvinatorAC::fixup() {
+ // X-Fan mode is only valid in COOL or DRY modes.
+ if (getMode() != kKelvinatorCool && getMode() != kKelvinatorDry)
+ setXFan(false);
+ checksum(); // Calculate the checksums
+}
+
+#if SEND_KELVINATOR
+void IRKelvinatorAC::send() {
+ fixup(); // Ensure correct settings before sending.
+ _irsend.sendKelvinator(remote_state);
+}
+#endif // SEND_KELVINATOR
+
+uint8_t *IRKelvinatorAC::getRaw() {
+ fixup(); // Ensure correct settings before sending.
+ return remote_state;
+}
+
+void IRKelvinatorAC::setRaw(uint8_t new_code[]) {
+ for (uint8_t i = 0; i < kKelvinatorStateLength; i++) {
+ remote_state[i] = new_code[i];
+ }
+}
+
+uint8_t IRKelvinatorAC::calcBlockChecksum(const uint8_t *block,
+ const uint16_t length) {
+ uint8_t sum = kKelvinatorChecksumStart;
+ // Sum the lower half of the first 4 bytes of this block.
+ for (uint8_t i = 0; i < 4 && i < length - 1; i++, block++)
+ sum += (*block & 0x0FU);
+ // then sum the upper half of the next 3 bytes.
+ for (uint8_t i = 4; i < length - 1; i++, block++) sum += (*block >> 4);
+ // Trim it down to fit into the 4 bits allowed. i.e. Mod 16.
+ return sum & 0x0FU;
+}
+
+// Many Bothans died to bring us this information.
+void IRKelvinatorAC::checksum(const uint16_t length) {
+ // For each command + options block.
+ for (uint16_t offset = 0; offset + 7 < length; offset += 8) {
+ uint8_t sum = calcBlockChecksum(remote_state + offset);
+ remote_state[7 + offset] = (sum << 4) | (remote_state[7 + offset] & 0xFU);
+ }
+}
+
+// Verify the checksum is valid for a given state.
+// Args:
+// state: The array to verify the checksum of.
+// length: The size of the state.
+// Returns:
+// A boolean.
+bool IRKelvinatorAC::validChecksum(const uint8_t state[],
+ const uint16_t length) {
+ for (uint16_t offset = 0; offset + 7 < length; offset += 8) {
+ // Top 4 bits of the last byte in the block is the block's checksum.
+ if (state[offset + 7] >> 4 != calcBlockChecksum(state + offset))
+ return false;
+ }
+ return true;
+}
+
+void IRKelvinatorAC::on() {
+ remote_state[0] |= kKelvinatorPower;
+ remote_state[8] = remote_state[0]; // Duplicate to the 2nd command chunk.
+}
+
+void IRKelvinatorAC::off() {
+ remote_state[0] &= ~kKelvinatorPower;
+ remote_state[8] = remote_state[0]; // Duplicate to the 2nd command chunk.
+}
+
+void IRKelvinatorAC::setPower(bool state) {
+ if (state)
+ on();
+ else
+ off();
+}
+
+bool IRKelvinatorAC::getPower() {
+ return ((remote_state[0] & kKelvinatorPower) != 0);
+}
+
+// Set the temp. in deg C
+void IRKelvinatorAC::setTemp(uint8_t temp) {
+ temp = std::max(kKelvinatorMinTemp, temp);
+ temp = std::min(kKelvinatorMaxTemp, temp);
+ remote_state[1] = (remote_state[1] & 0xF0U) | (temp - kKelvinatorMinTemp);
+ remote_state[9] = remote_state[1]; // Duplicate to the 2nd command chunk.
+}
+
+// Return the set temp. in deg C
+uint8_t IRKelvinatorAC::getTemp() {
+ return ((remote_state[1] & 0xFU) + kKelvinatorMinTemp);
+}
+
+// Set the speed of the fan, 0-5, 0 is auto, 1-5 is the speed
+void IRKelvinatorAC::setFan(uint8_t fan) {
+ fan = std::min(kKelvinatorFanMax, fan); // Bounds check
+
+ // Only change things if we need to.
+ if (fan != getFan()) {
+ // Set the basic fan values.
+ uint8_t fan_basic = std::min(kKelvinatorBasicFanMax, fan);
+ remote_state[0] = (remote_state[0] & kKelvinatorBasicFanMask) |
+ (fan_basic << kKelvinatorFanOffset);
+ remote_state[8] = remote_state[0]; // Duplicate to the 2nd command chunk.
+ // Set the advanced(?) fan value.
+ remote_state[14] =
+ (remote_state[14] & kKelvinatorFanMask) | (fan << kKelvinatorFanOffset);
+ setTurbo(false); // Turbo mode is turned off if we change the fan settings.
+ }
+}
+
+uint8_t IRKelvinatorAC::getFan() {
+ return ((remote_state[14] & ~kKelvinatorFanMask) >> kKelvinatorFanOffset);
+}
+
+uint8_t IRKelvinatorAC::getMode() {
+ return (remote_state[0] & ~kKelvinatorModeMask);
+}
+
+void IRKelvinatorAC::setMode(uint8_t mode) {
+ // If we get an unexpected mode, default to AUTO.
+ if (mode > kKelvinatorHeat) mode = kKelvinatorAuto;
+ remote_state[0] = (remote_state[0] & kKelvinatorModeMask) | mode;
+ remote_state[8] = remote_state[0]; // Duplicate to the 2nd command chunk.
+ if (mode == kKelvinatorAuto || kKelvinatorDry)
+ // When the remote is set to Auto or Dry, it defaults to 25C and doesn't
+ // show it.
+ setTemp(kKelvinatorAutoTemp);
+}
+
+void IRKelvinatorAC::setSwingVertical(bool state) {
+ if (state) {
+ remote_state[0] |= kKelvinatorVentSwing;
+ remote_state[4] |= kKelvinatorVentSwingV;
+ } else {
+ remote_state[4] &= ~kKelvinatorVentSwingV;
+ if (!getSwingHorizontal()) remote_state[0] &= ~kKelvinatorVentSwing;
+ }
+ remote_state[8] = remote_state[0]; // Duplicate to the 2nd command chunk.
+}
+
+bool IRKelvinatorAC::getSwingVertical() {
+ return ((remote_state[4] & kKelvinatorVentSwingV) != 0);
+}
+
+void IRKelvinatorAC::setSwingHorizontal(bool state) {
+ if (state) {
+ remote_state[0] |= kKelvinatorVentSwing;
+ remote_state[4] |= kKelvinatorVentSwingH;
+ } else {
+ remote_state[4] &= ~kKelvinatorVentSwingH;
+ if (!getSwingVertical()) remote_state[0] &= ~kKelvinatorVentSwing;
+ }
+ remote_state[8] = remote_state[0]; // Duplicate to the 2nd command chunk.
+}
+
+bool IRKelvinatorAC::getSwingHorizontal() {
+ return ((remote_state[4] & kKelvinatorVentSwingH) != 0);
+}
+
+void IRKelvinatorAC::setQuiet(bool state) {
+ remote_state[12] &= ~kKelvinatorQuiet;
+ remote_state[12] |= (state << kKelvinatorQuietOffset);
+}
+
+bool IRKelvinatorAC::getQuiet() {
+ return ((remote_state[12] & kKelvinatorQuiet) != 0);
+}
+
+void IRKelvinatorAC::setIonFilter(bool state) {
+ remote_state[2] &= ~kKelvinatorIonFilter;
+ remote_state[2] |= (state << kKelvinatorIonFilterOffset);
+ remote_state[10] = remote_state[2]; // Duplicate to the 2nd command chunk.
+}
+
+bool IRKelvinatorAC::getIonFilter() {
+ return ((remote_state[2] & kKelvinatorIonFilter) != 0);
+}
+
+void IRKelvinatorAC::setLight(bool state) {
+ remote_state[2] &= ~kKelvinatorLight;
+ remote_state[2] |= (state << kKelvinatorLightOffset);
+ remote_state[10] = remote_state[2]; // Duplicate to the 2nd command chunk.
+}
+
+bool IRKelvinatorAC::getLight() {
+ return ((remote_state[2] & kKelvinatorLight) != 0);
+}
+
+// Note: XFan mode is only valid in Cool or Dry mode.
+void IRKelvinatorAC::setXFan(bool state) {
+ remote_state[2] &= ~kKelvinatorXfan;
+ remote_state[2] |= (state << kKelvinatorXfanOffset);
+ remote_state[10] = remote_state[2]; // Duplicate to the 2nd command chunk.
+}
+
+bool IRKelvinatorAC::getXFan() {
+ return ((remote_state[2] & kKelvinatorXfan) != 0);
+}
+
+// Note: Turbo mode is turned off if the fan speed is changed.
+void IRKelvinatorAC::setTurbo(bool state) {
+ remote_state[2] &= ~kKelvinatorTurbo;
+ remote_state[2] |= (state << kKelvinatorTurboOffset);
+ remote_state[10] = remote_state[2]; // Duplicate to the 2nd command chunk.
+}
+
+bool IRKelvinatorAC::getTurbo() {
+ return ((remote_state[2] & kKelvinatorTurbo) != 0);
+}
+
+// Convert the internal state into a human readable string.
+#ifdef ARDUINO
+String IRKelvinatorAC::toString() {
+ String result = "";
+#else
+std::string IRKelvinatorAC::toString() {
+ std::string result = "";
+#endif // ARDUINO
+ result += "Power: ";
+ if (getPower())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Mode: " + uint64ToString(getMode());
+ switch (getMode()) {
+ case kKelvinatorAuto:
+ result += " (AUTO)";
+ break;
+ case kKelvinatorCool:
+ result += " (COOL)";
+ break;
+ case kKelvinatorHeat:
+ result += " (HEAT)";
+ break;
+ case kKelvinatorDry:
+ result += " (DRY)";
+ break;
+ case kKelvinatorFan:
+ result += " (FAN)";
+ break;
+ default:
+ result += " (UNKNOWN)";
+ }
+ result += ", Temp: " + uint64ToString(getTemp()) + "C";
+ result += ", Fan: " + uint64ToString(getFan());
+ switch (getFan()) {
+ case kKelvinatorFanAuto:
+ result += " (AUTO)";
+ break;
+ case kKelvinatorFanMax:
+ result += " (MAX)";
+ break;
+ }
+ result += ", Turbo: ";
+ if (getTurbo())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Quiet: ";
+ if (getQuiet())
+ result += "On";
+ else
+ result += "Off";
+ result += ", XFan: ";
+ if (getXFan())
+ result += "On";
+ else
+ result += "Off";
+ result += ", IonFilter: ";
+ if (getIonFilter())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Light: ";
+ if (getLight())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Swing (Horizontal): ";
+ if (getSwingHorizontal())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Swing (Vertical): ";
+ if (getSwingVertical())
+ result += "On";
+ else
+ result += "Off";
+ return result;
+}
+
+#if DECODE_KELVINATOR
+// Decode the supplied Kelvinator message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: The number of data bits to expect. Typically kKelvinatorBits.
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: ALPHA / Untested.
+bool IRrecv::decodeKelvinator(decode_results *results, uint16_t nbits,
+ bool strict) {
+ if (results->rawlen <
+ 2 * (nbits + kKelvinatorCmdFooterBits) + (kHeader + kFooter + 1) * 2 - 1)
+ return false; // Can't possibly be a valid Kelvinator message.
+ if (strict && nbits != kKelvinatorBits)
+ return false; // Not strictly a Kelvinator message.
+
+ uint32_t data;
+ uint16_t offset = kStartOffset;
+
+ // There are two messages back-to-back in a full Kelvinator IR message
+ // sequence.
+ int8_t state_pos = 0;
+ for (uint8_t s = 0; s < 2; s++) {
+ match_result_t data_result;
+
+ // Header
+ if (!matchMark(results->rawbuf[offset], kKelvinatorHdrMark)) return false;
+ // Calculate how long the lowest tick time is based on the header mark.
+ uint32_t mark_tick =
+ results->rawbuf[offset++] * kRawTick / kKelvinatorHdrMarkTicks;
+ if (!matchSpace(results->rawbuf[offset], kKelvinatorHdrSpace)) return false;
+ // Calculate how long the common tick time is based on the header space.
+ uint32_t space_tick =
+ results->rawbuf[offset++] * kRawTick / kKelvinatorHdrSpaceTicks;
+
+ // Data (Command) (32 bits)
+ data_result = matchData(
+ &(results->rawbuf[offset]), 32, kKelvinatorBitMarkTicks * mark_tick,
+ kKelvinatorOneSpaceTicks * space_tick,
+ kKelvinatorBitMarkTicks * mark_tick,
+ kKelvinatorZeroSpaceTicks * space_tick, kTolerance, kMarkExcess, false);
+ if (data_result.success == false) return false;
+ data = data_result.data;
+ offset += data_result.used;
+
+ // Record command data in the state.
+ for (uint16_t i = 0; i < 4; i++, data >>= 8)
+ results->state[state_pos + i] = data & 0xFF;
+ state_pos += 4;
+
+ // Command data footer (3 bits, B010)
+ data_result = matchData(
+ &(results->rawbuf[offset]), kKelvinatorCmdFooterBits,
+ kKelvinatorBitMarkTicks * mark_tick,
+ kKelvinatorOneSpaceTicks * space_tick,
+ kKelvinatorBitMarkTicks * mark_tick,
+ kKelvinatorZeroSpaceTicks * space_tick, kTolerance, kMarkExcess, false);
+ if (data_result.success == false) return false;
+ if (data_result.data != kKelvinatorCmdFooter) return false;
+ offset += data_result.used;
+
+ // Interdata gap.
+ if (!matchMark(results->rawbuf[offset++],
+ kKelvinatorBitMarkTicks * mark_tick))
+ return false;
+ if (!matchSpace(results->rawbuf[offset++],
+ kKelvinatorGapSpaceTicks * space_tick))
+ return false;
+
+ // Data (Options) (32 bits)
+ data_result = matchData(
+ &(results->rawbuf[offset]), 32, kKelvinatorBitMarkTicks * mark_tick,
+ kKelvinatorOneSpaceTicks * space_tick,
+ kKelvinatorBitMarkTicks * mark_tick,
+ kKelvinatorZeroSpaceTicks * space_tick, kTolerance, kMarkExcess, false);
+ if (data_result.success == false) return false;
+ data = data_result.data;
+ offset += data_result.used;
+
+ // Record option data in the state.
+ for (uint16_t i = 0; i < 4; i++, data >>= 8)
+ results->state[state_pos + i] = data & 0xFF;
+ state_pos += 4;
+
+ // Inter-sequence gap. (Double length gap)
+ if (!matchMark(results->rawbuf[offset++],
+ kKelvinatorBitMarkTicks * mark_tick))
+ return false;
+ if (s == 0) {
+ if (!matchSpace(results->rawbuf[offset++],
+ kKelvinatorGapSpaceTicks * space_tick * 2))
+ return false;
+ } else {
+ if (offset <= results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset],
+ kKelvinatorGapSpaceTicks * 2 * space_tick))
+ return false;
+ }
+ }
+
+ // Compliance
+ if (strict) {
+ // Correct size/length)
+ if (state_pos != kKelvinatorStateLength) return false;
+ // Verify the message's checksum is correct.
+ if (!IRKelvinatorAC::validChecksum(results->state)) return false;
+ }
+
+ // Success
+ results->decode_type = KELVINATOR;
+ results->bits = state_pos * 8;
+ // No need to record the state as we stored it as we decoded it.
+ // As we use result->state, we don't record value, address, or command as it
+ // is a union data type.
+ return true;
+}
+#endif // DECODE_KELVINATOR
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Kelvinator.h b/lib/IRremoteESP8266-2.5.2.03/src/ir_Kelvinator.h
similarity index 71%
rename from lib/IRremoteESP8266-2.2.1.02/src/ir_Kelvinator.h
rename to lib/IRremoteESP8266-2.5.2.03/src/ir_Kelvinator.h
index c15d85c6e45e..1508d6cdc8f2 100644
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Kelvinator.h
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Kelvinator.h
@@ -7,6 +7,11 @@
#define __STDC_LIMIT_MACROS
#include
+#ifndef UNIT_TEST
+#include
+#else
+#include
+#endif
#include "IRremoteESP8266.h"
#include "IRsend.h"
@@ -17,19 +22,33 @@
// KK KK EEEEEEE LLLLLLL VVV IIIII NN NN AA AA TTT OOOO0 RR RR
// Constants
-#define KELVINATOR_AUTO 0U
-#define KELVINATOR_COOL 1U
-#define KELVINATOR_DRY 2U
-#define KELVINATOR_FAN 3U
-#define KELVINATOR_HEAT 4U
-#define KELVINATOR_BASIC_FAN_MAX 3U
-#define KELVINATOR_FAN_MAX 5U
-#define KELVINATOR_MIN_TEMP 16U // 16C
-#define KELVINATOR_MAX_TEMP 30U // 30C
-#define KELVINATOR_AUTO_TEMP 25U // 25C
+const uint8_t kKelvinatorAuto = 0;
+const uint8_t kKelvinatorCool = 1;
+const uint8_t kKelvinatorDry = 2;
+const uint8_t kKelvinatorFan = 3;
+const uint8_t kKelvinatorHeat = 4;
+const uint8_t kKelvinatorBasicFanMax = 3;
+const uint8_t kKelvinatorFanAuto = 0;
+const uint8_t kKelvinatorFanMax = 5;
+const uint8_t kKelvinatorMinTemp = 16; // 16C
+const uint8_t kKelvinatorMaxTemp = 30; // 30C
+const uint8_t kKelvinatorAutoTemp = 25; // 25C
+
+// Legacy defines (Deprecated)
+#define KELVINATOR_MIN_TEMP kKelvinatorMinTemp
+#define KELVINATOR_MAX_TEMP kKelvinatorMaxTemp
+#define KELVINATOR_HEAT kKelvinatorHeat
+#define KELVINATOR_FAN_MAX kKelvinatorFanMax
+#define KELVINATOR_FAN_AUTO kKelvinatorFanAuto
+#define KELVINATOR_FAN kKelvinatorFan
+#define KELVINATOR_DRY kKelvinatorDry
+#define KELVINATOR_COOL kKelvinatorCool
+#define KELVINATOR_BASIC_FAN_MAX kKelvinatorBasicFanMax
+#define KELVINATOR_AUTO_TEMP kKelvinatorAutoTemp
+#define KELVINATOR_AUTO kKelvinatorAuto
/*
- Kelvinator AC map
+ Kelvinator AC map
(header mark and space)
byte 0 = Basic Modes
@@ -104,15 +123,15 @@
b7-4 = checksum of the previous bytes (8-14)
*/
-#if SEND_KELVINATOR
-
// Classes
class IRKelvinatorAC {
public:
explicit IRKelvinatorAC(uint16_t pin);
void stateReset();
+#if SEND_KELVINATOR
void send();
+#endif // SEND_KELVINATOR
void begin();
void on();
void off();
@@ -139,14 +158,23 @@ class IRKelvinatorAC {
void setTurbo(bool state);
bool getTurbo();
uint8_t* getRaw();
+ void setRaw(uint8_t new_code[]);
+ static uint8_t calcBlockChecksum(
+ const uint8_t* block, const uint16_t length = kKelvinatorStateLength / 2);
+ static bool validChecksum(const uint8_t state[],
+ const uint16_t length = kKelvinatorStateLength);
+#ifdef ARDUINO
+ String toString();
+#else
+ std::string toString();
+#endif
private:
// The state of the IR remote in IR code form.
- uint8_t remote_state[KELVINATOR_STATE_LENGTH];
- void checksum();
+ uint8_t remote_state[kKelvinatorStateLength];
+ void checksum(const uint16_t length = kKelvinatorStateLength);
void fixup();
IRsend _irsend;
};
-#endif
#endif // IR_KELVINATOR_H_
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_LG.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_LG.cpp
new file mode 100644
index 000000000000..f9d922fc740e
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_LG.cpp
@@ -0,0 +1,290 @@
+// Copyright 2015 Darryl Smith
+// Copyright 2015 cheaplin
+// Copyright 2017, 2018 David Conran
+
+#include "ir_LG.h"
+#include
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRutils.h"
+
+// L GGGG
+// L G
+// L G GG
+// L G G
+// LLLLL GGG
+
+// LG decode originally added by Darryl Smith (based on the JVC protocol)
+// LG send originally added by https://github.com/chaeplin
+//
+// Known supported devices:
+// IR Remotes:
+// 6711A20083V
+// AKB74395308
+
+// Constants
+const uint16_t kLgTick = 50;
+const uint16_t kLgHdrMarkTicks = 170;
+const uint16_t kLgHdrMark = kLgHdrMarkTicks * kLgTick; // 8500
+const uint16_t kLgHdrSpaceTicks = 85;
+const uint16_t kLgHdrSpace = kLgHdrSpaceTicks * kLgTick; // 4250
+const uint16_t kLgBitMarkTicks = 11;
+const uint16_t kLgBitMark = kLgBitMarkTicks * kLgTick; // 550
+const uint16_t kLgOneSpaceTicks = 32;
+const uint16_t kLgOneSpace = kLgOneSpaceTicks * kLgTick; // 1600
+const uint16_t kLgZeroSpaceTicks = 11;
+const uint16_t kLgZeroSpace = kLgZeroSpaceTicks * kLgTick; // 550
+const uint16_t kLgRptSpaceTicks = 45;
+const uint16_t kLgRptSpace = kLgRptSpaceTicks * kLgTick; // 2250
+const uint16_t kLgMinGapTicks = 795;
+const uint16_t kLgMinGap = kLgMinGapTicks * kLgTick; // 39750
+const uint16_t kLgMinMessageLengthTicks = 2161;
+const uint32_t kLgMinMessageLength = kLgMinMessageLengthTicks * kLgTick;
+
+const uint16_t kLg32HdrMarkTicks = 90;
+const uint16_t kLg32HdrMark = kLg32HdrMarkTicks * kLgTick; // 4500
+const uint16_t kLg32HdrSpaceTicks = 89;
+const uint16_t kLg32HdrSpace = kLg32HdrSpaceTicks * kLgTick; // 4450
+const uint16_t kLg32RptHdrMarkTicks = 179;
+const uint16_t kLg32RptHdrMark = kLg32RptHdrMarkTicks * kLgTick; // 8950
+
+const uint16_t kLg2HdrMarkTicks = 64;
+const uint16_t kLg2HdrMark = kLg2HdrMarkTicks * kLgTick; // 3200
+const uint16_t kLg2HdrSpaceTicks = 197;
+const uint16_t kLg2HdrSpace = kLg2HdrSpaceTicks * kLgTick; // 9850
+const uint16_t kLg2BitMarkTicks = 10;
+const uint16_t kLg2BitMark = kLg2BitMarkTicks * kLgTick; // 500
+
+#if (SEND_LG || DECODE_LG)
+// Calculate the rolling 4-bit wide checksum over all of the data.
+// Args:
+// data: The value to be checksum'ed.
+// Returns:
+// A 4-bit checksum.
+uint8_t calcLGChecksum(uint16_t data) {
+ return (((data >> 12) + ((data >> 8) & 0xF) + ((data >> 4) & 0xF) +
+ (data & 0xF)) &
+ 0xF);
+}
+#endif
+
+#if SEND_LG
+// Send an LG formatted message.
+//
+// Args:
+// data: The contents of the message you want to send.
+// nbits: The bit size of the message being sent.
+// Typically kLgBits or kLg32Bits.
+// repeat: The number of times you want the message to be repeated.
+//
+// Status: Beta / Should be working.
+//
+// Notes:
+// LG has a separate message to indicate a repeat, like NEC does.
+// Supports:
+// IR Remote models: 6711A20083V
+void IRsend::sendLG(uint64_t data, uint16_t nbits, uint16_t repeat) {
+ uint16_t repeatHeaderMark = 0;
+
+ if (nbits >= kLg32Bits) {
+ // LG 32bit protocol is near identical to Samsung except for repeats.
+ sendSAMSUNG(data, nbits, 0); // Send it as a single Samsung message.
+ repeatHeaderMark = kLg32RptHdrMark;
+ repeat++;
+ } else {
+ // LG (28-bit) protocol.
+ repeatHeaderMark = kLgHdrMark;
+ sendGeneric(kLgHdrMark, kLgHdrSpace, kLgBitMark, kLgOneSpace, kLgBitMark,
+ kLgZeroSpace, kLgBitMark, kLgMinGap, kLgMinMessageLength, data,
+ nbits, 38, true, 0, // Repeats are handled later.
+ 50);
+ }
+
+ // Repeat
+ // Protocol has a mandatory repeat-specific code sent after every command.
+ if (repeat)
+ sendGeneric(repeatHeaderMark, kLgRptSpace, 0, 0, 0, 0, // No data is sent.
+ kLgBitMark, kLgMinGap, kLgMinMessageLength, 0, 0, // No data.
+ 38, true, repeat - 1, 50);
+}
+
+// Send an LG Variant-2 formatted message.
+//
+// Args:
+// data: The contents of the message you want to send.
+// nbits: The bit size of the message being sent.
+// Typically kLgBits or kLg32Bits.
+// repeat: The number of times you want the message to be repeated.
+//
+// Status: Beta / Should be working.
+//
+// Notes:
+// LG has a separate message to indicate a repeat, like NEC does.
+// Supports:
+// IR Remote models: AKB74395308
+void IRsend::sendLG2(uint64_t data, uint16_t nbits, uint16_t repeat) {
+ if (nbits >= kLg32Bits) {
+ // Let the original routine handle it.
+ sendLG(data, nbits, repeat); // Send it as a single Samsung message.
+ return;
+ }
+
+ // LGv2 (28-bit) protocol.
+ sendGeneric(kLg2HdrMark, kLg2HdrSpace, kLgBitMark, kLgOneSpace, kLgBitMark,
+ kLgZeroSpace, kLgBitMark, kLgMinGap, kLgMinMessageLength, data,
+ nbits, 38, true, 0, // Repeats are handled later.
+ 50);
+
+ // TODO(crackn): Verify the details of what repeat messages look like.
+ // Repeat
+ // Protocol has a mandatory repeat-specific code sent after every command.
+ if (repeat)
+ sendGeneric(kLg2HdrMark, kLgRptSpace, 0, 0, 0, 0, // No data is sent.
+ kLgBitMark, kLgMinGap, kLgMinMessageLength, 0, 0, // No data.
+ 38, true, repeat - 1, 50);
+}
+
+// Construct a raw 28-bit LG message code from the supplied address & command.
+//
+// Args:
+// address: The address code.
+// command: The command code.
+// Returns:
+// A raw 28-bit LG message code suitable for sendLG() etc.
+//
+// Status: BETA / Should work.
+//
+// Notes:
+// e.g. Sequence of bits = address + command + checksum.
+uint32_t IRsend::encodeLG(uint16_t address, uint16_t command) {
+ return ((address << 20) | (command << 4) | calcLGChecksum(command));
+}
+#endif
+
+#if DECODE_LG
+// Decode the supplied LG message.
+// LG protocol has a repeat code which is 4 items long.
+// Even though the protocol has 28/32 bits of data, only 24/28 bits are
+// distinct.
+// In transmission order, the 28/32 bits are constructed as follows:
+// 8/12 bits of address + 16 bits of command + 4 bits of checksum.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: Nr. of bits to expect in the data portion.
+// Typically kLgBits or kLg32Bits.
+// strict: Flag to indicate if we strictly adhere to the specification.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: BETA / Should work.
+//
+// Note:
+// LG 32bit protocol appears near identical to the Samsung protocol.
+// They possibly differ on how they repeat and initial HDR mark.
+//
+// Supports:
+// IR Remote models: 6711A20083V, AKB74395308
+
+// Ref:
+// https://funembedded.wordpress.com/2014/11/08/ir-remote-control-for-lg-conditioner-using-stm32f302-mcu-on-mbed-platform/
+bool IRrecv::decodeLG(decode_results *results, uint16_t nbits, bool strict) {
+ if (nbits >= kLg32Bits) {
+ if (results->rawlen < 2 * nbits + 2 * (kHeader + kFooter) - 1)
+ return false; // Can't possibly be a valid LG32 message.
+ } else {
+ if (results->rawlen < 2 * nbits + kHeader + kFooter - 1)
+ return false; // Can't possibly be a valid LG message.
+ }
+ if (strict && nbits != kLgBits && nbits != kLg32Bits)
+ return false; // Doesn't comply with expected LG protocol.
+
+ uint64_t data = 0;
+ uint16_t offset = kStartOffset;
+ bool isLg2 = false;
+
+ // Header
+ uint32_t m_tick;
+ if (matchMark(results->rawbuf[offset], kLgHdrMark)) {
+ m_tick = results->rawbuf[offset++] * kRawTick / kLgHdrMarkTicks;
+ } else if (matchMark(results->rawbuf[offset], kLg2HdrMark)) {
+ m_tick = results->rawbuf[offset++] * kRawTick / kLg2HdrMarkTicks;
+ isLg2 = true;
+ } else if (matchMark(results->rawbuf[offset], kLg32HdrMark)) {
+ m_tick = results->rawbuf[offset++] * kRawTick / kLg32HdrMarkTicks;
+ } else {
+ return false;
+ }
+ uint32_t s_tick;
+ if (isLg2) {
+ if (matchSpace(results->rawbuf[offset], kLg2HdrSpace))
+ s_tick = results->rawbuf[offset++] * kRawTick / kLg2HdrSpaceTicks;
+ else
+ return false;
+ } else {
+ if (matchSpace(results->rawbuf[offset], kLgHdrSpace))
+ s_tick = results->rawbuf[offset++] * kRawTick / kLgHdrSpaceTicks;
+ else if (matchSpace(results->rawbuf[offset], kLg2HdrSpace))
+ s_tick = results->rawbuf[offset++] * kRawTick / kLg32HdrSpaceTicks;
+ else
+ return false;
+ }
+
+ // Set up the expected tick sizes based on variant.
+ uint16_t bitmarkticks;
+ if (isLg2) {
+ bitmarkticks = kLg2BitMarkTicks;
+ } else {
+ bitmarkticks = kLgBitMarkTicks;
+ }
+
+ // Data
+ match_result_t data_result =
+ matchData(&(results->rawbuf[offset]), nbits, bitmarkticks * m_tick,
+ kLgOneSpaceTicks * s_tick, bitmarkticks * m_tick,
+ kLgZeroSpaceTicks * s_tick, kTolerance, 0);
+ if (data_result.success == false) return false;
+ data = data_result.data;
+ offset += data_result.used;
+
+ // Footer
+ if (!matchMark(results->rawbuf[offset++], bitmarkticks * m_tick))
+ return false;
+ if (offset < results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset], kLgMinGapTicks * s_tick))
+ return false;
+
+ // Repeat
+ if (nbits >= kLg32Bits) {
+ // If we are expecting the LG 32-bit protocol, there is always
+ // a repeat message. So, check for it.
+ offset++;
+ if (!matchMark(results->rawbuf[offset++], kLg32RptHdrMarkTicks * m_tick))
+ return false;
+ if (!matchSpace(results->rawbuf[offset++], kLgRptSpaceTicks * s_tick))
+ return false;
+ if (!matchMark(results->rawbuf[offset++], bitmarkticks * m_tick))
+ return false;
+ if (offset < results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset], kLgMinGapTicks * s_tick))
+ return false;
+ }
+
+ // Compliance
+ uint16_t command = (data >> 4) & 0xFFFF; // The 16 bits before the checksum.
+
+ if (strict && (data & 0xF) != calcLGChecksum(command))
+ return false; // The last 4 bits sent are the expected checksum.
+
+ // Success
+ if (isLg2)
+ results->decode_type = LG2;
+ else
+ results->decode_type = LG;
+ results->bits = nbits;
+ results->value = data;
+ results->command = command;
+ results->address = data >> 20; // The bits before the command.
+ return true;
+}
+#endif
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_LG.h b/lib/IRremoteESP8266-2.5.2.03/src/ir_LG.h
similarity index 100%
rename from lib/IRremoteESP8266-2.2.1.02/src/ir_LG.h
rename to lib/IRremoteESP8266-2.5.2.03/src/ir_LG.h
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Lasertag.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Lasertag.cpp
new file mode 100644
index 000000000000..7f0b89ae9110
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Lasertag.cpp
@@ -0,0 +1,122 @@
+// Copyright 2017 David Conran
+
+#include
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRutils.h"
+
+// LL AAA SSSSS EEEEEEE RRRRRR TTTTTTT AAA GGGG
+// LL AAAAA SS EE RR RR TTT AAAAA GG GG
+// LL AA AA SSSSS EEEEE RRRRRR TTT AA AA GG
+// LL AAAAAAA SS EE RR RR TTT AAAAAAA GG GG
+// LLLLLLL AA AA SSSSS EEEEEEE RR RR TTT AA AA GGGGGG
+
+// Constants
+const uint16_t kLasertagMinSamples = 13;
+const uint16_t kLasertagTick = 333;
+const uint32_t kLasertagMinGap = 100000; // Completely made up amount.
+const uint8_t kLasertagTolerance = 0; // Percentage error margin.
+const uint16_t kLasertagExcess = 0; // See kMarkExcess.
+const uint16_t kLasertagDelta = 150; // Use instead of Excess and Tolerance.
+const int16_t kSpace = 1;
+const int16_t kMark = 0;
+
+#if SEND_LASERTAG
+// Send a Lasertag packet.
+// This protocol is pretty much just raw Manchester encoding.
+//
+// Args:
+// data: The message you wish to send.
+// nbits: Bit size of the protocol you want to send.
+// repeat: Nr. of extra times the data will be sent.
+//
+// Status: STABLE / Working.
+//
+void IRsend::sendLasertag(uint64_t data, uint16_t nbits, uint16_t repeat) {
+ if (nbits > sizeof(data) * 8) return; // We can't send something that big.
+
+ // Set 36kHz IR carrier frequency & a 1/4 (25%) duty cycle.
+ // NOTE: duty cycle is not confirmed. Just guessing based on RC5/6 protocols.
+ enableIROut(36, 25);
+
+ for (uint16_t i = 0; i <= repeat; i++) {
+ // Data
+ for (uint64_t mask = 1ULL << (nbits - 1); mask; mask >>= 1)
+ if (data & mask) { // 1
+ space(kLasertagTick); // 1 is space, then mark.
+ mark(kLasertagTick);
+ } else { // 0
+ mark(kLasertagTick); // 0 is mark, then space.
+ space(kLasertagTick);
+ }
+ // Footer
+ space(kLasertagMinGap);
+ }
+}
+#endif // SEND_LASERTAG
+
+#if DECODE_LASERTAG
+// Decode the supplied Lasertag message.
+// This protocol is pretty much just raw Manchester encoding.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: The number of data bits to expect.
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: BETA / Appears to be working 90% of the time.
+//
+// Ref:
+// http://www.sbprojects.com/knowledge/ir/rc5.php
+// https://en.wikipedia.org/wiki/RC-5
+// https://en.wikipedia.org/wiki/Manchester_code
+bool IRrecv::decodeLasertag(decode_results *results, uint16_t nbits,
+ bool strict) {
+ if (results->rawlen < kLasertagMinSamples) return false;
+
+ // Compliance
+ if (strict && nbits != kLasertagBits) return false;
+
+ uint16_t offset = kStartOffset;
+ uint16_t used = 0;
+ uint64_t data = 0;
+ uint16_t actual_bits = 0;
+
+ // No Header
+
+ // Data
+ for (; offset <= results->rawlen; actual_bits++) {
+ int16_t levelA =
+ getRClevel(results, &offset, &used, kLasertagTick, kLasertagTolerance,
+ kLasertagExcess, kLasertagDelta);
+ int16_t levelB =
+ getRClevel(results, &offset, &used, kLasertagTick, kLasertagTolerance,
+ kLasertagExcess, kLasertagDelta);
+ if (levelA == kSpace && levelB == kMark) {
+ data = (data << 1) | 1; // 1
+ } else {
+ if (levelA == kMark && levelB == kSpace) {
+ data <<= 1; // 0
+ } else {
+ break;
+ }
+ }
+ }
+ // Footer (None)
+
+ // Compliance
+ if (actual_bits < nbits) return false; // Less data than we expected.
+ if (strict && actual_bits != kLasertagBits) return false;
+
+ // Success
+ results->decode_type = LASERTAG;
+ results->value = data;
+ results->address = data & 0xF; // Unit
+ results->command = data >> 4; // Team
+ results->repeat = false;
+ results->bits = actual_bits;
+ return true;
+}
+#endif // DECODE_LASERTAG
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Lutron.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Lutron.cpp
new file mode 100644
index 000000000000..00eb9383b85b
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Lutron.cpp
@@ -0,0 +1,156 @@
+// Copyright 2018 David Conran
+
+#define __STDC_LIMIT_MACROS
+#include
+#include
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRutils.h"
+
+// LL UU UU TTTTTTT RRRRRR OOOOO NN NN
+// LL UU UU TTT RR RR OO OO NNN NN
+// LL UU UU TTT RRRRRR OO OO NN N NN
+// LL UU UU TTT RR RR OO OO NN NNN
+// LLLLLLL UUUUU TTT RR RR OOOO0 NN NN
+
+// Notes:
+// The Lutron protocol uses a sort of Run Length encoding to encode
+// its data. There is no header or footer per-se.
+// As a mark is the first data we will notice, we always assume the First
+// bit of the technically 36-bit protocol is '1'. So it is assumed, and thus
+// we only care about the 35 bits of data.
+
+// Constants
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/515
+const uint16_t kLutronTick = 2288;
+const uint32_t kLutronGap = 150000; // Completely made up value.
+const uint16_t kLutronDelta = 400; // +/- 300 usecs.
+
+#if SEND_LUTRON
+// Send a Lutron formatted message.
+//
+// Args:
+// data: The message to be sent.
+// nbits: The number of bits of the message to be sent. Typically kLutronBits
+// repeat: The number of times the command is to be repeated.
+//
+// Status: Stable / Appears to be working for real devices.
+
+// Notes:
+// Protocol is really 36 bits long, but the first bit is always a 1.
+// So, assume the 1 and only have a normal payload of 35 bits.
+//
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/515
+void IRsend::sendLutron(uint64_t data, uint16_t nbits, uint16_t repeat) {
+ enableIROut(40000, 40); // 40Khz & 40% dutycycle.
+ for (uint16_t r = 0; r <= repeat; r++) {
+ mark(kLutronTick); // 1st bit is always '1'.
+ // Send the supplied data in MSB First order.
+ for (uint64_t mask = 1ULL << (nbits - 1); mask; mask >>= 1)
+ if (data & mask)
+ mark(kLutronTick); // Send a 1
+ else
+ space(kLutronTick); // Send a 0
+ space(kLutronGap); // Inter-message gap.
+ }
+}
+#endif // SEND_LUTRON
+
+#if DECODE_LUTRON
+// Decode the supplied Lutron message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: The number of data bits to expect. Typically kLutronBits.
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: ALPHA / Untested.
+//
+// Notes:
+//
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/515
+bool IRrecv::decodeLutron(decode_results *results, uint16_t nbits,
+ bool strict) {
+ // Technically the smallest number of entries for the smallest message is '1'.
+ // i.e. All the bits set to 1, would produce a single huge mark signal.
+ // So no minimum length check is required.
+ if (strict && nbits != kLutronBits)
+ return false; // Not strictly an Lutron message.
+
+ uint64_t data = 0;
+ int16_t bitsSoFar = -1;
+
+ if (nbits > sizeof(data) * 8) return false; // To large to store the data.
+ for (uint16_t offset = kStartOffset;
+ bitsSoFar < nbits && offset < results->rawlen; offset++) {
+ uint16_t entry = results->rawbuf[offset];
+ // It has to be large enough to qualify as a bit.
+ if (!matchAtLeast(entry, kLutronTick, 0, kLutronDelta)) {
+ DPRINTLN("Entry too small. Aborting.");
+ return false;
+ }
+ // Keep reading bits of the same value until we run out.
+ while (entry != 0 && matchAtLeast(entry, kLutronTick, 0, kLutronDelta)) {
+ bitsSoFar++;
+ DPRINT("Bit: ");
+ DPRINT(bitsSoFar);
+ if (offset % 2) { // Is Odd?
+ data = (data << 1) + 1; // Append a '1'.
+ DPRINTLN(" is a 1.");
+ } else { // Is it Even?
+ data <<= 1; // Append a '0'.
+ DPRINTLN(" is a 0.");
+ if (bitsSoFar == nbits && matchAtLeast(entry, kLutronGap))
+ break; // We've likely reached the end of a message.
+ }
+ // Remove a bit length from the current entry.
+ entry = std::max(entry, (uint16_t)(kLutronTick / kRawTick)) -
+ kLutronTick / kRawTick;
+ }
+ if (offset % 2 && !match(entry, kLutronDelta, 0, kLutronDelta)) {
+ DPRINT("offset = ");
+ DPRINTLN(offset);
+ DPRINT("rawlen = ");
+ DPRINTLN(results->rawlen);
+ DPRINT("entry = ");
+ DPRINTLN(entry);
+ DPRINTLN("Odd Entry has too much left over. Aborting.");
+ return false; // Too much left over to be a good value. Reject it.
+ }
+ if (offset % 2 == 0 && offset <= results->rawlen - 1 &&
+ !matchAtLeast(entry, kLutronDelta, 0, kLutronDelta)) {
+ DPRINT("offset = ");
+ DPRINTLN(offset);
+ DPRINT("rawlen = ");
+ DPRINTLN(results->rawlen);
+ DPRINT("entry = ");
+ DPRINTLN(entry);
+ DPRINTLN("Entry has too much left over. Aborting.");
+ return false; // Too much left over to be a good value. Reject it.
+ }
+ }
+
+ // We got too many bits.
+ if (bitsSoFar > nbits || bitsSoFar < 0) {
+ DPRINTLN("Wrong number of bits found. Aborting.");
+ return false;
+ }
+ // If we got less bits than we were expecting, we need to pad with zeros
+ // until we get the correct number of bits.
+ if (bitsSoFar < nbits) data <<= (nbits - bitsSoFar);
+
+ // Success
+ DPRINTLN("Lutron Success!");
+ results->decode_type = LUTRON;
+ results->bits = bitsSoFar;
+ results->value = data ^ (1ULL << nbits); // Mask off the initial '1'.
+ results->address = 0;
+ results->command = 0;
+ return true;
+}
+#endif // DECODE_LUTRON
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_MWM.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_MWM.cpp
new file mode 100644
index 000000000000..a75e99e3a51d
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_MWM.cpp
@@ -0,0 +1,202 @@
+// Copyright 2018 Brett T. Warden
+// derived from ir_Lasertag.cpp, Copyright 2017 David Conran
+
+#include
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRutils.h"
+
+// MM MM WW WW MM MM
+// MMM MMM WW WW MMM MMM
+// MM M MM WW W WW MM M MM
+// MM MM WWW WWW MM MM
+// MM MM WW WW MM MM
+
+// Constants
+const uint16_t kMWMMinSamples = 6; // Msgs are >=3 bytes, bytes have >=2
+ // samples
+const uint16_t kMWMTick = 417;
+const uint32_t kMWMMinGap = 30000; // Typical observed delay b/w commands
+const uint8_t kMWMTolerance = 0; // Percentage error margin.
+const uint16_t kMWMExcess = 0; // See kMarkExcess.
+const uint16_t kMWMDelta = 150; // Use instead of Excess and Tolerance.
+const uint8_t kMWMMaxWidth = 9; // Maximum number of successive bits at a
+ // single level - worst case
+const int16_t kSpace = 1;
+const int16_t kMark = 0;
+
+#if SEND_MWM
+// Send a MWM packet.
+// This protocol is 2400 bps serial, 1 start bit (mark), 1 stop bit (space), no
+// parity
+//
+// Args:
+// data: The message you wish to send.
+// nbits: Bit size of the protocol you want to send.
+// repeat: Nr. of extra times the data will be sent.
+//
+// Status: Implemented.
+//
+void IRsend::sendMWM(uint8_t data[], uint16_t nbytes, uint16_t repeat) {
+ if (nbytes < 3) return; // Shortest possible message is 3 bytes
+
+ // Set 38kHz IR carrier frequency & a 1/4 (25%) duty cycle.
+ // NOTE: duty cycle is not confirmed. Just guessing based on RC5/6 protocols.
+ enableIROut(38, 25);
+
+ for (uint16_t r = 0; r <= repeat; r++) {
+ // Data
+ for (uint16_t i = 0; i < nbytes; i++) {
+ uint8_t byte = data[i];
+
+ // Start bit
+ mark(kMWMTick);
+
+ // LSB first, space=1
+ for (uint8_t mask = 0x1; mask; mask <<= 1) {
+ if (byte & mask) { // 1
+ space(kMWMTick);
+ } else { // 0
+ mark(kMWMTick);
+ }
+ }
+ // Stop bit
+ space(kMWMTick);
+ }
+ // Footer
+ space(kMWMMinGap);
+ }
+}
+#endif // SEND_MWM
+
+#if DECODE_MWM
+// Decode the supplied MWM message.
+// This protocol is 2400 bps serial, 1 start bit (mark), 1 stop bit (space), no
+// parity
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: The number of data bits to expect.
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: Implemented.
+//
+bool IRrecv::decodeMWM(decode_results *results, uint16_t nbits, bool strict) {
+ DPRINTLN("DEBUG: decodeMWM");
+
+ // Compliance
+ if (results->rawlen < kMWMMinSamples) {
+ DPRINTLN("DEBUG: decodeMWM: too few samples");
+ return false;
+ }
+
+ uint16_t offset = kStartOffset;
+ uint16_t used = 0;
+ uint64_t data = 0;
+ uint16_t frame_bits = 0;
+ uint16_t data_bits = 0;
+
+ // No Header
+
+ // Data
+ uint8_t bits_per_frame = 10;
+ for (; offset < results->rawlen && results->bits < 8 * kStateSizeMax;
+ frame_bits++) {
+ DPRINT("DEBUG: decodeMWM: offset = ");
+ DPRINTLN(uint64ToString(offset));
+ int16_t level = getRClevel(results, &offset, &used, kMWMTick, kMWMTolerance,
+ kMWMExcess, kMWMDelta, kMWMMaxWidth);
+ if (level < 0) {
+ DPRINTLN("DEBUG: decodeMWM: getRClevel returned error");
+ break;
+ }
+ switch (frame_bits % bits_per_frame) {
+ case 0:
+ // Start bit
+ if (level != kMark) {
+ DPRINTLN("DEBUG: decodeMWM: framing error - invalid start bit");
+ goto done;
+ }
+ break;
+ case 9:
+ // Stop bit
+ if (level != kSpace) {
+ DPRINTLN("DEBUG: decodeMWM: framing error - invalid stop bit");
+ return false;
+ } else {
+ DPRINT("DEBUG: decodeMWM: data_bits = ");
+ DPRINTLN(data_bits);
+ DPRINT("DEBUG: decodeMWM: Finished byte: ");
+ DPRINTLN(data);
+ results->state[data_bits / 8 - 1] = data & 0xFF;
+ results->bits = data_bits;
+ data = 0;
+ }
+ break;
+ default:
+ // Data bits
+ DPRINT("DEBUG: decodeMWM: Storing bit: ");
+ DPRINTLN((level == kSpace));
+ // Transmission is LSB-first, space=1
+ data |= ((level == kSpace)) << 8;
+ data >>= 1;
+ data_bits++;
+ break;
+ }
+ }
+
+done:
+ // Footer (None)
+
+ // Compliance
+ DPRINT("DEBUG: decodeMWM: frame_bits = ");
+ DPRINTLN(frame_bits);
+ DPRINT("DEBUG: decodeMWM: data_bits = ");
+ DPRINTLN(data_bits);
+ if (data_bits < nbits) {
+ DPRINT("DEBUG: decodeMWM: too few bits; expected ");
+ DPRINTLN(nbits);
+ return false; // Less data than we expected.
+ }
+
+ uint16_t payload_length = 0;
+ switch (results->state[0] & 0xf0) {
+ case 0x90:
+ case 0xf0:
+ // Normal commands
+ payload_length = results->state[0] & 0x0f;
+ DPRINT("DEBUG: decodeMWM: payload_length = ");
+ DPRINTLN(payload_length);
+ break;
+ default:
+ if (strict) {
+ // Show commands
+ if (results->state[0] != 0x55 && results->state[1] != 0xAA) {
+ return false;
+ }
+ }
+ break;
+ }
+ if (data_bits < (payload_length + 3) * 8) {
+ DPRINT("DEBUG: decodeMWM: too few bytes; expected ");
+ DPRINTLN((payload_length + 3));
+ return false;
+ }
+ if (strict) {
+ if (payload_length && (data_bits > (payload_length + 3) * 8)) {
+ DPRINT("DEBUG: decodeMWM: too many bytes; expected ");
+ DPRINTLN((payload_length + 3));
+ return false;
+ }
+ }
+
+ // Success
+ results->decode_type = MWM;
+ results->repeat = false;
+ return true;
+}
+#endif // DECODE_MWM
+
+// vim: et:ts=2:sw=2
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Magiquest.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Magiquest.cpp
new file mode 100644
index 000000000000..863aa0ec3aa5
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Magiquest.cpp
@@ -0,0 +1,166 @@
+// Copyright 2013 mpflaga
+// Copyright 2015 kitlaan
+// Copyright 2017 Jason kendall, David Conran
+
+#include "ir_Magiquest.h"
+#include
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRutils.h"
+
+#define IS_ZERO(m, s) (((m)*100 / ((m) + (s))) <= kMagiQuestZeroRatio)
+#define IS_ONE(m, s) (((m)*100 / ((m) + (s))) >= kMagiQuestOneRatio)
+
+// Strips taken from:
+// https://github.com/kitlaan/Arduino-IRremote/blob/master/ir_Magiquest.cpp
+// and
+// https://github.com/mpflaga/Arduino-IRremote
+
+// Source: https://github.com/mpflaga/Arduino-IRremote
+
+#if SEND_MAGIQUEST
+// Send a MagiQuest formatted message.
+//
+// Args:
+// data: The contents of the message you want to send.
+// nbits: The bit size of the message being sent.
+// Typically kMagiquestBits.
+// repeat: The number of times you want the message to be repeated.
+//
+// Status: Alpha / Should be working.
+//
+void IRsend::sendMagiQuest(uint64_t data, uint16_t nbits, uint16_t repeat) {
+ sendGeneric(0, 0, // No Headers - Technically it's included in the data.
+ // i.e. 8 zeros.
+ kMagiQuestMarkOne, kMagiQuestSpaceOne, kMagiQuestMarkZero,
+ kMagiQuestSpaceZero,
+ 0, // No footer mark.
+ kMagiQuestGap, data, nbits, 36, true, repeat, 50);
+}
+
+// Encode a MagiQuest wand_id, and a magnitude into a single 64bit value.
+// (Only 48 bits of real data + 8 leading zero bits)
+// This is suitable for calling sendMagiQuest() with.
+// e.g. sendMagiQuest(encodeMagiQuest(wand_id, magnitude));
+uint64_t IRsend::encodeMagiQuest(uint32_t wand_id, uint16_t magnitude) {
+ uint64_t result = 0;
+ result = wand_id;
+ result <<= 16;
+ result |= magnitude;
+ // Shouldn't be needed, but ensure top 8/16 bit are zero.
+ result &= 0xFFFFFFFFFFFFULL;
+ return result;
+}
+#endif
+
+// Source:
+// https://github.com/kitlaan/Arduino-IRremote/blob/master/ir_Magiquest.cpp
+
+#if DECODE_MAGIQUEST
+// Decode the supplied MagiQuest message.
+// MagiQuest protocol appears to be a header of 8 'zero' bits, followed
+// by 32 bits of "wand ID" and finally 16 bits of "magnitude".
+// Even though we describe this protocol as 56 bits, it really only has
+// 48 bits of data that matter.
+//
+// In transmission order, 8 zeros + 32 wand_id + 16 magnitude.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: Nr. of bits to expect in the data portion, inc. the 8 bit header.
+// Typically kMagiquestBits.
+// strict: Flag to indicate if we strictly adhere to the specification.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: Alpha / Should work.
+//
+// Ref:
+// https://github.com/kitlaan/Arduino-IRremote/blob/master/ir_Magiquest.cpp
+bool IRrecv::decodeMagiQuest(decode_results *results, uint16_t nbits,
+ bool strict) {
+ uint16_t bits = 0;
+ uint64_t data = 0;
+ uint16_t offset = kStartOffset;
+
+ if (results->rawlen < (2 * kMagiquestBits)) {
+ DPRINT("Not enough bits to be Magiquest - Rawlen: ");
+ DPRINT(results->rawlen);
+ DPRINT(" Expected: ");
+ DPRINTLN((2 * kMagiquestBits));
+ return false;
+ }
+
+ // Compliance
+ if (strict && nbits != kMagiquestBits) return false;
+
+ // Of six wands as datapoints, so far they all start with 8 ZEROs.
+ // For example, here is the data from two wands
+ // 00000000 00100011 01001100 00100110 00000010 00000010 00010111
+ // 00000000 00100000 10001000 00110001 00000010 00000010 10110100
+
+ // Decode the (MARK + SPACE) bits
+ while (offset + 1 < results->rawlen && bits < nbits - 1) {
+ uint16_t mark = results->rawbuf[offset];
+ uint16_t space = results->rawbuf[offset + 1];
+ if (!matchMark(mark + space, kMagiQuestTotalUsec)) {
+ DPRINT("Not enough time to be Magiquest - Mark: ");
+ DPRINT(mark);
+ DPRINT(" Space: ");
+ DPRINT(space);
+ DPRINT(" Total: ");
+ DPRINT(mark + space);
+ DPRINT("Expected: ");
+ DPRINTLN(kMagiQuestTotalUsec);
+ return false;
+ }
+
+ if (IS_ZERO(mark, space))
+ data = (data << 1) | 0;
+ else if (IS_ONE(mark, space))
+ data = (data << 1) | 1;
+ else
+ return false;
+
+ bits++;
+ offset += 2;
+
+ // Compliance
+ // The first 8 bits of this protocol are supposed to all be 0.
+ // Exit out early as it is never going to match.
+ if (strict && bits == 8 && data != 0) return false;
+ }
+
+ // Last bit is special as the protocol ends with a SPACE, not a MARK.
+ // Grab the last MARK bit, assuming a good SPACE after it
+ if (offset < results->rawlen) {
+ uint16_t mark = results->rawbuf[offset];
+ uint16_t space = (kMagiQuestTotalUsec / kRawTick) - mark;
+
+ if (IS_ZERO(mark, space))
+ data = (data << 1) | 0;
+ else if (IS_ONE(mark, space))
+ data = (data << 1) | 1;
+ else
+ return false;
+
+ bits++;
+ }
+
+ if (bits != nbits) return false;
+
+ if (strict) {
+ // The top 8 bits of the 56 bits needs to be 0x00 to be valid.
+ // i.e. bits 56 to 49 are all zero.
+ if ((data >> (nbits - 8)) != 0) return false;
+ }
+
+ // Success
+ results->decode_type = MAGIQUEST;
+ results->bits = bits;
+ results->value = data;
+ results->address = data >> 16; // Wand ID
+ results->command = data & 0xFFFF; // Magnitude
+ return true;
+}
+#endif
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Magiquest.h b/lib/IRremoteESP8266-2.5.2.03/src/ir_Magiquest.h
new file mode 100644
index 000000000000..d2d82d152767
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Magiquest.h
@@ -0,0 +1,35 @@
+// Copyright 2013 mpflaga
+// Copyright 2015 kitlaan
+// Copyright 2017 Jason kendall, David Conran
+
+#ifndef IR_MAGIQUEST_H_
+#define IR_MAGIQUEST_H_
+
+#define __STDC_LIMIT_MACROS
+#include
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+
+// MagiQuest packet is both Wand ID and magnitude of swish and flick
+union magiquest {
+ uint64_t llword;
+ uint8_t byte[8];
+ // uint16_t word[4];
+ uint32_t lword[2];
+ struct {
+ uint16_t magnitude;
+ uint32_t wand_id;
+ uint8_t padding;
+ uint8_t scrap;
+ } cmd;
+};
+
+const uint16_t kMagiQuestTotalUsec = 1150;
+const uint8_t kMagiQuestZeroRatio = 30; // usually <= ~25%
+const uint8_t kMagiQuestOneRatio = 38; // usually >= ~50%
+const uint16_t kMagiQuestMarkZero = 280;
+const uint16_t kMagiQuestSpaceZero = 850;
+const uint16_t kMagiQuestMarkOne = 580;
+const uint16_t kMagiQuestSpaceOne = 600;
+const uint32_t kMagiQuestGap = 100000; // A guess of the gap between messages
+#endif // IR_MAGIQUEST_H_
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Midea.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Midea.cpp
new file mode 100644
index 000000000000..8e55c7d227be
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Midea.cpp
@@ -0,0 +1,403 @@
+// Copyright 2017 bwze, crankyoldgit
+
+#include "ir_Midea.h"
+#include
+#ifndef ARDUINO
+#include
+#endif
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRutils.h"
+
+// MM MM IIIII DDDDD EEEEEEE AAA
+// MMM MMM III DD DD EE AAAAA
+// MM MM MM III DD DD EEEEE AA AA
+// MM MM III DD DD EE AAAAAAA
+// MM MM IIIII DDDDDD EEEEEEE AA AA
+
+// Midea A/C added by (send) bwze/crankyoldgit & (decode) crankyoldgit
+//
+// Equipment it seems compatible with:
+// * Pioneer System Model RYBO12GMFILCAD (12K BTU)
+// * Pioneer System Model RUBO18GMFILCAD (18K BTU)
+// *
+
+// Ref:
+// https://docs.google.com/spreadsheets/d/1TZh4jWrx4h9zzpYUI9aYXMl1fYOiqu-xVuOOMqagxrs/edit?usp=sharing
+
+// Constants
+const uint16_t kMideaTick = 80;
+const uint16_t kMideaBitMarkTicks = 7;
+const uint16_t kMideaBitMark = kMideaBitMarkTicks * kMideaTick;
+const uint16_t kMideaOneSpaceTicks = 21;
+const uint16_t kMideaOneSpace = kMideaOneSpaceTicks * kMideaTick;
+const uint16_t kMideaZeroSpaceTicks = 7;
+const uint16_t kMideaZeroSpace = kMideaZeroSpaceTicks * kMideaTick;
+const uint16_t kMideaHdrMarkTicks = 56;
+const uint16_t kMideaHdrMark = kMideaHdrMarkTicks * kMideaTick;
+const uint16_t kMideaHdrSpaceTicks = 56;
+const uint16_t kMideaHdrSpace = kMideaHdrSpaceTicks * kMideaTick;
+const uint16_t kMideaMinGapTicks =
+ kMideaHdrMarkTicks + kMideaZeroSpaceTicks + kMideaBitMarkTicks;
+const uint16_t kMideaMinGap = kMideaMinGapTicks * kMideaTick;
+const uint8_t kMideaTolerance = 30; // Percent
+
+#if SEND_MIDEA
+// Send a Midea message
+//
+// Args:
+// data: Contents of the message to be sent.
+// nbits: Nr. of bits of data to be sent. Typically kMideaBits.
+// repeat: Nr. of additional times the message is to be sent.
+//
+// Status: Alpha / Needs testing against a real device.
+//
+void IRsend::sendMidea(uint64_t data, uint16_t nbits, uint16_t repeat) {
+ if (nbits % 8 != 0) return; // nbits is required to be a multiple of 8.
+
+ // Set IR carrier frequency
+ enableIROut(38);
+
+ for (uint16_t r = 0; r <= repeat; r++) {
+ // The protcol sends the message, then follows up with an entirely
+ // inverted payload.
+ for (size_t inner_loop = 0; inner_loop < 2; inner_loop++) {
+ // Header
+ mark(kMideaHdrMark);
+ space(kMideaHdrSpace);
+ // Data
+ // Break data into byte segments, starting at the Most Significant
+ // Byte. Each byte then being sent normal, then followed inverted.
+ for (uint16_t i = 8; i <= nbits; i += 8) {
+ // Grab a bytes worth of data.
+ uint8_t segment = (data >> (nbits - i)) & 0xFF;
+ sendData(kMideaBitMark, kMideaOneSpace, kMideaBitMark, kMideaZeroSpace,
+ segment, 8, true);
+ }
+ // Footer
+ mark(kMideaBitMark);
+ space(kMideaMinGap); // Pause before repeating
+
+ // Invert the data for the 2nd phase of the message.
+ // As we get called twice in the inner loop, we will always revert
+ // to the original 'data' state.
+ data = ~data;
+ }
+ }
+}
+#endif
+
+// Code to emulate Midea A/C IR remote control unit.
+// Warning: Consider this very alpha code.
+
+// Initialise the object.
+IRMideaAC::IRMideaAC(uint16_t pin) : _irsend(pin) { stateReset(); }
+
+// Reset the state of the remote to a known good state/sequence.
+void IRMideaAC::stateReset() {
+ // Power On, Mode Auto, Fan Auto, Temp = 25C/77F
+ remote_state = 0xA1826FFFFF62;
+}
+
+// Configure the pin for output.
+void IRMideaAC::begin() { _irsend.begin(); }
+
+#if SEND_MIDEA
+// Send the current desired state to the IR LED.
+void IRMideaAC::send() {
+ checksum(); // Ensure correct checksum before sending.
+ _irsend.sendMidea(remote_state);
+}
+#endif // SEND_MIDEA
+
+// Return a pointer to the internal state date of the remote.
+uint64_t IRMideaAC::getRaw() {
+ checksum();
+ return remote_state & kMideaACStateMask;
+}
+
+// Override the internal state with the new state.
+void IRMideaAC::setRaw(uint64_t newState) {
+ remote_state = newState & kMideaACStateMask;
+}
+
+// Set the requested power state of the A/C to off.
+void IRMideaAC::on() { remote_state |= kMideaACPower; }
+
+// Set the requested power state of the A/C to off.
+void IRMideaAC::off() { remote_state &= (kMideaACStateMask ^ kMideaACPower); }
+
+// Set the requested power state of the A/C.
+void IRMideaAC::setPower(const bool state) {
+ if (state)
+ on();
+ else
+ off();
+}
+
+// Return the requested power state of the A/C.
+bool IRMideaAC::getPower() { return (remote_state & kMideaACPower); }
+
+// Set the temperature.
+// Args:
+// temp: Temp. in degrees.
+// useCelsius: Degree type to use. Celsius (true) or Fahrenheit (false)
+void IRMideaAC::setTemp(const uint8_t temp, const bool useCelsius) {
+ uint8_t new_temp = temp;
+ if (useCelsius) {
+ new_temp = std::max(kMideaACMinTempC, new_temp);
+ new_temp = std::min(kMideaACMaxTempC, new_temp);
+ new_temp = (uint8_t)((new_temp * 1.8) + 32.5); // 0.5 so we rounding.
+ }
+ new_temp = std::max(kMideaACMinTempF, new_temp);
+ new_temp = std::min(kMideaACMaxTempF, new_temp);
+ new_temp -= kMideaACMinTempF;
+ remote_state &= kMideaACTempMask;
+ remote_state |= ((uint64_t)new_temp << 24);
+}
+
+// Return the set temp.
+// Args:
+// useCelsius: Flag indicating if the results are in Celsius or Fahrenheit.
+// Returns:
+// A uint8_t containing the temperature.
+uint8_t IRMideaAC::getTemp(const bool useCelsius) {
+ uint8_t temp = ((remote_state >> 24) & 0x1F) + kMideaACMinTempF;
+ if (useCelsius) {
+ temp = (uint8_t)((temp - 32) / 1.8);
+ }
+ return temp;
+}
+
+// Set the speed of the fan,
+// 1-3 set the speed, 0 or anything else set it to auto.
+void IRMideaAC::setFan(const uint8_t fan) {
+ uint64_t new_fan;
+ switch (fan) {
+ case kMideaACFanLow:
+ case kMideaACFanMed:
+ case kMideaACFanHigh:
+ new_fan = fan;
+ break;
+ default:
+ new_fan = kMideaACFanAuto;
+ }
+ remote_state &= kMideaACFanMask;
+ remote_state |= (new_fan << 35);
+}
+
+// Return the requested state of the unit's fan.
+uint8_t IRMideaAC::getFan() { return (remote_state >> 35) & 0b111; }
+
+// Get the requested climate operation mode of the a/c unit.
+// Returns:
+// A uint8_t containing the A/C mode.
+uint8_t IRMideaAC::getMode() { return ((remote_state >> 32) & 0b111); }
+
+// Set the requested climate operation mode of the a/c unit.
+void IRMideaAC::setMode(const uint8_t mode) {
+ // If we get an unexpected mode, default to AUTO.
+ uint64_t new_mode;
+ switch (mode) {
+ case kMideaACAuto:
+ case kMideaACCool:
+ case kMideaACHeat:
+ case kMideaACDry:
+ case kMideaACFan:
+ new_mode = mode;
+ break;
+ default:
+ new_mode = kMideaACAuto;
+ }
+ remote_state &= kMideaACModeMask;
+ remote_state |= (new_mode << 32);
+}
+
+// Set the Sleep state of the A/C.
+void IRMideaAC::setSleep(const bool state) {
+ if (state)
+ remote_state |= kMideaACSleep;
+ else
+ remote_state &= (kMideaACStateMask ^ kMideaACSleep);
+}
+
+// Return the Sleep state of the A/C.
+bool IRMideaAC::getSleep() { return (remote_state & kMideaACSleep); }
+
+// Calculate the checksum for a given array.
+// Args:
+// state: The state to calculate the checksum over.
+// Returns:
+// The 8 bit checksum value.
+uint8_t IRMideaAC::calcChecksum(const uint64_t state) {
+ uint8_t sum = 0;
+ uint64_t temp_state = state;
+
+ for (uint8_t i = 0; i < 5; i++) {
+ temp_state >>= 8;
+ sum += reverseBits((temp_state & 0xFF), 8);
+ }
+ sum = 256 - sum;
+ return reverseBits(sum, 8);
+}
+
+// Verify the checksum is valid for a given state.
+// Args:
+// state: The state to verify the checksum of.
+// Returns:
+// A boolean.
+bool IRMideaAC::validChecksum(const uint64_t state) {
+ return ((state & 0xFF) == calcChecksum(state));
+}
+
+// Calculate & set the checksum for the current internal state of the remote.
+void IRMideaAC::checksum() {
+ // Stored the checksum value in the last byte.
+ remote_state &= kMideaACChecksumMask;
+ remote_state |= calcChecksum(remote_state);
+}
+
+// Convert the internal state into a human readable string.
+#ifdef ARDUINO
+String IRMideaAC::toString() {
+ String result = "";
+#else
+std::string IRMideaAC::toString() {
+ std::string result = "";
+#endif // ARDUINO
+ result += "Power: ";
+ if (getPower())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Mode: " + uint64ToString(getMode());
+ switch (getMode()) {
+ case kMideaACAuto:
+ result += " (AUTO)";
+ break;
+ case kMideaACCool:
+ result += " (COOL)";
+ break;
+ case kMideaACHeat:
+ result += " (HEAT)";
+ break;
+ case kMideaACDry:
+ result += " (DRY)";
+ break;
+ case kMideaACFan:
+ result += " (FAN)";
+ break;
+ default:
+ result += " (UNKNOWN)";
+ }
+ result += ", Temp: " + uint64ToString(getTemp(true)) + "C/" +
+ uint64ToString(getTemp(false)) + "F";
+ result += ", Fan: " + uint64ToString(getFan());
+ switch (getFan()) {
+ case kMideaACFanAuto:
+ result += " (AUTO)";
+ break;
+ case kMideaACFanLow:
+ result += " (LOW)";
+ break;
+ case kMideaACFanMed:
+ result += " (MED)";
+ break;
+ case kMideaACFanHigh:
+ result += " (HI)";
+ break;
+ }
+ result += ", Sleep: ";
+ if (getSleep())
+ result += "On";
+ else
+ result += "Off";
+ return result;
+}
+
+#if DECODE_MIDEA
+// Decode the supplied Midea message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: The number of data bits to expect. Typically kMideaBits.
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: Alpha / Needs testing against a real device.
+//
+bool IRrecv::decodeMidea(decode_results *results, uint16_t nbits, bool strict) {
+ if (nbits % 8 != 0) // nbits has to be a multiple of nr. of bits in a byte.
+ return false;
+
+ uint8_t min_nr_of_messages = 1;
+ if (strict) {
+ if (nbits != kMideaBits) return false; // Not strictly a MIDEA message.
+ min_nr_of_messages = 2;
+ }
+
+ // The protocol sends the data normal + inverted, alternating on
+ // each byte. Hence twice the number of expected data bits.
+ if (results->rawlen <
+ min_nr_of_messages * (2 * nbits + kHeader + kFooter) - 1)
+ return false; // Can't possibly be a valid MIDEA message.
+
+ uint64_t data = 0;
+ uint64_t inverted = 0;
+ uint16_t offset = kStartOffset;
+
+ if (nbits > sizeof(data) * 8)
+ return false; // We can't possibly capture a Midea packet that big.
+
+ for (uint8_t i = 0; i < min_nr_of_messages; i++) {
+ // Header
+ if (!matchMark(results->rawbuf[offset], kMideaHdrMark)) return false;
+ // Calculate how long the common tick time is based on the header mark.
+ uint32_t m_tick = results->rawbuf[offset++] * kRawTick / kMideaHdrMarkTicks;
+ if (!matchSpace(results->rawbuf[offset], kMideaHdrSpace)) return false;
+ // Calculate how long the common tick time is based on the header space.
+ uint32_t s_tick =
+ results->rawbuf[offset++] * kRawTick / kMideaHdrSpaceTicks;
+
+ // Data (Normal)
+ match_result_t data_result = matchData(
+ &(results->rawbuf[offset]), nbits, kMideaBitMarkTicks * m_tick,
+ kMideaOneSpaceTicks * s_tick, kMideaBitMarkTicks * m_tick,
+ kMideaZeroSpaceTicks * s_tick, kMideaTolerance);
+ if (data_result.success == false) return false;
+ offset += data_result.used;
+ if (i % 2 == 0)
+ data = data_result.data;
+ else
+ inverted = data_result.data;
+
+ // Footer
+ if (!matchMark(results->rawbuf[offset++], kMideaBitMarkTicks * m_tick,
+ kMideaTolerance))
+ return false;
+ if (offset < results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset++], kMideaMinGapTicks * s_tick,
+ kMideaTolerance))
+ return false;
+ }
+
+ // Compliance
+ if (strict) {
+ // Protocol requires a second message with all the data bits inverted.
+ // We should have checked we got a second message in the previous loop.
+ // Just need to check it's value is an inverted copy of the first message.
+ uint64_t mask = (1ULL << kMideaBits) - 1;
+ if ((data & mask) != ((inverted ^ mask) & mask)) return false;
+ if (!IRMideaAC::validChecksum(data)) return false;
+ }
+
+ // Success
+ results->decode_type = MIDEA;
+ results->bits = nbits;
+ results->value = data;
+ results->address = 0;
+ results->command = 0;
+ return true;
+}
+#endif // DECODE_MIDEA
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Midea.h b/lib/IRremoteESP8266-2.5.2.03/src/ir_Midea.h
new file mode 100644
index 000000000000..aa9f94a928a2
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Midea.h
@@ -0,0 +1,103 @@
+// Copyright 2017 David Conran
+#ifndef IR_MIDEA_H_
+#define IR_MIDEA_H_
+
+#define __STDC_LIMIT_MACROS
+#include
+#ifdef ARDUINO
+#include
+#else
+#include
+#endif
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+
+// MM MM IIIII DDDDD EEEEEEE AAA
+// MMM MMM III DD DD EE AAAAA
+// MM MM MM III DD DD EEEEE AA AA
+// MM MM III DD DD EE AAAAAAA
+// MM MM IIIII DDDDDD EEEEEEE AA AA
+
+// Midea added by crankyoldgit & bwze
+// Ref:
+// https://docs.google.com/spreadsheets/d/1TZh4jWrx4h9zzpYUI9aYXMl1fYOiqu-xVuOOMqagxrs/edit?usp=sharing
+
+// Constants
+const uint8_t kMideaACCool = 0; // 0b000
+const uint8_t kMideaACDry = 1; // 0b001
+const uint8_t kMideaACAuto = 2; // 0b010
+const uint8_t kMideaACHeat = 3; // 0b011
+const uint8_t kMideaACFan = 4; // 0b100
+const uint8_t kMideaACFanAuto = 0; // 0b000
+const uint8_t kMideaACFanLow = 1; // 0b001
+const uint8_t kMideaACFanMed = 2; // 0b010
+const uint8_t kMideaACFanHigh = 3; // 0b011
+const uint64_t kMideaACPower = 1ULL << 39;
+const uint64_t kMideaACSleep = 1ULL << 38;
+const uint8_t kMideaACMinTempF = 62; // Fahrenheit
+const uint8_t kMideaACMaxTempF = 86; // Fahrenheit
+const uint8_t kMideaACMinTempC = 16; // Celsius
+const uint8_t kMideaACMaxTempC = 30; // Celsius
+const uint64_t kMideaACStateMask = 0x0000FFFFFFFFFFFF;
+const uint64_t kMideaACTempMask = 0x0000FFFFE0FFFFFF;
+const uint64_t kMideaACFanMask = 0x0000FFC7FFFFFFFF;
+const uint64_t kMideaACModeMask = 0x0000FFF8FFFFFFFF;
+const uint64_t kMideaACChecksumMask = 0x0000FFFFFFFFFF00;
+
+// Legacy defines. (Deprecated)
+#define MIDEA_AC_COOL kMideaACCool
+#define MIDEA_AC_DRY kMideaACDry
+#define MIDEA_AC_AUTO kMideaACAuto
+#define MIDEA_AC_HEAT kMideaACHeat
+#define MIDEA_AC_FAN kMideaACFan
+#define MIDEA_AC_FAN_AUTO kMideaACFanAuto
+#define MIDEA_AC_FAN_LOW kMideaACFanLow
+#define MIDEA_AC_FAN_MED kMideaACFanMed
+#define MIDEA_AC_FAN_HI kMideaACFanHigh
+#define MIDEA_AC_POWER kMideaACPower
+#define MIDEA_AC_SLEEP kMideaACSleep
+#define MIDEA_AC_MIN_TEMP_F kMideaACMinTempF
+#define MIDEA_AC_MAX_TEMP_F kMideaACMaxTempF
+#define MIDEA_AC_MIN_TEMP_C kMideaACMinTempC
+#define MIDEA_AC_MAX_TEMP_C kMideaACMaxTempC
+
+class IRMideaAC {
+ public:
+ explicit IRMideaAC(uint16_t pin);
+
+ void stateReset();
+#if SEND_MIDEA
+ void send();
+#endif // SEND_MIDEA
+ void begin();
+ void on();
+ void off();
+ void setPower(const bool state);
+ bool getPower();
+ void setTemp(const uint8_t temp, const bool useCelsius = false);
+ uint8_t getTemp(const bool useCelsius = false);
+ void setFan(const uint8_t fan);
+ uint8_t getFan();
+ void setMode(const uint8_t mode);
+ uint8_t getMode();
+ void setRaw(uint64_t newState);
+ uint64_t getRaw();
+ static bool validChecksum(const uint64_t state);
+ void setSleep(const bool state);
+ bool getSleep();
+#ifdef ARDUINO
+ String toString();
+#else
+ std::string toString();
+#endif
+#ifndef UNIT_TEST
+
+ private:
+#endif
+ uint64_t remote_state;
+ void checksum();
+ static uint8_t calcChecksum(const uint64_t state);
+ IRsend _irsend;
+};
+
+#endif // IR_MIDEA_H_
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Mitsubishi.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Mitsubishi.cpp
new file mode 100644
index 000000000000..b092c27b9573
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Mitsubishi.cpp
@@ -0,0 +1,714 @@
+// Copyright 2009 Ken Shirriff
+// Copyright 2017-2018 David Conran
+// Copyright 2018 Denes Varga
+
+#include "ir_Mitsubishi.h"
+#include
+#ifndef ARDUINO
+#include
+#endif
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRutils.h"
+
+// MMMMM IIIII TTTTT SSSS U U BBBB IIIII SSSS H H IIIII
+// M M M I T S U U B B I S H H I
+// M M M I T SSS U U BBBB I SSS HHHHH I
+// M M I T S U U B B I S H H I
+// M M IIIII T SSSS UUU BBBBB IIIII SSSS H H IIIII
+
+// Mitsubishi (TV) decoding added from https://github.com/z3t0/Arduino-IRremote
+// Mitsubishi (TV) sending & Mitsubishi A/C support added by David Conran
+
+// Constants
+// Mitsubishi TV
+// period time is 1/33000Hz = 30.303 uSeconds (T)
+// Ref:
+// GlobalCache's Control Tower's Mitsubishi TV data.
+// https://github.com/marcosamarinho/IRremoteESP8266/blob/master/ir_Mitsubishi.cpp
+const uint16_t kMitsubishiTick = 30;
+const uint16_t kMitsubishiBitMarkTicks = 10;
+const uint16_t kMitsubishiBitMark = kMitsubishiBitMarkTicks * kMitsubishiTick;
+const uint16_t kMitsubishiOneSpaceTicks = 70;
+const uint16_t kMitsubishiOneSpace = kMitsubishiOneSpaceTicks * kMitsubishiTick;
+const uint16_t kMitsubishiZeroSpaceTicks = 30;
+const uint16_t kMitsubishiZeroSpace =
+ kMitsubishiZeroSpaceTicks * kMitsubishiTick;
+const uint16_t kMitsubishiMinCommandLengthTicks = 1786;
+const uint16_t kMitsubishiMinCommandLength =
+ kMitsubishiMinCommandLengthTicks * kMitsubishiTick;
+const uint16_t kMitsubishiMinGapTicks = 936;
+const uint16_t kMitsubishiMinGap = kMitsubishiMinGapTicks * kMitsubishiTick;
+
+// Mitsubishi Projector (HC3000)
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/441
+
+const uint16_t kMitsubishi2HdrMark = 8400;
+const uint16_t kMitsubishi2HdrSpace = kMitsubishi2HdrMark / 2;
+const uint16_t kMitsubishi2BitMark = 560;
+const uint16_t kMitsubishi2ZeroSpace = 520;
+const uint16_t kMitsubishi2OneSpace = kMitsubishi2ZeroSpace * 3;
+const uint16_t kMitsubishi2MinGap = 28500;
+
+// Mitsubishi A/C
+// Ref:
+// https://github.com/r45635/HVAC-IR-Control/blob/master/HVAC_ESP8266/HVAC_ESP8266.ino#L84
+
+const uint16_t kMitsubishiAcHdrMark = 3400;
+const uint16_t kMitsubishiAcHdrSpace = 1750;
+const uint16_t kMitsubishiAcBitMark = 450;
+const uint16_t kMitsubishiAcOneSpace = 1300;
+const uint16_t kMitsubishiAcZeroSpace = 420;
+const uint16_t kMitsubishiAcRptMark = 440;
+const uint16_t kMitsubishiAcRptSpace = 17100;
+
+#if SEND_MITSUBISHI
+// Send a Mitsubishi message
+//
+// Args:
+// data: Contents of the message to be sent.
+// nbits: Nr. of bits of data to be sent. Typically kMitsubishiBits.
+// repeat: Nr. of additional times the message is to be sent.
+//
+// Status: ALPHA / untested.
+//
+// Notes:
+// This protocol appears to have no header.
+// Ref:
+// https://github.com/marcosamarinho/IRremoteESP8266/blob/master/ir_Mitsubishi.cpp
+// GlobalCache's Control Tower's Mitsubishi TV data.
+void IRsend::sendMitsubishi(uint64_t data, uint16_t nbits, uint16_t repeat) {
+ sendGeneric(0, 0, // No Header
+ kMitsubishiBitMark, kMitsubishiOneSpace, kMitsubishiBitMark,
+ kMitsubishiZeroSpace, kMitsubishiBitMark, kMitsubishiMinGap,
+ kMitsubishiMinCommandLength, data, nbits, 33, true, repeat, 50);
+}
+#endif // SEND_MITSUBISHI
+
+#if DECODE_MITSUBISHI
+// Decode the supplied Mitsubishi message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: Nr. of data bits to expect.
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: BETA / previously working.
+//
+// Notes:
+// This protocol appears to have no header.
+//
+// Ref:
+// GlobalCache's Control Tower's Mitsubishi TV data.
+bool IRrecv::decodeMitsubishi(decode_results *results, uint16_t nbits,
+ bool strict) {
+ if (results->rawlen < 2 * nbits + kFooter - 1)
+ return false; // Shorter than shortest possibly expected.
+ if (strict && nbits != kMitsubishiBits)
+ return false; // Request is out of spec.
+
+ uint16_t offset = kStartOffset;
+ uint64_t data = 0;
+
+ // No Header
+ // But try to auto-calibrate off the initial mark signal.
+ if (!matchMark(results->rawbuf[offset], kMitsubishiBitMark, 30)) return false;
+ // Calculate how long the common tick time is based on the initial mark.
+ uint32_t tick = results->rawbuf[offset] * kRawTick / kMitsubishiBitMarkTicks;
+
+ // Data
+ match_result_t data_result = matchData(
+ &(results->rawbuf[offset]), nbits, kMitsubishiBitMarkTicks * tick,
+ kMitsubishiOneSpaceTicks * tick, kMitsubishiBitMarkTicks * tick,
+ kMitsubishiZeroSpaceTicks * tick);
+ if (data_result.success == false) return false;
+ data = data_result.data;
+ offset += data_result.used;
+ uint16_t actualBits = data_result.used / 2;
+
+ // Footer
+ if (!matchMark(results->rawbuf[offset++], kMitsubishiBitMarkTicks * tick, 30))
+ return false;
+ if (offset < results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset], kMitsubishiMinGapTicks * tick))
+ return false;
+
+ // Compliance
+ if (actualBits < nbits) return false;
+ if (strict && actualBits != nbits) return false; // Not as we expected.
+
+ // Success
+ results->decode_type = MITSUBISHI;
+ results->bits = actualBits;
+ results->value = data;
+ results->address = 0;
+ results->command = 0;
+ return true;
+}
+#endif // DECODE_MITSUBISHI
+
+#if SEND_MITSUBISHI2
+// Send a Mitsubishi2 message
+//
+// Args:
+// data: Contents of the message to be sent.
+// nbits: Nr. of bits of data to be sent. Typically kMitsubishiBits.
+// repeat: Nr. of additional times the message is to be sent.
+//
+// Status: ALPHA / untested.
+//
+// Notes:
+// Based on a Mitsubishi HC3000 projector's remote.
+// This protocol appears to have a manditory in-protocol repeat.
+// That is in *addition* to the entire message needing to be sent twice
+// for the device to accept the command. That is separate from the repeat.
+// i.e. Allegedly, the real remote requires the "OFF" button pressed twice.
+// You will need to add a suitable gap yourself.
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/441
+void IRsend::sendMitsubishi2(uint64_t data, uint16_t nbits, uint16_t repeat) {
+ for (uint16_t i = 0; i <= repeat; i++) {
+ // First half of the data.
+ sendGeneric(kMitsubishi2HdrMark, kMitsubishi2HdrSpace, kMitsubishi2BitMark,
+ kMitsubishi2OneSpace, kMitsubishi2BitMark,
+ kMitsubishi2ZeroSpace, kMitsubishi2BitMark,
+ kMitsubishi2HdrSpace, data >> (nbits / 2), nbits / 2, 33, true,
+ 0, 50);
+ // Second half of the data.
+ sendGeneric(0, 0, // No header for the second data block
+ kMitsubishi2BitMark, kMitsubishi2OneSpace, kMitsubishi2BitMark,
+ kMitsubishi2ZeroSpace, kMitsubishi2BitMark, kMitsubishi2MinGap,
+ data & ((1 << (nbits / 2)) - 1), nbits / 2, 33, true, 0, 50);
+ }
+}
+#endif // SEND_MITSUBISHI2
+
+#if DECODE_MITSUBISHI2
+// Decode the supplied Mitsubishi2 message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: Nr. of data bits to expect.
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: BETA / Works with simulated data.
+//
+// Notes:
+// Hardware supported:
+// * Mitsubishi HC3000 projector's remote.
+//
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/441
+bool IRrecv::decodeMitsubishi2(decode_results *results, uint16_t nbits,
+ bool strict) {
+ if (results->rawlen < 2 * nbits + kHeader + (kFooter * 2) - 1)
+ return false; // Shorter than shortest possibly expected.
+ if (strict && nbits != kMitsubishiBits)
+ return false; // Request is out of spec.
+
+ uint16_t offset = kStartOffset;
+ uint64_t data = 0;
+ uint16_t actualBits = 0;
+
+ // Header
+ if (!matchMark(results->rawbuf[offset++], kMitsubishi2HdrMark)) return false;
+ if (!matchSpace(results->rawbuf[offset++], kMitsubishi2HdrSpace))
+ return false;
+ for (uint8_t i = 1; i <= 2; i++) {
+ // Data
+ match_result_t data_result = matchData(
+ &(results->rawbuf[offset]), nbits / 2, kMitsubishi2BitMark,
+ kMitsubishi2OneSpace, kMitsubishi2BitMark, kMitsubishi2ZeroSpace);
+ if (data_result.success == false) return false;
+ data <<= nbits / 2;
+ data += data_result.data;
+ offset += data_result.used;
+ actualBits += data_result.used / 2;
+
+ // Footer
+ if (!matchMark(results->rawbuf[offset++], kMitsubishi2BitMark))
+ return false;
+ if (i % 2) { // Every odd data block, we expect a HDR space.
+ if (!matchSpace(results->rawbuf[offset++], kMitsubishi2HdrSpace))
+ return false;
+ } else { // Every even data block, we expect Min Gap or end of the message.
+ if (offset < results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset++], kMitsubishi2MinGap))
+ return false;
+ }
+ }
+
+ // Compliance
+ if (actualBits < nbits) return false;
+ if (strict && actualBits != nbits) return false; // Not as we expected.
+
+ // Success
+ results->decode_type = MITSUBISHI2;
+ results->bits = actualBits;
+ results->value = data;
+ results->address = data >> actualBits / 2;
+ results->command = data & ((1 << (actualBits / 2)) - 1);
+ return true;
+}
+#endif // DECODE_MITSUBISHI2
+
+#if SEND_MITSUBISHI_AC
+// Send a Mitsubishi A/C message.
+//
+// Args:
+// data: An array of bytes containing the IR command.
+// nbytes: Nr. of bytes of data in the array. (>=kMitsubishiACStateLength)
+// repeat: Nr. of times the message is to be repeated.
+// (Default = kMitsubishiACMinRepeat).
+//
+// Status: BETA / Appears to be working.
+//
+void IRsend::sendMitsubishiAC(unsigned char data[], uint16_t nbytes,
+ uint16_t repeat) {
+ if (nbytes < kMitsubishiACStateLength)
+ return; // Not enough bytes to send a proper message.
+
+ sendGeneric(kMitsubishiAcHdrMark, kMitsubishiAcHdrSpace, kMitsubishiAcBitMark,
+ kMitsubishiAcOneSpace, kMitsubishiAcBitMark,
+ kMitsubishiAcZeroSpace, kMitsubishiAcRptMark,
+ kMitsubishiAcRptSpace, data, nbytes, 38, false, repeat, 50);
+}
+#endif // SEND_MITSUBISHI_AC
+
+#if DECODE_MITSUBISHI_AC
+// Decode the supplied Mitsubishi message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: Nr. of data bits to expect.
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: ALPHA / Under development
+//
+// Ref:
+// https://www.analysir.com/blog/2015/01/06/reverse-engineering-mitsubishi-ac-infrared-protocol/
+bool IRrecv::decodeMitsubishiAC(decode_results *results, uint16_t nbits,
+ bool strict) {
+ if (results->rawlen < ((kMitsubishiACBits * 2) + 2)) {
+ DPRINTLN("Shorter than shortest possibly expected.");
+ return false; // Shorter than shortest possibly expected.
+ }
+ if (strict && nbits != kMitsubishiACBits) {
+ DPRINTLN("Request is out of spec.");
+ return false; // Request is out of spec.
+ }
+ uint16_t offset = kStartOffset;
+ for (uint8_t i = 0; i < kMitsubishiACStateLength; i++) {
+ results->state[i] = 0;
+ }
+ bool failure = false;
+ uint8_t rep = 0;
+ do {
+ failure = false;
+ // Header:
+ // Somtime happens that junk signals arrives before the real message
+ bool headerFound = false;
+ while (!headerFound &&
+ offset < (results->rawlen - (kMitsubishiACBits * 2 + 2))) {
+ headerFound =
+ matchMark(results->rawbuf[offset++], kMitsubishiAcHdrMark) &&
+ matchSpace(results->rawbuf[offset++], kMitsubishiAcHdrSpace);
+ }
+ if (!headerFound) {
+ DPRINTLN("Header mark not found.");
+ failure = true;
+ }
+ // Decode byte-by-byte:
+ match_result_t data_result;
+ for (uint8_t i = 0; i < kMitsubishiACStateLength && !failure; i++) {
+ results->state[i] = 0;
+ data_result =
+ matchData(&(results->rawbuf[offset]), 8, kMitsubishiAcBitMark,
+ kMitsubishiAcOneSpace, kMitsubishiAcBitMark,
+ kMitsubishiAcZeroSpace, kTolerance, kMarkExcess, false);
+ if (data_result.success == false) {
+ failure = true;
+ DPRINT("Byte decode failed at #");
+ DPRINTLN((uint16_t)i);
+ } else {
+ results->state[i] = data_result.data;
+ offset += data_result.used;
+ DPRINT((uint16_t)results->state[i]);
+ DPRINT(",");
+ }
+ DPRINTLN("");
+ }
+ // HEADER validation:
+ if (failure || results->state[0] != 0x23 || results->state[1] != 0xCB ||
+ results->state[2] != 0x26 || results->state[3] != 0x01 ||
+ results->state[4] != 0x00) {
+ DPRINTLN("Header mismatch.");
+ failure = true;
+ } else {
+ // DATA part:
+
+ // FOOTER checksum:
+ if (IRMitsubishiAC::calculateChecksum(results->state) !=
+ results->state[kMitsubishiACStateLength - 1]) {
+ DPRINTLN("Checksum error.");
+ failure = true;
+ }
+ }
+ if (rep != kMitsubishiACMinRepeat && failure) {
+ bool repeatMarkFound = false;
+ while (!repeatMarkFound &&
+ offset < (results->rawlen - (kMitsubishiACBits * 2 + 4))) {
+ repeatMarkFound =
+ matchMark(results->rawbuf[offset++], kMitsubishiAcRptMark) &&
+ matchSpace(results->rawbuf[offset++], kMitsubishiAcRptSpace);
+ }
+ if (!repeatMarkFound) {
+ DPRINTLN("First attempt failure and repeat mark not found.");
+ return false;
+ }
+ }
+ rep++;
+ // Check if the repeat is correct if we need strict decode:
+ if (strict && !failure) {
+ DPRINTLN("Strict repeat check enabled.");
+ // Repeat mark and space:
+ if (!matchMark(results->rawbuf[offset++], kMitsubishiAcRptMark) ||
+ !matchSpace(results->rawbuf[offset++], kMitsubishiAcRptSpace)) {
+ DPRINTLN("Repeat mark error.");
+ return false;
+ }
+ // Header mark and space:
+ if (!matchMark(results->rawbuf[offset++], kMitsubishiAcHdrMark) ||
+ !matchSpace(results->rawbuf[offset++], kMitsubishiAcHdrSpace)) {
+ DPRINTLN("Repeat header error.");
+ return false;
+ }
+ // Payload:
+ for (uint8_t i = 0; i < kMitsubishiACStateLength; i++) {
+ data_result =
+ matchData(&(results->rawbuf[offset]), 8, kMitsubishiAcBitMark,
+ kMitsubishiAcOneSpace, kMitsubishiAcBitMark,
+ kMitsubishiAcZeroSpace, kTolerance, kMarkExcess, false);
+ if (data_result.success == false ||
+ data_result.data != results->state[i]) {
+ DPRINTLN("Repeat payload error.");
+ return false;
+ }
+ offset += data_result.used;
+ }
+ } // strict repeat check
+ } while (failure && rep <= kMitsubishiACMinRepeat);
+ results->decode_type = MITSUBISHI_AC;
+ results->bits = kMitsubishiACStateLength * 8;
+ return true;
+}
+#endif // DECODE_MITSUBISHI_AC
+
+// Code to emulate Mitsubishi A/C IR remote control unit.
+// Inspired and derived from the work done at:
+// https://github.com/r45635/HVAC-IR-Control
+//
+// Warning: Consider this very alpha code. Seems to work, but not validated.
+//
+// Equipment it seems compatible with:
+// *
+// Initialise the object.
+IRMitsubishiAC::IRMitsubishiAC(uint16_t pin) : _irsend(pin) { stateReset(); }
+
+// Reset the state of the remote to a known good state/sequence.
+void IRMitsubishiAC::stateReset() {
+ // The state of the IR remote in IR code form.
+ // Known good state obtained from:
+ // https://github.com/r45635/HVAC-IR-Control/blob/master/HVAC_ESP8266/HVAC_ESP8266.ino#L108
+ // Note: Can't use the following because it requires -std=c++11
+ // uint8_t known_good_state[kMitsubishiACStateLength] = {
+ // 0x23, 0xCB, 0x26, 0x01, 0x00, 0x20, 0x08, 0x06, 0x30, 0x45, 0x67, 0x00,
+ // 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F};
+ remote_state[0] = 0x23;
+ remote_state[1] = 0xCB;
+ remote_state[2] = 0x26;
+ remote_state[3] = 0x01;
+ remote_state[4] = 0x00;
+ remote_state[5] = 0x20;
+ remote_state[6] = 0x08;
+ remote_state[7] = 0x06;
+ remote_state[8] = 0x30;
+ remote_state[9] = 0x45;
+ remote_state[10] = 0x67;
+ for (uint8_t i = 11; i < kMitsubishiACStateLength - 1; i++)
+ remote_state[i] = 0;
+ remote_state[kMitsubishiACStateLength - 1] = 0x1F;
+ checksum(); // Calculate the checksum
+}
+
+// Configure the pin for output.
+void IRMitsubishiAC::begin() { _irsend.begin(); }
+
+#if SEND_MITSUBISHI_AC
+// Send the current desired state to the IR LED.
+void IRMitsubishiAC::send() {
+ checksum(); // Ensure correct checksum before sending.
+ _irsend.sendMitsubishiAC(remote_state);
+}
+#endif // SEND_MITSUBISHI_AC
+
+// Return a pointer to the internal state date of the remote.
+uint8_t *IRMitsubishiAC::getRaw() {
+ checksum();
+ return remote_state;
+}
+
+void IRMitsubishiAC::setRaw(uint8_t *data) {
+ for (uint8_t i = 0; i < (kMitsubishiACStateLength - 1); i++) {
+ remote_state[i] = data[i];
+ }
+ checksum();
+}
+
+// Calculate the checksum for the current internal state of the remote.
+void IRMitsubishiAC::checksum() {
+ remote_state[17] = calculateChecksum(remote_state);
+}
+
+uint8_t IRMitsubishiAC::calculateChecksum(uint8_t *data) {
+ uint8_t sum = 0;
+ // Checksum is simple addition of all previous bytes stored
+ // as an 8 bit value.
+ for (uint8_t i = 0; i < 17; i++) sum += data[i];
+ return sum & 0xFFU;
+}
+
+// Set the requested power state of the A/C to off.
+void IRMitsubishiAC::on() {
+ // state = ON;
+ remote_state[5] |= kMitsubishiAcPower;
+}
+
+// Set the requested power state of the A/C to off.
+void IRMitsubishiAC::off() {
+ // state = OFF;
+ remote_state[5] &= ~kMitsubishiAcPower;
+}
+
+// Set the requested power state of the A/C.
+void IRMitsubishiAC::setPower(bool state) {
+ if (state)
+ on();
+ else
+ off();
+}
+
+// Return the requested power state of the A/C.
+bool IRMitsubishiAC::getPower() {
+ return ((remote_state[5] & kMitsubishiAcPower) != 0);
+}
+
+// Set the temp. in deg C
+void IRMitsubishiAC::setTemp(uint8_t temp) {
+ temp = std::max((uint8_t)kMitsubishiAcMinTemp, temp);
+ temp = std::min((uint8_t)kMitsubishiAcMaxTemp, temp);
+ remote_state[7] = temp - kMitsubishiAcMinTemp;
+}
+
+// Return the set temp. in deg C
+uint8_t IRMitsubishiAC::getTemp() {
+ return (remote_state[7] + kMitsubishiAcMinTemp);
+}
+
+// Set the speed of the fan, 0-6.
+// 0 is auto, 1-5 is the speed, 6 is silent.
+void IRMitsubishiAC::setFan(uint8_t fan) {
+ // Bounds check
+ if (fan > kMitsubishiAcFanSilent)
+ fan = kMitsubishiAcFanMax; // Set the fan to maximum if out of range.
+ if (fan == kMitsubishiAcFanAuto) { // Automatic is a special case.
+ remote_state[9] = 0b10000000 | (remote_state[9] & 0b01111000);
+ return;
+ } else if (fan >= kMitsubishiAcFanMax) {
+ fan--; // There is no spoon^H^H^Heed 5 (max), pretend it doesn't exist.
+ }
+ remote_state[9] &= 0b01111000; // Clear the previous state
+ remote_state[9] |= fan;
+}
+
+// Return the requested state of the unit's fan.
+uint8_t IRMitsubishiAC::getFan() {
+ uint8_t fan = remote_state[9] & 0b111;
+ if (fan == kMitsubishiAcFanMax) return kMitsubishiAcFanSilent;
+ return fan;
+}
+
+// Return the requested climate operation mode of the a/c unit.
+uint8_t IRMitsubishiAC::getMode() { return (remote_state[6]); }
+
+// Set the requested climate operation mode of the a/c unit.
+void IRMitsubishiAC::setMode(uint8_t mode) {
+ // If we get an unexpected mode, default to AUTO.
+ switch (mode) {
+ case kMitsubishiAcAuto:
+ remote_state[8] = 0b00110000;
+ break;
+ case kMitsubishiAcCool:
+ remote_state[8] = 0b00110110;
+ break;
+ case kMitsubishiAcDry:
+ remote_state[8] = 0b00110010;
+ break;
+ case kMitsubishiAcHeat:
+ remote_state[8] = 0b00110000;
+ break;
+ default:
+ mode = kMitsubishiAcAuto;
+ remote_state[8] = 0b00110000;
+ }
+ remote_state[6] = mode;
+}
+
+// Set the requested vane operation mode of the a/c unit.
+void IRMitsubishiAC::setVane(uint8_t mode) {
+ mode = std::min(mode, (uint8_t)0b111); // bounds check
+ mode |= 0b1000;
+ mode <<= 3;
+ remote_state[9] &= 0b11000111; // Clear the previous setting.
+ remote_state[9] |= mode;
+}
+
+// Return the requested vane operation mode of the a/c unit.
+uint8_t IRMitsubishiAC::getVane() {
+ return ((remote_state[9] & 0b00111000) >> 3);
+}
+
+// Return the clock setting of the message. 1=1/6 hour. e.g. 4pm = 48
+uint8_t IRMitsubishiAC::getClock() { return remote_state[10]; }
+
+// Set the current time. 1 = 1/6 hour. e.g. 6am = 36.
+void IRMitsubishiAC::setClock(uint8_t clock) { remote_state[10] = clock; }
+
+// Return the desired start time. 1 = 1/6 hour. e.g. 1am = 6
+uint8_t IRMitsubishiAC::getStartClock() { return remote_state[12]; }
+
+// Set the desired start tiem of the AC. 1 = 1/6 hour. e.g. 8pm = 120
+void IRMitsubishiAC::setStartClock(uint8_t clock) { remote_state[12] = clock; }
+
+// Return the desired stop time of the AC. 1 = 1/6 hour. e.g 10pm = 132
+uint8_t IRMitsubishiAC::getStopClock() { return remote_state[11]; }
+
+// Set the desired stop time of the AC. 1 = 1/6 hour. e.g 10pm = 132
+void IRMitsubishiAC::setStopClock(uint8_t clock) { remote_state[11] = clock; }
+
+// Return the timer setting. Possible values: kMitsubishiAcNoTimer,
+// kMitsubishiAcStartTimer, kMitsubishiAcStopTimer,
+// kMitsubishiAcStartStopTimer
+uint8_t IRMitsubishiAC::getTimer() { return remote_state[13] & 0b111; }
+
+// Set the timer setting. Possible values: kMitsubishiAcNoTimer,
+// kMitsubishiAcStartTimer, kMitsubishiAcStopTimer,
+// kMitsubishiAcStartStopTimer
+void IRMitsubishiAC::setTimer(uint8_t timer) {
+ remote_state[13] = timer & 0b111;
+}
+
+#ifdef ARDUINO
+String IRMitsubishiAC::timeToString(uint64_t time) {
+ String result = "";
+#else
+std::string IRMitsubishiAC::timeToString(uint64_t time) {
+ std::string result = "";
+#endif // ARDUINO
+ if (time / 6 < 10) result += "0";
+ result += uint64ToString(time / 6);
+ result += ":";
+ if (time * 10 % 60 < 10) result += "0";
+ result += uint64ToString(time * 10 % 60);
+ return result;
+}
+
+// Convert the internal state into a human readable string.
+#ifdef ARDUINO
+String IRMitsubishiAC::toString() {
+ String result = "";
+#else
+std::string IRMitsubishiAC::toString() {
+ std::string result = "";
+#endif // ARDUINO
+ result += "Power: ";
+ if (getPower())
+ result += "On";
+ else
+ result += "Off";
+ switch (getMode()) {
+ case MITSUBISHI_AC_AUTO:
+ result += " (AUTO)";
+ break;
+ case MITSUBISHI_AC_COOL:
+ result += " (COOL)";
+ break;
+ case MITSUBISHI_AC_DRY:
+ result += " (DRY)";
+ break;
+ case MITSUBISHI_AC_HEAT:
+ result += " (HEAT)";
+ break;
+ default:
+ result += " (UNKNOWN)";
+ }
+ result += ", Temp: " + uint64ToString(getTemp()) + "C";
+ result += ", FAN: ";
+ switch (getFan()) {
+ case MITSUBISHI_AC_FAN_AUTO:
+ result += "AUTO";
+ break;
+ case MITSUBISHI_AC_FAN_MAX:
+ result += "MAX";
+ break;
+ case MITSUBISHI_AC_FAN_SILENT:
+ result += "SILENT";
+ break;
+ default:
+ result += uint64ToString(getFan());
+ }
+ result += ", VANE: ";
+ switch (getVane()) {
+ case MITSUBISHI_AC_VANE_AUTO:
+ result += "AUTO";
+ break;
+ case MITSUBISHI_AC_VANE_AUTO_MOVE:
+ result += "AUTO MOVE";
+ break;
+ default:
+ result += uint64ToString(getVane());
+ }
+ result += ", Time: ";
+ result += timeToString(getClock());
+ result += ", On timer: ";
+ result += timeToString(getStartClock());
+ result += ", Off timer: ";
+ result += timeToString(getStopClock());
+ result += ", Timer: ";
+ switch (getTimer()) {
+ case kMitsubishiAcNoTimer:
+ result += "-";
+ break;
+ case kMitsubishiAcStartTimer:
+ result += "Start";
+ break;
+ case kMitsubishiAcStopTimer:
+ result += "Stop";
+ break;
+ case kMitsubishiAcStartStopTimer:
+ result += "Start+Stop";
+ break;
+ default:
+ result += "? (";
+ result += getTimer();
+ result += ")\n";
+ }
+ return result;
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Mitsubishi.h b/lib/IRremoteESP8266-2.5.2.03/src/ir_Mitsubishi.h
new file mode 100644
index 000000000000..7b03efce6463
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Mitsubishi.h
@@ -0,0 +1,109 @@
+// Copyright 2009 Ken Shirriff
+// Copyright 2017 David Conran
+#ifndef IR_MITSUBISHI_H_
+#define IR_MITSUBISHI_H_
+
+#define __STDC_LIMIT_MACROS
+#include
+#ifndef UNIT_TEST
+#include
+#else
+#include
+#endif
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+
+// MMMMM IIIII TTTTT SSSS U U BBBB IIIII SSSS H H IIIII
+// M M M I T S U U B B I S H H I
+// M M M I T SSS U U BBBB I SSS HHHHH I
+// M M I T S U U B B I S H H I
+// M M IIIII T SSSS UUU BBBBB IIIII SSSS H H IIIII
+
+// Mitsubishi (TV) decoding added from https://github.com/z3t0/Arduino-IRremote
+// Mitsubishi (TV) sending & Mitsubishi A/C support added by David Conran
+
+// Constants
+const uint8_t kMitsubishiAcAuto = 0x20;
+const uint8_t kMitsubishiAcCool = 0x18;
+const uint8_t kMitsubishiAcDry = 0x10;
+const uint8_t kMitsubishiAcHeat = 0x08;
+const uint8_t kMitsubishiAcPower = 0x20;
+const uint8_t kMitsubishiAcFanAuto = 0;
+const uint8_t kMitsubishiAcFanMax = 5;
+const uint8_t kMitsubishiAcFanRealMax = 4;
+const uint8_t kMitsubishiAcFanSilent = 6;
+const uint8_t kMitsubishiAcMinTemp = 16; // 16C
+const uint8_t kMitsubishiAcMaxTemp = 31; // 31C
+const uint8_t kMitsubishiAcVaneAuto = 0;
+const uint8_t kMitsubishiAcVaneAutoMove = 7;
+const uint8_t kMitsubishiAcNoTimer = 0;
+const uint8_t kMitsubishiAcStartTimer = 5;
+const uint8_t kMitsubishiAcStopTimer = 3;
+const uint8_t kMitsubishiAcStartStopTimer = 7;
+
+// Legacy defines (Deprecated)
+#define MITSUBISHI_AC_VANE_AUTO_MOVE kMitsubishiAcVaneAutoMove
+#define MITSUBISHI_AC_VANE_AUTO kMitsubishiAcVaneAuto
+#define MITSUBISHI_AC_POWER kMitsubishiAcPower
+#define MITSUBISHI_AC_MIN_TEMP kMitsubishiAcMinTemp
+#define MITSUBISHI_AC_MAX_TEMP kMitsubishiAcMaxTemp
+#define MITSUBISHI_AC_HEAT kMitsubishiAcHeat
+#define MITSUBISHI_AC_FAN_SILENT kMitsubishiAcFanSilent
+#define MITSUBISHI_AC_FAN_REAL_MAX kMitsubishiAcFanRealMax
+#define MITSUBISHI_AC_FAN_MAX kMitsubishiAcFanMax
+#define MITSUBISHI_AC_FAN_AUTO kMitsubishiAcFanAuto
+#define MITSUBISHI_AC_DRY kMitsubishiAcDry
+#define MITSUBISHI_AC_COOL kMitsubishiAcCool
+#define MITSUBISHI_AC_AUTO kMitsubishiAcAuto
+
+class IRMitsubishiAC {
+ public:
+ explicit IRMitsubishiAC(uint16_t pin);
+
+ static uint8_t calculateChecksum(uint8_t* data);
+
+ void stateReset();
+#if SEND_MITSUBISHI_AC
+ void send();
+#endif // SEND_MITSUBISHI_AC
+ void begin();
+ void on();
+ void off();
+ void setPower(bool state);
+ bool getPower();
+ void setTemp(uint8_t temp);
+ uint8_t getTemp();
+ void setFan(uint8_t fan);
+ uint8_t getFan();
+ void setMode(uint8_t mode);
+ uint8_t getMode();
+ void setVane(uint8_t mode);
+ uint8_t getVane();
+ uint8_t* getRaw();
+ void setRaw(uint8_t* data);
+ uint8_t getClock();
+ void setClock(uint8_t clock);
+ uint8_t getStartClock();
+ void setStartClock(uint8_t clock);
+ uint8_t getStopClock();
+ void setStopClock(uint8_t clock);
+ uint8_t getTimer();
+ void setTimer(uint8_t timer);
+#ifdef ARDUINO
+ String toString();
+#else
+ std::string toString();
+#endif
+
+ private:
+#ifdef ARDUINO
+ String timeToString(uint64_t time);
+#else
+ std::string timeToString(uint64_t time);
+#endif
+ uint8_t remote_state[kMitsubishiACStateLength];
+ void checksum();
+ IRsend _irsend;
+};
+
+#endif // IR_MITSUBISHI_H_
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_NEC.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_NEC.cpp
similarity index 53%
rename from lib/IRremoteESP8266-2.2.1.02/src/ir_NEC.cpp
rename to lib/IRremoteESP8266-2.5.2.03/src/ir_NEC.cpp
index a5febe1b8656..660b5110957a 100644
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_NEC.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_NEC.cpp
@@ -2,11 +2,11 @@
// Copyright 2017 David Conran
#define __STDC_LIMIT_MACROS
+#include "ir_NEC.h"
#include
#include
#include "IRrecv.h"
#include "IRsend.h"
-#include "IRtimer.h"
#include "IRutils.h"
// N N EEEEE CCCC
@@ -17,39 +17,13 @@
// NEC originally added from https://github.com/shirriff/Arduino-IRremote/
-// Constants
-// Ref:
-// http://www.sbprojects.com/knowledge/ir/nec.php
-#define NEC_TICK 560U
-#define NEC_HDR_MARK_TICKS 16U
-#define NEC_HDR_MARK (NEC_HDR_MARK_TICKS * NEC_TICK)
-#define NEC_HDR_SPACE_TICKS 8U
-#define NEC_HDR_SPACE (NEC_HDR_SPACE_TICKS * NEC_TICK)
-#define NEC_BIT_MARK_TICKS 1U
-#define NEC_BIT_MARK (NEC_BIT_MARK_TICKS * NEC_TICK)
-#define NEC_ONE_SPACE_TICKS 3U
-#define NEC_ONE_SPACE (NEC_TICK * NEC_ONE_SPACE_TICKS)
-#define NEC_ZERO_SPACE_TICKS 1U
-#define NEC_ZERO_SPACE (NEC_TICK * NEC_ZERO_SPACE_TICKS)
-#define NEC_RPT_SPACE_TICKS 4U
-#define NEC_RPT_SPACE (NEC_RPT_SPACE_TICKS * NEC_TICK)
-#define NEC_RPT_LENGTH 4U
-#define NEC_MIN_COMMAND_LENGTH_TICKS 193U
-#define NEC_MIN_COMMAND_LENGTH (NEC_MIN_COMMAND_LENGTH_TICKS * NEC_TICK)
-#define NEC_MIN_GAP (NEC_MIN_COMMAND_LENGTH - \
- (NEC_HDR_MARK + NEC_HDR_SPACE + NEC_BITS * (NEC_BIT_MARK + NEC_ONE_SPACE) \
- + NEC_BIT_MARK))
-#define NEC_MIN_GAP_TICKS (NEC_MIN_COMMAND_LENGTH_TICKS - \
- (NEC_HDR_MARK_TICKS + NEC_HDR_SPACE_TICKS + \
- NEC_BITS * (NEC_BIT_MARK_TICKS + NEC_ONE_SPACE_TICKS) + \
- NEC_BIT_MARK_TICKS))
-
-#if (SEND_NEC || SEND_SHERWOOD || SEND_AIWA_RC_T501 || SEND_SANYO)
+#if (SEND_NEC || SEND_SHERWOOD || SEND_AIWA_RC_T501 || SEND_SANYO || \
+ SEND_PIONEER)
// Send a raw NEC(Renesas) formatted message.
//
// Args:
// data: The message to be sent.
-// nbits: The number of bits of the message to be sent. Typically NEC_BITS.
+// nbits: The number of bits of the message to be sent. Typically kNECBits.
// repeat: The number of times the command is to be repeated.
//
// Status: STABLE / Known working.
@@ -57,29 +31,17 @@
// Ref:
// http://www.sbprojects.com/knowledge/ir/nec.php
void IRsend::sendNEC(uint64_t data, uint16_t nbits, uint16_t repeat) {
- // Set 38kHz IR carrier frequency & a 1/3 (33%) duty cycle.
- enableIROut(38, 33);
- IRtimer usecs = IRtimer();
- // Header
- mark(NEC_HDR_MARK);
- space(NEC_HDR_SPACE);
- // Data
- sendData(NEC_BIT_MARK, NEC_ONE_SPACE, NEC_BIT_MARK, NEC_ZERO_SPACE,
- data, nbits, true);
- // Footer
- mark(NEC_BIT_MARK);
- // Gap to next command.
- space(std::max(NEC_MIN_GAP, NEC_MIN_COMMAND_LENGTH - usecs.elapsed()));
-
+ sendGeneric(kNecHdrMark, kNecHdrSpace, kNecBitMark, kNecOneSpace, kNecBitMark,
+ kNecZeroSpace, kNecBitMark, kNecMinGap, kNecMinCommandLength,
+ data, nbits, 38, true, 0, // Repeats are handled later.
+ 33);
// Optional command repeat sequence.
- for (uint16_t i = 0; i < repeat; i++) {
- usecs.reset();
- mark(NEC_HDR_MARK);
- space(NEC_RPT_SPACE);
- mark(NEC_BIT_MARK);
- // Gap till next command.
- space(std::max(NEC_MIN_GAP, NEC_MIN_COMMAND_LENGTH - usecs.elapsed()));
- }
+ if (repeat)
+ sendGeneric(kNecHdrMark, kNecRptSpace, 0, 0, 0, 0, // No actual data sent.
+ kNecBitMark, kNecMinGap, kNecMinCommandLength, 0,
+ 0, // No data to be sent.
+ 38, true, repeat - 1, // We've already sent a one message.
+ 33);
}
// Calculate the raw NEC data based on address and command.
@@ -97,8 +59,8 @@ uint32_t IRsend::encodeNEC(uint16_t address, uint16_t command) {
command &= 0xFF; // We only want the least significant byte of command.
// sendNEC() sends MSB first, but protocol says this is LSB first.
command = reverseBits(command, 8);
- command = (command << 8) + (command ^ 0xFF); // Calculate the new command.
- if (address > 0xFF) { // Is it Extended NEC?
+ command = (command << 8) + (command ^ 0xFF); // Calculate the new command.
+ if (address > 0xFF) { // Is it Extended NEC?
address = reverseBits(address, 16);
return ((address << 16) + command); // Extended.
} else {
@@ -113,7 +75,7 @@ uint32_t IRsend::encodeNEC(uint16_t address, uint16_t command) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
-// nbits: The number of data bits to expect. Typically NEC_BITS.
+// nbits: The number of data bits to expect. Typically kNECBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
// boolean: True if it can decode it, false if it can't.
@@ -122,34 +84,33 @@ uint32_t IRsend::encodeNEC(uint16_t address, uint16_t command) {
//
// Notes:
// NEC protocol has three varients/forms.
-// Normal: a 8 bit address & a 8 bit command in 32 bit data form.
+// Normal: an 8 bit address & an 8 bit command in 32 bit data form.
// i.e. address + inverted(address) + command + inverted(command)
-// Extended: a 16 bit address & a 8 bit command in 32 bit data form.
+// Extended: a 16 bit address & an 8 bit command in 32 bit data form.
// i.e. address + command + inverted(command)
// Repeat: a 0-bit code. i.e. No data bits. Just the header + footer.
//
// Ref:
// http://www.sbprojects.com/knowledge/ir/nec.php
bool IRrecv::decodeNEC(decode_results *results, uint16_t nbits, bool strict) {
- if (results->rawlen < 2 * nbits + HEADER + FOOTER - 1 &&
- results->rawlen != NEC_RPT_LENGTH)
+ if (results->rawlen < 2 * nbits + kHeader + kFooter - 1 &&
+ results->rawlen != kNecRptLength)
return false; // Can't possibly be a valid NEC message.
- if (strict && nbits != NEC_BITS)
+ if (strict && nbits != kNECBits)
return false; // Not strictly an NEC message.
uint64_t data = 0;
- uint16_t offset = OFFSET_START;
+ uint16_t offset = kStartOffset;
// Header
- if (!matchMark(results->rawbuf[offset], NEC_HDR_MARK)) return false;
+ if (!matchMark(results->rawbuf[offset], kNecHdrMark)) return false;
// Calculate how long the lowest tick time is based on the header mark.
- uint32_t mark_tick = results->rawbuf[offset++] * RAWTICK /
- NEC_HDR_MARK_TICKS;
+ uint32_t mark_tick = results->rawbuf[offset++] * kRawTick / kNecHdrMarkTicks;
// Check if it is a repeat code.
- if (results->rawlen == NEC_RPT_LENGTH &&
- matchSpace(results->rawbuf[offset], NEC_RPT_SPACE) &&
- matchMark(results->rawbuf[offset + 1], NEC_BIT_MARK_TICKS * mark_tick)) {
- results->value = REPEAT;
+ if (results->rawlen == kNecRptLength &&
+ matchSpace(results->rawbuf[offset], kNecRptSpace) &&
+ matchMark(results->rawbuf[offset + 1], kNecBitMarkTicks * mark_tick)) {
+ results->value = kRepeat;
results->decode_type = NEC;
results->bits = 0;
results->address = 0;
@@ -159,34 +120,32 @@ bool IRrecv::decodeNEC(decode_results *results, uint16_t nbits, bool strict) {
}
// Header (cont.)
- if (!matchSpace(results->rawbuf[offset], NEC_HDR_SPACE)) return false;
+ if (!matchSpace(results->rawbuf[offset], kNecHdrSpace)) return false;
// Calculate how long the common tick time is based on the header space.
- uint32_t space_tick = results->rawbuf[offset++] * RAWTICK /
- NEC_HDR_SPACE_TICKS;
+ uint32_t space_tick =
+ results->rawbuf[offset++] * kRawTick / kNecHdrSpaceTicks;
// Data
- match_result_t data_result = matchData(&(results->rawbuf[offset]), nbits,
- NEC_BIT_MARK_TICKS * mark_tick,
- NEC_ONE_SPACE_TICKS * space_tick,
- NEC_BIT_MARK_TICKS * mark_tick,
- NEC_ZERO_SPACE_TICKS * space_tick);
+ match_result_t data_result =
+ matchData(&(results->rawbuf[offset]), nbits, kNecBitMarkTicks * mark_tick,
+ kNecOneSpaceTicks * space_tick, kNecBitMarkTicks * mark_tick,
+ kNecZeroSpaceTicks * space_tick);
if (data_result.success == false) return false;
data = data_result.data;
offset += data_result.used;
// Footer
- if (!matchMark(results->rawbuf[offset++], NEC_BIT_MARK_TICKS * mark_tick))
- return false;
- if (offset <= results->rawlen &&
- !matchAtLeast(results->rawbuf[offset], NEC_MIN_GAP_TICKS * space_tick))
+ if (!matchMark(results->rawbuf[offset++], kNecBitMarkTicks * mark_tick))
+ return false;
+ if (offset < results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset], kNecMinGapTicks * space_tick))
return false;
// Compliance
// Calculate command and optionally enforce integrity checking.
- uint8_t command = (data & 0xFF00) >> 8;
+ uint8_t command = (data & 0xFF00) >> 8;
// Command is sent twice, once as plain and then inverted.
if ((command ^ 0xFF) != (data & 0xFF)) {
- if (strict)
- return false; // Command integrity failed.
+ if (strict) return false; // Command integrity failed.
command = 0; // The command value isn't valid, so default to zero.
}
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_NEC.h b/lib/IRremoteESP8266-2.5.2.03/src/ir_NEC.h
new file mode 100644
index 000000000000..c274c104ef65
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_NEC.h
@@ -0,0 +1,46 @@
+// Copyright 2009 Ken Shirriff
+// Copyright 2017, 2018 David Conran
+
+#ifndef IR_NEC_H_
+#define IR_NEC_H_
+
+#include
+#include "IRremoteESP8266.h"
+
+// N N EEEEE CCCC
+// NN N E C
+// N N N EEE C
+// N NN E C
+// N N EEEEE CCCC
+
+// NEC originally added from https://github.com/shirriff/Arduino-IRremote/
+
+// Constants
+// Ref:
+// http://www.sbprojects.com/knowledge/ir/nec.php
+const uint16_t kNecTick = 560;
+const uint16_t kNecHdrMarkTicks = 16;
+const uint16_t kNecHdrMark = kNecHdrMarkTicks * kNecTick;
+const uint16_t kNecHdrSpaceTicks = 8;
+const uint16_t kNecHdrSpace = kNecHdrSpaceTicks * kNecTick;
+const uint16_t kNecBitMarkTicks = 1;
+const uint16_t kNecBitMark = kNecBitMarkTicks * kNecTick;
+const uint16_t kNecOneSpaceTicks = 3;
+const uint16_t kNecOneSpace = kNecOneSpaceTicks * kNecTick;
+const uint16_t kNecZeroSpaceTicks = 1;
+const uint16_t kNecZeroSpace = kNecZeroSpaceTicks * kNecTick;
+const uint16_t kNecRptSpaceTicks = 4;
+const uint16_t kNecRptSpace = kNecRptSpaceTicks * kNecTick;
+const uint16_t kNecRptLength = 4;
+const uint16_t kNecMinCommandLengthTicks = 193;
+const uint32_t kNecMinCommandLength = kNecMinCommandLengthTicks * kNecTick;
+const uint32_t kNecMinGap =
+ kNecMinCommandLength -
+ (kNecHdrMark + kNecHdrSpace + kNECBits * (kNecBitMark + kNecOneSpace) +
+ kNecBitMark);
+const uint16_t kNecMinGapTicks =
+ kNecMinCommandLengthTicks -
+ (kNecHdrMarkTicks + kNecHdrSpaceTicks +
+ kNECBits * (kNecBitMarkTicks + kNecOneSpaceTicks) + kNecBitMarkTicks);
+
+#endif // IR_NEC_H_
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Nikai.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Nikai.cpp
new file mode 100644
index 000000000000..9ac22a849912
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Nikai.cpp
@@ -0,0 +1,104 @@
+// Copyright 2009 Ken Shirriff
+// Copyright 2017 David Conran
+
+#include
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRutils.h"
+
+// NN NN IIIII KK KK AAA IIIII
+// NNN NN III KK KK AAAAA III
+// NN N NN III KKKK AA AA III
+// NN NNN III KK KK AAAAAAA III
+// NN NN IIIII KK KK AA AA IIIII
+
+// Constants
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/309
+const uint16_t kNikaiTick = 500;
+const uint16_t kNikaiHdrMarkTicks = 8;
+const uint16_t kNikaiHdrMark = kNikaiHdrMarkTicks * kNikaiTick;
+const uint16_t kNikaiHdrSpaceTicks = 8;
+const uint16_t kNikaiHdrSpace = kNikaiHdrSpaceTicks * kNikaiTick;
+const uint16_t kNikaiBitMarkTicks = 1;
+const uint16_t kNikaiBitMark = kNikaiBitMarkTicks * kNikaiTick;
+const uint16_t kNikaiOneSpaceTicks = 2;
+const uint16_t kNikaiOneSpace = kNikaiOneSpaceTicks * kNikaiTick;
+const uint16_t kNikaiZeroSpaceTicks = 4;
+const uint16_t kNikaiZeroSpace = kNikaiZeroSpaceTicks * kNikaiTick;
+const uint16_t kNikaiMinGapTicks = 17;
+const uint16_t kNikaiMinGap = kNikaiMinGapTicks * kNikaiTick;
+
+#if SEND_NIKAI
+// Send a Nikai TV formatted message.
+//
+// Args:
+// data: The message to be sent.
+// nbits: The bit size of the message being sent. typically kNikaiBits.
+// repeat: The number of times the message is to be repeated.
+//
+// Status: STABLE / Working.
+//
+// Ref: https://github.com/markszabo/IRremoteESP8266/issues/309
+void IRsend::sendNikai(uint64_t data, uint16_t nbits, uint16_t repeat) {
+ sendGeneric(kNikaiHdrMark, kNikaiHdrSpace, kNikaiBitMark, kNikaiOneSpace,
+ kNikaiBitMark, kNikaiZeroSpace, kNikaiBitMark, kNikaiMinGap, data,
+ nbits, 38, true, repeat, 33);
+}
+#endif
+
+#if DECODE_NIKAI
+// Decode the supplied Nikai message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: Nr. of bits to expect in the data portion.
+// Typically kNikaiBits.
+// strict: Flag to indicate if we strictly adhere to the specification.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: STABLE / Working.
+//
+bool IRrecv::decodeNikai(decode_results *results, uint16_t nbits, bool strict) {
+ if (results->rawlen < 2 * nbits + kHeader + kFooter - 1)
+ return false; // Can't possibly be a valid Nikai message.
+ if (strict && nbits != kNikaiBits)
+ return false; // We expect Nikai to be a certain sized message.
+
+ uint64_t data = 0;
+ uint16_t offset = kStartOffset;
+
+ // Header
+ if (!matchMark(results->rawbuf[offset], kNikaiHdrMark)) return false;
+ // Calculate how long the common tick time is based on the header mark.
+ uint32_t m_tick = results->rawbuf[offset++] * kRawTick / kNikaiHdrMarkTicks;
+ if (!matchSpace(results->rawbuf[offset], kNikaiHdrSpace)) return false;
+ // Calculate how long the common tick time is based on the header space.
+ uint32_t s_tick = results->rawbuf[offset++] * kRawTick / kNikaiHdrSpaceTicks;
+ // Data
+ match_result_t data_result =
+ matchData(&(results->rawbuf[offset]), nbits, kNikaiBitMarkTicks * m_tick,
+ kNikaiOneSpaceTicks * s_tick, kNikaiBitMarkTicks * m_tick,
+ kNikaiZeroSpaceTicks * s_tick);
+ if (data_result.success == false) return false;
+ data = data_result.data;
+ offset += data_result.used;
+ // Footer
+ if (!matchMark(results->rawbuf[offset++], kNikaiBitMarkTicks * m_tick))
+ return false;
+ if (offset < results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset], kNikaiMinGapTicks * s_tick))
+ return false;
+
+ // Compliance
+
+ // Success
+ results->bits = nbits;
+ results->value = data;
+ results->decode_type = NIKAI;
+ results->command = 0;
+ results->address = 0;
+ return true;
+}
+#endif
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Panasonic.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Panasonic.cpp
new file mode 100644
index 000000000000..e79b136a5430
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Panasonic.cpp
@@ -0,0 +1,863 @@
+// Copyright 2015 Kristian Lauszus
+// Copyright 2017, 2018 David Conran
+
+#include "ir_Panasonic.h"
+#include
+#ifndef ARDUINO
+#include
+#endif
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRutils.h"
+
+// PPPP AAA N N AAA SSSS OOO N N IIIII CCCC
+// P P A A NN N A A S O O NN N I C
+// PPPP AAAAA N N N AAAAA SSS O O N N N I C
+// P A A N NN A A S O O N NN I C
+// P A A N N A A SSSS OOO N N IIIII CCCC
+
+// Panasonic protocol originally added by Kristian Lauszus from:
+// https://github.com/z3t0/Arduino-IRremote
+// (Thanks to zenwheel and other people at the original blog post)
+//
+// Panasonic A/C support add by crankyoldgit but heavily influenced by:
+// https://github.com/ToniA/ESPEasy/blob/HeatpumpIR/lib/HeatpumpIR/PanasonicHeatpumpIR.cpp
+// Panasonic A/C Clock & Timer support:
+// Reverse Engineering by MikkelTb
+// Code by crankyoldgit
+// Panasonic A/C models supported:
+// A/C Series/models:
+// JKE, LKE, DKE, CKP, & NKE series. (In theory)
+// CS-YW9MKD (confirmed)
+// CS-ME14CKPG / CS-ME12CKPG / CS-ME10CKPG
+// A/C Remotes:
+// A75C3747 (confirmed)
+// A75C3704
+// A75C2311 (CKP)
+
+// Constants
+// Ref:
+// http://www.remotecentral.com/cgi-bin/mboard/rc-pronto/thread.cgi?26152
+
+const uint16_t kPanasonicTick = 432;
+const uint16_t kPanasonicHdrMarkTicks = 8;
+const uint16_t kPanasonicHdrMark = kPanasonicHdrMarkTicks * kPanasonicTick;
+const uint16_t kPanasonicHdrSpaceTicks = 4;
+const uint16_t kPanasonicHdrSpace = kPanasonicHdrSpaceTicks * kPanasonicTick;
+const uint16_t kPanasonicBitMarkTicks = 1;
+const uint16_t kPanasonicBitMark = kPanasonicBitMarkTicks * kPanasonicTick;
+const uint16_t kPanasonicOneSpaceTicks = 3;
+const uint16_t kPanasonicOneSpace = kPanasonicOneSpaceTicks * kPanasonicTick;
+const uint16_t kPanasonicZeroSpaceTicks = 1;
+const uint16_t kPanasonicZeroSpace = kPanasonicZeroSpaceTicks * kPanasonicTick;
+const uint16_t kPanasonicMinCommandLengthTicks = 378;
+const uint32_t kPanasonicMinCommandLength =
+ kPanasonicMinCommandLengthTicks * kPanasonicTick;
+const uint16_t kPanasonicEndGap = 5000; // See issue #245
+const uint16_t kPanasonicMinGapTicks =
+ kPanasonicMinCommandLengthTicks -
+ (kPanasonicHdrMarkTicks + kPanasonicHdrSpaceTicks +
+ kPanasonicBits * (kPanasonicBitMarkTicks + kPanasonicOneSpaceTicks) +
+ kPanasonicBitMarkTicks);
+const uint32_t kPanasonicMinGap = kPanasonicMinGapTicks * kPanasonicTick;
+
+const uint16_t kPanasonicAcSectionGap = 10000;
+const uint16_t kPanasonicAcSection1Length = 8;
+const uint32_t kPanasonicAcMessageGap = 100000; // A complete guess.
+
+#if (SEND_PANASONIC || SEND_DENON)
+// Send a Panasonic formatted message.
+//
+// Args:
+// data: The message to be sent.
+// nbits: The number of bits of the message to be sent. (kPanasonicBits).
+// repeat: The number of times the command is to be repeated.
+//
+// Status: BETA / Should be working.
+//
+// Note:
+// This protocol is a modified version of Kaseikyo.
+void IRsend::sendPanasonic64(uint64_t data, uint16_t nbits, uint16_t repeat) {
+ sendGeneric(kPanasonicHdrMark, kPanasonicHdrSpace, kPanasonicBitMark,
+ kPanasonicOneSpace, kPanasonicBitMark, kPanasonicZeroSpace,
+ kPanasonicBitMark, kPanasonicMinGap, kPanasonicMinCommandLength,
+ data, nbits, kPanasonicFreq, true, repeat, 50);
+}
+
+// Send a Panasonic formatted message.
+//
+// Args:
+// address: The manufacturer code.
+// data: The data portion to be sent.
+// nbits: The number of bits of the message to be sent. (kPanasonicBits).
+// repeat: The number of times the command is to be repeated.
+//
+// Status: STABLE.
+//
+// Note:
+// This protocol is a modified version of Kaseikyo.
+void IRsend::sendPanasonic(uint16_t address, uint32_t data, uint16_t nbits,
+ uint16_t repeat) {
+ sendPanasonic64(((uint64_t)address << 32) | (uint64_t)data, nbits, repeat);
+}
+
+// Calculate the raw Panasonic data based on device, subdevice, & function.
+//
+// Args:
+// manufacturer: A 16-bit manufacturer code. e.g. 0x4004 is Panasonic.
+// device: An 8-bit code.
+// subdevice: An 8-bit code.
+// function: An 8-bit code.
+// Returns:
+// A raw uint64_t Panasonic message.
+//
+// Status: BETA / Should be working..
+//
+// Note:
+// Panasonic 48-bit protocol is a modified version of Kaseikyo.
+// Ref:
+// http://www.remotecentral.com/cgi-bin/mboard/rc-pronto/thread.cgi?2615
+uint64_t IRsend::encodePanasonic(uint16_t manufacturer, uint8_t device,
+ uint8_t subdevice, uint8_t function) {
+ uint8_t checksum = device ^ subdevice ^ function;
+ return (((uint64_t)manufacturer << 32) | ((uint64_t)device << 24) |
+ ((uint64_t)subdevice << 16) | ((uint64_t)function << 8) | checksum);
+}
+#endif // (SEND_PANASONIC || SEND_DENON)
+
+#if (DECODE_PANASONIC || DECODE_DENON)
+// Decode the supplied Panasonic message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: Nr. of data bits to expect.
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: BETA / Should be working.
+// Note:
+// Panasonic 48-bit protocol is a modified version of Kaseikyo.
+// Ref:
+// http://www.remotecentral.com/cgi-bin/mboard/rc-pronto/thread.cgi?26152
+// http://www.hifi-remote.com/wiki/index.php?title=Panasonic
+bool IRrecv::decodePanasonic(decode_results *results, uint16_t nbits,
+ bool strict, uint32_t manufacturer) {
+ if (results->rawlen < 2 * nbits + kHeader + kFooter - 1)
+ return false; // Not enough entries to be a Panasonic message.
+ if (strict && nbits != kPanasonicBits)
+ return false; // Request is out of spec.
+
+ uint64_t data = 0;
+ uint16_t offset = kStartOffset;
+
+ // Header
+ if (!matchMark(results->rawbuf[offset], kPanasonicHdrMark)) return false;
+ // Calculate how long the common tick time is based on the header mark.
+ uint32_t m_tick =
+ results->rawbuf[offset++] * kRawTick / kPanasonicHdrMarkTicks;
+ if (!matchSpace(results->rawbuf[offset], kPanasonicHdrSpace)) return false;
+ // Calculate how long the common tick time is based on the header space.
+ uint32_t s_tick =
+ results->rawbuf[offset++] * kRawTick / kPanasonicHdrSpaceTicks;
+
+ // Data
+ match_result_t data_result = matchData(
+ &(results->rawbuf[offset]), nbits, kPanasonicBitMarkTicks * m_tick,
+ kPanasonicOneSpaceTicks * s_tick, kPanasonicBitMarkTicks * m_tick,
+ kPanasonicZeroSpaceTicks * s_tick);
+ if (data_result.success == false) return false;
+ data = data_result.data;
+ offset += data_result.used;
+
+ // Footer
+ if (!match(results->rawbuf[offset++], kPanasonicBitMarkTicks * m_tick))
+ return false;
+ if (offset < results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset], kPanasonicEndGap))
+ return false;
+
+ // Compliance
+ uint32_t address = data >> 32;
+ uint32_t command = data & 0xFFFFFFFF;
+ if (strict) {
+ if (address != manufacturer) // Verify the Manufacturer code.
+ return false;
+ // Verify the checksum.
+ uint8_t checksumOrig = data & 0xFF;
+ uint8_t checksumCalc = ((data >> 24) ^ (data >> 16) ^ (data >> 8)) & 0xFF;
+ if (checksumOrig != checksumCalc) return false;
+ }
+
+ // Success
+ results->value = data;
+ results->address = address;
+ results->command = command;
+ results->decode_type = PANASONIC;
+ results->bits = nbits;
+ return true;
+}
+#endif // (DECODE_PANASONIC || DECODE_DENON)
+
+#if SEND_PANASONIC_AC
+// Send a Panasonic A/C message.
+//
+// Args:
+// data: Contents of the message to be sent. (Guessing MSBF order)
+// nbits: Nr. of bits of data to be sent. Typically kPanasonicAcBits.
+// repeat: Nr. of additional times the message is to be sent.
+//
+// Status: Beta / Appears to work with real device(s).
+//:
+// Panasonic A/C models supported:
+// A/C Series/models:
+// JKE, LKE, DKE, & NKE series.
+// CS-YW9MKD
+// A/C Remotes:
+// A75C3747
+// A75C3704
+//
+void IRsend::sendPanasonicAC(uint8_t data[], uint16_t nbytes, uint16_t repeat) {
+ if (nbytes < kPanasonicAcSection1Length) return;
+ for (uint16_t r = 0; r <= repeat; r++) {
+ // First section. (8 bytes)
+ sendGeneric(kPanasonicHdrMark, kPanasonicHdrSpace, kPanasonicBitMark,
+ kPanasonicOneSpace, kPanasonicBitMark, kPanasonicZeroSpace,
+ kPanasonicBitMark, kPanasonicAcSectionGap, data,
+ kPanasonicAcSection1Length, kPanasonicFreq, false, 0, 50);
+ // First section. (The rest of the data bytes)
+ sendGeneric(kPanasonicHdrMark, kPanasonicHdrSpace, kPanasonicBitMark,
+ kPanasonicOneSpace, kPanasonicBitMark, kPanasonicZeroSpace,
+ kPanasonicBitMark, kPanasonicAcMessageGap,
+ data + kPanasonicAcSection1Length,
+ nbytes - kPanasonicAcSection1Length, kPanasonicFreq, false, 0,
+ 50);
+ }
+}
+#endif // SEND_PANASONIC_AC
+
+IRPanasonicAc::IRPanasonicAc(uint16_t pin) : _irsend(pin) { stateReset(); }
+
+void IRPanasonicAc::stateReset() {
+ for (uint8_t i = 0; i < kPanasonicAcStateLength; i++)
+ remote_state[i] = kPanasonicKnownGoodState[i];
+ _temp = 25; // An initial saved desired temp. Completely made up.
+ _swingh = kPanasonicAcSwingHMiddle; // A similar made up value for H Swing.
+}
+
+void IRPanasonicAc::begin() { _irsend.begin(); }
+
+// Verify the checksum is valid for a given state.
+// Args:
+// state: The array to verify the checksum of.
+// length: The size of the state.
+// Returns:
+// A boolean.
+bool IRPanasonicAc::validChecksum(uint8_t state[], const uint16_t length) {
+ if (length < 2) return false; // 1 byte of data can't have a checksum.
+ return (state[length - 1] ==
+ sumBytes(state, length - 1, kPanasonicAcChecksumInit));
+}
+
+uint8_t IRPanasonicAc::calcChecksum(uint8_t state[], const uint16_t length) {
+ return sumBytes(state, length - 1, kPanasonicAcChecksumInit);
+}
+
+void IRPanasonicAc::fixChecksum(const uint16_t length) {
+ remote_state[length - 1] = calcChecksum(remote_state, length);
+}
+
+#if SEND_PANASONIC_AC
+void IRPanasonicAc::send() {
+ fixChecksum();
+ _irsend.sendPanasonicAC(remote_state);
+}
+#endif // SEND_PANASONIC_AC
+
+void IRPanasonicAc::setModel(const panasonic_ac_remote_model_t model) {
+ switch (model) {
+ case kPanasonicDke:
+ case kPanasonicJke:
+ case kPanasonicLke:
+ case kPanasonicNke:
+ case kPanasonicCkp:
+ break;
+ default: // Only proceed if we know what to do.
+ return;
+ }
+ // clear & set the various bits and bytes.
+ remote_state[13] &= 0xF0;
+ remote_state[17] = 0x00;
+ remote_state[21] &= 0b11101111;
+ remote_state[23] = 0x81;
+ remote_state[25] = 0x00;
+
+ switch (model) {
+ case kPanasonicLke:
+ remote_state[13] |= 0x02;
+ remote_state[17] = 0x06;
+ break;
+ case kPanasonicDke:
+ remote_state[23] = 0x01;
+ remote_state[25] = 0x06;
+ // Has to be done last as setSwingHorizontal has model check built-in
+ setSwingHorizontal(_swingh);
+ break;
+ case kPanasonicNke:
+ remote_state[17] = 0x06;
+ break;
+ case kPanasonicJke:
+ break;
+ case kPanasonicCkp:
+ remote_state[21] |= 0x10;
+ remote_state[23] = 0x01;
+ default:
+ break;
+ }
+}
+
+panasonic_ac_remote_model_t IRPanasonicAc::getModel() {
+ if (remote_state[17] == 0x00) {
+ if ((remote_state[21] & 0x10) && (remote_state[23] & 0x01))
+ return kPanasonicCkp;
+ if (remote_state[23] & 0x80) return kPanasonicJke;
+ }
+ if (remote_state[17] == 0x06 && (remote_state[13] & 0x0F) == 0x02)
+ return kPanasonicLke;
+ if (remote_state[23] == 0x01) return kPanasonicDke;
+ if (remote_state[17] == 0x06) return kPanasonicNke;
+ return kPanasonicUnknown;
+}
+
+uint8_t *IRPanasonicAc::getRaw() {
+ fixChecksum();
+ return remote_state;
+}
+
+void IRPanasonicAc::setRaw(const uint8_t state[]) {
+ for (uint8_t i = 0; i < kPanasonicAcStateLength; i++) {
+ remote_state[i] = state[i];
+ }
+}
+
+// Control the power state of the A/C unit.
+//
+// For CKP models, the remote has no memory of the power state the A/C unit
+// should be in. For those models setting this on/true will toggle the power
+// state of the Panasonic A/C unit with the next meessage.
+// e.g. If the A/C unit is already on, setPower(true) will turn it off.
+// If the A/C unit is already off, setPower(true) will turn it on.
+// setPower(false) will leave the A/C power state as it was.
+//
+// For all other models, setPower(true) should set the internal state to
+// turn it on, and setPower(false) should turn it off.
+void IRPanasonicAc::setPower(const bool state) {
+ if (state)
+ on();
+ else
+ off();
+}
+
+// Return the A/C power state of the remote.
+// Except for CKP models, where it returns if the power state will be toggled
+// on the A/C unit when the next message is sent.
+bool IRPanasonicAc::getPower() {
+ return (remote_state[13] & kPanasonicAcPower) == kPanasonicAcPower;
+}
+
+void IRPanasonicAc::on() { remote_state[13] |= kPanasonicAcPower; }
+
+void IRPanasonicAc::off() { remote_state[13] &= ~kPanasonicAcPower; }
+
+uint8_t IRPanasonicAc::getMode() { return remote_state[13] >> 4; }
+
+void IRPanasonicAc::setMode(const uint8_t desired) {
+ uint8_t mode = kPanasonicAcAuto; // Default to Auto mode.
+ switch (desired) {
+ case kPanasonicAcFan:
+ // Allegedly Fan mode has a temperature of 27.
+ setTemp(kPanasonicAcFanModeTemp, false);
+ mode = desired;
+ break;
+ case kPanasonicAcAuto:
+ case kPanasonicAcCool:
+ case kPanasonicAcHeat:
+ case kPanasonicAcDry:
+ mode = desired;
+ // Set the temp to the saved temp, just incase our previous mode was Fan.
+ setTemp(_temp);
+ break;
+ }
+ remote_state[13] &= 0x0F; // Clear the previous mode bits.
+ remote_state[13] |= mode << 4;
+}
+
+uint8_t IRPanasonicAc::getTemp() { return remote_state[14] >> 1; }
+
+// Set the desitred temperature in Celcius.
+// Args:
+// celsius: The temperature to set the A/C unit to.
+// remember: A boolean flag for the class to remember the temperature.
+//
+// Automatically safely limits the temp to the operating range supported.
+void IRPanasonicAc::setTemp(const uint8_t celsius, const bool remember) {
+ uint8_t temperature;
+ temperature = std::max(celsius, kPanasonicAcMinTemp);
+ temperature = std::min(temperature, kPanasonicAcMaxTemp);
+ remote_state[14] = temperature << 1;
+ if (remember) _temp = temperature;
+}
+
+uint8_t IRPanasonicAc::getSwingVertical() { return remote_state[16] & 0x0F; }
+
+void IRPanasonicAc::setSwingVertical(const uint8_t desired_elevation) {
+ uint8_t elevation = desired_elevation;
+ if (elevation != kPanasonicAcSwingVAuto) {
+ elevation = std::max(elevation, kPanasonicAcSwingVUp);
+ elevation = std::min(elevation, kPanasonicAcSwingVDown);
+ }
+ remote_state[16] &= 0xF0;
+ remote_state[16] |= elevation;
+}
+
+uint8_t IRPanasonicAc::getSwingHorizontal() { return remote_state[17]; }
+
+void IRPanasonicAc::setSwingHorizontal(const uint8_t desired_direction) {
+ switch (desired_direction) {
+ case kPanasonicAcSwingHAuto:
+ case kPanasonicAcSwingHMiddle:
+ case kPanasonicAcSwingHFullLeft:
+ case kPanasonicAcSwingHLeft:
+ case kPanasonicAcSwingHRight:
+ case kPanasonicAcSwingHFullRight:
+ break;
+ default: // Ignore anything that isn't valid.
+ return;
+ }
+ _swingh = desired_direction; // Store the direction for later.
+ uint8_t direction = desired_direction;
+ switch (getModel()) {
+ case kPanasonicDke:
+ break;
+ case kPanasonicNke:
+ case kPanasonicLke:
+ direction = kPanasonicAcSwingHMiddle;
+ break;
+ default: // Ignore everything else.
+ return;
+ }
+ remote_state[17] = direction;
+}
+
+void IRPanasonicAc::setFan(const uint8_t speed) {
+ if (speed <= kPanasonicAcFanMax || speed == kPanasonicAcFanAuto)
+ remote_state[16] =
+ (remote_state[16] & 0x0F) | ((speed + kPanasonicAcFanOffset) << 4);
+}
+
+uint8_t IRPanasonicAc::getFan() {
+ return (remote_state[16] >> 4) - kPanasonicAcFanOffset;
+}
+
+bool IRPanasonicAc::getQuiet() {
+ if (getModel() == kPanasonicCkp)
+ return remote_state[21] & kPanasonicAcQuietCkp;
+ else
+ return remote_state[21] & kPanasonicAcQuiet;
+}
+
+void IRPanasonicAc::setQuiet(const bool state) {
+ uint8_t quiet;
+ if (getModel() == kPanasonicCkp)
+ quiet = kPanasonicAcQuietCkp;
+ else
+ quiet = kPanasonicAcQuiet;
+
+ if (state) {
+ setPowerful(false); // Powerful is mutually exclusive.
+ remote_state[21] |= quiet;
+ } else {
+ remote_state[21] &= ~quiet;
+ }
+}
+
+bool IRPanasonicAc::getPowerful() {
+ if (getModel() == kPanasonicCkp)
+ return remote_state[21] & kPanasonicAcPowerfulCkp;
+ else
+ return remote_state[21] & kPanasonicAcPowerful;
+}
+
+void IRPanasonicAc::setPowerful(const bool state) {
+ uint8_t powerful;
+ if (getModel() == kPanasonicCkp)
+ powerful = kPanasonicAcPowerfulCkp;
+ else
+ powerful = kPanasonicAcPowerful;
+
+ if (state) {
+ setQuiet(false); // Quiet is mutually exclusive.
+ remote_state[21] |= powerful;
+ } else {
+ remote_state[21] &= ~powerful;
+ }
+}
+
+uint16_t IRPanasonicAc::encodeTime(const uint8_t hours, const uint8_t mins) {
+ return std::min(hours, (uint8_t)23) * 60 + std::min(mins, (uint8_t)59);
+}
+
+uint16_t IRPanasonicAc::getClock() {
+ uint16_t result = ((remote_state[25] & 0b00000111) << 8) + remote_state[24];
+ if (result == kPanasonicAcTimeSpecial) return 0;
+ return result;
+}
+
+void IRPanasonicAc::setClock(const uint16_t mins_since_midnight) {
+ uint16_t corrected = std::min(mins_since_midnight, kPanasonicAcTimeMax);
+ if (mins_since_midnight == kPanasonicAcTimeSpecial)
+ corrected = kPanasonicAcTimeSpecial;
+ remote_state[24] = corrected & 0xFF;
+ remote_state[25] &= 0b11111000;
+ remote_state[25] |= (corrected >> 8);
+}
+
+uint16_t IRPanasonicAc::getOnTimer() {
+ uint16_t result = ((remote_state[19] & 0b00000111) << 8) + remote_state[18];
+ if (result == kPanasonicAcTimeSpecial) return 0;
+ return result;
+}
+
+void IRPanasonicAc::setOnTimer(const uint16_t mins_since_midnight,
+ const bool enable) {
+ // Ensure it's on a 10 minute boundary and no overflow.
+ uint16_t corrected = std::min(mins_since_midnight, kPanasonicAcTimeMax);
+ corrected -= corrected % 10;
+ if (mins_since_midnight == kPanasonicAcTimeSpecial)
+ corrected = kPanasonicAcTimeSpecial;
+
+ if (enable)
+ remote_state[13] |= kPanasonicAcOnTimer; // Set the Ontimer flag.
+ else
+ remote_state[13] &= ~kPanasonicAcOnTimer; // Clear the Ontimer flag.
+ // Store the time.
+ remote_state[18] = corrected & 0xFF;
+ remote_state[19] &= 0b11111000;
+ remote_state[19] |= (corrected >> 8);
+}
+
+void IRPanasonicAc::cancelOnTimer() { setOnTimer(0, false); }
+
+bool IRPanasonicAc::isOnTimerEnabled() {
+ return remote_state[13] & kPanasonicAcOnTimer;
+}
+
+uint16_t IRPanasonicAc::getOffTimer() {
+ uint16_t result =
+ ((remote_state[20] & 0b01111111) << 4) + (remote_state[19] >> 4);
+ if (result == kPanasonicAcTimeSpecial) return 0;
+ return result;
+}
+
+void IRPanasonicAc::setOffTimer(const uint16_t mins_since_midnight,
+ const bool enable) {
+ // Ensure its on a 10 minute boundary and no overflow.
+ uint16_t corrected = std::min(mins_since_midnight, kPanasonicAcTimeMax);
+ corrected -= corrected % 10;
+ if (mins_since_midnight == kPanasonicAcTimeSpecial)
+ corrected = kPanasonicAcTimeSpecial;
+
+ if (enable)
+ remote_state[13] |= kPanasonicAcOffTimer; // Set the OffTimer flag.
+ else
+ remote_state[13] &= ~kPanasonicAcOffTimer; // Clear the OffTimer flag.
+ // Store the time.
+ remote_state[19] &= 0b00001111;
+ remote_state[19] |= (corrected & 0b00001111) << 4;
+ remote_state[20] &= 0b10000000;
+ remote_state[20] |= corrected >> 4;
+}
+
+void IRPanasonicAc::cancelOffTimer() { setOffTimer(0, false); }
+
+bool IRPanasonicAc::isOffTimerEnabled() {
+ return remote_state[13] & kPanasonicAcOffTimer;
+}
+
+#ifdef ARDUINO
+String IRPanasonicAc::timeToString(const uint16_t mins_since_midnight) {
+ String result = "";
+#else
+std::string IRPanasonicAc::timeToString(const uint16_t mins_since_midnight) {
+ std::string result = "";
+#endif // ARDUINO
+ result += uint64ToString(mins_since_midnight / 60) + ":";
+ uint8_t mins = mins_since_midnight % 60;
+ if (mins < 10) result += "0"; // Zero pad the minutes.
+ return result + uint64ToString(mins);
+}
+
+// Convert the internal state into a human readable string.
+#ifdef ARDUINO
+String IRPanasonicAc::toString() {
+ String result = "";
+#else
+std::string IRPanasonicAc::toString() {
+ std::string result = "";
+#endif // ARDUINO
+ result += "Model: " + uint64ToString(getModel());
+ switch (getModel()) {
+ case kPanasonicDke:
+ result += " (DKE)";
+ break;
+ case kPanasonicJke:
+ result += " (JKE)";
+ break;
+ case kPanasonicNke:
+ result += " (NKE)";
+ break;
+ case kPanasonicLke:
+ result += " (LKE)";
+ break;
+ case kPanasonicCkp:
+ result += " (CKP)";
+ break;
+ default:
+ result += " (UNKNOWN)";
+ }
+ result += ", Power: ";
+ if (getPower())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Mode: " + uint64ToString(getMode());
+ switch (getMode()) {
+ case kPanasonicAcAuto:
+ result += " (AUTO)";
+ break;
+ case kPanasonicAcCool:
+ result += " (COOL)";
+ break;
+ case kPanasonicAcHeat:
+ result += " (HEAT)";
+ break;
+ case kPanasonicAcDry:
+ result += " (DRY)";
+ break;
+ case kPanasonicAcFan:
+ result += " (FAN)";
+ break;
+ default:
+ result += " (UNKNOWN)";
+ }
+ result += ", Temp: " + uint64ToString(getTemp()) + "C";
+ result += ", Fan: " + uint64ToString(getFan());
+ switch (getFan()) {
+ case kPanasonicAcFanAuto:
+ result += " (AUTO)";
+ break;
+ case kPanasonicAcFanMax:
+ result += " (MAX)";
+ break;
+ case kPanasonicAcFanMin:
+ result += " (MIN)";
+ break;
+ default:
+ result += " (UNKNOWN)";
+ break;
+ }
+ result += ", Swing (Vertical): " + uint64ToString(getSwingVertical());
+ switch (getSwingVertical()) {
+ case kPanasonicAcSwingVAuto:
+ result += " (AUTO)";
+ break;
+ case kPanasonicAcSwingVUp:
+ result += " (Full Up)";
+ break;
+ case kPanasonicAcSwingVDown:
+ result += " (Full Down)";
+ break;
+ case 2:
+ case 3:
+ case 4:
+ break;
+ default:
+ result += " (UNKNOWN)";
+ break;
+ }
+ switch (getModel()) {
+ case kPanasonicJke:
+ case kPanasonicCkp:
+ break; // No Horizontal Swing support.
+ default:
+ result += ", Swing (Horizontal): " + uint64ToString(getSwingHorizontal());
+ switch (getSwingHorizontal()) {
+ case kPanasonicAcSwingHAuto:
+ result += " (AUTO)";
+ break;
+ case kPanasonicAcSwingHFullLeft:
+ result += " (Full Left)";
+ break;
+ case kPanasonicAcSwingHLeft:
+ result += " (Left)";
+ break;
+ case kPanasonicAcSwingHMiddle:
+ result += " (Middle)";
+ break;
+ case kPanasonicAcSwingHFullRight:
+ result += " (Full Right)";
+ break;
+ case kPanasonicAcSwingHRight:
+ result += " (Right)";
+ break;
+ default:
+ result += " (UNKNOWN)";
+ break;
+ }
+ }
+ result += ", Quiet: ";
+ if (getQuiet())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Powerful: ";
+ if (getPowerful())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Clock: " + timeToString(getClock());
+ result += ", On Timer: ";
+ if (isOnTimerEnabled())
+ result += timeToString(getOnTimer());
+ else
+ result += "Off";
+ result += ", Off Timer: ";
+ if (isOffTimerEnabled())
+ result += timeToString(getOffTimer());
+ else
+ result += "Off";
+ return result;
+}
+
+#if DECODE_PANASONIC_AC
+// Decode the supplied Panasonic AC message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: The number of data bits to expect. Typically kPanasonicAcBits.
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: Beta / Appears to work with real device(s).
+//
+// Panasonic A/C models supported:
+// A/C Series/models:
+// JKE, LKE, DKE, & NKE series.
+// CS-YW9MKD
+// A/C Remotes:
+// A75C3747 (Confirmed)
+// A75C3704
+bool IRrecv::decodePanasonicAC(decode_results *results, uint16_t nbits,
+ bool strict) {
+ if (nbits % 8 != 0) // nbits has to be a multiple of nr. of bits in a byte.
+ return false;
+
+ uint8_t min_nr_of_messages = 1;
+ if (strict) {
+ if (nbits != kPanasonicAcBits && nbits != kPanasonicAcShortBits)
+ return false; // Not strictly a PANASONIC_AC message.
+ }
+
+ if (results->rawlen <
+ min_nr_of_messages * (2 * nbits + kHeader + kFooter) - 1)
+ return false; // Can't possibly be a valid PANASONIC_AC message.
+
+ uint16_t dataBitsSoFar = 0;
+ uint16_t offset = kStartOffset;
+ match_result_t data_result;
+
+ // Header
+ if (!matchMark(results->rawbuf[offset], kPanasonicHdrMark,
+ kPanasonicAcTolerance, kPanasonicAcExcess))
+ return false;
+ // Calculate how long the common tick time is based on the header mark.
+ uint32_t m_tick =
+ results->rawbuf[offset++] * kRawTick / kPanasonicHdrMarkTicks;
+ if (!matchSpace(results->rawbuf[offset], kPanasonicHdrSpace,
+ kPanasonicAcTolerance, kPanasonicAcExcess))
+ return false;
+ // Calculate how long the common tick time is based on the header space.
+ uint32_t s_tick =
+ results->rawbuf[offset++] * kRawTick / kPanasonicHdrSpaceTicks;
+
+ uint16_t i = 0;
+ // Data (Section #1)
+ // Keep reading bytes until we either run out of section or state to fill.
+ for (; offset <= results->rawlen - 16 && i < kPanasonicAcSection1Length;
+ i++, dataBitsSoFar += 8, offset += data_result.used) {
+ data_result = matchData(
+ &(results->rawbuf[offset]), 8, kPanasonicBitMarkTicks * m_tick,
+ kPanasonicOneSpaceTicks * s_tick, kPanasonicBitMarkTicks * m_tick,
+ kPanasonicZeroSpaceTicks * s_tick, kPanasonicAcTolerance,
+ kPanasonicAcExcess, false);
+ if (data_result.success == false) {
+ DPRINT("DEBUG: offset = ");
+ DPRINTLN(offset + data_result.used);
+ return false; // Fail
+ }
+ results->state[i] = data_result.data;
+ }
+ // Section footer.
+ if (!matchMark(results->rawbuf[offset++], kPanasonicBitMarkTicks * m_tick,
+ kPanasonicAcTolerance, kPanasonicAcExcess))
+ return false;
+ if (!matchSpace(results->rawbuf[offset++], kPanasonicAcSectionGap,
+ kPanasonicAcTolerance, kPanasonicAcExcess))
+ return false;
+ // Header.
+ if (!matchMark(results->rawbuf[offset++], kPanasonicHdrMarkTicks * m_tick,
+ kPanasonicAcTolerance, kPanasonicAcExcess))
+ return false;
+ if (!matchSpace(results->rawbuf[offset++], kPanasonicHdrSpaceTicks * s_tick,
+ kPanasonicAcTolerance, kPanasonicAcExcess))
+ return false;
+ // Data (Section #2)
+ // Keep reading bytes until we either run out of data.
+ for (; offset <= results->rawlen - 16 && i < nbits / 8;
+ i++, dataBitsSoFar += 8, offset += data_result.used) {
+ data_result = matchData(
+ &(results->rawbuf[offset]), 8, kPanasonicBitMarkTicks * m_tick,
+ kPanasonicOneSpaceTicks * s_tick, kPanasonicBitMarkTicks * m_tick,
+ kPanasonicZeroSpaceTicks * s_tick, kPanasonicAcTolerance,
+ kPanasonicAcExcess, false);
+ if (data_result.success == false) {
+ DPRINT("DEBUG: offset = ");
+ DPRINTLN(offset + data_result.used);
+ return false; // Fail
+ }
+ results->state[i] = data_result.data;
+ }
+ // Message Footer.
+ if (!matchMark(results->rawbuf[offset++], kPanasonicBitMarkTicks * m_tick,
+ kPanasonicAcTolerance, kPanasonicAcExcess))
+ return false;
+ if (offset <= results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset++], kPanasonicAcMessageGap))
+ return false;
+
+ // Compliance
+ if (strict) {
+ // Check the signatures of the section blocks. They start with 0x02& 0x20.
+ if (results->state[0] != 0x02 || results->state[1] != 0x20 ||
+ results->state[8] != 0x02 || results->state[9] != 0x20)
+ return false;
+ if (!IRPanasonicAc::validChecksum(results->state, nbits / 8)) return false;
+ }
+
+ // Success
+ results->decode_type = PANASONIC_AC;
+ results->bits = nbits;
+ return true;
+}
+#endif // DECODE_PANASONIC_AC
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Panasonic.h b/lib/IRremoteESP8266-2.5.2.03/src/ir_Panasonic.h
new file mode 100644
index 000000000000..762631fe79ea
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Panasonic.h
@@ -0,0 +1,145 @@
+// Copyright 2018 David Conran
+
+#ifndef IR_PANASONIC_H_
+#define IR_PANASONIC_H_
+
+#define __STDC_LIMIT_MACROS
+#include
+#ifdef ARDUINO
+#include
+#else
+#include
+#endif
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+
+// PPPP AAA N N AAA SSSS OOO N N IIIII CCCC
+// P P A A NN N A A S O O NN N I C
+// PPPP AAAAA N N N AAAAA SSS O O N N N I C
+// P A A N NN A A S O O N NN I C
+// P A A N N A A SSSS OOO N N IIIII CCCC
+
+// Panasonic A/C support heavily influenced by:
+// https://github.com/ToniA/ESPEasy/blob/HeatpumpIR/lib/HeatpumpIR/PanasonicHeatpumpIR.cpp
+
+// Constants
+const uint16_t kPanasonicFreq = 36700;
+const uint16_t kPanasonicAcExcess = 0;
+// Much higher than usual. See issue #540.
+const uint16_t kPanasonicAcTolerance = 40;
+
+const uint8_t kPanasonicAcAuto = 0; // 0b0000
+const uint8_t kPanasonicAcDry = 2; // 0b0010
+const uint8_t kPanasonicAcCool = 3; // 0b0011
+const uint8_t kPanasonicAcHeat = 4; // 0b0010
+const uint8_t kPanasonicAcFan = 6; // 0b0110
+const uint8_t kPanasonicAcFanMin = 0;
+const uint8_t kPanasonicAcFanMax = 4;
+const uint8_t kPanasonicAcFanAuto = 7;
+const uint8_t kPanasonicAcFanOffset = 3;
+const uint8_t kPanasonicAcPower = 1; // 0b1
+const uint8_t kPanasonicAcMinTemp = 16; // Celsius
+const uint8_t kPanasonicAcMaxTemp = 30; // Celsius
+const uint8_t kPanasonicAcFanModeTemp = 27; // Celsius
+const uint8_t kPanasonicAcQuiet = 1; // 0b1
+const uint8_t kPanasonicAcPowerful = 0x20; // 0b100000
+// CKP models have Powerful and Quiet bits swapped.
+const uint8_t kPanasonicAcQuietCkp = 0x20; // 0b100000
+const uint8_t kPanasonicAcPowerfulCkp = 1; // 0b1
+const uint8_t kPanasonicAcSwingVAuto = 0xF;
+const uint8_t kPanasonicAcSwingVUp = 0x1;
+const uint8_t kPanasonicAcSwingVDown = 0x5;
+const uint8_t kPanasonicAcSwingHAuto = 0xD;
+const uint8_t kPanasonicAcSwingHMiddle = 0x6;
+const uint8_t kPanasonicAcSwingHFullLeft = 0x9;
+const uint8_t kPanasonicAcSwingHLeft = 0xA;
+const uint8_t kPanasonicAcSwingHRight = 0xB;
+const uint8_t kPanasonicAcSwingHFullRight = 0xC;
+const uint8_t kPanasonicAcChecksumInit = 0xF4;
+const uint8_t kPanasonicAcOnTimer = 0b00000010;
+const uint8_t kPanasonicAcOffTimer = 0b00000100;
+const uint16_t kPanasonicAcTimeMax = 23 * 60 + 59; // Mins since midnight.
+const uint16_t kPanasonicAcTimeSpecial = 0x600;
+
+const uint8_t kPanasonicKnownGoodState[kPanasonicAcStateLength] = {
+ 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
+ 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
+ 0x00, 0x0E, 0xE0, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00};
+
+enum panasonic_ac_remote_model_t {
+ kPanasonicUnknown = 0,
+ kPanasonicLke = 1,
+ kPanasonicNke = 2,
+ kPanasonicDke = 3,
+ kPanasonicJke = 4,
+ kPanasonicCkp = 5,
+};
+
+class IRPanasonicAc {
+ public:
+ explicit IRPanasonicAc(uint16_t pin);
+
+ void stateReset();
+#if SEND_PANASONIC
+ void send();
+#endif // SEND_PANASONIC
+ void begin();
+ void on();
+ void off();
+ void setPower(const bool state);
+ bool getPower();
+ void setTemp(const uint8_t temp, const bool remember = true);
+ uint8_t getTemp();
+ void setFan(const uint8_t fan);
+ uint8_t getFan();
+ void setMode(const uint8_t mode);
+ uint8_t getMode();
+ void setRaw(const uint8_t state[]);
+ uint8_t *getRaw();
+ static bool validChecksum(uint8_t *state,
+ const uint16_t length = kPanasonicAcStateLength);
+ static uint8_t calcChecksum(uint8_t *state,
+ const uint16_t length = kPanasonicAcStateLength);
+ void setQuiet(const bool state);
+ bool getQuiet();
+ void setPowerful(const bool state);
+ bool getPowerful();
+ void setModel(const panasonic_ac_remote_model_t model);
+ panasonic_ac_remote_model_t getModel();
+ void setSwingVertical(const uint8_t elevation);
+ uint8_t getSwingVertical();
+ void setSwingHorizontal(const uint8_t direction);
+ uint8_t getSwingHorizontal();
+ static uint16_t encodeTime(const uint8_t hours, const uint8_t mins);
+ uint16_t getClock();
+ void setClock(const uint16_t mins_since_midnight);
+ uint16_t getOnTimer();
+ void setOnTimer(const uint16_t mins_since_midnight, const bool enable = true);
+ void cancelOnTimer();
+ bool isOnTimerEnabled();
+ uint16_t getOffTimer();
+ void setOffTimer(const uint16_t mins_since_midnight,
+ const bool enable = true);
+ void cancelOffTimer();
+ bool isOffTimerEnabled();
+#ifdef ARDUINO
+ String toString();
+ static String timeToString(const uint16_t mins_since_midnight);
+#else
+ std::string toString();
+ static std::string timeToString(const uint16_t mins_since_midnight);
+#endif
+#ifndef UNIT_TEST
+
+ private:
+#endif
+ uint8_t remote_state[kPanasonicAcStateLength];
+ uint8_t _swingh;
+ uint8_t _temp;
+ void fixChecksum(const uint16_t length = kPanasonicAcStateLength);
+ static uint8_t calcChecksum(const uint8_t *state,
+ const uint16_t length = kPanasonicAcStateLength);
+ IRsend _irsend;
+};
+
+#endif // IR_PANASONIC_H_
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Pioneer.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Pioneer.cpp
new file mode 100644
index 000000000000..9134e36966d6
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Pioneer.cpp
@@ -0,0 +1,143 @@
+// Copyright 2009 Ken Shirriff
+// Copyright 2017, 2018 David Conran
+// Copyright 2018 Kamil Palczewski
+
+#define __STDC_LIMIT_MACROS
+#include
+#include
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRutils.h"
+#include "ir_NEC.h"
+
+// PPPP III OOO N N EEEE EEEE RRRR
+// P P I O O NN N E E R R
+// PPPP I O O N N N EEE EEE RRRR
+// P I O O N NN E E R R
+// P III OOO N N EEEE EEEE R RR
+
+// Ref:
+// http://adrian-kingston.com/IRFormatPioneer.htm
+
+#if SEND_PIONEER
+// Send a raw Pioneer formatted message.
+//
+// Args:
+// data: The message to be sent.
+// nbits: The number of bits of the message to be sent.
+// Typically kPioneerBits.
+// repeat: The number of times the command is to be repeated.
+//
+// Status: BETA / Expected to be working.
+//
+// Ref:
+// http://adrian-kingston.com/IRFormatPioneer.htm
+void IRsend::sendPioneer(const uint64_t data, const uint16_t nbits,
+ const uint16_t repeat) {
+ // If nbits is to big, or is odd, abort.
+ if (nbits > sizeof(data) * 8 || nbits % 2 == 1) return;
+
+ // send 1st part of the code
+ sendNEC(data >> (nbits / 2), nbits / 2, 0);
+ // send 2nd part of the code
+ sendNEC(data & (((uint64_t)1 << (nbits / 2)) - 1), nbits / 2, repeat);
+}
+
+// Calculate the raw Pioneer data code based on two NEC sub-codes
+// Args:
+// address A 16-bit "published" NEC value.
+// command: A 16-bit "published" NEC value.
+// Returns:
+// A raw 64-bit Pioneer message code.
+//
+// Status: BETA / Expected to work.
+//
+// Note:
+// Address & Command can be take from a decode result OR from the spreadsheets
+// located at:
+// https://www.pioneerelectronics.com/PUSA/Support/Home-Entertainment-Custom-Install/IR+Codes/A+V+Receivers
+// where the first part is considered the address,
+// and the second the command.
+// e.g.
+// "A556+AF20" is an Address of 0xA556 & a Command of 0xAF20.
+uint64_t IRsend::encodePioneer(const uint16_t address, const uint16_t command) {
+ return (((uint64_t)encodeNEC(address >> 8, address & 0xFF)) << 32) |
+ encodeNEC(command >> 8, command & 0xFF);
+}
+#endif // SEND_PIONEER
+
+#if DECODE_PIONEER
+// Decode the supplied Pioneer message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: The number of data bits to expect. Typically kPioneerBits.
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: BETA / Should be working. (Self decodes & real examples)
+//
+bool IRrecv::decodePioneer(decode_results *results, const uint16_t nbits,
+ const bool strict) {
+ if (results->rawlen < 2 * (nbits + kHeader + kFooter) - 1)
+ return false; // Can't possibly be a valid Pioneer message.
+ if (strict && nbits != kPioneerBits)
+ return false; // Not strictly an Pioneer message.
+
+ uint64_t data = 0;
+ uint16_t offset = kStartOffset;
+
+ for (uint16_t section = 0; section < 2; section++) {
+ // Header
+ if (!matchMark(results->rawbuf[offset], kNecHdrMark)) return false;
+ // Calculate how long the lowest tick time is based on the header mark.
+ uint32_t mark_tick =
+ results->rawbuf[offset++] * kRawTick / kNecHdrMarkTicks;
+ if (!matchSpace(results->rawbuf[offset], kNecHdrSpace)) return false;
+ // Calculate how long the common tick time is based on the header space.
+ uint32_t space_tick =
+ results->rawbuf[offset++] * kRawTick / kNecHdrSpaceTicks;
+ //
+ // Data
+ match_result_t data_result = matchData(
+ &(results->rawbuf[offset]), nbits / 2, kNecBitMarkTicks * mark_tick,
+ kNecOneSpaceTicks * space_tick, kNecBitMarkTicks * mark_tick,
+ kNecZeroSpaceTicks * space_tick);
+ if (data_result.success == false) return false;
+ uint8_t command = data_result.data >> 8;
+ uint8_t command_inverted = data_result.data;
+ uint8_t address = data_result.data >> 24;
+ uint8_t address_inverted = data_result.data >> 16;
+ // Compliance
+ if (strict) {
+ if (command != (command_inverted ^ 0xFF))
+ return false; // Command integrity failed.
+ if (address != (address_inverted ^ 0xFF))
+ return false; // Address integrity failed.
+ }
+ data = (data << (nbits / 2)) + data_result.data;
+ offset += data_result.used;
+ // NEC-like commands and addresses are technically in LSB first order so the
+ // final versions have to be reversed.
+ uint16_t code = reverseBits((command << 8) + address, 16);
+ if (section)
+ results->command = code;
+ else
+ results->address = code;
+
+ // Footer
+ if (!matchMark(results->rawbuf[offset++], kNecBitMarkTicks * mark_tick))
+ return false;
+ if (offset < results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset++], kNecMinGapTicks * space_tick))
+ return false;
+ }
+
+ // Success
+ results->bits = nbits;
+ results->value = data;
+ results->decode_type = PIONEER;
+ return true;
+}
+#endif // DECODE_PIONEER
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Pronto.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Pronto.cpp
similarity index 81%
rename from lib/IRremoteESP8266-2.2.1.02/src/ir_Pronto.cpp
rename to lib/IRremoteESP8266-2.5.2.03/src/ir_Pronto.cpp
index ca76f0848b62..9ab5c76d0708 100644
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Pronto.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Pronto.cpp
@@ -2,7 +2,6 @@
#include
#include "IRsend.h"
-#include "IRtimer.h"
// PPPPPP tt
// PP PP rr rr oooo nn nnn tt oooo
@@ -11,12 +10,12 @@
// PP rr oooo nn nn tttt oooo
// Constants
-#define PRONTO_FREQ_FACTOR 0.241246
-#define PRONTO_TYPE_OFFSET 0U
-#define PRONTO_FREQ_OFFSET 1U
-#define PRONTO_SEQ_1_LEN_OFFSET 2U
-#define PRONTO_SEQ_2_LEN_OFFSET 3U
-#define PRONTO_DATA_OFFSET 4U
+const float kProntoFreqFactor = 0.241246;
+const uint16_t kProntoTypeOffset = 0;
+const uint16_t kProntoFreqOffset = 1;
+const uint16_t kProntoSeq1LenOffset = 2;
+const uint16_t kProntoSeq2LenOffset = 3;
+const uint16_t kProntoDataOffset = 4;
#if SEND_PRONTO
// Send a Pronto Code formatted message.
@@ -50,29 +49,29 @@
// 0x0030, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0030, 0x0018,
// 0x0018, 0x03f6};
// // Send the Pronto(Sony) code. Repeat twice as Sony's require that.
-// sendPronto(prontoCode, 46, SONY_MIN_REPEAT);
+// sendPronto(prontoCode, 46, kSonyMinRepeat);
//
// Ref:
// http://www.etcwiki.org/wiki/Pronto_Infrared_Format
// http://www.remotecentral.com/features/irdisp2.htm
void IRsend::sendPronto(uint16_t data[], uint16_t len, uint16_t repeat) {
// Check we have enough data to work out what to send.
- if (len < PRONTO_MIN_LENGTH) return;
+ if (len < kProntoMinLength) return;
// We only know how to deal with 'raw' pronto codes types. Reject all others.
- if (data[PRONTO_TYPE_OFFSET] != 0) return;
+ if (data[kProntoTypeOffset] != 0) return;
// Pronto frequency is in Hz.
- uint16_t hz = (uint16_t) (1000000U / (data[PRONTO_FREQ_OFFSET] *
- PRONTO_FREQ_FACTOR));
+ uint16_t hz =
+ (uint16_t)(1000000U / (data[kProntoFreqOffset] * kProntoFreqFactor));
enableIROut(hz);
// Grab the length of the two sequences.
- uint16_t seq_1_len = data[PRONTO_SEQ_1_LEN_OFFSET] * 2;
- uint16_t seq_2_len = data[PRONTO_SEQ_2_LEN_OFFSET] * 2;
+ uint16_t seq_1_len = data[kProntoSeq1LenOffset] * 2;
+ uint16_t seq_2_len = data[kProntoSeq2LenOffset] * 2;
// Calculate where each sequence starts in the buffer.
- uint16_t seq_1_start = PRONTO_DATA_OFFSET;
- uint16_t seq_2_start = PRONTO_DATA_OFFSET + seq_1_len;
+ uint16_t seq_1_start = kProntoDataOffset;
+ uint16_t seq_2_start = kProntoDataOffset + seq_1_len;
uint32_t periodic_time = calcUSecPeriod(hz, false);
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_RC5_RC6.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_RC5_RC6.cpp
similarity index 70%
rename from lib/IRremoteESP8266-2.2.1.02/src/ir_RC5_RC6.cpp
rename to lib/IRremoteESP8266-2.5.2.03/src/ir_RC5_RC6.cpp
index 65aaf88d7971..ef1500d60dcd 100644
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_RC5_RC6.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_RC5_RC6.cpp
@@ -21,30 +21,31 @@
// Ref:
// https://en.wikipedia.org/wiki/RC-5
// http://www.sbprojects.com/knowledge/ir/rc5.php
-#define MIN_RC5_SAMPLES 11U
-#define MIN_RC6_SAMPLES 1U
-#define RC5_T1 889U
-#define RC5_MIN_COMMAND_LENGTH 113778UL
-#define RC5_MIN_GAP (RC5_MIN_COMMAND_LENGTH - RC5_RAW_BITS * (2 * RC5_T1))
-#define RC5_TOGGLE_MASK 0x800U // (The 12th bit)
+
+const uint16_t kRc5T1 = 889;
+const uint32_t kRc5MinCommandLength = 113778;
+const uint32_t kRc5MinGap = kRc5MinCommandLength - kRC5RawBits * (2 * kRc5T1);
+const uint16_t kRc5ToggleMask = 0x800; // The 12th bit.
+const uint16_t kRc5SamplesMin = 11;
+
// RC-6
// Ref:
// https://en.wikipedia.org/wiki/RC-6
// http://www.pcbheaven.com/userpages/The_Philips_RC6_Protocol/
-#define RC6_TICK 444U
-#define RC6_HDR_MARK_TICKS 6U
-#define RC6_HDR_MARK (RC6_HDR_MARK_TICKS * RC6_TICK)
-#define RC6_HDR_SPACE_TICKS 2U
-#define RC6_HDR_SPACE (RC6_HDR_SPACE_TICKS * RC6_TICK)
-#define RC6_RPT_LENGTH_TICKS 187U
-#define RC6_RPT_LENGTH (RC6_RPT_LENGTH_TICKS * RC6_TICK)
-#define RC6_TOGGLE_MASK 0x10000UL // (The 17th bit)
-#define RC6_36_TOGGLE_MASK 0x8000U // (The 16th bit)
-// Common (getRClevel())
-#define MARK 0U
-#define SPACE 1U
+const uint16_t kRc6Tick = 444;
+const uint16_t kRc6HdrMarkTicks = 6;
+const uint16_t kRc6HdrMark = kRc6HdrMarkTicks * kRc6Tick;
+const uint16_t kRc6HdrSpaceTicks = 2;
+const uint16_t kRc6HdrSpace = kRc6HdrSpaceTicks * kRc6Tick;
+const uint16_t kRc6RptLengthTicks = 187;
+const uint32_t kRc6RptLength = kRc6RptLengthTicks * kRc6Tick;
+const uint32_t kRc6ToggleMask = 0x10000UL; // The 17th bit.
+const uint16_t kRc6_36ToggleMask = 0x8000; // The 16th bit.
+// Common (getRClevel())
+const int16_t kMark = 0;
+const int16_t kSpace = 1;
#if SEND_RC5
// Send a Philips RC-5/RC-5X packet.
@@ -68,14 +69,13 @@
// TODO(anyone):
// Testing of the RC-5X components.
void IRsend::sendRC5(uint64_t data, uint16_t nbits, uint16_t repeat) {
- if (nbits > sizeof(data) * 8)
- return; // We can't send something that big.
+ if (nbits > sizeof(data) * 8) return; // We can't send something that big.
bool skipSpace = true;
bool field_bit = true;
// Set 36kHz IR carrier frequency & a 1/4 (25%) duty cycle.
enableIROut(36, 25);
- if (nbits >= RC5X_BITS) { // Is this a RC-5X message?
+ if (nbits >= kRC5XBits) { // Is this a RC-5X message?
// field bit is the inverted MSB of RC-5X data.
field_bit = ((data >> (nbits - 1)) ^ 1) & 1;
nbits--;
@@ -90,28 +90,28 @@ void IRsend::sendRC5(uint64_t data, uint16_t nbits, uint16_t repeat) {
if (skipSpace)
skipSpace = false; // First time through, we assume the leading space().
else
- space(RC5_T1);
- mark(RC5_T1);
+ space(kRc5T1);
+ mark(kRc5T1);
// Field/Second start bit.
if (field_bit) { // Send a 1. Normal for RC-5.
- space(RC5_T1);
- mark(RC5_T1);
+ space(kRc5T1);
+ mark(kRc5T1);
} else { // Send a 0. Special case for RC-5X. Means 7th command bit is 1.
- mark(RC5_T1);
- space(RC5_T1);
+ mark(kRc5T1);
+ space(kRc5T1);
}
// Data
for (uint64_t mask = 1ULL << (nbits - 1); mask; mask >>= 1)
if (data & mask) { // 1
- space(RC5_T1); // 1 is space, then mark.
- mark(RC5_T1);
- } else { // 0
- mark(RC5_T1); // 0 is mark, then space.
- space(RC5_T1);
+ space(kRc5T1); // 1 is space, then mark.
+ mark(kRc5T1);
+ } else { // 0
+ mark(kRc5T1); // 0 is mark, then space.
+ space(kRc5T1);
}
// Footer
- space(std::max(RC5_MIN_GAP, RC5_MIN_COMMAND_LENGTH - usecTimer.elapsed()));
+ space(std::max(kRc5MinGap, kRc5MinCommandLength - usecTimer.elapsed()));
}
}
@@ -132,8 +132,7 @@ void IRsend::sendRC5(uint64_t data, uint16_t nbits, uint16_t repeat) {
// https://en.wikipedia.org/wiki/RC-5
uint16_t IRsend::encodeRC5(uint8_t address, uint8_t command,
bool key_released) {
- return (key_released << (RC5_BITS - 1)) |
- ((address & 0x1f) << 6) |
+ return (key_released << (kRC5Bits - 1)) | ((address & 0x1f) << 6) |
(command & 0x3F);
}
@@ -157,8 +156,8 @@ uint16_t IRsend::encodeRC5X(uint8_t address, uint8_t command,
// The 2nd start/field bit (MSB of the return value) is the value of the 7th
// command bit.
bool s2 = (command >> 6) & 1;
- return ((uint16_t) s2 << (RC5X_BITS - 1)) |
- encodeRC5(address, command, key_released);
+ return ((uint16_t)s2 << (kRC5XBits - 1)) |
+ encodeRC5(address, command, key_released);
}
// Flip the toggle bit of a Philips RC-5/RC-5X data message.
@@ -175,9 +174,7 @@ uint16_t IRsend::encodeRC5X(uint8_t address, uint8_t command,
// Ref:
// http://www.sbprojects.com/knowledge/ir/rc5.php
// https://en.wikipedia.org/wiki/RC-5
-uint64_t IRsend::toggleRC5(uint64_t data) {
- return data ^ RC5_TOGGLE_MASK;
-}
+uint64_t IRsend::toggleRC5(uint64_t data) { return data ^ kRc5ToggleMask; }
#endif // SEND_RC5
#if SEND_RC6
@@ -199,9 +196,8 @@ uint64_t IRsend::toggleRC5(uint64_t data) {
// http://www.sbprojects.com/knowledge/ir/rc6.php
// http://www.righto.com/2010/12/64-bit-rc6-codes-arduino-and-xbox.html
uint64_t IRsend::toggleRC6(uint64_t data, uint16_t nbits) {
- if (nbits == RC6_36_BITS)
- return data ^ RC6_36_TOGGLE_MASK;
- return data ^ RC6_TOGGLE_MASK;
+ if (nbits == kRC6_36Bits) return data ^ kRc6_36ToggleMask;
+ return data ^ kRc6ToggleMask;
}
// Encode a Philips RC-6 data message.
@@ -221,13 +217,12 @@ uint64_t IRsend::toggleRC6(uint64_t data, uint16_t nbits) {
// http://www.sbprojects.com/knowledge/ir/rc6.php
// http://www.righto.com/2010/12/64-bit-rc6-codes-arduino-and-xbox.html
// http://www.pcbheaven.com/userpages/The_Philips_RC6_Protocol/
-uint64_t IRsend::encodeRC6(uint32_t address, uint8_t command,
- uint16_t mode) {
+uint64_t IRsend::encodeRC6(uint32_t address, uint8_t command, uint16_t mode) {
switch (mode) {
- case RC6_MODE0_BITS:
+ case kRC6Mode0Bits:
return ((address & 0xFFF) << 8) | (command & 0xFF);
- case RC6_36_BITS:
- return ((uint64_t) (address & 0xFFFFFFF) << 8) | (command & 0xFF);
+ case kRC6_36Bits:
+ return ((uint64_t)(address & 0xFFFFFFF) << 8) | (command & 0xFF);
default:
return 0;
}
@@ -250,25 +245,24 @@ uint64_t IRsend::encodeRC6(uint32_t address, uint8_t command,
// https://en.wikipedia.org/wiki/Manchester_code
void IRsend::sendRC6(uint64_t data, uint16_t nbits, uint16_t repeat) {
// Check we can send the number of bits requested.
- if (nbits > sizeof(data) * 8)
- return;
+ if (nbits > sizeof(data) * 8) return;
// Set 36kHz IR carrier frequency & a 1/3 (33%) duty cycle.
enableIROut(36, 33);
for (uint16_t r = 0; r <= repeat; r++) {
// Header
- mark(RC6_HDR_MARK);
- space(RC6_HDR_SPACE);
+ mark(kRc6HdrMark);
+ space(kRc6HdrSpace);
// Start bit.
- mark(RC6_TICK); // mark, then space == 0x1.
- space(RC6_TICK);
+ mark(kRc6Tick); // mark, then space == 0x1.
+ space(kRc6Tick);
// Data
uint16_t bitTime;
for (uint64_t i = 1, mask = 1ULL << (nbits - 1); mask; i++, mask >>= 1) {
if (i == 4) // The fourth bit we send is a "double width trailer bit".
- bitTime = 2 * RC6_TICK; // double-wide trailer bit
+ bitTime = 2 * kRc6Tick; // double-wide trailer bit
else
- bitTime = RC6_TICK; // Normal bit
- if (data & mask) { // 1
+ bitTime = kRc6Tick; // Normal bit
+ if (data & mask) { // 1
mark(bitTime);
space(bitTime);
} else { // 0
@@ -277,12 +271,12 @@ void IRsend::sendRC6(uint64_t data, uint16_t nbits, uint16_t repeat) {
}
}
// Footer
- space(RC6_RPT_LENGTH);
+ space(kRc6RptLength);
}
}
#endif // SEND_RC6
-#if (DECODE_RC5 || DECODE_RC6)
+#if (DECODE_RC5 || DECODE_RC6 || DECODE_LASERTAG)
// Gets one undecoded level at a time from the raw buffer.
// The RC5/6 decoding is easier if the data is broken into time intervals.
// E.g. if the buffer has MARK for 2 time intervals and SPACE for 1,
@@ -294,47 +288,65 @@ void IRsend::sendRC6(uint64_t data, uint16_t nbits, uint16_t repeat) {
// offset: Ptr to the currect offset to the rawbuf.
// used: Ptr to the current used counter.
// bitTime: Time interval of single bit in microseconds.
+// maxwidth: Maximum number of successive levels to find in a single level
+// (default 3)
// Returns:
// int: MARK, SPACE, or -1 for error (The measured time interval is not a
// multiple of t1.)
// Ref:
// https://en.wikipedia.org/wiki/Manchester_code
-int16_t IRrecv::getRClevel(decode_results *results, uint16_t *offset,
- uint16_t *used, uint16_t bitTime) {
- if (*offset >= results->rawlen)
- return SPACE; // After end of recorded buffer, assume SPACE.
+int16_t IRrecv::getRClevel(decode_results *results, uint16_t *offset,
+ uint16_t *used, uint16_t bitTime, uint8_t tolerance,
+ int16_t excess, uint16_t delta, uint8_t maxwidth) {
+ DPRINT("DEBUG: getRClevel: offset = ");
+ DPRINTLN(uint64ToString(*offset));
+ DPRINT("DEBUG: getRClevel: rawlen = ");
+ DPRINTLN(uint64ToString(results->rawlen));
+ if (*offset >= results->rawlen) {
+ DPRINTLN("DEBUG: getRClevel: SPACE, past end of rawbuf");
+ return kSpace; // After end of recorded buffer, assume SPACE.
+ }
uint16_t width = results->rawbuf[*offset];
// If the value of offset is odd, it's a MARK. Even, it's a SPACE.
- uint16_t val = ((*offset) % 2) ? MARK : SPACE;
+ uint16_t val = ((*offset) % 2) ? kMark : kSpace;
// Check to see if we have hit an inter-message gap (> 20ms).
- if (val == SPACE && width > 20000)
- return SPACE;
- int16_t correction = (val == MARK) ? MARK_EXCESS : -MARK_EXCESS;
+ if (val == kSpace &&
+ (width > 20000 - delta || width > maxwidth * bitTime + delta)) {
+ DPRINTLN("DEBUG: getRClevel: SPACE, hit end of mesg gap.");
+ return kSpace;
+ }
+ int16_t correction = (val == kMark) ? excess : -excess;
// Calculate the look-ahead for our current position in the buffer.
uint16_t avail;
// Note: We want to match in greedy order as the other way leads to
// mismatches due to overlaps induced by the correction and tolerance
// values.
- if (match(width, 3 * bitTime + correction))
- avail = 3;
- else if (match(width, 2 * bitTime + correction))
- avail = 2;
- else if (match(width, bitTime + correction))
- avail = 1;
- else
+ for (avail = maxwidth; avail > 0; avail--) {
+ if (match(width, avail * bitTime + correction, tolerance, delta)) {
+ break;
+ }
+ }
+ if (!avail) {
+ DPRINTLN("DEBUG: getRClevel: Unexpected width. Exiting.");
return -1; // The width is not what we expected.
+ }
- (*used)++; // Count another one of the avail slots as used.
+ (*used)++; // Count another one of the avail slots as used.
if (*used >= avail) { // Are we out of look-ahead/avail slots?
// Yes, so reset the used counter, and move the offset ahead.
*used = 0;
(*offset)++;
}
+ if (val == kMark) {
+ DPRINTLN("DEBUG: getRClevel: MARK");
+ } else {
+ DPRINTLN("DEBUG: getRClevel: SPACE");
+ }
return val;
}
-#endif // (DECODE_RC5 || DECODE_RC6)
+#endif // (DECODE_RC5 || DECODE_RC6 || DECODE_LASERTAG)
#if DECODE_RC5
// Decode the supplied RC-5/RC5X message.
@@ -358,28 +370,28 @@ int16_t IRrecv::getRClevel(decode_results *results, uint16_t *offset,
// TODO(anyone):
// Serious testing of the RC-5X and strict aspects needs to be done.
bool IRrecv::decodeRC5(decode_results *results, uint16_t nbits, bool strict) {
- if (results->rawlen < MIN_RC5_SAMPLES + HEADER - 1) return false;
+ if (results->rawlen < kRc5SamplesMin + kHeader - 1) return false;
// Compliance
- if (strict && nbits != RC5_BITS && nbits != RC5X_BITS)
+ if (strict && nbits != kRC5Bits && nbits != kRC5XBits)
return false; // It's neither RC-5 or RC-5X.
- uint16_t offset = OFFSET_START;
+ uint16_t offset = kStartOffset;
uint16_t used = 0;
bool is_rc5x = false;
uint64_t data = 0;
// Header
// Get start bit #1.
- if (getRClevel(results, &offset, &used, RC5_T1) != MARK) return false;
+ if (getRClevel(results, &offset, &used, kRc5T1) != kMark) return false;
// Get field/start bit #2 (inverted bit-7 of the command if RC-5X protocol)
uint16_t actual_bits = 1;
- int16_t levelA = getRClevel(results, &offset, &used, RC5_T1);
- int16_t levelB = getRClevel(results, &offset, &used, RC5_T1);
- if (levelA == SPACE && levelB == MARK) { // Matched a 1.
+ int16_t levelA = getRClevel(results, &offset, &used, kRc5T1);
+ int16_t levelB = getRClevel(results, &offset, &used, kRc5T1);
+ if (levelA == kSpace && levelB == kMark) { // Matched a 1.
is_rc5x = false;
- } else if (levelA == MARK && levelB == SPACE) { // Matched a 0.
- if (nbits <= RC5_BITS) return false; // Field bit must be '1' for RC5.
+ } else if (levelA == kMark && levelB == kSpace) { // Matched a 0.
+ if (nbits <= kRC5Bits) return false; // Field bit must be '1' for RC5.
is_rc5x = true;
data = 1;
} else {
@@ -388,11 +400,11 @@ bool IRrecv::decodeRC5(decode_results *results, uint16_t nbits, bool strict) {
// Data
for (; offset < results->rawlen; actual_bits++) {
- int16_t levelA = getRClevel(results, &offset, &used, RC5_T1);
- int16_t levelB = getRClevel(results, &offset, &used, RC5_T1);
- if (levelA == SPACE && levelB == MARK)
+ int16_t levelA = getRClevel(results, &offset, &used, kRc5T1);
+ int16_t levelB = getRClevel(results, &offset, &used, kRc5T1);
+ if (levelA == kSpace && levelB == kMark)
data = (data << 1) | 1; // 1
- else if (levelA == MARK && levelB == SPACE)
+ else if (levelA == kMark && levelB == kSpace)
data <<= 1; // 0
else
break;
@@ -401,8 +413,8 @@ bool IRrecv::decodeRC5(decode_results *results, uint16_t nbits, bool strict) {
// Compliance
if (actual_bits < nbits) return false; // Less data than we expected.
- if (strict && actual_bits != RC5_BITS &&
- actual_bits != RC5X_BITS) return false;
+ if (strict && actual_bits != kRC5Bits && actual_bits != kRC5XBits)
+ return false;
// Success
results->value = data;
@@ -411,7 +423,7 @@ bool IRrecv::decodeRC5(decode_results *results, uint16_t nbits, bool strict) {
results->repeat = false;
if (is_rc5x) {
results->decode_type = RC5X;
- results->command |= ((uint32_t) is_rc5x) << 6;
+ results->command |= ((uint32_t)is_rc5x) << 6;
} else {
results->decode_type = RC5;
actual_bits--; // RC5 doesn't count the field bit as data.
@@ -439,7 +451,7 @@ bool IRrecv::decodeRC5(decode_results *results, uint16_t nbits, bool strict) {
// TODO(anyone):
// Testing of the strict compliance aspects.
bool IRrecv::decodeRC6(decode_results *results, uint16_t nbits, bool strict) {
- if (results->rawlen < HEADER + 2 + 4) // Up to the double-wide T bit.
+ if (results->rawlen < kHeader + 2 + 4) // Up to the double-wide T bit.
return false; // Smaller than absolute smallest possible RC6 message.
if (strict) { // Compliance
@@ -449,31 +461,31 @@ bool IRrecv::decodeRC6(decode_results *results, uint16_t nbits, bool strict) {
// Also due to potential melding with the start bit, we can only count
// the start bit as 1, instead of a more typical 2 value. The header still
// remains as normal.
- if (results->rawlen < nbits + HEADER + 1)
+ if (results->rawlen < nbits + kHeader + 1)
return false; // Don't have enough entries/samples to be valid.
switch (nbits) {
- case RC6_MODE0_BITS:
- case RC6_36_BITS:
+ case kRC6Mode0Bits:
+ case kRC6_36Bits:
break;
default:
return false; // Asking for the wrong number of bits.
}
}
- uint16_t offset = OFFSET_START;
+ uint16_t offset = kStartOffset;
// Header
- if (!matchMark(results->rawbuf[offset], RC6_HDR_MARK)) return false;
+ if (!matchMark(results->rawbuf[offset], kRc6HdrMark)) return false;
// Calculate how long the common tick time is based on the header mark.
- uint32_t tick = results->rawbuf[offset++] * RAWTICK / RC6_HDR_MARK_TICKS;
- if (!matchSpace(results->rawbuf[offset++], RC6_HDR_SPACE_TICKS * tick))
+ uint32_t tick = results->rawbuf[offset++] * kRawTick / kRc6HdrMarkTicks;
+ if (!matchSpace(results->rawbuf[offset++], kRc6HdrSpaceTicks * tick))
return false;
uint16_t used = 0;
// Get the start bit. e.g. 1.
- if (getRClevel(results, &offset, &used, tick) != MARK) return false;
- if (getRClevel(results, &offset, &used, tick) != SPACE) return false;
+ if (getRClevel(results, &offset, &used, tick) != kMark) return false;
+ if (getRClevel(results, &offset, &used, tick) != kSpace) return false;
uint16_t actual_bits;
uint64_t data = 0;
@@ -483,17 +495,15 @@ bool IRrecv::decodeRC6(decode_results *results, uint16_t nbits, bool strict) {
int16_t levelA, levelB; // Next two levels
levelA = getRClevel(results, &offset, &used, tick);
// T bit is double wide; make sure second half matches
- if (actual_bits == 3 &&
- levelA != getRClevel(results, &offset, &used, tick))
+ if (actual_bits == 3 && levelA != getRClevel(results, &offset, &used, tick))
return false;
levelB = getRClevel(results, &offset, &used, tick);
// T bit is double wide; make sure second half matches
- if (actual_bits == 3 &&
- levelB != getRClevel(results, &offset, &used, tick))
+ if (actual_bits == 3 && levelB != getRClevel(results, &offset, &used, tick))
return false;
- if (levelA == MARK && levelB == SPACE) // reversed compared to RC5
- data = (data << 1) | 1; // 1
- else if (levelA == SPACE && levelB == MARK)
+ if (levelA == kMark && levelB == kSpace) // reversed compared to RC5
+ data = (data << 1) | 1; // 1
+ else if (levelA == kSpace && levelB == kMark)
data <<= 1; // 0
else
break;
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_RCMM.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_RCMM.cpp
similarity index 58%
rename from lib/IRremoteESP8266-2.2.1.02/src/ir_RCMM.cpp
rename to lib/IRremoteESP8266-2.5.2.03/src/ir_RCMM.cpp
index 362702b663ba..1b03d2c0724d 100644
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_RCMM.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_RCMM.cpp
@@ -17,28 +17,28 @@
// Constants
// Ref:
// http://www.sbprojects.com/knowledge/ir/rcmm.php
-#define RCMM_TICK 28U // Technically it would be 27.777*
-#define RCMM_HDR_MARK_TICKS 15U
-#define RCMM_HDR_MARK 416U
-#define RCMM_HDR_SPACE_TICKS 10U
-#define RCMM_HDR_SPACE 277U
-#define RCMM_BIT_MARK_TICKS 6U
-#define RCMM_BIT_MARK 166U
-#define RCMM_BIT_SPACE_0_TICKS 10U
-#define RCMM_BIT_SPACE_0 277U
-#define RCMM_BIT_SPACE_1_TICKS 16U
-#define RCMM_BIT_SPACE_1 444U
-#define RCMM_BIT_SPACE_2_TICKS 22U
-#define RCMM_BIT_SPACE_2 611U
-#define RCMM_BIT_SPACE_3_TICKS 28U
-#define RCMM_BIT_SPACE_3 777U
-#define RCMM_RPT_LENGTH_TICKS 992U
-#define RCMM_RPT_LENGTH 27778U
-#define RCMM_MIN_GAP_TICKS 120U
-#define RCMM_MIN_GAP 3360U
+const uint16_t kRcmmTick = 28; // Technically it would be 27.777*
+const uint16_t kRcmmHdrMarkTicks = 15;
+const uint16_t kRcmmHdrMark = 416;
+const uint16_t kRcmmHdrSpaceTicks = 10;
+const uint16_t kRcmmHdrSpace = 277;
+const uint16_t kRcmmBitMarkTicks = 6;
+const uint16_t kRcmmBitMark = 166;
+const uint16_t kRcmmBitSpace0Ticks = 10;
+const uint16_t kRcmmBitSpace0 = 277;
+const uint16_t kRcmmBitSpace1Ticks = 16;
+const uint16_t kRcmmBitSpace1 = 444;
+const uint16_t kRcmmBitSpace2Ticks = 22;
+const uint16_t kRcmmBitSpace2 = 611;
+const uint16_t kRcmmBitSpace3Ticks = 28;
+const uint16_t kRcmmBitSpace3 = 777;
+const uint16_t kRcmmRptLengthTicks = 992;
+const uint32_t kRcmmRptLength = 27778;
+const uint16_t kRcmmMinGapTicks = 120;
+const uint32_t kRcmmMinGap = 3360;
// Use a tolerance of +/-10% when matching some data spaces.
-#define RCMM_TOLERANCE 10U
-#define RCMM_EXCESS 50U
+const uint8_t kRcmmTolerance = 10;
+const uint16_t kRcmmExcess = 50;
#if SEND_RCMM
// Send a Philips RC-MM packet.
@@ -60,27 +60,35 @@ void IRsend::sendRCMM(uint64_t data, uint16_t nbits, uint16_t repeat) {
for (uint16_t r = 0; r <= repeat; r++) {
usecs.reset();
// Header
- mark(RCMM_HDR_MARK);
- space(RCMM_HDR_SPACE);
+ mark(kRcmmHdrMark);
+ space(kRcmmHdrSpace);
// Data
uint64_t mask = 0b11ULL << (nbits - 2);
// RC-MM sends data 2 bits at a time.
for (int32_t i = nbits; i > 0; i -= 2) {
- mark(RCMM_BIT_MARK);
+ mark(kRcmmBitMark);
// Grab the next Most Significant Bits to send.
switch ((data & mask) >> (i - 2)) {
- case 0b00: space(RCMM_BIT_SPACE_0); break;
- case 0b01: space(RCMM_BIT_SPACE_1); break;
- case 0b10: space(RCMM_BIT_SPACE_2); break;
- case 0b11: space(RCMM_BIT_SPACE_3); break;
+ case 0b00:
+ space(kRcmmBitSpace0);
+ break;
+ case 0b01:
+ space(kRcmmBitSpace1);
+ break;
+ case 0b10:
+ space(kRcmmBitSpace2);
+ break;
+ case 0b11:
+ space(kRcmmBitSpace3);
+ break;
}
mask >>= 2;
}
// Footer
- mark(RCMM_BIT_MARK);
- // Protocol requires us to wait at least RCMM_RPT_LENGTH usecs from the
- // start or RCMM_MIN_GAP usecs.
- space(std::max(RCMM_RPT_LENGTH - usecs.elapsed(), RCMM_MIN_GAP));
+ mark(kRcmmBitMark);
+ // Protocol requires us to wait at least kRcmmRptLength usecs from the
+ // start or kRcmmMinGap usecs.
+ space(std::max(kRcmmRptLength - usecs.elapsed(), kRcmmMinGap));
}
}
#endif
@@ -90,7 +98,7 @@ void IRsend::sendRCMM(uint64_t data, uint16_t nbits, uint16_t repeat) {
// Places successful decode information in the results pointer.
// Args:
// results: Ptr to the data to decode and where to store the decode result.
-// nbits: Nr. of bits to expect in the data portion. Typically RCMM_BITS.
+// nbits: Nr. of bits to expect in the data portion. Typically kRCMMBits.
// strict: Flag to indicate if we strictly adhere to the specification.
// Returns:
// boolean: True if it can decode it, false if it can't.
@@ -101,67 +109,65 @@ void IRsend::sendRCMM(uint64_t data, uint16_t nbits, uint16_t repeat) {
// http://www.sbprojects.com/knowledge/ir/rcmm.php
bool IRrecv::decodeRCMM(decode_results *results, uint16_t nbits, bool strict) {
uint64_t data = 0;
- uint16_t offset = OFFSET_START;
+ uint16_t offset = kStartOffset;
if (results->rawlen <= 4)
return false; // Not enough entries to ever be RCMM.
// Calc the maximum size in bits, the message can be, or that we can accept.
- int16_t maxBitSize = std::min((uint16_t) results->rawlen - 4,
- (uint16_t) sizeof(data) * 8);
+ int16_t maxBitSize =
+ std::min((uint16_t)results->rawlen - 5, (uint16_t)sizeof(data) * 8);
// Compliance
if (strict) {
// Technically the spec says bit sizes should be 12 xor 24. however
// 32 bits has been seen from a device. We are going to assume
// 12 <= bits <= 32 is the 'required' bit length for the spec.
- if (maxBitSize < 12 || maxBitSize > 32)
- return false;
+ if (maxBitSize < 12 || maxBitSize > 32) return false;
if (maxBitSize < nbits)
return false; // Short cut, we can never reach the expected nr. of bits.
}
// Header decode
- if (!matchMark(results->rawbuf[offset], RCMM_HDR_MARK)) return false;
+ if (!matchMark(results->rawbuf[offset], kRcmmHdrMark)) return false;
// Calculate how long the common tick time is based on the header mark.
- uint32_t m_tick = results->rawbuf[offset++] * RAWTICK / RCMM_HDR_MARK_TICKS;
- if (!matchSpace(results->rawbuf[offset], RCMM_HDR_SPACE)) return false;
+ uint32_t m_tick = results->rawbuf[offset++] * kRawTick / kRcmmHdrMarkTicks;
+ if (!matchSpace(results->rawbuf[offset], kRcmmHdrSpace)) return false;
// Calculate how long the common tick time is based on the header space.
- uint32_t s_tick = results->rawbuf[offset++] * RAWTICK / RCMM_HDR_SPACE_TICKS;
+ uint32_t s_tick = results->rawbuf[offset++] * kRawTick / kRcmmHdrSpaceTicks;
// Data decode
// RC-MM has two bits of data per mark/space pair.
uint16_t actualBits;
for (actualBits = 0; actualBits < maxBitSize; actualBits += 2, offset++) {
- if (!match(results->rawbuf[offset++], RCMM_BIT_MARK_TICKS * m_tick))
+ if (!match(results->rawbuf[offset++], kRcmmBitMarkTicks * m_tick))
return false;
data <<= 2;
// Use non-default tolerance & excess for matching some of the spaces as the
// defaults are too generous and causes mis-matches in some cases.
- if (match(results->rawbuf[offset], RCMM_BIT_SPACE_0_TICKS * s_tick,
- TOLERANCE))
+ if (match(results->rawbuf[offset], kRcmmBitSpace0Ticks * s_tick,
+ kTolerance))
data += 0;
- else if (match(results->rawbuf[offset], RCMM_BIT_SPACE_1_TICKS * s_tick,
- TOLERANCE))
+ else if (match(results->rawbuf[offset], kRcmmBitSpace1Ticks * s_tick,
+ kTolerance))
data += 1;
- else if (match(results->rawbuf[offset], RCMM_BIT_SPACE_2_TICKS * s_tick,
- RCMM_TOLERANCE))
+ else if (match(results->rawbuf[offset], kRcmmBitSpace2Ticks * s_tick,
+ kRcmmTolerance))
data += 2;
- else if (match(results->rawbuf[offset], RCMM_BIT_SPACE_3_TICKS * s_tick,
- RCMM_TOLERANCE))
+ else if (match(results->rawbuf[offset], kRcmmBitSpace3Ticks * s_tick,
+ kRcmmTolerance))
data += 3;
else
return false;
}
// Footer decode
- if (!match(results->rawbuf[offset++], RCMM_BIT_MARK_TICKS * m_tick))
+ if (!match(results->rawbuf[offset++], kRcmmBitMarkTicks * m_tick))
return false;
if (offset < results->rawlen &&
- !matchAtLeast(results->rawbuf[offset], RCMM_MIN_GAP_TICKS * s_tick))
+ !matchAtLeast(results->rawbuf[offset], kRcmmMinGapTicks * s_tick))
return false;
// Compliance
- if (strict && actualBits != nbits)
- return false;
+ if (strict && actualBits != nbits) return false;
// Success
results->value = data;
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Samsung.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Samsung.cpp
new file mode 100644
index 000000000000..d943f8cf976e
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Samsung.cpp
@@ -0,0 +1,590 @@
+// Copyright 2009 Ken Shirriff
+// Copyright 2017 David Conran
+
+#include "ir_Samsung.h"
+#include
+#ifndef ARDUINO
+#include
+#endif
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRutils.h"
+
+// SSSS AAA MMM SSSS U U N N GGGG
+// S A A M M M S U U NN N G
+// SSS AAAAA M M M SSS U U N N N G GG
+// S A A M M S U U N NN G G
+// SSSS A A M M SSSS UUU N N GGG
+
+// Samsung originally added from https://github.com/shirriff/Arduino-IRremote/
+
+// Constants
+// Ref:
+// http://elektrolab.wz.cz/katalog/samsung_protocol.pdf
+const uint16_t kSamsungTick = 560;
+const uint16_t kSamsungHdrMarkTicks = 8;
+const uint16_t kSamsungHdrMark = kSamsungHdrMarkTicks * kSamsungTick;
+const uint16_t kSamsungHdrSpaceTicks = 8;
+const uint16_t kSamsungHdrSpace = kSamsungHdrSpaceTicks * kSamsungTick;
+const uint16_t kSamsungBitMarkTicks = 1;
+const uint16_t kSamsungBitMark = kSamsungBitMarkTicks * kSamsungTick;
+const uint16_t kSamsungOneSpaceTicks = 3;
+const uint16_t kSamsungOneSpace = kSamsungOneSpaceTicks * kSamsungTick;
+const uint16_t kSamsungZeroSpaceTicks = 1;
+const uint16_t kSamsungZeroSpace = kSamsungZeroSpaceTicks * kSamsungTick;
+const uint16_t kSamsungRptSpaceTicks = 4;
+const uint16_t kSamsungRptSpace = kSamsungRptSpaceTicks * kSamsungTick;
+const uint16_t kSamsungMinMessageLengthTicks = 193;
+const uint32_t kSamsungMinMessageLength =
+ kSamsungMinMessageLengthTicks * kSamsungTick;
+const uint16_t kSamsungMinGapTicks =
+ kSamsungMinMessageLengthTicks -
+ (kSamsungHdrMarkTicks + kSamsungHdrSpaceTicks +
+ kSamsungBits * (kSamsungBitMarkTicks + kSamsungOneSpaceTicks) +
+ kSamsungBitMarkTicks);
+const uint32_t kSamsungMinGap = kSamsungMinGapTicks * kSamsungTick;
+
+const uint16_t kSamsungAcHdrMark = 690;
+const uint16_t kSamsungAcHdrSpace = 17844;
+const uint8_t kSamsungAcSections = 2;
+const uint16_t kSamsungAcSectionMark = 3086;
+const uint16_t kSamsungAcSectionSpace = 8864;
+const uint16_t kSamsungAcSectionGap = 2886;
+const uint16_t kSamsungAcBitMark = 586;
+const uint16_t kSamsungAcOneSpace = 1432;
+const uint16_t kSamsungAcZeroSpace = 436;
+
+#if SEND_SAMSUNG
+// Send a Samsung formatted message.
+// Samsung has a separate message to indicate a repeat, like NEC does.
+// TODO(crankyoldgit): Confirm that is actually how Samsung sends a repeat.
+// The refdoc doesn't indicate it is true.
+//
+// Args:
+// data: The message to be sent.
+// nbits: The bit size of the message being sent. typically kSamsungBits.
+// repeat: The number of times the message is to be repeated.
+//
+// Status: BETA / Should be working.
+//
+// Ref: http://elektrolab.wz.cz/katalog/samsung_protocol.pdf
+void IRsend::sendSAMSUNG(uint64_t data, uint16_t nbits, uint16_t repeat) {
+ sendGeneric(kSamsungHdrMark, kSamsungHdrSpace, kSamsungBitMark,
+ kSamsungOneSpace, kSamsungBitMark, kSamsungZeroSpace,
+ kSamsungBitMark, kSamsungMinGap, kSamsungMinMessageLength, data,
+ nbits, 38, true, repeat, 33);
+}
+
+// Construct a raw Samsung message from the supplied customer(address) &
+// command.
+//
+// Args:
+// customer: The customer code. (aka. Address)
+// command: The command code.
+// Returns:
+// A raw 32-bit Samsung message suitable for sendSAMSUNG().
+//
+// Status: BETA / Should be working.
+uint32_t IRsend::encodeSAMSUNG(uint8_t customer, uint8_t command) {
+ customer = reverseBits(customer, sizeof(customer) * 8);
+ command = reverseBits(command, sizeof(command) * 8);
+ return ((command ^ 0xFF) | (command << 8) | (customer << 16) |
+ (customer << 24));
+}
+#endif
+
+#if DECODE_SAMSUNG
+// Decode the supplied Samsung message.
+// Samsung messages whilst 32 bits in size, only contain 16 bits of distinct
+// data. e.g. In transmition order:
+// customer_byte + customer_byte(same) + address_byte + invert(address_byte)
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: Nr. of bits to expect in the data portion. Typically kSamsungBits.
+// strict: Flag to indicate if we strictly adhere to the specification.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: STABLE
+//
+// Note:
+// LG 32bit protocol appears near identical to the Samsung protocol.
+// They differ on their compliance criteria and how they repeat.
+// Ref:
+// http://elektrolab.wz.cz/katalog/samsung_protocol.pdf
+bool IRrecv::decodeSAMSUNG(decode_results *results, uint16_t nbits,
+ bool strict) {
+ if (results->rawlen < 2 * nbits + kHeader + kFooter - 1)
+ return false; // Can't possibly be a valid Samsung message.
+ if (strict && nbits != kSamsungBits)
+ return false; // We expect Samsung to be 32 bits of message.
+
+ uint64_t data = 0;
+ uint16_t offset = kStartOffset;
+
+ // Header
+ if (!matchMark(results->rawbuf[offset], kSamsungHdrMark)) return false;
+ // Calculate how long the common tick time is based on the header mark.
+ uint32_t m_tick = results->rawbuf[offset++] * kRawTick / kSamsungHdrMarkTicks;
+ if (!matchSpace(results->rawbuf[offset], kSamsungHdrSpace)) return false;
+ // Calculate how long the common tick time is based on the header space.
+ uint32_t s_tick =
+ results->rawbuf[offset++] * kRawTick / kSamsungHdrSpaceTicks;
+ // Data
+ match_result_t data_result =
+ matchData(&(results->rawbuf[offset]), nbits,
+ kSamsungBitMarkTicks * m_tick, kSamsungOneSpaceTicks * s_tick,
+ kSamsungBitMarkTicks * m_tick, kSamsungZeroSpaceTicks * s_tick);
+ if (data_result.success == false) return false;
+ data = data_result.data;
+ offset += data_result.used;
+ // Footer
+ if (!matchMark(results->rawbuf[offset++], kSamsungBitMarkTicks * m_tick))
+ return false;
+ if (offset < results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset], kSamsungMinGapTicks * s_tick))
+ return false;
+
+ // Compliance
+
+ // According to the spec, the customer (address) code is the first 8
+ // transmitted bits. It's then repeated. Check for that.
+ uint8_t address = data >> 24;
+ if (strict && address != ((data >> 16) & 0xFF)) return false;
+ // Spec says the command code is the 3rd block of transmitted 8-bits,
+ // followed by the inverted command code.
+ uint8_t command = (data & 0xFF00) >> 8;
+ if (strict && command != ((data & 0xFF) ^ 0xFF)) return false;
+
+ // Success
+ results->bits = nbits;
+ results->value = data;
+ results->decode_type = SAMSUNG;
+ // command & address need to be reversed as they are transmitted LSB first,
+ results->command = reverseBits(command, sizeof(command) * 8);
+ results->address = reverseBits(address, sizeof(address) * 8);
+ return true;
+}
+#endif
+
+#if SEND_SAMSUNG_AC
+// Send a Samsung A/C message.
+//
+// Args:
+// data: An array of bytes containing the IR command.
+// nbytes: Nr. of bytes of data in the array. (>=kSamsungAcStateLength)
+// repeat: Nr. of times the message is to be repeated. (Default = 0).
+//
+// Status: ALPHA / Untested.
+//
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/505
+void IRsend::sendSamsungAC(uint8_t data[], uint16_t nbytes, uint16_t repeat) {
+ if (nbytes < kSamsungAcStateLength && nbytes % kSamsungACSectionLength)
+ return; // Not an appropriate number of bytes to send a proper message.
+
+ enableIROut(38);
+ for (uint16_t r = 0; r <= repeat; r++) {
+ // Header
+ mark(kSamsungAcHdrMark);
+ space(kSamsungAcHdrSpace);
+ // Send in 7 byte sections.
+ for (uint16_t offset = 0; offset < nbytes;
+ offset += kSamsungACSectionLength) {
+ sendGeneric(kSamsungAcSectionMark, kSamsungAcSectionSpace,
+ kSamsungAcBitMark, kSamsungAcOneSpace, kSamsungAcBitMark,
+ kSamsungAcZeroSpace, kSamsungAcBitMark, kSamsungAcSectionGap,
+ data + offset, kSamsungACSectionLength, // 7 bytes == 56 bits
+ 38000, false, 0, 50); // Send in LSBF order
+ }
+ // Complete made up guess at inter-message gap.
+ space(100000 - kSamsungAcSectionGap);
+ }
+}
+#endif // SEND_SAMSUNG_AC
+
+IRSamsungAc::IRSamsungAc(uint16_t pin) : _irsend(pin) { stateReset(); }
+
+void IRSamsungAc::stateReset() {
+ for (uint8_t i = 0; i < kSamsungAcExtendedStateLength; i++)
+ remote_state[i] = 0x0;
+ remote_state[0] = 0x02;
+ remote_state[1] = 0x92;
+ remote_state[2] = 0x0F;
+ remote_state[6] = 0xF0;
+ remote_state[7] = 0x01;
+ remote_state[8] = 0x02;
+ remote_state[9] = 0xAE;
+ remote_state[10] = 0x71;
+ remote_state[12] = 0x15;
+ remote_state[13] = 0xF0;
+}
+
+void IRSamsungAc::begin() { _irsend.begin(); }
+
+uint8_t IRSamsungAc::calcChecksum(const uint8_t state[],
+ const uint16_t length) {
+ uint8_t sum = 0;
+ uint8_t currentbyte;
+ // Safety check so we don't go outside the array.
+ if (length <= 5) return 255;
+ // Shamelessly inspired by:
+ // https://github.com/adafruit/Raw-IR-decoder-for-Arduino/pull/3/files
+ // Count most of the '1' bits after the checksum location.
+ for (uint8_t i = length - 5; i < length - 1; i++) {
+ currentbyte = state[i];
+ if (i == length - 5) currentbyte = state[length - 5] & 0b11111110;
+ for (; currentbyte; currentbyte >>= 1)
+ if (currentbyte & 1) sum++;
+ }
+ return (28 - sum) & 0xF;
+}
+
+bool IRSamsungAc::validChecksum(const uint8_t state[], const uint16_t length) {
+ if (length <= 5) return true; // No checksum to compare with. Assume okay.
+ return (state[length - 6] >> 4) == calcChecksum(state, length);
+}
+
+// Update the checksum for the internal state.
+void IRSamsungAc::checksum(uint16_t length) {
+ if (length < 9) return;
+ remote_state[length - 6] &= 0x0F;
+ remote_state[length - 6] |= (calcChecksum(remote_state, length) << 4);
+}
+
+#if SEND_SAMSUNG_AC
+void IRSamsungAc::send(const bool calcchecksum) {
+ if (calcchecksum) checksum();
+ _irsend.sendSamsungAC(remote_state);
+}
+#endif // SEND_SAMSUNG_AC
+
+#if SEND_SAMSUNG_AC
+void IRSamsungAc::sendExtended(const bool calcchecksum) {
+ if (calcchecksum) checksum();
+ uint8_t extended_state[kSamsungAcExtendedStateLength] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xD2, 0x0F, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ // Copy/convert the internal state to an extended state.
+ for (uint16_t i = 0; i < kSamsungACSectionLength; i++)
+ extended_state[i] = remote_state[i];
+ for (uint16_t i = kSamsungACSectionLength; i < kSamsungAcStateLength; i++)
+ extended_state[i + kSamsungACSectionLength] = remote_state[i];
+ // Send it.
+ _irsend.sendSamsungAC(extended_state, kSamsungAcExtendedStateLength);
+}
+#endif // SEND_SAMSUNG_AC
+
+uint8_t *IRSamsungAc::getRaw() {
+ checksum();
+ return remote_state;
+}
+
+void IRSamsungAc::setRaw(const uint8_t new_code[], const uint16_t length) {
+ for (uint8_t i = 0; i < length && i < kSamsungAcExtendedStateLength; i++) {
+ remote_state[i] = new_code[i];
+ }
+ // Shrink the extended state into a normal state.
+ if (length > kSamsungAcStateLength) {
+ for (uint8_t i = kSamsungAcStateLength; i < length; i++)
+ remote_state[i - kSamsungACSectionLength] = remote_state[i];
+ }
+}
+
+void IRSamsungAc::on() {
+ remote_state[1] &= ~kSamsungAcPowerMask1;
+ remote_state[6] |= kSamsungAcPowerMask2;
+}
+
+void IRSamsungAc::off() {
+ remote_state[1] |= kSamsungAcPowerMask1;
+ remote_state[6] &= ~kSamsungAcPowerMask2;
+}
+
+void IRSamsungAc::setPower(const bool state) {
+ if (state)
+ on();
+ else
+ off();
+}
+
+bool IRSamsungAc::getPower() {
+ return ((remote_state[6] & kSamsungAcPowerMask2) != 0) &&
+ ((remote_state[1] & kSamsungAcPowerMask1) == 0);
+}
+
+// Set the temp. in deg C
+void IRSamsungAc::setTemp(const uint8_t temp) {
+ uint8_t newtemp = std::max(kSamsungAcMinTemp, temp);
+ newtemp = std::min(kSamsungAcMaxTemp, newtemp);
+ remote_state[11] = (remote_state[11] & ~kSamsungAcTempMask) |
+ ((newtemp - kSamsungAcMinTemp) << 4);
+}
+
+// Return the set temp. in deg C
+uint8_t IRSamsungAc::getTemp() {
+ return ((remote_state[11] & kSamsungAcTempMask) >> 4) + kSamsungAcMinTemp;
+}
+
+void IRSamsungAc::setMode(const uint8_t mode) {
+ // If we get an unexpected mode, default to AUTO.
+ uint8_t newmode = mode;
+ if (newmode > kSamsungAcHeat) newmode = kSamsungAcAuto;
+ remote_state[12] = (remote_state[12] & ~kSamsungAcModeMask) | (newmode << 4);
+
+ // Auto mode has a special fan setting valid only in auto mode.
+ if (newmode == kSamsungAcAuto) {
+ setFan(kSamsungAcFanAuto2);
+ } else {
+ if (getFan() == kSamsungAcFanAuto2) // Non-Auto can't have this fan setting
+ setFan(kSamsungAcFanAuto); // Default to something safe.
+ }
+}
+
+uint8_t IRSamsungAc::getMode() {
+ return (remote_state[12] & kSamsungAcModeMask) >> 4;
+}
+
+void IRSamsungAc::setFan(const uint8_t speed) {
+ switch (speed) {
+ case kSamsungAcFanAuto:
+ case kSamsungAcFanLow:
+ case kSamsungAcFanMed:
+ case kSamsungAcFanHigh:
+ case kSamsungAcFanTurbo:
+ if (getMode() == kSamsungAcAuto) return; // Not valid in Auto mode.
+ break;
+ case kSamsungAcFanAuto2: // Special fan setting for when in Auto mode.
+ if (getMode() != kSamsungAcAuto) return;
+ break;
+ default:
+ return;
+ }
+ remote_state[12] = (remote_state[12] & ~kSamsungAcFanMask) | (speed << 1);
+}
+
+uint8_t IRSamsungAc::getFan() {
+ return ((remote_state[12] & kSamsungAcFanMask) >> 1);
+}
+
+bool IRSamsungAc::getSwing() {
+ // TODO(Hollako): Explain why sometimes the LSB of remote_state[9] is a 1.
+ // e.g. 0xAE or 0XAF for swing move.
+ return ((remote_state[9] & kSamsungAcSwingMask) >> 4) == kSamsungAcSwingMove;
+}
+
+void IRSamsungAc::setSwing(const bool state) {
+ // TODO(Hollako): Explain why sometimes the LSB of remote_state[9] is a 1.
+ // e.g. 0xAE or 0XAF for swing move.
+ remote_state[9] &= ~kSamsungAcSwingMask; // Clear the previous swing state.
+ if (state)
+ remote_state[9] |= (kSamsungAcSwingMove << 4);
+ else
+ remote_state[9] |= (kSamsungAcSwingStop << 4);
+}
+
+bool IRSamsungAc::getBeep() { return remote_state[13] & kSamsungAcBeepMask; }
+
+void IRSamsungAc::setBeep(const bool state) {
+ if (state)
+ remote_state[13] |= kSamsungAcBeepMask;
+ else
+ remote_state[13] &= ~kSamsungAcBeepMask;
+}
+
+bool IRSamsungAc::getClean() {
+ return (remote_state[10] & kSamsungAcCleanMask10) &&
+ (remote_state[11] & kSamsungAcCleanMask11);
+}
+
+void IRSamsungAc::setClean(const bool state) {
+ if (state) {
+ remote_state[10] |= kSamsungAcCleanMask10;
+ remote_state[11] |= kSamsungAcCleanMask11;
+ } else {
+ remote_state[10] &= ~kSamsungAcCleanMask10;
+ remote_state[11] &= ~kSamsungAcCleanMask11;
+ }
+}
+
+// Very unsure this is correct.
+bool IRSamsungAc::getQuiet() {
+ return remote_state[11] & kSamsungAcQuietMask11;
+}
+
+// Very unsure this is correct.
+void IRSamsungAc::setQuiet(const bool state) {
+ if (state) {
+ remote_state[11] |= kSamsungAcQuietMask11;
+ setFan(kSamsungAcFanAuto); // Quiet mode seems to set fan speed to auto.
+ } else {
+ remote_state[11] &= ~kSamsungAcQuietMask11;
+ }
+}
+
+// Convert the internal state into a human readable string.
+#ifdef ARDUINO
+String IRSamsungAc::toString() {
+ String result = "";
+#else
+std::string IRSamsungAc::toString() {
+ std::string result = "";
+#endif // ARDUINO
+ result += "Power: ";
+ if (getPower())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Mode: " + uint64ToString(getMode());
+ switch (getMode()) {
+ case kSamsungAcAuto:
+ result += " (AUTO)";
+ break;
+ case kSamsungAcCool:
+ result += " (COOL)";
+ break;
+ case kSamsungAcHeat:
+ result += " (HEAT)";
+ break;
+ case kSamsungAcDry:
+ result += " (DRY)";
+ break;
+ case kSamsungAcFan:
+ result += " (FAN)";
+ break;
+ default:
+ result += " (UNKNOWN)";
+ }
+ result += ", Temp: " + uint64ToString(getTemp()) + "C";
+ result += ", Fan: " + uint64ToString(getFan());
+ switch (getFan()) {
+ case kSamsungAcFanAuto:
+ case kSamsungAcFanAuto2:
+ result += " (AUTO)";
+ break;
+ case kSamsungAcFanLow:
+ result += " (LOW)";
+ break;
+ case kSamsungAcFanMed:
+ result += " (MED)";
+ break;
+ case kSamsungAcFanHigh:
+ result += " (HIGH)";
+ break;
+ case kSamsungAcFanTurbo:
+ result += " (TURBO)";
+ break;
+ default:
+ result += " (UNKNOWN)";
+ break;
+ }
+ result += ", Swing: ";
+ if (getSwing())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Beep: ";
+ if (getBeep())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Clean: ";
+ if (getBeep())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Quiet: ";
+ if (getQuiet())
+ result += "On";
+ else
+ result += "Off";
+ return result;
+}
+
+#if DECODE_SAMSUNG_AC
+// Decode the supplied Samsung A/C message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: The number of data bits to expect. Typically kSamsungAcBits
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: BETA / Appears to mostly work.
+//
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/505
+bool IRrecv::decodeSamsungAC(decode_results *results, uint16_t nbits,
+ bool strict) {
+ if (results->rawlen < 2 * nbits + kHeader * 3 + kFooter * 2 - 1)
+ return false; // Can't possibly be a valid Samsung A/C message.
+ if (nbits != kSamsungAcBits && nbits != kSamsungAcExtendedBits) return false;
+
+ uint16_t offset = kStartOffset;
+ uint16_t dataBitsSoFar = 0;
+ match_result_t data_result;
+
+ // Message Header
+ if (!matchMark(results->rawbuf[offset++], kSamsungAcBitMark)) return false;
+ if (!matchSpace(results->rawbuf[offset++], kSamsungAcHdrSpace)) return false;
+ // Section(s)
+ for (uint16_t pos = kSamsungACSectionLength, i = 0; pos <= nbits / 8;
+ pos += kSamsungACSectionLength) {
+ uint64_t sectiondata = 0;
+ // Section Header
+ if (!matchMark(results->rawbuf[offset++], kSamsungAcSectionMark))
+ return false;
+ if (!matchSpace(results->rawbuf[offset++], kSamsungAcSectionSpace))
+ return false;
+ // Section Data
+ // Keep reading bytes until we either run out of section or state to fill.
+ for (; offset <= results->rawlen - 16 && i < pos;
+ i++, dataBitsSoFar += 8, offset += data_result.used) {
+ data_result = matchData(&(results->rawbuf[offset]), 8, kSamsungAcBitMark,
+ kSamsungAcOneSpace, kSamsungAcBitMark,
+ kSamsungAcZeroSpace, kTolerance, 0, false);
+ if (data_result.success == false) {
+ DPRINT("DEBUG: offset = ");
+ DPRINTLN(offset + data_result.used);
+ return false; // Fail
+ }
+ results->state[i] = data_result.data;
+ sectiondata = (sectiondata << 8) + data_result.data;
+ }
+ DPRINTLN("DEBUG: sectiondata = 0x" + uint64ToString(sectiondata, 16));
+ // Section Footer
+ if (!matchMark(results->rawbuf[offset++], kSamsungAcBitMark)) return false;
+ if (pos < nbits / 8) { // Inter-section gap.
+ if (!matchSpace(results->rawbuf[offset++], kSamsungAcSectionGap))
+ return false;
+ } else { // Last section / End of message gap.
+ if (offset <= results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset++], kSamsungAcSectionGap))
+ return false;
+ }
+ }
+ // Compliance
+ // Re-check we got the correct size/length due to the way we read the data.
+ if (dataBitsSoFar != nbits) return false;
+ // Is the signature correct?
+ DPRINTLN("DEBUG: Checking signature.");
+ if (results->state[0] != 0x02 || results->state[2] != 0x0F) return false;
+ if (results->state[1] != 0x92 && results->state[1] != 0xB2) return false;
+ if (strict) {
+ // Is the checksum valid?
+ if (!IRSamsungAc::validChecksum(results->state, nbits / 8)) {
+ DPRINTLN("DEBUG: Checksum failed!");
+ return false;
+ }
+ }
+ // Success
+ results->decode_type = SAMSUNG_AC;
+ results->bits = dataBitsSoFar;
+ // No need to record the state as we stored it as we decoded it.
+ // As we use result->state, we don't record value, address, or command as it
+ // is a union data type.
+ return true;
+}
+#endif // DECODE_SAMSUNG_AC
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Samsung.h b/lib/IRremoteESP8266-2.5.2.03/src/ir_Samsung.h
new file mode 100644
index 000000000000..f80b47d20baf
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Samsung.h
@@ -0,0 +1,107 @@
+// Samsung A/C
+//
+// Copyright 2018 David Conran
+
+#ifndef IR_SAMSUNG_H_
+#define IR_SAMSUNG_H_
+
+#define __STDC_LIMIT_MACROS
+#include
+#ifndef UNIT_TEST
+#include
+#else
+#include
+#endif
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+
+// SSSS AAA MMM SSSS U U N N GGGG
+// S A A M M M S U U NN N G
+// SSS AAAAA M M M SSS U U N N N G GG
+// S A A M M S U U N NN G G
+// SSSS A A M M SSSS UUU N N GGG
+
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/505
+
+// Constants
+const uint8_t kSamsungAcAuto = 0;
+const uint8_t kSamsungAcCool = 1;
+const uint8_t kSamsungAcDry = 2;
+const uint8_t kSamsungAcFan = 3;
+const uint8_t kSamsungAcHeat = 4;
+const uint8_t kSamsungAcModeMask = 0x70;
+const uint8_t kSamsungAcFanAuto = 0;
+const uint8_t kSamsungAcFanLow = 2;
+const uint8_t kSamsungAcFanMed = 4;
+const uint8_t kSamsungAcFanHigh = 5;
+const uint8_t kSamsungAcFanAuto2 = 6;
+const uint8_t kSamsungAcFanTurbo = 7;
+const uint8_t kSamsungAcMinTemp = 16; // 16C
+const uint8_t kSamsungAcMaxTemp = 30; // 30C
+const uint8_t kSamsungAcAutoTemp = 25; // 25C
+const uint8_t kSamsungAcTempMask = 0xF0;
+const uint8_t kSamsungAcPowerMask1 = 0x20;
+const uint8_t kSamsungAcPowerMask2 = 0x30;
+const uint8_t kSamsungAcFanMask = 0x0E;
+const uint8_t kSamsungAcSwingMask = 0x70;
+const uint8_t kSamsungAcSwingMove = 0b010;
+const uint8_t kSamsungAcSwingStop = 0b111;
+const uint8_t kSamsungAcBeepMask = 0x02;
+const uint8_t kSamsungAcCleanMask10 = 0x80;
+const uint8_t kSamsungAcCleanMask11 = 0x02;
+const uint8_t kSamsungAcQuietMask11 = 0x01;
+
+const uint16_t kSamsungACSectionLength = 7;
+const uint64_t kSamsungAcPowerSection = 0x1D20F00000000;
+
+// Classes
+class IRSamsungAc {
+ public:
+ explicit IRSamsungAc(uint16_t pin);
+
+ void stateReset();
+#if SEND_SAMSUNG_AC
+ void send(const bool calcchecksum = true);
+ void sendExtended(const bool calcchecksum = true);
+#endif // SEND_SAMSUNG_AC
+ void begin();
+ void on();
+ void off();
+ void setPower(const bool state);
+ bool getPower();
+ void setTemp(const uint8_t temp);
+ uint8_t getTemp();
+ void setFan(const uint8_t speed);
+ uint8_t getFan();
+ void setMode(const uint8_t mode);
+ uint8_t getMode();
+ void setSwing(const bool state);
+ bool getSwing();
+ void setBeep(const bool state);
+ bool getBeep();
+ void setClean(const bool state);
+ bool getClean();
+ void setQuiet(const bool state);
+ bool getQuiet();
+ uint8_t* getRaw();
+ void setRaw(const uint8_t new_code[],
+ const uint16_t length = kSamsungAcStateLength);
+ static bool validChecksum(const uint8_t state[],
+ const uint16_t length = kSamsungAcStateLength);
+ static uint8_t calcChecksum(const uint8_t state[],
+ const uint16_t length = kSamsungAcStateLength);
+#ifdef ARDUINO
+ String toString();
+#else
+ std::string toString();
+#endif
+
+ private:
+ // The state of the IR remote in IR code form.
+ uint8_t remote_state[kSamsungAcExtendedStateLength];
+ void checksum(const uint16_t length = kSamsungAcStateLength);
+ IRsend _irsend;
+};
+
+#endif // IR_SAMSUNG_H_
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Sanyo.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Sanyo.cpp
similarity index 70%
rename from lib/IRremoteESP8266-2.2.1.02/src/ir_Sanyo.cpp
rename to lib/IRremoteESP8266-2.5.2.03/src/ir_Sanyo.cpp
index cbb13a3291df..b2b4d7830ece 100644
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Sanyo.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Sanyo.cpp
@@ -5,7 +5,6 @@
#include
#include "IRrecv.h"
#include "IRsend.h"
-#include "IRtimer.h"
// SSSS AAA N N Y Y OOO
// S A A NN N Y Y O O
@@ -21,31 +20,35 @@
// Sanyo SA 8650B
// Ref:
// https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Sanyo.cpp
-#define SANYO_SA8650B_HDR_MARK 3500U // seen range 3500
-#define SANYO_SA8650B_HDR_SPACE 950U // seen 950
-#define SANYO_SA8650B_ONE_MARK 2400U // seen 2400
-#define SANYO_SA8650B_ZERO_MARK 700U // seen 700
+
+const uint16_t kSanyoSa8650bHdrMark = 3500; // seen range 3500
+const uint16_t kSanyoSa8650bHdrSpace = 950; // seen 950
+const uint16_t kSanyoSa8650bOneMark = 2400; // seen 2400
+const uint16_t kSanyoSa8650bZeroMark = 700; // seen 700
// usually see 713 - not using ticks as get number wrapround
-#define SANYO_SA8650B_DOUBLE_SPACE_USECS 800U
-#define SANYO_SA8650B_RPT_LENGTH 45000U
+const uint16_t kSanyoSa8650bDoubleSpaceUsecs = 800;
+const uint16_t kSanyoSa8650bRptLength = 45000;
// Sanyo LC7461
// Ref:
// https://github.com/marcosamarinho/IRremoteESP8266/blob/master/ir_Sanyo.cpp
// http://slydiman.narod.ru/scr/kb/sanyo.htm
// http://pdf.datasheetcatalog.com/datasheet/sanyo/LC7461.pdf
-#define SANYO_LC7461_ADDRESS_MASK ((1 << SANYO_LC7461_ADDRESS_BITS) - 1)
-#define SANYO_LC7461_COMMAND_MASK ((1 << SANYO_LC7461_COMMAND_BITS) - 1)
-#define SANYO_LC7461_HDR_MARK 9000U
-#define SANYO_LC7461_HDR_SPACE 4500U
-#define SANYO_LC7461_BIT_MARK 560U // 1T
-#define SANYO_LC7461_ONE_SPACE 1690U // 3T
-#define SANYO_LC7461_ZERO_SPACE 560U // 1T
-#define SANYO_LC7461_MIN_COMMAND_LENGTH 108000UL
-#define SANYO_LC7461_MIN_GAP SANYO_LC7461_MIN_COMMAND_LENGTH - \
- (SANYO_LC7461_HDR_MARK + SANYO_LC7461_HDR_SPACE + SANYO_LC7461_BITS * \
- (SANYO_LC7461_BIT_MARK + (SANYO_LC7461_ONE_SPACE + \
- SANYO_LC7461_ZERO_SPACE) / 2) \
- + SANYO_LC7461_BIT_MARK)
+
+const uint16_t kSanyoLc7461AddressMask = (1 << kSanyoLC7461AddressBits) - 1;
+const uint16_t kSanyoLc7461CommandMask = (1 << kSanyoLC7461CommandBits) - 1;
+const uint16_t kSanyoLc7461HdrMark = 9000;
+const uint16_t kSanyoLc7461HdrSpace = 4500;
+const uint16_t kSanyoLc7461BitMark = 560; // 1T
+const uint16_t kSanyoLc7461OneSpace = 1690; // 3T
+const uint16_t kSanyoLc7461ZeroSpace = 560; // 1T
+const uint32_t kSanyoLc7461MinCommandLength = 108000;
+
+const uint16_t kSanyoLc7461MinGap =
+ kSanyoLc7461MinCommandLength -
+ (kSanyoLc7461HdrMark + kSanyoLc7461HdrSpace +
+ kSanyoLC7461Bits * (kSanyoLc7461BitMark +
+ (kSanyoLc7461OneSpace + kSanyoLc7461ZeroSpace) / 2) +
+ kSanyoLc7461BitMark);
#if SEND_SANYO
// Construct a Sanyo LC7461 message.
@@ -62,18 +65,18 @@
// According with LIRC, this protocol is used on Sanyo, Aiwa and Chinon
uint64_t IRsend::encodeSanyoLC7461(uint16_t address, uint8_t command) {
// Mask our input values to ensure the correct bit sizes.
- address &= SANYO_LC7461_ADDRESS_MASK;
- command &= SANYO_LC7461_COMMAND_MASK;
+ address &= kSanyoLc7461AddressMask;
+ command &= kSanyoLc7461CommandMask;
uint64_t data = address;
- address ^= SANYO_LC7461_ADDRESS_MASK; // Invert the 13 LSBs.
+ address ^= kSanyoLc7461AddressMask; // Invert the 13 LSBs.
// Append the now inverted address.
- data = (data << SANYO_LC7461_ADDRESS_BITS) | address;
+ data = (data << kSanyoLC7461AddressBits) | address;
// Append the command.
- data = (data << SANYO_LC7461_COMMAND_BITS) | command;
- command ^= SANYO_LC7461_COMMAND_MASK; // Invert the command.
+ data = (data << kSanyoLC7461CommandBits) | command;
+ command ^= kSanyoLc7461CommandMask; // Invert the command.
// Append the now inverted command.
- data = (data << SANYO_LC7461_COMMAND_BITS) | command;
+ data = (data << kSanyoLC7461CommandBits) | command;
return data;
}
@@ -128,31 +131,30 @@ void IRsend::sendSanyoLC7461(uint64_t data, uint16_t nbits, uint16_t repeat) {
// http://pdf.datasheetcatalog.com/datasheet/sanyo/LC7461.pdf
bool IRrecv::decodeSanyoLC7461(decode_results *results, uint16_t nbits,
bool strict) {
- if (strict && nbits != SANYO_LC7461_BITS)
+ if (strict && nbits != kSanyoLC7461Bits)
return false; // Not strictly in spec.
// This protocol is basically a 42-bit variant of the NEC protocol.
if (!decodeNEC(results, nbits, false))
return false; // Didn't match a NEC format (without strict)
// Bits 30 to 42+.
- uint16_t address = results->value >> (SANYO_LC7461_BITS -
- SANYO_LC7461_ADDRESS_BITS);
+ uint16_t address =
+ results->value >> (kSanyoLC7461Bits - kSanyoLC7461AddressBits);
// Bits 9 to 16.
- uint8_t command = (results->value >> SANYO_LC7461_COMMAND_BITS) &
- SANYO_LC7461_COMMAND_MASK;
+ uint8_t command =
+ (results->value >> kSanyoLC7461CommandBits) & kSanyoLc7461CommandMask;
// Compliance
if (strict) {
- if (results->bits != nbits)
- return false;
+ if (results->bits != nbits) return false;
// Bits 17 to 29.
uint16_t inverted_address =
- (results->value >> (SANYO_LC7461_COMMAND_BITS * 2)) &
- SANYO_LC7461_ADDRESS_MASK;
+ (results->value >> (kSanyoLC7461CommandBits * 2)) &
+ kSanyoLc7461AddressMask;
// Bits 1-8.
- uint8_t inverted_command = results->value & SANYO_LC7461_COMMAND_MASK;
- if ((address ^ SANYO_LC7461_ADDRESS_MASK) != inverted_address)
+ uint8_t inverted_command = results->value & kSanyoLc7461CommandMask;
+ if ((address ^ kSanyoLc7461AddressMask) != inverted_address)
return false; // Address integrity check failed.
- if ((command ^ SANYO_LC7461_COMMAND_MASK) != inverted_command)
+ if ((command ^ kSanyoLc7461CommandMask) != inverted_command)
return false; // Command integrity check failed.
}
@@ -183,9 +185,9 @@ bool IRrecv::decodeSanyoLC7461(decode_results *results, uint16_t nbits,
// Ref:
// https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Sanyo.cpp
bool IRrecv::decodeSanyo(decode_results *results, uint16_t nbits, bool strict) {
- if (results->rawlen < 2 * nbits + HEADER - 1)
+ if (results->rawlen < 2 * nbits + kHeader - 1)
return false; // Shorter than shortest possible.
- if (strict && nbits != SANYO_SA8650B_BITS)
+ if (strict && nbits != kSanyoSA8650BBits)
return false; // Doesn't match the spec.
uint16_t offset = 0;
@@ -193,9 +195,9 @@ bool IRrecv::decodeSanyo(decode_results *results, uint16_t nbits, bool strict) {
// TODO(crankyoldgit): This repeat code looks like garbage, it should never
// match or if it does, it won't be reliable. We should probably just
// remove it.
- if (results->rawbuf[offset++] < SANYO_SA8650B_DOUBLE_SPACE_USECS) {
+ if (results->rawbuf[offset++] < kSanyoSa8650bDoubleSpaceUsecs) {
results->bits = 0;
- results->value = REPEAT;
+ results->value = kRepeat;
results->decode_type = SANYO;
results->address = 0;
results->command = 0;
@@ -204,27 +206,27 @@ bool IRrecv::decodeSanyo(decode_results *results, uint16_t nbits, bool strict) {
}
// Header
- if (!matchMark(results->rawbuf[offset++], SANYO_SA8650B_HDR_MARK))
+ if (!matchMark(results->rawbuf[offset++], kSanyoSa8650bHdrMark))
return false;
// NOTE: These next two lines look very wrong. Treat as suspect.
- if (!matchMark(results->rawbuf[offset++], SANYO_SA8650B_HDR_MARK))
+ if (!matchMark(results->rawbuf[offset++], kSanyoSa8650bHdrMark))
return false;
// Data
uint64_t data = 0;
while (offset + 1 < results->rawlen) {
- if (!matchSpace(results->rawbuf[offset], SANYO_SA8650B_HDR_SPACE))
+ if (!matchSpace(results->rawbuf[offset], kSanyoSa8650bHdrSpace))
break;
offset++;
- if (matchMark(results->rawbuf[offset], SANYO_SA8650B_ONE_MARK))
+ if (matchMark(results->rawbuf[offset], kSanyoSa8650bOneMark))
data = (data << 1) | 1; // 1
- else if (matchMark(results->rawbuf[offset], SANYO_SA8650B_ZERO_MARK))
+ else if (matchMark(results->rawbuf[offset], kSanyoSa8650bZeroMark))
data <<= 1; // 0
else
return false;
offset++;
}
- if (strict && SANYO_SA8650B_BITS > (offset - 1U) / 2U)
+ if (strict && kSanyoSA8650BBits > (offset - 1U) / 2U)
return false;
// Success
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Sharp.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Sharp.cpp
similarity index 68%
rename from lib/IRremoteESP8266-2.2.1.02/src/ir_Sharp.cpp
rename to lib/IRremoteESP8266-2.5.2.03/src/ir_Sharp.cpp
index 1a0bb35569ee..ae1b59c74d51 100644
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Sharp.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Sharp.cpp
@@ -4,7 +4,6 @@
#include
#include "IRrecv.h"
#include "IRsend.h"
-#include "IRtimer.h"
#include "IRutils.h"
// SSSS H H AAA RRRR PPPP
@@ -13,32 +12,37 @@
// S H H A A R R P
// SSSS H H A A R R P
+// Equipment it seems compatible with:
+// * Sharp LC-52D62U
+// *
+//
+
// Constants
// period time = 1/38000Hz = 26.316 microseconds.
// Ref:
// GlobalCache's IR Control Tower data.
// http://www.sbprojects.com/knowledge/ir/sharp.php
-#define SHARP_TICK 26U
-#define SHARP_BIT_MARK_TICKS 10U
-#define SHARP_BIT_MARK (SHARP_BIT_MARK_TICKS * SHARP_TICK)
-#define SHARP_ONE_SPACE_TICKS 70U
-#define SHARP_ONE_SPACE (SHARP_ONE_SPACE_TICKS * SHARP_TICK)
-#define SHARP_ZERO_SPACE_TICKS 30U
-#define SHARP_ZERO_SPACE (SHARP_ZERO_SPACE_TICKS * SHARP_TICK)
-#define SHARP_GAP_TICKS 1677U
-#define SHARP_GAP (SHARP_GAP_TICKS * SHARP_TICK)
-
+const uint16_t kSharpTick = 26;
+const uint16_t kSharpBitMarkTicks = 10;
+const uint16_t kSharpBitMark = kSharpBitMarkTicks * kSharpTick;
+const uint16_t kSharpOneSpaceTicks = 70;
+const uint16_t kSharpOneSpace = kSharpOneSpaceTicks * kSharpTick;
+const uint16_t kSharpZeroSpaceTicks = 30;
+const uint16_t kSharpZeroSpace = kSharpZeroSpaceTicks * kSharpTick;
+const uint16_t kSharpGapTicks = 1677;
+const uint16_t kSharpGap = kSharpGapTicks * kSharpTick;
// Address(5) + Command(8) + Expansion(1) + Check(1)
-#define SHARP_TOGGLE_MASK ((1 << (SHARP_BITS - SHARP_ADDRESS_BITS)) - 1)
-#define SHARP_ADDRESS_MASK ((1 << SHARP_ADDRESS_BITS) - 1)
-#define SHARP_COMMAND_MASK ((1 << SHARP_COMMAND_BITS) - 1)
+const uint64_t kSharpToggleMask =
+ ((uint64_t)1 << (kSharpBits - kSharpAddressBits)) - 1;
+const uint64_t kSharpAddressMask = ((uint64_t)1 << kSharpAddressBits) - 1;
+const uint64_t kSharpCommandMask = ((uint64_t)1 << kSharpCommandBits) - 1;
#if (SEND_SHARP || SEND_DENON)
// Send a (raw) Sharp message
//
// Args:
// data: Contents of the message to be sent.
-// nbits: Nr. of bits of data to be sent. Typically SHARP_BITS.
+// nbits: Nr. of bits of data to be sent. Typically kSharpBits.
// repeat: Nr. of additional times the message is to be sent.
//
// Status: BETA / Previously working fine.
@@ -56,28 +60,20 @@
// http://www.mwftr.com/ucF08/LEC14%20PIC%20IR.pdf
// http://www.hifi-remote.com/johnsfine/DecodeIR.html#Sharp
void IRsend::sendSharpRaw(uint64_t data, uint16_t nbits, uint16_t repeat) {
- // Set 38kHz IR carrier frequency & a 1/3 (33%) duty cycle.
- enableIROut(38, 33);
-
for (uint16_t i = 0; i <= repeat; i++) {
// Protocol demands that the data be sent twice; once normally,
// then with all but the address bits inverted.
// Note: Previously this used to be performed 3 times (normal, inverted,
// normal), however all data points to that being incorrect.
for (uint8_t n = 0; n < 2; n++) {
- // No Header
-
- // Data
- sendData(SHARP_BIT_MARK, SHARP_ONE_SPACE,
- SHARP_BIT_MARK, SHARP_ZERO_SPACE,
- data, nbits, true);
- // Footer
- mark(SHARP_BIT_MARK);
- space(SHARP_GAP);
-
+ sendGeneric(0, 0, // No Header
+ kSharpBitMark, kSharpOneSpace, kSharpBitMark, kSharpZeroSpace,
+ kSharpBitMark, kSharpGap, data, nbits, 38, true,
+ 0, // Repeats are handled already.
+ 33);
// Invert the data per protocol. This is always called twice, so it's
// retured to original upon exiting the inner loop.
- data ^= SHARP_TOGGLE_MASK;
+ data ^= kSharpToggleMask;
}
}
}
@@ -110,17 +106,17 @@ uint32_t IRsend::encodeSharp(uint16_t address, uint16_t command,
uint16_t expansion, uint16_t check,
bool MSBfirst) {
// Mask any unexpected bits.
- address &= ((1 << SHARP_ADDRESS_BITS) - 1);
- command &= ((1 << SHARP_COMMAND_BITS) - 1);
+ address &= ((1 << kSharpAddressBits) - 1);
+ command &= ((1 << kSharpCommandBits) - 1);
expansion &= 1;
check &= 1;
if (!MSBfirst) { // Correct bit order if needed.
- address = reverseBits(address, SHARP_ADDRESS_BITS);
- command = reverseBits(command, SHARP_COMMAND_BITS);
+ address = reverseBits(address, kSharpAddressBits);
+ command = reverseBits(command, kSharpCommandBits);
}
// Concatinate all the bits.
- return (address << (SHARP_COMMAND_BITS + 2)) | (command << 2) |
+ return (address << (kSharpCommandBits + 2)) | (command << 2) |
(expansion << 1) | check;
}
@@ -129,7 +125,7 @@ uint32_t IRsend::encodeSharp(uint16_t address, uint16_t command,
// Args:
// address: Address value to be sent.
// command: Command value to be sent.
-// nbits: Nr. of bits of data to be sent. Typically SHARP_BITS.
+// nbits: Nr. of bits of data to be sent. Typically kSharpBits.
// repeat: Nr. of additional times the message is to be sent.
//
// Status: DEPRICATED / Previously working fine.
@@ -159,13 +155,13 @@ void IRsend::sendSharp(uint16_t address, uint16_t command, uint16_t nbits,
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
-// nbits: Nr. of data bits to expect. Typically SHARP_BITS.
+// nbits: Nr. of data bits to expect. Typically kSharpBits.
// strict: Flag indicating if we should perform strict matching.
// expansion: Should we expect the expansion bit to be set. Default is true.
// Returns:
// boolean: True if it can decode it, false if it can't.
//
-// Status: BETA / Should work okay.
+// Status: STABLE / Working fine.
//
// Note:
// This procedure returns a value suitable for use in sendSharpRaw().
@@ -178,90 +174,83 @@ void IRsend::sendSharp(uint16_t address, uint16_t command, uint16_t nbits,
// http://www.hifi-remote.com/johnsfine/DecodeIR.html#Sharp
bool IRrecv::decodeSharp(decode_results *results, uint16_t nbits, bool strict,
bool expansion) {
- if (results->rawlen < 2 * nbits + FOOTER - 1)
+ if (results->rawlen < 2 * nbits + kFooter - 1)
return false; // Not enough entries to be a Sharp message.
// Compliance
if (strict) {
- if (nbits != SHARP_BITS)
- return false; // Request is out of spec.
+ if (nbits != kSharpBits) return false; // Request is out of spec.
// DISABLED - See TODO
#ifdef UNIT_TEST
// An in spec message has the data sent normally, then inverted. So we
// expect twice as many entries than to just get the results.
- if (results->rawlen < 2 * (2 * nbits + FOOTER))
- return false;
+ if (results->rawlen < 2 * (2 * nbits + kFooter)) return false;
#endif
}
uint64_t data = 0;
- uint16_t offset = OFFSET_START;
+ uint16_t offset = kStartOffset;
// No header
// But try to auto-calibrate off the initial mark signal.
- if (!matchMark(results->rawbuf[offset], SHARP_BIT_MARK, 35)) return false;
+ if (!matchMark(results->rawbuf[offset], kSharpBitMark, 35)) return false;
// Calculate how long the common tick time is based on the header mark.
- uint32_t tick = results->rawbuf[offset] * RAWTICK / SHARP_BIT_MARK_TICKS;
+ uint32_t tick = results->rawbuf[offset] * kRawTick / kSharpBitMarkTicks;
// Data
for (uint16_t i = 0; i < nbits; i++, offset++) {
- // Use a higher tolerance value for SHARP_BIT_MARK as it is quite small.
- if (!matchMark(results->rawbuf[offset++], SHARP_BIT_MARK_TICKS * tick, 35))
+ // Use a higher tolerance value for kSharpBitMark as it is quite small.
+ if (!matchMark(results->rawbuf[offset++], kSharpBitMarkTicks * tick, 35))
return false;
- if (matchSpace(results->rawbuf[offset], SHARP_ONE_SPACE_TICKS * tick))
+ if (matchSpace(results->rawbuf[offset], kSharpOneSpaceTicks * tick))
data = (data << 1) | 1; // 1
- else if (matchSpace(results->rawbuf[offset], SHARP_ZERO_SPACE_TICKS * tick))
+ else if (matchSpace(results->rawbuf[offset], kSharpZeroSpaceTicks * tick))
data <<= 1; // 0
else
return false;
}
// Footer
- if (!match(results->rawbuf[offset++], SHARP_BIT_MARK_TICKS * tick))
+ if (!match(results->rawbuf[offset++], kSharpBitMarkTicks * tick))
return false;
if (offset < results->rawlen &&
- !matchAtLeast(results->rawbuf[offset], SHARP_GAP_TICKS * tick))
+ !matchAtLeast(results->rawbuf[offset], kSharpGapTicks * tick))
return false;
// Compliance
if (strict) {
// Check the state of the expansion bit is what we expect.
- if ((data & 0b10) >> 1 != expansion)
- return false;
+ if ((data & 0b10) >> 1 != expansion) return false;
// The check bit should be cleared in a normal message.
- if (data & 0b1)
- return false;
- // DISABLED - See TODO
+ if (data & 0b1) return false;
+ // DISABLED - See TODO
#ifdef UNIT_TEST
// Grab the second copy of the data (i.e. inverted)
// Header
// i.e. The inter-data/command repeat gap.
- if (!matchSpace(results->rawbuf[offset++], SHARP_GAP_TICKS * tick))
+ if (!matchSpace(results->rawbuf[offset++], kSharpGapTicks * tick))
return false;
// Data
uint64_t second_data = 0;
for (uint16_t i = 0; i < nbits; i++, offset++) {
- // Use a higher tolerance value for SHARP_BIT_MARK as it is quite small.
- if (!matchMark(results->rawbuf[offset++], SHARP_BIT_MARK_TICKS * tick,
- 35))
+ // Use a higher tolerance value for kSharpBitMark as it is quite small.
+ if (!matchMark(results->rawbuf[offset++], kSharpBitMarkTicks * tick, 35))
return false;
- if (matchSpace(results->rawbuf[offset], SHARP_ONE_SPACE_TICKS * tick))
+ if (matchSpace(results->rawbuf[offset], kSharpOneSpaceTicks * tick))
second_data = (second_data << 1) | 1; // 1
- else if (matchSpace(results->rawbuf[offset],
- SHARP_ZERO_SPACE_TICKS * tick))
+ else if (matchSpace(results->rawbuf[offset], kSharpZeroSpaceTicks * tick))
second_data <<= 1; // 0
else
return false;
}
// Footer
- if (!match(results->rawbuf[offset++], SHARP_BIT_MARK_TICKS * tick))
+ if (!match(results->rawbuf[offset++], kSharpBitMarkTicks * tick))
return false;
if (offset < results->rawlen &&
- !matchAtLeast(results->rawbuf[offset], SHARP_GAP_TICKS * tick))
+ !matchAtLeast(results->rawbuf[offset], kSharpGapTicks * tick))
return false;
// Check that second_data has been inverted correctly.
- if (data != (second_data ^ SHARP_TOGGLE_MASK))
- return false;
+ if (data != (second_data ^ kSharpToggleMask)) return false;
#endif // UNIT_TEST
}
@@ -270,9 +259,9 @@ bool IRrecv::decodeSharp(decode_results *results, uint16_t nbits, bool strict,
results->bits = nbits;
results->value = data;
// Address & command are actually transmitted in LSB first order.
- results->address = reverseBits(data, nbits) & SHARP_ADDRESS_MASK;
- results->command = reverseBits((data >> 2) & SHARP_COMMAND_MASK,
- SHARP_COMMAND_BITS);
+ results->address = reverseBits(data, nbits) & kSharpAddressMask;
+ results->command =
+ reverseBits((data >> 2) & kSharpCommandMask, kSharpCommandBits);
return true;
}
#endif // (DECODE_SHARP || DECODE_DENON)
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Sherwood.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Sherwood.cpp
similarity index 71%
rename from lib/IRremoteESP8266-2.2.1.02/src/ir_Sherwood.cpp
rename to lib/IRremoteESP8266-2.5.2.03/src/ir_Sherwood.cpp
index 97e75067a8ac..8af7dfb349a2 100644
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Sherwood.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Sherwood.cpp
@@ -14,16 +14,15 @@
//
// Args:
// data: The contents of the command you want to send.
-// nbits: The bit size of the command being sent. (SHERWOOD_BITS)
+// nbits: The bit size of the command being sent. (kSherwoodBits)
// repeat: The nr. of times you want the command to be repeated. (Default: 1)
//
// Status: STABLE / Known working.
//
// Note:
// Sherwood remote codes appear to be NEC codes with a manditory repeat code.
-// i.e. repeat should be >= SHERWOOD_MIN_REPEAT (1).
-void IRsend::sendSherwood(uint64_t data, uint16_t nbits,
- uint16_t repeat) {
- sendNEC(data, nbits, std::max((uint16_t) SHERWOOD_MIN_REPEAT, repeat));
+// i.e. repeat should be >= kSherwoodMinRepeat (1).
+void IRsend::sendSherwood(uint64_t data, uint16_t nbits, uint16_t repeat) {
+ sendNEC(data, nbits, std::max((uint16_t)kSherwoodMinRepeat, repeat));
}
#endif
diff --git a/lib/IRremoteESP8266-2.2.1.02/src/ir_Sony.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Sony.cpp
similarity index 62%
rename from lib/IRremoteESP8266-2.2.1.02/src/ir_Sony.cpp
rename to lib/IRremoteESP8266-2.5.2.03/src/ir_Sony.cpp
index fd2652d1dc9f..efa6e6a46ca3 100644
--- a/lib/IRremoteESP8266-2.2.1.02/src/ir_Sony.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Sony.cpp
@@ -5,7 +5,6 @@
#include
#include "IRrecv.h"
#include "IRsend.h"
-#include "IRtimer.h"
#include "IRutils.h"
// SSSS OOO N N Y Y
@@ -20,19 +19,19 @@
// Constants
// Ref:
// http://www.sbprojects.com/knowledge/ir/sirc.php
-#define SONY_TICK 200U
-#define SONY_HDR_MARK_TICKS 12U
-#define SONY_HDR_MARK (SONY_HDR_MARK_TICKS * SONY_TICK)
-#define SONY_SPACE_TICKS 3U
-#define SONY_SPACE (SONY_SPACE_TICKS * SONY_TICK)
-#define SONY_ONE_MARK_TICKS 6U
-#define SONY_ONE_MARK (SONY_ONE_MARK_TICKS * SONY_TICK)
-#define SONY_ZERO_MARK_TICKS 3U
-#define SONY_ZERO_MARK (SONY_ZERO_MARK_TICKS * SONY_TICK)
-#define SONY_RPT_LENGTH_TICKS 225U
-#define SONY_RPT_LENGTH (SONY_RPT_LENGTH_TICKS * SONY_TICK)
-#define SONY_MIN_GAP_TICKS 50U
-#define SONY_MIN_GAP (SONY_MIN_GAP_TICKS * SONY_TICK)
+const uint16_t kSonyTick = 200;
+const uint16_t kSonyHdrMarkTicks = 12;
+const uint16_t kSonyHdrMark = kSonyHdrMarkTicks * kSonyTick;
+const uint16_t kSonySpaceTicks = 3;
+const uint16_t kSonySpace = kSonySpaceTicks * kSonyTick;
+const uint16_t kSonyOneMarkTicks = 6;
+const uint16_t kSonyOneMark = kSonyOneMarkTicks * kSonyTick;
+const uint16_t kSonyZeroMarkTicks = 3;
+const uint16_t kSonyZeroMark = kSonyZeroMarkTicks * kSonyTick;
+const uint16_t kSonyRptLengthTicks = 225;
+const uint16_t kSonyRptLength = kSonyRptLengthTicks * kSonyTick;
+const uint16_t kSonyMinGapTicks = 50;
+const uint16_t kSonyMinGap = kSonyMinGapTicks * kSonyTick;
#if SEND_SONY
// Send a Sony/SIRC(Serial Infra-Red Control) message.
@@ -51,24 +50,10 @@
// Ref:
// http://www.sbprojects.com/knowledge/ir/sirc.php
void IRsend::sendSony(uint64_t data, uint16_t nbits, uint16_t repeat) {
- // Sony devices use a 40kHz IR carrier frequency & a 1/3 (33%) duty cycle.
- enableIROut(40, 33);
- IRtimer usecs = IRtimer();
-
- for (uint16_t i = 0; i <= repeat; i++) { // Typically loop 3 or more times.
- usecs.reset();
- // Header
- mark(SONY_HDR_MARK);
- space(SONY_SPACE);
- // Data
- sendData(SONY_ONE_MARK, SONY_SPACE, SONY_ZERO_MARK, SONY_SPACE,
- data, nbits, true);
- // Footer
- // The Sony protocol requires us to wait 45ms from start of a code to the
- // start of the next one. A 10ms minimum gap is also required.
- space(std::max(SONY_MIN_GAP, SONY_RPT_LENGTH - usecs.elapsed()));
- }
- // A space() is always performed last, so no need to turn off the LED.
+ sendGeneric(kSonyHdrMark, kSonySpace, kSonyOneMark, kSonySpace, kSonyZeroMark,
+ kSonySpace,
+ 0, // No Footer mark.
+ kSonyMinGap, kSonyRptLength, data, nbits, 40, true, repeat, 33);
}
// Convert Sony/SIRC command, address, & extended bits into sendSony format.
@@ -81,8 +66,8 @@ void IRsend::sendSony(uint64_t data, uint16_t nbits, uint16_t repeat) {
// A sendSony compatible data message.
//
// Status: BETA / Should be working.
-uint32_t IRsend::encodeSony(uint16_t nbits, uint16_t command,
- uint16_t address, uint16_t extended) {
+uint32_t IRsend::encodeSony(uint16_t nbits, uint16_t command, uint16_t address,
+ uint16_t extended) {
uint32_t result = 0;
switch (nbits) {
case 12: // 5 address bits.
@@ -120,7 +105,7 @@ uint32_t IRsend::encodeSony(uint16_t nbits, uint16_t command,
// Ref:
// http://www.sbprojects.com/knowledge/ir/sirc.php
bool IRrecv::decodeSony(decode_results *results, uint16_t nbits, bool strict) {
- if (results->rawlen < 2 * nbits + HEADER - 1)
+ if (results->rawlen < 2 * nbits + kHeader - 1)
return false; // Message is smaller than we expected.
// Compliance
@@ -136,31 +121,30 @@ bool IRrecv::decodeSony(decode_results *results, uint16_t nbits, bool strict) {
}
uint64_t data = 0;
- uint16_t offset = OFFSET_START;
+ uint16_t offset = kStartOffset;
uint16_t actualBits;
uint32_t timeSoFar = 0; // Time in uSecs of the message length.
// Header
- timeSoFar += results->rawbuf[offset] * RAWTICK;
- if (!matchMark(results->rawbuf[offset], SONY_HDR_MARK))
- return false;
+ timeSoFar += results->rawbuf[offset] * kRawTick;
+ if (!matchMark(results->rawbuf[offset], kSonyHdrMark)) return false;
// Calculate how long the common tick time is based on the header mark.
- uint32_t tick = results->rawbuf[offset++] * RAWTICK / SONY_HDR_MARK_TICKS;
+ uint32_t tick = results->rawbuf[offset++] * kRawTick / kSonyHdrMarkTicks;
// Data
for (actualBits = 0; offset < results->rawlen - 1; actualBits++, offset++) {
- // The gap after a Sony packet for a repeat should be SONY_MIN_GAP or
- // (SONY_RPT_LENGTH - timeSoFar) according to the spec.
- if (matchSpace(results->rawbuf[offset], SONY_MIN_GAP_TICKS * tick) ||
- matchAtLeast(results->rawbuf[offset], SONY_RPT_LENGTH - timeSoFar))
+ // The gap after a Sony packet for a repeat should be kSonyMinGap or
+ // (kSonyRptLength - timeSoFar) according to the spec.
+ if (matchSpace(results->rawbuf[offset], kSonyMinGapTicks * tick) ||
+ matchAtLeast(results->rawbuf[offset], kSonyRptLength - timeSoFar))
break; // Found a repeat space.
- timeSoFar += results->rawbuf[offset] * RAWTICK;
- if (!matchSpace(results->rawbuf[offset++], SONY_SPACE_TICKS * tick))
+ timeSoFar += results->rawbuf[offset] * kRawTick;
+ if (!matchSpace(results->rawbuf[offset++], kSonySpaceTicks * tick))
return false;
- timeSoFar += results->rawbuf[offset] * RAWTICK;
- if (matchMark(results->rawbuf[offset], SONY_ONE_MARK_TICKS * tick))
+ timeSoFar += results->rawbuf[offset] * kRawTick;
+ if (matchMark(results->rawbuf[offset], kSonyOneMarkTicks * tick))
data = (data << 1) | 1;
- else if (matchMark(results->rawbuf[offset], SONY_ZERO_MARK_TICKS * tick))
+ else if (matchMark(results->rawbuf[offset], kSonyZeroMarkTicks * tick))
data <<= 1;
else
return false;
@@ -179,14 +163,14 @@ bool IRrecv::decodeSony(decode_results *results, uint16_t nbits, bool strict) {
data = reverseBits(data, actualBits);
// Decode the address & command from raw decode value.
switch (actualBits) {
- case 12: // 7 command bits, 5 address bits.
- case 15: // 7 command bits, 8 address bits.
+ case 12: // 7 command bits, 5 address bits.
+ case 15: // 7 command bits, 8 address bits.
results->command = data & 0x7F; // Bits 0-6
- results->address = data >> 7; // Bits 7-14
+ results->address = data >> 7; // Bits 7-14
break;
case 20: // 7 command bits, 5 address bits, 8 extended (command) bits.
results->command = (data & 0x7F) + ((data >> 12) << 7); // Bits 0-6,12-19
- results->address = (data >> 7) & 0x1F; // Bits 7-11
+ results->address = (data >> 7) & 0x1F; // Bits 7-11
break;
default: // Shouldn't happen, but just in case.
results->address = 0;
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Toshiba.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Toshiba.cpp
new file mode 100644
index 000000000000..817b5fbaa598
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Toshiba.cpp
@@ -0,0 +1,340 @@
+// Copyright 2017 David Conran
+
+#include "ir_Toshiba.h"
+#include
+#ifndef ARDUINO
+#include
+#endif
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRutils.h"
+
+// TTTTTTT OOOOO SSSSS HH HH IIIII BBBBB AAA
+// TTT OO OO SS HH HH III BB B AAAAA
+// TTT OO OO SSSSS HHHHHHH III BBBBBB AA AA
+// TTT OO OO SS HH HH III BB BB AAAAAAA
+// TTT OOOO0 SSSSS HH HH IIIII BBBBBB AA AA
+
+// Toshiba A/C support added by David Conran
+//
+// Equipment it seems compatible with:
+// * Toshiba RAS-B13N3KV2 / Akita EVO II
+// * Toshiba RAS-B13N3KVP-E, RAS 18SKP-ES
+// * Toshiba WH-TA04NE, WC-L03SE
+// *
+
+// Constants
+
+// Toshiba A/C
+// Ref:
+// https://github.com/r45635/HVAC-IR-Control/blob/master/HVAC_ESP8266/HVAC_ESP8266T.ino#L77
+const uint16_t kToshibaAcHdrMark = 4400;
+const uint16_t kToshibaAcHdrSpace = 4300;
+const uint16_t kToshibaAcBitMark = 543;
+const uint16_t kToshibaAcOneSpace = 1623;
+const uint16_t kToshibaAcZeroSpace = 472;
+const uint16_t kToshibaAcMinGap = 7048;
+
+#if SEND_TOSHIBA_AC
+// Send a Toshiba A/C message.
+//
+// Args:
+// data: An array of bytes containing the IR command.
+// nbytes: Nr. of bytes of data in the array. (>=kToshibaACStateLength)
+// repeat: Nr. of times the message is to be repeated.
+// (Default = kToshibaACMinRepeat).
+//
+// Status: StABLE / Working.
+//
+void IRsend::sendToshibaAC(unsigned char data[], uint16_t nbytes,
+ uint16_t repeat) {
+ if (nbytes < kToshibaACStateLength)
+ return; // Not enough bytes to send a proper message.
+ sendGeneric(kToshibaAcHdrMark, kToshibaAcHdrSpace, kToshibaAcBitMark,
+ kToshibaAcOneSpace, kToshibaAcBitMark, kToshibaAcZeroSpace,
+ kToshibaAcBitMark, kToshibaAcMinGap, data, nbytes, 38, true,
+ repeat, 50);
+}
+#endif // SEND_TOSHIBA_AC
+
+// Code to emulate Toshiba A/C IR remote control unit.
+// Inspired and derived from the work done at:
+// https://github.com/r45635/HVAC-IR-Control
+//
+// Status: STABLE / Working.
+//
+// Initialise the object.
+IRToshibaAC::IRToshibaAC(uint16_t pin) : _irsend(pin) { stateReset(); }
+
+// Reset the state of the remote to a known good state/sequence.
+void IRToshibaAC::stateReset() {
+ // The state of the IR remote in IR code form.
+ // Known good state obtained from:
+ // https://github.com/r45635/HVAC-IR-Control/blob/master/HVAC_ESP8266/HVAC_ESP8266T.ino#L103
+ // Note: Can't use the following because it requires -std=c++11
+ // uint8_t remote_state[kToshibaACStateLength] = {
+ // 0xF2, 0x0D, 0x03, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x00 };
+ remote_state[0] = 0xF2;
+ remote_state[1] = 0x0D;
+ remote_state[2] = 0x03;
+ remote_state[3] = 0xFC;
+ remote_state[4] = 0x01;
+ for (uint8_t i = 5; i < kToshibaACStateLength; i++) remote_state[i] = 0;
+ mode_state = remote_state[6] & 0b00000011;
+ checksum(); // Calculate the checksum
+}
+
+// Configure the pin for output.
+void IRToshibaAC::begin() { _irsend.begin(); }
+
+#if SEND_TOSHIBA_AC
+// Send the current desired state to the IR LED.
+void IRToshibaAC::send() {
+ checksum(); // Ensure correct checksum before sending.
+ _irsend.sendToshibaAC(remote_state);
+}
+#endif // SEND_TOSHIBA_AC
+
+// Return a pointer to the internal state date of the remote.
+uint8_t* IRToshibaAC::getRaw() {
+ checksum();
+ return remote_state;
+}
+
+// Override the internal state with the new state.
+void IRToshibaAC::setRaw(uint8_t newState[]) {
+ for (uint8_t i = 0; i < kToshibaACStateLength; i++) {
+ remote_state[i] = newState[i];
+ }
+ mode_state = getMode(true);
+}
+
+// Calculate the checksum for a given array.
+// Args:
+// state: The array to calculate the checksum over.
+// length: The size of the array.
+// Returns:
+// The 8 bit checksum value.
+uint8_t IRToshibaAC::calcChecksum(const uint8_t state[],
+ const uint16_t length) {
+ uint8_t checksum = 0;
+ // Only calculate it for valid lengths.
+ if (length > 1) {
+ // Checksum is simple XOR of all bytes except the last one.
+ for (uint8_t i = 0; i < length - 1; i++) checksum ^= state[i];
+ }
+ return checksum;
+}
+
+// Verify the checksum is valid for a given state.
+// Args:
+// state: The array to verify the checksum of.
+// length: The size of the state.
+// Returns:
+// A boolean.
+bool IRToshibaAC::validChecksum(const uint8_t state[], const uint16_t length) {
+ return (length > 1 && state[length - 1] == calcChecksum(state, length));
+}
+
+// Calculate & set the checksum for the current internal state of the remote.
+void IRToshibaAC::checksum(const uint16_t length) {
+ // Stored the checksum value in the last byte.
+ if (length > 1) remote_state[length - 1] = calcChecksum(remote_state, length);
+}
+
+// Set the requested power state of the A/C to off.
+void IRToshibaAC::on() {
+ // state = ON;
+ remote_state[6] &= ~kToshibaAcPower;
+ setMode(mode_state);
+}
+
+// Set the requested power state of the A/C to off.
+void IRToshibaAC::off() {
+ // state = OFF;
+ remote_state[6] |= (kToshibaAcPower | 0b00000011);
+}
+
+// Set the requested power state of the A/C.
+void IRToshibaAC::setPower(bool state) {
+ if (state)
+ on();
+ else
+ off();
+}
+
+// Return the requested power state of the A/C.
+bool IRToshibaAC::getPower() {
+ return ((remote_state[6] & kToshibaAcPower) == 0);
+}
+
+// Set the temp. in deg C
+void IRToshibaAC::setTemp(uint8_t temp) {
+ temp = std::max((uint8_t)kToshibaAcMinTemp, temp);
+ temp = std::min((uint8_t)kToshibaAcMaxTemp, temp);
+ remote_state[5] = (temp - kToshibaAcMinTemp) << 4;
+}
+
+// Return the set temp. in deg C
+uint8_t IRToshibaAC::getTemp() {
+ return ((remote_state[5] >> 4) + kToshibaAcMinTemp);
+}
+
+// Set the speed of the fan, 0-5.
+// 0 is auto, 1-5 is the speed, 5 is Max.
+void IRToshibaAC::setFan(uint8_t fan) {
+ // Bounds check
+ if (fan > kToshibaAcFanMax)
+ fan = kToshibaAcFanMax; // Set the fan to maximum if out of range.
+ if (fan > kToshibaAcFanAuto) fan++;
+ remote_state[6] &= 0b00011111; // Clear the previous fan state
+ remote_state[6] |= (fan << 5);
+}
+
+// Return the requested state of the unit's fan.
+uint8_t IRToshibaAC::getFan() {
+ uint8_t fan = remote_state[6] >> 5;
+ if (fan == kToshibaAcFanAuto) return kToshibaAcFanAuto;
+ return --fan;
+}
+
+// Get the requested climate operation mode of the a/c unit.
+// Args:
+// useRaw: Indicate to get the mode from the state array. (Default: false)
+// Returns:
+// A uint8_t containing the A/C mode.
+uint8_t IRToshibaAC::getMode(bool useRaw) {
+ if (useRaw)
+ return (remote_state[6] & 0b00000011);
+ else
+ return mode_state;
+}
+
+// Set the requested climate operation mode of the a/c unit.
+void IRToshibaAC::setMode(uint8_t mode) {
+ // If we get an unexpected mode, default to AUTO.
+ switch (mode) {
+ case kToshibaAcAuto:
+ break;
+ case kToshibaAcCool:
+ break;
+ case kToshibaAcDry:
+ break;
+ case kToshibaAcHeat:
+ break;
+ default:
+ mode = kToshibaAcAuto;
+ }
+ mode_state = mode;
+ // Only adjust the remote_state if we have power set to on.
+ if (getPower()) {
+ remote_state[6] &= 0b11111100; // Clear the previous mode.
+ remote_state[6] |= mode_state;
+ }
+}
+
+// Convert the internal state into a human readable string.
+#ifdef ARDUINO
+String IRToshibaAC::toString() {
+ String result = "";
+#else
+std::string IRToshibaAC::toString() {
+ std::string result = "";
+#endif // ARDUINO
+ result += "Power: ";
+ if (getPower())
+ result += "On";
+ else
+ result += "Off";
+ result += ", Mode: " + uint64ToString(getMode());
+ switch (getMode()) {
+ case kToshibaAcAuto:
+ result += " (AUTO)";
+ break;
+ case kToshibaAcCool:
+ result += " (COOL)";
+ break;
+ case kToshibaAcHeat:
+ result += " (HEAT)";
+ break;
+ case kToshibaAcDry:
+ result += " (DRY)";
+ break;
+ default:
+ result += " (UNKNOWN)";
+ }
+ result += ", Temp: " + uint64ToString(getTemp()) + "C";
+ result += ", Fan: " + uint64ToString(getFan());
+ switch (getFan()) {
+ case kToshibaAcFanAuto:
+ result += " (AUTO)";
+ break;
+ case kToshibaAcFanMax:
+ result += " (MAX)";
+ break;
+ }
+ return result;
+}
+
+#if DECODE_TOSHIBA_AC
+// Decode a Toshiba AC IR message if possible.
+// Places successful decode information in the results pointer.
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: The number of data bits to expect. Typically kToshibaACBits.
+// strict: Flag to indicate if we strictly adhere to the specification.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: STABLE / Working.
+//
+// Ref:
+//
+bool IRrecv::decodeToshibaAC(decode_results* results, uint16_t nbits,
+ bool strict) {
+ uint16_t offset = kStartOffset;
+ uint16_t dataBitsSoFar = 0;
+
+ // Have we got enough data to successfully decode?
+ if (results->rawlen < kToshibaACBits + kHeader + kFooter - 1)
+ return false; // Can't possibly be a valid message.
+
+ // Compliance
+ if (strict && nbits != kToshibaACBits)
+ return false; // Must be called with the correct nr. of bytes.
+
+ // Header
+ if (!matchMark(results->rawbuf[offset++], kToshibaAcHdrMark)) return false;
+ if (!matchSpace(results->rawbuf[offset++], kToshibaAcHdrSpace)) return false;
+
+ // Data
+ for (uint8_t i = 0; i < kToshibaACStateLength; i++) {
+ // Read a byte's worth of data.
+ match_result_t data_result =
+ matchData(&(results->rawbuf[offset]), 8, kToshibaAcBitMark,
+ kToshibaAcOneSpace, kToshibaAcBitMark, kToshibaAcZeroSpace);
+ if (data_result.success == false) return false; // Fail
+ dataBitsSoFar += 8;
+ results->state[i] = (uint8_t)data_result.data;
+ offset += data_result.used;
+ }
+
+ // Footer
+ if (!matchMark(results->rawbuf[offset++], kToshibaAcBitMark)) return false;
+ if (!matchSpace(results->rawbuf[offset++], kToshibaAcMinGap)) return false;
+
+ // Compliance
+ if (strict) {
+ // Check that the checksum of the message is correct.
+ if (!IRToshibaAC::validChecksum(results->state)) return false;
+ }
+
+ // Success
+ results->decode_type = TOSHIBA_AC;
+ results->bits = dataBitsSoFar;
+ // No need to record the state as we stored it as we decoded it.
+ // As we use result->state, we don't record value, address, or command as it
+ // is a union data type.
+ return true;
+}
+#endif // DECODE_TOSHIBA_AC
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Toshiba.h b/lib/IRremoteESP8266-2.5.2.03/src/ir_Toshiba.h
new file mode 100644
index 000000000000..1a1e6cdc81a1
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Toshiba.h
@@ -0,0 +1,85 @@
+// Copyright 2017 David Conran
+#ifndef IR_TOSHIBA_H_
+#define IR_TOSHIBA_H_
+
+#define __STDC_LIMIT_MACROS
+#include
+#ifdef ARDUINO
+#include
+#else
+#include
+#endif
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+
+// TTTTTTT OOOOO SSSSS HH HH IIIII BBBBB AAA
+// TTT OO OO SS HH HH III BB B AAAAA
+// TTT OO OO SSSSS HHHHHHH III BBBBBB AA AA
+// TTT OO OO SS HH HH III BB BB AAAAAAA
+// TTT OOOO0 SSSSS HH HH IIIII BBBBBB AA AA
+
+// Toshiba A/C support added by David Conran
+
+// Constants
+const uint8_t kToshibaAcAuto = 0;
+const uint8_t kToshibaAcCool = 1;
+const uint8_t kToshibaAcDry = 2;
+const uint8_t kToshibaAcHeat = 3;
+const uint8_t kToshibaAcPower = 4;
+const uint8_t kToshibaAcFanAuto = 0;
+const uint8_t kToshibaAcFanMax = 5;
+const uint8_t kToshibaAcMinTemp = 17; // 17C
+const uint8_t kToshibaAcMaxTemp = 30; // 30C
+
+// Legacy defines. (Deperecated)
+#define TOSHIBA_AC_AUTO kToshibaAcAuto
+#define TOSHIBA_AC_COOL kToshibaAcCool
+#define TOSHIBA_AC_DRY kToshibaAcDry
+#define TOSHIBA_AC_HEAT kToshibaAcHeat
+#define TOSHIBA_AC_POWER kToshibaAcPower
+#define TOSHIBA_AC_FAN_AUTO kToshibaAcFanAuto
+#define TOSHIBA_AC_FAN_MAX kToshibaAcFanMax
+#define TOSHIBA_AC_MIN_TEMP kToshibaAcMinTemp
+#define TOSHIBA_AC_MAX_TEMP kToshibaAcMaxTemp
+
+class IRToshibaAC {
+ public:
+ explicit IRToshibaAC(uint16_t pin);
+
+ void stateReset();
+#if SEND_TOSHIBA_AC
+ void send();
+#endif // SEND_TOSHIBA_AC
+ void begin();
+ void on();
+ void off();
+ void setPower(bool state);
+ bool getPower();
+ void setTemp(uint8_t temp);
+ uint8_t getTemp();
+ void setFan(uint8_t fan);
+ uint8_t getFan();
+ void setMode(uint8_t mode);
+ uint8_t getMode(bool useRaw = false);
+ void setRaw(uint8_t newState[]);
+ uint8_t* getRaw();
+ static bool validChecksum(const uint8_t state[],
+ const uint16_t length = kToshibaACStateLength);
+#ifdef ARDUINO
+ String toString();
+#else
+ std::string toString();
+#endif
+#ifndef UNIT_TEST
+
+ private:
+#endif
+ uint8_t remote_state[kToshibaACStateLength];
+ void checksum(const uint16_t length = kToshibaACStateLength);
+ static uint8_t calcChecksum(const uint8_t state[],
+ const uint16_t length = kToshibaACStateLength);
+ uint8_t mode_state;
+ IRsend _irsend;
+};
+
+#endif // IR_TOSHIBA_H_
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Trotec.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Trotec.cpp
new file mode 100644
index 000000000000..0bece2664a60
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Trotec.cpp
@@ -0,0 +1,127 @@
+// Copyright 2017 stufisher
+
+#include "ir_Trotec.h"
+#include "IRremoteESP8266.h"
+#include "IRutils.h"
+
+// Constants
+const uint16_t kTrotecHdrMark = 5952;
+const uint16_t kTrotecHdrSpace = 7364;
+const uint16_t kTrotecOneMark = 592;
+const uint16_t kTrotecOneSpace = 1560;
+const uint16_t kTrotecZeroMark = 592;
+const uint16_t kTrotecZeroSpace = 592;
+const uint16_t kTrotecGap = 6184;
+const uint16_t kTrotecGapEnd = 1500; // made up value
+
+#if SEND_TROTEC
+
+void IRsend::sendTrotec(unsigned char data[], uint16_t nbytes,
+ uint16_t repeat) {
+ if (nbytes < kTrotecStateLength) return;
+
+ for (uint16_t r = 0; r <= repeat; r++) {
+ sendGeneric(kTrotecHdrMark, kTrotecHdrSpace, kTrotecOneMark,
+ kTrotecOneSpace, kTrotecZeroMark, kTrotecZeroSpace,
+ kTrotecOneMark, kTrotecGap, data, nbytes, 36, false,
+ 0, // Repeats handled elsewhere
+ 50);
+ // More footer
+ enableIROut(36);
+ mark(kTrotecOneMark);
+ space(kTrotecGapEnd);
+ }
+}
+#endif // SEND_TROTEC
+
+IRTrotecESP::IRTrotecESP(uint16_t pin) : _irsend(pin) { stateReset(); }
+
+void IRTrotecESP::begin() { _irsend.begin(); }
+
+#if SEND_TROTEC
+void IRTrotecESP::send() {
+ checksum();
+ _irsend.sendTrotec(trotec);
+}
+#endif // SEND_TROTEC
+
+void IRTrotecESP::checksum() {
+ uint8_t sum = 0;
+ uint8_t i;
+
+ for (i = 2; i < 8; i++) sum += trotec[i];
+
+ trotec[8] = sum & 0xFF;
+}
+
+void IRTrotecESP::stateReset() {
+ for (uint8_t i = 2; i < kTrotecStateLength; i++) trotec[i] = 0x0;
+
+ trotec[0] = kTrotecIntro1;
+ trotec[1] = kTrotecIntro2;
+
+ setPower(false);
+ setTemp(kTrotecDefTemp);
+ setSpeed(kTrotecFanMed);
+ setMode(kTrotecAuto);
+}
+
+uint8_t* IRTrotecESP::getRaw() {
+ checksum();
+ return trotec;
+}
+
+void IRTrotecESP::setPower(bool state) {
+ if (state)
+ trotec[2] |= (kTrotecOn << 3);
+ else
+ trotec[2] &= ~(kTrotecOn << 3);
+}
+
+uint8_t IRTrotecESP::getPower() { return trotec[2] & (kTrotecOn << 3); }
+
+void IRTrotecESP::setSpeed(uint8_t speed) {
+ trotec[2] = (trotec[2] & 0xcf) | (speed << 4);
+}
+
+uint8_t IRTrotecESP::getSpeed() { return trotec[2] & 0x30; }
+
+void IRTrotecESP::setMode(uint8_t mode) {
+ trotec[2] = (trotec[2] & 0xfc) | mode;
+}
+
+uint8_t IRTrotecESP::getMode() { return trotec[2] & 0x03; }
+
+void IRTrotecESP::setTemp(uint8_t temp) {
+ if (temp < kTrotecMinTemp)
+ temp = kTrotecMinTemp;
+ else if (temp > kTrotecMaxTemp)
+ temp = kTrotecMaxTemp;
+
+ trotec[3] = (trotec[3] & 0x80) | (temp - kTrotecMinTemp);
+}
+
+uint8_t IRTrotecESP::getTemp() { return trotec[3] & 0x7f; }
+
+void IRTrotecESP::setSleep(bool sleep) {
+ if (sleep)
+ trotec[3] |= (kTrotecSleepOn << 7);
+ else
+ trotec[3] &= ~(kTrotecSleepOn << 7);
+}
+
+bool IRTrotecESP::getSleep(void) { return trotec[3] & (kTrotecSleepOn << 7); }
+
+void IRTrotecESP::setTimer(uint8_t timer) {
+ if (timer > kTrotecMaxTimer) timer = kTrotecMaxTimer;
+
+ if (timer) {
+ trotec[5] |= (kTrotecTimerOn << 6);
+ trotec[6] = timer;
+ } else {
+ trotec[5] &= ~(kTrotecTimerOn << 6);
+ trotec[6] = 0;
+ }
+}
+
+uint8_t IRTrotecESP::getTimer() { return trotec[6]; }
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Trotec.h b/lib/IRremoteESP8266-2.5.2.03/src/ir_Trotec.h
new file mode 100644
index 000000000000..040d9a722d5d
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Trotec.h
@@ -0,0 +1,92 @@
+// Copyright 2017 stufisher
+
+#ifndef IR_TROTEC_H_
+#define IR_TROTEC_H_
+
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+
+// Constants
+// Byte 0
+const uint8_t kTrotecIntro1 = 0x12;
+
+// Byte 1
+const uint8_t kTrotecIntro2 = 0x34;
+
+// Byte 2
+const uint8_t kTrotecAuto = 0;
+const uint8_t kTrotecCool = 1;
+const uint8_t kTrotecDry = 2;
+const uint8_t kTrotecFan = 3;
+
+const uint8_t kTrotecOn = 1;
+const uint8_t kTrotecOff = 0;
+
+const uint8_t kTrotecFanLow = 1;
+const uint8_t kTrotecFanMed = 2;
+const uint8_t kTrotecFanHigh = 3;
+
+// Byte 3
+const uint8_t kTrotecMinTemp = 18;
+const uint8_t kTrotecDefTemp = 25;
+const uint8_t kTrotecMaxTemp = 32;
+
+const uint8_t kTrotecSleepOn = 1;
+
+// Byte 5
+const uint8_t kTrotecTimerOn = 1;
+
+// Byte 6
+const uint8_t kTrotecMinTimer = 0;
+const uint8_t kTrotecMaxTimer = 23;
+
+// Legacy defines. (Deperecated)
+#define TROTEC_AUTO kTrotecAuto
+#define TROTEC_COOL kTrotecCool
+#define TROTEC_DRY kTrotecDry
+#define TROTEC_FAN kTrotecFan
+#define TROTEC_FAN_LOW kTrotecFanLow
+#define TROTEC_FAN_MED kTrotecFanMed
+#define TROTEC_FAN_HIGH kTrotecFanHigh
+#define TROTEC_MIN_TEMP kTrotecMinTemp
+#define TROTEC_MAX_TEMP kTrotecMaxTemp
+#define TROTEC_MIN_TIMER kTrotecMinTimer
+#define TROTEC_MAX_TIMER kTrotecMaxTimer
+
+class IRTrotecESP {
+ public:
+ explicit IRTrotecESP(uint16_t pin);
+
+#if SEND_TROTEC
+ void send();
+#endif // SEND_TROTEC
+ void begin();
+
+ void setPower(bool state);
+ uint8_t getPower();
+
+ void setTemp(uint8_t temp);
+ uint8_t getTemp();
+
+ void setSpeed(uint8_t fan);
+ uint8_t getSpeed();
+
+ uint8_t getMode();
+ void setMode(uint8_t mode);
+
+ bool getSleep();
+ void setSleep(bool sleep);
+
+ uint8_t getTimer();
+ void setTimer(uint8_t timer);
+
+ uint8_t* getRaw();
+
+ private:
+ uint8_t trotec[kTrotecStateLength];
+ void stateReset();
+ void checksum();
+ IRsend _irsend;
+};
+
+#endif // IR_TROTEC_H_
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Whirlpool.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Whirlpool.cpp
new file mode 100644
index 000000000000..67151399103f
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Whirlpool.cpp
@@ -0,0 +1,149 @@
+// Copyright 2018 David Conran
+//
+// Code to emulate Whirlpool protocol compatible devices.
+// Should be compatible with:
+// * SPIS409L, SPIS412L, SPIW409L, SPIW412L, SPIW418L
+//
+
+#include
+#ifndef ARDUINO
+#include
+#endif
+#include "IRrecv.h"
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+#include "IRutils.h"
+
+// WW WW HH HH IIIII RRRRRR LL PPPPPP OOOOO OOOOO LL
+// WW WW HH HH III RR RR LL PP PP OO OO OO OO LL
+// WW W WW HHHHHHH III RRRRRR LL PPPPPP OO OO OO OO LL
+// WW WWW WW HH HH III RR RR LL PP OO OO OO OO LL
+// WW WW HH HH IIIII RR RR LLLLLLL PP OOOO0 OOOO0 LLLLLLL
+
+// Constants
+// Ref: https://github.com/markszabo/IRremoteESP8266/issues/509
+const uint16_t kWhirlpoolAcHdrMark = 8950;
+const uint16_t kWhirlpoolAcHdrSpace = 4484;
+const uint16_t kWhirlpoolAcBitMark = 597;
+const uint16_t kWhirlpoolAcOneSpace = 1649;
+const uint16_t kWhirlpoolAcZeroSpace = 533;
+const uint16_t kWhirlpoolAcGap = 7920;
+const uint32_t kWhirlpoolAcMinGap = 100000; // Completely made up value.
+const uint8_t kWhirlpoolAcSections = 3;
+
+#if SEND_WHIRLPOOL_AC
+// Send a Whirlpool A/C message.
+//
+// Args:
+// data: An array of bytes containing the IR command.
+// nbytes: Nr. of bytes of data in the array. (>=kWhirlpoolAcStateLength)
+// repeat: Nr. of times the message is to be repeated. (Default = 0).
+//
+// Status: ALPHA / Untested.
+//
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/509
+void IRsend::sendWhirlpoolAC(unsigned char data[], uint16_t nbytes,
+ uint16_t repeat) {
+ if (nbytes < kWhirlpoolAcStateLength)
+ return; // Not enough bytes to send a proper message.
+ for (uint16_t r = 0; r <= repeat; r++) {
+ // Section 1
+ sendGeneric(kWhirlpoolAcHdrMark, kWhirlpoolAcHdrSpace, kWhirlpoolAcBitMark,
+ kWhirlpoolAcOneSpace, kWhirlpoolAcBitMark,
+ kWhirlpoolAcZeroSpace, kWhirlpoolAcBitMark, kWhirlpoolAcGap,
+ data, 6, // 6 bytes == 48 bits
+ 38000, // Complete guess of the modulation frequency.
+ false, 0, 50);
+ // Section 2
+ sendGeneric(0, 0, kWhirlpoolAcBitMark, kWhirlpoolAcOneSpace,
+ kWhirlpoolAcBitMark, kWhirlpoolAcZeroSpace, kWhirlpoolAcBitMark,
+ kWhirlpoolAcGap, data + 6, 8, // 8 bytes == 64 bits
+ 38000, // Complete guess of the modulation frequency.
+ false, 0, 50);
+ // Section 3
+ sendGeneric(0, 0, kWhirlpoolAcBitMark, kWhirlpoolAcOneSpace,
+ kWhirlpoolAcBitMark, kWhirlpoolAcZeroSpace, kWhirlpoolAcBitMark,
+ kWhirlpoolAcMinGap, data + 14, 7, // 7 bytes == 56 bits
+ 38000, // Complete guess of the modulation frequency.
+ false, 0, 50);
+ }
+}
+#endif // SEND_WHIRLPOOL_AC
+
+#if DECODE_WHIRLPOOL_AC
+// Decode the supplied Whirlpool A/C message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: The number of data bits to expect. Typically kWhirlpoolAcBits
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: ALPHA / Untested.
+//
+//
+// Ref:
+// https://github.com/markszabo/IRremoteESP8266/issues/509
+bool IRrecv::decodeWhirlpoolAC(decode_results *results, uint16_t nbits,
+ bool strict) {
+ if (results->rawlen < 2 * nbits + 4 + kHeader + kFooter - 1)
+ return false; // Can't possibly be a valid Whirlpool A/C message.
+ if (strict) {
+ if (nbits != kWhirlpoolAcBits) return false;
+ }
+
+ uint16_t offset = kStartOffset;
+ uint16_t dataBitsSoFar = 0;
+ uint16_t i = 0;
+ match_result_t data_result;
+ uint8_t sectionSize[kWhirlpoolAcSections] = {6, 8, 7};
+
+ // Header
+ if (!matchMark(results->rawbuf[offset++], kWhirlpoolAcHdrMark)) return false;
+ if (!matchSpace(results->rawbuf[offset++], kWhirlpoolAcHdrSpace))
+ return false;
+
+ // Data Section
+ // Keep reading bytes until we either run out of section or state to fill.
+ for (uint8_t section = 0, pos = 0; section < kWhirlpoolAcSections;
+ section++) {
+ pos += sectionSize[section];
+ for (; offset <= results->rawlen - 16 && i < pos;
+ i++, dataBitsSoFar += 8, offset += data_result.used) {
+ data_result =
+ matchData(&(results->rawbuf[offset]), 8, kWhirlpoolAcBitMark,
+ kWhirlpoolAcOneSpace, kWhirlpoolAcBitMark,
+ kWhirlpoolAcZeroSpace, kTolerance, kMarkExcess, false);
+ if (data_result.success == false) break; // Fail
+ // Data is in LSB order. We need to reverse it.
+ results->state[i] = (uint8_t)data_result.data;
+ }
+ // Section Footer
+ if (!matchMark(results->rawbuf[offset++], kWhirlpoolAcBitMark))
+ return false;
+ if (section < kWhirlpoolAcSections - 1) { // Inter-section gaps.
+ if (!matchSpace(results->rawbuf[offset++], kWhirlpoolAcGap)) return false;
+ } else { // Last section / End of message gap.
+ if (offset <= results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset++], kWhirlpoolAcGap))
+ return false;
+ }
+ }
+
+ // Compliance
+ if (strict) {
+ // Re-check we got the correct size/length due to the way we read the data.
+ if (dataBitsSoFar != kWhirlpoolAcBits) return false;
+ }
+
+ // Success
+ results->decode_type = WHIRLPOOL_AC;
+ results->bits = dataBitsSoFar;
+ // No need to record the state as we stored it as we decoded it.
+ // As we use result->state, we don't record value, address, or command as it
+ // is a union data type.
+ return true;
+}
+#endif // WHIRLPOOL_AC
diff --git a/lib/IRremoteESP8266-2.5.2.03/src/ir_Whynter.cpp b/lib/IRremoteESP8266-2.5.2.03/src/ir_Whynter.cpp
new file mode 100644
index 000000000000..555c50788c03
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/src/ir_Whynter.cpp
@@ -0,0 +1,135 @@
+// Copyright 2009 Ken Shirriff
+// Copyright 2017 David Conran
+
+#include
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRutils.h"
+
+// W W H H Y Y N N TTTTT EEEEE RRRRR
+// W W H H Y Y NN N T E R R
+// W W W HHHHH Y N N N T EEE RRRR
+// W W W H H Y N NN T E R R
+// WWW H H Y N N T EEEEE R R
+
+// Whynter A/C ARC-110WD added by Francesco Meschia
+// Whynter originally added from https://github.com/shirriff/Arduino-IRremote/
+
+// Constants
+
+const uint16_t kWhynterTick = 50;
+const uint16_t kWhynterHdrMarkTicks = 57;
+const uint16_t kWhynterHdrMark = kWhynterHdrMarkTicks * kWhynterTick;
+const uint16_t kWhynterHdrSpaceTicks = 57;
+const uint16_t kWhynterHdrSpace = kWhynterHdrSpaceTicks * kWhynterTick;
+const uint16_t kWhynterBitMarkTicks = 15;
+const uint16_t kWhynterBitMark = kWhynterBitMarkTicks * kWhynterTick;
+const uint16_t kWhynterOneSpaceTicks = 43;
+const uint16_t kWhynterOneSpace = kWhynterOneSpaceTicks * kWhynterTick;
+const uint16_t kWhynterZeroSpaceTicks = 15;
+const uint16_t kWhynterZeroSpace = kWhynterZeroSpaceTicks * kWhynterTick;
+const uint16_t kWhynterMinCommandLengthTicks = 2160; // Totally made up value.
+const uint32_t kWhynterMinCommandLength =
+ kWhynterMinCommandLengthTicks * kWhynterTick;
+const uint16_t kWhynterMinGapTicks =
+ kWhynterMinCommandLengthTicks -
+ (2 * (kWhynterBitMarkTicks + kWhynterZeroSpaceTicks) +
+ kWhynterBits * (kWhynterBitMarkTicks + kWhynterOneSpaceTicks));
+const uint16_t kWhynterMinGap = kWhynterMinGapTicks * kWhynterTick;
+
+#if SEND_WHYNTER
+// Send a Whynter message.
+//
+// Args:
+// data: message to be sent.
+// nbits: Nr. of bits of the message to be sent.
+// repeat: Nr. of additional times the message is to be sent.
+//
+// Status: STABLE
+//
+// Ref:
+// https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Whynter.cpp
+void IRsend::sendWhynter(uint64_t data, uint16_t nbits, uint16_t repeat) {
+ // Set IR carrier frequency
+ enableIROut(38);
+
+ for (uint16_t i = 0; i <= repeat; i++) {
+ // (Pre-)Header
+ mark(kWhynterBitMark);
+ space(kWhynterZeroSpace);
+ sendGeneric(
+ kWhynterHdrMark, kWhynterHdrSpace, kWhynterBitMark, kWhynterOneSpace,
+ kWhynterBitMark, kWhynterZeroSpace, kWhynterBitMark, kWhynterMinGap,
+ kWhynterMinCommandLength - (kWhynterBitMark + kWhynterZeroSpace), data,
+ nbits, 38, true, 0, // Repeats are already handled.
+ 50);
+ }
+}
+#endif
+
+#if DECODE_WHYNTER
+// Decode the supplied Whynter message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// nbits: Nr. of data bits to expect.
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: BETA Strict mode is ALPHA.
+//
+// Ref:
+// https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Whynter.cpp
+bool IRrecv::decodeWhynter(decode_results *results, uint16_t nbits,
+ bool strict) {
+ if (results->rawlen < 2 * nbits + 2 * kHeader + kFooter - 1)
+ return false; // We don't have enough entries to possibly match.
+
+ // Compliance
+ if (strict && nbits != kWhynterBits)
+ return false; // Incorrect nr. of bits per spec.
+
+ uint16_t offset = kStartOffset;
+
+ // Header
+ // Sequence begins with a bit mark and a zero space.
+ // These are typically small, so we'll prefer to do the calibration
+ // on the much larger header mark & space that are next.
+ if (!matchMark(results->rawbuf[offset++], kWhynterBitMark)) return false;
+ if (!matchSpace(results->rawbuf[offset++], kWhynterZeroSpace)) return false;
+ // Main header mark and space
+ if (!matchMark(results->rawbuf[offset], kWhynterHdrMark)) return false;
+ // Calculate how long the common tick time is based on the header mark.
+ uint32_t m_tick = results->rawbuf[offset++] * kRawTick / kWhynterHdrMarkTicks;
+ if (!matchSpace(results->rawbuf[offset], kWhynterHdrSpace)) return false;
+ // Calculate how long the common tick time is based on the header space.
+ uint32_t s_tick =
+ results->rawbuf[offset++] * kRawTick / kWhynterHdrSpaceTicks;
+
+ // Data
+ uint64_t data = 0;
+ match_result_t data_result =
+ matchData(&(results->rawbuf[offset]), nbits,
+ kWhynterBitMarkTicks * m_tick, kWhynterOneSpaceTicks * s_tick,
+ kWhynterBitMarkTicks * m_tick, kWhynterZeroSpaceTicks * s_tick);
+ if (data_result.success == false) return false;
+ data = data_result.data;
+ offset += data_result.used;
+
+ // Footer
+ if (!matchMark(results->rawbuf[offset++], kWhynterBitMarkTicks * m_tick))
+ return false;
+ if (offset < results->rawlen &&
+ !matchAtLeast(results->rawbuf[offset], kWhynterMinGapTicks * s_tick))
+ return false;
+
+ // Success
+ results->decode_type = WHYNTER;
+ results->bits = nbits;
+ results->value = data;
+ results->address = 0;
+ results->command = 0;
+ return true;
+}
+#endif
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/IRrecv_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/IRrecv_test.cpp
similarity index 68%
rename from lib/IRremoteESP8266-2.2.1.02/test/IRrecv_test.cpp
rename to lib/IRremoteESP8266-2.5.2.03/test/IRrecv_test.cpp
index 4b22656f6052..85b6685f0094 100644
--- a/lib/IRremoteESP8266-2.2.1.02/test/IRrecv_test.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/test/IRrecv_test.cpp
@@ -1,7 +1,8 @@
// Copyright 2017 David Conran
-#include "IRremoteESP8266.h"
+#include "IRrecv_test.h"
#include "IRrecv.h"
+#include "IRremoteESP8266.h"
#include "IRsend.h"
#include "IRsend_test.h"
#include "gtest/gtest.h"
@@ -9,7 +10,7 @@
// Tests for the IRrecv object.
TEST(TestIRrecv, DefaultBufferSize) {
IRrecv irrecv_default(1);
- EXPECT_EQ(RAWBUF, irrecv_default.getBufSize());
+ EXPECT_EQ(kRawBuf, irrecv_default.getBufSize());
}
TEST(TestIRrecv, LargeBufferSize) {
@@ -29,7 +30,7 @@ TEST(TestIRrecv, MediumBufferSize) {
TEST(TestIRrecv, IRrecvDestructor) {
IRrecv *irrecv_ptr = new IRrecv(1);
- EXPECT_EQ(RAWBUF, irrecv_ptr->getBufSize());
+ EXPECT_EQ(kRawBuf, irrecv_ptr->getBufSize());
delete irrecv_ptr;
irrecv_ptr = new IRrecv(1, 1234);
@@ -119,7 +120,7 @@ TEST(TestDecode, DecodeNEC) {
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(NEC, irsend.capture.decode_type);
- EXPECT_EQ(NEC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
EXPECT_EQ(0x807F40BF, irsend.capture.value);
}
@@ -133,7 +134,7 @@ TEST(TestDecode, DecodeJVC) {
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(JVC, irsend.capture.decode_type);
- EXPECT_EQ(JVC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kJvcBits, irsend.capture.bits);
EXPECT_EQ(0xC2B8, irsend.capture.value);
}
@@ -147,15 +148,15 @@ TEST(TestDecode, DecodeLG) {
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(LG, irsend.capture.decode_type);
- EXPECT_EQ(LG_BITS, irsend.capture.bits);
+ EXPECT_EQ(kLgBits, irsend.capture.bits);
EXPECT_EQ(0x4B4AE51, irsend.capture.value);
irsend.reset();
- irsend.sendLG(0xB4B4AE51, LG32_BITS);
+ irsend.sendLG(0xB4B4AE51, kLg32Bits);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(LG, irsend.capture.decode_type);
- EXPECT_EQ(LG32_BITS, irsend.capture.bits);
+ EXPECT_EQ(kLg32Bits, irsend.capture.bits);
EXPECT_EQ(0xB4B4AE51, irsend.capture.value);
}
@@ -167,9 +168,9 @@ TEST(TestDecode, DecodePanasonic) {
irsend.reset();
irsend.sendPanasonic64(0x40040190ED7C);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, PANASONIC_BITS, true));
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
- EXPECT_EQ(PANASONIC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
}
@@ -183,7 +184,7 @@ TEST(TestDecode, DecodeSamsung) {
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
- EXPECT_EQ(SAMSUNG_BITS, irsend.capture.bits);
+ EXPECT_EQ(kSamsungBits, irsend.capture.bits);
EXPECT_EQ(0xE0E09966, irsend.capture.value);
}
@@ -198,7 +199,7 @@ TEST(TestDecode, DecodeSherwood) {
ASSERT_TRUE(irrecv.decode(&irsend.capture));
// Sherwood codes are really NEC codes.
EXPECT_EQ(NEC, irsend.capture.decode_type);
- EXPECT_EQ(NEC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
EXPECT_EQ(0x807F40BF, irsend.capture.value);
}
@@ -212,7 +213,7 @@ TEST(TestDecode, DecodeWhynter) {
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(WHYNTER, irsend.capture.decode_type);
- EXPECT_EQ(WHYNTER_BITS, irsend.capture.bits);
+ EXPECT_EQ(kWhynterBits, irsend.capture.bits);
EXPECT_EQ(0x87654321, irsend.capture.value);
}
@@ -224,30 +225,29 @@ TEST(TestDecode, DecodeSony) {
// Synthesised Normal Sony 20-bit message.
irsend.reset();
- irsend.sendSony(irsend.encodeSony(SONY_20_BITS, 0x1, 0x1, 0x1));
+ irsend.sendSony(irsend.encodeSony(kSony20Bits, 0x1, 0x1, 0x1));
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(SONY, irsend.capture.decode_type);
- EXPECT_EQ(SONY_20_BITS, irsend.capture.bits);
+ EXPECT_EQ(kSony20Bits, irsend.capture.bits);
EXPECT_EQ(0x81080, irsend.capture.value);
// Synthesised Normal Sony 15-bit message.
irsend.reset();
- irsend.sendSony(irsend.encodeSony(SONY_15_BITS, 21, 1), SONY_15_BITS);
+ irsend.sendSony(irsend.encodeSony(kSony15Bits, 21, 1), kSony15Bits);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(SONY, irsend.capture.decode_type);
- EXPECT_EQ(SONY_15_BITS, irsend.capture.bits);
+ EXPECT_EQ(kSony15Bits, irsend.capture.bits);
EXPECT_EQ(0x5480, irsend.capture.value);
-
// Synthesised Normal Sony 12-bit message.
irsend.reset();
- irsend.sendSony(irsend.encodeSony(SONY_12_BITS, 21, 1), SONY_12_BITS);
+ irsend.sendSony(irsend.encodeSony(kSony12Bits, 21, 1), kSony12Bits);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(SONY, irsend.capture.decode_type);
- EXPECT_EQ(SONY_12_BITS, irsend.capture.bits);
+ EXPECT_EQ(kSony12Bits, irsend.capture.bits);
EXPECT_EQ(0xA90, irsend.capture.value);
}
@@ -261,7 +261,7 @@ TEST(TestDecode, DecodeSharp) {
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(SHARP, irsend.capture.decode_type);
- EXPECT_EQ(SHARP_BITS, irsend.capture.bits);
+ EXPECT_EQ(kSharpBits, irsend.capture.bits);
EXPECT_EQ(0x454A, irsend.capture.value);
}
@@ -275,7 +275,7 @@ TEST(TestDecode, DecodeSanyo) {
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(SANYO_LC7461, irsend.capture.decode_type);
- EXPECT_EQ(SANYO_LC7461_BITS, irsend.capture.bits);
+ EXPECT_EQ(kSanyoLC7461Bits, irsend.capture.bits);
EXPECT_EQ(0x2468DCB56A9, irsend.capture.value);
}
@@ -291,7 +291,7 @@ TEST(TestDecode, DecodeRCMM) {
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(RCMM, irsend.capture.decode_type);
- EXPECT_EQ(RCMM_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRCMMBits, irsend.capture.bits);
EXPECT_EQ(0xe0a600, irsend.capture.value);
// Normal RCMM 12-bit message.
@@ -323,7 +323,7 @@ TEST(TestDecode, DecodeMitsubishi) {
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
- EXPECT_EQ(MITSUBISHI_BITS, irsend.capture.bits);
+ EXPECT_EQ(kMitsubishiBits, irsend.capture.bits);
EXPECT_EQ(0xC2B8, irsend.capture.value);
}
@@ -338,15 +338,15 @@ TEST(TestDecode, DecodeRC5) {
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(RC5, irsend.capture.decode_type);
- EXPECT_EQ(RC5_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC5Bits, irsend.capture.bits);
EXPECT_EQ(0x175, irsend.capture.value);
// Synthesised Normal RC-5X 13-bit message.
irsend.reset();
- irsend.sendRC5(irsend.encodeRC5X(0x02, 0x41, true), RC5X_BITS);
+ irsend.sendRC5(irsend.encodeRC5X(0x02, 0x41, true), kRC5XBits);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(RC5X, irsend.capture.decode_type);
- EXPECT_EQ(RC5X_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC5XBits, irsend.capture.bits);
EXPECT_EQ(0x1881, irsend.capture.value);
}
@@ -361,16 +361,16 @@ TEST(TestDecode, DecodeRC6) {
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(RC6, irsend.capture.decode_type);
- EXPECT_EQ(RC6_MODE0_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC6Mode0Bits, irsend.capture.bits);
EXPECT_EQ(0x175, irsend.capture.value);
// Normal RC-6 36-bit message.
irsend.reset();
- irsend.sendRC6(0xC800F742A, RC6_36_BITS);
+ irsend.sendRC6(0xC800F742A, kRC6_36Bits);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(RC6, irsend.capture.decode_type);
- EXPECT_EQ(RC6_36_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC6_36Bits, irsend.capture.bits);
EXPECT_EQ(0xC800F742A, irsend.capture.value);
}
@@ -384,7 +384,7 @@ TEST(TestDecode, DecodeDish) {
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(DISH, irsend.capture.decode_type);
- EXPECT_EQ(DISH_BITS, irsend.capture.bits);
+ EXPECT_EQ(kDishBits, irsend.capture.bits);
EXPECT_EQ(0x9C00, irsend.capture.value);
}
@@ -403,7 +403,7 @@ TEST(TestDecode, DecodeDenon) {
EXPECT_EQ(0x2278, irsend.capture.value);
// Legacy Denon 14-bit message.
irsend.reset();
- irsend.sendDenon(0x1278, DENON_LEGACY_BITS);
+ irsend.sendDenon(0x1278, kDenonLegacyBits);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(DENON, irsend.capture.decode_type);
@@ -429,7 +429,7 @@ TEST(TestDecode, DecodeCoolix) {
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(COOLIX, irsend.capture.decode_type);
- EXPECT_EQ(COOLIX_BITS, irsend.capture.bits);
+ EXPECT_EQ(kCoolixBits, irsend.capture.bits);
EXPECT_EQ(0x123456, irsend.capture.value);
}
@@ -443,6 +443,119 @@ TEST(TestDecode, DecodeAiwa) {
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
- EXPECT_EQ(AIWA_RC_T501_BITS, irsend.capture.bits);
+ EXPECT_EQ(kAiwaRcT501Bits, irsend.capture.bits);
EXPECT_EQ(0x7F, irsend.capture.value);
}
+
+// Test matchData() on space encoded data.
+TEST(TestMatchData, SpaceEncoded) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(1);
+ irsend.begin();
+
+ uint16_t space_encoded_raw[11] = {500, 500, 500, 1500, 499, 499,
+ 501, 1501, 499, 1490, 500};
+ match_result_t result;
+
+ irsend.reset();
+ irsend.sendRaw(space_encoded_raw, 11, 38000);
+ irsend.makeDecodeResult();
+ result = irrecv.matchData(irsend.capture.rawbuf + 1, 5, 500, 1500, 500, 500);
+ ASSERT_TRUE(result.success);
+ EXPECT_EQ(0b01011, result.data);
+ EXPECT_EQ(10, result.used);
+
+ irsend.reset();
+ irsend.sendRaw(space_encoded_raw, 11, 38000);
+ irsend.makeDecodeResult();
+ result = irrecv.matchData(irsend.capture.rawbuf + 1, 5, 500, 1000, 500, 500);
+ ASSERT_FALSE(result.success);
+}
+
+// Test matchData() on mark encoded data.
+TEST(TestMatchData, MarkEncoded) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(1);
+ irsend.begin();
+
+ uint16_t mark_encoded_raw[11] = {500, 500, 1500, 500, 499, 499,
+ 1501, 501, 1499, 490, 500};
+ match_result_t result;
+
+ irsend.reset();
+ irsend.sendRaw(mark_encoded_raw, 11, 38000);
+ irsend.makeDecodeResult();
+ // MSBF order.
+ result = irrecv.matchData(irsend.capture.rawbuf + 1, 5, 1500, 500, 500, 500);
+ ASSERT_TRUE(result.success);
+ EXPECT_EQ(0b01011, result.data);
+ EXPECT_EQ(10, result.used);
+ // LSBF order.
+ result = irrecv.matchData(irsend.capture.rawbuf + 1, 5, 1500, 500, 500, 500,
+ kTolerance, kMarkExcess, false);
+ ASSERT_TRUE(result.success);
+ EXPECT_EQ(0b11010, result.data); // Bits reversed of the previous test.
+ EXPECT_EQ(10, result.used);
+
+ irsend.reset();
+ irsend.sendRaw(mark_encoded_raw, 11, 38000);
+ irsend.makeDecodeResult();
+ // MSBF order.
+ result = irrecv.matchData(irsend.capture.rawbuf + 1, 5, 1000, 500, 500, 500);
+ ASSERT_FALSE(result.success);
+ // LSBF order.
+ result = irrecv.matchData(irsend.capture.rawbuf + 1, 5, 1000, 500, 500, 500,
+ kTolerance, kMarkExcess, false);
+ ASSERT_FALSE(result.success);
+}
+
+// Test matchData() on "equal total bit time" encoded data.
+TEST(TestMatchData, EqualTotalBitTimeEncoded) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(1);
+ irsend.begin();
+
+ uint16_t equal_encoded_raw[11] = {500, 1500, 1500, 500, 499, 1499,
+ 1501, 501, 1499, 490, 500};
+ match_result_t result;
+
+ irsend.reset();
+ irsend.sendRaw(equal_encoded_raw, 11, 38000);
+ irsend.makeDecodeResult();
+ result = irrecv.matchData(irsend.capture.rawbuf + 1, 5, 1500, 500, 500, 1500);
+ ASSERT_TRUE(result.success);
+ EXPECT_EQ(0b01011, result.data);
+ EXPECT_EQ(10, result.used);
+
+ irsend.reset();
+ irsend.sendRaw(equal_encoded_raw, 11, 38000);
+ irsend.makeDecodeResult();
+ result = irrecv.matchData(irsend.capture.rawbuf + 1, 5, 1000, 500, 500, 1000);
+ ASSERT_FALSE(result.success);
+}
+
+// Test matchData() on arbitrary encoded data.
+TEST(TestMatchData, ArbitraryEncoded) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(1);
+ irsend.begin();
+
+ uint16_t arbitrary_encoded_raw[11] = {500, 1500, 3000, 1000, 499, 1499,
+ 3001, 1001, 2999, 990, 500};
+ match_result_t result;
+
+ irsend.reset();
+ irsend.sendRaw(arbitrary_encoded_raw, 11, 38000);
+ irsend.makeDecodeResult();
+ result =
+ irrecv.matchData(irsend.capture.rawbuf + 1, 5, 3000, 1000, 500, 1500);
+ ASSERT_TRUE(result.success);
+ EXPECT_EQ(0b01011, result.data);
+ EXPECT_EQ(10, result.used);
+
+ irsend.reset();
+ irsend.sendRaw(arbitrary_encoded_raw, 11, 38000);
+ irsend.makeDecodeResult();
+ result = irrecv.matchData(irsend.capture.rawbuf + 1, 5, 1000, 500, 500, 1000);
+ ASSERT_FALSE(result.success);
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/IRrecv_test.h b/lib/IRremoteESP8266-2.5.2.03/test/IRrecv_test.h
new file mode 100644
index 000000000000..bb366c1ee00c
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/IRrecv_test.h
@@ -0,0 +1,17 @@
+// Copyright 2017 David Conran
+
+#ifndef TEST_IRRECV_TEST_H_
+#define TEST_IRRECV_TEST_H_
+
+#include
+#include
+#include
+#include "IRutils.h"
+
+#define EXPECT_STATE_EQ(a, b, c) \
+ for (uint8_t i = 0; i < c / 8; ++i) { \
+ EXPECT_EQ(a[i], b[i]) << "Expected state " \
+ "differs at i = " \
+ << uint64ToString(i); \
+ }
+#endif // TEST_IRRECV_TEST_H_
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/IRsend_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/IRsend_test.cpp
new file mode 100644
index 000000000000..3536399189a8
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/IRsend_test.cpp
@@ -0,0 +1,290 @@
+// Copyright 2017 David Conran
+
+#include "IRsend_test.h"
+#include "IRsend.h"
+#include "gtest/gtest.h"
+
+// Tests sendData().
+
+// Test sending zero bits.
+TEST(TestSendData, SendZeroBits) {
+ IRsendTest irsend(4);
+ irsend.begin();
+ irsend.sendData(1, 2, 3, 4, 0b1, 0, true);
+ EXPECT_EQ("", irsend.outputStr());
+}
+
+// Test sending zero and one.
+TEST(TestSendData, SendSingleBit) {
+ IRsendTest irsend(4);
+ irsend.begin();
+ irsend.sendData(1, 2, 3, 4, 0b1, 1, true);
+ EXPECT_EQ("m1s2", irsend.outputStr());
+ irsend.sendData(1, 2, 3, 4, 0b0, 1, true);
+ EXPECT_EQ("m3s4", irsend.outputStr());
+}
+
+// Test sending bit order.
+TEST(TestSendData, TestingBitSendOrder) {
+ IRsendTest irsend(4);
+ irsend.begin();
+ irsend.sendData(1, 2, 3, 4, 0b10, 2, true);
+ EXPECT_EQ("m1s2m3s4", irsend.outputStr());
+ irsend.sendData(1, 2, 3, 4, 0b10, 2, false);
+ EXPECT_EQ("m3s4m1s2", irsend.outputStr());
+ irsend.sendData(1, 2, 3, 4, 0b0001, 4, false);
+ EXPECT_EQ("m1s2m3s4m3s4m3s4", irsend.outputStr());
+}
+
+// Test sending typical data.
+TEST(TestSendData, SendTypicalData) {
+ IRsendTest irsend(4);
+ irsend.begin();
+ irsend.sendData(1, 2, 3, 4, 0b1010110011110000, 16, true);
+ EXPECT_EQ("m1s2m3s4m1s2m3s4m1s2m1s2m3s4m3s4m1s2m1s2m1s2m1s2m3s4m3s4m3s4m3s4",
+ irsend.outputStr());
+ irsend.sendData(1, 2, 3, 4, 0x1234567890ABCDEF, 64, true);
+ EXPECT_EQ(
+ "m3s4m3s4m3s4m1s2m3s4m3s4m1s2m3s4m3s4m3s4m1s2m1s2m3s4m1s2m3s4m3s4"
+ "m3s4m1s2m3s4m1s2m3s4m1s2m1s2m3s4m3s4m1s2m1s2m1s2m1s2m3s4m3s4m3s4"
+ "m1s2m3s4m3s4m1s2m3s4m3s4m3s4m3s4m1s2m3s4m1s2m3s4m1s2m3s4m1s2m1s2"
+ "m1s2m1s2m3s4m3s4m1s2m1s2m3s4m1s2m1s2m1s2m1s2m3s4m1s2m1s2m1s2m1s2",
+ irsend.outputStr());
+}
+
+// Test sending more than expected bits.
+TEST(TestSendData, SendOverLargeData) {
+ IRsendTest irsend(4);
+ irsend.begin();
+ irsend.sendData(1, 2, 3, 4, 0xFFFFFFFFFFFFFFFF, 70, true);
+ EXPECT_EQ(
+ "m3s4m3s4m3s4m3s4m3s4m3s4"
+ "m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2"
+ "m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2"
+ "m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2"
+ "m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2",
+ irsend.outputStr());
+}
+
+// Test inverting the output.
+TEST(TestIRSend, InvertedOutput) {
+ IRsendTest irsend(4, true);
+ irsend.begin();
+ irsend.sendData(1, 2, 3, 4, 0b1, 1, true);
+ EXPECT_EQ("s1m2", irsend.outputStr());
+ irsend.sendData(1, 2, 3, 4, 0b0, 1, true);
+ EXPECT_EQ("s3m4", irsend.outputStr());
+}
+
+// Test typical use of sendRaw().
+TEST(TestSendRaw, GeneralUse) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(0);
+
+ irsend.begin();
+ // NEC C3E0E0E8 as measured in #204
+ uint16_t rawData[67] = {
+ 8950, 4500, 550, 1650, 600, 1650, 550, 550, 600, 500, 600, 550,
+ 550, 550, 600, 1650, 550, 1650, 600, 1650, 600, 1650, 550, 1700,
+ 550, 550, 600, 550, 550, 550, 600, 500, 600, 550, 550, 1650,
+ 600, 1650, 600, 1650, 550, 550, 600, 500, 600, 500, 600, 550,
+ 550, 550, 600, 1650, 550, 1650, 600, 1650, 600, 500, 650, 1600,
+ 600, 500, 600, 550, 550, 550, 600};
+
+ irsend.sendRaw(rawData, 67, 38);
+ EXPECT_EQ(
+ "m8950s4500"
+ "m550s1650m600s1650m550s550m600s500m600s550m550s550m600s1650m550s1650"
+ "m600s1650m600s1650m550s1700m550s550m600s550m550s550m600s500m600s550"
+ "m550s1650m600s1650m600s1650m550s550m600s500m600s500m600s550m550s550"
+ "m600s1650m550s1650m600s1650m600s500m650s1600m600s500m600s550m550s550"
+ "m600",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendRaw(rawData, 67, 38);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeNEC(&irsend.capture, kNECBits, false));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(32, irsend.capture.bits);
+ EXPECT_EQ(0xC3E0E0E8, irsend.capture.value);
+ EXPECT_EQ(
+ "m8950s4500"
+ "m550s1650m600s1650m550s550m600s500m600s550m550s550m600s1650m550s1650"
+ "m600s1650m600s1650m550s1700m550s550m600s550m550s550m600s500m600s550"
+ "m550s1650m600s1650m600s1650m550s550m600s500m600s500m600s550m550s550"
+ "m600s1650m550s1650m600s1650m600s500m650s1600m600s500m600s550m550s550"
+ "m600",
+ irsend.outputStr());
+}
+
+// Incorrect handling of decodes from Raw. i.e. There is no gap recorded at
+// the end of a command when using the interrupt code. sendRaw() best emulates
+// this for unit testing purposes. sendGC() and sendXXX() will add the trailing
+// gap. Users won't see this in normal use.
+TEST(TestSendRaw, NoTrailingGap) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ uint16_t rawData[67] = {
+ 9000, 4500, 650, 550, 650, 1650, 600, 550, 650, 550, 600, 1650,
+ 650, 550, 600, 1650, 650, 1650, 650, 1650, 600, 550, 650, 1650,
+ 650, 1650, 650, 550, 600, 1650, 650, 1650, 650, 550, 650, 550,
+ 650, 1650, 650, 550, 650, 550, 650, 550, 600, 550, 650, 550,
+ 650, 550, 650, 1650, 600, 550, 650, 1650, 650, 1650, 650, 1650,
+ 650, 1650, 650, 1650, 650, 1650, 600};
+ irsend.sendRaw(rawData, 67, 38);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+}
+
+TEST(TestLowLevelSend, MarkFrequencyModulationAt38kHz) {
+ IRsendLowLevelTest irsend(0);
+
+ irsend.begin();
+
+ irsend.reset();
+ irsend.enableIROut(38000, 50);
+ EXPECT_EQ(5, irsend.mark(100));
+ EXPECT_EQ(
+ "[On]10usecs[Off]11usecs[On]10usecs[Off]11usecs[On]10usecs[Off]11usecs"
+ "[On]10usecs[Off]11usecs[On]10usecs[Off]6usecs",
+ irsend.low_level_sequence);
+
+ irsend.reset();
+ irsend.enableIROut(38000, 33);
+ EXPECT_EQ(5, irsend.mark(100));
+ EXPECT_EQ(
+ "[On]6usecs[Off]15usecs[On]6usecs[Off]15usecs[On]6usecs[Off]15usecs"
+ "[On]6usecs[Off]15usecs[On]6usecs[Off]10usecs",
+ irsend.low_level_sequence);
+
+ irsend.reset();
+ irsend.enableIROut(38000, 100);
+ EXPECT_EQ(1, irsend.mark(1000));
+ EXPECT_EQ("[On]1000usecs[Off]", irsend.low_level_sequence);
+}
+
+TEST(TestLowLevelSend, MarkFrequencyModulationAt36_7kHz) {
+ IRsendLowLevelTest irsend(0);
+
+ irsend.begin();
+
+ irsend.reset();
+ irsend.enableIROut(36700, 50);
+ EXPECT_EQ(5, irsend.mark(100));
+ EXPECT_EQ(
+ "[On]11usecs[Off]11usecs[On]11usecs[Off]11usecs[On]11usecs[Off]11usecs"
+ "[On]11usecs[Off]11usecs[On]11usecs[Off]1usecs",
+ irsend.low_level_sequence);
+
+ irsend.reset();
+ irsend.enableIROut(36700, 33);
+ EXPECT_EQ(5, irsend.mark(100));
+ EXPECT_EQ(
+ "[On]7usecs[Off]15usecs[On]7usecs[Off]15usecs[On]7usecs[Off]15usecs"
+ "[On]7usecs[Off]15usecs[On]7usecs[Off]5usecs",
+ irsend.low_level_sequence);
+
+ irsend.reset();
+ irsend.enableIROut(36700, 100);
+ EXPECT_EQ(1, irsend.mark(1000));
+ EXPECT_EQ("[On]1000usecs[Off]", irsend.low_level_sequence);
+}
+
+TEST(TestLowLevelSend, MarkFrequencyModulationAt40kHz) {
+ IRsendLowLevelTest irsend(0);
+
+ irsend.begin();
+
+ irsend.reset();
+ irsend.enableIROut(40000, 50);
+ EXPECT_EQ(5, irsend.mark(100));
+ EXPECT_EQ(
+ "[On]10usecs[Off]10usecs[On]10usecs[Off]10usecs[On]10usecs[Off]10usecs"
+ "[On]10usecs[Off]10usecs[On]10usecs[Off]10usecs",
+ irsend.low_level_sequence);
+
+ irsend.reset();
+ irsend.enableIROut(40000, 33);
+ EXPECT_EQ(5, irsend.mark(100));
+ EXPECT_EQ(
+ "[On]6usecs[Off]14usecs[On]6usecs[Off]14usecs[On]6usecs[Off]14usecs"
+ "[On]6usecs[Off]14usecs[On]6usecs[Off]14usecs",
+ irsend.low_level_sequence);
+
+ irsend.reset();
+ irsend.enableIROut(40000, 100);
+ EXPECT_EQ(1, irsend.mark(1000));
+ EXPECT_EQ("[On]1000usecs[Off]", irsend.low_level_sequence);
+}
+
+TEST(TestLowLevelSend, MarkNoModulation) {
+ IRsendLowLevelTest irsend(0, false, false);
+
+ irsend.begin();
+
+ irsend.reset();
+ irsend.enableIROut(38000, 50);
+ EXPECT_EQ(1, irsend.mark(1000));
+ EXPECT_EQ("[On]1000usecs[Off]", irsend.low_level_sequence);
+
+ irsend.reset();
+ irsend.enableIROut(36700, 25);
+ EXPECT_EQ(1, irsend.mark(1000));
+ EXPECT_EQ("[On]1000usecs[Off]", irsend.low_level_sequence);
+
+ irsend.reset();
+ irsend.enableIROut(40000, 75);
+ EXPECT_EQ(1, irsend.mark(1000));
+ EXPECT_EQ("[On]1000usecs[Off]", irsend.low_level_sequence);
+}
+
+TEST(TestLowLevelSend, SpaceFrequencyModulation) {
+ IRsendLowLevelTest irsend(0);
+
+ irsend.reset();
+ irsend.enableIROut(38000);
+ irsend.space(1000);
+ EXPECT_EQ("[Off]1000usecs", irsend.low_level_sequence);
+
+ irsend.reset();
+ irsend.enableIROut(40000, 75);
+ irsend.space(1000);
+ EXPECT_EQ("[Off]1000usecs", irsend.low_level_sequence);
+
+ irsend.reset();
+ irsend.enableIROut(38000, 100);
+ irsend.space(1000);
+ EXPECT_EQ("[Off]1000usecs", irsend.low_level_sequence);
+
+ irsend.reset();
+ irsend.enableIROut(38000, 33);
+ irsend.space(1000);
+ EXPECT_EQ("[Off]1000usecs", irsend.low_level_sequence);
+}
+
+TEST(TestLowLevelSend, SpaceNoModulation) {
+ IRsendLowLevelTest irsend(0, false, false);
+
+ irsend.begin();
+
+ irsend.reset();
+ irsend.enableIROut(38000, 50);
+ irsend.space(1000);
+ EXPECT_EQ("[Off]1000usecs", irsend.low_level_sequence);
+
+ irsend.reset();
+ irsend.enableIROut(36700, 25);
+ irsend.space(1000);
+ EXPECT_EQ("[Off]1000usecs", irsend.low_level_sequence);
+
+ irsend.reset();
+ irsend.enableIROut(40000, 75);
+ irsend.space(1000);
+ EXPECT_EQ("[Off]1000usecs", irsend.low_level_sequence);
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/IRsend_test.h b/lib/IRremoteESP8266-2.5.2.03/test/IRsend_test.h
new file mode 100644
index 000000000000..6d9fe51b81ee
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/IRsend_test.h
@@ -0,0 +1,135 @@
+// Copyright 2017 David Conran
+
+#ifndef TEST_IRSEND_TEST_H_
+#define TEST_IRSEND_TEST_H_
+
+#define __STDC_LIMIT_MACROS
+#include
+#include
+#include
+#include
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRtimer.h"
+
+#define OUTPUT_BUF 10000U
+#define RAW_BUF 10000U
+
+#ifdef UNIT_TEST
+// Used to help simulate elapsed time in unit tests.
+uint32_t _IRtimer_unittest_now = 0;
+#endif // UNIT_TEST
+
+class IRsendTest : public IRsend {
+ public:
+ uint32_t output[OUTPUT_BUF];
+ uint16_t last;
+ uint16_t rawbuf[RAW_BUF];
+ decode_results capture;
+
+ explicit IRsendTest(uint16_t x, bool i = false, bool j = true)
+ : IRsend(x, i, j) {
+ reset();
+ }
+
+ void reset() {
+ last = 0;
+ for (uint16_t i = 0; i < OUTPUT_BUF; i++) output[i] = 0;
+ for (uint16_t i = 0; i < RAW_BUF; i++) rawbuf[i] = 0;
+ }
+
+ std::string outputStr() {
+ std::stringstream result;
+ if (last == 0 && output[0] == 0) return "";
+ for (uint16_t i = 0; i <= last; i++) {
+ if ((i & 1) != outputOff) // Odd XOR outputOff
+ result << "s";
+ else
+ result << "m";
+ result << output[i];
+ }
+ reset();
+ return result.str();
+ }
+
+ void makeDecodeResult(uint16_t offset = 0) {
+ capture.decode_type = UNKNOWN;
+ capture.bits = 0;
+ capture.rawlen = last + 2 - offset;
+ capture.overflow = (last - offset >= (int16_t)RAW_BUF);
+ capture.repeat = false;
+ capture.address = 0;
+ capture.command = 0;
+ capture.value = 0;
+ capture.rawbuf = rawbuf;
+ for (uint16_t i = 0; (i < RAW_BUF - 1) && (offset < OUTPUT_BUF);
+ i++, offset++)
+ if (output[offset] / kRawTick > UINT16_MAX)
+ rawbuf[i + 1] = UINT16_MAX;
+ else
+ rawbuf[i + 1] = output[offset] / kRawTick;
+ }
+
+ void dumpRawResult() {
+ std::cout << std::dec;
+ if (capture.rawlen == 0) return;
+ std::cout << "uint16_t rawbuf[" << capture.rawlen - 1 << "] = {";
+ for (uint16_t i = 1; i < capture.rawlen; i++) {
+ if (i % 8 == 1) std::cout << std::endl << " ";
+ std::cout << (capture.rawbuf[i] * kRawTick);
+ // std::cout << "(" << capture.rawbuf[i] << ")";
+ if (i < capture.rawlen - 1) std::cout << ", ";
+ }
+ std::cout << "};" << std::endl;
+ }
+
+ void addGap(uint32_t usecs) { space(usecs); }
+
+ uint16_t mark(uint16_t usec) {
+ IRtimer::add(usec);
+ if (last >= OUTPUT_BUF) return 0;
+ if (last & 1) // Is odd? (i.e. last call was a space())
+ output[++last] = usec;
+ else
+ output[last] += usec;
+ return 0;
+ }
+
+ void space(uint32_t time) {
+ IRtimer::add(time);
+ if (last >= OUTPUT_BUF) return;
+ if (last & 1) { // Is odd? (i.e. last call was a space())
+ output[last] += time;
+ } else {
+ output[++last] = time;
+ }
+ }
+};
+
+#ifdef UNIT_TEST
+class IRsendLowLevelTest : public IRsend {
+ public:
+ std::string low_level_sequence;
+
+ explicit IRsendLowLevelTest(uint16_t x, bool i = false, bool j = true)
+ : IRsend(x, i, j) {
+ reset();
+ }
+
+ void reset() { low_level_sequence = ""; }
+
+ protected:
+ void _delayMicroseconds(uint32_t usec) {
+ _IRtimer_unittest_now += usec;
+ std::ostringstream Convert;
+ Convert << usec;
+ low_level_sequence += Convert.str() + "usecs";
+ }
+
+ void ledOff() { low_level_sequence += "[Off]"; }
+
+ void ledOn() { low_level_sequence += "[On]"; }
+};
+#endif // UNIT_TEST
+
+#endif // TEST_IRSEND_TEST_H_
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/IRutils_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/IRutils_test.cpp
new file mode 100644
index 000000000000..91cf4725c5c5
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/IRutils_test.cpp
@@ -0,0 +1,352 @@
+// Copyright 2017 David Conran
+
+#include "IRutils.h"
+#include
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests reverseBits().
+
+// Tests reverseBits for typical use.
+TEST(ReverseBitsTest, TypicalUse) {
+ EXPECT_EQ(0xF, reverseBits(0xF0, 8));
+ EXPECT_EQ(0xFFFF, reverseBits(0xFFFF0000, 32));
+ EXPECT_EQ(0x555500005555FFFF, reverseBits(0xFFFFAAAA0000AAAA, 64));
+ EXPECT_EQ(0, reverseBits(0, 64));
+ EXPECT_EQ(0xFFFFFFFFFFFFFFFF, reverseBits(0xFFFFFFFFFFFFFFFF, 64));
+}
+
+// Tests reverseBits for bit size values <= 1
+TEST(ReverseBitsTest, LessThanTwoBitsReversed) {
+ EXPECT_EQ(0x12345678, reverseBits(0x12345678, 1));
+ EXPECT_EQ(1234, reverseBits(1234, 0));
+}
+
+// Tests reverseBits for bit size larger than a uint64_t.
+TEST(ReverseBitsTest, LargerThan64BitsReversed) {
+ EXPECT_EQ(0, reverseBits(0, 65));
+ EXPECT_EQ(0xFFFFFFFFFFFFFFFF, reverseBits(0xFFFFFFFFFFFFFFFF, 100));
+ EXPECT_EQ(0x555500005555FFFF, reverseBits(0xFFFFAAAA0000AAAA, 3000));
+}
+
+// Tests reverseBits for bit sizes less than all the data stored.
+TEST(ReverseBitsTest, LessBitsReversedThanInputHasSet) {
+ EXPECT_EQ(0xF8, reverseBits(0xF1, 4));
+ EXPECT_EQ(0xF5, reverseBits(0xFA, 4));
+ EXPECT_EQ(0x12345678FFFF0000, reverseBits(0x123456780000FFFF, 32));
+}
+
+// Tests for uint64ToString()
+
+TEST(TestUint64ToString, TrivialCases) {
+ EXPECT_EQ("0", uint64ToString(0)); // Default base (10)
+ EXPECT_EQ("0", uint64ToString(0, 2)); // Base-2
+ EXPECT_EQ("0", uint64ToString(0, 8)); // Base-8
+ EXPECT_EQ("0", uint64ToString(0, 10)); // Base-10
+ EXPECT_EQ("0", uint64ToString(0, 16)); // Base-16
+
+ EXPECT_EQ("1", uint64ToString(1, 2)); // Base-2
+ EXPECT_EQ("2", uint64ToString(2, 8)); // Base-8
+ EXPECT_EQ("3", uint64ToString(3, 10)); // Base-10
+ EXPECT_EQ("4", uint64ToString(4, 16)); // Base-16
+}
+
+TEST(TestUint64ToString, NormalUse) {
+ EXPECT_EQ("12345", uint64ToString(12345));
+ EXPECT_EQ("100", uint64ToString(4, 2));
+ EXPECT_EQ("3039", uint64ToString(12345, 16));
+ EXPECT_EQ("123456", uint64ToString(123456));
+ EXPECT_EQ("1E240", uint64ToString(123456, 16));
+ EXPECT_EQ("FEEDDEADBEEF", uint64ToString(0xfeeddeadbeef, 16));
+}
+
+TEST(TestUint64ToString, Max64Bit) {
+ EXPECT_EQ("18446744073709551615", uint64ToString(UINT64_MAX)); // Default
+ EXPECT_EQ("1111111111111111111111111111111111111111111111111111111111111111",
+ uint64ToString(UINT64_MAX, 2)); // Base-2
+ EXPECT_EQ("1777777777777777777777", uint64ToString(UINT64_MAX, 8)); // Base-8
+ EXPECT_EQ("18446744073709551615", uint64ToString(UINT64_MAX, 10)); // Base-10
+ EXPECT_EQ("FFFFFFFFFFFFFFFF", uint64ToString(UINT64_MAX, 16)); // Base-16
+}
+
+TEST(TestUint64ToString, Max32Bit) {
+ EXPECT_EQ("4294967295", uint64ToString(UINT32_MAX)); // Default
+ EXPECT_EQ("37777777777", uint64ToString(UINT32_MAX, 8)); // Base-8
+ EXPECT_EQ("4294967295", uint64ToString(UINT32_MAX, 10)); // Base-10
+ EXPECT_EQ("FFFFFFFF", uint64ToString(UINT32_MAX, 16)); // Base-16
+}
+
+TEST(TestUint64ToString, InterestingCases) {
+ // Previous hacky-code didn't handle leading zeros in the lower 32 bits.
+ EXPECT_EQ("100000000", uint64ToString(0x100000000, 16));
+ EXPECT_EQ("100000001", uint64ToString(0x100000001, 16));
+}
+
+TEST(TestUint64ToString, SillyBases) {
+ // If we are given a silly base, we should defer to Base-10.
+ EXPECT_EQ("12345", uint64ToString(12345, 0)); // Super silly, makes no sense.
+ EXPECT_EQ("12345", uint64ToString(12345, 1)); // We don't do unary.
+ EXPECT_EQ("12345", uint64ToString(12345, 100)); // We can't print base-100.
+ EXPECT_EQ("12345", uint64ToString(12345, 37)); // Base-37 is one to far.
+ EXPECT_EQ("9IX", uint64ToString(12345, 36)); // But we *can* do base-36.
+}
+
+TEST(TestGetCorrectedRawLength, NoLargeValues) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(1);
+ uint16_t test_data[7] = {1, 2, 3, 4, 5, 6, 7};
+ irsend.begin();
+ irsend.reset();
+ irsend.sendRaw(test_data, 7, 38000);
+ irsend.makeDecodeResult();
+ irrecv.decode(&irsend.capture);
+ EXPECT_EQ(7, getCorrectedRawLength(&irsend.capture));
+}
+
+TEST(TestGetCorrectedRawLength, WithLargeValues) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(1);
+ uint16_t test_data[7] = {10, 20, 30, 40, 50, 60, 70};
+ irsend.begin();
+ irsend.reset();
+ irsend.sendRaw(test_data, 7, 38000);
+ irsend.makeDecodeResult();
+ irrecv.decode(&irsend.capture);
+ irsend.capture.rawbuf[3] = 60000;
+ ASSERT_EQ(2, kRawTick); // The following values rely on kRawTick being 2.
+ EXPECT_EQ(7 + 2, getCorrectedRawLength(&irsend.capture));
+ irsend.capture.rawbuf[4] = UINT16_MAX - 1;
+ EXPECT_EQ(7 + 2 * 2, getCorrectedRawLength(&irsend.capture));
+ irsend.capture.rawbuf[4] = UINT16_MAX;
+ EXPECT_EQ(7 + 2 * 2, getCorrectedRawLength(&irsend.capture));
+}
+
+TEST(TestResultToSourceCode, SimpleTests) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(1);
+ uint16_t test_data[7] = {10, 20, 30, 40, 50, 60, 70};
+ irsend.begin();
+ irsend.reset();
+ irsend.sendRaw(test_data, 7, 38000);
+ irsend.makeDecodeResult();
+ irrecv.decode(&irsend.capture);
+ EXPECT_EQ(
+ "uint16_t rawData[7] = {10, 20, 30, 40, 50, 60, 70};"
+ " // UNKNOWN A5E5F35D\n",
+ resultToSourceCode(&irsend.capture));
+
+ // Stick in some large values.
+ irsend.capture.rawbuf[3] = 60000;
+ EXPECT_EQ(
+ "uint16_t rawData[9] = {10, 20, 65535, 0, 54465, 40,"
+ " 50, 60, 70}; // UNKNOWN A5E5F35D\n",
+ resultToSourceCode(&irsend.capture));
+ irsend.capture.rawbuf[5] = UINT16_MAX;
+ EXPECT_EQ(
+ "uint16_t rawData[11] = {10, 20, 65535, 0, 54465, 40,"
+ " 65535, 0, 65535, 60, 70}; // UNKNOWN A5E5F35D\n",
+ resultToSourceCode(&irsend.capture));
+
+ // Reset and put the large value in a space location.
+ irsend.reset();
+ irsend.sendRaw(test_data, 7, 38000);
+ irsend.makeDecodeResult();
+ irrecv.decode(&irsend.capture);
+ irsend.capture.rawbuf[4] = UINT16_MAX - 1;
+ EXPECT_EQ(
+ "uint16_t rawData[9] = {10, 20, 30, 65535, 0, 65533,"
+ " 50, 60, 70}; // UNKNOWN A5E5F35D\n",
+ resultToSourceCode(&irsend.capture));
+}
+
+TEST(TestResultToSourceCode, SimpleProtocols) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(1);
+ irsend.begin();
+
+ // Generate a code which has address & command values.
+ irsend.reset();
+ irsend.sendNEC(irsend.encodeNEC(0x10, 0x20));
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(NEC, irsend.capture.decode_type);
+ ASSERT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(
+ "uint16_t rawData[68] = {8960, 4480, 560, 560, 560, 560, 560, 560, "
+ "560, 560, 560, 1680, 560, 560, 560, 560, 560, 560, 560, 1680, "
+ "560, 1680, 560, 1680, 560, 1680, 560, 560, 560, 1680, 560, 1680, "
+ "560, 1680, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, "
+ "560, 1680, 560, 560, 560, 560, 560, 1680, 560, 1680, 560, 1680, "
+ "560, 1680, 560, 1680, 560, 560, 560, 1680, 560, 1680, 560, 40320 "
+ "}; // NEC 8F704FB\n"
+ "uint32_t address = 0x10;\n"
+ "uint32_t command = 0x20;\n"
+ "uint64_t data = 0x8F704FB;\n",
+ resultToSourceCode(&irsend.capture));
+
+ // Generate a code which DOESN'T have address & command values.
+ irsend.reset();
+ irsend.sendNikai(0xD0F2F);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(NIKAI, irsend.capture.decode_type);
+ ASSERT_EQ(kNikaiBits, irsend.capture.bits);
+ EXPECT_EQ(
+ "uint16_t rawData[52] = {4000, 4000, 500, 2000, 500, 2000, "
+ "500, 2000, 500, 2000, 500, 1000, 500, 1000, 500, 2000, 500, 1000, "
+ "500, 2000, 500, 2000, 500, 2000, 500, 2000, 500, 1000, 500, 1000, "
+ "500, 1000, 500, 1000, 500, 2000, 500, 2000, 500, 1000, 500, 2000, "
+ "500, 1000, 500, 1000, 500, 1000, 500, 1000, 500, 8500 };"
+ " // NIKAI D0F2F\n"
+ "uint64_t data = 0xD0F2F;\n",
+ resultToSourceCode(&irsend.capture));
+}
+
+TEST(TestResultToSourceCode, ComplexProtocols) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(1);
+ irsend.begin();
+
+ uint8_t state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
+ 0x00, 0x00, 0x00, 0x01};
+
+ irsend.reset();
+ irsend.sendToshibaAC(state);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type);
+ ASSERT_EQ(kToshibaACBits, irsend.capture.bits);
+ EXPECT_EQ(
+ "uint16_t rawData[296] = {4400, 4300, 542, 1622, 542, 1622, "
+ "542, 1622, 542, 1622, 542, 472, 542, 472, 542, 1622, 542, 472, "
+ "542, 472, 542, 472, 542, 472, 542, 472, 542, 1622, 542, 1622, "
+ "542, 472, 542, 1622, 542, 472, 542, 472, 542, 472, 542, 472, "
+ "542, 472, 542, 472, 542, 1622, 542, 1622, 542, 1622, 542, 1622, "
+ "542, 1622, 542, 1622, 542, 1622, 542, 1622, 542, 472, 542, 472, "
+ "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
+ "542, 472, 542, 1622, 542, 472, 542, 472, 542, 472, 542, 472, "
+ "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
+ "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
+ "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
+ "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
+ "542, 472, 542, 472, 542, 472, 542, 1622, 542, 7048, 4400, 4300, "
+ "542, 1622, 542, 1622, 542, 1622, 542, 1622, 542, 472, 542, 472, "
+ "542, 1622, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
+ "542, 1622, 542, 1622, 542, 472, 542, 1622, 542, 472, 542, 472, "
+ "542, 472, 542, 472, 542, 472, 542, 472, 542, 1622, 542, 1622, "
+ "542, 1622, 542, 1622, 542, 1622, 542, 1622, 542, 1622, 542, 1622, "
+ "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
+ "542, 472, 542, 472, 542, 472, 542, 1622, 542, 472, 542, 472, "
+ "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
+ "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
+ "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
+ "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
+ "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 1622, "
+ "542, 7048 }; // TOSHIBA_AC\n"
+ "uint8_t state[9] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, 0x00, 0x00, 0x00, "
+ "0x01};\n",
+ resultToSourceCode(&irsend.capture));
+}
+
+TEST(TestResultToTimingInfo, General) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(1);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendNEC(irsend.encodeNEC(0x10, 0x20));
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(NEC, irsend.capture.decode_type);
+ ASSERT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(
+ "Raw Timing[68]:\n"
+ " + 8960, - 4480, + 560, - 560, + 560, - 560,"
+ " + 560, - 560, \n"
+ " + 560, - 560, + 560, - 1680, + 560, - 560,"
+ " + 560, - 560, \n"
+ " + 560, - 560, + 560, - 1680, + 560, - 1680,"
+ " + 560, - 1680, \n"
+ " + 560, - 1680, + 560, - 560, + 560, - 1680,"
+ " + 560, - 1680, \n"
+ " + 560, - 1680, + 560, - 560, + 560, - 560,"
+ " + 560, - 560, \n"
+ " + 560, - 560, + 560, - 560, + 560, - 1680,"
+ " + 560, - 560, \n"
+ " + 560, - 560, + 560, - 1680, + 560, - 1680,"
+ " + 560, - 1680, \n"
+ " + 560, - 1680, + 560, - 1680, + 560, - 560,"
+ " + 560, - 1680, \n"
+ " + 560, - 1680, + 560, - 40320\n",
+ resultToTimingInfo(&irsend.capture));
+
+ irsend.reset();
+ uint16_t rawData[9] = {10, 20, 30, 40, 50, 60, 70, 80, 90};
+ irsend.sendRaw(rawData, 9, 38000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(
+ "Raw Timing[9]:\n"
+ " + 10, - 20, + 30, - 40, + 50, - 60,"
+ " + 70, - 80, \n"
+ " + 90\n",
+ resultToTimingInfo(&irsend.capture));
+}
+
+TEST(TestResultToHumanReadableBasic, SimpleCodes) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(1);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendNEC(irsend.encodeNEC(0x10, 0x20));
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(NEC, irsend.capture.decode_type);
+ ASSERT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(
+ "Encoding : NEC\n"
+ "Code : 8F704FB (32 bits)\n",
+ resultToHumanReadableBasic(&irsend.capture));
+}
+
+TEST(TestResultToHumanReadableBasic, ComplexCodes) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(1);
+ irsend.begin();
+
+ uint8_t state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
+ 0x00, 0x00, 0x00, 0x01};
+
+ irsend.reset();
+ irsend.sendToshibaAC(state);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type);
+ ASSERT_EQ(kToshibaACBits, irsend.capture.bits);
+ EXPECT_EQ(
+ "Encoding : TOSHIBA_AC\n"
+ "Code : F20D03FC0100000001 (72 bits)\n",
+ resultToHumanReadableBasic(&irsend.capture));
+}
+
+TEST(TestInvertBits, Normal) {
+ ASSERT_EQ(0xAAAA5555AAAA5555, invertBits(0x5555AAAA5555AAAA, 64));
+ ASSERT_EQ(0xAAAA5555, invertBits(0x5555AAAA, 32));
+ ASSERT_EQ(0xFFFFFFFFFFFFFFFF, invertBits(0x0, 64));
+ ASSERT_EQ(0x0, invertBits(invertBits(0x0, 64), 64));
+ ASSERT_EQ(0x2, invertBits(0x1, 2));
+}
+
+TEST(TestInvertBits, ZeroBits) {
+ ASSERT_EQ(0xAAAA5555AAAA5555, invertBits(0xAAAA5555AAAA5555, 0));
+ ASSERT_EQ(0x0, invertBits(0x0, 0));
+ ASSERT_EQ(0x1, invertBits(0x1, 0));
+}
+
+TEST(TestInvertBits, MoreThan64Bits) {
+ ASSERT_EQ(0xAAAA5555AAAA5555, invertBits(0x5555AAAA5555AAAA, 70));
+ ASSERT_EQ(0xFFFFFFFFFFFFFFFF, invertBits(0x0, 128));
+}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/Makefile b/lib/IRremoteESP8266-2.5.2.03/test/Makefile
similarity index 63%
rename from lib/IRremoteESP8266-2.2.1.02/test/Makefile
rename to lib/IRremoteESP8266-2.5.2.03/test/Makefile
index 7ffd0005373e..d53014183d92 100644
--- a/lib/IRremoteESP8266-2.2.1.02/test/Makefile
+++ b/lib/IRremoteESP8266-2.5.2.03/test/Makefile
@@ -1,8 +1,10 @@
# SYNOPSIS:
#
-# make [all] - makes everything.
-# make TARGET - makes the given target.
-# make clean - removes all files generated by make.
+# make [all] - makes everything.
+# make TARGET - makes the given target.
+# make run - makes everything and runs all the tests.
+# make clean - removes all files generated by make.
+# make install-googletest - install the googletest code suite
# Please tweak the following variable definitions as needed by your
# project, except GTEST_HEADERS, which you can use in your own targets
@@ -30,7 +32,11 @@ TESTS = IRutils_test IRsend_test ir_NEC_test ir_GlobalCache_test \
ir_JVC_test ir_RCMM_test ir_LG_test ir_Mitsubishi_test ir_Sharp_test \
ir_RC5_RC6_test ir_Panasonic_test ir_Dish_test ir_Whynter_test \
ir_Aiwa_test ir_Denon_test ir_Sanyo_test ir_Daikin_test ir_Coolix_test \
- ir_Gree_test IRrecv_test ir_Pronto_test ir_Fujitsu_test ir_Nikai_test
+ ir_Gree_test IRrecv_test ir_Pronto_test ir_Fujitsu_test ir_Nikai_test \
+ ir_Toshiba_test ir_Midea_test ir_Magiquest_test ir_Lasertag_test \
+ ir_Carrier_test ir_Haier_test ir_Hitachi_test ir_GICable_test \
+ ir_Whirlpool_test ir_Lutron_test ir_Electra_test ir_Pioneer_test \
+ ir_MWM_test
# All Google Test headers. Usually you shouldn't change this
# definition.
@@ -56,8 +62,10 @@ run : all
echo "PASS: \o/ \o/ All unit tests passed. \o/ \o/"; \
fi
+run_tests : run
+
install-googletest :
- git clone https://github.com/google/googletest.git ../lib/googletest
+ git clone -b v1.8.x https://github.com/google/googletest.git ../lib/googletest
# Builds gtest.a and gtest_main.a.
@@ -67,17 +75,40 @@ GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS)
# All the IR protocol object files.
PROTOCOLS = ir_NEC.o ir_Sony.o ir_Samsung.o ir_JVC.o ir_RCMM.o ir_RC5_RC6.o \
- ir_LG.o ir_Mitsubishi.o ir_Fujitsu.o ir_Sharp.o ir_Sanyo.o ir_Denon.o ir_Dish.o \
- ir_Panasonic.o ir_Whynter.o ir_Coolix.o ir_Aiwa.o ir_Sherwood.o \
- ir_Kelvinator.o ir_Daikin.o ir_Gree.o ir_Pronto.o ir_Nikai.o
+ ir_LG.o ir_Mitsubishi.o ir_Fujitsu.o ir_Sharp.o ir_Sanyo.o ir_Denon.o ir_Dish.o \
+ ir_Panasonic.o ir_Whynter.o ir_Coolix.o ir_Aiwa.o ir_Sherwood.o \
+ ir_Kelvinator.o ir_Daikin.o ir_Gree.o ir_Pronto.o ir_Nikai.o ir_Toshiba.o \
+ ir_Midea.o ir_Magiquest.o ir_Lasertag.o ir_Carrier.o ir_Haier.o \
+ ir_Hitachi.o ir_GICable.o ir_Whirlpool.o ir_Lutron.o ir_Electra.o \
+ ir_Pioneer.o ir_MWM.o
+
+# All the IR Protocol header files.
+PROTOCOLS_H = $(USER_DIR)/ir_Argo.h \
+ $(USER_DIR)/ir_Gree.h \
+ $(USER_DIR)/ir_Magiquest.h \
+ $(USER_DIR)/ir_Coolix.h \
+ $(USER_DIR)/ir_Haier.h \
+ $(USER_DIR)/ir_Midea.h \
+ $(USER_DIR)/ir_Toshiba.h \
+ $(USER_DIR)/ir_Daikin.h \
+ $(USER_DIR)/ir_Kelvinator.h \
+ $(USER_DIR)/ir_Mitsubishi.h \
+ $(USER_DIR)/ir_NEC.h \
+ $(USER_DIR)/ir_Samsung.h \
+ $(USER_DIR)/ir_Trotec.h \
+ $(USER_DIR)/ir_Fujitsu.h \
+ $(USER_DIR)/ir_LG.h \
+ $(USER_DIR)/ir_Panasonic.h
# Common object files
COMMON_OBJ = IRutils.o IRtimer.o IRsend.o IRrecv.o ir_GlobalCache.o \
$(PROTOCOLS) gtest_main.a
# Common dependencies
COMMON_DEPS = $(USER_DIR)/IRrecv.h $(USER_DIR)/IRsend.h $(USER_DIR)/IRtimer.h \
- $(USER_DIR)/IRutils.h $(USER_DIR)/IRremoteESP8266.h
+ $(USER_DIR)/IRutils.h $(USER_DIR)/IRremoteESP8266.h \
+ $(PROTOCOLS_H)
+
# Common test dependencies
-COMMON_TEST_DEPS = $(COMMON_DEPS) IRsend_test.h
+COMMON_TEST_DEPS = $(COMMON_DEPS) IRrecv_test.h IRsend_test.h
# For simplicity and to avoid depending on Google Test's
# implementation details, the dependencies specified below are
@@ -97,17 +128,17 @@ gtest.a : gtest-all.o
gtest_main.a : gtest-all.o gtest_main.o
$(AR) $(ARFLAGS) $@ $^
-# Builds a our test. A test should link with either gtest.a or
+# Builds our test. A test should link with either gtest.a or
# gtest_main.a, depending on whether it defines its own main()
# function.
-IRutils.o : $(USER_DIR)/IRutils.cpp $(USER_DIR)/IRutils.h
+IRutils.o : $(USER_DIR)/IRutils.cpp $(USER_DIR)/IRutils.h $(USER_DIR)/IRremoteESP8266.h
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/IRutils.cpp
-IRutils_test.o : IRutils_test.cpp $(USER_DIR)/IRutils.h $(GTEST_HEADERS)
+IRutils_test.o : IRutils_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(USER_DIR) -c IRutils_test.cpp
-IRutils_test : IRutils.o IRutils_test.o gtest_main.a
+IRutils_test : IRutils_test.o ir_NEC.o ir_Nikai.o ir_Toshiba.o $(COMMON_OBJ) gtest_main.a
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
IRtimer.o : $(USER_DIR)/IRtimer.cpp $(USER_DIR)/IRtimer.h
@@ -131,7 +162,7 @@ IRrecv_test.o : IRrecv_test.cpp $(USER_DIR)/IRsend.h $(USER_DIR)/IRrecv.h IRsend
IRrecv_test : IRrecv_test.o $(COMMON_OBJ)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
-ir_NEC.o : $(USER_DIR)/ir_NEC.cpp $(COMMON_DEPS)
+ir_NEC.o : $(USER_DIR)/ir_NEC.cpp $(USER_DIR)/ir_NEC.h $(COMMON_DEPS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_NEC.cpp
ir_NEC_test.o : ir_NEC_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
@@ -167,10 +198,10 @@ ir_Sony_test.o : ir_Sony_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
ir_Sony_test : $(COMMON_OBJ) ir_Sony_test.o
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
-ir_Samsung.o : $(USER_DIR)/ir_Samsung.cpp $(COMMON_DEPS)
+ir_Samsung.o : $(USER_DIR)/ir_Samsung.cpp $(USER_DIR)/ir_Samsung.h $(COMMON_DEPS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Samsung.cpp
-ir_Samsung_test.o : ir_Samsung_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
+ir_Samsung_test.o : ir_Samsung_test.cpp $(USER_DIR)/ir_Samsung.h $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(USER_DIR) -c ir_Samsung_test.cpp
ir_Samsung_test : $(COMMON_OBJ) ir_Samsung_test.o
@@ -278,7 +309,7 @@ ir_Whynter_test : $(COMMON_OBJ) ir_Whynter_test.o
ir_Coolix.o : $(USER_DIR)/ir_Coolix.cpp $(COMMON_DEPS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Coolix.cpp
-ir_Coolix_test.o : ir_Coolix_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
+ir_Coolix_test.o : ir_Coolix_test.cpp $(USER_DIR)/ir_Coolix.h $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(USER_DIR) -c ir_Coolix_test.cpp
ir_Coolix_test : $(COMMON_OBJ) ir_Coolix_test.o
@@ -326,7 +357,7 @@ ir_Gree.o : $(USER_DIR)/ir_Gree.cpp $(GTEST_HEADERS)
ir_Gree_test.o : ir_Gree_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(USER_DIR) -c ir_Gree_test.cpp
-ir_Gree_test : $(COMMON_OBJ) ir_Gree_test.o
+ir_Gree_test : $(COMMON_OBJ) ir_Gree_test.o ir_Kelvinator.o
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
ir_Pronto.o : $(USER_DIR)/ir_Pronto.cpp $(GTEST_HEADERS)
@@ -346,3 +377,120 @@ ir_Nikai_test.o : ir_Nikai_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
ir_Nikai_test : $(COMMON_OBJ) ir_Nikai_test.o
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
+
+ir_Toshiba.o : $(USER_DIR)/ir_Toshiba.cpp $(USER_DIR)/ir_Toshiba.h $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Toshiba.cpp
+
+ir_Toshiba_test.o : ir_Toshiba_test.cpp $(USER_DIR)/ir_Toshiba.h $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(USER_DIR) -c ir_Toshiba_test.cpp
+
+ir_Toshiba_test : $(COMMON_OBJ) ir_Toshiba_test.o
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
+
+ir_Midea.o : $(USER_DIR)/ir_Midea.cpp $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Midea.cpp
+
+ir_Midea_test.o : ir_Midea_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(USER_DIR) -c ir_Midea_test.cpp
+
+ir_Midea_test : $(COMMON_OBJ) ir_Midea_test.o
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
+
+ir_Magiquest.o : $(USER_DIR)/ir_Magiquest.cpp $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Magiquest.cpp
+
+ir_Magiquest_test.o : ir_Magiquest_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(USER_DIR) -c ir_Magiquest_test.cpp
+
+ir_Magiquest_test : $(COMMON_OBJ) ir_Magiquest_test.o
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
+
+ir_Lasertag.o : $(USER_DIR)/ir_Lasertag.cpp $(USER_DIR)/ir_RC5_RC6.cpp $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Lasertag.cpp
+
+ir_Lasertag_test.o : ir_Lasertag_test.cpp $(USER_DIR)/ir_RC5_RC6.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(USER_DIR) -c ir_Lasertag_test.cpp
+
+ir_Lasertag_test : $(COMMON_OBJ) ir_Lasertag_test.o ir_RC5_RC6.o
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
+
+ir_Carrier.o : $(USER_DIR)/ir_Carrier.cpp $(COMMON_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Carrier.cpp
+
+ir_Carrier_test.o : ir_Carrier_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(USER_DIR) -c ir_Carrier_test.cpp
+
+ir_Carrier_test : $(COMMON_OBJ) ir_Carrier_test.o
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
+
+ir_Haier.o : $(USER_DIR)/ir_Haier.cpp $(USER_DIR)/ir_Haier.h $(COMMON_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Haier.cpp
+
+ir_Haier_test.o : ir_Haier_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(USER_DIR) -c ir_Haier_test.cpp
+
+ir_Haier_test : $(COMMON_OBJ) ir_Haier_test.o
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
+
+ir_Hitachi.o : $(USER_DIR)/ir_Hitachi.cpp $(COMMON_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Hitachi.cpp
+
+ir_Hitachi_test.o : ir_Hitachi_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(USER_DIR) -c ir_Hitachi_test.cpp
+
+ir_Hitachi_test : $(COMMON_OBJ) ir_Hitachi_test.o
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
+
+ir_GICable.o : $(USER_DIR)/ir_GICable.cpp $(COMMON_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_GICable.cpp
+
+ir_GICable_test.o : ir_GICable_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(USER_DIR) -c ir_GICable_test.cpp
+
+ir_GICable_test : $(COMMON_OBJ) ir_GICable_test.o
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
+
+ir_Whirlpool.o : $(USER_DIR)/ir_Whirlpool.cpp $(COMMON_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Whirlpool.cpp
+
+ir_Whirlpool_test.o : ir_Whirlpool_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(USER_DIR) -c ir_Whirlpool_test.cpp
+
+ir_Whirlpool_test : $(COMMON_OBJ) ir_Whirlpool_test.o
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
+
+ir_Lutron.o : $(USER_DIR)/ir_Lutron.cpp $(COMMON_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Lutron.cpp
+
+ir_Lutron_test.o : ir_Lutron_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(USER_DIR) -c ir_Lutron_test.cpp
+
+ir_Lutron_test : $(COMMON_OBJ) ir_Lutron_test.o
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
+
+ir_Electra.o : $(USER_DIR)/ir_Electra.cpp $(COMMON_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Electra.cpp
+
+ir_Electra_test.o : ir_Electra_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(USER_DIR) -c ir_Electra_test.cpp
+
+ir_Electra_test : $(COMMON_OBJ) ir_Electra_test.o
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
+
+ir_Pioneer.o : $(USER_DIR)/ir_Pioneer.cpp $(COMMON_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Pioneer.cpp
+
+ir_Pioneer_test.o : ir_Pioneer_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(USER_DIR) -c ir_Pioneer_test.cpp
+
+ir_Pioneer_test : $(COMMON_OBJ) ir_Pioneer_test.o
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
+
+ir_MWM.o : $(USER_DIR)/ir_MWM.cpp $(COMMON_DEPS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_MWM.cpp
+
+ir_MWM_test.o : ir_MWM_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(USER_DIR) -c ir_MWM_test.cpp
+
+ir_MWM_test : $(COMMON_OBJ) ir_MWM_test.o
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_Aiwa_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Aiwa_test.cpp
similarity index 70%
rename from lib/IRremoteESP8266-2.2.1.02/test/ir_Aiwa_test.cpp
rename to lib/IRremoteESP8266-2.5.2.03/test/ir_Aiwa_test.cpp
index a0bb12f86279..c5469d4a5249 100644
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_Aiwa_test.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Aiwa_test.cpp
@@ -20,8 +20,9 @@ TEST(TestSendAiwa, SendDataOnly) {
"m560s560m560s1680m560s560m560s560m560s1680m560s1680m560s1680m560s1680"
"m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560m560s560"
"m560s560m560s560m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s1680m560s1680m560s108080"
- "m8960s2240m560s108080", irsend.outputStr());
+ "m560s1680m560s1680m560s23520"
+ "m8960s2240m560s96320",
+ irsend.outputStr());
}
// Test sending oversized data.
@@ -40,7 +41,7 @@ TEST(TestSendAiwa, SendWithRepeats) {
irsend.begin();
irsend.reset();
- irsend.sendAiwaRCT501(0x7F, AIWA_RC_T501_BITS, 0); // No repeats.
+ irsend.sendAiwaRCT501(0x7F, kAiwaRcT501Bits, 0); // No repeats.
EXPECT_EQ(
"m8960s4480"
"m560s560m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s560"
@@ -48,9 +49,10 @@ TEST(TestSendAiwa, SendWithRepeats) {
"m560s560m560s1680m560s560m560s560m560s1680m560s1680m560s1680m560s1680"
"m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560m560s560"
"m560s560m560s560m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s1680m560s1680m560s108080", irsend.outputStr());
+ "m560s1680m560s1680m560s23520",
+ irsend.outputStr());
irsend.reset();
- irsend.sendAiwaRCT501(0x7F, AIWA_RC_T501_BITS, 1); // 1 repeat.
+ irsend.sendAiwaRCT501(0x7F, kAiwaRcT501Bits, 1); // 1 repeat.
EXPECT_EQ(
"m8960s4480"
"m560s560m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s560"
@@ -58,10 +60,11 @@ TEST(TestSendAiwa, SendWithRepeats) {
"m560s560m560s1680m560s560m560s560m560s1680m560s1680m560s1680m560s1680"
"m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560m560s560"
"m560s560m560s560m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s1680m560s1680m560s108080"
- "m8960s2240m560s108080", irsend.outputStr());
+ "m560s1680m560s1680m560s23520"
+ "m8960s2240m560s96320",
+ irsend.outputStr());
irsend.reset();
- irsend.sendAiwaRCT501(0x7F, AIWA_RC_T501_BITS, 2); // 2 repeats.
+ irsend.sendAiwaRCT501(0x7F, kAiwaRcT501Bits, 2); // 2 repeats.
EXPECT_EQ(
"m8960s4480"
"m560s560m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s560"
@@ -69,13 +72,14 @@ TEST(TestSendAiwa, SendWithRepeats) {
"m560s560m560s1680m560s560m560s560m560s1680m560s1680m560s1680m560s1680"
"m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560m560s560"
"m560s560m560s560m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s1680m560s1680m560s108080"
- "m8960s2240m560s108080"
- "m8960s2240m560s108080", irsend.outputStr());
+ "m560s1680m560s1680m560s23520"
+ "m8960s2240m560s96320"
+ "m8960s2240m560s96320",
+ irsend.outputStr());
}
// Test sending an atypical data size.
-TEST(TestSendAiwa, SendUsualSize) {
+TEST(TestSendAiwa, SendUnusualSize) {
IRsendTest irsend(4);
irsend.begin();
@@ -87,8 +91,9 @@ TEST(TestSendAiwa, SendUsualSize) {
"m560s560m560s560m560s560m560s560m560s560m560s1680m560s560m560s560"
"m560s560m560s1680m560s560m560s560m560s1680m560s1680m560s1680m560s1680"
"m560s1680m560s1680m560s560m560s560m560s560m560s1680m560s560m560s560"
- "m560s1680m560s560m560s1680m560s108080"
- "m8960s2240m560s108080", irsend.outputStr());
+ "m560s1680m560s560m560s1680m560s36960"
+ "m8960s2240m560s96320",
+ irsend.outputStr());
irsend.reset();
irsend.sendAiwaRCT501(0x1234567890, 37);
@@ -102,8 +107,9 @@ TEST(TestSendAiwa, SendUsualSize) {
"m560s1680m560s560m560s1680m560s560m560s1680m560s1680m560s560m560s560"
"m560s1680m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s1680"
"m560s560m560s560m560s1680m560s560m560s560m560s560m560s560m560s1680"
- "m560s108080"
- "m8960s2240m560s108080", irsend.outputStr());
+ "m560s22400"
+ "m8960s2240m560s96320",
+ irsend.outputStr());
}
// Tests for decodeAiwaRCT501().
@@ -118,10 +124,9 @@ TEST(TestDecodeAiwa, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendAiwaRCT501(0x7F);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, AIWA_RC_T501_BITS,
- true));
+ ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
- EXPECT_EQ(AIWA_RC_T501_BITS, irsend.capture.bits);
+ EXPECT_EQ(kAiwaRcT501Bits, irsend.capture.bits);
EXPECT_EQ(0x7F, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
@@ -131,10 +136,9 @@ TEST(TestDecodeAiwa, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendAiwaRCT501(0x0);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, AIWA_RC_T501_BITS,
- true));
+ ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
- EXPECT_EQ(AIWA_RC_T501_BITS, irsend.capture.bits);
+ EXPECT_EQ(kAiwaRcT501Bits, irsend.capture.bits);
EXPECT_EQ(0x0, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
@@ -144,10 +148,9 @@ TEST(TestDecodeAiwa, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendAiwaRCT501(0x7FFF);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, AIWA_RC_T501_BITS,
- true));
+ ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
- EXPECT_EQ(AIWA_RC_T501_BITS, irsend.capture.bits);
+ EXPECT_EQ(kAiwaRcT501Bits, irsend.capture.bits);
EXPECT_EQ(0x7FFF, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
@@ -162,12 +165,11 @@ TEST(TestDecodeAiwa, NormalDecodeWithRepeatAndStrict) {
// Normal Aiwa 15-bit(42bit) message with 2 repeats.
irsend.reset();
- irsend.sendAiwaRCT501(0x7F, AIWA_RC_T501_BITS, 2);
+ irsend.sendAiwaRCT501(0x7F, kAiwaRcT501Bits, 2);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, AIWA_RC_T501_BITS,
- true));
+ ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
- EXPECT_EQ(AIWA_RC_T501_BITS, irsend.capture.bits);
+ EXPECT_EQ(kAiwaRcT501Bits, irsend.capture.bits);
EXPECT_EQ(0x7F, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
@@ -182,48 +184,44 @@ TEST(TestDecodeAiwa, DecodeWithNonStrictValues) {
irsend.reset();
// Confirm using sendNEC(data, 42, 1) can make a legal Aiwa message.
- irsend.sendNEC(0x1D8113F00FF, 42, AIWA_RC_T501_MIN_REPEAT);
+ irsend.sendNEC(0x1D8113F00FF, 42, kAiwaRcT501MinRepeats);
irsend.makeDecodeResult();
// MUST pass with strict on.
- ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, AIWA_RC_T501_BITS,
- true));
+ ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
ASSERT_EQ(0x7F, irsend.capture.value);
irsend.reset();
// Use sendNEC(data, 42) to make/send an illegal value Aiwa message.
// Value is illegal due to bad pre & post data.
- irsend.sendNEC(0x1234567890A, 42, AIWA_RC_T501_MIN_REPEAT);
+ irsend.sendNEC(0x1234567890A, 42, kAiwaRcT501MinRepeats);
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, AIWA_RC_T501_BITS,
- true));
+ ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
// Should fail if strict off too.
- ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, AIWA_RC_T501_BITS,
- false));
+ ASSERT_FALSE(
+ irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, false));
irsend.reset();
// Use sendNEC(data, 42) to make/send an illegal value Aiwa message.
// Value is illegal due to bad post data only.
- irsend.sendNEC(0x1D8113F00FE, 42, AIWA_RC_T501_MIN_REPEAT);
+ irsend.sendNEC(0x1D8113F00FE, 42, kAiwaRcT501MinRepeats);
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, AIWA_RC_T501_BITS,
- true));
+ ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
// Should fail if strict off too.
- ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, AIWA_RC_T501_BITS,
- false));
+ ASSERT_FALSE(
+ irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, false));
irsend.reset();
// Use sendNEC(data, 42) to make/send an illegal value Aiwa message.
// Value is illegal due to bad pre data only.
- irsend.sendNEC(0x0D8113F00FF, 42, AIWA_RC_T501_MIN_REPEAT);
+ irsend.sendNEC(0x0D8113F00FF, 42, kAiwaRcT501MinRepeats);
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, AIWA_RC_T501_BITS,
- true));
+ ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
// Should fail if strict off too.
- ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, AIWA_RC_T501_BITS,
- false));
+ ASSERT_FALSE(
+ irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, false));
}
// Decode unsupported Aiwa messages.
@@ -236,8 +234,7 @@ TEST(TestDecodeAiwa, DecodeWithNonStrictSizes) {
irsend.sendAiwaRCT501(0x0, 8); // Illegal size Aiwa 8-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, AIWA_RC_T501_BITS,
- true));
+ ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
// Should pass if strict off.
ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, 8, false));
EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
@@ -248,8 +245,7 @@ TEST(TestDecodeAiwa, DecodeWithNonStrictSizes) {
irsend.sendAiwaRCT501(0x12345678, 32); // Illegal size Aiwa 32-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, AIWA_RC_T501_BITS,
- true));
+ ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
// Should fail with strict when we ask for the wrong bit size.
ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, 32, true));
@@ -278,7 +274,7 @@ TEST(TestDecodeAiwa, Decode64BitMessages) {
// Reconfirm it by sending a true 64bit NEC message with the Aiwa prefix.
irsend.reset();
- irsend.sendNEC(0x76044FFFFFFFFFFF, 64, AIWA_RC_T501_MIN_REPEAT);
+ irsend.sendNEC(0x76044FFFFFFFFFFF, 64, kAiwaRcT501MinRepeats);
irsend.makeDecodeResult();
// Should work with a 'normal' match (not strict)
ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, 37, false));
@@ -295,20 +291,19 @@ TEST(TestDecodeAiwa, DecodeGlobalCacheExample) {
irsend.reset();
// Aiwa Power Toggle from Global Cache.
- uint16_t gc_test[95] = {38000, 1, 89, 342, 171, 21, 21, 21, 64, 21, 64,
- 21, 64, 21, 21, 21, 64, 21, 64, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 64, 21, 21,
- 21, 21, 21, 21, 21, 64, 21, 21, 21, 21, 21, 64,
- 21, 64, 21, 64, 21, 64, 21, 64, 21, 64, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 64, 21, 64, 21, 64, 21, 64, 21, 64,
- 21, 64, 21, 64, 21, 64, 21, 875, 342, 171, 21, 3565};
+ uint16_t gc_test[95] = {
+ 38000, 1, 89, 342, 171, 21, 21, 21, 64, 21, 64, 21, 64, 21, 21, 21,
+ 64, 21, 64, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 64, 21, 21, 21, 21, 21, 21, 21, 64, 21, 21, 21, 21, 21, 64, 21,
+ 64, 21, 64, 21, 64, 21, 64, 21, 64, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 64, 21, 64, 21, 64, 21,
+ 64, 21, 64, 21, 64, 21, 64, 21, 64, 21, 875, 342, 171, 21, 3565};
irsend.sendGC(gc_test, 95);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture));
EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
- EXPECT_EQ(AIWA_RC_T501_BITS, irsend.capture.bits);
+ EXPECT_EQ(kAiwaRcT501Bits, irsend.capture.bits);
EXPECT_EQ(0x7F, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
@@ -326,13 +321,14 @@ TEST(TestDecodeAiwa, FailToDecodeNonAiwaExample) {
irsend.begin();
irsend.reset();
- uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20, 20, 20, 20,
- 20, 20, 20, 127, 20, 61, 9, 20, 20, 61, 20, 20, 20,
- 61, 20, 61, 20, 61, 20, 20, 20, 20, 20, 20, 20, 884};
+ uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
+ 20, 20, 20, 20, 20, 20, 127, 20, 61, 9,
+ 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
+ 61, 20, 20, 20, 20, 20, 20, 20, 884};
irsend.sendGC(gc_test, 39);
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, AIWA_RC_T501_BITS,
- false));
+ ASSERT_FALSE(
+ irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, false));
}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Carrier_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Carrier_test.cpp
new file mode 100644
index 000000000000..24bdc232ab59
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Carrier_test.cpp
@@ -0,0 +1,225 @@
+// Copyright 2018 David Conran
+
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests for sendCarrierAC()
+
+// Test sending typical data only.
+TEST(TestSendCarrierAC, SendDataOnly) {
+ IRsendTest irsend(0);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendCarrierAC(0x0);
+ EXPECT_EQ(
+ "m8532s4228"
+ "m628s532m628s532m628s532m628s532m628s532m628s532m628s532m628s532"
+ "m628s532m628s532m628s532m628s532m628s532m628s532m628s532m628s532"
+ "m628s532m628s532m628s532m628s532m628s532m628s532m628s532m628s532"
+ "m628s532m628s532m628s532m628s532m628s532m628s532m628s532m628s532"
+ "m628s20000"
+ "m8532s4228"
+ "m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320"
+ "m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320"
+ "m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320"
+ "m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320"
+ "m628s20000"
+ "m8532s4228"
+ "m628s532m628s532m628s532m628s532m628s532m628s532m628s532m628s532"
+ "m628s532m628s532m628s532m628s532m628s532m628s532m628s532m628s532"
+ "m628s532m628s532m628s532m628s532m628s532m628s532m628s532m628s532"
+ "m628s532m628s532m628s532m628s532m628s532m628s532m628s532m628s532"
+ "m628s20000",
+ irsend.outputStr());
+ irsend.reset();
+ irsend.sendCarrierAC(0x12345678);
+ EXPECT_EQ(
+ "m8532s4228"
+ "m628s532m628s532m628s532m628s1320m628s532m628s532m628s1320m628s532"
+ "m628s532m628s532m628s1320m628s1320m628s532m628s1320m628s532m628s532"
+ "m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s1320m628s532"
+ "m628s532m628s1320m628s1320m628s1320m628s1320m628s532m628s532m628s532"
+ "m628s20000"
+ "m8532s4228"
+ "m628s1320m628s1320m628s1320m628s532m628s1320m628s1320m628s532m628s1320"
+ "m628s1320m628s1320m628s532m628s532m628s1320m628s532m628s1320m628s1320"
+ "m628s1320m628s532m628s1320m628s532m628s1320m628s532m628s532m628s1320"
+ "m628s1320m628s532m628s532m628s532m628s532m628s1320m628s1320m628s1320"
+ "m628s20000"
+ "m8532s4228"
+ "m628s532m628s532m628s532m628s1320m628s532m628s532m628s1320m628s532"
+ "m628s532m628s532m628s1320m628s1320m628s532m628s1320m628s532m628s532"
+ "m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s1320m628s532"
+ "m628s532m628s1320m628s1320m628s1320m628s1320m628s532m628s532m628s532"
+ "m628s20000",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendCarrierAC(0x4CCA541D);
+ EXPECT_EQ(
+ "m8532s4228"
+ "m628s532m628s1320m628s532m628s532m628s1320m628s1320m628s532m628s532"
+ "m628s1320m628s1320m628s532m628s532m628s1320m628s532m628s1320m628s532"
+ "m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s532m628s532"
+ "m628s532m628s532m628s532m628s1320m628s1320m628s1320m628s532m628s1320"
+ "m628s20000"
+ "m8532s4228"
+ "m628s1320m628s532m628s1320m628s1320m628s532m628s532m628s1320m628s1320"
+ "m628s532m628s532m628s1320m628s1320m628s532m628s1320m628s532m628s1320"
+ "m628s1320m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s1320"
+ "m628s1320m628s1320m628s1320m628s532m628s532m628s532m628s1320m628s532"
+ "m628s20000"
+ "m8532s4228"
+ "m628s532m628s1320m628s532m628s532m628s1320m628s1320m628s532m628s532"
+ "m628s1320m628s1320m628s532m628s532m628s1320m628s532m628s1320m628s532"
+ "m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s532m628s532"
+ "m628s532m628s532m628s532m628s1320m628s1320m628s1320m628s532m628s1320"
+ "m628s20000",
+ irsend.outputStr());
+}
+
+// Test sending typical data only.
+TEST(TestSendCarrierAC, SendWithRepeats) {
+ IRsendTest irsend(0);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendCarrierAC(0x12345678, kCarrierAcBits, 2); // two repeats.
+ EXPECT_EQ(
+ "m8532s4228"
+ "m628s532m628s532m628s532m628s1320m628s532m628s532m628s1320m628s532"
+ "m628s532m628s532m628s1320m628s1320m628s532m628s1320m628s532m628s532"
+ "m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s1320m628s532"
+ "m628s532m628s1320m628s1320m628s1320m628s1320m628s532m628s532m628s532"
+ "m628s20000"
+ "m8532s4228"
+ "m628s1320m628s1320m628s1320m628s532m628s1320m628s1320m628s532m628s1320"
+ "m628s1320m628s1320m628s532m628s532m628s1320m628s532m628s1320m628s1320"
+ "m628s1320m628s532m628s1320m628s532m628s1320m628s532m628s532m628s1320"
+ "m628s1320m628s532m628s532m628s532m628s532m628s1320m628s1320m628s1320"
+ "m628s20000"
+ "m8532s4228"
+ "m628s532m628s532m628s532m628s1320m628s532m628s532m628s1320m628s532"
+ "m628s532m628s532m628s1320m628s1320m628s532m628s1320m628s532m628s532"
+ "m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s1320m628s532"
+ "m628s532m628s1320m628s1320m628s1320m628s1320m628s532m628s532m628s532"
+ "m628s20000"
+ "m8532s4228"
+ "m628s532m628s532m628s532m628s1320m628s532m628s532m628s1320m628s532"
+ "m628s532m628s532m628s1320m628s1320m628s532m628s1320m628s532m628s532"
+ "m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s1320m628s532"
+ "m628s532m628s1320m628s1320m628s1320m628s1320m628s532m628s532m628s532"
+ "m628s20000"
+ "m8532s4228"
+ "m628s1320m628s1320m628s1320m628s532m628s1320m628s1320m628s532m628s1320"
+ "m628s1320m628s1320m628s532m628s532m628s1320m628s532m628s1320m628s1320"
+ "m628s1320m628s532m628s1320m628s532m628s1320m628s532m628s532m628s1320"
+ "m628s1320m628s532m628s532m628s532m628s532m628s1320m628s1320m628s1320"
+ "m628s20000"
+ "m8532s4228"
+ "m628s532m628s532m628s532m628s1320m628s532m628s532m628s1320m628s532"
+ "m628s532m628s532m628s1320m628s1320m628s532m628s1320m628s532m628s532"
+ "m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s1320m628s532"
+ "m628s532m628s1320m628s1320m628s1320m628s1320m628s532m628s532m628s532"
+ "m628s20000"
+ "m8532s4228"
+ "m628s532m628s532m628s532m628s1320m628s532m628s532m628s1320m628s532"
+ "m628s532m628s532m628s1320m628s1320m628s532m628s1320m628s532m628s532"
+ "m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s1320m628s532"
+ "m628s532m628s1320m628s1320m628s1320m628s1320m628s532m628s532m628s532"
+ "m628s20000"
+ "m8532s4228"
+ "m628s1320m628s1320m628s1320m628s532m628s1320m628s1320m628s532m628s1320"
+ "m628s1320m628s1320m628s532m628s532m628s1320m628s532m628s1320m628s1320"
+ "m628s1320m628s532m628s1320m628s532m628s1320m628s532m628s532m628s1320"
+ "m628s1320m628s532m628s532m628s532m628s532m628s1320m628s1320m628s1320"
+ "m628s20000"
+ "m8532s4228"
+ "m628s532m628s532m628s532m628s1320m628s532m628s532m628s1320m628s532"
+ "m628s532m628s532m628s1320m628s1320m628s532m628s1320m628s532m628s532"
+ "m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s1320m628s532"
+ "m628s532m628s1320m628s1320m628s1320m628s1320m628s532m628s532m628s532"
+ "m628s20000",
+ irsend.outputStr());
+}
+
+// Tests for decodeCarrierAC().
+
+// Decode normal "synthetic" messages.
+TEST(TestDecodeCarrierAC, NormalDecodeWithStrict) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendCarrierAC(0x0);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeCarrierAC(&irsend.capture, kCarrierAcBits, true));
+ EXPECT_EQ(CARRIER_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kCarrierAcBits, irsend.capture.bits);
+ EXPECT_EQ(0x0, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ irsend.reset();
+ irsend.sendCarrierAC(0xB335ABE2);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeCarrierAC(&irsend.capture, kCarrierAcBits, true));
+ EXPECT_EQ(CARRIER_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kCarrierAcBits, irsend.capture.bits);
+ EXPECT_EQ(0xB335ABE2, irsend.capture.value);
+ EXPECT_EQ(0xB335, irsend.capture.address);
+ EXPECT_EQ(0xABE2, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ // Do the last one again, & use the full decoder, not just protocol specific.
+ irsend.reset();
+ irsend.sendCarrierAC(0xB335ABE2);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(CARRIER_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kCarrierAcBits, irsend.capture.bits);
+ EXPECT_EQ(0xB335ABE2, irsend.capture.value);
+}
+
+// Decode a "real" example message.
+TEST(TestDecodeCarrierAC, RealExamples) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ // Data from Issue #385 captured by gnkarn
+ uint16_t rawData[203] = {
+ 8532, 4216, 628, 1312, 628, 528, 628, 1312, 628, 1312, 628, 528,
+ 628, 524, 628, 1316, 624, 1316, 628, 524, 628, 528, 628, 1312,
+ 628, 1316, 624, 528, 628, 1312, 628, 528, 628, 1312, 628, 1312,
+ 628, 528, 628, 1316, 624, 528, 628, 1312, 628, 528, 628, 1312,
+ 628, 1316, 624, 1316, 628, 1312, 628, 1316, 628, 524, 628, 528,
+ 628, 528, 624, 1316, 628, 528, 628, 20064, 8504, 4228, 628, 528,
+ 628, 1312, 628, 528, 628, 528, 628, 1312, 628, 1316, 624, 532,
+ 624, 528, 628, 1316, 628, 1312, 628, 528, 628, 528, 628, 1312,
+ 628, 528, 628, 1316, 628, 528, 624, 528, 628, 1316, 628, 528,
+ 628, 1316, 624, 528, 628, 1316, 628, 528, 624, 532, 624, 528,
+ 628, 528, 628, 528, 628, 1316, 624, 1316, 628, 1316, 628, 528,
+ 624, 1316, 628, 20076, 8528, 4212, 624, 1316, 628, 528, 628, 1316,
+ 628, 1316, 624, 528, 628, 528, 628, 1316, 628, 1316, 628, 528,
+ 624, 532, 624, 1316, 628, 1316, 628, 528, 628, 1316, 624, 528,
+ 628, 1316, 628, 1316, 628, 528, 628, 1316, 624, 532, 624, 1316,
+ 628, 532, 624, 1316, 628, 1316, 624, 1320, 624, 1316, 628, 1316,
+ 628, 528, 628, 528, 628, 528, 628, 1316, 624, 532, 624};
+
+ irsend.sendRaw(rawData, 203, 38000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(CARRIER_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kCarrierAcBits, irsend.capture.bits);
+ EXPECT_EQ(0xB335ABE2, irsend.capture.value);
+ EXPECT_EQ(0xB335, irsend.capture.address);
+ EXPECT_EQ(0xABE2, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_Coolix_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Coolix_test.cpp
similarity index 60%
rename from lib/IRremoteESP8266-2.2.1.02/test/ir_Coolix_test.cpp
rename to lib/IRremoteESP8266-2.5.2.03/test/ir_Coolix_test.cpp
index 14eb8d661963..8b096ffca824 100644
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_Coolix_test.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Coolix_test.cpp
@@ -1,5 +1,6 @@
-// Copyright 2017 David Conran
+// Copyright 2017-2018 David Conran
+#include "ir_Coolix.h"
#include "IRsend.h"
#include "IRsend_test.h"
#include "gtest/gtest.h"
@@ -21,7 +22,8 @@ TEST(TestSendCoolix, SendDataOnly) {
"m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
"m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
"m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s5040", irsend.outputStr());
+ "m560s5040",
+ irsend.outputStr());
irsend.reset();
irsend.sendCOOLIX(0xAA55AA);
@@ -33,7 +35,8 @@ TEST(TestSendCoolix, SendDataOnly) {
"m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
"m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
"m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s5040", irsend.outputStr());
+ "m560s5040",
+ irsend.outputStr());
irsend.reset();
irsend.sendCOOLIX(0xFFFFFF);
@@ -45,7 +48,8 @@ TEST(TestSendCoolix, SendDataOnly) {
"m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
"m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
"m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s5040", irsend.outputStr());
+ "m560s5040",
+ irsend.outputStr());
}
// Test sending with different repeats.
@@ -54,7 +58,7 @@ TEST(TestSendCoolix, SendWithRepeats) {
irsend.begin();
irsend.reset();
- irsend.sendCOOLIX(0xAA55AA, COOLIX_BITS, 1); // 1 repeat.
+ irsend.sendCOOLIX(0xAA55AA, kCoolixBits, 1); // 1 repeat.
EXPECT_EQ(
"m4480s4480"
"m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
@@ -71,8 +75,9 @@ TEST(TestSendCoolix, SendWithRepeats) {
"m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
"m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
"m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s5040", irsend.outputStr());
- irsend.sendCOOLIX(0xAA55AA, COOLIX_BITS, 2); // 2 repeats.
+ "m560s5040",
+ irsend.outputStr());
+ irsend.sendCOOLIX(0xAA55AA, kCoolixBits, 2); // 2 repeats.
EXPECT_EQ(
"m4480s4480"
"m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
@@ -97,11 +102,12 @@ TEST(TestSendCoolix, SendWithRepeats) {
"m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
"m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
"m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s5040", irsend.outputStr());
+ "m560s5040",
+ irsend.outputStr());
}
// Test sending an atypical data size.
-TEST(TestSendCoolix, SendUsualSize) {
+TEST(TestSendCoolix, SendUnusualSize) {
IRsendTest irsend(4);
irsend.begin();
@@ -111,7 +117,8 @@ TEST(TestSendCoolix, SendUsualSize) {
"m4480s4480"
"m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
"m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s5040", irsend.outputStr());
+ "m560s5040",
+ irsend.outputStr());
irsend.reset();
irsend.sendCOOLIX(0x1234567890ABCDEF, 64);
@@ -133,12 +140,13 @@ TEST(TestSendCoolix, SendUsualSize) {
"m560s560m560s560m560s1680m560s1680m560s560m560s560m560s1680m560s560"
"m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s1680m560s1680"
"m560s560m560s560m560s560m560s1680m560s560m560s560m560s560m560s560"
- "m560s5040", irsend.outputStr());
+ "m560s5040",
+ irsend.outputStr());
// Bit sizes must be a multiple of 8.
irsend.reset();
irsend.sendCOOLIX(0x0, 17);
- EXPECT_EQ("" , irsend.outputStr());
+ EXPECT_EQ("", irsend.outputStr());
}
// Tests for decodeCOOLIX().
@@ -153,9 +161,9 @@ TEST(TestDecodeCoolix, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendCOOLIX(0x123456);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, COOLIX_BITS, true));
+ ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kCoolixBits, true));
EXPECT_EQ(COOLIX, irsend.capture.decode_type);
- EXPECT_EQ(COOLIX_BITS, irsend.capture.bits);
+ EXPECT_EQ(kCoolixBits, irsend.capture.bits);
EXPECT_EQ(0x123456, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
@@ -165,9 +173,9 @@ TEST(TestDecodeCoolix, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendCOOLIX(0x0);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, COOLIX_BITS, true));
+ ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kCoolixBits, true));
EXPECT_EQ(COOLIX, irsend.capture.decode_type);
- EXPECT_EQ(COOLIX_BITS, irsend.capture.bits);
+ EXPECT_EQ(kCoolixBits, irsend.capture.bits);
EXPECT_EQ(0x0, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
@@ -177,9 +185,9 @@ TEST(TestDecodeCoolix, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendCOOLIX(0xFFFFFF);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, COOLIX_BITS, true));
+ ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kCoolixBits, true));
EXPECT_EQ(COOLIX, irsend.capture.decode_type);
- EXPECT_EQ(COOLIX_BITS, irsend.capture.bits);
+ EXPECT_EQ(kCoolixBits, irsend.capture.bits);
EXPECT_EQ(0xFFFFFF, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
@@ -194,24 +202,24 @@ TEST(TestDecodeCoolix, NormalDecodeWithRepeatAndStrict) {
// Normal Coolix 16-bit message with 2 repeats.
irsend.reset();
- irsend.sendCOOLIX(0x123456, COOLIX_BITS, 2);
+ irsend.sendCOOLIX(0x123456, kCoolixBits, 2);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, COOLIX_BITS, true));
+ ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kCoolixBits, true));
EXPECT_EQ(COOLIX, irsend.capture.decode_type);
- EXPECT_EQ(COOLIX_BITS, irsend.capture.bits);
+ EXPECT_EQ(kCoolixBits, irsend.capture.bits);
EXPECT_EQ(0x123456, irsend.capture.value);
EXPECT_FALSE(irsend.capture.repeat);
- irsend.makeDecodeResult(4 * COOLIX_BITS + 4);
- ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, COOLIX_BITS, true));
+ irsend.makeDecodeResult(4 * kCoolixBits + 4);
+ ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kCoolixBits, true));
EXPECT_EQ(COOLIX, irsend.capture.decode_type);
- EXPECT_EQ(COOLIX_BITS, irsend.capture.bits);
+ EXPECT_EQ(kCoolixBits, irsend.capture.bits);
EXPECT_EQ(0x123456, irsend.capture.value);
- irsend.makeDecodeResult(2 * (4 * COOLIX_BITS + 4));
- ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, COOLIX_BITS, true));
+ irsend.makeDecodeResult(2 * (4 * kCoolixBits + 4));
+ ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kCoolixBits, true));
EXPECT_EQ(COOLIX, irsend.capture.decode_type);
- EXPECT_EQ(COOLIX_BITS, irsend.capture.bits);
+ EXPECT_EQ(kCoolixBits, irsend.capture.bits);
EXPECT_EQ(0x123456, irsend.capture.value);
}
@@ -225,7 +233,7 @@ TEST(TestDecodeCoolix, DecodeWithNonStrictSizes) {
irsend.sendCOOLIX(0x12, 8); // Illegal value Coolix 8-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeCOOLIX(&irsend.capture, COOLIX_BITS, true));
+ ASSERT_FALSE(irrecv.decodeCOOLIX(&irsend.capture, kCoolixBits, true));
// Should pass if strict off.
ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, 8, false));
EXPECT_EQ(COOLIX, irsend.capture.decode_type);
@@ -236,7 +244,7 @@ TEST(TestDecodeCoolix, DecodeWithNonStrictSizes) {
irsend.sendCOOLIX(0x12345678, 32); // Illegal value Coolix 32-bit message.
irsend.makeDecodeResult();
// Shouldn't pass with strict when we ask for less bits than we got.
- ASSERT_FALSE(irrecv.decodeCOOLIX(&irsend.capture, COOLIX_BITS, true));
+ ASSERT_FALSE(irrecv.decodeCOOLIX(&irsend.capture, kCoolixBits, true));
irsend.makeDecodeResult();
// Should fail with strict when we ask for the wrong bit size.
@@ -249,7 +257,7 @@ TEST(TestDecodeCoolix, DecodeWithNonStrictSizes) {
// Decode should fail if asked to decode non-multiples of 8 bits.
irsend.reset();
- irsend.sendCOOLIX(0x123456, COOLIX_BITS, 2);
+ irsend.sendCOOLIX(0x123456, kCoolixBits, 2);
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeCOOLIX(&irsend.capture, 9, false));
}
@@ -279,12 +287,159 @@ TEST(TestDecodeCoolix, FailToDecodeNonCoolixExample) {
irsend.reset();
// Modified a few entries to unexpected values, based on previous test case.
- uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20, 20, 20, 20,
- 20, 20, 20, 127, 20, 61, 9, 20, 20, 61, 20, 20, 20,
- 61, 20, 61, 20, 61, 20, 20, 20, 20, 20, 20, 20, 884};
+ uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
+ 20, 20, 20, 20, 20, 20, 127, 20, 61, 9,
+ 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
+ 61, 20, 20, 20, 20, 20, 20, 20, 884};
irsend.sendGC(gc_test, 39);
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeCOOLIX(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeCOOLIX(&irsend.capture, COOLIX_BITS, false));
+ ASSERT_FALSE(irrecv.decodeCOOLIX(&irsend.capture, kCoolixBits, false));
+}
+
+// Tests for the IRCoolixAC class.
+
+TEST(TestCoolixACClass, SetAndGetRaw) {
+ IRCoolixAC ircoolix(0);
+
+ ircoolix.setRaw(kCoolixOff);
+ EXPECT_EQ(kCoolixOff, ircoolix.getRaw());
+ ircoolix.setRaw(kCoolixDefaultState);
+ EXPECT_EQ(kCoolixDefaultState, ircoolix.getRaw());
+}
+
+TEST(TestCoolixACClass, SetAndGetTemp) {
+ IRCoolixAC ircoolix(0);
+
+ ircoolix.setTemp(25);
+ EXPECT_EQ(25, ircoolix.getTemp());
+ ircoolix.setTemp(kCoolixTempMin);
+ EXPECT_EQ(kCoolixTempMin, ircoolix.getTemp());
+ ircoolix.setTemp(kCoolixTempMax);
+ EXPECT_EQ(kCoolixTempMax, ircoolix.getTemp());
+ ircoolix.setTemp(kCoolixTempMin - 1);
+ EXPECT_EQ(kCoolixTempMin, ircoolix.getTemp());
+ ircoolix.setTemp(kCoolixTempMax + 1);
+ EXPECT_EQ(kCoolixTempMax, ircoolix.getTemp());
+}
+
+TEST(TestCoolixACClass, SetAndGetMode) {
+ IRCoolixAC ircoolix(0);
+
+ ircoolix.setMode(kCoolixHeat);
+ EXPECT_EQ(kCoolixHeat, ircoolix.getMode());
+ ircoolix.setMode(kCoolixCool);
+ EXPECT_EQ(kCoolixCool, ircoolix.getMode());
+ ircoolix.setMode(kCoolixDry);
+ EXPECT_EQ(kCoolixDry, ircoolix.getMode());
+ ircoolix.setMode(kCoolixAuto);
+ EXPECT_EQ(kCoolixAuto, ircoolix.getMode());
+ ircoolix.setMode(kCoolixFan);
+ EXPECT_EQ(kCoolixFan, ircoolix.getMode());
+}
+
+TEST(TestCoolixACClass, SetAndGetFan) {
+ IRCoolixAC ircoolix(0);
+
+ ircoolix.setFan(kCoolixFanMax);
+ EXPECT_EQ(kCoolixFanMax, ircoolix.getFan());
+ ircoolix.setFan(kCoolixFanMin);
+ EXPECT_EQ(kCoolixFanMin, ircoolix.getFan());
+ ircoolix.setFan(kCoolixFanZoneFollow);
+ EXPECT_EQ(kCoolixFanZoneFollow, ircoolix.getFan());
+ ircoolix.setFan(kCoolixFanAuto);
+ EXPECT_EQ(kCoolixFanAuto, ircoolix.getFan());
+ ircoolix.setFan(kCoolixFanMax);
+ EXPECT_EQ(kCoolixFanMax, ircoolix.getFan());
+ ASSERT_NE(3, kCoolixFanAuto);
+ // Now try some unexpected value.
+ ircoolix.setFan(3);
+ EXPECT_EQ(kCoolixFanAuto, ircoolix.getFan());
+}
+
+TEST(TestCoolixACClass, SetGetClearSensorTempAndZoneFollow) {
+ IRCoolixAC ircoolix(0);
+
+ ircoolix.setRaw(kCoolixDefaultState);
+ EXPECT_FALSE(ircoolix.getZoneFollow());
+ EXPECT_LT(kCoolixSensorTempMax, ircoolix.getSensorTemp());
+
+ ircoolix.setSensorTemp(25);
+ EXPECT_TRUE(ircoolix.getZoneFollow());
+ EXPECT_EQ(25, ircoolix.getSensorTemp());
+
+ // Lower bounds
+ ircoolix.setSensorTemp(kCoolixSensorTempMin);
+ EXPECT_TRUE(ircoolix.getZoneFollow());
+ EXPECT_EQ(kCoolixSensorTempMin, ircoolix.getSensorTemp());
+ ircoolix.setSensorTemp(kCoolixSensorTempMin - 1);
+ EXPECT_TRUE(ircoolix.getZoneFollow());
+ EXPECT_EQ(kCoolixSensorTempMin, ircoolix.getSensorTemp());
+ // Upper bounds
+ ircoolix.setSensorTemp(kCoolixSensorTempMax);
+ EXPECT_TRUE(ircoolix.getZoneFollow());
+ EXPECT_EQ(kCoolixSensorTempMax, ircoolix.getSensorTemp());
+ ircoolix.setSensorTemp(kCoolixSensorTempMax + 1);
+ EXPECT_TRUE(ircoolix.getZoneFollow());
+ EXPECT_EQ(kCoolixSensorTempMax, ircoolix.getSensorTemp());
+ // Clearing
+ ircoolix.clearSensorTemp();
+ EXPECT_FALSE(ircoolix.getZoneFollow());
+ EXPECT_LT(kCoolixSensorTempMax, ircoolix.getSensorTemp());
+}
+
+TEST(TestCoolixACClass, SpecialModesAndReset) {
+ IRCoolixAC ircoolix(0);
+ ASSERT_NE(kCoolixSwing, ircoolix.getRaw());
+ ircoolix.setSwing();
+ ASSERT_EQ(kCoolixSwing, ircoolix.getRaw());
+ ircoolix.setTurbo();
+ ASSERT_EQ(kCoolixTurbo, ircoolix.getRaw());
+ ircoolix.setSleep();
+ ASSERT_EQ(kCoolixSleep, ircoolix.getRaw());
+ ircoolix.setLed();
+ ASSERT_EQ(kCoolixLed, ircoolix.getRaw());
+ ircoolix.setClean();
+ ASSERT_EQ(kCoolixClean, ircoolix.getRaw());
+ ircoolix.stateReset();
+ ASSERT_NE(kCoolixClean, ircoolix.getRaw());
+}
+
+TEST(TestCoolixACClass, HumanReadable) {
+ IRCoolixAC ircoolix(0);
+
+ // Initial starting point.
+ EXPECT_EQ(
+ "Power: On, Fan: 5 (AUTO), Mode: 2 (AUTO), Temp: 25C, "
+ "Zone Follow: Off, Sensor Temp: Ignored",
+ ircoolix.toString());
+
+ ircoolix.setSensorTemp(24);
+ ircoolix.setTemp(22);
+ ircoolix.setMode(kCoolixCool);
+ ircoolix.setFan(kCoolixFanMin);
+ EXPECT_EQ(
+ "Power: On, Fan: 4 (MIN), Mode: 0 (COOL), Temp: 22C, "
+ "Zone Follow: On, Sensor Temp: 24C",
+ ircoolix.toString());
+ ircoolix.setSwing();
+ EXPECT_EQ("Power: On, Fan: 3 (UNKNOWN), Swing: Toggle", ircoolix.toString());
+ ircoolix.setPower(false);
+ EXPECT_EQ("Power: Off", ircoolix.toString());
+}
+
+TEST(TestCoolixACClass, KnownExamples) {
+ IRCoolixAC ircoolix(0);
+
+ ircoolix.setRaw(0b101100101011111111100100);
+ EXPECT_EQ(
+ "Power: On, Fan: 5 (AUTO), Mode: 4 (FAN), Zone Follow: Off, "
+ "Sensor Temp: Ignored",
+ ircoolix.toString());
+ ircoolix.setRaw(0b101100101001111100000000);
+ EXPECT_EQ(
+ "Power: On, Fan: 4 (MIN), Mode: 0 (COOL), Temp: 17C, "
+ "Zone Follow: Off, Sensor Temp: Ignored",
+ ircoolix.toString());
}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Daikin_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Daikin_test.cpp
new file mode 100644
index 000000000000..c8192fc8235d
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Daikin_test.cpp
@@ -0,0 +1,838 @@
+// Copyright 2017 David Conran
+#include "ir_Daikin.h"
+#include "IRrecv.h"
+#include "IRrecv_test.h"
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests for sendDaikin().
+
+// Test sending typical data only.
+TEST(TestSendDaikin, SendDataOnly) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ uint8_t daikin_code[kDaikinStateLength] = {
+ 0x11, 0xDA, 0x27, 0xF0, 0x00, 0x00, 0x00, 0x20, 0x11,
+ 0xDA, 0x27, 0x00, 0x00, 0x41, 0x1E, 0x00, 0xB0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xE3};
+
+ irsend.reset();
+ irsend.sendDaikin(daikin_code);
+ EXPECT_EQ(
+ "m428s428m428s428m428s428m428s428m428s428"
+ "m428s29428m3650s1623"
+ "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
+ "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
+ "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s1280m428s428m428s1280m428s428m428s428m428s428m428s1280m428s1280"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s1280m428s1280m428s1280m428s428m428s1280m428s428m428s1280m428s1280"
+ "m428s29428m3650s1623"
+ "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
+ "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
+ "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s1280m428s1280m428s1280m428s1280"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s1280m428s428m428s428"
+ "m428s29428m3650s1623"
+ "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
+ "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
+ "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s1280m428s428m428s428m428s428m428s428m428s428m428s1280m428s428"
+ "m428s428m428s1280m428s1280m428s1280m428s1280m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s1280m428s1280m428s428m428s1280"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s1280m428s1280"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s1280m428s1280m428s428m428s428m428s428m428s1280m428s1280m428s1280"
+ "m428s29428",
+ irsend.outputStr());
+}
+
+// Test sending with repeats.
+TEST(TestSendDaikin, SendWithRepeats) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ uint8_t daikin_code[kDaikinStateLength] = {
+ 0x11, 0xDA, 0x27, 0xF0, 0x00, 0x00, 0x00, 0x20, 0x11,
+ 0xDA, 0x27, 0x00, 0x00, 0x41, 0x1E, 0x00, 0xB0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xE3};
+ irsend.reset();
+
+ irsend.sendDaikin(daikin_code, kDaikinStateLength, 1);
+ EXPECT_EQ(
+ "m428s428m428s428m428s428m428s428m428s428"
+ "m428s29428m3650s1623"
+ "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
+ "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
+ "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s1280m428s428m428s1280m428s428m428s428m428s428m428s1280m428s1280"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s1280m428s1280m428s1280m428s428m428s1280m428s428m428s1280m428s1280"
+ "m428s29428m3650s1623"
+ "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
+ "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
+ "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s1280m428s1280m428s1280m428s1280"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s1280m428s428m428s428"
+ "m428s29428m3650s1623"
+ "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
+ "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
+ "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s1280m428s428m428s428m428s428m428s428m428s428m428s1280m428s428"
+ "m428s428m428s1280m428s1280m428s1280m428s1280m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s1280m428s1280m428s428m428s1280"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s1280m428s1280"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s1280m428s1280m428s428m428s428m428s428m428s1280m428s1280m428s1280"
+ "m428s29428"
+ "m428s428m428s428m428s428m428s428m428s428"
+ "m428s29428m3650s1623"
+ "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
+ "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
+ "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s1280m428s428m428s1280m428s428m428s428m428s428m428s1280m428s1280"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s1280m428s1280m428s1280m428s428m428s1280m428s428m428s1280m428s1280"
+ "m428s29428m3650s1623"
+ "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
+ "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
+ "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s1280m428s1280m428s1280m428s1280"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s1280m428s428m428s428"
+ "m428s29428m3650s1623"
+ "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
+ "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
+ "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s1280m428s428m428s428m428s428m428s428m428s428m428s1280m428s428"
+ "m428s428m428s1280m428s1280m428s1280m428s1280m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s1280m428s1280m428s428m428s1280"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s1280m428s1280"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s1280m428s1280m428s428m428s428m428s428m428s1280m428s1280m428s1280"
+ "m428s29428",
+ irsend.outputStr());
+}
+
+// Test sending atypical sizes.
+TEST(TestSendDaikin, SendUnexpectedSizes) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ uint8_t daikin_short_code[kDaikinStateLength - 1] = {
+ 0x11, 0xDA, 0x27, 0xF0, 0x00, 0x00, 0x00, 0x20, 0x11,
+ 0xDA, 0x27, 0x00, 0x00, 0x41, 0x1E, 0x00, 0xB0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00};
+
+ irsend.reset();
+ irsend.sendDaikin(daikin_short_code, kDaikinStateLength - 1);
+ ASSERT_EQ("", irsend.outputStr());
+
+ uint8_t daikin_long_code[kDaikinStateLength + 1] = {
+ 0x11, 0xDA, 0x27, 0xF0, 0x00, 0x00, 0x00, 0x20, 0x11, 0xDA,
+ 0x27, 0x00, 0x00, 0x41, 0x1E, 0x00, 0xB0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xE3, 0x11};
+ irsend.reset();
+ irsend.sendDaikin(daikin_long_code, kDaikinStateLength + 1);
+ ASSERT_EQ(
+ "m428s428m428s428m428s428m428s428m428s428"
+ "m428s29428m3650s1623"
+ "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
+ "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
+ "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s1280m428s428m428s1280m428s428m428s428m428s428m428s1280m428s1280"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s1280m428s1280m428s1280m428s428m428s1280m428s428m428s1280m428s1280"
+ "m428s29428m3650s1623"
+ "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
+ "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
+ "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s1280m428s1280m428s1280m428s1280"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s1280m428s428m428s428"
+ "m428s29428m3650s1623"
+ "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
+ "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
+ "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s1280m428s428m428s428m428s428m428s428m428s428m428s1280m428s428"
+ "m428s428m428s1280m428s1280m428s1280m428s1280m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s1280m428s1280m428s428m428s1280"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s1280m428s1280"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s1280m428s1280m428s428m428s428m428s428m428s1280m428s1280m428s1280"
+ "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
+ "m428s29428",
+ irsend.outputStr());
+}
+
+// Tests for IRDaikinESP class.
+
+TEST(TestDaikinClass, Power) {
+ IRDaikinESP irdaikin(0);
+ irdaikin.begin();
+
+ irdaikin.on();
+ EXPECT_TRUE(irdaikin.getPower());
+
+ irdaikin.off();
+ EXPECT_FALSE(irdaikin.getPower());
+
+ irdaikin.setPower(true);
+ EXPECT_TRUE(irdaikin.getPower());
+
+ irdaikin.setPower(false);
+ EXPECT_FALSE(irdaikin.getPower());
+}
+
+TEST(TestDaikinClass, Temperature) {
+ IRDaikinESP irdaikin(0);
+ irdaikin.begin();
+
+ irdaikin.setTemp(0);
+ EXPECT_EQ(kDaikinMinTemp, irdaikin.getTemp());
+
+ irdaikin.setTemp(255);
+ EXPECT_EQ(kDaikinMaxTemp, irdaikin.getTemp());
+
+ irdaikin.setTemp(kDaikinMinTemp);
+ EXPECT_EQ(kDaikinMinTemp, irdaikin.getTemp());
+
+ irdaikin.setTemp(kDaikinMaxTemp);
+ EXPECT_EQ(kDaikinMaxTemp, irdaikin.getTemp());
+
+ irdaikin.setTemp(kDaikinMinTemp - 1);
+ EXPECT_EQ(kDaikinMinTemp, irdaikin.getTemp());
+
+ irdaikin.setTemp(kDaikinMaxTemp + 1);
+ EXPECT_EQ(kDaikinMaxTemp, irdaikin.getTemp());
+
+ irdaikin.setTemp(kDaikinMinTemp + 1);
+ EXPECT_EQ(kDaikinMinTemp + 1, irdaikin.getTemp());
+
+ irdaikin.setTemp(21);
+ EXPECT_EQ(21, irdaikin.getTemp());
+
+ irdaikin.setTemp(25);
+ EXPECT_EQ(25, irdaikin.getTemp());
+
+ irdaikin.setTemp(29);
+ EXPECT_EQ(29, irdaikin.getTemp());
+}
+
+TEST(TestDaikinClass, OperatingMode) {
+ IRDaikinESP irdaikin(0);
+ irdaikin.begin();
+
+ irdaikin.setMode(kDaikinAuto);
+ EXPECT_EQ(kDaikinAuto, irdaikin.getMode());
+
+ irdaikin.setMode(kDaikinCool);
+ EXPECT_EQ(kDaikinCool, irdaikin.getMode());
+
+ irdaikin.setMode(kDaikinHeat);
+ EXPECT_EQ(kDaikinHeat, irdaikin.getMode());
+
+ irdaikin.setMode(kDaikinDry);
+ EXPECT_EQ(kDaikinDry, irdaikin.getMode());
+
+ irdaikin.setMode(kDaikinFan);
+ EXPECT_EQ(kDaikinFan, irdaikin.getMode());
+
+ irdaikin.setMode(kDaikinFan + 1);
+ EXPECT_EQ(kDaikinAuto, irdaikin.getMode());
+
+ irdaikin.setMode(kDaikinAuto + 1);
+ EXPECT_EQ(kDaikinAuto, irdaikin.getMode());
+
+ irdaikin.setMode(255);
+ EXPECT_EQ(kDaikinAuto, irdaikin.getMode());
+}
+
+TEST(TestDaikinClass, VaneSwing) {
+ IRDaikinESP irdaikin(0);
+ irdaikin.begin();
+
+ irdaikin.setSwingHorizontal(true);
+ irdaikin.setSwingVertical(false);
+
+ irdaikin.setSwingHorizontal(true);
+ EXPECT_TRUE(irdaikin.getSwingHorizontal());
+ EXPECT_FALSE(irdaikin.getSwingVertical());
+
+ irdaikin.setSwingVertical(true);
+ EXPECT_TRUE(irdaikin.getSwingHorizontal());
+ EXPECT_TRUE(irdaikin.getSwingVertical());
+
+ irdaikin.setSwingHorizontal(false);
+ EXPECT_FALSE(irdaikin.getSwingHorizontal());
+ EXPECT_TRUE(irdaikin.getSwingVertical());
+
+ irdaikin.setSwingVertical(false);
+ EXPECT_FALSE(irdaikin.getSwingHorizontal());
+ EXPECT_FALSE(irdaikin.getSwingVertical());
+}
+
+TEST(TestDaikinClass, QuietMode) {
+ IRDaikinESP irdaikin(0);
+ irdaikin.begin();
+
+ irdaikin.setQuiet(true);
+ EXPECT_TRUE(irdaikin.getQuiet());
+
+ irdaikin.setQuiet(false);
+ EXPECT_FALSE(irdaikin.getQuiet());
+
+ irdaikin.setQuiet(true);
+ EXPECT_TRUE(irdaikin.getQuiet());
+
+ // Setting Econo mode should NOT change out of quiet mode.
+ irdaikin.setEcono(true);
+ EXPECT_TRUE(irdaikin.getQuiet());
+ irdaikin.setEcono(false);
+ EXPECT_TRUE(irdaikin.getQuiet());
+
+ // But setting Powerful mode should exit out of quiet mode.
+ irdaikin.setPowerful(true);
+ EXPECT_FALSE(irdaikin.getQuiet());
+}
+
+TEST(TestDaikinClass, PowerfulMode) {
+ IRDaikinESP irdaikin(0);
+ irdaikin.begin();
+
+ irdaikin.setPowerful(true);
+ EXPECT_TRUE(irdaikin.getPowerful());
+
+ irdaikin.setPowerful(false);
+ EXPECT_FALSE(irdaikin.getPowerful());
+
+ irdaikin.setPowerful(true);
+ EXPECT_TRUE(irdaikin.getPowerful());
+
+ irdaikin.setQuiet(true);
+ EXPECT_FALSE(irdaikin.getPowerful());
+
+ irdaikin.setPowerful(true);
+ irdaikin.setEcono(true);
+ EXPECT_FALSE(irdaikin.getPowerful());
+}
+
+TEST(TestDaikinClass, EconoMode) {
+ IRDaikinESP irdaikin(0);
+ irdaikin.begin();
+
+ irdaikin.setEcono(true);
+ EXPECT_TRUE(irdaikin.getEcono());
+
+ irdaikin.setEcono(false);
+ EXPECT_FALSE(irdaikin.getEcono());
+
+ irdaikin.setEcono(true);
+ EXPECT_TRUE(irdaikin.getEcono());
+
+ // Setting Quiet mode should NOT change out of Econo mode.
+ irdaikin.setQuiet(true);
+ EXPECT_TRUE(irdaikin.getEcono());
+ irdaikin.setQuiet(false);
+ EXPECT_TRUE(irdaikin.getEcono());
+
+ // But setting Powerful mode should exit out of Econo mode.
+ irdaikin.setPowerful(true);
+ EXPECT_FALSE(irdaikin.getEcono());
+}
+
+TEST(TestDaikinClass, FanSpeed) {
+ IRDaikinESP irdaikin(0);
+ irdaikin.begin();
+
+ // Unexpected value should default to Auto.
+ irdaikin.setFan(0);
+ EXPECT_EQ(kDaikinFanAuto, irdaikin.getFan());
+
+ // Unexpected value should default to Auto.
+ irdaikin.setFan(255);
+ EXPECT_EQ(kDaikinFanAuto, irdaikin.getFan());
+
+ irdaikin.setFan(kDaikinFanMax);
+ EXPECT_EQ(kDaikinFanMax, irdaikin.getFan());
+
+ // Beyond Max should default to Auto.
+ irdaikin.setFan(kDaikinFanMax + 1);
+ EXPECT_EQ(kDaikinFanAuto, irdaikin.getFan());
+
+ irdaikin.setFan(kDaikinFanMax - 1);
+ EXPECT_EQ(kDaikinFanMax - 1, irdaikin.getFan());
+
+ irdaikin.setFan(kDaikinFanMin);
+ EXPECT_EQ(kDaikinFanMin, irdaikin.getFan());
+
+ irdaikin.setFan(kDaikinFanMin + 1);
+ EXPECT_EQ(kDaikinFanMin + 1, irdaikin.getFan());
+
+ // Beyond Min should default to Auto.
+ irdaikin.setFan(kDaikinFanMin - 1);
+ EXPECT_EQ(kDaikinFanAuto, irdaikin.getFan());
+
+ irdaikin.setFan(3);
+ EXPECT_EQ(3, irdaikin.getFan());
+
+ irdaikin.setFan(kDaikinFanAuto);
+ EXPECT_EQ(kDaikinFanAuto, irdaikin.getFan());
+
+ irdaikin.setFan(kDaikinFanQuiet);
+ EXPECT_EQ(kDaikinFanQuiet, irdaikin.getFan());
+}
+
+TEST(TestDaikinClass, CurrentTime) {
+ IRDaikinESP irdaikin(0);
+ irdaikin.begin();
+
+ irdaikin.setCurrentTime(0); // 00:00
+ EXPECT_EQ(0, irdaikin.getCurrentTime());
+
+ irdaikin.setCurrentTime(754); // 12:34
+ EXPECT_EQ(754, irdaikin.getCurrentTime());
+
+ irdaikin.setCurrentTime(1439); // 23:59
+ EXPECT_EQ(1439, irdaikin.getCurrentTime());
+}
+
+TEST(TestDaikinClass, OnOffTimers) {
+ IRDaikinESP irdaikin(0);
+ irdaikin.begin();
+
+ // Both timers turned off.
+ irdaikin.disableOnTimer();
+ irdaikin.disableOffTimer();
+ EXPECT_FALSE(irdaikin.getOnTimerEnabled());
+ EXPECT_EQ(0x600, irdaikin.getOnTime());
+ EXPECT_FALSE(irdaikin.getOffTimerEnabled());
+ EXPECT_EQ(0x600, irdaikin.getOffTime());
+
+ // Turn on just the On Timer.
+ irdaikin.enableOnTimer(123);
+ EXPECT_TRUE(irdaikin.getOnTimerEnabled());
+ EXPECT_EQ(123, irdaikin.getOnTime());
+ EXPECT_FALSE(irdaikin.getOffTimerEnabled());
+ EXPECT_EQ(0x600, irdaikin.getOffTime());
+
+ // Now turn on the Off Timer.
+ irdaikin.enableOffTimer(754);
+ EXPECT_TRUE(irdaikin.getOffTimerEnabled());
+ EXPECT_EQ(754, irdaikin.getOffTime());
+ EXPECT_TRUE(irdaikin.getOnTimerEnabled());
+ EXPECT_EQ(123, irdaikin.getOnTime());
+
+ // Turn off the just the On Timer.
+ irdaikin.disableOnTimer();
+ EXPECT_FALSE(irdaikin.getOnTimerEnabled());
+ EXPECT_EQ(0x600, irdaikin.getOnTime());
+ EXPECT_TRUE(irdaikin.getOffTimerEnabled());
+ EXPECT_EQ(754, irdaikin.getOffTime());
+
+ // Now turn off the Off Timer.
+ irdaikin.disableOffTimer();
+ EXPECT_FALSE(irdaikin.getOffTimerEnabled());
+ EXPECT_EQ(0x600, irdaikin.getOffTime());
+ EXPECT_FALSE(irdaikin.getOnTimerEnabled());
+ EXPECT_EQ(0x600, irdaikin.getOnTime());
+
+ // Use some canary values around the timers to ensure no accidental
+ // bit flips happen. i.e. Neighbouring bytes in the state.
+ // (Found some during testing on systems with different endian-ness)
+ // Tests here to make sure it never happens again.
+ irdaikin.setSwingHorizontal(true);
+ irdaikin.setPowerful(true);
+ irdaikin.disableOffTimer();
+ irdaikin.disableOnTimer();
+ ASSERT_TRUE(irdaikin.getSwingHorizontal());
+ ASSERT_TRUE(irdaikin.getPowerful());
+ irdaikin.enableOnTimer(123);
+ irdaikin.enableOffTimer(456);
+ ASSERT_TRUE(irdaikin.getSwingHorizontal());
+ ASSERT_TRUE(irdaikin.getPowerful());
+ irdaikin.disableOffTimer();
+ irdaikin.disableOnTimer();
+ ASSERT_TRUE(irdaikin.getSwingHorizontal());
+ ASSERT_TRUE(irdaikin.getPowerful());
+
+ irdaikin.setSwingHorizontal(false);
+ irdaikin.setPowerful(false);
+ irdaikin.disableOffTimer();
+ irdaikin.disableOnTimer();
+ ASSERT_FALSE(irdaikin.getSwingHorizontal());
+ ASSERT_FALSE(irdaikin.getPowerful());
+ irdaikin.enableOnTimer(123);
+ irdaikin.enableOffTimer(456);
+ ASSERT_FALSE(irdaikin.getSwingHorizontal());
+ ASSERT_FALSE(irdaikin.getPowerful());
+ irdaikin.disableOffTimer();
+ irdaikin.disableOnTimer();
+ ASSERT_FALSE(irdaikin.getSwingHorizontal());
+ ASSERT_FALSE(irdaikin.getPowerful());
+}
+
+// Test Eye mode.
+TEST(TestDaikinClass, EyeSetting) {
+ IRDaikinESP irdaikin(0);
+ irdaikin.begin();
+
+ // The Eye setting is stored in the same byte as Econo mode.
+ // Econo mode tests are there to make sure it isn't harmed and vice-versa.
+ irdaikin.setEcono(false);
+ irdaikin.setEye(false);
+ ASSERT_FALSE(irdaikin.getEye());
+ EXPECT_FALSE(irdaikin.getEcono());
+
+ irdaikin.setEye(true);
+ ASSERT_TRUE(irdaikin.getEye());
+ EXPECT_FALSE(irdaikin.getEcono());
+
+ irdaikin.setEcono(false);
+ ASSERT_TRUE(irdaikin.getEye());
+ EXPECT_FALSE(irdaikin.getEcono());
+
+ irdaikin.setEcono(true);
+ ASSERT_TRUE(irdaikin.getEye());
+ EXPECT_TRUE(irdaikin.getEcono());
+
+ irdaikin.setEye(false);
+ ASSERT_FALSE(irdaikin.getEye());
+ EXPECT_TRUE(irdaikin.getEcono());
+}
+
+// Test Mold mode.
+TEST(TestDaikinClass, MoldSetting) {
+ IRDaikinESP irdaikin(0);
+ irdaikin.begin();
+
+ irdaikin.setMold(false);
+ ASSERT_FALSE(irdaikin.getMold());
+
+ irdaikin.setMold(true);
+ ASSERT_TRUE(irdaikin.getMold());
+
+ irdaikin.setMold(false);
+ ASSERT_FALSE(irdaikin.getMold());
+}
+
+// Test Sensor mode.
+TEST(TestDaikinClass, SensorSetting) {
+ IRDaikinESP irdaikin(0);
+ irdaikin.begin();
+
+ irdaikin.setSensor(false);
+ ASSERT_FALSE(irdaikin.getSensor());
+
+ irdaikin.setSensor(true);
+ ASSERT_TRUE(irdaikin.getSensor());
+
+ irdaikin.setSensor(false);
+ ASSERT_FALSE(irdaikin.getSensor());
+}
+
+TEST(TestDaikinClass, RenderTime) {
+ EXPECT_EQ("0:00", IRDaikinESP::renderTime(0));
+ EXPECT_EQ("0:10", IRDaikinESP::renderTime(10));
+ EXPECT_EQ("1:00", IRDaikinESP::renderTime(1 * 60 + 0));
+ EXPECT_EQ("23:59", IRDaikinESP::renderTime(23 * 60 + 59));
+}
+
+TEST(TestDaikinClass, SetAndGetRaw) {
+ IRDaikinESP irdaikin(0);
+ uint8_t initialState[kDaikinStateLength] = {
+ 0x11, 0xDA, 0x27, 0x00, 0x42, 0x00, 0x00, 0x54, 0x11,
+ 0xDA, 0x27, 0x00, 0x00, 0x49, 0x1E, 0x00, 0xB0, 0x00,
+ 0x00, 0x06, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x4F};
+ uint8_t expectedState[kDaikinStateLength] = {
+ 0x11, 0xDA, 0x27, 0x00, 0x42, 0x00, 0x00, 0x54, 0x11,
+ 0xDA, 0x27, 0x00, 0x00, 0x48, 0x2A, 0x00, 0xB0, 0x00,
+ 0x00, 0x06, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x02, 0x5A};
+
+ EXPECT_STATE_EQ(initialState, irdaikin.getRaw(), kDaikinBits);
+ // toggle the power state.
+ irdaikin.setPower(!irdaikin.getPower());
+ irdaikin.setTemp(21);
+ irdaikin.setMold(true);
+ EXPECT_STATE_EQ(expectedState, irdaikin.getRaw(), kDaikinBits);
+ irdaikin.setRaw(initialState);
+ EXPECT_STATE_EQ(initialState, irdaikin.getRaw(), kDaikinBits);
+}
+
+TEST(TestDaikinClass, ChecksumValidation) {
+ uint8_t daikin_code[kDaikinStateLength] = {
+ 0x11, 0xDA, 0x27, 0xF0, 0x00, 0x00, 0x00, 0x02, 0x11,
+ 0xDA, 0x27, 0x00, 0x00, 0x41, 0x1E, 0x00, 0xB0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xE1};
+
+ EXPECT_TRUE(IRDaikinESP::validChecksum(daikin_code));
+ // Change the array so the checksum is invalid.
+ daikin_code[0] ^= 0xFF;
+ EXPECT_FALSE(IRDaikinESP::validChecksum(daikin_code));
+ // Restore the previous change, and change another byte.
+ daikin_code[0] ^= 0xFF;
+ daikin_code[4] ^= 0xFF;
+ EXPECT_FALSE(IRDaikinESP::validChecksum(daikin_code));
+ daikin_code[4] ^= 0xFF;
+ // Change something in the 2nd block.
+ daikin_code[10] ^= 0xFF;
+ EXPECT_FALSE(IRDaikinESP::validChecksum(daikin_code));
+ daikin_code[10] ^= 0xFF;
+ EXPECT_TRUE(IRDaikinESP::validChecksum(daikin_code));
+}
+
+// Test human readable output.
+TEST(TestDaikinClass, HumanReadable) {
+ IRDaikinESP irdaikin(0);
+
+ EXPECT_EQ(
+ "Power: On, Mode: 4 (HEAT), Temp: 15C, Fan: 11 (QUIET), "
+ "Powerful: Off, Quiet: Off, Sensor: Off, Eye: Off, Mold: Off, "
+ "Swing (Horizontal): Off, Swing (Vertical): Off, "
+ "Current Time: 0:00, On Time: Off, Off Time: Off",
+ irdaikin.toString());
+ irdaikin.setMode(kDaikinAuto);
+ irdaikin.setTemp(25);
+ irdaikin.setFan(kDaikinFanAuto);
+ irdaikin.setQuiet(true);
+ irdaikin.setSensor(true);
+ irdaikin.setEye(true);
+ irdaikin.setMold(true);
+ irdaikin.setSwingVertical(true);
+ irdaikin.setSwingHorizontal(true);
+ irdaikin.setCurrentTime(9 * 60 + 15);
+ irdaikin.enableOnTimer(8 * 60 + 0);
+ irdaikin.enableOffTimer(17 * 60 + 30);
+ irdaikin.off();
+ EXPECT_EQ(
+ "Power: Off, Mode: 0 (AUTO), Temp: 25C, Fan: 10 (AUTO), "
+ "Powerful: Off, Quiet: On, Sensor: On, Eye: On, Mold: On, "
+ "Swing (Horizontal): On, Swing (Vertical): On, "
+ "Current Time: 9:15, On Time: 8:00, Off Time: 17:30",
+ irdaikin.toString());
+}
+
+// Test general message construction after tweaking some settings.
+TEST(TestDaikinClass, MessageConstuction) {
+ IRDaikinESP irdaikin(0);
+ IRsendTest irsend(4);
+ irdaikin.begin();
+ irsend.begin();
+
+ irdaikin.setFan(kDaikinFanMin);
+ irdaikin.setMode(kDaikinCool);
+ irdaikin.setTemp(27);
+ irdaikin.setSwingVertical(false);
+ irdaikin.setSwingHorizontal(true);
+ irdaikin.setQuiet(false);
+ irdaikin.setPower(true);
+
+ // Check everything for kicks.
+ EXPECT_EQ(kDaikinFanMin, irdaikin.getFan());
+ EXPECT_EQ(kDaikinCool, irdaikin.getMode());
+ EXPECT_EQ(27, irdaikin.getTemp());
+ EXPECT_FALSE(irdaikin.getSwingVertical());
+ EXPECT_TRUE(irdaikin.getSwingHorizontal());
+ EXPECT_FALSE(irdaikin.getQuiet());
+ EXPECT_TRUE(irdaikin.getPower());
+
+ irsend.reset();
+ irsend.sendDaikin(irdaikin.getRaw());
+ EXPECT_EQ(
+ "m428s428m428s428m428s428m428s428m428s428"
+ "m428s29428m3650s1623"
+ "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
+ "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
+ "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s1280m428s428m428s1280m428s428m428s428m428s428m428s1280m428s1280"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s1280m428s1280m428s1280m428s428m428s1280m428s428m428s1280m428s1280"
+ "m428s29428m3650s1623"
+ "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
+ "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
+ "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s1280m428s428m428s428m428s428m428s428m428s1280m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s1280m428s428m428s1280m428s428m428s1280m428s428"
+ "m428s29428m3650s1623"
+ "m428s1280m428s428m428s428m428s428m428s1280m428s428m428s428m428s428"
+ "m428s428m428s1280m428s428m428s1280m428s1280m428s428m428s1280m428s1280"
+ "m428s1280m428s1280m428s1280m428s428m428s428m428s1280m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s1280m428s428m428s428m428s1280m428s1280m428s1280m428s428m428s428"
+ "m428s428m428s1280m428s1280m428s428m428s1280m428s1280m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s1280m428s1280m428s428m428s428"
+ "m428s1280m428s1280m428s1280m428s1280m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s1280m428s1280m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s1280m428s1280m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s1280m428s1280"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s428m428s428m428s428m428s428m428s428m428s428m428s428"
+ "m428s428m428s1280m428s1280m428s428m428s428m428s1280m428s1280m428s1280"
+ "m428s29428",
+ irsend.outputStr());
+}
+
+// Tests for decodeDaikin().
+
+// Test decoding a message captured from a real IR remote.
+TEST(TestDecodeDaikin, RealExample) {
+ IRDaikinESP irdaikin(0);
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ uint8_t expectedState[kDaikinStateLength] = {
+ 0x11, 0xDA, 0x27, 0x00, 0x42, 0x3A, 0x05, 0x93, 0x11,
+ 0xDA, 0x27, 0x00, 0x00, 0x3F, 0x3A, 0x00, 0xA0, 0x00,
+ 0x0A, 0x25, 0x17, 0x01, 0x00, 0xC0, 0x00, 0x00, 0x32};
+ uint16_t rawData[kDaikinRawBits] = {
+ 416, 446, 416, 446, 416, 446, 418, 446, 416, 446, 416, 25434,
+ 3436, 1768, 390, 1336, 390, 446, 416, 446, 416, 446, 416, 1336,
+ 390, 446, 416, 446, 416, 446, 416, 446, 416, 1336, 390, 448,
+ 416, 1336, 390, 1336, 390, 448, 416, 1336, 390, 1336, 390, 1338,
+ 388, 1338, 390, 1336, 390, 446, 416, 446, 416, 1336, 390, 446,
+ 416, 446, 416, 446, 416, 446, 416, 446, 416, 446, 416, 448,
+ 416, 446, 416, 446, 416, 446, 416, 1336, 390, 446, 416, 1336,
+ 390, 448, 416, 446, 416, 446, 416, 1336, 390, 1336, 390, 446,
+ 416, 446, 416, 446, 416, 446, 416, 446, 416, 446, 416, 446,
+ 416, 446, 416, 446, 416, 448, 416, 446, 416, 446, 416, 446,
+ 416, 448, 414, 448, 416, 448, 416, 1336, 390, 1336, 390, 1336,
+ 390, 446, 414, 1336, 390, 448, 414, 1336, 390, 1336, 390, 34878,
+ 3436, 1768, 390, 1336, 390, 446, 416, 448, 416, 446, 416, 1336,
+ 390, 446, 416, 448, 416, 446, 416, 446, 416, 1336, 390, 446,
+ 416, 1336, 390, 1336, 390, 446, 416, 1336, 390, 1336, 390, 1336,
+ 390, 1336, 390, 1336, 392, 446, 414, 448, 416, 1336, 390, 446,
+ 416, 446, 416, 446, 416, 446, 414, 448, 416, 446, 416, 448,
+ 414, 448, 416, 446, 416, 446, 416, 446, 414, 1336, 390, 448,
+ 416, 446, 416, 446, 416, 448, 416, 1336, 390, 446, 416, 446,
+ 416, 1336, 390, 446, 416, 1336, 390, 1336, 390, 1336, 390, 446,
+ 416, 446, 414, 1338, 390, 446, 416, 1336, 390, 446, 416, 446,
+ 416, 446, 416, 446, 416, 446, 416, 1336, 390, 1336, 390, 446,
+ 416, 446, 416, 1336, 390, 446, 416, 446, 416, 1336, 390, 34876,
+ 3436, 1768, 388, 1336, 390, 446, 416, 446, 416, 448, 416, 1336,
+ 390, 446, 416, 446, 416, 446, 416, 448, 416, 1336, 390, 448,
+ 414, 1336, 390, 1336, 390, 446, 416, 1336, 388, 1338, 388, 1336,
+ 390, 1336, 390, 1336, 390, 446, 416, 446, 416, 1336, 390, 446,
+ 420, 442, 416, 446, 416, 446, 416, 446, 416, 446, 416, 446,
+ 416, 446, 416, 446, 416, 446, 416, 446, 416, 446, 416, 448,
+ 416, 446, 416, 448, 416, 446, 416, 448, 416, 446, 416, 1336,
+ 390, 1336, 390, 1336, 388, 1338, 390, 1336, 390, 1336, 392, 446,
+ 416, 446, 416, 448, 416, 1334, 390, 446, 416, 1338, 388, 1336,
+ 390, 1336, 390, 446, 416, 446, 416, 448, 414, 446, 416, 446,
+ 416, 446, 416, 448, 416, 446, 416, 446, 416, 446, 416, 446,
+ 416, 446, 416, 446, 416, 446, 416, 446, 416, 1336, 390, 446,
+ 416, 1336, 390, 446, 414, 448, 416, 446, 416, 446, 416, 446,
+ 416, 448, 416, 446, 416, 446, 416, 446, 416, 1336, 390, 446,
+ 416, 1336, 390, 446, 416, 446, 416, 446, 416, 448, 416, 1338,
+ 390, 444, 418, 1336, 390, 448, 416, 446, 416, 1336, 390, 446,
+ 416, 446, 416, 1336, 390, 1336, 388, 1336, 390, 446, 416, 1336,
+ 390, 448, 414, 448, 414, 448, 416, 1334, 390, 446, 416, 446,
+ 416, 446, 416, 448, 416, 446, 416, 446, 416, 448, 416, 446,
+ 416, 446, 416, 446, 416, 446, 416, 446, 416, 446, 416, 446,
+ 416, 446, 416, 446, 416, 446, 416, 446, 416, 446, 416, 446,
+ 416, 448, 416, 1336, 390, 1336, 390, 446, 416, 446, 416, 446,
+ 416, 446, 414, 446, 416, 448, 416, 446, 416, 448, 414, 446,
+ 418, 446, 416, 446, 416, 448, 416, 446, 416, 448, 416, 446,
+ 416, 448, 416, 446, 416, 1336, 390, 446, 416, 446, 416, 1338,
+ 390, 1336, 390, 446, 416, 446, 416}; // Captured by @sillyfrog
+
+ irsend.reset();
+ irsend.sendRaw(rawData, kDaikinRawBits, 38000);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(DAIKIN, irsend.capture.decode_type);
+ ASSERT_EQ(kDaikinBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+}
+
+// Decoding a message we entirely constructed based solely on a given state.
+TEST(TestDecodeDaikin, SyntheticExample) {
+ IRDaikinESP irdaikin(0);
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ uint8_t expectedState[kDaikinStateLength] = {
+ 0x11, 0xDA, 0x27, 0x00, 0x42, 0x3A, 0x05, 0x93, 0x11,
+ 0xDA, 0x27, 0x00, 0x00, 0x3F, 0x3A, 0x00, 0xA0, 0x00,
+ 0x0A, 0x25, 0x17, 0x01, 0x00, 0xC0, 0x00, 0x00, 0x32};
+
+ irsend.reset();
+ irsend.sendDaikin(expectedState);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(DAIKIN, irsend.capture.decode_type);
+ ASSERT_EQ(kDaikinBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_Denon_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Denon_test.cpp
similarity index 82%
rename from lib/IRremoteESP8266-2.2.1.02/test/ir_Denon_test.cpp
rename to lib/IRremoteESP8266-2.5.2.03/test/ir_Denon_test.cpp
index 32de11b46a03..911fd75281e5 100644
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_Denon_test.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Denon_test.cpp
@@ -19,7 +19,8 @@ TEST(TestSendDenon, SendDataOnly) {
"m260s43602"
"m260s780m260s1820m260s780m260s780m260s780m260s780m260s1820m260s1820"
"m260s780m260s780m260s780m260s780m260s1820m260s1820m260s1820"
- "m260s43602", irsend.outputStr());
+ "m260s43602",
+ irsend.outputStr());
irsend.reset();
// Denon Eco Mode On. (Panasonic/Kaseikyo)
@@ -32,7 +33,8 @@ TEST(TestSendDenon, SendDataOnly) {
"m432s1296m432s432m432s432m432s432m432s1296m432s1296m432s432m432s1296"
"m432s432m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s432"
"m432s1296m432s1296m432s1296m432s432m432s432m432s432m432s1296m432s1296"
- "m432s129600", irsend.outputStr());
+ "m432s98928",
+ irsend.outputStr());
}
// Test sending with different repeats.
@@ -54,7 +56,8 @@ TEST(TestSendDenon, SendNormalWithRepeats) {
"m260s43602"
"m260s780m260s1820m260s780m260s780m260s780m260s780m260s1820m260s1820"
"m260s780m260s780m260s780m260s780m260s1820m260s1820m260s1820"
- "m260s43602", irsend.outputStr());
+ "m260s43602",
+ irsend.outputStr());
irsend.sendDenon(0x2278, DENON_BITS, 2); // 2 repeats.
EXPECT_EQ(
"m260s780m260s1820m260s780m260s780m260s780m260s1820m260s780m260s780"
@@ -74,7 +77,8 @@ TEST(TestSendDenon, SendNormalWithRepeats) {
"m260s43602"
"m260s780m260s1820m260s780m260s780m260s780m260s780m260s1820m260s1820"
"m260s780m260s780m260s780m260s780m260s1820m260s1820m260s1820"
- "m260s43602", irsend.outputStr());
+ "m260s43602",
+ irsend.outputStr());
}
TEST(TestSendDenon, Send48BitWithRepeats) {
@@ -91,7 +95,7 @@ TEST(TestSendDenon, Send48BitWithRepeats) {
"m432s1296m432s432m432s432m432s432m432s1296m432s1296m432s432m432s1296"
"m432s432m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s432"
"m432s1296m432s1296m432s1296m432s432m432s432m432s432m432s1296m432s1296"
- "m432s129600"
+ "m432s98928"
"m3456s1728"
"m432s432m432s432m432s1296m432s432m432s1296m432s432m432s1296m432s432"
"m432s432m432s1296m432s432m432s432m432s1296m432s1296m432s432m432s432"
@@ -99,7 +103,8 @@ TEST(TestSendDenon, Send48BitWithRepeats) {
"m432s1296m432s432m432s432m432s432m432s1296m432s1296m432s432m432s1296"
"m432s432m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s432"
"m432s1296m432s1296m432s1296m432s432m432s432m432s432m432s1296m432s1296"
- "m432s129600", irsend.outputStr());
+ "m432s98928",
+ irsend.outputStr());
irsend.sendDenon(0x2A4C028D6CE3, DENON_48_BITS, 2); // 2 repeats.
EXPECT_EQ(
"m3456s1728"
@@ -109,7 +114,7 @@ TEST(TestSendDenon, Send48BitWithRepeats) {
"m432s1296m432s432m432s432m432s432m432s1296m432s1296m432s432m432s1296"
"m432s432m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s432"
"m432s1296m432s1296m432s1296m432s432m432s432m432s432m432s1296m432s1296"
- "m432s129600"
+ "m432s98928"
"m3456s1728"
"m432s432m432s432m432s1296m432s432m432s1296m432s432m432s1296m432s432"
"m432s432m432s1296m432s432m432s432m432s1296m432s1296m432s432m432s432"
@@ -117,7 +122,7 @@ TEST(TestSendDenon, Send48BitWithRepeats) {
"m432s1296m432s432m432s432m432s432m432s1296m432s1296m432s432m432s1296"
"m432s432m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s432"
"m432s1296m432s1296m432s1296m432s432m432s432m432s432m432s1296m432s1296"
- "m432s129600"
+ "m432s98928"
"m3456s1728"
"m432s432m432s432m432s1296m432s432m432s1296m432s432m432s1296m432s432"
"m432s432m432s1296m432s432m432s432m432s1296m432s1296m432s432m432s432"
@@ -125,7 +130,8 @@ TEST(TestSendDenon, Send48BitWithRepeats) {
"m432s1296m432s432m432s432m432s432m432s1296m432s1296m432s432m432s1296"
"m432s432m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s432"
"m432s1296m432s1296m432s1296m432s432m432s432m432s432m432s1296m432s1296"
- "m432s129600", irsend.outputStr());
+ "m432s98928",
+ irsend.outputStr());
}
// Test sending an atypical data size.
@@ -139,7 +145,8 @@ TEST(TestSendDenon, SendUnusualSize) {
"m260s780m260s780m260s780m260s1820m260s780m260s780m260s1820m260s780"
"m260s43602"
"m260s1820m260s1820m260s1820m260s780m260s1820m260s1820m260s780m260s1820"
- "m260s43602", irsend.outputStr());
+ "m260s43602",
+ irsend.outputStr());
irsend.reset();
irsend.sendDenon(0x1234567890ABCDEF, 64);
@@ -153,7 +160,8 @@ TEST(TestSendDenon, SendUnusualSize) {
"m432s1296m432s432m432s1296m432s432m432s1296m432s432m432s1296m432s1296"
"m432s1296m432s1296m432s432m432s432m432s1296m432s1296m432s432m432s1296"
"m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s1296m432s1296"
- "m432s129600", irsend.outputStr());
+ "m432s74736",
+ irsend.outputStr());
}
// Tests for decodeDenon().
@@ -179,12 +187,12 @@ TEST(TestDecodeDenon, NormalDecodeWithStrict) {
// Legacy Denon 14-bit message.
irsend.reset();
- irsend.sendDenon(0x1278, DENON_LEGACY_BITS);
+ irsend.sendDenon(0x1278, kDenonLegacyBits);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeDenon(&irsend.capture, DENON_LEGACY_BITS, true));
+ ASSERT_TRUE(irrecv.decodeDenon(&irsend.capture, kDenonLegacyBits, true));
EXPECT_EQ(DENON, irsend.capture.decode_type);
- EXPECT_EQ(DENON_LEGACY_BITS, irsend.capture.bits);
+ EXPECT_EQ(kDenonLegacyBits, irsend.capture.bits);
EXPECT_EQ(0x1278, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
@@ -211,13 +219,11 @@ TEST(TestDecodeDenon, DecodeGlobalCacheExample) {
irsend.reset();
// Denon AVR series Power On code from Global Cache. (Sharp style)
- uint16_t gc_test_power[67] = {38000, 1, 1,
- 10, 30, 10, 70, 10, 30, 10, 30, 10, 30, 10, 70,
- 10, 30, 10, 30, 10, 70, 10, 70, 10, 70, 10, 70,
- 10, 30, 10, 30, 10, 30, 10, 1657,
- 10, 30, 10, 70, 10, 30, 10, 30, 10, 30, 10, 30,
- 10, 70, 10, 70, 10, 30, 10, 30, 10, 30, 10, 30,
- 10, 70, 10, 70, 10, 70, 10, 1657};
+ uint16_t gc_test_power[67] = {
+ 38000, 1, 1, 10, 30, 10, 70, 10, 30, 10, 30, 10, 30, 10, 70, 10, 30,
+ 10, 30, 10, 70, 10, 70, 10, 70, 10, 70, 10, 30, 10, 30, 10, 30, 10,
+ 1657, 10, 30, 10, 70, 10, 30, 10, 30, 10, 30, 10, 30, 10, 70, 10, 70,
+ 10, 30, 10, 30, 10, 30, 10, 30, 10, 70, 10, 70, 10, 70, 10, 1657};
irsend.sendGC(gc_test_power, 67);
irsend.makeDecodeResult();
@@ -230,15 +236,14 @@ TEST(TestDecodeDenon, DecodeGlobalCacheExample) {
EXPECT_FALSE(irsend.capture.repeat);
// Denon "Eco Mode Auto" code from Global Cache. (Panasonic style)
- uint16_t gc_test_eco[103] = {37000, 1, 1, 128, 64, 16, 16, 16, 16, 16, 48,
- 16, 16, 16, 48, 16, 16, 16, 48, 16, 16, 16, 16,
- 16, 48, 16, 16, 16, 16, 16, 48, 16, 48, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 48, 16, 16, 16, 48, 16, 16, 16, 16,
- 16, 16, 16, 48, 16, 48, 16, 16, 16, 48, 16, 16,
- 16, 48, 16, 48, 16, 16, 16, 48, 16, 48, 16, 16,
- 16, 16, 16, 48, 16, 48, 16, 48, 16, 16, 16, 16,
- 16, 16, 16, 48, 16, 48, 16, 2766};
+ uint16_t gc_test_eco[103] = {
+ 37000, 1, 1, 128, 64, 16, 16, 16, 16, 16, 48, 16, 16, 16, 48,
+ 16, 16, 16, 48, 16, 16, 16, 16, 16, 48, 16, 16, 16, 16, 16,
+ 48, 16, 48, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 48, 16, 16, 16, 48, 16, 16, 16, 16, 16,
+ 16, 16, 48, 16, 48, 16, 16, 16, 48, 16, 16, 16, 48, 16, 48,
+ 16, 16, 16, 48, 16, 48, 16, 16, 16, 16, 16, 48, 16, 48, 16,
+ 48, 16, 16, 16, 16, 16, 16, 16, 48, 16, 48, 16, 2766};
irsend.reset();
irsend.sendGC(gc_test_eco, 103);
irsend.makeDecodeResult();
@@ -259,14 +264,15 @@ TEST(TestDecodeDenon, FailToDecodeNonDenonExample) {
irsend.begin();
irsend.reset();
- uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20, 20, 20, 20,
- 20, 20, 20, 127, 20, 61, 9, 20, 20, 61, 20, 20, 20,
- 61, 20, 61, 20, 61, 20, 20, 20, 20, 20, 20, 20, 884};
+ uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
+ 20, 20, 20, 20, 20, 20, 127, 20, 61, 9,
+ 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
+ 61, 20, 20, 20, 20, 20, 20, 20, 884};
irsend.sendGC(gc_test, 39);
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeDenon(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeDenon(&irsend.capture, DENON_LEGACY_BITS, false));
+ ASSERT_FALSE(irrecv.decodeDenon(&irsend.capture, kDenonLegacyBits, false));
ASSERT_FALSE(irrecv.decodeDenon(&irsend.capture, DENON_BITS, false));
ASSERT_FALSE(irrecv.decodeDenon(&irsend.capture, DENON_48_BITS, false));
}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_Dish_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Dish_test.cpp
similarity index 76%
rename from lib/IRremoteESP8266-2.2.1.02/test/ir_Dish_test.cpp
rename to lib/IRremoteESP8266-2.5.2.03/test/ir_Dish_test.cpp
index afd76e8fd0f7..0c58496cedfc 100644
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_Dish_test.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Dish_test.cpp
@@ -26,7 +26,8 @@ TEST(TestSendDish, SendDataOnly) {
"m400s6100"
"m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
"m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
- "m400s6100", irsend.outputStr());
+ "m400s6100",
+ irsend.outputStr());
irsend.reset();
irsend.sendDISH(0x9C00); // Power on.
@@ -43,7 +44,8 @@ TEST(TestSendDish, SendDataOnly) {
"m400s6100"
"m400s1700m400s2800m400s2800m400s1700m400s1700m400s1700m400s2800m400s2800"
"m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
- "m400s6100", irsend.outputStr());
+ "m400s6100",
+ irsend.outputStr());
irsend.reset();
irsend.sendDISH(0xFFFF);
@@ -60,7 +62,8 @@ TEST(TestSendDish, SendDataOnly) {
"m400s6100"
"m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700"
"m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700"
- "m400s6100", irsend.outputStr());
+ "m400s6100",
+ irsend.outputStr());
}
// Test sending with different repeats.
@@ -69,15 +72,16 @@ TEST(TestSendDish, SendWithRepeats) {
irsend.begin();
irsend.reset();
- irsend.sendDISH(0x9C00, DISH_BITS, 0); // 0 repeats.
+ irsend.sendDISH(0x9C00, kDishBits, 0); // 0 repeats.
EXPECT_EQ(
"m400s6100"
"m400s1700m400s2800m400s2800m400s1700m400s1700m400s1700m400s2800m400s2800"
"m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
- "m400s6100", irsend.outputStr());
+ "m400s6100",
+ irsend.outputStr());
irsend.reset();
- irsend.sendDISH(0x9C00, DISH_BITS, 1); // 1 repeat.
+ irsend.sendDISH(0x9C00, kDishBits, 1); // 1 repeat.
EXPECT_EQ(
"m400s6100"
"m400s1700m400s2800m400s2800m400s1700m400s1700m400s1700m400s2800m400s2800"
@@ -85,9 +89,10 @@ TEST(TestSendDish, SendWithRepeats) {
"m400s6100"
"m400s1700m400s2800m400s2800m400s1700m400s1700m400s1700m400s2800m400s2800"
"m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
- "m400s6100", irsend.outputStr());
+ "m400s6100",
+ irsend.outputStr());
- irsend.sendDISH(0x9C00, DISH_BITS, 2); // 2 repeats.
+ irsend.sendDISH(0x9C00, kDishBits, 2); // 2 repeats.
EXPECT_EQ(
"m400s6100"
"m400s1700m400s2800m400s2800m400s1700m400s1700m400s1700m400s2800m400s2800"
@@ -98,7 +103,8 @@ TEST(TestSendDish, SendWithRepeats) {
"m400s6100"
"m400s1700m400s2800m400s2800m400s1700m400s1700m400s1700m400s2800m400s2800"
"m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
- "m400s6100", irsend.outputStr());
+ "m400s6100",
+ irsend.outputStr());
}
// Test sending an atypical data size.
@@ -109,15 +115,16 @@ TEST(TestSendDish, SendUnusualSize) {
irsend.reset();
irsend.sendDISH(0x0, 8);
EXPECT_EQ(
- "m400s6100"
- "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
- "m400s6100"
- "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
- "m400s6100"
- "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
- "m400s6100"
- "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
- "m400s6100", irsend.outputStr());
+ "m400s6100"
+ "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
+ "m400s6100"
+ "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
+ "m400s6100"
+ "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
+ "m400s6100"
+ "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
+ "m400s6100",
+ irsend.outputStr());
irsend.reset();
irsend.sendDISH(0x1234567890ABCDEF, 64);
@@ -158,7 +165,8 @@ TEST(TestSendDish, SendUnusualSize) {
"m400s1700m400s2800m400s1700m400s2800m400s1700m400s2800m400s1700m400s1700"
"m400s1700m400s1700m400s2800m400s2800m400s1700m400s1700m400s2800m400s1700"
"m400s1700m400s1700m400s1700m400s2800m400s1700m400s1700m400s1700m400s1700"
- "m400s6100", irsend.outputStr());
+ "m400s6100",
+ irsend.outputStr());
}
// Tests for decodeDISH().
@@ -173,9 +181,9 @@ TEST(TestDecodeDish, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendDISH(0x9C00);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, DISH_BITS, true));
+ ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, kDishBits, true));
EXPECT_EQ(DISH, irsend.capture.decode_type);
- EXPECT_EQ(DISH_BITS, irsend.capture.bits);
+ EXPECT_EQ(kDishBits, irsend.capture.bits);
EXPECT_EQ(0x9C00, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
@@ -192,7 +200,7 @@ TEST(TestDecodeDish, DecodeWithNonStrictSize) {
irsend.sendDISH(0x12, 8); // Illegal size Dish message. (smaller)
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, DISH_BITS, true));
+ ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, kDishBits, true));
irsend.makeDecodeResult();
// Should fail with strict when we ask for the wrong bit size.
@@ -209,7 +217,7 @@ TEST(TestDecodeDish, DecodeWithNonStrictSize) {
irsend.sendDISH(0x12345678, 32); // Illegal size Dish message. (larger)
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, DISH_BITS, true));
+ ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, kDishBits, true));
irsend.makeDecodeResult();
// Should fail with strict when we ask for the wrong bit size.
@@ -247,47 +255,45 @@ TEST(TestDecodeDish, DecodeGlobalCacheExample) {
IRrecv irrecv(4);
irsend.begin();
-/*
- irsend.reset();
- // Dish DTV Pal code from Global Cache.
- uint16_t gc_test_dtv[27] = {58000, 1, 3, 22, 538, 22, 252, 22, 156, 22, 156,
- 22, 156, 22, 156, 22, 252, 22, 252, 22, 252, 22,
- 252, 22, 252, 22, 538};
- irsend.sendGC(gc_test_dtv, 27);
- irsend.makeDecodeResult();
-
- ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, DISH_BITS, true));
- EXPECT_EQ(DISH, irsend.capture.decode_type);
- EXPECT_EQ(DISH_BITS, irsend.capture.bits);
- EXPECT_EQ(0x0, irsend.capture.value);
- EXPECT_EQ(0x0, irsend.capture.address);
- EXPECT_EQ(0x0, irsend.capture.command);
- EXPECT_FALSE(irsend.capture.repeat);
-
- ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture));
- EXPECT_EQ(DISH, irsend.capture.decode_type);
- EXPECT_EQ(DISH_BITS, irsend.capture.bits);
- EXPECT_EQ(0x0, irsend.capture.value);
- EXPECT_EQ(0x0, irsend.capture.address);
- EXPECT_EQ(0x0, irsend.capture.command);
- EXPECT_FALSE(irsend.capture.repeat);
-*/
+ /*
+ irsend.reset();
+ // Dish DTV Pal code from Global Cache.
+ uint16_t gc_test_dtv[27] = {58000, 1, 3, 22, 538, 22, 252, 22, 156, 22, 156,
+ 22, 156, 22, 156, 22, 252, 22, 252, 22, 252, 22,
+ 252, 22, 252, 22, 538};
+ irsend.sendGC(gc_test_dtv, 27);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, kDishBits, true));
+ EXPECT_EQ(DISH, irsend.capture.decode_type);
+ EXPECT_EQ(kDishBits, irsend.capture.bits);
+ EXPECT_EQ(0x0, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture));
+ EXPECT_EQ(DISH, irsend.capture.decode_type);
+ EXPECT_EQ(kDishBits, irsend.capture.bits);
+ EXPECT_EQ(0x0, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+ */
// Dish Hopper 3 code from Global Cache.
- uint16_t gc_test_hopper[73] = {58000, 1, 37, 23, 351, 23, 94, 23, 164,
- 23, 164, 23, 94, 23, 94, 23, 94, 23, 164,
- 23, 164, 23, 164, 23, 164, 23, 164, 23, 164,
- 23, 164, 23, 164, 23, 164, 23, 164, 23, 351,
- 23, 94, 23, 164, 23, 164, 23, 94, 23, 94,
- 23, 94, 23, 164, 23, 164, 23, 164, 23, 164,
- 23, 164, 23, 164, 23, 164, 23, 164, 23, 164,
- 23, 164, 23, 351};
+ uint16_t gc_test_hopper[73] = {
+ 58000, 1, 37, 23, 351, 23, 94, 23, 164, 23, 164, 23, 94, 23, 94, 23,
+ 94, 23, 164, 23, 164, 23, 164, 23, 164, 23, 164, 23, 164, 23, 164, 23,
+ 164, 23, 164, 23, 164, 23, 351, 23, 94, 23, 164, 23, 164, 23, 94, 23,
+ 94, 23, 94, 23, 164, 23, 164, 23, 164, 23, 164, 23, 164, 23, 164, 23,
+ 164, 23, 164, 23, 164, 23, 164, 23, 351};
irsend.reset();
irsend.sendGC(gc_test_hopper, 73);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, DISH_BITS, true));
+ ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, kDishBits, true));
EXPECT_EQ(DISH, irsend.capture.decode_type);
- EXPECT_EQ(DISH_BITS, irsend.capture.bits);
+ EXPECT_EQ(kDishBits, irsend.capture.bits);
EXPECT_EQ(0x9C00, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
@@ -295,7 +301,7 @@ TEST(TestDecodeDish, DecodeGlobalCacheExample) {
ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture));
EXPECT_EQ(DISH, irsend.capture.decode_type);
- EXPECT_EQ(DISH_BITS, irsend.capture.bits);
+ EXPECT_EQ(kDishBits, irsend.capture.bits);
EXPECT_EQ(0x9C00, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
@@ -310,12 +316,13 @@ TEST(TestDecodeDish, FailToDecodeNonDishExample) {
irsend.reset();
// Modified a few entries to unexpected values, based on previous test case.
- uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20, 20, 20, 20,
- 20, 20, 20, 127, 20, 61, 9, 20, 20, 61, 20, 20, 20,
- 61, 20, 61, 20, 61, 20, 20, 20, 20, 20, 20, 20, 884};
+ uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
+ 20, 20, 20, 20, 20, 20, 127, 20, 61, 9,
+ 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
+ 61, 20, 20, 20, 20, 20, 20, 20, 884};
irsend.sendGC(gc_test, 39);
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, DISH_BITS, false));
+ ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, kDishBits, false));
}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Electra_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Electra_test.cpp
new file mode 100644
index 000000000000..df5dd7a5c169
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Electra_test.cpp
@@ -0,0 +1,98 @@
+// Copyright 2018 David Conran
+
+#include "IRrecv.h"
+#include "IRrecv_test.h"
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests for sendElectraAC().
+
+// Test sending typical data only.
+TEST(TestSendElectraAC, SendDataOnly) {
+ IRsendTest irsend(0);
+ irsend.begin();
+ uint8_t data[kElectraAcStateLength] = {0xC3, 0xE1, 0x6F, 0x14, 0x06,
+ 0x00, 0x04, 0x00, 0x00, 0x04,
+ 0x00, 0xA0, 0xB0};
+
+ irsend.sendElectraAC(data);
+ EXPECT_EQ(
+ "m9166s4470"
+ "m646s1647m646s1647m646s547m646s547m646s547m646s547m646s1647m646s1647"
+ "m646s1647m646s1647m646s1647m646s547m646s547m646s547m646s547m646s1647"
+ "m646s547m646s1647m646s1647m646s547m646s1647m646s1647m646s1647m646s1647"
+ "m646s547m646s547m646s547m646s1647m646s547m646s1647m646s547m646s547"
+ "m646s547m646s547m646s547m646s547m646s547m646s1647m646s1647m646s547"
+ "m646s547m646s547m646s547m646s547m646s547m646s547m646s547m646s547"
+ "m646s547m646s547m646s547m646s547m646s547m646s1647m646s547m646s547"
+ "m646s547m646s547m646s547m646s547m646s547m646s547m646s547m646s547"
+ "m646s547m646s547m646s547m646s547m646s547m646s547m646s547m646s547"
+ "m646s547m646s547m646s547m646s547m646s547m646s1647m646s547m646s547"
+ "m646s547m646s547m646s547m646s547m646s547m646s547m646s547m646s547"
+ "m646s1647m646s547m646s1647m646s547m646s547m646s547m646s547m646s547"
+ "m646s1647m646s547m646s1647m646s1647m646s547m646s547m646s547m646s547"
+ "m646s100000",
+ irsend.outputStr());
+}
+
+// Tests for decodeElectraAC().
+// Decode normal ElectraAC messages.
+
+TEST(TestDecodeElectraAC, SyntheticDecode) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ // Synthesised Normal ElectraAC message.
+ irsend.reset();
+ uint8_t expectedState[kElectraAcStateLength] = {0xC3, 0xE1, 0x6F, 0x14, 0x06,
+ 0x00, 0x04, 0x00, 0x00, 0x04,
+ 0x00, 0xA0, 0xB0};
+ irsend.sendElectraAC(expectedState);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(ELECTRA_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kElectraAcBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+}
+
+// Decode a recorded example
+TEST(TestDecodeElectraAC, RealExampleDecode) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ // Real ElectraAC message.
+ // Ref: https://github.com/markszabo/IRremoteESP8266/issues/527
+ uint16_t rawData[211] = {
+ 9166, 4470, 642, 1632, 642, 1632, 668, 534, 666, 534, 668, 534,
+ 614, 536, 640, 1636, 640, 1646, 694, 1662, 612, 1628, 642, 1666,
+ 664, 532, 668, 534, 666, 534, 666, 532, 666, 1644, 642, 532,
+ 640, 1634, 668, 1632, 642, 538, 666, 1660, 610, 1666, 664, 1632,
+ 642, 1672, 610, 536, 666, 534, 694, 532, 666, 1636, 614, 538,
+ 666, 1632, 642, 536, 666, 544, 692, 534, 640, 558, 640, 534,
+ 640, 540, 666, 534, 638, 1666, 638, 1636, 640, 550, 666, 534,
+ 640, 540, 666, 534, 640, 540, 666, 536, 638, 540, 666, 536,
+ 638, 550, 664, 536, 638, 540, 664, 536, 638, 540, 666, 534,
+ 638, 1640, 664, 536, 692, 546, 664, 536, 664, 536, 664, 536,
+ 664, 546, 612, 532, 636, 538, 664, 536, 664, 546, 612, 538,
+ 638, 538, 638, 538, 664, 536, 690, 538, 662, 538, 664, 538,
+ 662, 548, 664, 536, 662, 538, 662, 562, 638, 564, 636, 564,
+ 636, 1668, 582, 556, 652, 572, 612, 568, 636, 564, 610, 570,
+ 636, 556, 616, 550, 656, 566, 610, 570, 632, 578, 608, 1640,
+ 662, 562, 642, 1686, 582, 570, 634, 566, 604, 576, 636, 566,
+ 610, 578, 634, 1664, 584, 590, 660, 1636, 610, 1642, 664, 590,
+ 610, 590, 636, 566, 634, 568, 686}; // UNKNOWN 9AD8CDB5
+ uint8_t expectedState[kElectraAcStateLength] = {0xC3, 0xE1, 0x6F, 0x14, 0x06,
+ 0x00, 0x04, 0x00, 0x00, 0x04,
+ 0x00, 0xA0, 0xB0};
+
+ irsend.reset();
+ irsend.sendRaw(rawData, 211, 38000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(ELECTRA_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kElectraAcBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Fujitsu_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Fujitsu_test.cpp
new file mode 100644
index 000000000000..23fa3e7a7998
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Fujitsu_test.cpp
@@ -0,0 +1,555 @@
+// Copyright 2017 Jonny Graham, David Conran
+
+#include "IRrecv_test.h"
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "ir_Fujitsu.h"
+#include "gtest/gtest.h"
+
+template
+::testing::AssertionResult ArraysMatch(const T (&expected)[size],
+ const T* actual) {
+ for (size_t i(0); i < size; ++i) {
+ if (expected[i] != actual[i]) {
+ int e = expected[i];
+ int a = actual[i];
+ return ::testing::AssertionFailure() << "array[" << i
+ << "] (" << std::hex << a << std::dec << ") != expected[" << i
+ << "] (" << std::hex << e << std::dec << ")";
+ }
+ }
+ return ::testing::AssertionSuccess();
+}
+// Tests for Fujitsu A/C methods.
+
+// Test sending typical data only.
+TEST(TestIRFujitsuACClass, GetRawDefault) {
+ IRFujitsuAC fujitsu = IRFujitsuAC(4); // AR-RAH2E
+ fujitsu.setCmd(kFujitsuAcCmdTurnOn);
+ fujitsu.setSwing(kFujitsuAcSwingBoth);
+ fujitsu.setMode(kFujitsuAcModeCool);
+ fujitsu.setFanSpeed(kFujitsuAcFanHigh);
+ fujitsu.setTemp(24);
+ uint8_t expected_arrah2e[16] = {
+ 0x14, 0x63, 0x00, 0x10, 0x10, 0xFE, 0x09, 0x30,
+ 0x81, 0x01, 0x31, 0x00, 0x00, 0x00, 0x20, 0xFD};
+ EXPECT_TRUE(ArraysMatch(expected_arrah2e, fujitsu.getRaw()));
+ EXPECT_EQ(kFujitsuAcStateLength, fujitsu.getStateLength());
+ EXPECT_EQ("Power: On, Mode: 1 (COOL), Temp: 24C, Fan: 1 (HIGH), "
+ "Swing: Vert + Horiz, Command: N/A", fujitsu.toString());
+
+ uint8_t expected_ardb1[15] = {
+ 0x14, 0x63, 0x00, 0x10, 0x10, 0xFC, 0x08, 0x30,
+ 0x81, 0x01, 0x31, 0x00, 0x00, 0x00, 0x1D};
+ fujitsu.setModel(ARDB1);
+ EXPECT_TRUE(ArraysMatch(expected_ardb1, fujitsu.getRaw()));
+ EXPECT_EQ(kFujitsuAcStateLength - 1, fujitsu.getStateLength());
+ EXPECT_EQ("Power: On, Mode: 1 (COOL), Temp: 24C, Fan: 1 (HIGH), "
+ "Swing: Vert + Horiz, Command: N/A", fujitsu.toString());
+}
+
+TEST(TestIRFujitsuACClass, GetRawTurnOff) {
+ IRFujitsuAC fujitsu = IRFujitsuAC(4);
+ fujitsu.setModel(ARRAH2E);
+ fujitsu.off();
+ uint8_t expected_arrah2e[7] = {0x14, 0x63, 0x0, 0x10, 0x10, 0x02, 0xFD};
+ EXPECT_TRUE(ArraysMatch(expected_arrah2e, fujitsu.getRaw()));
+ EXPECT_EQ(kFujitsuAcStateLengthShort, fujitsu.getStateLength());
+ EXPECT_EQ("Power: Off, Mode: 1 (COOL), Temp: 24C, Fan: 1 (HIGH), "
+ "Swing: Vert + Horiz, Command: N/A", fujitsu.toString());
+
+ fujitsu.setModel(ARDB1);
+ uint8_t expected_ardb1[6] = {0x14, 0x63, 0x0, 0x10, 0x10, 0x02};
+ EXPECT_TRUE(ArraysMatch(expected_ardb1, fujitsu.getRaw()));
+ EXPECT_EQ(kFujitsuAcStateLengthShort - 1, fujitsu.getStateLength());
+ EXPECT_EQ("Power: Off, Mode: 1 (COOL), Temp: 24C, Fan: 1 (HIGH), "
+ "Swing: Vert + Horiz, Command: N/A", fujitsu.toString());
+}
+
+TEST(TestIRFujitsuACClass, GetRawStepHoriz) {
+ IRFujitsuAC fujitsu = IRFujitsuAC(4);
+ fujitsu.stepHoriz();
+ uint8_t expected[7] = {0x14, 0x63, 0x0, 0x10, 0x10, 0x79, 0x86};
+ EXPECT_TRUE(ArraysMatch(expected, fujitsu.getRaw()));
+ EXPECT_EQ(kFujitsuAcStateLengthShort, fujitsu.getStateLength());
+ EXPECT_EQ("Power: On, Mode: 1 (COOL), Temp: 24C, Fan: 1 (HIGH), "
+ "Swing: Vert + Horiz, Command: Step vane horizontally",
+ fujitsu.toString());
+}
+
+TEST(TestIRFujitsuACClass, GetRawStepVert) {
+ IRFujitsuAC fujitsu = IRFujitsuAC(4);
+ fujitsu.setModel(ARRAH2E);
+ fujitsu.stepVert();
+ uint8_t expected_arrah2e[7] = {0x14, 0x63, 0x0, 0x10, 0x10, 0x6C, 0x93};
+ EXPECT_TRUE(ArraysMatch(expected_arrah2e, fujitsu.getRaw()));
+ EXPECT_EQ(kFujitsuAcStateLengthShort, fujitsu.getStateLength());
+ EXPECT_EQ("Power: On, Mode: 1 (COOL), Temp: 24C, Fan: 1 (HIGH), "
+ "Swing: Vert + Horiz, Command: Step vane vertically",
+ fujitsu.toString());
+
+ fujitsu.setModel(ARDB1);
+ fujitsu.stepVert();
+ uint8_t expected_ardb1[6] = {0x14, 0x63, 0x0, 0x10, 0x10, 0x6C};
+ EXPECT_TRUE(ArraysMatch(expected_ardb1, fujitsu.getRaw()));
+ EXPECT_EQ(kFujitsuAcStateLengthShort - 1,
+ fujitsu.getStateLength());
+ EXPECT_EQ("Power: On, Mode: 1 (COOL), Temp: 24C, Fan: 1 (HIGH), "
+ "Swing: Vert + Horiz, Command: Step vane vertically",
+ fujitsu.toString());
+}
+
+TEST(TestIRFujitsuACClass, GetRawWithSwingHoriz) {
+ IRFujitsuAC fujitsu = IRFujitsuAC(4);
+ fujitsu.setCmd(kFujitsuAcCmdStayOn);
+ fujitsu.setSwing(kFujitsuAcSwingHoriz);
+ fujitsu.setMode(kFujitsuAcModeCool);
+ fujitsu.setFanSpeed(kFujitsuAcFanQuiet);
+ fujitsu.setTemp(25);
+ uint8_t expected[16] = {0x14, 0x63, 0x0, 0x10, 0x10, 0xFE, 0x9, 0x30,
+ 0x90, 0x1, 0x24, 0x0, 0x0, 0x0, 0x20, 0xFB};
+ EXPECT_TRUE(ArraysMatch(expected, fujitsu.getRaw()));
+ EXPECT_EQ("Power: On, Mode: 1 (COOL), Temp: 25C, Fan: 4 (QUIET), "
+ "Swing: Horiz, Command: N/A",
+ fujitsu.toString());
+}
+
+TEST(TestIRFujitsuACClass, GetRawWithFan) {
+ IRFujitsuAC fujitsu = IRFujitsuAC(4);
+ fujitsu.setCmd(kFujitsuAcCmdStayOn);
+ fujitsu.setSwing(kFujitsuAcSwingHoriz);
+ fujitsu.setMode(kFujitsuAcModeFan);
+ fujitsu.setFanSpeed(kFujitsuAcFanMed);
+ fujitsu.setTemp(20); // temp doesn't matter for fan
+ // but it is sent by the RC anyway
+ fujitsu.setModel(ARRAH2E);
+ uint8_t expected_arrah2e[16] = {
+ 0x14, 0x63, 0x0, 0x10, 0x10, 0xFE, 0x9, 0x30,
+ 0x40, 0x3, 0x22, 0x0, 0x0, 0x0, 0x20, 0x4B};
+ EXPECT_TRUE(ArraysMatch(expected_arrah2e, fujitsu.getRaw()));
+ EXPECT_EQ(kFujitsuAcStateLength, fujitsu.getStateLength());
+ EXPECT_EQ("Power: On, Mode: 3 (FAN), Temp: 20C, Fan: 2 (MED), Swing: Horiz, "
+ "Command: N/A", fujitsu.toString());
+
+ fujitsu.setModel(ARDB1);
+ uint8_t expected_ardb1[15] = {
+ 0x14, 0x63, 0x0, 0x10, 0x10, 0xFC, 0x8, 0x30,
+ 0x40, 0x3, 0x22, 0x0, 0x0, 0x0, 0x6B};
+ EXPECT_TRUE(ArraysMatch(expected_ardb1, fujitsu.getRaw()));
+ EXPECT_EQ(kFujitsuAcStateLength - 1, fujitsu.getStateLength());
+ EXPECT_EQ("Power: On, Mode: 3 (FAN), Temp: 20C, Fan: 2 (MED), Swing: Horiz, "
+ "Command: N/A", fujitsu.toString());
+}
+
+TEST(TestIRFujitsuACClass, SetRaw) {
+ IRFujitsuAC fujitsu = IRFujitsuAC(0);
+ EXPECT_EQ(kFujitsuAcStateLength, fujitsu.getStateLength());
+ uint8_t expected_default_arrah2e[kFujitsuAcStateLength] = {
+ 0x14, 0x63, 0x00, 0x10, 0x10, 0xFE, 0x09, 0x30,
+ 0x81, 0x01, 0x31, 0x00, 0x00, 0x00, 0x20, 0xFD};
+ EXPECT_TRUE(ArraysMatch(expected_default_arrah2e, fujitsu.getRaw()));
+ EXPECT_EQ("Power: On, Mode: 1 (COOL), Temp: 24C, Fan: 1 (HIGH), "
+ "Swing: Vert + Horiz, Command: N/A", fujitsu.toString());
+ // Now set a new state via setRaw();
+ // This state is a real state from an AR-DB1 remote.
+ uint8_t new_state1[kFujitsuAcStateLength - 1] = {
+ 0x14, 0x63, 0x00, 0x10, 0x10, 0xFC, 0x08, 0x30,
+ 0x30, 0x01, 0x00, 0x00, 0x00, 0x00, 0x9F};
+ fujitsu.setRaw(new_state1, kFujitsuAcStateLength - 1);
+ EXPECT_EQ(kFujitsuAcStateLength - 1, fujitsu.getStateLength());
+ EXPECT_TRUE(ArraysMatch(new_state1, fujitsu.getRaw()));
+ EXPECT_EQ("Power: On, Mode: 1 (COOL), Temp: 19C, Fan: 0 (AUTO), "
+ "Swing: Off, Command: N/A", fujitsu.toString());
+}
+
+TEST(TestSendFujitsuAC, GenerateMessage) {
+ IRFujitsuAC fujitsu = IRFujitsuAC(4);
+ IRsendTest irsend(4);
+ fujitsu.begin();
+ irsend.begin();
+
+ fujitsu.setCmd(kFujitsuAcCmdStayOn);
+ fujitsu.setSwing(kFujitsuAcSwingBoth);
+ fujitsu.setMode(kFujitsuAcModeCool);
+ fujitsu.setFanSpeed(kFujitsuAcFanHigh);
+ fujitsu.setTemp(24);
+
+ EXPECT_EQ(kFujitsuAcFanHigh, fujitsu.getFanSpeed());
+ EXPECT_EQ(kFujitsuAcModeCool, fujitsu.getMode());
+ EXPECT_EQ(24, fujitsu.getTemp());
+ EXPECT_EQ(kFujitsuAcSwingBoth, fujitsu.getSwing());
+ EXPECT_EQ(kFujitsuAcCmdStayOn, fujitsu.getCmd());
+
+ irsend.reset();
+ irsend.sendFujitsuAC(fujitsu.getRaw(), kFujitsuAcStateLength);
+ EXPECT_EQ(
+ "m3324s1574"
+ "m448s390m448s390m448s1182m448s390m448s1182m448s390m448s390m448s390"
+ "m448s1182m448s1182m448s390m448s390m448s390m448s1182m448s1182m448s390"
+ "m448s390m448s390m448s390m448s390m448s390m448s390m448s390m448s390"
+ "m448s390m448s390m448s390m448s390m448s1182m448s390m448s390m448s390"
+ "m448s390m448s390m448s390m448s390m448s1182m448s390m448s390m448s390"
+ "m448s390m448s1182m448s1182m448s1182m448s1182m448s1182m448s1182m448s1182"
+ "m448s1182m448s390m448s390m448s1182m448s390m448s390m448s390m448s390"
+ "m448s390m448s390m448s390m448s390m448s1182m448s1182m448s390m448s390"
+ "m448s390m448s390m448s390m448s390m448s390m448s390m448s390m448s1182"
+ "m448s1182m448s390m448s390m448s390m448s390m448s390m448s390m448s390"
+ "m448s1182m448s390m448s390m448s390m448s1182m448s1182m448s390m448s390"
+ "m448s390m448s390m448s390m448s390m448s390m448s390m448s390m448s390"
+ "m448s390m448s390m448s390m448s390m448s390m448s390m448s390m448s390"
+ "m448s390m448s390m448s390m448s390m448s390m448s390m448s390m448s390"
+ "m448s390m448s390m448s390m448s390m448s390m448s1182m448s390m448s390"
+ "m448s390m448s1182m448s1182m448s1182m448s1182m448s1182m448s1182m448s1182"
+ "m448s8100",
+ irsend.outputStr());
+}
+
+TEST(TestSendFujitsuAC, GenerateShortMessage) {
+ IRFujitsuAC fujitsu = IRFujitsuAC(4);
+ IRsendTest irsend(4);
+ fujitsu.begin();
+ irsend.begin();
+
+ fujitsu.off();
+
+ EXPECT_EQ(kFujitsuAcCmdTurnOff, fujitsu.getCmd());
+
+ irsend.reset();
+ irsend.sendFujitsuAC(fujitsu.getRaw(), kFujitsuAcStateLengthShort);
+ EXPECT_EQ(
+ "m3324s1574m448s390m448s390m448s1182m448s390m448s1182m448s390m448s390m448"
+ "s390m448s1182m448s1182m448s390m448s390m448s390m448s1182m448s1182m448s390"
+ "m448s390m448s390m448s390m448s390m448s390m448s390m448s390m448s390m448s390"
+ "m448s390m448s390m448s390m448s1182m448s390m448s390m448s390m448s390m448s390"
+ "m448s390m448s390m448s1182m448s390m448s390m448s390m448s390m448s1182m448s390"
+ "m448s390m448s390m448s390m448s390m448s390m448s1182m448s390m448s1182m448"
+ "s1182m448s1182m448s1182m448s1182m448s1182m448s8100",
+ irsend.outputStr());
+}
+
+// Issue #275
+TEST(TestSendFujitsuAC, Issue275) {
+ IRFujitsuAC fujitsu = IRFujitsuAC(4);
+ IRsendTest irsend(4);
+ fujitsu.begin();
+ irsend.begin();
+ irsend.reset();
+
+ fujitsu.setCmd(kFujitsuAcCmdTurnOff);
+ irsend.sendFujitsuAC(fujitsu.getRaw(), kFujitsuAcStateLengthShort);
+ EXPECT_EQ(
+ // Header
+ "m3324s1574"
+ // 0 0 1 0 1 0 0 0 (0x28)
+ "m448s390m448s390m448s1182m448s390m448s1182m448s390m448s390m448s390"
+ // 1 1 0 0 0 1 1 0 (0xC6)
+ "m448s1182m448s1182m448s390m448s390m448s390m448s1182m448s1182m448s390"
+ // 0 0 0 0 0 0 0 0 (0x00)
+ "m448s390m448s390m448s390m448s390m448s390m448s390m448s390m448s390"
+ // 0 0 0 0 1 0 0 0 (0x08)
+ "m448s390m448s390m448s390m448s390m448s1182m448s390m448s390m448s390"
+ // 0 0 0 0 1 0 0 0 (0x08)
+ "m448s390m448s390m448s390m448s390m448s1182m448s390m448s390m448s390"
+ // 0 1 0 0 0 0 0 0 (0x40)
+ "m448s390m448s1182m448s390m448s390m448s390m448s390m448s390m448s390"
+ // 1 0 1 1 1 1 1 1 (0xBF)
+ "m448s1182m448s390m448s1182m448s1182m448s1182m448s1182m448s1182m448s1182"
+ // Footer
+ "m448s8100", irsend.outputStr());
+
+ irsend.reset();
+ // Per report in Issue #275
+ uint16_t off[115] = {
+ 3350, 1650,
+ 450, 400, 450, 450, 450, 1250, 450, 400, 450, 1250, 450, 400, 450, 400,
+ 450, 400, 450, 1250, 450, 1250, 450, 400, 450, 400, 450, 400, 450, 1250,
+ 450, 1250, 450, 400, 450, 400, 450, 400, 450, 400, 450, 400, 450, 400,
+ 450, 400, 450, 400, 450, 400, 450, 400, 450, 400, 450, 400, 450, 400,
+ 450, 1250, 450, 400, 450, 400, 450, 400, 450, 400, 450, 400, 450, 400,
+ 450, 400, 450, 1250, 450, 400, 450, 400, 450, 400, 450, 400, 450, 1250,
+ 450, 400, 450, 400, 450, 400, 450, 400, 450, 400, 450, 400, 450, 1250,
+ 450, 400, 450, 1250, 450, 1250, 450, 1250, 450, 1250, 450, 1250,
+ 450, 1250, 450};
+ irsend.sendRaw(off, 115, 38);
+ EXPECT_EQ(
+ // Header
+ "m3350s1650"
+ // 0 0 1 0 1 0 0 0 (0x28)
+ "m450s400m450s450m450s1250m450s400m450s1250m450s400m450s400m450s400"
+ // 1 1 0 0 0 1 1 0 (0xC6)
+ "m450s1250m450s1250m450s400m450s400m450s400m450s1250m450s1250m450s400"
+ // 0 0 0 0 0 0 0 0 (0x00)
+ "m450s400m450s400m450s400m450s400m450s400m450s400m450s400m450s400"
+ // 0 0 0 0 1 0 0 0 (0x08)
+ "m450s400m450s400m450s400m450s400m450s1250m450s400m450s400m450s400"
+ // 0 0 0 0 1 0 0 0 (0x08)
+ "m450s400m450s400m450s400m450s400m450s1250m450s400m450s400m450s400"
+ // 0 1 0 0 0 0 0 0 (0x40)
+ "m450s400m450s1250m450s400m450s400m450s400m450s400m450s400m450s400"
+ // 1 0 1 1 1 1 1 1 (0xBF)
+ "m450s1250m450s400m450s1250m450s1250m450s1250m450s1250m450s1250m450s1250"
+ // Footer
+ "m450",
+ irsend.outputStr());
+}
+
+TEST(TestDecodeFujitsuAC, SyntheticShortMessages) {
+ IRsendTest irsend(0);
+ IRFujitsuAC fujitsu = IRFujitsuAC(0);
+ IRrecv irrecv(0);
+
+ irsend.begin();
+ irsend.reset();
+
+ fujitsu.setModel(ARRAH2E);
+ fujitsu.setCmd(kFujitsuAcCmdTurnOff);
+ irsend.sendFujitsuAC(fujitsu.getRaw(), fujitsu.getStateLength());
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(FUJITSU_AC, irsend.capture.decode_type);
+ ASSERT_EQ(kFujitsuAcMinBits + 8, irsend.capture.bits);
+ uint8_t expected_arrah2e[7] = {0x14, 0x63, 0x0, 0x10, 0x10, 0x02, 0xFD};
+ EXPECT_TRUE(ArraysMatch(expected_arrah2e, irsend.capture.state));
+
+ irsend.reset();
+
+ fujitsu.setModel(ARDB1);
+ fujitsu.setCmd(kFujitsuAcCmdTurnOff);
+ irsend.sendFujitsuAC(fujitsu.getRaw(), fujitsu.getStateLength());
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(FUJITSU_AC, irsend.capture.decode_type);
+ ASSERT_EQ(kFujitsuAcMinBits, irsend.capture.bits);
+ uint8_t expected_ardb1[6] = {0x14, 0x63, 0x0, 0x10, 0x10, 0x02};
+ EXPECT_TRUE(ArraysMatch(expected_ardb1, irsend.capture.state));
+}
+
+TEST(TestDecodeFujitsuAC, SyntheticLongMessages) {
+ IRsendTest irsend(0);
+ IRFujitsuAC fujitsu = IRFujitsuAC(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+
+ fujitsu.setModel(ARRAH2E);
+ fujitsu.setCmd(kFujitsuAcCmdStayOn);
+ fujitsu.setSwing(kFujitsuAcSwingVert);
+ fujitsu.setMode(kFujitsuAcModeCool);
+ fujitsu.setFanSpeed(kFujitsuAcFanQuiet);
+ fujitsu.setTemp(18);
+ irsend.sendFujitsuAC(fujitsu.getRaw(), fujitsu.getStateLength());
+ ASSERT_EQ(kFujitsuAcStateLength, fujitsu.getStateLength());
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decodeFujitsuAC(&irsend.capture));
+ ASSERT_EQ(FUJITSU_AC, irsend.capture.decode_type);
+ ASSERT_EQ(kFujitsuAcBits, irsend.capture.bits);
+ uint8_t expected_arrah2e[kFujitsuAcStateLength] = {
+ 0x14, 0x63, 0x00, 0x10, 0x10, 0xFE, 0x09, 0x30,
+ 0x20, 0x01, 0x14, 0x00, 0x00, 0x00, 0x20, 0x7B};
+ EXPECT_TRUE(ArraysMatch(expected_arrah2e, irsend.capture.state));
+ fujitsu.setRaw(irsend.capture.state, irsend.capture.bits / 8);
+ EXPECT_EQ(kFujitsuAcStateLength, fujitsu.getStateLength());
+ EXPECT_EQ("Power: On, Mode: 1 (COOL), Temp: 18C, Fan: 4 (QUIET), "
+ "Swing: Vert, Command: N/A", fujitsu.toString());
+
+ irsend.reset();
+
+ fujitsu.setModel(ARDB1);
+ irsend.sendFujitsuAC(fujitsu.getRaw(), fujitsu.getStateLength());
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(FUJITSU_AC, irsend.capture.decode_type);
+ ASSERT_EQ(kFujitsuAcBits - 8, irsend.capture.bits);
+ uint8_t expected_ardb1[kFujitsuAcStateLength - 1] = {
+ 0x14, 0x63, 0x00, 0x10, 0x10, 0xFC, 0x08, 0x30,
+ 0x20, 0x01, 0x14, 0x00, 0x00, 0x00, 0x9B};
+ EXPECT_TRUE(ArraysMatch(expected_ardb1, irsend.capture.state));
+ fujitsu.setRaw(irsend.capture.state, irsend.capture.bits / 8);
+ EXPECT_EQ(kFujitsuAcStateLength - 1, fujitsu.getStateLength());
+ EXPECT_EQ("Power: On, Mode: 1 (COOL), Temp: 18C, Fan: 4 (QUIET), "
+ "Swing: Vert, Command: N/A", fujitsu.toString());
+}
+
+TEST(TestDecodeFujitsuAC, RealShortARDB1OffExample) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ IRFujitsuAC fujitsu = IRFujitsuAC(0);
+
+ irsend.begin();
+
+ irsend.reset();
+ // "Off" Message recorded from an AR-DB1 remote.
+ uint16_t rawData[99] = {
+ 3310, 1636, 440, 386, 440, 394, 442, 1210, 442, 390, 414, 1220,
+ 444, 390, 446, 380, 446, 380, 436, 1216, 438, 1214, 438, 388,
+ 438, 386, 438, 396, 410, 1222, 440, 1220, 442, 384, 442, 384,
+ 442, 384, 442, 382, 444, 382, 442, 382, 444, 380, 446, 380,
+ 446, 380, 444, 380, 436, 390, 436, 388, 436, 388, 438, 1214,
+ 438, 386, 438, 388, 438, 386, 440, 386, 440, 384, 442, 384,
+ 442, 384, 442, 1210, 444, 382, 444, 382, 444, 382, 444, 380,
+ 446, 1206, 436, 390, 436, 388, 436, 388, 438, 388, 438, 396,
+ 420, 388, 436};
+ irsend.sendRaw(rawData, 99, 38000);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(FUJITSU_AC, irsend.capture.decode_type);
+ ASSERT_EQ(kFujitsuAcMinBits, irsend.capture.bits);
+ uint8_t expected[6] = {0x14, 0x63, 0x0, 0x10, 0x10, 0x02};
+ EXPECT_TRUE(ArraysMatch(expected, irsend.capture.state));
+ fujitsu.setRaw(irsend.capture.state, irsend.capture.bits / 8);
+ EXPECT_EQ(kFujitsuAcStateLengthShort - 1, fujitsu.getStateLength());
+ EXPECT_EQ("Power: Off, Mode: 0 (AUTO), Temp: 16C, Fan: 0 (AUTO), "
+ "Swing: Off, Command: N/A", fujitsu.toString());
+}
+
+TEST(TestDecodeFujitsuAC, RealLongARDB1Example) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ IRFujitsuAC fujitsu = IRFujitsuAC(0);
+
+ irsend.begin();
+ irsend.reset();
+ uint16_t rawData1[243] = {
+ 3316, 1632, 444, 390, 438, 388, 436, 1216, 438, 388, 438, 1214,
+ 438, 388, 438, 386, 440, 386, 440, 1212, 440, 1210, 442, 392,
+ 412, 396, 442, 392, 444, 1208, 444, 1208, 444, 380, 444, 380,
+ 446, 380, 436, 390, 436, 390, 436, 390, 436, 388, 438, 388,
+ 438, 388, 438, 388, 438, 386, 438, 386, 440, 384, 440, 1210,
+ 442, 384, 442, 382, 442, 384, 442, 384, 442, 382, 442, 382,
+ 444, 382, 444, 1208, 444, 382, 444, 380, 446, 380, 436, 390,
+ 436, 390, 436, 1214, 438, 1214, 438, 1212, 440, 1212, 440, 1220,
+ 412, 1222, 440, 394, 442, 382, 442, 382, 444, 1208, 444, 382,
+ 444, 380, 446, 380, 446, 380, 434, 390, 436, 388, 438, 388,
+ 438, 388, 438, 1214, 438, 1212, 440, 386, 440, 394, 412, 1222,
+ 440, 394, 442, 384, 442, 384, 442, 382, 442, 1208, 444, 390,
+ 414, 394, 442, 1216, 446, 380, 436, 390, 436, 390, 436, 388,
+ 436, 390, 436, 388, 438, 386, 440, 386, 440, 386, 438, 1212,
+ 440, 386, 440, 384, 440, 384, 442, 392, 412, 396, 440, 394,
+ 442, 382, 444, 382, 444, 382, 444, 380, 444, 380, 444, 382,
+ 444, 380, 446, 380, 436, 388, 436, 390, 436, 388, 438, 388,
+ 438, 388, 438, 388, 438, 386, 440, 386, 440, 386, 442, 384,
+ 440, 386, 442, 384, 440, 384, 442, 384, 442, 382, 442, 382,
+ 444, 1208, 444, 382, 444, 1208, 444, 380, 446, 1206, 436, 390,
+ 436, 1216, 436};
+ irsend.sendRaw(rawData1, 243, 38000);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(FUJITSU_AC, irsend.capture.decode_type);
+ ASSERT_EQ(kFujitsuAcBits - 8, irsend.capture.bits);
+ uint8_t expected1[kFujitsuAcStateLength - 1] = {
+ 0x14, 0x63, 0x00, 0x10, 0x10, 0xFC, 0x08, 0x30,
+ 0x21, 0x01, 0x04, 0x00, 0x00, 0x00, 0xAA};
+ EXPECT_TRUE(ArraysMatch(expected1, irsend.capture.state));
+ fujitsu.setRaw(irsend.capture.state, irsend.capture.bits / 8);
+ EXPECT_EQ(kFujitsuAcStateLength - 1, fujitsu.getStateLength());
+ EXPECT_EQ("Power: On, Mode: 1 (COOL), Temp: 18C, Fan: 4 (QUIET), "
+ "Swing: Off, Command: N/A", fujitsu.toString());
+
+ irsend.reset();
+ uint16_t rawData2[243] = {
+ 3316, 1630, 436, 398, 438, 386, 438, 1212, 440, 384, 440, 1212,
+ 442, 384, 442, 392, 414, 394, 442, 1218, 446, 1206, 436, 390,
+ 436, 388, 438, 388, 438, 1214, 440, 1212, 440, 384, 442, 384,
+ 442, 384, 442, 382, 444, 382, 444, 382, 444, 380, 446, 380,
+ 444, 380, 436, 390, 436, 388, 438, 396, 418, 388, 438, 1232,
+ 410, 396, 440, 394, 442, 384, 442, 384, 442, 382, 442, 392,
+ 414, 392, 444, 1216, 446, 380, 436, 390, 436, 396, 418, 390,
+ 436, 398, 438, 1214, 440, 1212, 440, 1210, 442, 1208, 444, 1216,
+ 416, 1218, 444, 388, 436, 390, 436, 388, 438, 1214, 440, 386,
+ 438, 386, 440, 386, 440, 384, 442, 384, 442, 384, 442, 382,
+ 444, 382, 444, 1206, 446, 1206, 436, 390, 436, 388, 438, 388,
+ 438, 386, 440, 394, 410, 396, 440, 1220, 442, 1210, 442, 392,
+ 414, 394, 442, 1218, 446, 406, 410, 388, 436, 390, 436, 390,
+ 436, 388, 438, 386, 440, 386, 440, 386, 440, 386, 440, 384,
+ 442, 384, 442, 384, 442, 382, 444, 382, 444, 380, 446, 380,
+ 446, 380, 436, 390, 436, 390, 436, 388, 438, 386, 438, 388,
+ 438, 386, 440, 386, 440, 384, 442, 384, 442, 384, 442, 384,
+ 442, 382, 444, 382, 444, 380, 446, 380, 446, 380, 436, 390,
+ 436, 388, 436, 388, 438, 386, 438, 386, 440, 386, 440, 1212,
+ 440, 1210, 442, 1210, 442, 1208, 444, 1208, 436, 390, 436, 388,
+ 436, 1214, 440};
+ irsend.sendRaw(rawData2, 243, 38000);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(FUJITSU_AC, irsend.capture.decode_type);
+ ASSERT_EQ(kFujitsuAcBits - 8, irsend.capture.bits);
+ uint8_t expected2[kFujitsuAcStateLength - 1] = {
+ 0x14, 0x63, 0x00, 0x10, 0x10, 0xFC, 0x08, 0x30,
+ 0x30, 0x01, 0x00, 0x00, 0x00, 0x00, 0x9F};
+ EXPECT_TRUE(ArraysMatch(expected2, irsend.capture.state));
+ fujitsu.setRaw(irsend.capture.state, irsend.capture.bits / 8);
+ EXPECT_EQ(kFujitsuAcStateLength - 1, fujitsu.getStateLength());
+ EXPECT_EQ("Power: On, Mode: 1 (COOL), Temp: 19C, Fan: 0 (AUTO), "
+ "Swing: Off, Command: N/A", fujitsu.toString());
+}
+
+TEST(TestDecodeFujitsuAC, Issue414) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ IRFujitsuAC fujitsu = IRFujitsuAC(0);
+
+ // Capture as supplied by arpmota
+ uint16_t rawData[259] = {3352, 1574, 480, 350, 480, 346, 480, 1190, 458, 346,
+ 508, 1140, 480, 346, 506, 346, 458, 346, 480, 1168, 480, 1192, 452, 374,
+ 458, 346, 480, 346, 508, 1168, 480, 1140, 480, 346, 506, 346, 458, 346,
+ 480, 346, 480, 346, 480, 346, 484, 372, 454, 374, 456, 346, 508, 318,
+ 480, 374, 458, 374, 480, 318, 480, 1196, 452, 346, 480, 346, 484, 342,
+ 484, 346, 480, 374, 458, 346, 506, 318, 508, 1170, 452, 346, 480, 374,
+ 458, 346, 506, 318, 480, 1196, 452, 1190, 458, 1162, 480, 1196, 452,
+ 1170, 480, 1190, 458, 1164, 480, 1196, 480, 318, 508, 346, 456, 1192,
+ 480, 346, 456, 374, 452, 346, 480, 374, 458, 342, 484, 346, 508, 346,
+ 456, 342, 512, 1164, 458, 1164, 508, 346, 456, 346, 480, 1190, 456, 342,
+ 484, 346, 506, 346, 456, 374, 452, 346, 508, 346, 458, 1164, 508, 346,
+ 458, 374, 452, 1168, 480, 374, 480, 318, 480, 374, 456, 346, 508, 318,
+ 480, 346, 484, 374, 480, 318, 484, 342, 484, 374, 480, 318, 484, 342,
+ 484, 346, 508, 318, 508, 346, 458, 346, 506, 318, 480, 374, 458, 346,
+ 506, 318, 480, 346, 484, 374, 480, 318, 482, 372, 456, 346, 508, 318,
+ 506, 348, 456, 342, 484, 346, 508, 318, 484, 374, 480, 318, 508, 318,
+ 484, 346, 508, 318, 480, 374, 456, 346, 508, 346, 480, 318, 480, 346,
+ 484, 374, 480, 320, 484, 1164, 508, 346, 458, 342, 512, 1164, 458, 1190,
+ 454, 346, 484, 1164, 508, 346, 458, 1164, 480, 350, 480, 374, 480};
+ uint8_t state[16] = {
+ 0x14, 0x63, 0x00, 0x10, 0x10, 0xFE, 0x09, 0x30, 0x81, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x20, 0x2B};
+ irsend.begin();
+ irsend.reset();
+ irsend.sendRaw(rawData, 259, 38000);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(FUJITSU_AC, irsend.capture.decode_type);
+ ASSERT_EQ(kFujitsuAcBits, irsend.capture.bits);
+ EXPECT_TRUE(ArraysMatch(state, irsend.capture.state));
+ fujitsu.setRaw(irsend.capture.state, irsend.capture.bits / 8);
+ EXPECT_EQ(kFujitsuAcStateLength, fujitsu.getStateLength());
+ EXPECT_EQ("Power: On, Mode: 4 (HEAT), Temp: 24C, Fan: 0 (AUTO), "
+ "Swing: Off, Command: N/A", fujitsu.toString());
+
+ // Resend it using the state this time.
+ irsend.reset();
+ irsend.sendFujitsuAC(state, 16);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(FUJITSU_AC, irsend.capture.decode_type);
+ ASSERT_EQ(kFujitsuAcBits, irsend.capture.bits);
+ EXPECT_TRUE(ArraysMatch(state, irsend.capture.state));
+ EXPECT_EQ(
+ "m3324s1574"
+ "m448s390m448s390m448s1182m448s390m448s1182m448s390m448s390m448s390"
+ "m448s1182m448s1182m448s390m448s390m448s390m448s1182m448s1182m448s390"
+ "m448s390m448s390m448s390m448s390m448s390m448s390m448s390m448s390"
+ "m448s390m448s390m448s390m448s390m448s1182m448s390m448s390m448s390"
+ "m448s390m448s390m448s390m448s390m448s1182m448s390m448s390m448s390"
+ "m448s390m448s1182m448s1182m448s1182m448s1182m448s1182m448s1182m448s1182"
+ "m448s1182m448s390m448s390m448s1182m448s390m448s390m448s390m448s390"
+ "m448s390m448s390m448s390m448s390m448s1182m448s1182m448s390m448s390"
+ "m448s1182m448s390m448s390m448s390m448s390m448s390m448s390m448s1182"
+ "m448s390m448s390m448s1182m448s390m448s390m448s390m448s390m448s390"
+ "m448s390m448s390m448s390m448s390m448s390m448s390m448s390m448s390"
+ "m448s390m448s390m448s390m448s390m448s390m448s390m448s390m448s390"
+ "m448s390m448s390m448s390m448s390m448s390m448s390m448s390m448s390"
+ "m448s390m448s390m448s390m448s390m448s390m448s390m448s390m448s390"
+ "m448s390m448s390m448s390m448s390m448s390m448s1182m448s390m448s390"
+ "m448s1182m448s1182m448s390m448s1182m448s390m448s1182m448s390m448s390"
+ "m448s8100", irsend.outputStr());
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_GICable_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_GICable_test.cpp
new file mode 100644
index 000000000000..b9bfce997464
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_GICable_test.cpp
@@ -0,0 +1,161 @@
+// Copyright 2018 David Conran
+
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests for sendGICable().
+
+// Test sending typical data only.
+TEST(TestSendGICable, SendDataOnly) {
+ IRsendTest irsend(0);
+ irsend.begin();
+ irsend.sendGICable(0);
+ EXPECT_EQ(
+ "m9000s4400"
+ "m550s2200m550s2200m550s2200m550s2200m550s2200m550s2200m550s2200m550s2200"
+ "m550s2200m550s2200m550s2200m550s2200m550s2200m550s2200m550s2200m550s2200"
+ "m550s41650"
+ "m9000s2200m550s87850",
+ irsend.outputStr());
+ irsend.sendGICable(0x8807);
+ EXPECT_EQ(
+ "m9000s4400"
+ "m550s4400m550s2200m550s2200m550s2200m550s4400m550s2200m550s2200m550s2200"
+ "m550s2200m550s2200m550s2200m550s2200m550s2200m550s4400m550s4400m550s4400"
+ "m550s30650"
+ "m9000s2200m550s87850",
+ irsend.outputStr());
+ irsend.sendGICable(0xFFFF);
+ EXPECT_EQ(
+ "m9000s4400"
+ "m550s4400m550s4400m550s4400m550s4400m550s4400m550s4400m550s4400m550s4400"
+ "m550s4400m550s4400m550s4400m550s4400m550s4400m550s4400m550s4400m550s4400"
+ "m550s6450"
+ "m9000s2200m550s87850",
+ irsend.outputStr());
+}
+
+// Test sending with repeats.
+TEST(TestSendGICable, SendWithRepeats) {
+ IRsendTest irsend(0);
+ irsend.begin();
+ // Send a command with 0 repeats.
+ irsend.sendGICable(0x8807, kGicableBits, 0);
+ EXPECT_EQ(
+ "m9000s4400"
+ "m550s4400m550s2200m550s2200m550s2200m550s4400m550s2200m550s2200m550s2200"
+ "m550s2200m550s2200m550s2200m550s2200m550s2200m550s4400m550s4400m550s4400"
+ "m550s30650",
+ irsend.outputStr());
+ // Send a command with 1 repeat.
+ irsend.sendGICable(0x8807, kGicableBits, 1);
+ EXPECT_EQ(
+ "m9000s4400"
+ "m550s4400m550s2200m550s2200m550s2200m550s4400m550s2200m550s2200m550s2200"
+ "m550s2200m550s2200m550s2200m550s2200m550s2200m550s4400m550s4400m550s4400"
+ "m550s30650"
+ "m9000s2200m550s87850",
+ irsend.outputStr());
+ // Send a command with 3 repeats.
+ irsend.sendGICable(0x8807, kGicableBits, 3);
+ EXPECT_EQ(
+ "m9000s4400"
+ "m550s4400m550s2200m550s2200m550s2200m550s4400m550s2200m550s2200m550s2200"
+ "m550s2200m550s2200m550s2200m550s2200m550s2200m550s4400m550s4400m550s4400"
+ "m550s30650"
+ "m9000s2200m550s87850"
+ "m9000s2200m550s87850"
+ "m9000s2200m550s87850",
+ irsend.outputStr());
+}
+
+// Tests for decodeGICable().
+// Decode normal GICable messages.
+TEST(TestDecodeGICable, SyntheticDecode) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ // Synthesised Normal GICable message.
+ irsend.reset();
+ irsend.sendGICable(0x8807);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(GICABLE, irsend.capture.decode_type);
+ EXPECT_EQ(kGicableBits, irsend.capture.bits);
+ EXPECT_EQ(0x8807, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+}
+
+// Decode a recorded example
+TEST(TestDecodeGICable, RealExampleDecodeOK) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ // Real GICable "OK/Select" message.
+ // Ref: https://github.com/markszabo/IRremoteESP8266/issues/447
+ uint16_t rawData[39] = {9064, 4408, 580, 4408, 580, 2152, 578, 2150,
+ 580, 2150, 580, 4408, 580, 2150, 580, 2150,
+ 580, 2150, 580, 2150, 580, 2150, 580, 2150,
+ 580, 2150, 580, 2150, 580, 4408, 580, 4408,
+ 580, 4408, 580, 30622, 9066, 2148, 580};
+ irsend.reset();
+ irsend.sendRaw(rawData, 39, 39);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(GICABLE, irsend.capture.decode_type);
+ EXPECT_EQ(kGicableBits, irsend.capture.bits);
+ EXPECT_EQ(0x8807, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+}
+
+TEST(TestDecodeGICable, RealExampleDecodeLEFT) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ // Real GICable "LEFT" message.
+ // Ref: https://github.com/markszabo/IRremoteESP8266/issues/447
+ uint16_t rawData[39] = {9040, 4434, 554, 2176, 580, 4408, 554, 4434,
+ 582, 2148, 554, 4434, 580, 4408, 556, 2174,
+ 580, 2150, 580, 2150, 582, 2148, 556, 2176,
+ 580, 2150, 580, 4408, 580, 4408, 580, 4408,
+ 582, 2150, 580, 26078, 9066, 2148, 580};
+ irsend.reset();
+ irsend.sendRaw(rawData, 39, 39);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(GICABLE, irsend.capture.decode_type);
+ EXPECT_EQ(kGicableBits, irsend.capture.bits);
+ EXPECT_EQ(0x6C0E, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+}
+
+TEST(TestDecodeGICable, RealExampleDecodeZEROKey) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ // Real GICable "Zero Key" message.
+ // Note: Zero key looks similar to a JVC message, hence this test.
+ // Ref: https://github.com/markszabo/IRremoteESP8266/issues/447
+ uint16_t rawData[39] = {9036, 4434, 552, 2178, 552, 2178, 552, 2180,
+ 550, 2178, 552, 2178, 550, 2180, 552, 2178,
+ 552, 2178, 550, 2180, 552, 2178, 526, 2204,
+ 552, 2178, 552, 2178, 526, 2204, 526, 2204,
+ 526, 2204, 526, 41932, 9036, 2176, 552};
+ irsend.reset();
+ irsend.sendRaw(rawData, 39, 39);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(GICABLE, irsend.capture.decode_type);
+ EXPECT_EQ(kGicableBits, irsend.capture.bits);
+ EXPECT_EQ(0x0, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_GlobalCache_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_GlobalCache_test.cpp
new file mode 100644
index 000000000000..16a556b57f95
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_GlobalCache_test.cpp
@@ -0,0 +1,71 @@
+// Copyright 2017 David Conran
+
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests for sendGlobalCache().
+
+// Test sending a typical command wihtout a repeat.
+TEST(TestSendGlobalCache, NonRepeatingCode) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+ irsend.reset();
+
+ // Modified NEC TV "Power On" from Global Cache with no repeats
+ uint16_t gc_test[71] = {38000, 1, 1, 342, 172, 21, 22, 21, 21, 21, 65, 21,
+ 21, 21, 22, 21, 22, 21, 21, 21, 22, 21, 65, 21,
+ 65, 21, 22, 21, 65, 21, 65, 21, 65, 21, 65, 21,
+ 65, 21, 65, 21, 22, 21, 22, 21, 21, 21, 22, 21,
+ 22, 21, 65, 21, 22, 21, 21, 21, 65, 21, 65, 21,
+ 65, 21, 64, 22, 65, 21, 22, 21, 65, 21, 1519};
+ irsend.sendGC(gc_test, 71);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x20DF827D, irsend.capture.value);
+ EXPECT_EQ(0x4, irsend.capture.address);
+ EXPECT_EQ(0x41, irsend.capture.command);
+ EXPECT_EQ(
+ "m8892s4472m546s572m546s546m546s1690m546s546m546s572m546s572"
+ "m546s546m546s572m546s1690m546s1690m546s572m546s1690m546s1690"
+ "m546s1690m546s1690m546s1690m546s1690m546s572m546s572m546s546"
+ "m546s572m546s572m546s1690m546s572m546s546m546s1690m546s1690"
+ "m546s1690m546s1664m572s1690m546s572m546s1690m546s39494",
+ irsend.outputStr());
+}
+
+// Test sending typical command with repeats.
+TEST(TestSendGlobalCache, RepeatCode) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+ irsend.reset();
+
+ // Sherwood (NEC-like) "Power On" from Global Cache with 2 repeats
+ uint16_t gc_test[75] = {
+ 38000, 2, 69, 341, 171, 21, 64, 21, 64, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 64, 21, 64, 21, 21, 21, 64, 21, 21, 21,
+ 21, 21, 21, 21, 64, 21, 21, 21, 64, 21, 21, 21, 21, 21, 21,
+ 21, 64, 21, 21, 21, 21, 21, 21, 21, 21, 21, 64, 21, 64, 21,
+ 64, 21, 21, 21, 64, 21, 64, 21, 64, 21, 1600, 341, 85, 21, 3647};
+ irsend.sendGC(gc_test, 75);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0xC1A28877, irsend.capture.value);
+ EXPECT_EQ(0x4583, irsend.capture.address);
+ EXPECT_EQ(0x11, irsend.capture.command);
+ EXPECT_EQ(
+ "m8866s4446m546s1664m546s1664m546s546m546s546m546s546m546s546"
+ "m546s546m546s1664m546s1664m546s546m546s1664m546s546m546s546"
+ "m546s546m546s1664m546s546m546s1664m546s546m546s546m546s546"
+ "m546s1664m546s546m546s546m546s546m546s546m546s1664m546s1664"
+ "m546s1664m546s546m546s1664m546s1664m546s1664m546s41600"
+ "m8866s2210m546s94822"
+ "m8866s2210m546s94822",
+ irsend.outputStr());
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Gree_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Gree_test.cpp
new file mode 100644
index 000000000000..6c7a1f637fdb
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Gree_test.cpp
@@ -0,0 +1,527 @@
+// Copyright 2017 David Conran
+
+#include "ir_Gree.h"
+#include "IRrecv.h"
+#include "IRrecv_test.h"
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests for sendGree().
+
+// Test sending typical data only.
+TEST(TestSendGreeChars, SendData) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ uint8_t gree_code[kGreeStateLength] = {0x12, 0x34, 0x56, 0x78,
+ 0x90, 0xAB, 0xCD, 0xEF};
+ irsend.reset();
+ irsend.sendGree(gree_code);
+ EXPECT_EQ(
+ "m9000s4000"
+ "m620s540m620s1600m620s540m620s540m620s1600m620s540m620s540m620s540"
+ "m620s540m620s540m620s1600m620s540m620s1600m620s1600m620s540m620s540"
+ "m620s540m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540"
+ "m620s540m620s540m620s540m620s1600m620s1600m620s1600m620s1600m620s540"
+ "m620s540m620s1600m620s540"
+ "m620s19000"
+ "m620s540m620s540m620s540m620s540m620s1600m620s540m620s540m620s1600"
+ "m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540m620s1600"
+ "m620s1600m620s540m620s1600m620s1600m620s540m620s540m620s1600m620s1600"
+ "m620s1600m620s1600m620s1600m620s1600m620s540m620s1600m620s1600m620s1600"
+ "m620s19000",
+ irsend.outputStr());
+}
+
+TEST(TestSendGreeUint64, SendData) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendGree(0x1234567890ABCDEF);
+ EXPECT_EQ(
+ "m9000s4000"
+ "m620s540m620s1600m620s540m620s540m620s1600m620s540m620s540m620s540"
+ "m620s540m620s540m620s1600m620s540m620s1600m620s1600m620s540m620s540"
+ "m620s540m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540"
+ "m620s540m620s540m620s540m620s1600m620s1600m620s1600m620s1600m620s540"
+ "m620s540m620s1600m620s540"
+ "m620s19000"
+ "m620s540m620s540m620s540m620s540m620s1600m620s540m620s540m620s1600"
+ "m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540m620s1600"
+ "m620s1600m620s540m620s1600m620s1600m620s540m620s540m620s1600m620s1600"
+ "m620s1600m620s1600m620s1600m620s1600m620s540m620s1600m620s1600m620s1600"
+ "m620s19000",
+ irsend.outputStr());
+}
+
+// Test sending with repeats.
+TEST(TestSendGreeChars, SendWithRepeats) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ uint8_t gree_code[kGreeStateLength] = {0x12, 0x34, 0x56, 0x78,
+ 0x90, 0xAB, 0xCD, 0xEF};
+ irsend.reset();
+
+ irsend.sendGree(gree_code, kGreeStateLength, 1);
+ EXPECT_EQ(
+ "m9000s4000"
+ "m620s540m620s1600m620s540m620s540m620s1600m620s540m620s540m620s540"
+ "m620s540m620s540m620s1600m620s540m620s1600m620s1600m620s540m620s540"
+ "m620s540m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540"
+ "m620s540m620s540m620s540m620s1600m620s1600m620s1600m620s1600m620s540"
+ "m620s540m620s1600m620s540"
+ "m620s19000"
+ "m620s540m620s540m620s540m620s540m620s1600m620s540m620s540m620s1600"
+ "m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540m620s1600"
+ "m620s1600m620s540m620s1600m620s1600m620s540m620s540m620s1600m620s1600"
+ "m620s1600m620s1600m620s1600m620s1600m620s540m620s1600m620s1600m620s1600"
+ "m620s19000"
+ "m9000s4000"
+ "m620s540m620s1600m620s540m620s540m620s1600m620s540m620s540m620s540"
+ "m620s540m620s540m620s1600m620s540m620s1600m620s1600m620s540m620s540"
+ "m620s540m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540"
+ "m620s540m620s540m620s540m620s1600m620s1600m620s1600m620s1600m620s540"
+ "m620s540m620s1600m620s540"
+ "m620s19000"
+ "m620s540m620s540m620s540m620s540m620s1600m620s540m620s540m620s1600"
+ "m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540m620s1600"
+ "m620s1600m620s540m620s1600m620s1600m620s540m620s540m620s1600m620s1600"
+ "m620s1600m620s1600m620s1600m620s1600m620s540m620s1600m620s1600m620s1600"
+ "m620s19000",
+ irsend.outputStr());
+}
+
+TEST(TestSendGreeUint64, SendWithRepeats) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendGree(0x1234567890ABCDEF, kGreeBits, 1);
+ EXPECT_EQ(
+ "m9000s4000"
+ "m620s540m620s1600m620s540m620s540m620s1600m620s540m620s540m620s540"
+ "m620s540m620s540m620s1600m620s540m620s1600m620s1600m620s540m620s540"
+ "m620s540m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540"
+ "m620s540m620s540m620s540m620s1600m620s1600m620s1600m620s1600m620s540"
+ "m620s540m620s1600m620s540"
+ "m620s19000"
+ "m620s540m620s540m620s540m620s540m620s1600m620s540m620s540m620s1600"
+ "m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540m620s1600"
+ "m620s1600m620s540m620s1600m620s1600m620s540m620s540m620s1600m620s1600"
+ "m620s1600m620s1600m620s1600m620s1600m620s540m620s1600m620s1600m620s1600"
+ "m620s19000"
+ "m9000s4000"
+ "m620s540m620s1600m620s540m620s540m620s1600m620s540m620s540m620s540"
+ "m620s540m620s540m620s1600m620s540m620s1600m620s1600m620s540m620s540"
+ "m620s540m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540"
+ "m620s540m620s540m620s540m620s1600m620s1600m620s1600m620s1600m620s540"
+ "m620s540m620s1600m620s540"
+ "m620s19000"
+ "m620s540m620s540m620s540m620s540m620s1600m620s540m620s540m620s1600"
+ "m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540m620s1600"
+ "m620s1600m620s540m620s1600m620s1600m620s540m620s540m620s1600m620s1600"
+ "m620s1600m620s1600m620s1600m620s1600m620s540m620s1600m620s1600m620s1600"
+ "m620s19000",
+ irsend.outputStr());
+}
+
+// Test sending atypical sizes.
+TEST(TestSendGreeChars, SendUnexpectedSizes) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ uint8_t gree_short_code[kGreeStateLength - 1] = {0x12, 0x34, 0x56, 0x78,
+ 0x90, 0xAB, 0xCD};
+ uint8_t gree_long_code[kGreeStateLength + 1] = {0x12, 0x34, 0x56, 0x78, 0x90,
+ 0xAB, 0xCD, 0xEF, 0x12};
+ irsend.reset();
+ irsend.sendGree(gree_short_code, kGreeStateLength - 1);
+ ASSERT_EQ("", irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendGree(gree_long_code, kGreeStateLength + 1);
+ ASSERT_EQ(
+ "m9000s4000"
+ "m620s540m620s1600m620s540m620s540m620s1600m620s540m620s540m620s540"
+ "m620s540m620s540m620s1600m620s540m620s1600m620s1600m620s540m620s540"
+ "m620s540m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540"
+ "m620s540m620s540m620s540m620s1600m620s1600m620s1600m620s1600m620s540"
+ "m620s540m620s1600m620s540"
+ "m620s19000"
+ "m620s540m620s540m620s540m620s540m620s1600m620s540m620s540m620s1600"
+ "m620s1600m620s1600m620s540m620s1600m620s540m620s1600m620s540m620s1600"
+ "m620s1600m620s540m620s1600m620s1600m620s540m620s540m620s1600m620s1600"
+ "m620s1600m620s1600m620s1600m620s1600m620s540m620s1600m620s1600m620s1600"
+ "m620s540m620s1600m620s540m620s540m620s1600m620s540m620s540m620s540"
+ "m620s19000",
+ irsend.outputStr());
+}
+
+TEST(TestSendGreeUint64, SendUnexpectedSizes) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendGree(0x1234567890ABCDEF, kGreeBits - 1);
+ ASSERT_EQ("", irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendGree(0x1234567890ABCDEF, kGreeBits + 1);
+ ASSERT_EQ("", irsend.outputStr());
+}
+
+TEST(TestSendGree, CompareUint64ToCharResults) {
+ IRsendTest irsend_chars(4);
+ IRsendTest irsend_uint64(0);
+
+ uint8_t gree_code[kGreeStateLength] = {0x12, 0x34, 0x56, 0x78,
+ 0x90, 0xAB, 0xCD, 0xEF};
+
+ irsend_chars.begin();
+ irsend_uint64.begin();
+
+ irsend_chars.reset();
+ irsend_uint64.reset();
+ irsend_chars.sendGree(gree_code);
+ irsend_uint64.sendGree(0x1234567890ABCDEF);
+ ASSERT_EQ(irsend_chars.outputStr(), irsend_uint64.outputStr());
+
+ uint8_t gree_zero_code[kGreeStateLength] = {0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00};
+ irsend_chars.reset();
+ irsend_uint64.reset();
+ irsend_chars.sendGree(gree_zero_code);
+ irsend_uint64.sendGree((uint64_t)0x0);
+ ASSERT_EQ(irsend_chars.outputStr(), irsend_uint64.outputStr());
+}
+
+// Tests for IRGreeAC class.
+
+TEST(TestGreeClass, Power) {
+ IRGreeAC irgree(0);
+ irgree.begin();
+
+ irgree.on();
+ EXPECT_TRUE(irgree.getPower());
+
+ irgree.off();
+ EXPECT_FALSE(irgree.getPower());
+
+ irgree.setPower(true);
+ EXPECT_TRUE(irgree.getPower());
+
+ irgree.setPower(false);
+ EXPECT_FALSE(irgree.getPower());
+}
+
+TEST(TestGreeClass, Temperature) {
+ IRGreeAC irgree(0);
+ irgree.begin();
+
+ irgree.setMode(kGreeCool);
+
+ irgree.setTemp(0);
+ EXPECT_EQ(kGreeMinTemp, irgree.getTemp());
+
+ irgree.setTemp(255);
+ EXPECT_EQ(kGreeMaxTemp, irgree.getTemp());
+
+ irgree.setTemp(kGreeMinTemp);
+ EXPECT_EQ(kGreeMinTemp, irgree.getTemp());
+
+ irgree.setTemp(kGreeMaxTemp);
+ EXPECT_EQ(kGreeMaxTemp, irgree.getTemp());
+
+ irgree.setTemp(kGreeMinTemp - 1);
+ EXPECT_EQ(kGreeMinTemp, irgree.getTemp());
+
+ irgree.setTemp(kGreeMaxTemp + 1);
+ EXPECT_EQ(kGreeMaxTemp, irgree.getTemp());
+
+ irgree.setTemp(17);
+ EXPECT_EQ(17, irgree.getTemp());
+
+ irgree.setTemp(21);
+ EXPECT_EQ(21, irgree.getTemp());
+
+ irgree.setTemp(25);
+ EXPECT_EQ(25, irgree.getTemp());
+
+ irgree.setTemp(29);
+ EXPECT_EQ(29, irgree.getTemp());
+}
+
+TEST(TestGreeClass, OperatingMode) {
+ IRGreeAC irgree(0);
+ irgree.begin();
+
+ irgree.setTemp(17);
+ irgree.setMode(kGreeAuto); // Auto should lock the temp to 25C.
+ EXPECT_EQ(kGreeAuto, irgree.getMode());
+ EXPECT_EQ(25, irgree.getTemp());
+ irgree.setTemp(17);
+ EXPECT_EQ(25, irgree.getTemp());
+
+ irgree.setMode(kGreeCool);
+ EXPECT_EQ(kGreeCool, irgree.getMode());
+
+ irgree.setMode(kGreeHeat);
+ EXPECT_EQ(kGreeHeat, irgree.getMode());
+
+ ASSERT_NE(kGreeFanMax, 1);
+ irgree.setFan(kGreeFanMax);
+ irgree.setMode(kGreeDry); // Dry should lock the fan to speed 1.
+ EXPECT_EQ(kGreeDry, irgree.getMode());
+ EXPECT_EQ(1, irgree.getFan());
+ irgree.setFan(kGreeFanMax);
+ EXPECT_EQ(1, irgree.getFan());
+
+ irgree.setMode(kGreeFan);
+ EXPECT_EQ(kGreeFan, irgree.getMode());
+
+ irgree.setMode(kGreeHeat + 1);
+ EXPECT_EQ(kGreeAuto, irgree.getMode());
+
+ irgree.setMode(255);
+ EXPECT_EQ(kGreeAuto, irgree.getMode());
+}
+
+TEST(TestGreeClass, Light) {
+ IRGreeAC irgree(0);
+ irgree.begin();
+
+ irgree.setLight(true);
+ EXPECT_TRUE(irgree.getLight());
+
+ irgree.setLight(false);
+ EXPECT_FALSE(irgree.getLight());
+
+ irgree.setLight(true);
+ EXPECT_TRUE(irgree.getLight());
+}
+
+TEST(TestGreeClass, XFan) {
+ IRGreeAC irgree(0);
+ irgree.begin();
+
+ irgree.setXFan(true);
+ EXPECT_TRUE(irgree.getXFan());
+
+ irgree.setXFan(false);
+ EXPECT_FALSE(irgree.getXFan());
+
+ irgree.setXFan(true);
+ EXPECT_TRUE(irgree.getXFan());
+}
+
+TEST(TestGreeClass, Turbo) {
+ IRGreeAC irgree(0);
+ irgree.begin();
+
+ irgree.setTurbo(true);
+ EXPECT_TRUE(irgree.getTurbo());
+
+ irgree.setTurbo(false);
+ EXPECT_FALSE(irgree.getTurbo());
+
+ irgree.setTurbo(true);
+ EXPECT_TRUE(irgree.getTurbo());
+}
+
+TEST(TestGreeClass, Sleep) {
+ IRGreeAC irgree(0);
+ irgree.begin();
+
+ irgree.setSleep(true);
+ EXPECT_TRUE(irgree.getSleep());
+
+ irgree.setSleep(false);
+ EXPECT_FALSE(irgree.getSleep());
+
+ irgree.setSleep(true);
+ EXPECT_TRUE(irgree.getSleep());
+}
+
+TEST(TestGreeClass, FanSpeed) {
+ IRGreeAC irgree(0);
+ irgree.begin();
+
+ irgree.setFan(0);
+ EXPECT_EQ(0, irgree.getFan());
+
+ irgree.setFan(255);
+ EXPECT_EQ(kGreeFanMax, irgree.getFan());
+
+ irgree.setFan(kGreeFanMax);
+ EXPECT_EQ(kGreeFanMax, irgree.getFan());
+
+ irgree.setFan(kGreeFanMax + 1);
+ EXPECT_EQ(kGreeFanMax, irgree.getFan());
+
+ irgree.setFan(kGreeFanMax - 1);
+ EXPECT_EQ(kGreeFanMax - 1, irgree.getFan());
+
+ irgree.setFan(1);
+ EXPECT_EQ(1, irgree.getFan());
+
+ irgree.setFan(1);
+ EXPECT_EQ(1, irgree.getFan());
+
+ irgree.setFan(3);
+ EXPECT_EQ(3, irgree.getFan());
+}
+
+TEST(TestGreeClass, VerticalSwing) {
+ IRGreeAC irgree(0);
+ irgree.begin();
+ EXPECT_FALSE(irgree.getSwingVerticalAuto());
+ EXPECT_EQ(kGreeSwingLastPos, irgree.getSwingVerticalPosition());
+
+ irgree.setSwingVertical(true, kGreeSwingAuto);
+ EXPECT_TRUE(irgree.getSwingVerticalAuto());
+ EXPECT_EQ(kGreeSwingAuto, irgree.getSwingVerticalPosition());
+
+ irgree.setSwingVertical(false, kGreeSwingMiddle);
+ EXPECT_FALSE(irgree.getSwingVerticalAuto());
+ EXPECT_EQ(kGreeSwingMiddle, irgree.getSwingVerticalPosition());
+
+ irgree.setSwingVertical(true, kGreeSwingDownAuto);
+ EXPECT_TRUE(irgree.getSwingVerticalAuto());
+ EXPECT_EQ(kGreeSwingDownAuto, irgree.getSwingVerticalPosition());
+
+ // Out of bounds.
+ irgree.setSwingVertical(false, 255);
+ EXPECT_FALSE(irgree.getSwingVerticalAuto());
+ EXPECT_EQ(kGreeSwingLastPos, irgree.getSwingVerticalPosition());
+ irgree.setSwingVertical(false, kGreeSwingAuto);
+ EXPECT_FALSE(irgree.getSwingVerticalAuto());
+ EXPECT_EQ(kGreeSwingLastPos, irgree.getSwingVerticalPosition());
+
+ irgree.setSwingVertical(true, 255);
+ EXPECT_TRUE(irgree.getSwingVerticalAuto());
+ EXPECT_EQ(kGreeSwingAuto, irgree.getSwingVerticalPosition());
+ irgree.setSwingVertical(true, kGreeSwingDown);
+ EXPECT_TRUE(irgree.getSwingVerticalAuto());
+ EXPECT_EQ(kGreeSwingAuto, irgree.getSwingVerticalPosition());
+}
+
+TEST(TestGreeClass, SetAndGetRaw) {
+ IRGreeAC irgree(0);
+ uint8_t initialState[kGreeStateLength] = {0x00, 0x09, 0x20, 0x50,
+ 0x00, 0x20, 0x00, 0x50};
+ uint8_t expectedState[kGreeStateLength] = {0xA9, 0x05, 0xD0, 0x50,
+ 0x00, 0x20, 0x00, 0xA0};
+
+ EXPECT_STATE_EQ(initialState, irgree.getRaw(), kGreeBits);
+
+ // toggle the power state.
+ irgree.setPower(!irgree.getPower());
+ irgree.setMode(kGreeCool);
+ irgree.setTemp(21);
+ irgree.setFan(2);
+ irgree.setLight(false);
+ irgree.setTurbo(true);
+ irgree.setSleep(true);
+ irgree.setXFan(true);
+
+ EXPECT_EQ(kGreeCool, irgree.getMode());
+ EXPECT_EQ(21, irgree.getTemp());
+ EXPECT_EQ(2, irgree.getFan());
+ EXPECT_FALSE(irgree.getLight());
+ EXPECT_TRUE(irgree.getTurbo());
+ EXPECT_TRUE(irgree.getSleep());
+ EXPECT_TRUE(irgree.getXFan());
+
+ EXPECT_STATE_EQ(expectedState, irgree.getRaw(), kGreeBits);
+ irgree.setRaw(initialState);
+ EXPECT_STATE_EQ(initialState, irgree.getRaw(), kGreeBits);
+}
+
+TEST(TestGreeClass, HumanReadable) {
+ IRGreeAC irgree(0);
+
+ EXPECT_EQ(
+ "Power: Off, Mode: 0 (AUTO), Temp: 25C, Fan: 0 (AUTO), Turbo: Off, "
+ "XFan: Off, Light: On, Sleep: Off, Swing Vertical Mode: Manual, "
+ "Swing Vertical Pos: 0 (Last Pos)",
+ irgree.toString());
+ irgree.on();
+ irgree.setMode(kGreeCool);
+ irgree.setTemp(kGreeMinTemp);
+ irgree.setFan(kGreeFanMax);
+ irgree.setXFan(true);
+ irgree.setSleep(true);
+ irgree.setLight(false);
+ irgree.setTurbo(true);
+ irgree.setSwingVertical(true, kGreeSwingAuto);
+ EXPECT_EQ(
+ "Power: On, Mode: 1 (COOL), Temp: 16C, Fan: 3 (MAX), Turbo: On, "
+ "XFan: On, Light: Off, Sleep: On, Swing Vertical Mode: Auto, "
+ "Swing Vertical Pos: 1 (Auto)",
+ irgree.toString());
+}
+
+// Tests for decodeGree().
+
+// Decode a synthetic Gree message.
+TEST(TestDecodeGree, NormalSynthetic) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ uint8_t gree_code[kGreeStateLength] = {0x00, 0x09, 0x20, 0x50,
+ 0x00, 0x20, 0x00, 0x50};
+
+ irsend.reset();
+ irsend.sendGree(gree_code);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(GREE, irsend.capture.decode_type);
+ ASSERT_EQ(kGreeBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(gree_code, irsend.capture.state, kGreeBits);
+}
+
+// Decode a synthetic Gree message.
+TEST(TestDecodeGree, NormalRealExample) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ IRGreeAC irgree(4);
+ irsend.begin();
+
+ uint8_t gree_code[kGreeStateLength] = {0x19, 0x0A, 0x60, 0x50,
+ 0x02, 0x23, 0x00, 0xF0};
+
+ // Ref: https://github.com/markszabo/IRremoteESP8266/issues/386
+ uint16_t rawData[139] = {
+ 9008, 4496, 644, 1660, 676, 530, 648, 558, 672, 1636, 646, 1660,
+ 644, 556, 650, 584, 626, 560, 644, 580, 628, 1680, 624, 560,
+ 648, 1662, 644, 582, 648, 536, 674, 530, 646, 580, 628, 560,
+ 670, 532, 646, 562, 644, 556, 672, 536, 648, 1662, 646, 1660,
+ 652, 554, 644, 558, 672, 538, 644, 560, 668, 560, 648, 1638,
+ 668, 536, 644, 1660, 668, 532, 648, 560, 648, 1660, 674, 554,
+ 622, 19990, 646, 580, 624, 1660, 648, 556, 648, 558, 674, 556,
+ 622, 560, 644, 564, 668, 536, 646, 1662, 646, 1658, 672, 534,
+ 648, 558, 644, 562, 648, 1662, 644, 584, 622, 558, 648, 562,
+ 668, 534, 670, 536, 670, 532, 672, 536, 646, 560, 646, 558,
+ 648, 558, 670, 534, 650, 558, 646, 560, 646, 560, 668, 1638,
+ 646, 1662, 646, 1660, 646, 1660, 648}; // Issue #386
+
+ irsend.reset();
+ irsend.sendRaw(rawData, 139, 38000);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(GREE, irsend.capture.decode_type);
+ ASSERT_EQ(kGreeBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(gree_code, irsend.capture.state, kGreeBits);
+ irgree.setRaw(irsend.capture.state);
+ EXPECT_EQ(
+ "Power: On, Mode: 1 (COOL), Temp: 26C, Fan: 1, Turbo: Off, "
+ "XFan: Off, Light: On, Sleep: Off, Swing Vertical Mode: Manual, "
+ "Swing Vertical Pos: 2",
+ irgree.toString());
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Haier_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Haier_test.cpp
new file mode 100644
index 000000000000..11848e00a3ea
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Haier_test.cpp
@@ -0,0 +1,989 @@
+// Copyright 2018 David Conran
+
+#include "ir_Haier.h"
+#include "IRrecv.h"
+#include "IRrecv_test.h"
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests for sendHaierAC()
+
+// Test sending typical data only.
+TEST(TestSendHaierAC, SendDataOnly) {
+ IRsendTest irsend(0);
+ irsend.begin();
+ uint8_t haier_zero[kHaierACStateLength] = {0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00};
+
+ irsend.reset();
+ irsend.sendHaierAC(haier_zero);
+ EXPECT_EQ(
+ "m3000s3000m3000s4300"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s150000",
+ irsend.outputStr());
+
+ uint8_t haier_test[kHaierACStateLength] = {0xA5, 0x01, 0x20, 0x01, 0x00,
+ 0xC0, 0x20, 0x00, 0xA7};
+ irsend.reset();
+ irsend.sendHaierAC(haier_test);
+ EXPECT_EQ(
+ "m3000s3000m3000s4300"
+ "m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s650m520s1650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
+ "m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s1650m520s1650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s1650m520s1650"
+ "m520s150000",
+ irsend.outputStr());
+}
+
+// Test sending typical data with repeats.
+TEST(TestSendHaierAC, SendWithRepeats) {
+ IRsendTest irsend(0);
+ irsend.begin();
+
+ irsend.reset();
+ uint8_t haier_test[kHaierACStateLength] = {0xA5, 0x01, 0x20, 0x01, 0x00,
+ 0xC0, 0x20, 0x00, 0xA7};
+ irsend.reset();
+ irsend.sendHaierAC(haier_test, kHaierACStateLength, 2); // two repeats.
+ EXPECT_EQ(
+ "m3000s3000m3000s4300"
+ "m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s650m520s1650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
+ "m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s1650m520s1650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s1650m520s1650"
+ "m520s150000"
+ "m3000s3000m3000s4300"
+ "m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s650m520s1650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
+ "m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s1650m520s1650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s1650m520s1650"
+ "m520s150000"
+ "m3000s3000m3000s4300"
+ "m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s650m520s1650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
+ "m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s1650m520s1650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
+ "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
+ "m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s1650m520s1650"
+ "m520s150000",
+ irsend.outputStr());
+}
+
+// Tests for IRHaierAC class.
+
+TEST(TestHaierACClass, Command) {
+ IRHaierAC haier(0);
+ haier.begin();
+
+ haier.setCommand(kHaierAcCmdOff);
+ EXPECT_EQ(kHaierAcCmdOff, haier.getCommand());
+ haier.setCommand(kHaierAcCmdOn);
+ EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
+ haier.setCommand(kHaierAcCmdMode);
+ EXPECT_EQ(kHaierAcCmdMode, haier.getCommand());
+ haier.setCommand(kHaierAcCmdFan);
+ EXPECT_EQ(kHaierAcCmdFan, haier.getCommand());
+ haier.setCommand(kHaierAcCmdTempUp);
+ EXPECT_EQ(kHaierAcCmdTempUp, haier.getCommand());
+ haier.setCommand(kHaierAcCmdTempDown);
+ EXPECT_EQ(kHaierAcCmdTempDown, haier.getCommand());
+ haier.setCommand(kHaierAcCmdSleep);
+ EXPECT_EQ(kHaierAcCmdSleep, haier.getCommand());
+ haier.setCommand(kHaierAcCmdTimerSet);
+ EXPECT_EQ(kHaierAcCmdTimerSet, haier.getCommand());
+ haier.setCommand(kHaierAcCmdTimerCancel);
+ EXPECT_EQ(kHaierAcCmdTimerCancel, haier.getCommand());
+ haier.setCommand(kHaierAcCmdHealth);
+ EXPECT_EQ(kHaierAcCmdHealth, haier.getCommand());
+ haier.setCommand(kHaierAcCmdSwing);
+ EXPECT_EQ(kHaierAcCmdSwing, haier.getCommand());
+ haier.setCommand(kHaierAcCmdOn);
+ EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
+
+ // Test unexpected values.
+ haier.setCommand(0b00001110);
+ EXPECT_EQ(kHaierAcCmdOff, haier.getCommand());
+ haier.setCommand(0b00001111);
+ EXPECT_EQ(kHaierAcCmdOff, haier.getCommand());
+ haier.setCommand(0b00000100);
+ EXPECT_EQ(kHaierAcCmdOff, haier.getCommand());
+}
+
+TEST(TestHaierACClass, OperatingMode) {
+ IRHaierAC haier(0);
+ haier.begin();
+
+ haier.setMode(kHaierAcAuto);
+ EXPECT_EQ(kHaierAcAuto, haier.getMode());
+
+ haier.setMode(kHaierAcCool);
+ EXPECT_EQ(kHaierAcCool, haier.getMode());
+
+ haier.setMode(kHaierAcHeat);
+ EXPECT_EQ(kHaierAcHeat, haier.getMode());
+
+ haier.setMode(kHaierAcFan);
+ EXPECT_EQ(kHaierAcFan, haier.getMode());
+
+ haier.setMode(kHaierAcDry);
+ EXPECT_EQ(kHaierAcDry, haier.getMode());
+
+ haier.setMode(kHaierAcAuto - 1);
+ EXPECT_EQ(kHaierAcAuto, haier.getMode());
+
+ haier.setMode(kHaierAcCool);
+ EXPECT_EQ(kHaierAcCool, haier.getMode());
+
+ haier.setMode(kHaierAcFan + 1);
+ EXPECT_EQ(kHaierAcAuto, haier.getMode());
+
+ haier.setMode(255);
+ EXPECT_EQ(kHaierAcAuto, haier.getMode());
+}
+
+TEST(TestHaierACClass, Temperature) {
+ IRHaierAC haier(0);
+ haier.begin();
+
+ haier.setTemp(kHaierAcMinTemp);
+ EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
+
+ haier.setCommand(kHaierAcCmdOn);
+ haier.setTemp(kHaierAcMinTemp + 1);
+ EXPECT_EQ(kHaierAcMinTemp + 1, haier.getTemp());
+ EXPECT_EQ(kHaierAcCmdTempUp, haier.getCommand());
+
+ haier.setTemp(kHaierAcMaxTemp);
+ EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
+ EXPECT_EQ(kHaierAcCmdTempUp, haier.getCommand());
+
+ haier.setTemp(kHaierAcMinTemp - 1);
+ EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
+ EXPECT_EQ(kHaierAcCmdTempDown, haier.getCommand());
+
+ haier.setTemp(kHaierAcMaxTemp + 1);
+ EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
+ EXPECT_EQ(kHaierAcCmdTempUp, haier.getCommand());
+
+ haier.setTemp(23);
+ EXPECT_EQ(23, haier.getTemp());
+ EXPECT_EQ(kHaierAcCmdTempDown, haier.getCommand());
+ haier.setCommand(kHaierAcCmdOn);
+ haier.setTemp(23);
+ EXPECT_EQ(23, haier.getTemp());
+ EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
+
+ haier.setTemp(0);
+ EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
+ EXPECT_EQ(kHaierAcCmdTempDown, haier.getCommand());
+
+ haier.setTemp(255);
+ EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
+ EXPECT_EQ(kHaierAcCmdTempUp, haier.getCommand());
+}
+
+TEST(TestHaierACClass, FanSpeed) {
+ IRHaierAC haier(0);
+ haier.begin();
+ haier.setFan(kHaierAcFanLow);
+ haier.setCommand(kHaierAcCmdOn);
+
+ haier.setFan(kHaierAcFanAuto);
+ EXPECT_EQ(kHaierAcFanAuto, haier.getFan());
+ EXPECT_EQ(kHaierAcCmdFan, haier.getCommand());
+
+ haier.setFan(kHaierAcFanLow);
+ EXPECT_EQ(kHaierAcFanLow, haier.getFan());
+ haier.setFan(kHaierAcFanMed);
+ EXPECT_EQ(kHaierAcFanMed, haier.getFan());
+ haier.setFan(kHaierAcFanHigh);
+ EXPECT_EQ(kHaierAcFanHigh, haier.getFan());
+
+ haier.setCommand(kHaierAcCmdOn);
+ haier.setFan(kHaierAcFanHigh);
+ EXPECT_EQ(kHaierAcFanHigh, haier.getFan());
+ EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
+}
+
+TEST(TestHaierACClass, Swing) {
+ IRHaierAC haier(0);
+ haier.begin();
+ haier.setFan(kHaierAcFanLow);
+ haier.setCommand(kHaierAcCmdOn);
+
+ haier.setSwing(kHaierAcSwingOff);
+ EXPECT_EQ(kHaierAcSwingOff, haier.getSwing());
+
+ haier.setSwing(kHaierAcSwingUp);
+ EXPECT_EQ(kHaierAcSwingUp, haier.getSwing());
+ EXPECT_EQ(kHaierAcCmdSwing, haier.getCommand());
+
+ haier.setSwing(kHaierAcSwingDown);
+ EXPECT_EQ(kHaierAcSwingDown, haier.getSwing());
+ EXPECT_EQ(kHaierAcCmdSwing, haier.getCommand());
+
+ haier.setSwing(kHaierAcSwingChg);
+ EXPECT_EQ(kHaierAcSwingChg, haier.getSwing());
+ EXPECT_EQ(kHaierAcCmdSwing, haier.getCommand());
+}
+
+TEST(TestHaierACClass, CurrentTime) {
+ IRHaierAC haier(0);
+ haier.begin();
+ EXPECT_EQ(0, haier.getCurrTime());
+
+ haier.setCurrTime(1);
+ EXPECT_EQ(1, haier.getCurrTime());
+
+ haier.setCurrTime(60);
+ EXPECT_EQ(60, haier.getCurrTime());
+
+ haier.setCurrTime(61);
+ EXPECT_EQ(61, haier.getCurrTime());
+
+ haier.setCurrTime(18 * 60 + 34); // 18:34
+ EXPECT_EQ(1114, haier.getCurrTime());
+
+ haier.setCurrTime(23 * 60 + 59); // 23:59
+ EXPECT_EQ(kHaierAcMaxTime, haier.getCurrTime()); // 23:59
+
+ haier.setCurrTime(23 * 60 + 59 + 1); // 24:00
+ EXPECT_EQ(kHaierAcMaxTime, haier.getCurrTime()); // 23:59
+
+ haier.setCurrTime(UINT16_MAX);
+ EXPECT_EQ(kHaierAcMaxTime, haier.getCurrTime()); // 23:59
+}
+
+TEST(TestHaierACClass, Timers) {
+ IRHaierAC haier(0);
+ haier.begin();
+
+ haier.setCommand(kHaierAcCmdOn);
+
+ // Off by default.
+ EXPECT_GT(0, haier.getOnTimer());
+ EXPECT_GT(0, haier.getOffTimer());
+ EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
+
+ // On Timer.
+ haier.setOnTimer(6 * 60); // 6am
+ EXPECT_EQ(6 * 60, haier.getOnTimer()); // 6am
+ EXPECT_GT(0, haier.getOffTimer());
+ EXPECT_EQ(kHaierAcCmdTimerSet, haier.getCommand());
+
+ haier.setCommand(kHaierAcCmdOn);
+ EXPECT_EQ(6 * 60, haier.getOnTimer()); // 6am
+ EXPECT_GT(0, haier.getOffTimer());
+ EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
+
+ haier.cancelTimers();
+ EXPECT_GT(0, haier.getOnTimer());
+ EXPECT_GT(0, haier.getOffTimer());
+ EXPECT_EQ(kHaierAcCmdTimerCancel, haier.getCommand());
+
+ // Off Timer.
+ haier.setOffTimer(18 * 60 + 30); // 6:30pm
+ EXPECT_GT(0, haier.getOnTimer());
+ EXPECT_EQ(18 * 60 + 30, haier.getOffTimer()); // 6:30pm
+ EXPECT_EQ(kHaierAcCmdTimerSet, haier.getCommand());
+
+ haier.setCommand(kHaierAcCmdOn);
+ EXPECT_GT(0, haier.getOnTimer());
+ EXPECT_EQ(18 * 60 + 30, haier.getOffTimer()); // 6:30pm
+ EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
+
+ haier.cancelTimers();
+ EXPECT_GT(0, haier.getOnTimer());
+ EXPECT_GT(0, haier.getOffTimer());
+ EXPECT_EQ(kHaierAcCmdTimerCancel, haier.getCommand());
+
+ // Both Timers.
+ haier.setOnTimer(6 * 60); // 6am
+ EXPECT_EQ(kHaierAcCmdTimerSet, haier.getCommand());
+ haier.setOffTimer(18 * 60 + 30); // 6:30pm
+ EXPECT_EQ(kHaierAcCmdTimerSet, haier.getCommand());
+ EXPECT_EQ(6 * 60, haier.getOnTimer()); // 6am
+ EXPECT_EQ(18 * 60 + 30, haier.getOffTimer()); // 6:30pm
+
+ haier.cancelTimers();
+ EXPECT_GT(0, haier.getOnTimer());
+ EXPECT_GT(0, haier.getOffTimer());
+ EXPECT_EQ(kHaierAcCmdTimerCancel, haier.getCommand());
+}
+
+TEST(TestHaierACClass, TimeToString) {
+ EXPECT_EQ("00:00", IRHaierAC::timeToString(0));
+ EXPECT_EQ("00:01", IRHaierAC::timeToString(1));
+ EXPECT_EQ("00:10", IRHaierAC::timeToString(10));
+ EXPECT_EQ("00:59", IRHaierAC::timeToString(59));
+
+ EXPECT_EQ("01:00", IRHaierAC::timeToString(60));
+ EXPECT_EQ("01:01", IRHaierAC::timeToString(61));
+ EXPECT_EQ("01:59", IRHaierAC::timeToString(60 + 59));
+ EXPECT_EQ("18:59", IRHaierAC::timeToString(18 * 60 + 59));
+ EXPECT_EQ("23:59", IRHaierAC::timeToString(23 * 60 + 59));
+}
+
+TEST(TestHaierACClass, MessageConstuction) {
+ IRHaierAC haier(0);
+
+ EXPECT_EQ(
+ "Command: 1 (On), Mode: 0 (AUTO), Temp: 25C, Fan: 0 (AUTO), "
+ "Swing: 0 (Off), Sleep: Off, Health: Off, "
+ "Current Time: 00:00, On Timer: Off, Off Timer: Off",
+ haier.toString());
+ haier.setMode(kHaierAcCool);
+ haier.setTemp(21);
+ haier.setFan(kHaierAcFanHigh);
+ EXPECT_EQ(
+ "Command: 3 (Fan), Mode: 1 (COOL), Temp: 21C, Fan: 3 (MAX), "
+ "Swing: 0 (Off), Sleep: Off, Health: Off, "
+ "Current Time: 00:00, On Timer: Off, Off Timer: Off",
+ haier.toString());
+ haier.setSwing(kHaierAcSwingChg);
+ haier.setHealth(true);
+ haier.setSleep(true);
+ haier.setCurrTime(615); // 10:15am
+ EXPECT_EQ(
+ "Command: 8 (Sleep), Mode: 3 (HEAT), Temp: 21C, Fan: 3 (MAX), "
+ "Swing: 3 (Chg), Sleep: On, Health: On, "
+ "Current Time: 10:15, On Timer: Off, Off Timer: Off",
+ haier.toString());
+ haier.setOnTimer(800); // 1:20pm
+ haier.setOffTimer(1125); // 6:45pm
+ haier.setCommand(kHaierAcCmdOn);
+
+ EXPECT_EQ(
+ "Command: 1 (On), Mode: 2 (DRY), Temp: 21C, Fan: 2, "
+ "Swing: 3 (Chg), Sleep: On, Health: On, "
+ "Current Time: 10:15, On Timer: 13:20, Off Timer: 18:45",
+ haier.toString());
+
+ // Now change a few already set things.
+ haier.setMode(kHaierAcHeat);
+ EXPECT_EQ(
+ "Command: 2 (Mode), Mode: 3 (HEAT), Temp: 21C, Fan: 2, "
+ "Swing: 3 (Chg), Sleep: On, Health: On, "
+ "Current Time: 10:15, On Timer: 13:52, Off Timer: 18:45",
+ haier.toString());
+
+ haier.setTemp(25);
+ EXPECT_EQ(
+ "Command: 6 (Temp Up), Mode: 3 (HEAT), Temp: 25C, Fan: 2, "
+ "Swing: 3 (Chg), Sleep: On, Health: On, "
+ "Current Time: 10:15, On Timer: 13:52, Off Timer: 18:45",
+ haier.toString());
+
+ uint8_t expectedState[kHaierACStateLength] = {0xA5, 0x96, 0xEA, 0xCF, 0x32,
+ 0x2D, 0x0D, 0x74, 0xD4};
+ EXPECT_STATE_EQ(expectedState, haier.getRaw(), kHaierACBits);
+
+ // Check that the checksum is valid.
+ EXPECT_TRUE(IRHaierAC::validChecksum(haier.getRaw()));
+
+ // Now load up some random data.
+ uint8_t randomState[kHaierACStateLength] = {0x52, 0x49, 0x50, 0x20, 0x54,
+ 0x61, 0x6C, 0x69, 0x61};
+ EXPECT_FALSE(IRHaierAC::validChecksum(randomState));
+ haier.setRaw(randomState);
+ EXPECT_EQ(
+ "Command: 9 (Timer Set), Mode: 3 (HEAT), Temp: 20C, Fan: 2, "
+ "Swing: 1 (Up), Sleep: On, Health: Off, "
+ "Current Time: 16:32, On Timer: Off, Off Timer: Off",
+ haier.toString());
+ // getRaw() should correct the checksum.
+ EXPECT_TRUE(IRHaierAC::validChecksum(haier.getRaw()));
+}
+
+// Tests for the IRHaierACYRW02 class.
+
+TEST(TestHaierACYRW02Class, Button) {
+ IRHaierACYRW02 haier(0);
+ haier.begin();
+
+ haier.setButton(kHaierAcYrw02ButtonPower);
+ EXPECT_EQ(kHaierAcYrw02ButtonPower, haier.getButton());
+ haier.setButton(kHaierAcYrw02ButtonMode);
+ EXPECT_EQ(kHaierAcYrw02ButtonMode, haier.getButton());
+ haier.setButton(kHaierAcYrw02ButtonSleep);
+ EXPECT_EQ(kHaierAcYrw02ButtonSleep, haier.getButton());
+ haier.setButton(kHaierAcYrw02ButtonFan);
+
+ // Test unexpected values.
+ haier.setButton(0xFF);
+ EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
+ haier.setButton(0x10);
+ EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
+}
+
+TEST(TestHaierACYRW02Class, OperatingMode) {
+ IRHaierACYRW02 haier(0);
+ haier.begin();
+
+ haier.setButton(kHaierAcYrw02ButtonPower);
+ haier.setMode(kHaierAcYrw02Auto);
+ EXPECT_EQ(kHaierAcYrw02Auto, haier.getMode());
+ EXPECT_EQ(kHaierAcYrw02ButtonMode, haier.getButton());
+
+ haier.setMode(kHaierAcYrw02Cool);
+ EXPECT_EQ(kHaierAcYrw02Cool, haier.getMode());
+
+ haier.setMode(kHaierAcYrw02Heat);
+ EXPECT_EQ(kHaierAcYrw02Heat, haier.getMode());
+
+ haier.setMode(kHaierAcYrw02Fan);
+ EXPECT_EQ(kHaierAcYrw02Fan, haier.getMode());
+
+ haier.setMode(kHaierAcYrw02Dry);
+ EXPECT_EQ(kHaierAcYrw02Dry, haier.getMode());
+
+ haier.setMode(kHaierAcYrw02Auto - 1);
+ EXPECT_EQ(kHaierAcYrw02Auto, haier.getMode());
+
+ haier.setMode(kHaierAcYrw02Cool);
+ EXPECT_EQ(kHaierAcYrw02Cool, haier.getMode());
+
+ haier.setMode(kHaierAcYrw02Fan + 1);
+ EXPECT_EQ(kHaierAcYrw02Auto, haier.getMode());
+
+ haier.setMode(255);
+ EXPECT_EQ(kHaierAcYrw02Auto, haier.getMode());
+}
+
+TEST(TestHaierACYRW02Class, Temperature) {
+ IRHaierACYRW02 haier(0);
+ haier.begin();
+
+ haier.setTemp(kHaierAcMinTemp);
+ EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
+
+ haier.setButton(kHaierAcYrw02ButtonPower);
+ haier.setTemp(kHaierAcMinTemp + 1);
+ EXPECT_EQ(kHaierAcMinTemp + 1, haier.getTemp());
+ EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
+
+ haier.setTemp(kHaierAcMaxTemp);
+ EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
+ EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
+
+ haier.setTemp(kHaierAcMinTemp - 1);
+ EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
+ EXPECT_EQ(kHaierAcYrw02ButtonTempDown, haier.getButton());
+
+ haier.setTemp(kHaierAcMaxTemp + 1);
+ EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
+ EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
+
+ haier.setTemp(23);
+ EXPECT_EQ(23, haier.getTemp());
+ EXPECT_EQ(kHaierAcYrw02ButtonTempDown, haier.getButton());
+ haier.setButton(kHaierAcYrw02ButtonPower);
+ haier.setTemp(23);
+ EXPECT_EQ(23, haier.getTemp());
+ EXPECT_EQ(kHaierAcYrw02ButtonPower, haier.getButton());
+
+ haier.setTemp(0);
+ EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
+ EXPECT_EQ(kHaierAcYrw02ButtonTempDown, haier.getButton());
+
+ haier.setTemp(255);
+ EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
+ EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
+}
+
+TEST(TestHaierACYRW02Class, HealthMode) {
+ IRHaierACYRW02 haier(0);
+ haier.begin();
+
+ haier.setHealth(true);
+ EXPECT_TRUE(haier.getHealth());
+ EXPECT_EQ(kHaierAcYrw02ButtonHealth, haier.getButton());
+
+ haier.setButton(kHaierAcYrw02ButtonTempUp);
+ haier.setHealth(false);
+ EXPECT_FALSE(haier.getHealth());
+ EXPECT_EQ(kHaierAcYrw02ButtonHealth, haier.getButton());
+
+ haier.setHealth(true);
+ EXPECT_TRUE(haier.getHealth());
+ EXPECT_EQ(kHaierAcYrw02ButtonHealth, haier.getButton());
+}
+
+TEST(TestHaierACYRW02Class, Power) {
+ IRHaierACYRW02 haier(0);
+ haier.begin();
+
+ haier.setPower(true);
+ EXPECT_TRUE(haier.getPower());
+ EXPECT_EQ(kHaierAcYrw02ButtonPower, haier.getButton());
+
+ haier.setButton(kHaierAcYrw02ButtonTempUp);
+ haier.setPower(false);
+ EXPECT_FALSE(haier.getPower());
+ EXPECT_EQ(kHaierAcYrw02ButtonPower, haier.getButton());
+
+ haier.setPower(true);
+ EXPECT_TRUE(haier.getPower());
+ EXPECT_EQ(kHaierAcYrw02ButtonPower, haier.getButton());
+
+ haier.off();
+ EXPECT_FALSE(haier.getPower());
+ haier.on();
+ EXPECT_TRUE(haier.getPower());
+}
+
+TEST(TestHaierACYRW02Class, SleepMode) {
+ IRHaierACYRW02 haier(0);
+ haier.begin();
+
+ haier.setSleep(true);
+ EXPECT_TRUE(haier.getSleep());
+ EXPECT_EQ(kHaierAcYrw02ButtonSleep, haier.getButton());
+
+ haier.setButton(kHaierAcYrw02ButtonTempUp);
+ haier.setSleep(false);
+ EXPECT_FALSE(haier.getSleep());
+ EXPECT_EQ(kHaierAcYrw02ButtonSleep, haier.getButton());
+
+ haier.setSleep(true);
+ EXPECT_TRUE(haier.getSleep());
+ EXPECT_EQ(kHaierAcYrw02ButtonSleep, haier.getButton());
+}
+
+TEST(TestHaierACYRW02Class, TurboMode) {
+ IRHaierACYRW02 haier(0);
+ haier.begin();
+
+ haier.setTurbo(kHaierAcYrw02TurboOff);
+ EXPECT_EQ(kHaierAcYrw02TurboOff, haier.getTurbo());
+ EXPECT_EQ(kHaierAcYrw02ButtonTurbo, haier.getButton());
+
+ haier.setButton(kHaierAcYrw02ButtonTempUp);
+
+ haier.setTurbo(kHaierAcYrw02TurboLow);
+ EXPECT_EQ(kHaierAcYrw02TurboLow, haier.getTurbo());
+ EXPECT_EQ(kHaierAcYrw02ButtonTurbo, haier.getButton());
+
+ haier.setTurbo(kHaierAcYrw02TurboHigh);
+ EXPECT_EQ(kHaierAcYrw02TurboHigh, haier.getTurbo());
+ EXPECT_EQ(kHaierAcYrw02ButtonTurbo, haier.getButton());
+
+ haier.setTurbo(kHaierAcYrw02TurboOff);
+ EXPECT_EQ(kHaierAcYrw02TurboOff, haier.getTurbo());
+ EXPECT_EQ(kHaierAcYrw02ButtonTurbo, haier.getButton());
+}
+
+TEST(TestHaierACYRW02Class, Fan) {
+ IRHaierACYRW02 haier(0);
+ haier.begin();
+
+ haier.setFan(kHaierAcYrw02FanAuto);
+ EXPECT_EQ(kHaierAcYrw02FanAuto, haier.getFan());
+ EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
+
+ haier.setButton(kHaierAcYrw02ButtonTempUp);
+
+ haier.setFan(kHaierAcYrw02FanLow);
+ EXPECT_EQ(kHaierAcYrw02FanLow, haier.getFan());
+ EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
+
+ haier.setFan(kHaierAcYrw02FanHigh);
+ EXPECT_EQ(kHaierAcYrw02FanHigh, haier.getFan());
+ EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
+
+ haier.setFan(kHaierAcYrw02FanMed);
+ EXPECT_EQ(kHaierAcYrw02FanMed, haier.getFan());
+ EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
+
+ // Test unexpected values.
+ haier.setButton(kHaierAcYrw02ButtonTempUp);
+ haier.setFan(0x00);
+ EXPECT_EQ(kHaierAcYrw02FanMed, haier.getFan());
+ EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
+}
+
+TEST(TestHaierACYRW02Class, Swing) {
+ IRHaierACYRW02 haier(0);
+ haier.begin();
+
+ haier.setSwing(kHaierAcYrw02SwingOff);
+ EXPECT_EQ(kHaierAcYrw02SwingOff, haier.getSwing());
+ EXPECT_EQ(kHaierAcYrw02ButtonSwing, haier.getButton());
+
+ haier.setButton(kHaierAcYrw02ButtonTempUp);
+
+ haier.setSwing(kHaierAcYrw02SwingAuto);
+ EXPECT_EQ(kHaierAcYrw02SwingAuto, haier.getSwing());
+ EXPECT_EQ(kHaierAcYrw02ButtonSwing, haier.getButton());
+
+ haier.setSwing(kHaierAcYrw02SwingTop);
+ EXPECT_EQ(kHaierAcYrw02SwingTop, haier.getSwing());
+ EXPECT_EQ(kHaierAcYrw02ButtonSwing, haier.getButton());
+
+ haier.setSwing(kHaierAcYrw02SwingDown);
+ EXPECT_EQ(kHaierAcYrw02SwingDown, haier.getSwing());
+ EXPECT_EQ(kHaierAcYrw02ButtonSwing, haier.getButton());
+
+ // Test unexpected values.
+ haier.setButton(kHaierAcYrw02ButtonTempUp);
+ haier.setSwing(0xFF);
+ EXPECT_EQ(kHaierAcYrw02SwingDown, haier.getSwing());
+ EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
+
+ // Test the mode-dependant positions.
+ haier.setMode(kHaierAcYrw02Auto);
+ haier.setSwing(kHaierAcYrw02SwingMiddle);
+ EXPECT_EQ(kHaierAcYrw02SwingMiddle, haier.getSwing());
+ EXPECT_EQ(kHaierAcYrw02ButtonSwing, haier.getButton());
+ haier.setMode(kHaierAcYrw02Heat);
+ haier.setSwing(kHaierAcYrw02SwingMiddle);
+ EXPECT_EQ(kHaierAcYrw02SwingBottom, haier.getSwing());
+ haier.setSwing(kHaierAcYrw02SwingAuto);
+ EXPECT_EQ(kHaierAcYrw02SwingAuto, haier.getSwing());
+ haier.setSwing(kHaierAcYrw02SwingBottom);
+ EXPECT_EQ(kHaierAcYrw02SwingBottom, haier.getSwing());
+ haier.setMode(kHaierAcYrw02Cool);
+ haier.setSwing(kHaierAcYrw02SwingBottom);
+ EXPECT_EQ(kHaierAcYrw02SwingMiddle, haier.getSwing());
+}
+
+TEST(TestHaierACYRW02Class, MessageConstuction) {
+ IRHaierACYRW02 haier(0);
+
+ EXPECT_EQ(
+ "Power: On, Button: 5 (Power), Mode: 0 (Auto), Temp: 25C,"
+ " Fan: 10 (Auto), Turbo: 0 (Off), Swing: 0 (Off), Sleep: Off,"
+ " Health: On",
+ haier.toString());
+ haier.setMode(kHaierAcYrw02Cool);
+ haier.setTemp(21);
+ haier.setFan(kHaierAcYrw02FanHigh);
+ EXPECT_EQ(
+ "Power: On, Button: 4 (Fan), Mode: 2 (Cool), Temp: 21C,"
+ " Fan: 2 (High), Turbo: 0 (Off), Swing: 0 (Off), Sleep: Off,"
+ " Health: On",
+ haier.toString());
+
+ haier.setSwing(kHaierAcYrw02SwingMiddle);
+ haier.setHealth(false);
+ haier.setSleep(true);
+ haier.setTurbo(kHaierAcYrw02TurboHigh);
+ EXPECT_EQ(
+ "Power: On, Button: 8 (Turbo), Mode: 2 (Cool), Temp: 21C,"
+ " Fan: 2 (High), Turbo: 1 (High), Swing: 2 (Middle),"
+ " Sleep: On, Health: Off",
+ haier.toString());
+}
+
+// Decode "real" state messages.
+TEST(TestHaierACYRW02Class, RealStates) {
+ uint8_t expectedState1[kHaierACYRW02StateLength] = {
+ 0xA6, 0xE1, 0x00, 0x00, 0x40, 0x20, 0x00,
+ 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0x6E};
+
+ IRHaierACYRW02 haier(0);
+ haier.setRaw(expectedState1);
+ EXPECT_EQ(
+ "Power: On, Button: 7 (Health), Mode: 8 (Heat), Temp: 30C,"
+ " Fan: 2 (High), Turbo: 0 (Off), Swing: 1 (Top), Sleep: Off,"
+ " Health: Off",
+ haier.toString());
+
+ uint8_t expectedState2[kHaierACYRW02StateLength] = {
+ 0xA6, 0xE0, 0x00, 0x00, 0x00, 0x20, 0x00,
+ 0x80, 0x00, 0x00, 0x00, 0x00, 0x05, 0x75};
+ haier.setRaw(expectedState2);
+ EXPECT_EQ(
+ "Power: Off, Button: 5 (Power), Mode: 8 (Heat), Temp: 30C,"
+ " Fan: 2 (High), Turbo: 0 (Off), Swing: 0 (Off), Sleep: Off,"
+ " Health: Off",
+ haier.toString());
+
+ uint8_t expectedState3[kHaierACYRW02StateLength] = {
+ 0xA6, 0x02, 0x00, 0x02, 0x40, 0x20, 0x00,
+ 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2B};
+ haier.setRaw(expectedState3);
+ EXPECT_EQ(
+ "Power: On, Button: 1 (Temp Down), Mode: 2 (Cool), Temp: 16C,"
+ " Fan: 2 (High), Turbo: 0 (Off), Swing: 2 (Middle), Sleep: Off,"
+ " Health: On",
+ haier.toString());
+
+ // cool 25, health, fan auto, swing auto, sleep on
+ uint8_t expectedState4[kHaierACYRW02StateLength] = {
+ 0xA6, 0x9C, 0x00, 0x02, 0x40, 0xA8, 0x00,
+ 0x20, 0x80, 0x00, 0x00, 0x00, 0x0B, 0xD7};
+ haier.setRaw(expectedState4);
+ EXPECT_EQ(
+ "Power: On, Button: 11 (Sleep), Mode: 2 (Cool), Temp: 25C,"
+ " Fan: 10 (Auto), Turbo: 0 (Off), Swing: 12 (Auto), Sleep: On,"
+ " Health: On",
+ haier.toString());
+
+ // cool 25, health, fan 3, swing auto, sleep on
+ uint8_t expectedState5[kHaierACYRW02StateLength] = {
+ 0xA6, 0x9C, 0x00, 0x02, 0x40, 0x27, 0x36,
+ 0x20, 0x80, 0x00, 0x00, 0x00, 0x04, 0x85};
+ haier.setRaw(expectedState5);
+ EXPECT_EQ(
+ "Power: On, Button: 4 (Fan), Mode: 2 (Cool), Temp: 25C,"
+ " Fan: 2 (High), Turbo: 0 (Off), Swing: 12 (Auto), Sleep: On,"
+ " Health: On",
+ haier.toString());
+}
+
+// Tests for decodeHaierAC().
+
+// Decode normal "synthetic" messages.
+TEST(TestDecodeHaierAC, NormalDecodeWithStrict) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ uint8_t expectedState[kHaierACStateLength] = {0xA5, 0x01, 0x20, 0x01, 0x00,
+ 0xC0, 0x20, 0x00, 0xA7};
+
+ // With the specific decoder.
+ irsend.reset();
+ irsend.sendHaierAC(expectedState);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeHaierAC(&irsend.capture, kHaierACBits, true));
+ EXPECT_EQ(HAIER_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kHaierACBits, irsend.capture.bits);
+ EXPECT_FALSE(irsend.capture.repeat);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+
+ // With the all the decoders.
+ irsend.reset();
+ irsend.sendHaierAC(expectedState);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(HAIER_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kHaierACBits, irsend.capture.bits);
+ EXPECT_FALSE(irsend.capture.repeat);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+}
+
+// Decode a "real" example message.
+TEST(TestDecodeHaierAC, RealExample1) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ // Data from Issue #404 captured by kuzin2006
+ uint16_t rawData[149] = {
+ 3030, 3044, 3030, 4304, 576, 1694, 550, 582, 552, 1704, 552, 714, 550,
+ 582, 550, 1706, 552, 582, 550, 1836, 552, 582, 578, 568, 550, 582,
+ 550, 714, 550, 582, 550, 582, 552, 582, 550, 1836, 552, 582, 552,
+ 580, 580, 1692, 550, 712, 552, 582, 550, 582, 552, 580, 550, 714,
+ 552, 582, 550, 582, 552, 582, 578, 698, 552, 580, 552, 582, 552,
+ 582, 552, 1836, 552, 580, 552, 582, 552, 582, 550, 714, 578, 568,
+ 550, 582, 550, 582, 552, 714, 550, 1706, 550, 1706, 550, 582, 550,
+ 714, 552, 582, 580, 566, 552, 582, 550, 714, 552, 580, 552, 580,
+ 552, 1706, 550, 714, 550, 582, 552, 582, 578, 568, 552, 712, 552,
+ 582, 550, 582, 550, 582, 550, 712, 552, 582, 550, 582, 552, 582,
+ 578, 722, 552, 1704, 550, 582, 550, 1706, 550, 736, 550, 582, 550,
+ 1706, 550, 1704, 552, 1704, 578};
+ uint8_t expectedState[kHaierACStateLength] = {0xA5, 0x01, 0x20, 0x01, 0x00,
+ 0xC0, 0x20, 0x00, 0xA7};
+
+ irsend.sendRaw(rawData, 149, 38000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(HAIER_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kHaierACBits, irsend.capture.bits);
+ EXPECT_FALSE(irsend.capture.repeat);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+
+ IRHaierAC haier(0);
+ haier.setRaw(irsend.capture.state);
+ EXPECT_EQ(
+ "Command: 1 (On), Mode: 0 (AUTO), Temp: 16C, Fan: 0 (AUTO), "
+ "Swing: 0 (Off), Sleep: Off, Health: Off, "
+ "Current Time: 00:01, On Timer: Off, Off Timer: Off",
+ haier.toString());
+}
+
+// Decode a "real" example message.
+TEST(TestDecodeHaierAC, RealExample2) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ // Data from Issue #404 captured by kuzin2006
+ uint16_t rawData[149] = {
+ 3028, 3046, 3028, 4304, 576, 1694, 552, 582, 550, 1704, 552, 714,
+ 550, 582, 552, 1704, 550, 582, 550, 1836, 552, 582, 578, 1690,
+ 552, 1704, 552, 712, 550, 582, 550, 1706, 550, 1706, 552, 712,
+ 550, 582, 552, 582, 578, 1690, 552, 714, 552, 580, 552, 582,
+ 552, 582, 550, 712, 552, 582, 550, 582, 550, 582, 578, 698,
+ 552, 582, 550, 584, 550, 582, 552, 1836, 550, 582, 550, 582,
+ 550, 582, 550, 712, 578, 568, 550, 582, 550, 582, 550, 714,
+ 552, 1706, 550, 1706, 552, 580, 550, 714, 550, 582, 580, 568,
+ 550, 582, 550, 714, 550, 582, 550, 582, 550, 1706, 552, 712,
+ 550, 582, 550, 582, 580, 568, 552, 712, 550, 584, 550, 582,
+ 550, 584, 550, 712, 550, 582, 550, 582, 550, 582, 578, 722,
+ 550, 582, 552, 580, 552, 582, 550, 738, 550, 1706, 550, 1704,
+ 552, 582, 550, 582, 578};
+ uint8_t expectedState[kHaierACStateLength] = {0xA5, 0x66, 0x20, 0x01, 0x00,
+ 0xC0, 0x20, 0x00, 0x0C};
+
+ irsend.sendRaw(rawData, 149, 38000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(HAIER_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kHaierACBits, irsend.capture.bits);
+ EXPECT_FALSE(irsend.capture.repeat);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+
+ IRHaierAC haier(0);
+ haier.setRaw(irsend.capture.state);
+ EXPECT_EQ(
+ "Command: 6 (Temp Up), Mode: 0 (AUTO), Temp: 22C, Fan: 0 (AUTO), "
+ "Swing: 0 (Off), Sleep: Off, Health: Off, "
+ "Current Time: 00:01, On Timer: Off, Off Timer: Off",
+ haier.toString());
+}
+
+// Decode a "real" example message.
+TEST(TestDecodeHaierAC, RealExample3) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ // Data from Issue #404 captured by kuzin2006
+ uint16_t rawData[149] = {
+ 3030, 3044, 3030, 4302, 578, 1692, 550, 582, 550, 1706, 550, 714,
+ 550, 582, 552, 1706, 550, 582, 550, 1836, 552, 1706, 578, 1690,
+ 552, 1704, 552, 714, 550, 1706, 552, 1706, 550, 582, 550, 714,
+ 552, 582, 550, 582, 578, 1690, 550, 714, 552, 582, 552, 582,
+ 550, 582, 550, 714, 550, 584, 550, 582, 550, 582, 578, 700,
+ 552, 1706, 550, 582, 550, 582, 552, 1836, 550, 582, 550, 582,
+ 552, 1706, 550, 714, 578, 568, 552, 582, 552, 582, 550, 714,
+ 550, 1706, 550, 1706, 550, 582, 552, 712, 552, 582, 580, 568,
+ 550, 582, 550, 714, 550, 582, 550, 582, 550, 1706, 550, 714,
+ 550, 582, 550, 582, 578, 568, 552, 712, 552, 582, 550, 582,
+ 550, 582, 550, 712, 550, 584, 550, 582, 552, 582, 578, 722,
+ 552, 1704, 550, 582, 550, 1706, 550, 1862, 550, 1706, 550, 582,
+ 550, 1704, 552, 582, 578};
+ uint8_t expectedState[kHaierACStateLength] = {0xA5, 0xEC, 0x20, 0x09, 0x20,
+ 0xC0, 0x20, 0x00, 0xBA};
+
+ irsend.sendRaw(rawData, 149, 38000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(HAIER_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kHaierACBits, irsend.capture.bits);
+ EXPECT_FALSE(irsend.capture.repeat);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+
+ IRHaierAC haier(0);
+ haier.setRaw(irsend.capture.state);
+ EXPECT_EQ(
+ "Command: 12 (Health), Mode: 0 (AUTO), Temp: 30C, Fan: 0 (AUTO), "
+ "Swing: 0 (Off), Sleep: Off, Health: On, "
+ "Current Time: 00:09, On Timer: Off, Off Timer: Off",
+ haier.toString());
+}
+
+// Decode normal "synthetic" messages.
+TEST(TestDecodeHaierAC_YRW02, NormalDecode) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ uint8_t expectedState[kHaierACYRW02StateLength] = {
+ 0xA6, 0x12, 0x00, 0x02, 0x40, 0x20, 0x00,
+ 0x20, 0x00, 0x00, 0x00, 0x00, 0x05, 0x3F};
+
+ irsend.reset();
+ irsend.sendHaierACYRW02(expectedState);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(HAIER_AC_YRW02, irsend.capture.decode_type);
+ EXPECT_EQ(kHaierACYRW02Bits, irsend.capture.bits);
+ EXPECT_FALSE(irsend.capture.repeat);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+}
+
+// Decode a "real" example message.
+TEST(TestDecodeHaierAC_YRW02, RealExample) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ // Data from Issue #485 captured by non7top
+ uint16_t rawData[229] = {
+ 2998, 3086, 2998, 4460, 568, 1640, 596, 492, 514, 1690, 590, 496,
+ 566, 532, 592, 1596, 570, 1618, 518, 584, 590, 538, 524, 536,
+ 568, 532, 590, 1596, 516, 612, 568, 538, 522, 1638, 586, 500,
+ 512, 614, 568, 538, 520, 538, 586, 538, 566, 540, 520, 538,
+ 586, 538, 522, 538, 588, 538, 568, 538, 520, 538, 586, 538,
+ 566, 538, 520, 540, 588, 1596, 590, 536, 568, 538, 520, 1592,
+ 640, 538, 520, 540, 588, 538, 568, 538, 516, 562, 566, 538,
+ 518, 542, 586, 540, 566, 1596, 590, 538, 566, 538, 516, 544,
+ 586, 538, 516, 542, 588, 540, 564, 540, 468, 590, 588, 538,
+ 566, 540, 466, 590, 588, 538, 514, 544, 588, 538, 566, 538,
+ 468, 1692, 606, 526, 466, 592, 588, 538, 568, 490, 588, 538,
+ 566, 540, 466, 592, 588, 538, 566, 538, 466, 592, 588, 538,
+ 568, 492, 586, 540, 566, 540, 468, 590, 588, 538, 568, 516,
+ 488, 590, 588, 538, 568, 492, 588, 538, 566, 518, 488, 590,
+ 588, 540, 564, 518, 490, 590, 588, 538, 562, 496, 588, 538,
+ 566, 518, 488, 590, 588, 538, 562, 522, 488, 588, 590, 538,
+ 560, 498, 588, 540, 564, 522, 486, 590, 590, 538, 560, 524,
+ 488, 588, 588, 1598, 514, 608, 564, 1600, 548, 536, 586, 538,
+ 568, 1594, 590, 1618, 578, 1606, 606, 1582, 590, 1596, 590, 1616,
+ 580};
+ uint8_t expectedState[kHaierACYRW02StateLength] = {
+ 0xA6, 0x12, 0x00, 0x02, 0x40, 0x20, 0x00,
+ 0x20, 0x00, 0x00, 0x00, 0x00, 0x05, 0x3F};
+
+ irsend.sendRaw(rawData, 229, 38000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(HAIER_AC_YRW02, irsend.capture.decode_type);
+ EXPECT_EQ(kHaierACYRW02Bits, irsend.capture.bits);
+ EXPECT_FALSE(irsend.capture.repeat);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+
+ IRHaierACYRW02 haier(0);
+ haier.setRaw(irsend.capture.state);
+ EXPECT_EQ(
+ "Power: On, Button: 5 (Power), Mode: 2 (Cool), Temp: 17C,"
+ " Fan: 2 (High), Turbo: 0 (Off), Swing: 2 (Middle), Sleep: Off,"
+ " Health: On",
+ haier.toString());
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Hitachi_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Hitachi_test.cpp
new file mode 100644
index 000000000000..de0a4a2a186d
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Hitachi_test.cpp
@@ -0,0 +1,765 @@
+// Copyright 2018 David Conran
+
+#include "ir_Hitachi.h"
+#include "IRrecv.h"
+#include "IRrecv_test.h"
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests for sendHitachiAC().
+
+// Test sending typical data only.
+TEST(TestSendHitachiAC, SendData) {
+ IRsendTest irsend(0);
+ irsend.begin();
+
+ uint8_t hitachi_code[kHitachiAcStateLength] = {
+ 0x80, 0x08, 0x0C, 0x02, 0xFD, 0x80, 0x7F, 0x88, 0x48, 0x80,
+ 0x20, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xAC};
+ irsend.reset();
+ irsend.sendHitachiAC(hitachi_code);
+ EXPECT_EQ(
+ "m3300s1700"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s1250m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s1250m400s1250m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s1250m400s500"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s500m400s1250"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s1250m400s500m400s500m400s500m400s1250m400s500m400s500m400s500"
+ "m400s500m400s1250m400s500m400s500m400s1250m400s500m400s500m400s500"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s1250m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s1250m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s1250"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s500m400s1250m400s500m400s1250m400s1250m400s500m400s500"
+ "m400s100000",
+ irsend.outputStr());
+}
+
+// Test sending with repeats.
+TEST(TestSendHitachiAC, SendWithRepeats) {
+ IRsendTest irsend(0);
+ irsend.begin();
+
+ uint8_t hitachi_code[kHitachiAcStateLength] = {
+ 0x80, 0x08, 0x0C, 0x02, 0xFD, 0x80, 0x7F, 0x88, 0x48, 0x80,
+ 0x20, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xAC};
+ irsend.reset();
+
+ irsend.sendHitachiAC(hitachi_code, kHitachiAcStateLength, 1);
+ EXPECT_EQ(
+ "m3300s1700"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s1250m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s1250m400s1250m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s1250m400s500"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s500m400s1250"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s1250m400s500m400s500m400s500m400s1250m400s500m400s500m400s500"
+ "m400s500m400s1250m400s500m400s500m400s1250m400s500m400s500m400s500"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s1250m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s1250m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s1250"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s500m400s1250m400s500m400s1250m400s1250m400s500m400s500"
+ "m400s100000"
+ "m3300s1700"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s1250m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s1250m400s1250m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s1250m400s500"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s500m400s1250"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s1250m400s500m400s500m400s500m400s1250m400s500m400s500m400s500"
+ "m400s500m400s1250m400s500m400s500m400s1250m400s500m400s500m400s500"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s1250m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s1250m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s1250"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s500m400s1250m400s500m400s1250m400s1250m400s500m400s500"
+ "m400s100000",
+ irsend.outputStr());
+}
+
+// Test sending atypical sizes.
+TEST(TestSendHitachiAC, SendUnexpectedSizes) {
+ IRsendTest irsend(0);
+ irsend.begin();
+
+ uint8_t hitachi_short_code[kHitachiAcStateLength - 1] = {
+ 0x80, 0x08, 0x0C, 0x02, 0xFD, 0x80, 0x7F, 0x88, 0x48,
+ 0x80, 0x20, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00};
+ uint8_t hitachi_long_code[kHitachiAcStateLength + 1] = {
+ 0x80, 0x08, 0x0C, 0x02, 0xFD, 0x80, 0x7F, 0x88, 0x48, 0x80,
+ 0x20, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xAC, 0xFF};
+ irsend.reset();
+ irsend.sendHitachiAC(hitachi_short_code, kHitachiAcStateLength - 1);
+ ASSERT_EQ("", irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendHitachiAC(hitachi_long_code, kHitachiAcStateLength + 1);
+ ASSERT_EQ(
+ "m3300s1700"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s1250m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s1250m400s1250m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s1250m400s500"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s500m400s1250"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s1250m400s500m400s500m400s500m400s1250m400s500m400s500m400s500"
+ "m400s500m400s1250m400s500m400s500m400s1250m400s500m400s500m400s500"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s1250m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s1250m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s1250"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s500m400s1250m400s500m400s1250m400s1250m400s500m400s500"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s100000",
+ irsend.outputStr());
+}
+
+// Tests for IRHitachiAc class.
+TEST(TestIRHitachiAcClass, SetAndGetPower) {
+ IRHitachiAc ac(0);
+ ac.on();
+ EXPECT_TRUE(ac.getPower());
+ ac.off();
+ EXPECT_FALSE(ac.getPower());
+ ac.setPower(true);
+ EXPECT_TRUE(ac.getPower());
+ ac.setPower(false);
+ EXPECT_FALSE(ac.getPower());
+}
+
+TEST(TestIRHitachiAcClass, SetAndGetSwing) {
+ IRHitachiAc ac(0);
+ ac.setSwingVertical(true);
+ ac.setSwingHorizontal(true);
+ EXPECT_TRUE(ac.getSwingVertical());
+ EXPECT_TRUE(ac.getSwingHorizontal());
+ ac.setSwingVertical(false);
+ EXPECT_FALSE(ac.getSwingVertical());
+ EXPECT_TRUE(ac.getSwingHorizontal());
+ ac.setSwingVertical(true);
+ EXPECT_TRUE(ac.getSwingVertical());
+ EXPECT_TRUE(ac.getSwingHorizontal());
+ ac.setSwingHorizontal(false);
+ EXPECT_TRUE(ac.getSwingVertical());
+ EXPECT_FALSE(ac.getSwingHorizontal());
+ ac.setSwingHorizontal(true);
+ EXPECT_TRUE(ac.getSwingHorizontal());
+}
+
+TEST(TestIRHitachiAcClass, SetAndGetTemp) {
+ IRHitachiAc ac(0);
+ ac.setTemp(25);
+ EXPECT_EQ(25, ac.getTemp());
+ ac.setTemp(kHitachiAcMinTemp);
+ EXPECT_EQ(kHitachiAcMinTemp, ac.getTemp());
+ ac.setTemp(kHitachiAcMinTemp - 1);
+ EXPECT_EQ(kHitachiAcMinTemp, ac.getTemp());
+ ac.setTemp(kHitachiAcMaxTemp);
+ EXPECT_EQ(kHitachiAcMaxTemp, ac.getTemp());
+ ac.setTemp(kHitachiAcMaxTemp + 1);
+ EXPECT_EQ(kHitachiAcMaxTemp, ac.getTemp());
+ ac.setTemp(64);
+ EXPECT_EQ(64, ac.getTemp());
+}
+
+TEST(TestIRHitachiAcClass, SetAndGetMode) {
+ IRHitachiAc ac(0);
+ ac.setMode(kHitachiAcCool);
+ ac.setFan(kHitachiAcFanAuto);
+ EXPECT_EQ(kHitachiAcCool, ac.getMode());
+ ac.setTemp(25);
+ EXPECT_EQ(25, ac.getTemp());
+ EXPECT_EQ(kHitachiAcFanAuto, ac.getFan());
+ ac.setMode(kHitachiAcFan);
+ EXPECT_EQ(kHitachiAcFan, ac.getMode());
+ EXPECT_EQ(64, ac.getTemp());
+ EXPECT_NE(kHitachiAcFanAuto, ac.getFan());
+ ac.setMode(kHitachiAcHeat);
+ EXPECT_EQ(25, ac.getTemp());
+ EXPECT_EQ(kHitachiAcHeat, ac.getMode());
+ ac.setMode(kHitachiAcAuto);
+ ac.setFan(kHitachiAcFanAuto);
+ EXPECT_EQ(kHitachiAcAuto, ac.getMode());
+ ac.setMode(kHitachiAcDry);
+ EXPECT_EQ(kHitachiAcDry, ac.getMode());
+ EXPECT_NE(kHitachiAcFanAuto, ac.getFan());
+}
+
+TEST(TestIRHitachiAcClass, SetAndGetFan) {
+ IRHitachiAc ac(0);
+ ac.setMode(kHitachiAcCool); // All fan options are available in this mode.
+ ac.setFan(kHitachiAcFanAuto);
+ EXPECT_EQ(kHitachiAcFanAuto, ac.getFan());
+ ac.setFan(kHitachiAcFanLow);
+ EXPECT_EQ(kHitachiAcFanLow, ac.getFan());
+ ac.setFan(kHitachiAcFanHigh);
+ EXPECT_EQ(kHitachiAcFanHigh, ac.getFan());
+ ac.setFan(kHitachiAcFanHigh + 1);
+ EXPECT_EQ(kHitachiAcFanHigh, ac.getFan());
+ ac.setFan(0);
+ EXPECT_EQ(kHitachiAcFanAuto, ac.getFan());
+
+ ac.setMode(kHitachiAcFan); // No auto-fan in Fan mode.
+ EXPECT_EQ(kHitachiAcFanLow, ac.getFan());
+ ac.setFan(kHitachiAcFanAuto);
+ EXPECT_EQ(kHitachiAcFanLow, ac.getFan());
+ ac.setFan(kHitachiAcFanHigh);
+ EXPECT_EQ(kHitachiAcFanHigh, ac.getFan());
+
+ // Only Low and one higher fan settin in Dry mode.
+ ac.setMode(kHitachiAcDry);
+ EXPECT_EQ(kHitachiAcFanLow + 1, ac.getFan());
+ ac.setFan(kHitachiAcFanHigh);
+ EXPECT_EQ(kHitachiAcFanLow + 1, ac.getFan());
+ ac.setFan(kHitachiAcFanLow);
+ EXPECT_EQ(kHitachiAcFanLow, ac.getFan());
+ ac.setFan(kHitachiAcFanAuto);
+ EXPECT_EQ(kHitachiAcFanLow, ac.getFan());
+}
+
+TEST(TestIRHitachiAcClass, HumanReadable) {
+ IRHitachiAc ac(0);
+
+ ac.setMode(kHitachiAcHeat);
+ ac.setTemp(kHitachiAcMaxTemp);
+ ac.on();
+ ac.setFan(kHitachiAcFanHigh);
+ ac.setSwingVertical(true);
+ EXPECT_EQ(
+ "Power: On, Mode: 3 (HEAT), Temp: 32C, Fan: 5 (HIGH), "
+ "Swing (Vertical): On, Swing (Horizontal): Off",
+ ac.toString());
+ ac.setMode(kHitachiAcCool);
+ ac.setTemp(kHitachiAcMinTemp);
+ ac.setFan(kHitachiAcFanLow);
+ ac.setSwingVertical(false);
+ ac.setSwingHorizontal(true);
+ EXPECT_EQ(
+ "Power: On, Mode: 4 (COOL), Temp: 16C, Fan: 2 (LOW), "
+ "Swing (Vertical): Off, Swing (Horizontal): On",
+ ac.toString());
+}
+
+TEST(TestIRHitachiAcClass, ChecksumCalculation) {
+ IRHitachiAc ac(0);
+
+ const uint8_t originalstate[kHitachiAcStateLength] = {
+ 0x80, 0x08, 0x0C, 0x02, 0xFD, 0x80, 0x7F, 0x88, 0x48, 0x80,
+ 0x20, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xAC};
+ uint8_t examplestate[kHitachiAcStateLength] = {
+ 0x80, 0x08, 0x0C, 0x02, 0xFD, 0x80, 0x7F, 0x88, 0x48, 0x80,
+ 0x20, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xAC};
+
+ EXPECT_TRUE(IRHitachiAc::validChecksum(examplestate));
+ EXPECT_EQ(0xAC, IRHitachiAc::calcChecksum(examplestate));
+
+ examplestate[kHitachiAcStateLength - 1] =
+ 0x12; // Make the existing checksum invalid
+ EXPECT_FALSE(IRHitachiAc::validChecksum(examplestate));
+ EXPECT_EQ(0xAC, IRHitachiAc::calcChecksum(examplestate));
+ ac.setRaw(examplestate);
+ // Extracting the state from the object should have a correct checksum.
+ EXPECT_TRUE(IRHitachiAc::validChecksum(ac.getRaw()));
+ EXPECT_STATE_EQ(originalstate, ac.getRaw(), kHitachiAcBits);
+
+ examplestate[8] = 0x12; // Force a different checksum calc.
+ EXPECT_FALSE(IRHitachiAc::validChecksum(examplestate));
+ EXPECT_EQ(0xFF, IRHitachiAc::calcChecksum(examplestate));
+}
+
+// Tests for decodeHitachiAC().
+
+// Decode a synthetic HitachiAC message.
+TEST(TestDecodeHitachiAC, NormalSynthetic) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ uint8_t hitachi_code[kHitachiAcStateLength] = {
+ 0x80, 0x08, 0x0C, 0x02, 0xFD, 0x80, 0x7F, 0x88, 0x48, 0x80,
+ 0x20, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xAC};
+
+ irsend.reset();
+ irsend.sendHitachiAC(hitachi_code);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(HITACHI_AC, irsend.capture.decode_type);
+ ASSERT_EQ(kHitachiAcBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(hitachi_code, irsend.capture.state, kHitachiAcBits);
+}
+
+// Decode a 'real' HitachiAC message.
+TEST(TestDecodeHitachiAC, NormalRealExample1) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ uint8_t hitachi_code[kHitachiAcStateLength] = {
+ 0x80, 0x08, 0x0C, 0x02, 0xFD, 0x80, 0x7F, 0x88, 0x48, 0x80,
+ 0x20, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xAC};
+
+ // Ref: https://github.com/markszabo/IRremoteESP8266/issues/417
+ // 'On' '16c' 'auto fan' 'cooling mode'
+ uint16_t rawData[451] = {
+ 3318, 1720, 400, 1276, 400, 432, 398, 434, 398, 434, 400, 432,
+ 398, 432, 398, 432, 398, 434, 398, 432, 398, 434, 400, 432,
+ 398, 434, 398, 1278, 398, 434, 398, 434, 396, 434, 398, 434,
+ 398, 432, 398, 434, 398, 432, 398, 1276, 426, 1252, 424, 408,
+ 424, 406, 424, 408, 426, 406, 398, 432, 398, 434, 398, 432,
+ 400, 432, 398, 1276, 426, 408, 424, 1252, 426, 1252, 424, 1250,
+ 426, 1252, 428, 1250, 426, 1252, 424, 406, 426, 1248, 428, 1252,
+ 426, 406, 426, 406, 424, 408, 400, 432, 400, 430, 400, 432,
+ 400, 430, 400, 432, 400, 1276, 400, 1276, 402, 1276, 400, 1276,
+ 400, 1276, 400, 1278, 400, 1276, 402, 1276, 402, 428, 402, 430,
+ 400, 430, 402, 1276, 400, 430, 402, 430, 400, 432, 402, 428,
+ 402, 1278, 400, 430, 402, 430, 402, 1276, 402, 428, 402, 430,
+ 402, 430, 400, 1276, 402, 430, 402, 430, 402, 430, 402, 430,
+ 402, 428, 402, 430, 404, 430, 402, 428, 402, 430, 402, 1276,
+ 402, 430, 402, 428, 402, 430, 400, 428, 402, 430, 402, 430,
+ 402, 430, 402, 430, 402, 428, 402, 430, 402, 1274, 402, 428,
+ 402, 430, 402, 430, 402, 430, 402, 430, 402, 428, 402, 428,
+ 402, 428, 404, 428, 404, 428, 402, 1276, 400, 430, 402, 430,
+ 400, 432, 400, 456, 374, 432, 400, 456, 404, 428, 404, 426,
+ 404, 428, 402, 428, 402, 430, 402, 430, 400, 432, 398, 434,
+ 376, 454, 378, 454, 380, 452, 378, 452, 404, 428, 406, 424,
+ 432, 398, 406, 426, 430, 402, 404, 428, 428, 402, 400, 430,
+ 400, 432, 398, 434, 398, 432, 398, 434, 372, 460, 374, 434,
+ 398, 432, 398, 434, 396, 434, 376, 456, 376, 456, 376, 456,
+ 376, 1300, 378, 454, 378, 452, 378, 454, 378, 454, 378, 454,
+ 378, 452, 378, 454, 400, 432, 402, 430, 402, 430, 402, 430,
+ 402, 428, 402, 430, 402, 430, 400, 430, 402, 430, 400, 432,
+ 400, 430, 400, 432, 400, 430, 402, 430, 400, 432, 398, 432,
+ 400, 430, 400, 432, 398, 432, 398, 434, 398, 432, 398, 432,
+ 400, 434, 398, 432, 398, 432, 398, 434, 398, 434, 396, 434,
+ 398, 434, 398, 432, 398, 434, 398, 432, 398, 456, 376, 454,
+ 376, 436, 396, 454, 376, 454, 378, 454, 376, 454, 376, 456,
+ 374, 458, 374, 1302, 374, 456, 374, 458, 374, 458, 376, 456,
+ 374, 456, 374, 456, 374, 456, 376, 456, 376, 456, 374, 458,
+ 374, 458, 374, 458, 372, 458, 372, 460, 374, 458, 372, 460,
+ 372, 460, 372, 460, 370, 462, 372, 460, 372, 460, 370, 462,
+ 370, 462, 356, 1320, 368, 464, 346, 1332, 356, 476, 368, 1310,
+ 366, 1312, 366, 464, 366, 466, 366};
+
+ irsend.reset();
+ irsend.sendRaw(rawData, 451, 38000);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decodeHitachiAC(&irsend.capture));
+ EXPECT_EQ(HITACHI_AC, irsend.capture.decode_type);
+ ASSERT_EQ(kHitachiAcBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(hitachi_code, irsend.capture.state, kHitachiAcBits);
+ IRHitachiAc ac(0);
+ ac.setRaw(irsend.capture.state);
+ EXPECT_EQ(
+ "Power: On, Mode: 4 (COOL), Temp: 16C, Fan: 1 (AUTO), "
+ "Swing (Vertical): Off, Swing (Horizontal): Off",
+ ac.toString());
+}
+
+// Decode another 'real' HitachiAC message.
+TEST(TestDecodeHitachiAC, NormalRealExample2) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ uint8_t hitachi_code[kHitachiAcStateLength] = {
+ 0x80, 0x08, 0x0C, 0x02, 0xFD, 0x80, 0x7F, 0x88, 0x48, 0x10,
+ 0xC0, 0x02, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xD0};
+
+ // Ref: https://github.com/markszabo/IRremoteESP8266/issues/417
+ // 'On' '32c' 'auto fan' 'heating mode'
+ uint16_t rawData[451] = {
+ 3322, 1718, 400, 1278, 398, 432, 402, 430, 400, 430, 402, 430,
+ 402, 430, 400, 432, 400, 432, 402, 430, 400, 430, 402, 430,
+ 400, 430, 402, 1276, 402, 430, 400, 430, 402, 430, 402, 430,
+ 402, 428, 402, 430, 400, 430, 402, 1278, 400, 1274, 402, 430,
+ 400, 432, 400, 430, 402, 430, 402, 430, 400, 430, 400, 432,
+ 402, 428, 402, 1276, 404, 428, 402, 1276, 402, 1274, 402, 1274,
+ 404, 1272, 402, 1274, 402, 1274, 404, 430, 402, 1274, 402, 1274,
+ 402, 430, 402, 430, 402, 430, 400, 430, 402, 430, 404, 428,
+ 402, 430, 400, 430, 402, 1274, 402, 1276, 402, 1276, 402, 1276,
+ 400, 1276, 402, 1272, 404, 1274, 402, 1272, 404, 430, 402, 430,
+ 402, 430, 402, 1274, 404, 428, 402, 428, 404, 430, 402, 430,
+ 402, 1274, 402, 430, 402, 430, 402, 1274, 402, 430, 402, 430,
+ 402, 428, 404, 428, 402, 430, 402, 430, 402, 1272, 406, 430,
+ 402, 428, 402, 430, 402, 430, 400, 1276, 400, 1276, 402, 430,
+ 402, 430, 402, 430, 402, 430, 402, 428, 402, 430, 402, 430,
+ 402, 430, 402, 430, 402, 430, 402, 430, 400, 430, 402, 1272,
+ 404, 430, 400, 430, 402, 430, 402, 428, 404, 430, 400, 430,
+ 402, 430, 402, 430, 402, 428, 402, 1276, 402, 428, 402, 1276,
+ 402, 430, 402, 428, 402, 430, 402, 430, 402, 430, 402, 428,
+ 402, 430, 402, 430, 402, 430, 402, 430, 402, 428, 402, 428,
+ 404, 430, 402, 428, 402, 430, 402, 428, 402, 430, 402, 432,
+ 402, 428, 402, 430, 402, 430, 402, 430, 400, 430, 400, 430,
+ 402, 430, 402, 430, 402, 426, 404, 430, 402, 430, 400, 428,
+ 404, 428, 404, 432, 398, 432, 400, 456, 376, 456, 376, 456,
+ 376, 1276, 402, 454, 378, 456, 376, 454, 378, 454, 402, 430,
+ 376, 454, 376, 456, 400, 430, 378, 454, 400, 432, 402, 430,
+ 376, 454, 376, 456, 376, 454, 400, 432, 374, 458, 400, 430,
+ 398, 434, 374, 456, 374, 456, 374, 458, 374, 458, 374, 456,
+ 352, 482, 372, 460, 374, 458, 364, 468, 352, 480, 372, 460,
+ 352, 480, 352, 480, 352, 480, 352, 480, 352, 454, 400, 432,
+ 376, 480, 374, 456, 374, 456, 378, 430, 404, 452, 376, 430,
+ 404, 428, 406, 426, 406, 426, 404, 426, 406, 428, 406, 426,
+ 430, 400, 430, 1244, 408, 424, 434, 398, 432, 400, 406, 424,
+ 432, 400, 406, 426, 430, 400, 432, 400, 432, 400, 430, 402,
+ 428, 402, 404, 428, 404, 426, 406, 426, 406, 426, 404, 428,
+ 428, 402, 404, 428, 404, 428, 402, 428, 404, 428, 402, 428,
+ 404, 428, 404, 1274, 402, 1274, 404, 428, 400, 1276, 402, 430,
+ 402, 430, 402, 430, 402, 430, 400};
+
+ irsend.reset();
+ irsend.sendRaw(rawData, 451, 38000);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(HITACHI_AC, irsend.capture.decode_type);
+ ASSERT_EQ(kHitachiAcBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(hitachi_code, irsend.capture.state, kHitachiAcBits);
+ IRHitachiAc ac(0);
+ ac.setRaw(irsend.capture.state);
+ EXPECT_EQ(
+ "Power: On, Mode: 3 (HEAT), Temp: 32C, Fan: 5 (HIGH), "
+ "Swing (Vertical): Off, Swing (Horizontal): Off",
+ ac.toString());
+}
+
+// Tests for sendHitachiAC1().
+
+// Test sending typical data only.
+TEST(TestSendHitachiAC1, SendData) {
+ IRsendTest irsend(0);
+ irsend.begin();
+
+ uint8_t hitachi_code[kHitachiAc1StateLength] = {0xB2, 0xAE, 0x4D, 0x51, 0xF0,
+ 0x61, 0x84, 0x00, 0x00, 0x00,
+ 0x00, 0x30, 0xB8};
+ irsend.reset();
+ irsend.sendHitachiAC1(hitachi_code);
+ EXPECT_EQ(
+ "m3400s3400"
+ "m400s1250m400s500m400s1250m400s1250m400s500m400s500m400s1250m400s500"
+ "m400s1250m400s500m400s1250m400s500m400s1250m400s1250m400s1250m400s500"
+ "m400s500m400s1250m400s500m400s500m400s1250m400s1250m400s500m400s1250"
+ "m400s500m400s1250m400s500m400s1250m400s500m400s500m400s500m400s1250"
+ "m400s1250m400s1250m400s1250m400s1250m400s500m400s500m400s500m400s500"
+ "m400s500m400s1250m400s1250m400s500m400s500m400s500m400s500m400s1250"
+ "m400s1250m400s500m400s500m400s500m400s500m400s1250m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s1250m400s1250m400s500m400s500m400s500m400s500"
+ "m400s1250m400s500m400s1250m400s1250m400s1250m400s500m400s500m400s500"
+ "m400s100000",
+ irsend.outputStr());
+}
+
+// Decode a 'real' HitachiAC1 message.
+TEST(TestDecodeHitachiAC1, NormalRealExample) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ uint8_t hitachi_code[kHitachiAc1StateLength] = {0xB2, 0xAE, 0x4D, 0x51, 0xF0,
+ 0x61, 0x84, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x98};
+
+ // Ref: https://github.com/markszabo/IRremoteESP8266/issues/453
+ uint16_t rawData[211] = {
+ 3400, 3350, 450, 1250, 450, 400, 400, 1300, 400, 1300, 400, 400,
+ 450, 400, 400, 1300, 400, 400, 400, 1300, 400, 400, 450, 1250,
+ 400, 450, 400, 1300, 400, 1250, 450, 1250, 450, 400, 400, 450,
+ 400, 1250, 450, 400, 400, 400, 400, 1300, 400, 1300, 400, 400,
+ 450, 1250, 450, 400, 400, 1300, 400, 400, 450, 1250, 400, 400,
+ 450, 400, 400, 400, 450, 1250, 400, 1300, 450, 1250, 450, 1250,
+ 400, 1300, 400, 400, 450, 400, 400, 450, 350, 450, 400, 400,
+ 400, 1300, 400, 1300, 400, 400, 450, 400, 400, 400, 450, 400,
+ 400, 1300, 400, 1250, 450, 400, 400, 400, 450, 400, 400, 400,
+ 450, 1250, 450, 400, 400, 400, 450, 400, 400, 400, 450, 400,
+ 400, 400, 450, 400, 400, 400, 450, 400, 400, 400, 400, 450,
+ 400, 400, 400, 400, 450, 400, 400, 400, 450, 400, 400, 450,
+ 400, 400, 400, 400, 450, 400, 400, 400, 450, 400, 400, 450,
+ 400, 400, 400, 400, 400, 450, 400, 400, 400, 400, 450, 400,
+ 400, 400, 450, 400, 400, 400, 450, 400, 400, 400, 450, 400,
+ 400, 400, 450, 400, 400, 1300, 400, 400, 450, 400, 400, 400,
+ 400, 400, 450, 1250, 450, 400, 400, 400, 450, 1250, 450, 1250,
+ 450, 400, 400, 400, 450, 400, 400}; // UNKNOWN 828A89E1
+
+ irsend.reset();
+ irsend.sendRaw(rawData, 211, 38000);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(HITACHI_AC1, irsend.capture.decode_type);
+ ASSERT_EQ(kHitachiAc1Bits, irsend.capture.bits);
+ EXPECT_STATE_EQ(hitachi_code, irsend.capture.state, kHitachiAc1Bits);
+}
+
+// Tests for sendHitachiAC2().
+
+// Test sending typical data only.
+TEST(TestSendHitachiAC2, SendData) {
+ IRsendTest irsend(0);
+ irsend.begin();
+
+ uint8_t hitachi_code[kHitachiAc2StateLength] = {
+ 0x80, 0x08, 0x00, 0x02, 0xFD, 0xFF, 0x00, 0x33, 0xCC, 0x49, 0xB6,
+ 0x22, 0xDD, 0x01, 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00,
+ 0xFF, 0x00, 0xFF, 0xCA, 0x35, 0x8F, 0x70, 0x00, 0xFF, 0x00, 0xFF,
+ 0x01, 0xFE, 0xC0, 0x3F, 0x80, 0x7F, 0x11, 0xEE, 0x00, 0xFF, 0x00,
+ 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00};
+ irsend.reset();
+ irsend.sendHitachiAC2(hitachi_code);
+ EXPECT_EQ(
+ "m3300s1700"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s1250m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s1250m400s500"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s500m400s1250"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s1250m400s1250m400s500m400s500m400s1250m400s1250"
+ "m400s1250m400s1250m400s500m400s500m400s1250m400s1250m400s500m400s500"
+ "m400s500m400s1250m400s500m400s500m400s1250m400s500m400s500m400s1250"
+ "m400s1250m400s500m400s1250m400s1250m400s500m400s1250m400s1250m400s500"
+ "m400s500m400s500m400s1250m400s500m400s500m400s500m400s1250m400s500"
+ "m400s1250m400s1250m400s500m400s1250m400s1250m400s1250m400s500m400s1250"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s1250"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s1250m400s1250m400s500m400s500m400s1250m400s500m400s1250m400s500"
+ "m400s500m400s500m400s1250m400s1250m400s500m400s1250m400s500m400s1250"
+ "m400s1250m400s500m400s500m400s500m400s1250m400s1250m400s1250m400s1250"
+ "m400s500m400s1250m400s1250m400s1250m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s1250"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s500"
+ "m400s1250m400s1250m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s500m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s500m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s500m400s500m400s500m400s1250m400s500m400s500m400s500m400s1250"
+ "m400s1250m400s1250m400s1250m400s500m400s1250m400s1250m400s1250m400s500"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
+ "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
+ "m400s100000",
+ irsend.outputStr());
+}
+
+// Decode a synthetic HitachiAC2 message.
+
+TEST(TestDecodeHitachiAC2, NormalSyntheticExample) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ // ON - 32c cool (fan auto)
+ uint8_t hitachi_code[kHitachiAc2StateLength] = {
+ 0x80, 0x08, 0x00, 0x02, 0xFD, 0xFF, 0x00, 0x33, 0xCC, 0x49, 0xB6,
+ 0x22, 0xDD, 0x01, 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00,
+ 0xFF, 0x00, 0xFF, 0xCA, 0x35, 0x8F, 0x70, 0x00, 0xFF, 0x00, 0xFF,
+ 0x01, 0xFE, 0xC0, 0x3F, 0x80, 0x7F, 0x11, 0xEE, 0x00, 0xFF, 0x00,
+ 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00};
+
+ irsend.reset();
+ irsend.sendHitachiAC2(hitachi_code);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(HITACHI_AC2, irsend.capture.decode_type);
+ ASSERT_EQ(kHitachiAc2Bits, irsend.capture.bits);
+ EXPECT_STATE_EQ(hitachi_code, irsend.capture.state, kHitachiAc2Bits);
+}
+
+// Decode a 'real' HitachiAC2 message.
+TEST(TestDecodeHitachiAC2, NormalRealExample) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ uint8_t hitachi_code[kHitachiAc2StateLength] = {
+ 0x80, 0x08, 0x00, 0x02, 0xFD, 0xFF, 0x00, 0x33, 0xCC, 0x49, 0xB6,
+ 0x22, 0xDD, 0x01, 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00,
+ 0xFF, 0x00, 0xFF, 0xCA, 0x35, 0x8F, 0x70, 0x00, 0xFF, 0x00, 0xFF,
+ 0x01, 0xFE, 0xC0, 0x3F, 0x80, 0x7F, 0x11, 0xEE, 0x00, 0xFF, 0x00,
+ 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00};
+
+ // Ref: https://github.com/markszabo/IRremoteESP8266/issues/417
+ uint16_t rawData[851] = {
+ // ON - 32c cool (fan auto)
+ 3432, 1654, 492, 1180, 488, 360, 486, 360, 486, 360, 486, 362,
+ 486, 362, 460, 360, 486, 362, 486, 362, 486, 360, 486, 362,
+ 486, 362, 486, 1184, 488, 362, 486, 360, 486, 362, 486, 362,
+ 486, 362, 460, 362, 486, 362, 486, 362, 484, 362, 486, 362,
+ 486, 362, 486, 362, 458, 362, 484, 362, 486, 362, 484, 364,
+ 484, 362, 486, 1184, 486, 362, 486, 1210, 488, 1210, 488, 1184,
+ 486, 1210, 488, 1210, 488, 1182, 488, 360, 488, 1208, 488, 1208,
+ 488, 1182, 488, 1208, 488, 1208, 488, 1208, 462, 1208, 490, 1208,
+ 488, 1208, 490, 332, 488, 360, 488, 360, 488, 360, 486, 360,
+ 486, 360, 486, 362, 460, 360, 486, 362, 486, 362, 486, 1210,
+ 488, 1210, 460, 362, 486, 362, 486, 1210, 488, 1210, 488, 1182,
+ 488, 1210, 488, 362, 486, 360, 488, 1182, 488, 1210, 488, 362,
+ 486, 362, 486, 360, 486, 1182, 488, 362, 486, 362, 486, 1210,
+ 488, 360, 486, 336, 486, 1210, 488, 1210, 488, 360, 486, 1182,
+ 488, 1210, 488, 360, 488, 1208, 488, 1182, 488, 362, 486, 362,
+ 486, 360, 486, 1210, 460, 362, 486, 360, 486, 362, 486, 1210,
+ 486, 362, 486, 1184, 488, 1208, 488, 360, 486, 1210, 488, 1184,
+ 488, 1208, 488, 362, 486, 1208, 462, 360, 486, 360, 486, 362,
+ 486, 360, 486, 362, 486, 360, 486, 334, 486, 1210, 488, 1208,
+ 488, 1210, 488, 1182, 488, 1208, 488, 1210, 488, 1182, 488, 1208,
+ 488, 360, 488, 360, 486, 360, 486, 334, 486, 362, 486, 362,
+ 486, 362, 486, 362, 486, 362, 486, 1182, 488, 1210, 486, 1210,
+ 488, 1210, 460, 1210, 488, 1210, 488, 1210, 488, 1184, 488, 360,
+ 486, 360, 486, 362, 486, 362, 486, 360, 460, 360, 486, 362,
+ 486, 362, 484, 1210, 488, 1182, 488, 1210, 488, 1210, 488, 1210,
+ 488, 1182, 488, 1208, 488, 1208, 488, 360, 460, 360, 486, 360,
+ 486, 360, 488, 360, 486, 362, 486, 362, 486, 334, 486, 1210,
+ 488, 1208, 488, 1210, 460, 1210, 488, 1208, 488, 1210, 488, 1182,
+ 488, 1208, 488, 360, 486, 362, 486, 360, 488, 334, 486, 360,
+ 486, 362, 486, 362, 486, 362, 486, 1210, 460, 1210, 488, 1210,
+ 488, 1210, 488, 1182, 488, 1210, 488, 1208, 488, 1182, 488, 360,
+ 486, 360, 486, 362, 486, 362, 486, 360, 486, 362, 460, 360,
+ 486, 362, 486, 1210, 486, 1212, 486, 1184, 488, 1210, 488, 1208,
+ 488, 1182, 488, 1208, 488, 1208, 488, 1208, 462, 1208, 488, 360,
+ 486, 362, 486, 1208, 488, 334, 486, 1208, 488, 360, 486, 360,
+ 486, 362, 486, 1182, 488, 1210, 488, 360, 486, 1210, 488, 334,
+ 486, 1208, 488, 1208, 488, 360, 486, 360, 486, 334, 486, 1210,
+ 488, 1210, 488, 1210, 460, 1210, 488, 360, 486, 1208, 488, 1182,
+ 490, 1208, 488, 360, 486, 360, 486, 360, 486, 360, 460, 360,
+ 486, 362, 486, 362, 486, 362, 486, 362, 486, 362, 486, 362,
+ 458, 362, 486, 1210, 488, 1210, 488, 1182, 488, 1210, 488, 1208,
+ 488, 1208, 462, 1208, 488, 1208, 488, 360, 486, 360, 486, 334,
+ 486, 360, 486, 362, 486, 362, 486, 362, 486, 362, 486, 1184,
+ 488, 1210, 488, 1210, 488, 1208, 462, 1210, 488, 1208, 488, 1208,
+ 488, 1182, 488, 360, 486, 360, 486, 360, 486, 362, 486, 360,
+ 460, 362, 486, 360, 488, 1208, 488, 1210, 488, 1184, 488, 1208,
+ 488, 1210, 488, 1182, 488, 1208, 488, 1208, 488, 360, 488, 1182,
+ 488, 1208, 488, 360, 488, 360, 488, 360, 486, 334, 486, 360,
+ 486, 362, 486, 362, 486, 360, 486, 1210, 488, 1182, 488, 1210,
+ 488, 1210, 488, 1182, 488, 1210, 488, 1210, 488, 360, 488, 334,
+ 486, 360, 488, 360, 486, 362, 486, 362, 486, 362, 486, 362,
+ 460, 1210, 488, 1210, 488, 1210, 488, 1184, 488, 1208, 488, 1208,
+ 490, 1182, 488, 360, 488, 360, 486, 362, 486, 1208, 488, 360,
+ 460, 362, 486, 362, 486, 1210, 488, 1210, 488, 1182, 488, 1208,
+ 488, 360, 488, 1208, 488, 1184, 486, 1210, 488, 360, 488, 360,
+ 486, 360, 460, 362, 486, 362, 486, 362, 486, 362, 484, 362,
+ 486, 362, 486, 1184, 488, 1210, 488, 1210, 488, 1182, 488, 1210,
+ 488, 1208, 488, 1208, 462, 1210, 488, 360, 486, 362, 486, 360,
+ 486, 362, 486, 334, 486, 362, 486, 360, 486, 362, 486, 1208,
+ 488, 1184, 488, 1208, 488, 1210, 488, 1182, 488, 1208, 488, 1208,
+ 488, 1208, 488, 1182, 488, 1208, 488, 1208, 488, 1182, 488, 1208,
+ 488, 1208, 488, 1182, 488, 1208, 488, 360, 488, 360, 486, 360,
+ 486, 362, 460, 362, 486, 362, 486, 362, 486, 360, 486, 1208,
+ 488, 1182, 488, 1208, 488, 1210, 488, 1182, 488, 1208, 490, 1208,
+ 488, 1208, 462, 360, 488, 360, 486, 360, 488, 360, 486, 360,
+ 486, 360, 486, 336, 486, 362, 486, 1210, 488, 1208, 488, 1182,
+ 488, 1208, 488, 1208, 488, 1208, 462, 1208, 490, 1206, 490, 360,
+ 488, 360, 488, 332, 486, 360, 488, 360, 486, 360, 488, 360,
+ 486, 360, 486, 1182, 488, 1208, 488, 1206, 492, 1208, 462, 1208,
+ 488, 1208, 488, 1208, 490, 1182, 490, 360, 486, 360, 486, 360,
+ 488, 360, 488, 360, 460, 360, 486, 362, 486, 360, 488};
+
+ irsend.reset();
+ irsend.sendRaw(rawData, 851, 38000);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(HITACHI_AC2, irsend.capture.decode_type);
+ ASSERT_EQ(kHitachiAc2Bits, irsend.capture.bits);
+ EXPECT_STATE_EQ(hitachi_code, irsend.capture.state, kHitachiAc2Bits);
+}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_JVC_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_JVC_test.cpp
similarity index 76%
rename from lib/IRremoteESP8266-2.2.1.02/test/ir_JVC_test.cpp
rename to lib/IRremoteESP8266-2.5.2.03/test/ir_JVC_test.cpp
index 0826b2268bf0..c899fa8c60a9 100644
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_JVC_test.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_JVC_test.cpp
@@ -17,7 +17,8 @@ TEST(TestSendJVC, SendDataOnly) {
"m8400s4200"
"m525s1725m525s1725m525s525m525s525m525s525m525s525m525s1725m525s525"
"m525s1725m525s525m525s1725m525s1725m525s1725m525s525m525s525m525s525"
- "m525s60000", irsend.outputStr());
+ "m525s21675",
+ irsend.outputStr());
}
// Test sending with different repeats.
@@ -26,31 +27,33 @@ TEST(TestSendJVC, SendWithRepeats) {
irsend.begin();
irsend.reset();
- irsend.sendJVC(0xC2B8, JVC_BITS, 1); // 1 repeat.
+ irsend.sendJVC(0xC2B8, kJvcBits, 1); // 1 repeat.
EXPECT_EQ(
"m8400s4200"
"m525s1725m525s1725m525s525m525s525m525s525m525s525m525s1725m525s525"
"m525s1725m525s525m525s1725m525s1725m525s1725m525s525m525s525m525s525"
- "m525s60000"
+ "m525s21675"
"m525s1725m525s1725m525s525m525s525m525s525m525s525m525s1725m525s525"
"m525s1725m525s525m525s1725m525s1725m525s1725m525s525m525s525m525s525"
- "m525s60000", irsend.outputStr());
- irsend.sendJVC(0xC2B8, JVC_BITS, 2); // 2 repeats.
+ "m525s34275",
+ irsend.outputStr());
+ irsend.sendJVC(0xC2B8, kJvcBits, 2); // 2 repeats.
EXPECT_EQ(
"m8400s4200"
"m525s1725m525s1725m525s525m525s525m525s525m525s525m525s1725m525s525"
"m525s1725m525s525m525s1725m525s1725m525s1725m525s525m525s525m525s525"
- "m525s60000"
+ "m525s21675"
"m525s1725m525s1725m525s525m525s525m525s525m525s525m525s1725m525s525"
"m525s1725m525s525m525s1725m525s1725m525s1725m525s525m525s525m525s525"
- "m525s60000"
+ "m525s34275"
"m525s1725m525s1725m525s525m525s525m525s525m525s525m525s1725m525s525"
"m525s1725m525s525m525s1725m525s1725m525s1725m525s525m525s525m525s525"
- "m525s60000", irsend.outputStr());
+ "m525s34275",
+ irsend.outputStr());
}
// Test sending an atypical data size.
-TEST(TestSendJVC, SendUsualSize) {
+TEST(TestSendJVC, SendUnusualSize) {
IRsendTest irsend(4);
irsend.begin();
@@ -59,7 +62,8 @@ TEST(TestSendJVC, SendUsualSize) {
EXPECT_EQ(
"m8400s4200"
"m525s525m525s525m525s525m525s525m525s525m525s525m525s525m525s525"
- "m525s60000", irsend.outputStr());
+ "m525s38475",
+ irsend.outputStr());
irsend.reset();
irsend.sendJVC(0x1234567890ABCDEF, 64);
@@ -73,7 +77,8 @@ TEST(TestSendJVC, SendUsualSize) {
"m525s1725m525s525m525s1725m525s525m525s1725m525s525m525s1725m525s1725"
"m525s1725m525s1725m525s525m525s525m525s1725m525s1725m525s525m525s1725"
"m525s1725m525s1725m525s1725m525s525m525s1725m525s1725m525s1725m525s1725"
- "m525s60000", irsend.outputStr());
+ "m525s10875",
+ irsend.outputStr());
}
// Tests for encodeJVC().
@@ -100,9 +105,9 @@ TEST(TestDecodeJVC, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendJVC(0xC2B8);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, JVC_BITS, true));
+ ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kJvcBits, true));
EXPECT_EQ(JVC, irsend.capture.decode_type);
- EXPECT_EQ(JVC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kJvcBits, irsend.capture.bits);
EXPECT_EQ(0xC2B8, irsend.capture.value);
EXPECT_EQ(0x43, irsend.capture.address);
EXPECT_EQ(0x1D, irsend.capture.command);
@@ -112,9 +117,9 @@ TEST(TestDecodeJVC, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendJVC(irsend.encodeJVC(0x07, 0x99));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, JVC_BITS, true));
+ ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kJvcBits, true));
EXPECT_EQ(JVC, irsend.capture.decode_type);
- EXPECT_EQ(JVC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kJvcBits, irsend.capture.bits);
EXPECT_EQ(0xE099, irsend.capture.value);
EXPECT_EQ(0x07, irsend.capture.address);
EXPECT_EQ(0x99, irsend.capture.command);
@@ -124,9 +129,9 @@ TEST(TestDecodeJVC, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendJVC(irsend.encodeJVC(0x1, 0x1));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, JVC_BITS, true));
+ ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kJvcBits, true));
EXPECT_EQ(JVC, irsend.capture.decode_type);
- EXPECT_EQ(JVC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kJvcBits, irsend.capture.bits);
EXPECT_EQ(0x8080, irsend.capture.value);
EXPECT_EQ(0x1, irsend.capture.address);
EXPECT_EQ(0x1, irsend.capture.command);
@@ -141,42 +146,42 @@ TEST(TestDecodeJVC, NormalDecodeWithRepeatAndStrict) {
// Normal JVC 16-bit message with 2 repeats.
irsend.reset();
- irsend.sendJVC(0xC2B8, JVC_BITS, 2);
+ irsend.sendJVC(0xC2B8, kJvcBits, 2);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, JVC_BITS, true));
+ ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kJvcBits, true));
EXPECT_EQ(JVC, irsend.capture.decode_type);
- EXPECT_EQ(JVC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kJvcBits, irsend.capture.bits);
EXPECT_EQ(0xC2B8, irsend.capture.value);
EXPECT_EQ(0x43, irsend.capture.address);
EXPECT_EQ(0x1D, irsend.capture.command);
EXPECT_FALSE(irsend.capture.repeat);
- irsend.makeDecodeResult(2 * JVC_BITS + 4);
- ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, JVC_BITS, true));
+ irsend.makeDecodeResult(2 * kJvcBits + 4);
+ ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kJvcBits, true));
EXPECT_EQ(JVC, irsend.capture.decode_type);
- EXPECT_EQ(JVC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kJvcBits, irsend.capture.bits);
EXPECT_EQ(0xC2B8, irsend.capture.value);
EXPECT_TRUE(irsend.capture.repeat);
- irsend.makeDecodeResult(2 * JVC_BITS + 4 + 2 * JVC_BITS + 2);
- ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, JVC_BITS, true));
+ irsend.makeDecodeResult(2 * kJvcBits + 4 + 2 * kJvcBits + 2);
+ ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kJvcBits, true));
EXPECT_EQ(JVC, irsend.capture.decode_type);
- EXPECT_EQ(JVC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kJvcBits, irsend.capture.bits);
EXPECT_EQ(0xC2B8, irsend.capture.value);
EXPECT_TRUE(irsend.capture.repeat);
// Simulate 'just' a JVC repeat command.
// JVC VCR Power On from Global Cache, but modified to be a repeat message.
- uint16_t gc_test[37] = {38000, 1, 1, 20, 61, 20, 61, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 61, 20, 20, 20, 61, 20, 20, 20,
- 61, 20, 61, 20, 61, 20, 20, 20, 20, 20, 20, 20, 884};
+ uint16_t gc_test[37] = {38000, 1, 1, 20, 61, 20, 61, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 61, 20, 20, 20, 61, 20, 20, 20, 61, 20,
+ 61, 20, 61, 20, 20, 20, 20, 20, 20, 20, 884};
irsend.reset();
irsend.sendGC(gc_test, 37);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture));
EXPECT_EQ(JVC, irsend.capture.decode_type);
- EXPECT_EQ(JVC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kJvcBits, irsend.capture.bits);
EXPECT_EQ(0xC2B8, irsend.capture.value);
EXPECT_EQ(0x43, irsend.capture.address);
EXPECT_EQ(0x1D, irsend.capture.command);
@@ -193,7 +198,7 @@ TEST(TestDecodeJVC, DecodeWithNonStrictValues) {
irsend.sendJVC(0x0, 8); // Illegal value JVC 8-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, JVC_BITS, true));
+ ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, kJvcBits, true));
// Should pass if strict off.
ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, 8, false));
EXPECT_EQ(JVC, irsend.capture.decode_type);
@@ -206,7 +211,7 @@ TEST(TestDecodeJVC, DecodeWithNonStrictValues) {
irsend.sendJVC(0x12345678, 32); // Illegal value JVC 32-bit message.
irsend.makeDecodeResult();
// Should not pass with strict when we ask for less bits than we got.
- ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, JVC_BITS, true));
+ ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, kJvcBits, true));
irsend.makeDecodeResult();
// Should fail with strict when we ask for the wrong bit size.
@@ -225,7 +230,7 @@ TEST(TestDecodeJVC, DecodeWithNonStrictValues) {
irsend.makeDecodeResult();
// Shouldn't pass if strict off and the wrong expected bits.
- ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, JVC_BITS, false));
+ ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, kJvcBits, false));
// Re-decode with correct bit size.
ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, 36, true));
@@ -264,16 +269,17 @@ TEST(TestDecodeJVC, DecodeGlobalCacheExample) {
irsend.reset();
// JVC VCR Power On from Global Cache.
- uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 61, 20, 20, 20, 61, 20, 20, 20,
- 61, 20, 61, 20, 61, 20, 20, 20, 20, 20, 20, 20, 884};
- // 38000,1,37,320,161,21,59,21,59,21,19,21,19,21,19,21,19,21,59,21,19,21,59,21,59,21,19,21,59,21,19,21,19,21,19,21,19,21,838,21,59,21,59,21,19,21,19,21,19,21,19,21,59,21,19,21,59,21,19,21,59,21,59,21,59,21,19,21,19,21,19,21,850};
+ uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 61, 20,
+ 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
+ 61, 20, 20, 20, 20, 20, 20, 20, 884};
+ // 38000,1,37,320,161,21,59,21,59,21,19,21,19,21,19,21,19,21,59,21,19,21,59,21,59,21,19,21,59,21,19,21,19,21,19,21,19,21,838,21,59,21,59,21,19,21,19,21,19,21,19,21,59,21,19,21,59,21,19,21,59,21,59,21,59,21,19,21,19,21,19,21,850};
irsend.sendGC(gc_test, 39);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture));
EXPECT_EQ(JVC, irsend.capture.decode_type);
- EXPECT_EQ(JVC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kJvcBits, irsend.capture.bits);
EXPECT_EQ(0xC2B8, irsend.capture.value);
EXPECT_EQ(0x43, irsend.capture.address);
EXPECT_EQ(0x1D, irsend.capture.command);
@@ -288,12 +294,13 @@ TEST(TestDecodeJVC, FailToDecodeNonJVCExample) {
irsend.reset();
// Modified a few entries to unexpected values, based on previous test case.
- uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20, 20, 20, 20,
- 20, 20, 20, 127, 20, 61, 9, 20, 20, 61, 20, 20, 20,
- 61, 20, 61, 20, 61, 20, 20, 20, 20, 20, 20, 20, 884};
+ uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
+ 20, 20, 20, 20, 20, 20, 127, 20, 61, 9,
+ 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
+ 61, 20, 20, 20, 20, 20, 20, 20, 884};
irsend.sendGC(gc_test, 39);
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, JVC_BITS, false));
+ ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, kJvcBits, false));
}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Kelvinator_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Kelvinator_test.cpp
new file mode 100644
index 000000000000..001f8bcf242c
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Kelvinator_test.cpp
@@ -0,0 +1,518 @@
+// Copyright 2017 David Conran
+
+#include "ir_Kelvinator.h"
+#include "IRrecv.h"
+#include "IRrecv_test.h"
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests for sendKelvinator().
+
+// Test sending typical data only.
+TEST(TestSendKelvinator, SendDataOnly) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ uint8_t kelv_code[kKelvinatorStateLength] = {
+ 0x19, 0x0B, 0x80, 0x50, 0x00, 0x00, 0x00, 0xE0,
+ 0x19, 0x0B, 0x80, 0x70, 0x00, 0x00, 0x10, 0xf0};
+ irsend.reset();
+ irsend.sendKelvinator(kelv_code);
+ EXPECT_EQ(
+ "m9010s4505"
+ "m680s1530m680s510m680s510m680s1530m680s1530m680s510m680s510m680s510"
+ "m680s1530m680s1530m680s510m680s1530m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s1530"
+ "m680s510m680s510m680s510m680s510m680s1530m680s510m680s1530m680s510"
+ "m680s510m680s1530m680s510"
+ "m680s19975"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s1530m680s1530m680s1530"
+ "m680s39950"
+ "m9010s4505"
+ "m680s1530m680s510m680s510m680s1530m680s1530m680s510m680s510m680s510"
+ "m680s1530m680s1530m680s510m680s1530m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s1530"
+ "m680s510m680s510m680s510m680s510m680s1530m680s1530m680s1530m680s510"
+ "m680s510m680s1530m680s510"
+ "m680s19975"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s1530m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s1530m680s1530m680s1530m680s1530"
+ "m680s39950",
+ irsend.outputStr());
+}
+
+// Test sending with repeats.
+TEST(TestSendKelvinator, SendWithRepeats) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ uint8_t kelv_code[kKelvinatorStateLength] = {
+ 0x19, 0x0B, 0x80, 0x50, 0x00, 0x00, 0x00, 0xE0,
+ 0x19, 0x0B, 0x80, 0x70, 0x00, 0x00, 0x10, 0xf0};
+ irsend.reset();
+
+ irsend.sendKelvinator(kelv_code, kKelvinatorStateLength, 1);
+ EXPECT_EQ(
+ "m9010s4505"
+ "m680s1530m680s510m680s510m680s1530m680s1530m680s510m680s510m680s510"
+ "m680s1530m680s1530m680s510m680s1530m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s1530"
+ "m680s510m680s510m680s510m680s510m680s1530m680s510m680s1530m680s510"
+ "m680s510m680s1530m680s510"
+ "m680s19975"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s1530m680s1530m680s1530"
+ "m680s39950"
+ "m9010s4505"
+ "m680s1530m680s510m680s510m680s1530m680s1530m680s510m680s510m680s510"
+ "m680s1530m680s1530m680s510m680s1530m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s1530"
+ "m680s510m680s510m680s510m680s510m680s1530m680s1530m680s1530m680s510"
+ "m680s510m680s1530m680s510"
+ "m680s19975"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s1530m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s1530m680s1530m680s1530m680s1530"
+ "m680s39950"
+ "m9010s4505"
+ "m680s1530m680s510m680s510m680s1530m680s1530m680s510m680s510m680s510"
+ "m680s1530m680s1530m680s510m680s1530m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s1530"
+ "m680s510m680s510m680s510m680s510m680s1530m680s510m680s1530m680s510"
+ "m680s510m680s1530m680s510"
+ "m680s19975"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s1530m680s1530m680s1530"
+ "m680s39950"
+ "m9010s4505"
+ "m680s1530m680s510m680s510m680s1530m680s1530m680s510m680s510m680s510"
+ "m680s1530m680s1530m680s510m680s1530m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s1530"
+ "m680s510m680s510m680s510m680s510m680s1530m680s1530m680s1530m680s510"
+ "m680s510m680s1530m680s510"
+ "m680s19975"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s1530m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s1530m680s1530m680s1530m680s1530"
+ "m680s39950",
+ irsend.outputStr());
+}
+
+// Test sending atypical sizes.
+TEST(TestSendKelvinator, SendUnexpectedSizes) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ uint8_t kelv_short_code[15] = {0x19, 0x0B, 0x80, 0x50, 0x00, 0x00, 0x00, 0xE0,
+ 0x19, 0x0B, 0x80, 0x70, 0x00, 0x00, 0x10};
+ uint8_t kelv_long_code[17] = {0x19, 0x0B, 0x80, 0x50, 0x00, 0x00,
+ 0x00, 0xE0, 0x19, 0x0B, 0x80, 0x70,
+ 0x00, 0x00, 0x10, 0xf0, 0x00};
+ irsend.reset();
+ irsend.sendKelvinator(kelv_short_code, 15);
+ ASSERT_EQ("", irsend.outputStr());
+
+ irsend.reset();
+ // Shouldn't be different from the SendDataOnly. We just don't send the
+ // extra data.
+ irsend.sendKelvinator(kelv_long_code, 17);
+ ASSERT_EQ(
+ "m9010s4505"
+ "m680s1530m680s510m680s510m680s1530m680s1530m680s510m680s510m680s510"
+ "m680s1530m680s1530m680s510m680s1530m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s1530"
+ "m680s510m680s510m680s510m680s510m680s1530m680s510m680s1530m680s510"
+ "m680s510m680s1530m680s510"
+ "m680s19975"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s1530m680s1530m680s1530"
+ "m680s39950"
+ "m9010s4505"
+ "m680s1530m680s510m680s510m680s1530m680s1530m680s510m680s510m680s510"
+ "m680s1530m680s1530m680s510m680s1530m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s1530"
+ "m680s510m680s510m680s510m680s510m680s1530m680s1530m680s1530m680s510"
+ "m680s510m680s1530m680s510"
+ "m680s19975"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s1530m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s1530m680s1530m680s1530m680s1530"
+ "m680s39950",
+ irsend.outputStr());
+}
+
+// Tests for IRKelvinatorAC class.
+
+TEST(TestKelvinatorClass, Power) {
+ IRKelvinatorAC irkelv(0);
+ irkelv.begin();
+
+ irkelv.on();
+ EXPECT_TRUE(irkelv.getPower());
+
+ irkelv.off();
+ EXPECT_FALSE(irkelv.getPower());
+
+ irkelv.setPower(true);
+ EXPECT_TRUE(irkelv.getPower());
+
+ irkelv.setPower(false);
+ EXPECT_FALSE(irkelv.getPower());
+}
+
+TEST(TestKelvinatorClass, Temperature) {
+ IRKelvinatorAC irkelv(0);
+ irkelv.begin();
+
+ irkelv.setTemp(0);
+ EXPECT_EQ(kKelvinatorMinTemp, irkelv.getTemp());
+
+ irkelv.setTemp(255);
+ EXPECT_EQ(kKelvinatorMaxTemp, irkelv.getTemp());
+
+ irkelv.setTemp(kKelvinatorMinTemp);
+ EXPECT_EQ(kKelvinatorMinTemp, irkelv.getTemp());
+
+ irkelv.setTemp(kKelvinatorMaxTemp);
+ EXPECT_EQ(kKelvinatorMaxTemp, irkelv.getTemp());
+
+ irkelv.setTemp(kKelvinatorMinTemp - 1);
+ EXPECT_EQ(kKelvinatorMinTemp, irkelv.getTemp());
+
+ irkelv.setTemp(kKelvinatorMaxTemp + 1);
+ EXPECT_EQ(kKelvinatorMaxTemp, irkelv.getTemp());
+
+ irkelv.setTemp(17);
+ EXPECT_EQ(17, irkelv.getTemp());
+
+ irkelv.setTemp(21);
+ EXPECT_EQ(21, irkelv.getTemp());
+
+ irkelv.setTemp(25);
+ EXPECT_EQ(25, irkelv.getTemp());
+
+ irkelv.setTemp(29);
+ EXPECT_EQ(29, irkelv.getTemp());
+}
+
+TEST(TestKelvinatorClass, OperatingMode) {
+ IRKelvinatorAC irkelv(0);
+ irkelv.begin();
+
+ irkelv.setTemp(24);
+ irkelv.setMode(kKelvinatorAuto);
+ EXPECT_EQ(kKelvinatorAuto, irkelv.getMode());
+ EXPECT_EQ(kKelvinatorAutoTemp, irkelv.getTemp());
+
+ irkelv.setMode(kKelvinatorCool);
+ EXPECT_EQ(kKelvinatorCool, irkelv.getMode());
+
+ irkelv.setMode(kKelvinatorHeat);
+ EXPECT_EQ(kKelvinatorHeat, irkelv.getMode());
+
+ irkelv.setTemp(24);
+ irkelv.setMode(kKelvinatorDry);
+ EXPECT_EQ(kKelvinatorDry, irkelv.getMode());
+ EXPECT_EQ(kKelvinatorAutoTemp, irkelv.getTemp());
+
+ irkelv.setMode(kKelvinatorFan);
+ EXPECT_EQ(kKelvinatorFan, irkelv.getMode());
+
+ irkelv.setMode(kKelvinatorHeat + 1);
+ EXPECT_EQ(kKelvinatorAuto, irkelv.getMode());
+
+ irkelv.setMode(255);
+ EXPECT_EQ(kKelvinatorAuto, irkelv.getMode());
+}
+
+TEST(TestKelvinatorClass, VaneSwing) {
+ IRKelvinatorAC irkelv(0);
+ irkelv.begin();
+
+ irkelv.setSwingHorizontal(true);
+ irkelv.setSwingVertical(false);
+
+ irkelv.setSwingHorizontal(true);
+ EXPECT_TRUE(irkelv.getSwingHorizontal());
+ EXPECT_FALSE(irkelv.getSwingVertical());
+
+ irkelv.setSwingVertical(true);
+ EXPECT_TRUE(irkelv.getSwingHorizontal());
+ EXPECT_TRUE(irkelv.getSwingVertical());
+
+ irkelv.setSwingHorizontal(false);
+ EXPECT_FALSE(irkelv.getSwingHorizontal());
+ EXPECT_TRUE(irkelv.getSwingVertical());
+
+ irkelv.setSwingVertical(false);
+ EXPECT_FALSE(irkelv.getSwingHorizontal());
+ EXPECT_FALSE(irkelv.getSwingVertical());
+}
+
+TEST(TestKelvinatorClass, QuietMode) {
+ IRKelvinatorAC irkelv(0);
+ irkelv.begin();
+
+ irkelv.setQuiet(true);
+ EXPECT_TRUE(irkelv.getQuiet());
+
+ irkelv.setQuiet(false);
+ EXPECT_FALSE(irkelv.getQuiet());
+
+ irkelv.setQuiet(true);
+ EXPECT_TRUE(irkelv.getQuiet());
+}
+
+TEST(TestKelvinatorClass, IonFilter) {
+ IRKelvinatorAC irkelv(0);
+ irkelv.begin();
+
+ irkelv.setIonFilter(true);
+ EXPECT_TRUE(irkelv.getIonFilter());
+
+ irkelv.setIonFilter(false);
+ EXPECT_FALSE(irkelv.getIonFilter());
+
+ irkelv.setIonFilter(true);
+ EXPECT_TRUE(irkelv.getIonFilter());
+}
+
+TEST(TestKelvinatorClass, Light) {
+ IRKelvinatorAC irkelv(0);
+ irkelv.begin();
+
+ irkelv.setLight(true);
+ EXPECT_TRUE(irkelv.getLight());
+
+ irkelv.setLight(false);
+ EXPECT_FALSE(irkelv.getLight());
+
+ irkelv.setLight(true);
+ EXPECT_TRUE(irkelv.getLight());
+}
+
+TEST(TestKelvinatorClass, XFan) {
+ IRKelvinatorAC irkelv(0);
+ irkelv.begin();
+
+ irkelv.setXFan(true);
+ EXPECT_TRUE(irkelv.getXFan());
+
+ irkelv.setXFan(false);
+ EXPECT_FALSE(irkelv.getXFan());
+
+ irkelv.setXFan(true);
+ EXPECT_TRUE(irkelv.getXFan());
+}
+
+TEST(TestKelvinatorClass, TurboFan) {
+ IRKelvinatorAC irkelv(0);
+ irkelv.begin();
+
+ irkelv.setTurbo(true);
+ EXPECT_TRUE(irkelv.getTurbo());
+
+ irkelv.setTurbo(false);
+ EXPECT_FALSE(irkelv.getTurbo());
+
+ irkelv.setFan(2);
+ irkelv.setTurbo(true);
+ EXPECT_TRUE(irkelv.getTurbo());
+
+ // Turbo mode is turned off if the temperature is changed.
+ irkelv.setFan(3);
+ EXPECT_FALSE(irkelv.getTurbo());
+
+ // But only when it is changed, not set to the same value again.
+ irkelv.setTurbo(true);
+ irkelv.setFan(3);
+ EXPECT_TRUE(irkelv.getTurbo());
+}
+
+TEST(TestKelvinatorClass, FanSpeed) {
+ IRKelvinatorAC irkelv(0);
+ irkelv.begin();
+
+ irkelv.setFan(0);
+ EXPECT_EQ(0, irkelv.getFan());
+
+ irkelv.setFan(255);
+ EXPECT_EQ(kKelvinatorFanMax, irkelv.getFan());
+
+ irkelv.setFan(kKelvinatorFanMax);
+ EXPECT_EQ(kKelvinatorFanMax, irkelv.getFan());
+
+ irkelv.setFan(kKelvinatorFanMax + 1);
+ EXPECT_EQ(kKelvinatorFanMax, irkelv.getFan());
+
+ irkelv.setFan(kKelvinatorFanMax - 1);
+ EXPECT_EQ(kKelvinatorFanMax - 1, irkelv.getFan());
+
+ irkelv.setFan(1);
+ EXPECT_EQ(1, irkelv.getFan());
+
+ irkelv.setFan(1);
+ EXPECT_EQ(1, irkelv.getFan());
+
+ irkelv.setFan(3);
+ EXPECT_EQ(3, irkelv.getFan());
+}
+
+TEST(TestKelvinatorClass, Checksums) {
+ uint8_t kelv_code[kKelvinatorStateLength] = {
+ 0x19, 0x0B, 0x80, 0x50, 0x00, 0x00, 0x00, 0xE0,
+ 0x19, 0x0B, 0x80, 0x70, 0x00, 0x00, 0x10, 0xf0};
+
+ EXPECT_TRUE(IRKelvinatorAC::validChecksum(kelv_code));
+ // Change the array so the checksum is invalid.
+ kelv_code[0] ^= 0xFF;
+ EXPECT_FALSE(IRKelvinatorAC::validChecksum(kelv_code));
+ // Restore the previous change, and change another byte.
+ kelv_code[0] ^= 0xFF;
+ kelv_code[4] ^= 0xFF;
+ EXPECT_FALSE(IRKelvinatorAC::validChecksum(kelv_code));
+ kelv_code[4] ^= 0xFF;
+ // Change something in the 2nd block.
+ kelv_code[10] ^= 0xFF;
+ EXPECT_FALSE(IRKelvinatorAC::validChecksum(kelv_code));
+ kelv_code[10] ^= 0xFF;
+ EXPECT_TRUE(IRKelvinatorAC::validChecksum(kelv_code));
+}
+
+TEST(TestKelvinatorClass, SetAndGetRaw) {
+ IRKelvinatorAC irkelv(0);
+ uint8_t initialState[kKelvinatorStateLength] = {
+ 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0xA0,
+ 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xA0};
+ uint8_t expectedState[kKelvinatorStateLength] = {
+ 0x08, 0x05, 0x20, 0x50, 0x00, 0x00, 0x00, 0x70,
+ 0x08, 0x05, 0x20, 0x70, 0x00, 0x00, 0x00, 0x70};
+
+ EXPECT_STATE_EQ(initialState, irkelv.getRaw(), kKelvinatorBits);
+ // toggle the power state.
+ irkelv.setPower(!irkelv.getPower());
+ irkelv.setTemp(21);
+ irkelv.setLight(true);
+ EXPECT_STATE_EQ(expectedState, irkelv.getRaw(), kKelvinatorBits);
+ irkelv.setRaw(initialState);
+ EXPECT_STATE_EQ(initialState, irkelv.getRaw(), kKelvinatorBits);
+}
+
+TEST(TestKelvinatorClass, HumanReadable) {
+ IRKelvinatorAC irkelv(0);
+
+ EXPECT_EQ(
+ "Power: Off, Mode: 0 (AUTO), Temp: 16C, Fan: 0 (AUTO), Turbo: Off, "
+ "Quiet: Off, XFan: Off, IonFilter: Off, Light: Off, "
+ "Swing (Horizontal): Off, Swing (Vertical): Off",
+ irkelv.toString());
+ irkelv.on();
+ irkelv.setMode(kKelvinatorCool);
+ irkelv.setTemp(25);
+ irkelv.setFan(kKelvinatorFanMax);
+ irkelv.setXFan(true);
+ irkelv.setIonFilter(true);
+ irkelv.setLight(true);
+ irkelv.setSwingHorizontal(true);
+ EXPECT_EQ(
+ "Power: On, Mode: 1 (COOL), Temp: 25C, Fan: 5 (MAX), Turbo: Off, "
+ "Quiet: Off, XFan: On, IonFilter: On, Light: On, "
+ "Swing (Horizontal): On, Swing (Vertical): Off",
+ irkelv.toString());
+}
+
+TEST(TestKelvinatorClass, MessageConstuction) {
+ IRKelvinatorAC irkelv(0);
+ IRsendTest irsend(4);
+ irkelv.begin();
+ irsend.begin();
+
+ irkelv.setFan(1);
+ irkelv.setMode(kKelvinatorCool);
+ irkelv.setTemp(27);
+ irkelv.setSwingVertical(false);
+ irkelv.setSwingHorizontal(true);
+ irkelv.setIonFilter(true);
+ irkelv.setQuiet(false);
+ irkelv.setLight(false);
+ irkelv.setPower(true);
+ irkelv.setTurbo(false);
+ irkelv.setXFan(true);
+
+ // Check everything for kicks.
+ EXPECT_EQ(1, irkelv.getFan());
+ EXPECT_EQ(kKelvinatorCool, irkelv.getMode());
+ EXPECT_EQ(27, irkelv.getTemp());
+ EXPECT_FALSE(irkelv.getSwingVertical());
+ EXPECT_TRUE(irkelv.getSwingHorizontal());
+ EXPECT_TRUE(irkelv.getIonFilter());
+ EXPECT_FALSE(irkelv.getQuiet());
+ EXPECT_FALSE(irkelv.getLight());
+ EXPECT_TRUE(irkelv.getPower());
+ EXPECT_FALSE(irkelv.getTurbo());
+ EXPECT_TRUE(irkelv.getXFan());
+
+ irsend.reset();
+ irsend.sendKelvinator(irkelv.getRaw());
+ EXPECT_EQ(
+ "m9010s4505"
+ "m680s1530m680s510m680s510m680s1530m680s1530m680s510m680s1530m680s510"
+ "m680s1530m680s1530m680s510m680s1530m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s1530m680s1530"
+ "m680s510m680s510m680s510m680s510m680s1530m680s510m680s1530m680s510"
+ "m680s510m680s1530m680s510"
+ "m680s19975"
+ "m680s510m680s510m680s510m680s510m680s1530m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s1530m680s1530m680s1530m680s1530"
+ "m680s39950"
+ "m9010s4505"
+ "m680s1530m680s510m680s510m680s1530m680s1530m680s510m680s1530m680s510"
+ "m680s1530m680s1530m680s510m680s1530m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s1530m680s1530"
+ "m680s510m680s510m680s510m680s510m680s1530m680s1530m680s1530m680s510"
+ "m680s510m680s1530m680s510"
+ "m680s19975"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s510m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s1530m680s510m680s510m680s510"
+ "m680s510m680s510m680s510m680s510m680s1530m680s1530m680s1530m680s1530"
+ "m680s39950",
+ irsend.outputStr());
+}
+
+// Decode a synthetic Kelvinator message.
+TEST(TestDecodeKelvinator, NormalSynthetic) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ uint8_t kelv_code[kKelvinatorStateLength] = {
+ 0x19, 0x0B, 0x80, 0x50, 0x00, 0x00, 0x00, 0xE0,
+ 0x19, 0x0B, 0x80, 0x70, 0x00, 0x00, 0x10, 0xf0};
+ irsend.reset();
+ irsend.sendKelvinator(kelv_code);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(KELVINATOR, irsend.capture.decode_type);
+ ASSERT_EQ(kKelvinatorBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(kelv_code, irsend.capture.state, kKelvinatorBits);
+}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_LG_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_LG_test.cpp
similarity index 63%
rename from lib/IRremoteESP8266-2.2.1.02/test/ir_LG_test.cpp
rename to lib/IRremoteESP8266-2.5.2.03/test/ir_LG_test.cpp
index fbdaf7126408..8ab24a7319e8 100644
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_LG_test.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_LG_test.cpp
@@ -1,8 +1,8 @@
// Copyright 2017 David Conran
+#include "ir_LG.h"
#include "IRsend.h"
#include "IRsend_test.h"
-#include "ir_LG.h"
#include "gtest/gtest.h"
// Tests for calcLGChecksum()
@@ -30,23 +30,25 @@ TEST(TestSendLG, SendDataOnly) {
irsend.reset();
irsend.sendLG(0x4B4AE51);
EXPECT_EQ(
- "m8000s4000"
+ "m8500s4250"
"m550s550m550s1600m550s550m550s550"
"m550s1600m550s550m550s1600m550s1600m550s550m550s1600m550s550m550s550"
"m550s1600m550s550m550s1600m550s550m550s1600m550s1600m550s1600m550s550"
"m550s550m550s1600m550s550m550s1600m550s550m550s550m550s550m550s1600"
- "m550s108050", irsend.outputStr());
+ "m550s50300",
+ irsend.outputStr());
irsend.reset();
- irsend.sendLG(0xB4B4AE51, LG32_BITS);
+ irsend.sendLG(0xB4B4AE51, kLg32Bits);
EXPECT_EQ(
"m4480s4480"
"m560s1680m560s560m560s1680m560s1680m560s560m560s1680m560s560m560s560"
"m560s1680m560s560m560s1680m560s1680m560s560m560s1680m560s560m560s560"
"m560s1680m560s560m560s1680m560s560m560s1680m560s1680m560s1680m560s560"
"m560s560m560s1680m560s560m560s1680m560s560m560s560m560s560m560s1680"
- "m560s108080"
- "m8950s2250m550s108050", irsend.outputStr());
+ "m560s44800"
+ "m8950s2250m550s96300",
+ irsend.outputStr());
}
// Test sending with different repeats.
@@ -55,43 +57,46 @@ TEST(TestSendLG, SendWithRepeats) {
irsend.begin();
irsend.reset();
- irsend.sendLG(0x4B4AE51, LG_BITS, 1);
+ irsend.sendLG(0x4B4AE51, kLgBits, 1);
EXPECT_EQ(
- "m8000s4000"
+ "m8500s4250"
"m550s550m550s1600m550s550m550s550"
"m550s1600m550s550m550s1600m550s1600m550s550m550s1600m550s550m550s550"
"m550s1600m550s550m550s1600m550s550m550s1600m550s1600m550s1600m550s550"
"m550s550m550s1600m550s550m550s1600m550s550m550s550m550s550m550s1600"
- "m550s108050"
- "m8000s2250m550s108050", irsend.outputStr());
+ "m550s50300"
+ "m8500s2250m550s96750",
+ irsend.outputStr());
irsend.reset();
- irsend.sendLG(0xB4B4AE51, LG32_BITS, 1);
+ irsend.sendLG(0xB4B4AE51, kLg32Bits, 1);
EXPECT_EQ(
"m4480s4480"
"m560s1680m560s560m560s1680m560s1680m560s560m560s1680m560s560m560s560"
"m560s1680m560s560m560s1680m560s1680m560s560m560s1680m560s560m560s560"
"m560s1680m560s560m560s1680m560s560m560s1680m560s1680m560s1680m560s560"
"m560s560m560s1680m560s560m560s1680m560s560m560s560m560s560m560s1680"
- "m560s108080"
- "m8950s2250m550s108050"
- "m8950s2250m550s108050", irsend.outputStr());
+ "m560s44800"
+ "m8950s2250m550s96300"
+ "m8950s2250m550s96300",
+ irsend.outputStr());
}
// Test sending an atypical data size.
-TEST(TestSendLG, SendUsualSize) {
+TEST(TestSendLG, SendUnusualSize) {
IRsendTest irsend(4);
irsend.begin();
irsend.reset();
irsend.sendLG(0x0, 31);
EXPECT_EQ(
- "m8000s4000"
+ "m8500s4250"
"m550s550m550s550m550s550m550s550m550s550m550s550m550s550m550s550"
"m550s550m550s550m550s550m550s550m550s550m550s550m550s550m550s550"
"m550s550m550s550m550s550m550s550m550s550m550s550m550s550m550s550"
"m550s550m550s550m550s550m550s550m550s550m550s550m550s550"
- "m550s108050", irsend.outputStr());
+ "m550s60650",
+ irsend.outputStr());
irsend.reset();
irsend.sendLG(0x0, 64);
@@ -105,8 +110,9 @@ TEST(TestSendLG, SendUsualSize) {
"m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
"m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
"m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s108080"
- "m8950s2250m550s108050", irsend.outputStr());
+ "m560s26880"
+ "m8950s2250m550s96300",
+ irsend.outputStr());
}
// Tests for encodeLG().
@@ -132,11 +138,11 @@ TEST(TestDecodeLG, NormalDecodeWithStrict) {
// Normal LG 28-bit message.
irsend.reset();
- irsend.sendLG(0x4B4AE51, LG_BITS);
+ irsend.sendLG(0x4B4AE51, kLgBits);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, LG_BITS, true));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kLgBits, true));
EXPECT_EQ(LG, irsend.capture.decode_type);
- EXPECT_EQ(LG_BITS, irsend.capture.bits);
+ EXPECT_EQ(kLgBits, irsend.capture.bits);
EXPECT_EQ(0x4B4AE51, irsend.capture.value);
EXPECT_EQ(0x4B, irsend.capture.address);
EXPECT_EQ(0x4AE5, irsend.capture.command);
@@ -144,11 +150,11 @@ TEST(TestDecodeLG, NormalDecodeWithStrict) {
// Normal LG 32-bit message.
irsend.reset();
- irsend.sendLG(0xB4B4AE51, LG32_BITS);
+ irsend.sendLG(0xB4B4AE51, kLg32Bits);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, LG32_BITS, false));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kLg32Bits, false));
EXPECT_EQ(LG, irsend.capture.decode_type);
- EXPECT_EQ(LG32_BITS, irsend.capture.bits);
+ EXPECT_EQ(kLg32Bits, irsend.capture.bits);
EXPECT_EQ(0xB4B4AE51, irsend.capture.value);
EXPECT_EQ(0xB4B, irsend.capture.address);
EXPECT_EQ(0x4AE5, irsend.capture.command);
@@ -158,9 +164,9 @@ TEST(TestDecodeLG, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendLG(irsend.encodeLG(0x07, 0x99));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, LG_BITS, true));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kLgBits, true));
EXPECT_EQ(LG, irsend.capture.decode_type);
- EXPECT_EQ(LG_BITS, irsend.capture.bits);
+ EXPECT_EQ(kLgBits, irsend.capture.bits);
EXPECT_EQ(0x700992, irsend.capture.value);
EXPECT_EQ(0x07, irsend.capture.address);
EXPECT_EQ(0x99, irsend.capture.command);
@@ -168,11 +174,11 @@ TEST(TestDecodeLG, NormalDecodeWithStrict) {
// Synthesised Normal LG 32-bit message.
irsend.reset();
- irsend.sendLG(irsend.encodeLG(0x800, 0x8000), LG32_BITS);
+ irsend.sendLG(irsend.encodeLG(0x800, 0x8000), kLg32Bits);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, LG32_BITS, true));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kLg32Bits, true));
EXPECT_EQ(LG, irsend.capture.decode_type);
- EXPECT_EQ(LG32_BITS, irsend.capture.bits);
+ EXPECT_EQ(kLg32Bits, irsend.capture.bits);
EXPECT_EQ(0x80080008, irsend.capture.value);
EXPECT_EQ(0x800, irsend.capture.address);
EXPECT_EQ(0x8000, irsend.capture.command);
@@ -187,11 +193,11 @@ TEST(TestDecodeLG, NormalDecodeWithRepeatAndStrict) {
// Normal LG 28-bit message with 2 repeats.
irsend.reset();
- irsend.sendLG(irsend.encodeLG(0x07, 0x99), LG_BITS, 2);
+ irsend.sendLG(irsend.encodeLG(0x07, 0x99), kLgBits, 2);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, LG_BITS, true));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kLgBits, true));
EXPECT_EQ(LG, irsend.capture.decode_type);
- EXPECT_EQ(LG_BITS, irsend.capture.bits);
+ EXPECT_EQ(kLgBits, irsend.capture.bits);
EXPECT_EQ(0x700992, irsend.capture.value);
EXPECT_EQ(0x07, irsend.capture.address);
EXPECT_EQ(0x99, irsend.capture.command);
@@ -199,11 +205,11 @@ TEST(TestDecodeLG, NormalDecodeWithRepeatAndStrict) {
// Normal LG 32-bit message with 2 repeats.
irsend.reset();
- irsend.sendLG(irsend.encodeLG(0x07, 0x99), LG32_BITS, 2);
+ irsend.sendLG(irsend.encodeLG(0x07, 0x99), kLg32Bits, 2);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, LG32_BITS, true));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kLg32Bits, true));
EXPECT_EQ(LG, irsend.capture.decode_type);
- EXPECT_EQ(LG32_BITS, irsend.capture.bits);
+ EXPECT_EQ(kLg32Bits, irsend.capture.bits);
EXPECT_EQ(0x700992, irsend.capture.value);
EXPECT_EQ(0x07, irsend.capture.address);
EXPECT_EQ(0x99, irsend.capture.command);
@@ -221,30 +227,30 @@ TEST(TestDecodeLG, DecodeWithNonStrictValues) {
irsend.reset();
irsend.sendLG(0x1);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, LG_BITS, true));
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, LG32_BITS, true));
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, LG32_BITS, false));
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, LG_BITS, false));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLgBits, true));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLg32Bits, true));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLg32Bits, false));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kLgBits, false));
// Illegal LG 32-bit message value.
irsend.reset();
- irsend.sendLG(0x1111111, LG32_BITS);
+ irsend.sendLG(0x1111111, kLg32Bits);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, LG32_BITS, true));
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, LG_BITS, true));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLg32Bits, true));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLgBits, true));
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, LG32_BITS, false));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kLg32Bits, false));
EXPECT_EQ(LG, irsend.capture.decode_type);
- EXPECT_EQ(LG32_BITS, irsend.capture.bits);
+ EXPECT_EQ(kLg32Bits, irsend.capture.bits);
EXPECT_EQ(0x1111111, irsend.capture.value);
EXPECT_EQ(0x11, irsend.capture.address);
EXPECT_EQ(0x1111, irsend.capture.command);
EXPECT_FALSE(irsend.capture.repeat);
irsend.reset();
- irsend.sendLG(0x1111111, LG32_BITS);
+ irsend.sendLG(0x1111111, kLg32Bits);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, LG_BITS, false));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLgBits, false));
}
// Decode unsupported LG message sizes.
@@ -259,10 +265,10 @@ TEST(TestDecodeLG, DecodeWithNonStrictSizes) {
irsend.sendLG(irsend.encodeLG(0x07, 0x99), 16);
irsend.makeDecodeResult();
// Should fail when unexpected against different bit sizes.
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, LG_BITS, true));
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, LG32_BITS, true));
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, LG_BITS, false));
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, LG32_BITS, false));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLgBits, true));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLg32Bits, true));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLgBits, false));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLg32Bits, false));
// Should pass if strict off.
ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, 16, false));
@@ -277,10 +283,10 @@ TEST(TestDecodeLG, DecodeWithNonStrictSizes) {
irsend.sendLG(0x123456789, 36); // Illegal value LG 36-bit message.
irsend.makeDecodeResult();
// Should fail when unexpected against different bit sizes.
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, LG_BITS, true));
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, LG_BITS, false));
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, LG32_BITS, true));
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, LG32_BITS, false));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLgBits, true));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLgBits, false));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLg32Bits, true));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLg32Bits, false));
ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, 36, false));
EXPECT_EQ(LG, irsend.capture.decode_type);
@@ -317,22 +323,21 @@ TEST(TestDecodeLG, DecodeGlobalCacheExample) {
IRrecv irrecv(4);
irsend.begin();
-// TODO(anyone): Find a Global Cache example of the LG 28-bit message.
+ // TODO(anyone): Find a Global Cache example of the LG 28-bit message.
irsend.reset();
// LG (32-bit) code from Global Cache.
- uint16_t gc_test[75] = {38000, 1, 69, 341, 170, 21, 64, 21, 21, 21, 64,
- 21, 64, 21, 21, 21, 64, 21, 21, 21, 21, 21, 64,
- 21, 21, 21, 64, 21, 64, 21, 21, 21, 64, 21, 21,
- 21, 21, 21, 64, 21, 21, 21, 64, 21, 21, 21, 64,
- 21, 64, 21, 64, 21, 21, 21, 21, 21, 64, 21, 21,
- 21, 64, 21, 21, 21, 21, 21, 21, 21, 64, 21, 1517,
- 341, 85, 21, 3655};
+ uint16_t gc_test[75] = {
+ 38000, 1, 69, 341, 170, 21, 64, 21, 21, 21, 64, 21, 64, 21, 21,
+ 21, 64, 21, 21, 21, 21, 21, 64, 21, 21, 21, 64, 21, 64, 21,
+ 21, 21, 64, 21, 21, 21, 21, 21, 64, 21, 21, 21, 64, 21, 21,
+ 21, 64, 21, 64, 21, 64, 21, 21, 21, 21, 21, 64, 21, 21, 21,
+ 64, 21, 21, 21, 21, 21, 21, 21, 64, 21, 1517, 341, 85, 21, 3655};
irsend.sendGC(gc_test, 75);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, LG32_BITS, true));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kLg32Bits, true));
EXPECT_EQ(LG, irsend.capture.decode_type);
- EXPECT_EQ(LG32_BITS, irsend.capture.bits);
+ EXPECT_EQ(kLg32Bits, irsend.capture.bits);
EXPECT_EQ(0xB4B4AE51, irsend.capture.value);
EXPECT_EQ(0xB4B, irsend.capture.address);
EXPECT_EQ(0x4AE5, irsend.capture.command);
@@ -347,12 +352,71 @@ TEST(TestDecodeLG, FailToDecodeNonLGExample) {
irsend.reset();
// Modified a few entries to unexpected values, based on previous test case.
- uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20, 20, 20, 20,
- 20, 20, 20, 127, 20, 61, 9, 20, 20, 61, 20, 20, 20,
- 61, 20, 61, 20, 61, 20, 20, 20, 20, 20, 20, 20, 884};
+ uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
+ 20, 20, 20, 20, 20, 20, 127, 20, 61, 9,
+ 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
+ 61, 20, 20, 20, 20, 20, 20, 20, 884};
irsend.sendGC(gc_test, 39);
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeLG(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, LG_BITS, false));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLgBits, false));
+}
+
+// Tests for sendLG2().
+
+// Test sending typical data only.
+TEST(TestSendLG2, SendDataOnly) {
+ IRsendTest irsend(0);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendLG2(0x880094D);
+ EXPECT_EQ(
+ "m3200s9850"
+ "m550s1600m550s550m550s550m550s550m550s1600m550s550m550s550m550s550"
+ "m550s550m550s550m550s550m550s550m550s550m550s550m550s550m550s550"
+ "m550s1600m550s550m550s550m550s1600m550s550m550s1600m550s550m550s550"
+ "m550s1600m550s1600m550s550m550s1600"
+ "m550s55250",
+ irsend.outputStr());
+}
+
+TEST(TestDecodeLG2, SyntheticExample) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendLG2(0x880094D);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture));
+ ASSERT_EQ(LG2, irsend.capture.decode_type);
+ EXPECT_EQ(kLgBits, irsend.capture.bits);
+ EXPECT_EQ(0x880094D, irsend.capture.value);
+}
+
+// Verify decoding of LG variant 2 messages.
+TEST(TestDecodeLG2, RealLG2Example) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ // From issue #548
+ uint16_t rawData[59] = {
+ 3154, 9834, 520, 1634, 424, 606, 424, 568, 462, 570, 462, 1564,
+ 508, 568, 458, 544, 500, 546, 508, 530, 508, 532, 506, 566,
+ 464, 568, 460, 578, 464, 568, 464, 532, 506, 552, 474, 1592,
+ 506, 568, 460, 570, 462, 1564, 506, 606, 424, 1640, 424, 616,
+ 422, 570, 462, 1616, 460, 1584, 500, 544, 506, 1598, 490}; // UNKNOWN
+ // F6D13AE8
+ irsend.sendRaw(rawData, 59, 38000);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture));
+ ASSERT_EQ(LG2, irsend.capture.decode_type);
+ EXPECT_EQ(kLgBits, irsend.capture.bits);
+ EXPECT_EQ(0x880094D, irsend.capture.value);
}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Lasertag_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Lasertag_test.cpp
new file mode 100644
index 000000000000..041109fb8e59
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Lasertag_test.cpp
@@ -0,0 +1,342 @@
+// Copyright 2017 David Conran
+
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// LL AAA SSSSS EEEEEEE RRRRRR TTTTTTT AAA GGGG
+// LL AAAAA SS EE RR RR TTT AAAAA GG GG
+// LL AA AA SSSSS EEEEE RRRRRR TTT AA AA GG
+// LL AAAAAAA SS EE RR RR TTT AAAAAAA GG GG
+// LLLLLLL AA AA SSSSS EEEEEEE RR RR TTT AA AA GGGGGG
+
+// Tests for sendLasertag().
+
+// Test sending simplest case data only.
+TEST(TestSendLasertag, SendDataOnly) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendLasertag(0x1); // Red 1
+ EXPECT_EQ(
+ "m333s333m333s333m333s333m333s333m333s333m333s333m333s333m333s333m333"
+ "s333m333s333m333s333m333s666m333s100000",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendLasertag(0x2); // Red 2
+ EXPECT_EQ(
+ "m333s333m333s333m333s333m333s333m333s333m333s333m333s333"
+ "m333s333m333s333m333s333m333s666m666s100333",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendLasertag(0x51); // Green 1
+ // Raw: (21)
+ // m364s364m332s336m384s276m332s364m332s304m416s584m692s724m640s360m304s332m392s612m380,
+ EXPECT_EQ(
+ // m364s364m332s336m384s276m332s364m332s304m416s584
+ // m692s724m640s360m304s332m392s612m380
+ "m333s333m333s333m333s333m333s333m333s333m333s666"
+ "m666s666m666s333m333s333m333s666m333s100000",
+ irsend.outputStr());
+
+ irsend.reset();
+ // Raw: (19)
+ // m332s308m412s280m360s336m332s304m444s248m332s644m744s612m696s692m668s636m360
+ irsend.sendLasertag(0x55); // Green 5
+ EXPECT_EQ(
+ // m332s308m412s280m360s336m332s304m444s248m332s644
+ // m744s612m696s692m668s636m360
+ "m333s333m333s333m333s333m333s333m333s333m333s666"
+ "m666s666m666s666m666s666m333s100000",
+ irsend.outputStr());
+}
+
+TEST(TestSendLasertag, SendDataWithRepeat) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendLasertag(0x1, kLasertagBits, 1); // Red 1, one repeat.
+ EXPECT_EQ(
+ "m333s333m333s333m333s333m333s333m333s333m333s333m333s333m333s333"
+ "m333s333m333s333m333s333m333s666m333s100000"
+ "m333s333m333s333m333s333m333s333m333s333m333s333m333s333m333s333"
+ "m333s333m333s333m333s333m333s666m333s100000",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendLasertag(0x52, kLasertagBits, 2); // Green 2, two repeats.
+ EXPECT_EQ(
+ "m333s333m333s333m333s333m333s333m333s333m333s666m666s666m666s333"
+ "m333s666m666s100333"
+ "m333s333m333s333m333s333m333s333m333s333m333s666m666s666m666s333"
+ "m333s666m666s100333"
+ "m333s333m333s333m333s333m333s333m333s333m333s666m666s666m666s333"
+ "m333s666m666s100333",
+ irsend.outputStr());
+}
+
+TEST(TestSendLasertag, SmallestMessageSize) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendLasertag(0x1555); // Alternating bit pattern will be the smallest.
+ // i.e. 7 actual 'mark' pulses, which is a rawlen of 13.
+ EXPECT_EQ("m0s333m666s666m666s666m666s666m666s666m666s666m666s666m333s100000",
+ irsend.outputStr());
+}
+
+// Tests for decodeLasertag().
+
+// Decode normal Lasertag messages.
+TEST(TestDecodeLasertag, NormalSyntheticDecodeWithStrict) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ // Normal Lasertag 13-bit message.
+ irsend.reset();
+ irsend.sendLasertag(0x01); // Red 1
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(LASERTAG, irsend.capture.decode_type);
+ EXPECT_EQ(kLasertagBits, irsend.capture.bits);
+ EXPECT_EQ(0x01, irsend.capture.value);
+ EXPECT_EQ(0x1, irsend.capture.address); // Unit 1
+ EXPECT_EQ(0x0, irsend.capture.command); // Team Red
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ irsend.reset();
+ irsend.sendLasertag(0x02); // Red 2
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(LASERTAG, irsend.capture.decode_type);
+ EXPECT_EQ(kLasertagBits, irsend.capture.bits);
+ EXPECT_EQ(0x02, irsend.capture.value);
+ EXPECT_EQ(0x2, irsend.capture.address); // Unit 2
+ EXPECT_EQ(0x0, irsend.capture.command); // Team Red
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ irsend.reset();
+ irsend.sendLasertag(0x06); // Red 6
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(LASERTAG, irsend.capture.decode_type);
+ EXPECT_EQ(kLasertagBits, irsend.capture.bits);
+ EXPECT_EQ(0x06, irsend.capture.value);
+ EXPECT_EQ(0x6, irsend.capture.address); // Unit 6
+ EXPECT_EQ(0x0, irsend.capture.command); // Team Red
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ irsend.reset();
+ irsend.sendLasertag(0x51); // Green 1
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(LASERTAG, irsend.capture.decode_type);
+ EXPECT_EQ(kLasertagBits, irsend.capture.bits);
+ EXPECT_EQ(0x51, irsend.capture.value);
+ EXPECT_EQ(0x1, irsend.capture.address); // Unit 1
+ EXPECT_EQ(0x5, irsend.capture.command); // Team Green
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ irsend.reset();
+ irsend.sendLasertag(0x56); // Green 6
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(LASERTAG, irsend.capture.decode_type);
+ EXPECT_EQ(kLasertagBits, irsend.capture.bits);
+ EXPECT_EQ(0x56, irsend.capture.value);
+ EXPECT_EQ(0x6, irsend.capture.address); // Unit
+ EXPECT_EQ(0x5, irsend.capture.command); // Team
+ EXPECT_FALSE(irsend.capture.repeat);
+}
+
+// Example data taken from: https://github.com/z3t0/Arduino-IRremote/issues/532
+TEST(TestDecodeLasertag, RealExamples) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ uint16_t green3[21] = {360, 364, 272, 360, 420, 248, 360, 360, 332, 308, 388,
+ 612, 692, 696, 636, 360, 332, 700, 300, 308, 416};
+ irsend.sendRaw(green3, 21, 36000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(LASERTAG, irsend.capture.decode_type);
+ EXPECT_EQ(kLasertagBits, irsend.capture.bits);
+ EXPECT_EQ(0x53, irsend.capture.value);
+ EXPECT_EQ(0x3, irsend.capture.address); // Unit
+ EXPECT_EQ(0x5, irsend.capture.command); // Team
+
+ irsend.reset();
+ uint16_t green1[21] = {364, 364, 332, 336, 384, 276, 332, 364, 332, 304, 416,
+ 584, 692, 724, 640, 360, 304, 332, 392, 612, 380};
+ irsend.sendRaw(green1, 21, 36000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(LASERTAG, irsend.capture.decode_type);
+ EXPECT_EQ(kLasertagBits, irsend.capture.bits);
+ EXPECT_EQ(0x51, irsend.capture.value);
+ EXPECT_EQ(0x1, irsend.capture.address); // Unit
+ EXPECT_EQ(0x5, irsend.capture.command); // Team
+
+ irsend.reset();
+ uint16_t green4[19] = {336, 304, 412, 280, 360, 360, 304, 308, 420, 276,
+ 332, 636, 744, 620, 688, 724, 640, 360, 304};
+ irsend.sendRaw(green4, 19, 36000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(LASERTAG, irsend.capture.decode_type);
+ EXPECT_EQ(kLasertagBits, irsend.capture.bits);
+ EXPECT_EQ(0x54, irsend.capture.value);
+ EXPECT_EQ(0x4, irsend.capture.address); // Unit
+ EXPECT_EQ(0x5, irsend.capture.command); // Team
+
+ irsend.reset();
+ uint16_t unit15[25] = {280, 360, 360, 308, 332, 388, 308, 332, 360,
+ 308, 360, 360, 304, 304, 412, 284, 304, 692,
+ 364, 360, 276, 336, 416, 276, 328};
+ irsend.sendRaw(unit15, 25, 36000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(LASERTAG, irsend.capture.decode_type);
+ EXPECT_EQ(kLasertagBits, irsend.capture.bits);
+ EXPECT_EQ(0x0F, irsend.capture.value);
+ EXPECT_EQ(0xF, irsend.capture.address); // Unit
+ EXPECT_EQ(0x0, irsend.capture.command); // Team
+
+ irsend.reset();
+ uint16_t red_unit2_1[23] = {406, 262, 384, 374, 256, 354, 306, 366,
+ 252, 442, 256, 374, 358, 336, 278, 438,
+ 246, 340, 380, 292, 304, 688, 746};
+ irsend.sendRaw(red_unit2_1, 23, 36000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(LASERTAG, irsend.capture.decode_type);
+ EXPECT_EQ(kLasertagBits, irsend.capture.bits);
+ EXPECT_EQ(0x02, irsend.capture.value);
+ EXPECT_EQ(0x2, irsend.capture.address); // Unit
+ EXPECT_EQ(0x0, irsend.capture.command); // Team
+
+ irsend.reset();
+ uint16_t red_unit2_2[23] = {302, 306, 302, 392, 196, 476, 278, 352,
+ 304, 348, 278, 438, 226, 382, 328, 366,
+ 252, 458, 196, 392, 302, 688, 644};
+ irsend.sendRaw(red_unit2_2, 23, 36000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(LASERTAG, irsend.capture.decode_type);
+ EXPECT_EQ(kLasertagBits, irsend.capture.bits);
+ EXPECT_EQ(0x02, irsend.capture.value);
+ EXPECT_EQ(0x2, irsend.capture.address); // Unit
+ EXPECT_EQ(0x0, irsend.capture.command); // Team
+
+ irsend.reset();
+ uint16_t red_unit2_3[23] = {196, 432, 304, 348, 328, 386, 304, 326,
+ 302, 370, 252, 442, 272, 356, 278, 374,
+ 276, 438, 274, 352, 302, 668, 622};
+ irsend.sendRaw(red_unit2_3, 23, 36000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(LASERTAG, irsend.capture.decode_type);
+ EXPECT_EQ(kLasertagBits, irsend.capture.bits);
+ EXPECT_EQ(0x02, irsend.capture.value);
+ EXPECT_EQ(0x2, irsend.capture.address); // Unit
+ EXPECT_EQ(0x0, irsend.capture.command); // Team
+
+ irsend.reset();
+ uint16_t red_unit2_4[23] = {304, 390, 328, 324, 324, 346, 350, 364,
+ 300, 330, 320, 310, 324, 388, 242, 366,
+ 354, 318, 354, 340, 244, 726, 670};
+ irsend.sendRaw(red_unit2_4, 23, 36000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(LASERTAG, irsend.capture.decode_type);
+ EXPECT_EQ(kLasertagBits, irsend.capture.bits);
+ EXPECT_EQ(0x02, irsend.capture.value);
+ EXPECT_EQ(0x2, irsend.capture.address); // Unit
+ EXPECT_EQ(0x0, irsend.capture.command); // Team
+
+ irsend.reset();
+ uint16_t red_unit1_1_issue532[25] = {
+ 368, 352, 336, 308, 388, 276, 364, 356, 280, 360, 332, 336, 360,
+ 360, 308, 300, 416, 280, 356, 360, 312, 328, 336, 636, 424};
+ irsend.sendRaw(red_unit1_1_issue532, 25, 36000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(LASERTAG, irsend.capture.decode_type);
+ EXPECT_EQ(kLasertagBits, irsend.capture.bits);
+ EXPECT_EQ(0x01, irsend.capture.value);
+ EXPECT_EQ(0x1, irsend.capture.address); // Unit
+ EXPECT_EQ(0x0, irsend.capture.command); // Team
+
+ irsend.reset();
+ uint16_t red_unit1_2_issue532[25] = {
+ 328, 400, 272, 360, 388, 280, 360, 364, 272, 364, 332, 336, 332,
+ 388, 304, 308, 388, 280, 356, 364, 272, 368, 384, 612, 408};
+ irsend.sendRaw(red_unit1_2_issue532, 25, 36000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(LASERTAG, irsend.capture.decode_type);
+ EXPECT_EQ(kLasertagBits, irsend.capture.bits);
+ EXPECT_EQ(0x01, irsend.capture.value);
+ EXPECT_EQ(0x1, irsend.capture.address); // Unit
+ EXPECT_EQ(0x0, irsend.capture.command); // Team
+
+ irsend.reset();
+ uint16_t red_unit1_3_issue532[25] = {
+ 416, 284, 356, 336, 328, 336, 384, 308, 328, 368, 304, 308, 412,
+ 280, 328, 368, 272, 368, 376, 312, 332, 392, 276, 700, 272};
+ irsend.sendRaw(red_unit1_3_issue532, 25, 36000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(LASERTAG, irsend.capture.decode_type);
+ EXPECT_EQ(kLasertagBits, irsend.capture.bits);
+ EXPECT_EQ(0x01, irsend.capture.value);
+ EXPECT_EQ(0x1, irsend.capture.address); // Unit
+ EXPECT_EQ(0x0, irsend.capture.command); // Team
+
+ irsend.reset();
+ uint16_t red_unit2_1_issue532[23] = {308, 340, 408, 284, 332, 388, 276, 336,
+ 356, 340, 332, 360, 300, 364, 360, 304,
+ 280, 444, 276, 336, 384, 640, 696};
+ irsend.sendRaw(red_unit2_1_issue532, 23, 36000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(LASERTAG, irsend.capture.decode_type);
+ EXPECT_EQ(kLasertagBits, irsend.capture.bits);
+ EXPECT_EQ(0x02, irsend.capture.value);
+ EXPECT_EQ(0x2, irsend.capture.address); // Unit
+ EXPECT_EQ(0x0, irsend.capture.command); // Team
+
+ irsend.reset();
+ uint16_t red_unit2_2_issue532[23] = {332, 308, 388, 280, 328, 420, 308, 304,
+ 384, 308, 332, 364, 272, 368, 384, 276,
+ 364, 360, 308, 332, 384, 612, 696};
+ irsend.sendRaw(red_unit2_2_issue532, 23, 36000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(LASERTAG, irsend.capture.decode_type);
+ EXPECT_EQ(kLasertagBits, irsend.capture.bits);
+ EXPECT_EQ(0x02, irsend.capture.value);
+ EXPECT_EQ(0x2, irsend.capture.address); // Unit
+ EXPECT_EQ(0x0, irsend.capture.command); // Team
+
+ irsend.reset();
+ uint16_t red_unit2_3_issue532[23] = {392, 332, 340, 272, 448, 276, 364, 328,
+ 340, 272, 396, 296, 340, 380, 312, 296,
+ 400, 272, 364, 352, 284, 720, 672};
+ irsend.sendRaw(red_unit2_3_issue532, 23, 36000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(LASERTAG, irsend.capture.decode_type);
+ EXPECT_EQ(kLasertagBits, irsend.capture.bits);
+ EXPECT_EQ(0x02, irsend.capture.value);
+ EXPECT_EQ(0x2, irsend.capture.address); // Unit
+ EXPECT_EQ(0x0, irsend.capture.command); // Team
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Lutron_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Lutron_test.cpp
new file mode 100644
index 000000000000..6c99b9904630
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Lutron_test.cpp
@@ -0,0 +1,143 @@
+// Copyright 2018 David Conran
+
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests for sendLutron().
+
+// Test sending typical data only.
+TEST(TestSendLutron, SendDataOnly) {
+ IRsendTest irsend(0);
+ irsend.begin();
+ irsend.sendLutron(0);
+ EXPECT_EQ("m2288s230080", irsend.outputStr());
+ irsend.sendLutron(0xAAAAAAAAA); // Longest possible sequence. (I think)
+ EXPECT_EQ(
+ "m2288s2288m2288s2288m2288s2288m2288s2288m2288s2288m2288s2288m2288s2288"
+ "m2288s2288m2288s2288m2288s2288m2288s2288m2288s2288m2288s2288m2288s2288"
+ "m2288s2288m2288s2288m2288s2288m2288s152288",
+ irsend.outputStr());
+ irsend.sendLutron(0x7FFFFFFFF);
+ EXPECT_EQ("m82368s150000", irsend.outputStr());
+ irsend.sendLutron(0x7F88BD120);
+ EXPECT_EQ(
+ "m20592s6864m2288s6864m2288s2288m9152s2288m2288s6864m2288s4576m2288"
+ "s161440",
+ irsend.outputStr());
+}
+
+// Test sending with repeats.
+TEST(TestSendLutron, SendWithRepeats) {
+ IRsendTest irsend(0);
+ irsend.begin();
+ // Send a command with 0 repeats.
+ irsend.sendLutron(0x7F88BD120, kLutronBits, 0);
+ EXPECT_EQ(
+ "m20592s6864m2288s6864m2288s2288m9152s2288m2288s6864m2288s4576m2288"
+ "s161440",
+ irsend.outputStr());
+ // Send a command with 1 repeat.
+ irsend.sendLutron(0x7F88BD120, kLutronBits, 1);
+ EXPECT_EQ(
+ "m20592s6864m2288s6864m2288s2288m9152s2288m2288s6864m2288s4576m2288"
+ "s161440"
+ "m20592s6864m2288s6864m2288s2288m9152s2288m2288s6864m2288s4576m2288"
+ "s161440",
+ irsend.outputStr());
+ // Send a command with 3 repeats.
+ irsend.sendLutron(0x7F88BD120, kLutronBits, 3);
+ EXPECT_EQ(
+ "m20592s6864m2288s6864m2288s2288m9152s2288m2288s6864m2288s4576m2288"
+ "s161440"
+ "m20592s6864m2288s6864m2288s2288m9152s2288m2288s6864m2288s4576m2288"
+ "s161440"
+ "m20592s6864m2288s6864m2288s2288m9152s2288m2288s6864m2288s4576m2288"
+ "s161440"
+ "m20592s6864m2288s6864m2288s2288m9152s2288m2288s6864m2288s4576m2288"
+ "s161440",
+ irsend.outputStr());
+}
+
+// Tests for decodeLutron().
+// Decode normal Lutron messages.
+TEST(TestDecodeLutron, SyntheticDecode) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ // Synthesised Normal Lutron messages.
+ irsend.reset();
+ irsend.sendLutron(0x7F88BD120);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(LUTRON, irsend.capture.decode_type);
+ EXPECT_EQ(kLutronBits, irsend.capture.bits);
+ EXPECT_EQ(0x7F88BD120, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+
+ irsend.reset();
+ irsend.sendLutron(0x0DEADBEEF);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(LUTRON, irsend.capture.decode_type);
+ EXPECT_EQ(kLutronBits, irsend.capture.bits);
+ EXPECT_EQ(0x0DEADBEEF, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+
+ irsend.reset();
+ irsend.sendLutron(0x0);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(LUTRON, irsend.capture.decode_type);
+ EXPECT_EQ(kLutronBits, irsend.capture.bits);
+ EXPECT_EQ(0x0, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+
+ irsend.reset();
+ irsend.sendLutron(0x7FFFFFFFF);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(LUTRON, irsend.capture.decode_type);
+ EXPECT_EQ(kLutronBits, irsend.capture.bits);
+ EXPECT_EQ(0x7FFFFFFFF, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+}
+
+// Decode a documented example
+TEST(TestDecodeLutron, DocumentedExampleFullOff) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ // Full Off code.
+ // Ref: https://github.com/markszabo/IRremoteESP8266/issues/515
+ uint16_t rawData[14] = {20518, 6839, 2280, 6839, 2280, 2280, 9119,
+ 2280, 2280, 6839, 2280, 4560, 2280, 11399};
+ irsend.reset();
+ irsend.sendRaw(rawData, 14, 40);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(LUTRON, irsend.capture.decode_type);
+ EXPECT_EQ(kLutronBits, irsend.capture.bits);
+ EXPECT_EQ(0x7F88BD120, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+
+ uint16_t pronto[18] = {0x0000, 0x0069, 0x0007, 0x0000, 0x032a, 0x010e,
+ 0x005a, 0x010e, 0x005a, 0x005a, 0x0168, 0x005a,
+ 0x005a, 0x010e, 0x005a, 0x00b4, 0x005a, 0x01c2};
+ irsend.reset();
+ irsend.sendPronto(pronto, 18);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(LUTRON, irsend.capture.decode_type);
+ EXPECT_EQ(kLutronBits, irsend.capture.bits);
+ EXPECT_EQ(0x7F88BD120, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_MWM_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_MWM_test.cpp
new file mode 100644
index 000000000000..9ecd0eac146a
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_MWM_test.cpp
@@ -0,0 +1,124 @@
+// Copyright 2017 David Conran
+// Copyright 2018 Brett T. Warden
+
+#include "IRrecv.h"
+#include "IRrecv_test.h"
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// MM MM WW WW MM MM
+// MMM MMM WW WW MMM MMM
+// MM M MM WW W WW MM M MM
+// MM MM WWW WWW MM MM
+// MM MM WW WW MM MM
+
+// Tests for sendMWM().
+
+// Test sending simplest case data only.
+TEST(TestSendMWM, SendDataOnly) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ unsigned char test1[] = {0x96, 0x19, 0x10, 0x24, 0x0A,
+ 0x6B, 0x20, 0x03, 0x82};
+ /*
+ ++--+-++--
+ +-++--+++-
+ +++++-+++-
+ +++-++-++-
+ ++-+-++++-
+ +--+-+--+-
+ ++++++-++-
+ +--++++++-
+ ++-+++++--
+ */
+ irsend.sendMWM(test1, sizeof(test1), 0);
+ EXPECT_EQ(
+ "m834s834m417s417m834s834"
+ "m417s417m834s834m1251s417"
+ "m2085s417m1251s417"
+ "m1251s417m834s417m834s417"
+ "m834s417m417s417m1668s417"
+ "m417s834m417s417m417s834m417s417"
+ "m2502s417m834s417"
+ "m417s834m2502s417"
+ "m834s417m2085s30834", irsend.outputStr());
+
+ irsend.reset();
+ unsigned char test2[] = {
+ 0x99, 0x26, 0x66, 0x6E, 0xD1, 0x42, 0x06,
+ 0x20, 0xD0, 0x32, 0xF0, 0x0B
+ // +-++--++--
+ // ++--++-++-
+ // ++--++--+-
+ // ++---+--+-
+ // +-+++-+---
+ // ++-++++-+-
+ // ++--+++++-
+ // ++++++-++-
+ // +++++-+---
+ // ++-++--++-
+ // +++++-----
+ // +--+-++++-
+ };
+ irsend.sendMWM(test2, sizeof(test2), 0);
+ EXPECT_EQ(
+ "m417s417m834s834m834s834"
+ "m834s834m834s417m834s417"
+ "m834s834m834s834m417s417"
+ "m834s1251m417s834m417s417"
+ "m417s417m1251s417m417s1251"
+ "m834s417m1668s417m417s417"
+ "m834s834m2085s417"
+ "m2502s417m834s417"
+ "m2085s417m417s1251"
+ "m834s417m834s834m834s417"
+ "m2085s2085"
+ "m417s834m417s417m1668s30417", irsend.outputStr());
+}
+
+// Tests for decodeMWM().
+
+// Example data
+TEST(TestDecodeMWM, RealExamples) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ uint16_t short_code[] = {
+ 915, 793, 488, 366, 915, 793, 427, 366, 915, 793, 1281, 427,
+ 2136, 366, 1281, 366, 915, 793, 427, 854, 854, 366, 1281, 854,
+ 1708, 366, 488, 793, 854, 427, 427, 427, 427, 366, 854, 427,
+ 2563, 366, 488, 793, 2563, 366, 488, 2075, 427, 34057};
+ unsigned char short_expected[] = {0x96, 0x19, 0x10, 0x36, 0x0C,
+ 0x53, 0x02, 0x03, 0xDF};
+ irsend.sendRaw(short_code, sizeof(short_code) / sizeof(short_code[0]), 38000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(MWM, irsend.capture.decode_type);
+ EXPECT_EQ(8 * sizeof(short_expected) / sizeof(short_expected[0]),
+ irsend.capture.bits);
+ EXPECT_STATE_EQ(short_expected, irsend.capture.state, irsend.capture.bits);
+
+ irsend.reset();
+ uint16_t long_code[] = {
+ 427, 427, 854, 854, 854, 793, 915, 793, 854, 366, 915, 366, 854,
+ 854, 854, 793, 488, 366, 915, 1220, 427, 793, 488, 366, 488, 366,
+ 1281, 427, 427, 1220, 915, 366, 1708, 366, 488, 366, 854, 854, 2136,
+ 366, 2563, 366, 854, 427, 2136, 366, 488, 1220, 854, 427, 854, 793,
+ 915, 366, 2136, 2075, 427, 793, 488, 366, 1708, 30517};
+ unsigned char long_expected[] = {0x99, 0x26, 0x66, 0x6E, 0xD1, 0x42,
+ 0x06, 0x20, 0xD0, 0x32, 0xF0, 0x0B};
+ irsend.sendRaw(long_code, sizeof(long_code) / sizeof(long_code[0]), 38000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(MWM, irsend.capture.decode_type);
+ EXPECT_EQ(8 * sizeof(long_expected) / sizeof(long_expected[0]),
+ irsend.capture.bits);
+ EXPECT_STATE_EQ(long_expected, irsend.capture.state, irsend.capture.bits);
+}
+
+// vim: et:ts=2:sw=2
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Magiquest_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Magiquest_test.cpp
new file mode 100644
index 000000000000..e1c3da83dede
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Magiquest_test.cpp
@@ -0,0 +1,162 @@
+// Copyright 2017 David Conran
+
+#include "ir_Magiquest.h"
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests for encodeMagiQuest()
+TEST(TestEncodeMagiQuest, General) {
+ IRsendTest irsend(0);
+ EXPECT_EQ(0x0, irsend.encodeMagiQuest(0x0, 0x0));
+ EXPECT_EQ(0x10001, irsend.encodeMagiQuest(0x1, 0x1));
+ EXPECT_EQ(0x20003, irsend.encodeMagiQuest(0x2, 0x3));
+ EXPECT_EQ(0x123456781234, irsend.encodeMagiQuest(0x12345678, 0x1234));
+ EXPECT_EQ(0xFFFFFFFFFFFF, irsend.encodeMagiQuest(0xFFFFFFFF, 0xFFFF));
+}
+
+// Tests for sendMagiQuest()
+
+// Test sending typical data only.
+TEST(TestSendMagiQuest, SendDataOnly) {
+ IRsendTest irsend(0);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendMagiQuest(0x0);
+ EXPECT_EQ(
+ "m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s850"
+ "m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s850"
+ "m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s850"
+ "m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s850"
+ "m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s850"
+ "m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s850"
+ "m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s100850",
+ irsend.outputStr());
+ irsend.reset();
+ irsend.sendMagiQuest(0x123456789ABC);
+ EXPECT_EQ(
+ "m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s850"
+ "m280s850m280s850m280s850m580s600m280s850m280s850m580s600m280s850"
+ "m280s850m280s850m580s600m580s600m280s850m580s600m280s850m280s850"
+ "m280s850m580s600m280s850m580s600m280s850m580s600m580s600m280s850"
+ "m280s850m580s600m580s600m580s600m580s600m280s850m280s850m280s850"
+ "m580s600m280s850m280s850m580s600m580s600m280s850m580s600m280s850"
+ "m580s600m280s850m580s600m580s600m580s600m580s600m280s850m280s100850",
+ irsend.outputStr());
+}
+
+// Test sending typical data only.
+TEST(TestSendMagiQuest, SendWithRepeats) {
+ IRsendTest irsend(0);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendMagiQuest(0x12345678ABCD, kMagiquestBits, 2); // two repeats.
+ EXPECT_EQ(
+ "m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s850"
+ "m280s850m280s850m280s850m580s600m280s850m280s850m580s600m280s850"
+ "m280s850m280s850m580s600m580s600m280s850m580s600m280s850m280s850"
+ "m280s850m580s600m280s850m580s600m280s850m580s600m580s600m280s850"
+ "m280s850m580s600m580s600m580s600m580s600m280s850m280s850m280s850"
+ "m580s600m280s850m580s600m280s850m580s600m280s850m580s600m580s600"
+ "m580s600m580s600m280s850m280s850m580s600m580s600m280s850m580s100600"
+ "m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s850"
+ "m280s850m280s850m280s850m580s600m280s850m280s850m580s600m280s850"
+ "m280s850m280s850m580s600m580s600m280s850m580s600m280s850m280s850"
+ "m280s850m580s600m280s850m580s600m280s850m580s600m580s600m280s850"
+ "m280s850m580s600m580s600m580s600m580s600m280s850m280s850m280s850"
+ "m580s600m280s850m580s600m280s850m580s600m280s850m580s600m580s600"
+ "m580s600m580s600m280s850m280s850m580s600m580s600m280s850m580s100600"
+ "m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s850"
+ "m280s850m280s850m280s850m580s600m280s850m280s850m580s600m280s850"
+ "m280s850m280s850m580s600m580s600m280s850m580s600m280s850m280s850"
+ "m280s850m580s600m280s850m580s600m280s850m580s600m580s600m280s850"
+ "m280s850m580s600m580s600m580s600m580s600m280s850m280s850m280s850"
+ "m580s600m280s850m580s600m280s850m580s600m280s850m580s600m580s600"
+ "m580s600m580s600m280s850m280s850m580s600m580s600m280s850m580s100600",
+ irsend.outputStr());
+}
+
+// Tests for decodeMagiQuest().
+
+// Decode normal "synthetic" messages.
+TEST(TestDecodeMagiQuest, NormalDecodeWithStrict) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendMagiQuest(0x0);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeMagiQuest(&irsend.capture, kMagiquestBits, true));
+ EXPECT_EQ(MAGIQUEST, irsend.capture.decode_type);
+ EXPECT_EQ(kMagiquestBits, irsend.capture.bits);
+ EXPECT_EQ(0x0, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ irsend.reset();
+ irsend.sendMagiQuest(irsend.encodeMagiQuest(0x1, 0x1));
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeMagiQuest(&irsend.capture, kMagiquestBits, true));
+ EXPECT_EQ(MAGIQUEST, irsend.capture.decode_type);
+ EXPECT_EQ(kMagiquestBits, irsend.capture.bits);
+ EXPECT_EQ(0x10001, irsend.capture.value);
+ EXPECT_EQ(0x1, irsend.capture.address);
+ EXPECT_EQ(0x1, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ irsend.reset();
+ irsend.sendMagiQuest(irsend.encodeMagiQuest(0x12345678, 0xABCD));
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeMagiQuest(&irsend.capture, kMagiquestBits, true));
+ EXPECT_EQ(MAGIQUEST, irsend.capture.decode_type);
+ EXPECT_EQ(kMagiquestBits, irsend.capture.bits);
+ EXPECT_EQ(0x12345678ABCD, irsend.capture.value);
+ EXPECT_EQ(0x12345678, irsend.capture.address);
+ EXPECT_EQ(0xABCD, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ // Do the last one again, & use the full decoder, not just protocol specific.
+ irsend.reset();
+ irsend.sendMagiQuest(irsend.encodeMagiQuest(0x12345678, 0xABCD));
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(MAGIQUEST, irsend.capture.decode_type);
+ EXPECT_EQ(kMagiquestBits, irsend.capture.bits);
+ EXPECT_EQ(0x12345678ABCD, irsend.capture.value);
+}
+
+// Decode a "real" example message.
+TEST(TestDecodeMagiQuest, RealExamples) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ uint16_t rawData[111] = {262, 842, 298, 858, 238, 866, 240, 890, 238, 866,
+ 240, 862, 244, 886, 242, 860, 246, 858, 554, 604,
+ 264, 840, 560, 622, 266, 836, 552, 604, 556, 626,
+ 262, 866, 240, 864, 264, 838, 268, 862, 244, 886,
+ 536, 620, 530, 628, 554, 628, 532, 624, 244, 858,
+ 552, 604, 264, 840, 268, 862, 266, 838, 268, 888,
+ 240, 864, 242, 860, 268, 862, 244, 860, 236, 868,
+ 272, 832, 264, 866, 240, 890, 532, 598, 268, 834,
+ 294, 836, 270, 834, 262, 866, 272, 858, 238, 866,
+ 534, 622, 268, 836, 270, 860, 268, 862, 526, 604,
+ 264, 892, 530, 600, 268, 836, 586, 598, 270, 834,
+ 556}; // Data from PR #365 captured by coolacid
+
+ irsend.sendRaw(rawData, 111, 36000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(MAGIQUEST, irsend.capture.decode_type);
+ EXPECT_EQ(kMagiquestBits, irsend.capture.bits);
+ EXPECT_EQ(0x560F40020455, irsend.capture.value);
+ EXPECT_EQ(0x560F4002, irsend.capture.address); // Wand ID
+ EXPECT_EQ(0x0455, irsend.capture.command); // Magnitude
+ EXPECT_FALSE(irsend.capture.repeat);
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Midea_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Midea_test.cpp
new file mode 100644
index 000000000000..5d5f5e932f44
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Midea_test.cpp
@@ -0,0 +1,651 @@
+// Copyright 2017 David Conran
+
+#include "ir_Midea.h"
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests for sendMidea().
+
+// Test sending typical data only.
+TEST(TestSendMidea, SendDataOnly) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendMidea(0x0);
+ EXPECT_EQ(
+ "m4480s4480"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s5600"
+ "m4480s4480"
+ "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
+ "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
+ "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
+ "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
+ "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
+ "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
+ "m560s5600",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendMidea(0x55AA55AA55AA);
+ EXPECT_EQ(
+ "m4480s4480"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s5600"
+ "m4480s4480"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s5600",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendMidea(0xFFFFFFFFFFFF);
+ EXPECT_EQ(
+ "m4480s4480"
+ "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
+ "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
+ "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
+ "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
+ "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
+ "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
+ "m560s5600"
+ "m4480s4480"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s5600",
+ irsend.outputStr());
+}
+
+// Test sending with different repeats.
+TEST(TestSendMidea, SendWithRepeats) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendMidea(0x55AA55AA55AA, kMideaBits, 1); // 1 repeat.
+ EXPECT_EQ(
+ "m4480s4480"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s5600"
+ "m4480s4480"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s5600"
+ "m4480s4480"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s5600"
+ "m4480s4480"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s5600",
+ irsend.outputStr());
+ irsend.sendMidea(0x55AA55AA55AA, kMideaBits, 2); // 2 repeats.
+ EXPECT_EQ(
+ "m4480s4480"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s5600"
+ "m4480s4480"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s5600"
+ "m4480s4480"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s5600"
+ "m4480s4480"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s5600"
+ "m4480s4480"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s5600"
+ "m4480s4480"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s5600",
+ irsend.outputStr());
+}
+
+// Test sending an atypical data size.
+TEST(TestSendMidea, SendUnusualSize) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendMidea(0x0, 8);
+ EXPECT_EQ(
+ "m4480s4480"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s5600"
+ "m4480s4480"
+ "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
+ "m560s5600",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendMidea(0x1234567890ABCDEF, 64);
+ EXPECT_EQ(
+ "m4480s4480"
+ "m560s560m560s560m560s560m560s1680m560s560m560s560m560s1680m560s560"
+ "m560s560m560s560m560s1680m560s1680m560s560m560s1680m560s560m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s1680m560s560"
+ "m560s560m560s1680m560s1680m560s1680m560s1680m560s560m560s560m560s560"
+ "m560s1680m560s560m560s560m560s1680m560s560m560s560m560s560m560s560"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s1680"
+ "m560s1680m560s1680m560s560m560s560m560s1680m560s1680m560s560m560s1680"
+ "m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s1680m560s1680"
+ "m560s5600"
+ "m4480s4480"
+ "m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s560m560s1680"
+ "m560s1680m560s1680m560s560m560s560m560s1680m560s560m560s1680m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s560m560s1680"
+ "m560s1680m560s560m560s560m560s560m560s560m560s1680m560s1680m560s1680"
+ "m560s560m560s1680m560s1680m560s560m560s1680m560s1680m560s1680m560s1680"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s560"
+ "m560s560m560s560m560s1680m560s1680m560s560m560s560m560s1680m560s560"
+ "m560s560m560s560m560s560m560s1680m560s560m560s560m560s560m560s560"
+ "m560s5600",
+ irsend.outputStr());
+
+ // Bit sizes must be a multiple of 8.
+ irsend.reset();
+ irsend.sendMidea(0x0, 17);
+ EXPECT_EQ("", irsend.outputStr());
+}
+
+// Tests for IRMideaAC class.
+
+// Tests for controlling the power state.
+TEST(TestMideaACClass, Power) {
+ IRMideaAC midea(0);
+ midea.begin();
+
+ midea.setRaw(0xA1026FFFFFE2); // Power off.
+
+ midea.on();
+ EXPECT_TRUE(midea.getPower());
+
+ EXPECT_EQ(0xA1826FFFFF62, midea.getRaw());
+
+ midea.off();
+ EXPECT_FALSE(midea.getPower());
+ EXPECT_EQ(0xA1026FFFFFE2, midea.getRaw());
+
+ midea.setPower(true);
+ EXPECT_TRUE(midea.getPower());
+ EXPECT_EQ(0xA1826FFFFF62, midea.getRaw());
+
+ midea.setPower(false);
+ EXPECT_FALSE(midea.getPower());
+ EXPECT_EQ(0xA1026FFFFFE2, midea.getRaw());
+}
+
+// Tests for the various Checksum routines.
+TEST(TestMideaACClass, Checksums) {
+ IRMideaAC midea(0);
+ midea.begin();
+
+ // Known good states
+ EXPECT_EQ(0x62, IRMideaAC::calcChecksum(0xA1826FFFFF62));
+ EXPECT_EQ(0x70, IRMideaAC::calcChecksum(0xA18177FFFF70));
+ // Now without the checksum part.
+ EXPECT_EQ(0x62, IRMideaAC::calcChecksum(0xA1826FFFFF00));
+ EXPECT_EQ(0x70, IRMideaAC::calcChecksum(0xA18177FFFF00));
+ // Made up values.
+ EXPECT_EQ(0x00, IRMideaAC::calcChecksum(0x000000000000));
+ EXPECT_EQ(0xDF, IRMideaAC::calcChecksum(0x1234567890AB));
+ EXPECT_EQ(0xA0, IRMideaAC::calcChecksum(0xFFFFFFFFFFFF));
+ // Larger than expected value (full 64bit)
+ EXPECT_EQ(0xDF, IRMideaAC::calcChecksum(0xFF1234567890AB));
+ EXPECT_EQ(0xDF, IRMideaAC::calcChecksum(0x551234567890AB));
+
+ // Validity tests.
+ EXPECT_TRUE(IRMideaAC::validChecksum(0xA1826FFFFF62));
+ EXPECT_TRUE(IRMideaAC::validChecksum(0xA18177FFFF70));
+ EXPECT_FALSE(IRMideaAC::validChecksum(0x1234567890AB));
+
+ // Doing a setRaw() with a bad state should make a valid checksum on getRaw().
+ midea.setRaw(0xA1826FFFFF00);
+ EXPECT_EQ(0xA1826FFFFF62, midea.getRaw());
+}
+
+TEST(TestMideaACClass, OperatingMode) {
+ IRMideaAC midea(0);
+ midea.begin();
+
+ midea.setRaw(0xA1826FFFFF62); // Auto mode already set.
+ midea.setMode(kMideaACAuto);
+ EXPECT_EQ(kMideaACAuto, midea.getMode());
+ EXPECT_EQ(0xA1826FFFFF62, midea.getRaw()); // State shouldn't have changed.
+
+ midea.setMode(kMideaACCool);
+ EXPECT_EQ(kMideaACCool, midea.getMode());
+ EXPECT_EQ(0xA1806FFFFF61, midea.getRaw());
+
+ midea.setMode(kMideaACAuto);
+ EXPECT_EQ(kMideaACAuto, midea.getMode());
+ EXPECT_EQ(0xA1826FFFFF62, midea.getRaw());
+
+ midea.setMode(kMideaACHeat);
+ EXPECT_EQ(kMideaACHeat, midea.getMode());
+ EXPECT_EQ(0xA1836FFFFF63, midea.getRaw());
+
+ midea.setMode(kMideaACDry);
+ EXPECT_EQ(kMideaACDry, midea.getMode());
+ EXPECT_EQ(0xA1816FFFFF60, midea.getRaw());
+
+ midea.setMode(kMideaACFan);
+ EXPECT_EQ(kMideaACFan, midea.getMode());
+ EXPECT_EQ(0xA1846FFFFF66, midea.getRaw());
+
+ midea.setMode(255);
+ EXPECT_EQ(kMideaACAuto, midea.getMode());
+ EXPECT_EQ(0xA1826FFFFF62, midea.getRaw());
+}
+
+TEST(TestMideaACClass, FanSpeed) {
+ IRMideaAC midea(0);
+ midea.begin();
+
+ midea.setRaw(0xA1826FFFFF62); // Auto mode already set.
+ EXPECT_EQ(kMideaACFanAuto, midea.getFan());
+
+ midea.setFan(kMideaACFanLow);
+ EXPECT_EQ(kMideaACFanLow, midea.getFan());
+ EXPECT_EQ(0xA18A6FFFFF6C, midea.getRaw());
+
+ midea.setFan(255); // Setting an unexpected value defaults to auto.
+ EXPECT_EQ(kMideaACFanAuto, midea.getFan());
+ EXPECT_EQ(0xA1826FFFFF62, midea.getRaw());
+
+ midea.setFan(kMideaACFanMed);
+ EXPECT_EQ(kMideaACFanMed, midea.getFan());
+ EXPECT_EQ(0xA1926FFFFF7C, midea.getRaw());
+
+ midea.setFan(kMideaACFanHigh);
+ EXPECT_EQ(kMideaACFanHigh, midea.getFan());
+ EXPECT_EQ(0xA19A6FFFFF74, midea.getRaw());
+
+ midea.setFan(kMideaACFanAuto);
+ EXPECT_EQ(kMideaACFanAuto, midea.getFan());
+ EXPECT_EQ(0xA1826FFFFF62, midea.getRaw());
+}
+
+TEST(TestMideaACClass, Temperature) {
+ IRMideaAC midea(0);
+ midea.begin();
+
+ midea.setRaw(0xA1826FFFFF62); // 77F / 25C
+ EXPECT_EQ(77, midea.getTemp()); // F
+ EXPECT_EQ(77, midea.getTemp(false)); // F
+ EXPECT_EQ(25, midea.getTemp(true)); // F
+
+ midea.setTemp(0);
+ EXPECT_EQ(kMideaACMinTempF, midea.getTemp());
+ EXPECT_EQ(0xA18260FFFF6C, midea.getRaw());
+
+ midea.setTemp(255);
+ EXPECT_EQ(kMideaACMaxTempF, midea.getTemp());
+ EXPECT_EQ(0xA18278FFFF78, midea.getRaw());
+
+ midea.setTemp(0, true);
+ EXPECT_EQ(kMideaACMinTempF, midea.getTemp());
+ EXPECT_EQ(0xA18260FFFF6C, midea.getRaw());
+
+ midea.setTemp(255, true);
+ EXPECT_EQ(kMideaACMaxTempF, midea.getTemp());
+ EXPECT_EQ(0xA18278FFFF78, midea.getRaw());
+
+ // fahrenheit min/max etc.
+ midea.setTemp(kMideaACMinTempF);
+ EXPECT_EQ(kMideaACMinTempF, midea.getTemp());
+
+ midea.setTemp(kMideaACMaxTempF);
+ EXPECT_EQ(kMideaACMaxTempF, midea.getTemp());
+
+ midea.setTemp(kMideaACMinTempF - 1);
+ EXPECT_EQ(kMideaACMinTempF, midea.getTemp());
+
+ midea.setTemp(kMideaACMaxTempF + 1);
+ EXPECT_EQ(kMideaACMaxTempF, midea.getTemp());
+
+ // celsius min/max etc.
+ midea.setTemp(kMideaACMinTempC, true);
+ EXPECT_EQ(kMideaACMinTempC, midea.getTemp(true));
+ EXPECT_EQ(kMideaACMinTempF, midea.getTemp(false));
+
+ midea.setTemp(kMideaACMaxTempC, true);
+ EXPECT_EQ(kMideaACMaxTempC, midea.getTemp(true));
+ EXPECT_EQ(kMideaACMaxTempF, midea.getTemp(false));
+
+ midea.setTemp(kMideaACMinTempC - 1, true);
+ EXPECT_EQ(kMideaACMinTempC, midea.getTemp(true));
+
+ midea.setTemp(kMideaACMaxTempC + 1, true);
+ EXPECT_EQ(kMideaACMaxTempC, midea.getTemp(true));
+ EXPECT_EQ(kMideaACMaxTempF, midea.getTemp(false));
+
+ // General changes.
+ midea.setTemp(17, true); // C
+ EXPECT_EQ(17, midea.getTemp(true)); // C
+ EXPECT_EQ(63, midea.getTemp(false)); // F
+
+ midea.setTemp(21, true); // C
+ EXPECT_EQ(21, midea.getTemp(true)); // C
+ EXPECT_EQ(70, midea.getTemp(false)); // F
+
+ midea.setTemp(25, true); // C
+ EXPECT_EQ(25, midea.getTemp(true)); // C
+ EXPECT_EQ(77, midea.getTemp(false)); // F
+
+ midea.setTemp(30, true); // C
+ EXPECT_EQ(30, midea.getTemp(true)); // C
+ EXPECT_EQ(86, midea.getTemp(false)); // F
+
+ midea.setTemp(80, false); // F
+ EXPECT_EQ(26, midea.getTemp(true)); // C
+ EXPECT_EQ(80, midea.getTemp(false)); // F
+
+ midea.setTemp(70); // F
+ EXPECT_EQ(21, midea.getTemp(true)); // C
+ EXPECT_EQ(70, midea.getTemp(false)); // F
+ EXPECT_EQ(70, midea.getTemp()); // F
+}
+
+// Tests for controlling the sleep state.
+TEST(TestMideaACClass, Sleep) {
+ IRMideaAC midea(0);
+ midea.begin();
+
+ midea.setRaw(0xA1826FFFFF62); // Sleep off.
+
+ EXPECT_FALSE(midea.getSleep());
+ midea.setSleep(true);
+ EXPECT_TRUE(midea.getSleep());
+ EXPECT_EQ(0xA1C26FFFFF22, midea.getRaw());
+ midea.setSleep(false);
+ EXPECT_FALSE(midea.getSleep());
+ EXPECT_EQ(0xA1826FFFFF62, midea.getRaw());
+}
+
+TEST(TestMideaACClass, HumanReadableOutput) {
+ IRMideaAC midea(0);
+ midea.begin();
+
+ midea.setRaw(0xA1826FFFFF62);
+ EXPECT_EQ(
+ "Power: On, Mode: 2 (AUTO), Temp: 25C/77F, Fan: 0 (AUTO), "
+ "Sleep: Off",
+ midea.toString());
+ midea.off();
+ midea.setTemp(25);
+ midea.setFan(kMideaACFanHigh);
+ midea.setMode(kMideaACDry);
+ midea.setSleep(true);
+ EXPECT_EQ("Power: Off, Mode: 1 (DRY), Temp: 16C/62F, Fan: 3 (HI), Sleep: On",
+ midea.toString());
+
+ midea.setRaw(0xA19867FFFF7E);
+ EXPECT_EQ("Power: On, Mode: 0 (COOL), Temp: 20C/69F, Fan: 3 (HI), Sleep: Off",
+ midea.toString());
+}
+
+// Tests for decodeMidea().
+
+// Decode normal Midea messages with strict set.
+TEST(TestDecodeMidea, NormalDecodeWithStrict) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ // Normal Midea 48-bit message.
+ irsend.reset();
+ irsend.sendMidea(0x1234567890DF);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
+ EXPECT_EQ(MIDEA, irsend.capture.decode_type);
+ EXPECT_EQ(kMideaBits, irsend.capture.bits);
+ EXPECT_EQ(0x1234567890DF, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ // Normal Midea 48-bit message.
+ irsend.reset();
+ irsend.sendMidea(0x0);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
+ EXPECT_EQ(MIDEA, irsend.capture.decode_type);
+ EXPECT_EQ(kMideaBits, irsend.capture.bits);
+ EXPECT_EQ(0x0, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ // Normal Midea 48-bit message.
+ irsend.reset();
+ irsend.sendMidea(0xFFFFFFFFFFA0);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
+ EXPECT_EQ(MIDEA, irsend.capture.decode_type);
+ EXPECT_EQ(kMideaBits, irsend.capture.bits);
+ EXPECT_EQ(0xFFFFFFFFFFA0, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ // Real Midea 48-bit message via just decode().
+ // i.e. No conficts with other decoders.
+ irsend.reset();
+ irsend.sendMidea(0xA18263FFFF6E);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(MIDEA, irsend.capture.decode_type);
+ EXPECT_EQ(kMideaBits, irsend.capture.bits);
+ EXPECT_EQ(0xA18263FFFF6E, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+}
+
+// Decode normal repeated Midea messages.
+TEST(TestDecodeMidea, NormalDecodeWithRepeatAndStrict) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ // Normal Midea 48-bit message with 2 repeats.
+ irsend.reset();
+ irsend.sendMidea(0xA18263FFFF6E, kMideaBits, 2);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
+ EXPECT_EQ(MIDEA, irsend.capture.decode_type);
+ EXPECT_EQ(kMideaBits, irsend.capture.bits);
+ EXPECT_EQ(0xA18263FFFF6E, irsend.capture.value);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ irsend.makeDecodeResult(2 * (2 * kMideaBits + 4));
+ ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
+ EXPECT_EQ(MIDEA, irsend.capture.decode_type);
+ EXPECT_EQ(kMideaBits, irsend.capture.bits);
+ EXPECT_EQ(0xA18263FFFF6E, irsend.capture.value);
+
+ irsend.makeDecodeResult(4 * (2 * kMideaBits + 4));
+ ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
+ EXPECT_EQ(MIDEA, irsend.capture.decode_type);
+ EXPECT_EQ(kMideaBits, irsend.capture.bits);
+ EXPECT_EQ(0xA18263FFFF6E, irsend.capture.value);
+}
+
+// Decode unsupported Midea messages.
+TEST(TestDecodeMidea, DecodeWithNonStrictSizes) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendMidea(0x12, 8); // Illegal value Midea 8-bit message.
+ irsend.makeDecodeResult();
+ // Should fail with strict on.
+ ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
+ // Should pass if strict off.
+ ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, 8, false));
+ EXPECT_EQ(MIDEA, irsend.capture.decode_type);
+ EXPECT_EQ(8, irsend.capture.bits);
+ EXPECT_EQ(0x12, irsend.capture.value);
+
+ irsend.reset();
+ irsend.sendMidea(0x12345678, 32); // Illegal value Midea 32-bit message.
+ irsend.makeDecodeResult();
+ // Shouldn't pass with strict when we ask for less bits than we got.
+ ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
+
+ irsend.makeDecodeResult();
+ // Should fail with strict when we ask for the wrong bit size.
+ ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture, 32, true));
+ // Should pass if strict off.
+ ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, 32, false));
+ EXPECT_EQ(MIDEA, irsend.capture.decode_type);
+ EXPECT_EQ(32, irsend.capture.bits);
+ EXPECT_EQ(0x12345678, irsend.capture.value);
+
+ // Decode should fail if asked to decode non-multiples of 8 bits.
+ irsend.reset();
+ irsend.sendMidea(0x123456, kMideaBits, 2);
+ irsend.makeDecodeResult();
+ ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture, 9, false));
+}
+
+// Decode (non-standard) 64-bit messages.
+TEST(TestDecodeMidea, Decode64BitMessages) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Illegal size Midea 64-bit message.
+ irsend.sendMidea(0xFFFFFFFFFFFFFFFF, 64);
+ irsend.makeDecodeResult();
+ // Should work with a 'normal' match (not strict)
+ ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, 64, false));
+ EXPECT_EQ(MIDEA, irsend.capture.decode_type);
+ EXPECT_EQ(64, irsend.capture.bits);
+ EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
+}
+
+// Fail to decode a non-Midea example via GlobalCache
+TEST(TestDecodeMidea, FailToDecodeNonMideaExample) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Modified a few entries to unexpected values, based on previous test case.
+ uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
+ 20, 20, 20, 20, 20, 20, 127, 20, 61, 9,
+ 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
+ 61, 20, 20, 20, 20, 20, 20, 20, 884};
+ irsend.sendGC(gc_test, 39);
+ irsend.makeDecodeResult();
+
+ ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture));
+ ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture, kMideaBits, false));
+}
+
+// Decode against a real capture reported by a user. See issue #354
+TEST(TestDecodeMidea, DecodeRealExample) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+ irsend.reset();
+
+ uint16_t rawData[199] = {
+ 4366, 4470, 498, 1658, 522, 554, 498, 1658, 496, 580, 498, 580,
+ 498, 578, 498, 580, 498, 1658, 498, 1658, 498, 578, 498, 578,
+ 498, 580, 496, 582, 496, 578, 498, 1658, 498, 580, 498, 580,
+ 498, 1656, 498, 1656, 500, 580, 498, 578, 502, 576, 500, 1656,
+ 498, 1656, 500, 1654, 500, 1656, 500, 1656, 498, 1658, 498, 1656,
+ 500, 1658, 498, 1656, 498, 1656, 500, 1656, 500, 1654, 500, 1578,
+ 578, 1658, 498, 1656, 500, 1658, 498, 1656, 498, 1656, 500, 578,
+ 498, 1638, 516, 1656, 500, 578, 500, 1656, 500, 1656, 498, 1658,
+ 522, 554, 500, 5258, 4366, 4472, 498, 580, 498, 1658, 498, 580,
+ 498, 1656, 500, 1600, 556, 1658, 500, 1656, 500, 578, 498, 578,
+ 522, 1634, 498, 1588, 568, 1658, 498, 1656, 500, 1654, 498, 580,
+ 498, 1658, 498, 1658, 498, 580, 496, 578, 500, 1654, 500, 1636,
+ 518, 1656, 500, 578, 520, 558, 498, 578, 498, 580, 498, 576,
+ 500, 578, 498, 580, 498, 578, 498, 578, 498, 580, 498, 578,
+ 498, 580, 498, 580, 520, 556, 498, 580, 496, 580, 498, 578,
+ 500, 578, 498, 1658, 498, 580, 498, 578, 498, 1656, 500, 578,
+ 498, 580, 498, 580, 498, 1656, 522};
+ irsend.sendRaw(rawData, 199, 38000);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(MIDEA, irsend.capture.decode_type);
+ EXPECT_EQ(kMideaBits, irsend.capture.bits);
+ EXPECT_EQ(0xA18263FFFF6E, irsend.capture.value);
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Mitsubishi_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Mitsubishi_test.cpp
new file mode 100644
index 000000000000..7b8eb2192fad
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Mitsubishi_test.cpp
@@ -0,0 +1,1118 @@
+// Copyright 2017 David Conran
+// Copyright 2018 denxhun
+
+#include "ir_Mitsubishi.h"
+#include "IRrecv_test.h"
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests for sendMitsubishi().
+
+// Test sending typical data only.
+TEST(TestSendMitsubishi, SendDataOnly) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendMitsubishi(0xE242);
+ EXPECT_EQ(
+ "m300s2100m300s2100m300s2100m300s900m300s900m300s900m300s2100m300s900"
+ "m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100m300s900"
+ "m300s28080"
+ "m300s2100m300s2100m300s2100m300s900m300s900m300s900m300s2100m300s900"
+ "m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100m300s900"
+ "m300s28080",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendMitsubishi(0x0);
+ EXPECT_EQ(
+ "m300s900m300s900m300s900m300s900m300s900m300s900m300s900m300s900"
+ "m300s900m300s900m300s900m300s900m300s900m300s900m300s900m300s900"
+ "m300s34080"
+ "m300s900m300s900m300s900m300s900m300s900m300s900m300s900m300s900"
+ "m300s900m300s900m300s900m300s900m300s900m300s900m300s900m300s900"
+ "m300s34080",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendMitsubishi(0x4321);
+ EXPECT_EQ(
+ "m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100m300s2100"
+ "m300s900m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100"
+ "m300s28080"
+ "m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100m300s2100"
+ "m300s900m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100"
+ "m300s28080",
+ irsend.outputStr());
+}
+
+// Test sending with different repeats.
+TEST(TestSendMitsubishi, SendWithRepeats) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendMitsubishi(0xE242, kMitsubishiBits, 0); // 0 repeat.
+ EXPECT_EQ(
+ "m300s2100m300s2100m300s2100m300s900m300s900m300s900m300s2100m300s900"
+ "m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100m300s900"
+ "m300s28080",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendMitsubishi(0xE242, kMitsubishiBits, 1); // 1 repeat.
+ EXPECT_EQ(
+ "m300s2100m300s2100m300s2100m300s900m300s900m300s900m300s2100m300s900"
+ "m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100m300s900"
+ "m300s28080"
+ "m300s2100m300s2100m300s2100m300s900m300s900m300s900m300s2100m300s900"
+ "m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100m300s900"
+ "m300s28080",
+ irsend.outputStr());
+ irsend.sendMitsubishi(0xE242, kMitsubishiBits, 2); // 2 repeats.
+ EXPECT_EQ(
+ "m300s2100m300s2100m300s2100m300s900m300s900m300s900m300s2100m300s900"
+ "m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100m300s900"
+ "m300s28080"
+ "m300s2100m300s2100m300s2100m300s900m300s900m300s900m300s2100m300s900"
+ "m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100m300s900"
+ "m300s28080"
+ "m300s2100m300s2100m300s2100m300s900m300s900m300s900m300s2100m300s900"
+ "m300s900m300s2100m300s900m300s900m300s900m300s900m300s2100m300s900"
+ "m300s28080",
+ irsend.outputStr());
+}
+
+// Test sending an atypical data size.
+TEST(TestSendMitsubishi, SendUnusualSize) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendMitsubishi(0x0, 8);
+ EXPECT_EQ(
+ "m300s900m300s900m300s900m300s900m300s900m300s900m300s900m300s900"
+ "m300s43680"
+ "m300s900m300s900m300s900m300s900m300s900m300s900m300s900m300s900"
+ "m300s43680",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendMitsubishi(0x1234567890ABCDEF, 64);
+ EXPECT_EQ(
+ "m300s900m300s900m300s900m300s2100m300s900m300s900m300s2100m300s900"
+ "m300s900m300s900m300s2100m300s2100m300s900m300s2100m300s900m300s900"
+ "m300s900m300s2100m300s900m300s2100m300s900m300s2100m300s2100m300s900"
+ "m300s900m300s2100m300s2100m300s2100m300s2100m300s900m300s900m300s900"
+ "m300s2100m300s900m300s900m300s2100m300s900m300s900m300s900m300s900"
+ "m300s2100m300s900m300s2100m300s900m300s2100m300s900m300s2100m300s2100"
+ "m300s2100m300s2100m300s900m300s900m300s2100m300s2100m300s900m300s2100"
+ "m300s2100m300s2100m300s2100m300s900m300s2100m300s2100m300s2100m300s2100"
+ "m300s28080"
+ "m300s900m300s900m300s900m300s2100m300s900m300s900m300s2100m300s900"
+ "m300s900m300s900m300s2100m300s2100m300s900m300s2100m300s900m300s900"
+ "m300s900m300s2100m300s900m300s2100m300s900m300s2100m300s2100m300s900"
+ "m300s900m300s2100m300s2100m300s2100m300s2100m300s900m300s900m300s900"
+ "m300s2100m300s900m300s900m300s2100m300s900m300s900m300s900m300s900"
+ "m300s2100m300s900m300s2100m300s900m300s2100m300s900m300s2100m300s2100"
+ "m300s2100m300s2100m300s900m300s900m300s2100m300s2100m300s900m300s2100"
+ "m300s2100m300s2100m300s2100m300s900m300s2100m300s2100m300s2100m300s2100"
+ "m300s28080",
+ irsend.outputStr());
+}
+
+// Decode normal Mitsubishi messages.
+TEST(TestDecodeMitsubishi, NormalDecodeWithStrict) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ // Normal Mitsubishi 16-bit message.
+ irsend.reset();
+ irsend.sendMitsubishi(0xC2B8);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, kMitsubishiBits, true));
+ EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
+ EXPECT_EQ(kMitsubishiBits, irsend.capture.bits);
+ EXPECT_EQ(0xC2B8, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ irsend.reset();
+ irsend.sendMitsubishi(0x0);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, kMitsubishiBits, true));
+ EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
+ EXPECT_EQ(kMitsubishiBits, irsend.capture.bits);
+ EXPECT_EQ(0x0, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ irsend.reset();
+ irsend.sendMitsubishi(0xFFFF);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, kMitsubishiBits, true));
+ EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
+ EXPECT_EQ(kMitsubishiBits, irsend.capture.bits);
+ EXPECT_EQ(0xFFFF, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ // Non-standard Mitsubishi sizes should fail with strict.
+ irsend.reset();
+ // 12 bits.
+ irsend.sendMitsubishi(0xFFF, 12);
+ irsend.makeDecodeResult();
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, kMitsubishiBits, true));
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 12, true));
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 64, true));
+
+ // 32 bits.
+ irsend.sendMitsubishi(0xFFF, 32);
+ irsend.makeDecodeResult();
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, kMitsubishiBits, true));
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 12, true));
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 32, true));
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 64, true));
+}
+
+// Decode normal repeated Mitsubishi messages.
+TEST(TestDecodeMitsubishi, NormalDecodeWithRepeatAndStrict) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ // Normal Mitsubishi 16-bit message with 2 repeats.
+ irsend.reset();
+ irsend.sendMitsubishi(0xC2B8, kMitsubishiBits, 2);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, kMitsubishiBits, true));
+ EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
+ EXPECT_EQ(kMitsubishiBits, irsend.capture.bits);
+ EXPECT_EQ(0xC2B8, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ // Normal Mitsubishi 16-bit message with 0 repeats.
+ irsend.reset();
+ irsend.sendMitsubishi(0xC2B8, kMitsubishiBits, 0);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, kMitsubishiBits, true));
+ EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
+ EXPECT_EQ(kMitsubishiBits, irsend.capture.bits);
+ EXPECT_EQ(0xC2B8, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+}
+
+// Decode unsupported Mitsubishi messages.
+TEST(TestDecodeMitsubishi, DecodeWithNonStrictValues) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendMitsubishi(0x0, 8); // Illegal sized Mitsubishi 8-bit message.
+ irsend.makeDecodeResult();
+ // Should fail with strict on.
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, kMitsubishiBits, true));
+ // Should pass if strict off.
+ ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, 8, false));
+ EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
+ EXPECT_EQ(8, irsend.capture.bits);
+ EXPECT_EQ(0x0, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 64, false));
+
+ irsend.reset();
+ // Illegal sized Mitsubishi 64-bit message.
+ irsend.sendMitsubishi(0xFEDCBA9876543210, 64);
+ irsend.makeDecodeResult();
+ // Should fail with strict on.
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, kMitsubishiBits, true));
+ // Should pass if strict off.
+ ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, 64, false));
+ EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
+ EXPECT_EQ(64, irsend.capture.bits);
+ EXPECT_EQ(0xFEDCBA9876543210, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+ // Should fail when we are after a shorter message than we got.
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 8, false));
+}
+
+// Decode a 'real' example via GlobalCache
+TEST(TestDecodeMitsubishi, DecodeGlobalCacheExample) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Mitsubishi "Power On" (16-bit) code from Global Cache.
+ uint16_t gc_test[37] = {33000, 1, 1, 10, 70, 10, 70, 10, 70, 10, 30, 10, 30,
+ 10, 30, 10, 70, 10, 30, 10, 30, 10, 70, 10, 30, 10,
+ 30, 10, 30, 10, 30, 10, 70, 10, 30, 10, 936};
+ irsend.sendGC(gc_test, 37);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture));
+ EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
+ EXPECT_EQ(kMitsubishiBits, irsend.capture.bits);
+ EXPECT_EQ(0xE242, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+}
+
+// Fail to decode a non-Mitsubishi example via GlobalCache
+TEST(TestDecodeMitsubishi, FailToDecodeNonMitsubishiExample) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Modified a few entries to unexpected values, based on previous test case.
+ uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
+ 20, 20, 20, 20, 20, 20, 127, 20, 61, 9,
+ 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
+ 61, 20, 20, 20, 20, 20, 20, 20, 884};
+ irsend.sendGC(gc_test, 39);
+ irsend.makeDecodeResult();
+
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture));
+ ASSERT_FALSE(
+ irrecv.decodeMitsubishi(&irsend.capture, kMitsubishiBits, false));
+}
+
+// Tests for Mitsubishi A/C methods.
+
+// Test sending typical data only.
+TEST(TestSendMitsubishiAC, SendDataOnly) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ uint8_t mitsub_code[kMitsubishiACStateLength] = {
+ 0x23, 0xCB, 0x26, 0x01, 0x00, 0x20, 0x08, 0x06, 0x30,
+ 0x45, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F};
+ irsend.reset();
+ irsend.sendMitsubishiAC(mitsub_code);
+ EXPECT_EQ(
+ "m3400s1750"
+ "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420"
+ "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300"
+ "m450s420m450s1300m450s1300m450s420m450s420m450s1300m450s420m450s420"
+ "m450s1300m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s1300m450s420m450s420"
+ "m450s420m450s420m450s420m450s1300m450s420m450s420m450s420m450s420"
+ "m450s420m450s1300m450s1300m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420"
+ "m450s1300m450s420m450s1300m450s420m450s420m450s420m450s1300m450s420"
+ "m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s1300m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420"
+ "m440s17100"
+ "m3400s1750"
+ "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420"
+ "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300"
+ "m450s420m450s1300m450s1300m450s420m450s420m450s1300m450s420m450s420"
+ "m450s1300m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s1300m450s420m450s420"
+ "m450s420m450s420m450s420m450s1300m450s420m450s420m450s420m450s420"
+ "m450s420m450s1300m450s1300m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420"
+ "m450s1300m450s420m450s1300m450s420m450s420m450s420m450s1300m450s420"
+ "m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s1300m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420"
+ "m440s17100",
+ irsend.outputStr());
+}
+
+// Test sending with repeats.
+TEST(TestSendMitsubishiAC, SendWithRepeats) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ uint8_t mitsub_code[kMitsubishiACStateLength] = {
+ 0x23, 0xCB, 0x26, 0x01, 0x00, 0x20, 0x08, 0x06, 0x30,
+ 0x45, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F};
+
+ irsend.sendMitsubishiAC(mitsub_code, kMitsubishiACStateLength, 0);
+ EXPECT_EQ(
+ "m3400s1750"
+ "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420"
+ "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300"
+ "m450s420m450s1300m450s1300m450s420m450s420m450s1300m450s420m450s420"
+ "m450s1300m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s1300m450s420m450s420"
+ "m450s420m450s420m450s420m450s1300m450s420m450s420m450s420m450s420"
+ "m450s420m450s1300m450s1300m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420"
+ "m450s1300m450s420m450s1300m450s420m450s420m450s420m450s1300m450s420"
+ "m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s1300m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420"
+ "m440s17100",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendMitsubishiAC(mitsub_code, kMitsubishiACStateLength, 2);
+ EXPECT_EQ(
+ "m3400s1750"
+ "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420"
+ "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300"
+ "m450s420m450s1300m450s1300m450s420m450s420m450s1300m450s420m450s420"
+ "m450s1300m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s1300m450s420m450s420"
+ "m450s420m450s420m450s420m450s1300m450s420m450s420m450s420m450s420"
+ "m450s420m450s1300m450s1300m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420"
+ "m450s1300m450s420m450s1300m450s420m450s420m450s420m450s1300m450s420"
+ "m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s1300m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420"
+ "m440s17100"
+ "m3400s1750"
+ "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420"
+ "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300"
+ "m450s420m450s1300m450s1300m450s420m450s420m450s1300m450s420m450s420"
+ "m450s1300m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s1300m450s420m450s420"
+ "m450s420m450s420m450s420m450s1300m450s420m450s420m450s420m450s420"
+ "m450s420m450s1300m450s1300m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420"
+ "m450s1300m450s420m450s1300m450s420m450s420m450s420m450s1300m450s420"
+ "m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s1300m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420"
+ "m440s17100"
+ "m3400s1750"
+ "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420"
+ "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300"
+ "m450s420m450s1300m450s1300m450s420m450s420m450s1300m450s420m450s420"
+ "m450s1300m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s1300m450s420m450s420"
+ "m450s420m450s420m450s420m450s1300m450s420m450s420m450s420m450s420"
+ "m450s420m450s1300m450s1300m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420"
+ "m450s1300m450s420m450s1300m450s420m450s420m450s420m450s1300m450s420"
+ "m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s1300m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420"
+ "m440s17100",
+ irsend.outputStr());
+}
+
+// Test sending atypical sizes.
+TEST(TestSendMitsubishiAC, SendUnexpectedSizes) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ uint8_t mitsub_short_code[17] = {0x23, 0xCB, 0x26, 0x01, 0x00, 0x20,
+ 0x08, 0x06, 0x30, 0x45, 0x67, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00};
+ uint8_t mitsub_long_code[19] = {0x23, 0xCB, 0x26, 0x01, 0x00, 0x20, 0x08,
+ 0x06, 0x30, 0x45, 0x67, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1F, 0x00};
+ irsend.reset();
+ irsend.sendMitsubishiAC(mitsub_short_code, 17);
+ ASSERT_EQ("", irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendMitsubishiAC(mitsub_long_code, 19);
+ ASSERT_EQ(
+ "m3400s1750"
+ "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420"
+ "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300"
+ "m450s420m450s1300m450s1300m450s420m450s420m450s1300m450s420m450s420"
+ "m450s1300m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s1300m450s420m450s420"
+ "m450s420m450s420m450s420m450s1300m450s420m450s420m450s420m450s420"
+ "m450s420m450s1300m450s1300m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420"
+ "m450s1300m450s420m450s1300m450s420m450s420m450s420m450s1300m450s420"
+ "m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s1300m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m440s17100"
+ "m3400s1750"
+ "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420"
+ "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300"
+ "m450s420m450s1300m450s1300m450s420m450s420m450s1300m450s420m450s420"
+ "m450s1300m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s1300m450s420m450s420"
+ "m450s420m450s420m450s420m450s1300m450s420m450s420m450s420m450s420"
+ "m450s420m450s1300m450s1300m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420"
+ "m450s1300m450s420m450s1300m450s420m450s420m450s420m450s1300m450s420"
+ "m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s1300m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m440s17100",
+ irsend.outputStr());
+}
+
+// Tests for IRMitsubishiAC class.
+
+TEST(TestMitsubishiACClass, Power) {
+ IRMitsubishiAC mitsub(0);
+ mitsub.begin();
+
+ mitsub.on();
+ EXPECT_TRUE(mitsub.getPower());
+
+ mitsub.off();
+ EXPECT_FALSE(mitsub.getPower());
+
+ mitsub.setPower(true);
+ EXPECT_TRUE(mitsub.getPower());
+
+ mitsub.setPower(false);
+ EXPECT_FALSE(mitsub.getPower());
+}
+
+TEST(TestMitsubishiACClass, Temperature) {
+ IRMitsubishiAC mitsub(0);
+ mitsub.begin();
+
+ mitsub.setTemp(0);
+ EXPECT_EQ(kMitsubishiAcMinTemp, mitsub.getTemp());
+
+ mitsub.setTemp(255);
+ EXPECT_EQ(kMitsubishiAcMaxTemp, mitsub.getTemp());
+
+ mitsub.setTemp(kMitsubishiAcMinTemp);
+ EXPECT_EQ(kMitsubishiAcMinTemp, mitsub.getTemp());
+
+ mitsub.setTemp(kMitsubishiAcMaxTemp);
+ EXPECT_EQ(kMitsubishiAcMaxTemp, mitsub.getTemp());
+
+ mitsub.setTemp(kMitsubishiAcMinTemp - 1);
+ EXPECT_EQ(kMitsubishiAcMinTemp, mitsub.getTemp());
+
+ mitsub.setTemp(kMitsubishiAcMaxTemp + 1);
+ EXPECT_EQ(kMitsubishiAcMaxTemp, mitsub.getTemp());
+
+ mitsub.setTemp(17);
+ EXPECT_EQ(17, mitsub.getTemp());
+
+ mitsub.setTemp(21);
+ EXPECT_EQ(21, mitsub.getTemp());
+
+ mitsub.setTemp(25);
+ EXPECT_EQ(25, mitsub.getTemp());
+
+ mitsub.setTemp(30);
+ EXPECT_EQ(30, mitsub.getTemp());
+}
+
+TEST(TestMitsubishiACClass, OperatingMode) {
+ IRMitsubishiAC mitsub(0);
+ mitsub.begin();
+
+ mitsub.setMode(kMitsubishiAcAuto);
+ EXPECT_EQ(kMitsubishiAcAuto, mitsub.getMode());
+
+ mitsub.setMode(kMitsubishiAcCool);
+ EXPECT_EQ(kMitsubishiAcCool, mitsub.getMode());
+
+ mitsub.setMode(kMitsubishiAcHeat);
+ EXPECT_EQ(kMitsubishiAcHeat, mitsub.getMode());
+
+ mitsub.setMode(kMitsubishiAcDry);
+ EXPECT_EQ(kMitsubishiAcDry, mitsub.getMode());
+
+ mitsub.setMode(kMitsubishiAcAuto + 1);
+ EXPECT_EQ(kMitsubishiAcAuto, mitsub.getMode());
+
+ mitsub.setMode(255);
+ EXPECT_EQ(kMitsubishiAcAuto, mitsub.getMode());
+}
+
+TEST(TestMitsubishiACClass, VaneMode) {
+ IRMitsubishiAC mitsub(0);
+ mitsub.begin();
+
+ mitsub.setVane(kMitsubishiAcVaneAuto);
+ EXPECT_EQ(kMitsubishiAcVaneAuto, mitsub.getVane());
+
+ mitsub.setVane(kMitsubishiAcVaneAuto + 1);
+ EXPECT_EQ(kMitsubishiAcVaneAuto + 1, mitsub.getVane());
+
+ mitsub.setVane(kMitsubishiAcVaneAutoMove);
+ EXPECT_EQ(kMitsubishiAcVaneAutoMove, mitsub.getVane());
+
+ mitsub.setVane(kMitsubishiAcVaneAutoMove + 1);
+ EXPECT_EQ(kMitsubishiAcVaneAutoMove, mitsub.getVane());
+
+ mitsub.setVane(kMitsubishiAcVaneAutoMove - 1);
+ EXPECT_EQ(kMitsubishiAcVaneAutoMove - 1, mitsub.getVane());
+}
+
+TEST(TestMitsubishiACClass, FanSpeed) {
+ IRMitsubishiAC mitsub(0);
+ mitsub.begin();
+
+ mitsub.setFan(kMitsubishiAcFanAuto);
+ EXPECT_EQ(kMitsubishiAcFanAuto, mitsub.getFan());
+
+ mitsub.setFan(255);
+ EXPECT_EQ(kMitsubishiAcFanRealMax, mitsub.getFan());
+
+ mitsub.setFan(kMitsubishiAcFanMax);
+ EXPECT_EQ(kMitsubishiAcFanRealMax, mitsub.getFan());
+
+ mitsub.setFan(kMitsubishiAcFanMax - 1);
+ EXPECT_EQ(kMitsubishiAcFanMax - 1, mitsub.getFan());
+
+ mitsub.setFan(1);
+ EXPECT_EQ(1, mitsub.getFan());
+
+ mitsub.setFan(2);
+ EXPECT_EQ(2, mitsub.getFan());
+
+ mitsub.setFan(3);
+ EXPECT_EQ(3, mitsub.getFan());
+
+ mitsub.setFan(4);
+ EXPECT_EQ(4, mitsub.getFan());
+
+ mitsub.setFan(kMitsubishiAcFanSilent);
+ EXPECT_EQ(kMitsubishiAcFanSilent, mitsub.getFan());
+
+ mitsub.setFan(kMitsubishiAcFanSilent + 1);
+ EXPECT_EQ(kMitsubishiAcFanRealMax, mitsub.getFan());
+}
+
+TEST(TestMitsubishiACClass, MessageConstuction) {
+ IRMitsubishiAC mitsub(0);
+ IRsendTest irsend(4);
+ mitsub.begin();
+ irsend.begin();
+
+ mitsub.setFan(1);
+ mitsub.setMode(kMitsubishiAcCool);
+ mitsub.setTemp(27);
+ mitsub.setVane(3);
+ mitsub.on();
+
+ // Check everything for kicks.
+ EXPECT_EQ(1, mitsub.getFan());
+ EXPECT_EQ(kMitsubishiAcCool, mitsub.getMode());
+ EXPECT_EQ(27, mitsub.getTemp());
+ EXPECT_EQ(3, mitsub.getVane());
+ EXPECT_TRUE(mitsub.getPower());
+
+ irsend.reset();
+ irsend.sendMitsubishiAC(mitsub.getRaw());
+ EXPECT_EQ(
+ "m3400s1750"
+ "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420"
+ "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300"
+ "m450s420m450s1300m450s1300m450s420m450s420m450s1300m450s420m450s420"
+ "m450s1300m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s1300m450s420m450s420"
+ "m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420m450s420"
+ "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s420m450s420"
+ "m450s420m450s1300m450s1300m450s420m450s1300m450s1300m450s420m450s420"
+ "m450s1300m450s420m450s420m450s1300m450s1300m450s420m450s1300m450s420"
+ "m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s1300m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s420"
+ "m440s17100"
+ "m3400s1750"
+ "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420"
+ "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300"
+ "m450s420m450s1300m450s1300m450s420m450s420m450s1300m450s420m450s420"
+ "m450s1300m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s1300m450s420m450s420"
+ "m450s420m450s420m450s420m450s1300m450s1300m450s420m450s420m450s420"
+ "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s420m450s420"
+ "m450s420m450s1300m450s1300m450s420m450s1300m450s1300m450s420m450s420"
+ "m450s1300m450s420m450s420m450s1300m450s1300m450s420m450s1300m450s420"
+ "m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s1300m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420"
+ "m450s420m450s1300m450s1300m450s1300m450s420m450s420m450s1300m450s420"
+ "m440s17100",
+ irsend.outputStr());
+}
+
+// Tests for decodeMitsubishiAC() with real captured example.
+TEST(TestDecodeMitsubishiAC, DecodeRealExample) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Mitsubishi AC "Power On, 16C, low fan, vane auto move".
+ uint16_t rawData[583] = {
+ 3476, 1708, 416, 1264, 420, 1260, 414, 400, 448, 390, 446, 392,
+ 444, 1236, 440, 400, 446, 392, 446, 1234, 440, 1266, 418, 396,
+ 442, 1264, 420, 394, 444, 394, 442, 1264, 422, 1260, 414, 398,
+ 440, 1266, 418, 1264, 420, 392, 446, 392, 444, 1264, 422, 392,
+ 446, 392, 446, 1260, 414, 400, 448, 390, 446, 392, 444, 394,
+ 442, 396, 442, 398, 440, 424, 412, 400, 448, 390, 446, 392,
+ 446, 392, 444, 394, 442, 396, 442, 396, 440, 398, 438, 400,
+ 448, 390, 446, 392, 446, 392, 444, 396, 442, 396, 440, 398,
+ 440, 400, 438, 400, 448, 390, 446, 392, 444, 1236, 440, 1266,
+ 418, 394, 442, 396, 440, 398, 438, 402, 446, 1232, 444, 396,
+ 440, 1268, 418, 394, 442, 396, 440, 398, 440, 400, 448, 390,
+ 448, 1232, 442, 1266, 420, 394, 444, 1264, 422, 1260, 416, 396,
+ 440, 398, 450, 1230, 444, 396, 442, 398, 440, 1266, 418, 1264,
+ 422, 1258, 416, 1266, 418, 394, 442, 396, 440, 398, 440, 398,
+ 438, 400, 446, 392, 446, 392, 446, 392, 444, 396, 442, 396,
+ 440, 398, 438, 398, 438, 400, 448, 392, 446, 392, 444, 394,
+ 444, 396, 442, 396, 440, 398, 438, 400, 448, 390, 448, 392,
+ 444, 394, 444, 394, 442, 396, 442, 396, 440, 398, 438, 400,
+ 448, 390, 446, 392, 446, 392, 444, 394, 442, 396, 442, 396,
+ 440, 398, 438, 400, 448, 390, 446, 392, 444, 394, 444, 394,
+ 442, 396, 440, 398, 440, 398, 438, 400, 448, 390, 446, 392,
+ 444, 394, 444, 394, 442, 396, 440, 398, 438, 400, 438, 400,
+ 448, 392, 446, 392, 444, 394, 442, 396, 442, 396, 440, 398,
+ 438, 1240, 444, 1264, 422, 390, 446, 392, 446, 1260, 414, 1268,
+ 418, 1264, 422, 12984, 3478, 1708, 418, 1264, 422, 1234, 442, 398,
+ 448, 390, 446, 392, 446, 1234, 440, 400, 448, 390, 446, 1234,
+ 442, 1266, 420, 392, 444, 1264, 420, 392, 446, 394, 444, 1236,
+ 448, 1260, 416, 398, 440, 1266, 418, 1262, 422, 390, 446, 392,
+ 444, 1234, 440, 400, 448, 392, 446, 1234, 440, 398, 450, 390,
+ 446, 392, 444, 394, 444, 394, 442, 396, 442, 398, 440, 400,
+ 438, 400, 448, 390, 446, 392, 444, 394, 442, 396, 442, 396,
+ 440, 398, 438, 400, 448, 390, 446, 392, 446, 392, 444, 394,
+ 442, 396, 442, 396, 440, 398, 438, 400, 448, 416, 420, 392,
+ 444, 1234, 440, 1240, 446, 394, 442, 396, 440, 398, 438, 400,
+ 448, 1232, 444, 396, 440, 1240, 446, 394, 442, 396, 440, 398,
+ 440, 400, 448, 390, 446, 1232, 444, 1238, 446, 394, 444, 1236,
+ 448, 1232, 442, 396, 440, 398, 448, 1232, 444, 396, 440, 398,
+ 438, 1242, 444, 1238, 448, 1234, 442, 1240, 444, 394, 442, 396,
+ 440, 398, 438, 400, 448, 390, 446, 394, 444, 420, 416, 394,
+ 444, 396, 440, 398, 440, 398, 438, 400, 448, 418, 420, 418,
+ 418, 394, 442, 396, 442, 396, 440, 424, 412, 400, 448, 390,
+ 446, 392, 446, 420, 418, 420, 416, 396, 440, 398, 440, 424,
+ 412, 426, 420, 418, 420, 392, 444, 394, 444, 422, 416, 422,
+ 414, 398, 440, 426, 422, 388, 448, 416, 420, 418, 418, 422,
+ 416, 422, 414, 424, 414, 398, 438, 426, 422, 418, 420, 390,
+ 446, 418, 418, 420, 416, 396, 440, 424, 412, 426, 412, 400,
+ 446, 418, 420, 420, 418, 420, 416, 422, 414, 422, 414, 424,
+ 412, 426, 422, 390, 446, 1232, 442, 1240, 446, 394, 444, 394,
+ 442, 1238, 446, 1234, 440, 1240, 444}; // UNKNOWN F6FDB82B
+
+ irsend.sendRaw(rawData, 583, 33);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(MITSUBISHI_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kMitsubishiACBits, irsend.capture.bits);
+ uint8_t expected[kMitsubishiACStateLength] = {
+ 0x23, 0xCB, 0x26, 0x01, 0x00, 0x00, 0x18, 0x0A, 0x36,
+ 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6};
+ EXPECT_STATE_EQ(expected, irsend.capture.state, kMitsubishiACBits);
+}
+
+// Tests for decodeMitsubishiAC() when the first payload has an error.
+TEST(TestDecodeMitsubishiAC, DecodeRealExampleRepeatNeeded) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Mitsubishi AC "Power On, 16C, low fan, vane auto move".
+ uint16_t rawData[583] = {
+ 3476, 1708, 416, 1264, 420, 1260, 414, 400, 448, 390, 446, 392, 444, 1236,
+ 440, 400, 446, 392, 446, 1234, 440, 1266, 418, 396, 442, 1264, 420, 394,
+ 444, 394, 442, 1264, 422, 1260, 414, 398, 440, 1266, 418, 1264, 420, 392,
+ 446, 392, 444, 1264, 422, 392, 446, 392, 446, 1260, 414, 400, 448, 390,
+ 446, 392, 444, 394, 442, 396, 442, 398, 440, 424, 412, 400, 448, 390, 446,
+ 392, 446, 392, 444, 394, 442, 396, 442, 396, 440, 398, 438, 400, 448, 390,
+ 446, 392, 446, 392, 444, 396, 442, 396, 440, 398, 440, 400, 438, 400, 448,
+ 390, 446, 392, 444, 1236, 440, 1266, 418, 394, 442, 396, 440, 398, 438,
+ 402, 446, 1232, 444, 396, 440, 1268, 418, 394, 442, 396, 440, 398,
+ // space 699 is not recognizable:
+ 440, 400, 448, 390, 448, 1232, 442, 1266, 420, 394, 444, 1264, 699, 1260,
+ 416, 396, 440, 398, 450, 1230, 444, 396, 442, 398, 440, 1266, 418, 1264,
+ 422, 1258, 416, 1266, 418, 394, 442, 396, 440, 398, 440, 398, 438, 400,
+ 446, 392, 446, 392, 446, 392, 444, 396, 442, 396, 440, 398, 438, 398, 438,
+ 400, 448, 392, 446, 392, 444, 394, 444, 396, 442, 396, 440, 398, 438, 400,
+ 448, 390, 448, 392, 444, 394, 444, 394, 442, 396, 442, 396, 440, 398, 438,
+ 400, 448, 390, 446, 392, 446, 392, 444, 394, 442, 396, 442, 396, 440, 398,
+ 438, 400, 448, 390, 446, 392, 444, 394, 444, 394, 442, 396, 440, 398, 440,
+ 398, 438, 400, 448, 390, 446, 392, 444, 394, 444, 394, 442, 396, 440, 398,
+ 438, 400, 438, 400, 448, 392, 446, 392, 444, 394, 442, 396, 442, 396, 440,
+ 398, 438, 1240, 444, 1264, 422, 390, 446, 392, 446, 1260, 414, 1268, 418,
+ 1264, 422, 12984, 3478, 1708, 418, 1264, 422, 1234, 442, 398, 448, 390,
+ 446, 392, 446, 1234, 440, 400, 448, 390, 446, 1234, 442, 1266, 420, 392,
+ 444, 1264, 420, 392, 446, 394, 444, 1236, 448, 1260, 416, 398, 440, 1266,
+ 418, 1262, 422, 390, 446, 392, 444, 1234, 440, 400, 448, 392, 446, 1234,
+ 440, 398, 450, 390, 446, 392, 444, 394, 444, 394, 442, 396, 442, 398, 440,
+ 400, 438, 400, 448, 390, 446, 392, 444, 394, 442, 396, 442, 396, 440, 398,
+ 438, 400, 448, 390, 446, 392, 446, 392, 444, 394, 442, 396, 442, 396, 440,
+ 398, 438, 400, 448, 416, 420, 392, 444, 1234, 440, 1240, 446, 394, 442,
+ 396, 440, 398, 438, 400, 448, 1232, 444, 396, 440, 1240, 446, 394, 442,
+ 396, 440, 398, 440, 400, 448, 390, 446, 1232, 444, 1238, 446, 394, 444,
+ 1236, 448, 1232, 442, 396, 440, 398, 448, 1232, 444, 396, 440, 398, 438,
+ 1242, 444, 1238, 448, 1234, 442, 1240, 444, 394, 442, 396, 440, 398, 438,
+ 400, 448, 390, 446, 394, 444, 420, 416, 394, 444, 396, 440, 398, 440, 398,
+ 438, 400, 448, 418, 420, 418, 418, 394, 442, 396, 442, 396, 440, 424, 412,
+ 400, 448, 390, 446, 392, 446, 420, 418, 420, 416, 396, 440, 398, 440, 424,
+ 412, 426, 420, 418, 420, 392, 444, 394, 444, 422, 416, 422, 414, 398, 440,
+ 426, 422, 388, 448, 416, 420, 418, 418, 422, 416, 422, 414, 424, 414, 398,
+ 438, 426, 422, 418, 420, 390, 446, 418, 418, 420, 416, 396, 440, 424, 412,
+ 426, 412, 400, 446, 418, 420, 420, 418, 420, 416, 422, 414, 422, 414, 424,
+ 412, 426, 422, 390, 446, 1232, 442, 1240, 446, 394, 444, 394, 442, 1238,
+ 446, 1234, 440, 1240, 444}; // UNKNOWN F6FDB82B
+
+ irsend.sendRaw(rawData, 583, 33);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(MITSUBISHI_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kMitsubishiACBits, irsend.capture.bits);
+ uint8_t expected[kMitsubishiACStateLength] = {
+ 0x23, 0xCB, 0x26, 0x01, 0x00, 0x00, 0x18, 0x0A, 0x36,
+ 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6};
+ EXPECT_STATE_EQ(expected, irsend.capture.state, kMitsubishiACBits);
+}
+
+// Tests for decodeMitsubishiAC() when the repeat mark is wrong.
+TEST(TestDecodeMitsubishiAC, DecodeRealExampleRepeatMarkError) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Mitsubishi AC "Power On, 16C, low fan, vane auto move".
+ uint16_t rawData[583] = {
+ 3476, 1708, 416, 1264, 420, 1260, 414, 400, 448, 390, 446, 392, 444, 1236,
+ 440, 400, 446, 392, 446, 1234, 440, 1266, 418, 396, 442, 1264, 420, 394,
+ 444, 394, 442, 1264, 422, 1260, 414, 398, 440, 1266, 418, 1264, 420, 392,
+ 446, 392, 444, 1264, 422, 392, 446, 392, 446, 1260, 414, 400, 448, 390,
+ 446, 392, 444, 394, 442, 396, 442, 398, 440, 424, 412, 400, 448, 390, 446,
+ 392, 446, 392, 444, 394, 442, 396, 442, 396, 440, 398, 438, 400, 448, 390,
+ 446, 392, 446, 392, 444, 396, 442, 396, 440, 398, 440, 400, 438, 400, 448,
+ 390, 446, 392, 444, 1236, 440, 1266, 418, 394, 442, 396, 440, 398, 438,
+ 402, 446, 1232, 444, 396, 440, 1268, 418, 394, 442, 396, 440, 398, 440,
+ 400, 448, 390, 448, 1232, 442, 1266, 420, 394, 444, 1264, 422, 1260, 416,
+ 396, 440, 398, 450, 1230, 444, 396, 442, 398, 440, 1266, 418, 1264, 422,
+ 1258, 416, 1266, 418, 394, 442, 396, 440, 398, 440, 398, 438, 400, 446,
+ 392, 446, 392, 446, 392, 444, 396, 442, 396, 440, 398, 438, 398, 438, 400,
+ 448, 392, 446, 392, 444, 394, 444, 396, 442, 396, 440, 398, 438, 400, 448,
+ 390, 448, 392, 444, 394, 444, 394, 442, 396, 442, 396, 440, 398, 438, 400,
+ 448, 390, 446, 392, 446, 392, 444, 394, 442, 396, 442, 396, 440, 398, 438,
+ 400, 448, 390, 446, 392, 444, 394, 444, 394, 442, 396, 440, 398, 440, 398,
+ 438, 400, 448, 390, 446, 392, 444, 394, 444, 394, 442, 396, 440, 398, 438,
+ 400, 438, 400, 448, 392, 446, 392, 444, 394, 442, 396, 442, 396, 440, 398,
+ 438, 1240, 444, 1264, 422, 390, 446, 392, 446,
+ // Repeat mark (1111) wrong:
+ 1260, 414, 1268, 418, 1264, 422, 1111, 347, 1708, 418, 1264, 422, 1234,
+ 442, 398, 448, 390, 446, 392, 446, 1234, 440, 400, 448, 390, 446, 1234,
+ 442, 1266, 420, 392, 444, 1264, 420, 392, 446, 394, 444, 1236, 448, 1260,
+ 416, 398, 440, 1266, 418, 1262, 422, 390, 446, 392, 444, 1234, 440, 400,
+ 448, 392, 446, 1234, 440, 398, 450, 390, 446, 392, 444, 394, 444, 394,
+ 442, 396, 442, 398, 440, 400, 438, 400, 448, 390, 446, 392, 444, 394, 442,
+ 396, 442, 396, 440, 398, 438, 400, 448, 390, 446, 392, 446, 392, 444, 394,
+ 442, 396, 442, 396, 440, 398, 438, 400, 448, 416, 420, 392, 444, 1234,
+ 440, 1240, 446, 394, 442, 396, 440, 398, 438, 400, 448, 1232, 444, 396,
+ 440, 1240, 446, 394, 442, 396, 440, 398, 440, 400, 448, 390, 446, 1232,
+ 444, 1238, 446, 394, 444, 1236, 448, 1232, 442, 396, 440, 398, 448, 1232,
+ 444, 396, 440, 398, 438, 1242, 444, 1238, 448, 1234, 442, 1240, 444, 394,
+ 442, 396, 440, 398, 438, 400, 448, 390, 446, 394, 444, 420, 416, 394, 444,
+ 396, 440, 398, 440, 398, 438, 400, 448, 418, 420, 418, 418, 394, 442, 396,
+ 442, 396, 440, 424, 412, 400, 448, 390, 446, 392, 446, 420, 418, 420, 416,
+ 396, 440, 398, 440, 424, 412, 426, 420, 418, 420, 392, 444, 394, 444, 422,
+ 416, 422, 414, 398, 440, 426, 422, 388, 448, 416, 420, 418, 418, 422, 416,
+ 422, 414, 424, 414, 398, 438, 426, 422, 418, 420, 390, 446, 418, 418, 420,
+ 416, 396, 440, 424, 412, 426, 412, 400, 446, 418, 420, 420, 418, 420, 416,
+ 422, 414, 422, 414, 424, 412, 426, 422, 390, 446, 1232, 442, 1240, 446,
+ 394, 444, 394, 442, 1238, 446, 1234, 440, 1240, 444}; // UNKNOWN F6FDB82B
+
+ irsend.sendRaw(rawData, 583, 33);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(MITSUBISHI_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kMitsubishiACBits, irsend.capture.bits);
+ uint8_t expected[kMitsubishiACStateLength] = {
+ 0x23, 0xCB, 0x26, 0x01, 0x00, 0x00, 0x18, 0x0A, 0x36,
+ 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6};
+ EXPECT_STATE_EQ(expected, irsend.capture.state, kMitsubishiACBits);
+}
+
+// Tests for decodeMitsubishiAC() when first payload has an error and the
+// repeat mark is wrong.
+TEST(TestDecodeMitsubishiAC, DecodeRealExampleRepeatNeededButError) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Mitsubishi AC "Power On, 16C, low fan, vane auto move".
+ uint16_t rawData[583] = {
+ 3476, 1708, 416, 1264, 420, 1260, 414, 400, 448, 390, 446, 392, 444, 1236,
+ 440, 400, 446, 392, 446, 1234, 440, 1266, 418, 396, 442, 1264, 420, 394,
+ 444, 394, 442, 1264, 422, 1260, 414, 398, 440, 1266, 418, 1264, 420, 392,
+ 446, 392, 444, 1264, 422, 392, 446, 392, 446, 1260, 414, 400, 448, 390,
+ 446, 392, 444, 394, 442, 396, 442, 398, 440, 424, 412, 400, 448, 390, 446,
+ 392, 446, 392, 444, 394, 442, 396, 442, 396, 440, 398, 438, 400, 448, 390,
+ 446, 392, 446, 392, 444, 396, 442, 396, 440, 398, 440, 400, 438, 400, 448,
+ 390, 446, 392, 444, 1236, 440, 1266, 418, 394, 442, 396, 440, 398, 438,
+ 402, 446, 1232, 444, 396, 440, 1268, 418, 394, 442, 396, 440, 398,
+ // space 699 is not recognizable:
+ 440, 400, 448, 390, 448, 1232, 442, 1266, 420, 394, 444, 1264, 699, 1260,
+ 416, 396, 440, 398, 450, 1230, 444, 396, 442, 398, 440, 1266, 418, 1264,
+ 422, 1258, 416, 1266, 418, 394, 442, 396, 440, 398, 440, 398, 438, 400,
+ 446, 392, 446, 392, 446, 392, 444, 396, 442, 396, 440, 398, 438, 398, 438,
+ 400, 448, 392, 446, 392, 444, 394, 444, 396, 442, 396, 440, 398, 438, 400,
+ 448, 390, 448, 392, 444, 394, 444, 394, 442, 396, 442, 396, 440, 398, 438,
+ 400, 448, 390, 446, 392, 446, 392, 444, 394, 442, 396, 442, 396, 440, 398,
+ 438, 400, 448, 390, 446, 392, 444, 394, 444, 394, 442, 396, 440, 398, 440,
+ 398, 438, 400, 448, 390, 446, 392, 444, 394, 444, 394, 442, 396, 440, 398,
+ 438, 400, 438, 400, 448, 392, 446, 392, 444, 394, 442, 396, 442, 396, 440,
+ 398, 438, 1240, 444, 1264, 422, 390, 446, 392, 446,
+ // 1111 is not a valid repeat mark:
+ 1260, 414, 1268, 418, 1264, 422, 1111, 3478, 1708, 418, 1264, 422, 1234,
+ 442, 398, 448, 390, 446, 392, 446, 1234, 440, 400, 448, 390, 446, 1234,
+ 442, 1266, 420, 392, 444, 1264, 420, 392, 446, 394, 444, 1236, 448, 1260,
+ 416, 398, 440, 1266, 418, 1262, 422, 390, 446, 392, 444, 1234, 440, 400,
+ 448, 392, 446, 1234, 440, 398, 450, 390, 446, 392, 444, 394, 444, 394,
+ 442, 396, 442, 398, 440, 400, 438, 400, 448, 390, 446, 392, 444, 394, 442,
+ 396, 442, 396, 440, 398, 438, 400, 448, 390, 446, 392, 446, 392, 444, 394,
+ 442, 396, 442, 396, 440, 398, 438, 400, 448, 416, 420, 392, 444, 1234,
+ 440, 1240, 446, 394, 442, 396, 440, 398, 438, 400, 448, 1232, 444, 396,
+ 440, 1240, 446, 394, 442, 396, 440, 398, 440, 400, 448, 390, 446, 1232,
+ 444, 1238, 446, 394, 444, 1236, 448, 1232, 442, 396, 440, 398, 448, 1232,
+ 444, 396, 440, 398, 438, 1242, 444, 1238, 448, 1234, 442, 1240, 444, 394,
+ 442, 396, 440, 398, 438, 400, 448, 390, 446, 394, 444, 420, 416, 394, 444,
+ 396, 440, 398, 440, 398, 438, 400, 448, 418, 420, 418, 418, 394, 442, 396,
+ 442, 396, 440, 424, 412, 400, 448, 390, 446, 392, 446, 420, 418, 420, 416,
+ 396, 440, 398, 440, 424, 412, 426, 420, 418, 420, 392, 444, 394, 444, 422,
+ 416, 422, 414, 398, 440, 426, 422, 388, 448, 416, 420, 418, 418, 422, 416,
+ 422, 414, 424, 414, 398, 438, 426, 422, 418, 420, 390, 446, 418, 418, 420,
+ 416, 396, 440, 424, 412, 426, 412, 400, 446, 418, 420, 420, 418, 420, 416,
+ 422, 414, 422, 414, 424, 412, 426, 422, 390, 446, 1232, 442, 1240, 446,
+ 394, 444, 394, 442, 1238, 446, 1234, 440, 1240, 444}; // UNKNOWN F6FDB82B
+
+ irsend.sendRaw(rawData, 583, 33);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(UNKNOWN, irsend.capture.decode_type);
+}
+
+TEST(TestMitsubishiACClass, HumanReadable) {
+ IRMitsubishiAC irMitsu(0);
+ EXPECT_EQ(
+ "Power: On (HEAT), Temp: 22C, FAN: SILENT, VANE: AUTO, "
+ "Time: 17:10, On timer: 00:00, Off timer: 00:00, Timer: -",
+ irMitsu.toString());
+}
+
+// Test sending typical data only.
+TEST(TestSendMitsubishi2, SendDataOnly) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendMitsubishi2(0xF82);
+ EXPECT_EQ(
+ "m8400s4200"
+ "m560s520m560s520m560s520m560s520m560s1560m560s1560m560s1560m560s1560"
+ "m560s4200"
+ "m560s1560m560s520m560s520m560s520m560s520m560s520m560s1560m560s520"
+ "m560s28500"
+ "m8400s4200"
+ "m560s520m560s520m560s520m560s520m560s1560m560s1560m560s1560m560s1560"
+ "m560s4200"
+ "m560s1560m560s520m560s520m560s520m560s520m560s520m560s1560m560s520"
+ "m560s28500",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendMitsubishi2(0x0);
+ EXPECT_EQ(
+ "m8400s4200"
+ "m560s520m560s520m560s520m560s520m560s520m560s520m560s520m560s520"
+ "m560s4200"
+ "m560s520m560s520m560s520m560s520m560s520m560s520m560s520m560s520"
+ "m560s28500"
+ "m8400s4200"
+ "m560s520m560s520m560s520m560s520m560s520m560s520m560s520m560s520"
+ "m560s4200"
+ "m560s520m560s520m560s520m560s520m560s520m560s520m560s520m560s520"
+ "m560s28500",
+ irsend.outputStr());
+}
+
+// Test sending odd repeats.
+TEST(TestSendMitsubishi2, Repeats) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendMitsubishi2(0xF82, kMitsubishiBits, 0);
+ EXPECT_EQ(
+ "m8400s4200"
+ "m560s520m560s520m560s520m560s520m560s1560m560s1560m560s1560m560s1560"
+ "m560s4200"
+ "m560s1560m560s520m560s520m560s520m560s520m560s520m560s1560m560s520"
+ "m560s28500",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendMitsubishi2(0xF82, kMitsubishiBits, 2);
+ EXPECT_EQ(
+ "m8400s4200"
+ "m560s520m560s520m560s520m560s520m560s1560m560s1560m560s1560m560s1560"
+ "m560s4200"
+ "m560s1560m560s520m560s520m560s520m560s520m560s520m560s1560m560s520"
+ "m560s28500"
+ "m8400s4200"
+ "m560s520m560s520m560s520m560s520m560s1560m560s1560m560s1560m560s1560"
+ "m560s4200"
+ "m560s1560m560s520m560s520m560s520m560s520m560s520m560s1560m560s520"
+ "m560s28500"
+ "m8400s4200"
+ "m560s520m560s520m560s520m560s520m560s1560m560s1560m560s1560m560s1560"
+ "m560s4200"
+ "m560s1560m560s520m560s520m560s520m560s520m560s520m560s1560m560s520"
+ "m560s28500",
+ irsend.outputStr());
+}
+
+// Tests for decodeMitsubishi2().
+
+// Decode synthetic examples.
+TEST(TestDecodeMitsubishi2, DecodeSyntheticExamples) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Mitsubishi Projector "Power On" (16-bit).
+ irsend.sendMitsubishi2(0xF82);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(MITSUBISHI2, irsend.capture.decode_type);
+ EXPECT_EQ(kMitsubishiBits, irsend.capture.bits);
+ EXPECT_EQ(0xF82, irsend.capture.value);
+ EXPECT_EQ(0xF, irsend.capture.address);
+ EXPECT_EQ(0x82, irsend.capture.command);
+
+ irsend.reset();
+ irsend.sendMitsubishi2(0x0);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(MITSUBISHI2, irsend.capture.decode_type);
+ EXPECT_EQ(kMitsubishiBits, irsend.capture.bits);
+ EXPECT_EQ(0x0, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+
+ irsend.reset();
+ irsend.sendMitsubishi2(0x1234);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(MITSUBISHI2, irsend.capture.decode_type);
+ EXPECT_EQ(kMitsubishiBits, irsend.capture.bits);
+ EXPECT_EQ(0x1234, irsend.capture.value);
+ EXPECT_EQ(0x12, irsend.capture.address);
+ EXPECT_EQ(0x34, irsend.capture.command);
+}
+
+// Decode a 'real' example from Issue #441
+TEST(TestDecodeMitsubishi2, DecodeRealExample) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Mitsubishi Projector "Power On" (16-bit).
+ uint16_t rawData[75] = {
+ 8402, 4172, 554, 490, 562, 484, 560, 514, 532, 512, 534,
+ 1566, 526, 1572, 526, 1542, 560, 1568, 532, 4192, 534, 1564,
+ 532, 484, 560, 512, 532, 512, 532, 514, 530, 514, 526,
+ 1570, 524, 520, 526, 28506, 8454, 4170, 560, 514, 528, 516,
+ 526, 520, 524, 490, 556, 1572, 534, 1534, 560, 1568, 530,
+ 1538, 558, 4166, 560, 1538, 558, 490, 560, 512, 530, 514,
+ 532, 484, 558, 514, 532, 1566, 530, 486, 554}; // UNKNOWN 96A1512F
+
+ irsend.sendRaw(rawData, 75, 33);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(MITSUBISHI2, irsend.capture.decode_type);
+ EXPECT_EQ(kMitsubishiBits, irsend.capture.bits);
+ EXPECT_EQ(0xF82, irsend.capture.value);
+ EXPECT_EQ(0xF, irsend.capture.address);
+ EXPECT_EQ(0x82, irsend.capture.command);
+}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_NEC_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_NEC_test.cpp
similarity index 63%
rename from lib/IRremoteESP8266-2.2.1.02/test/ir_NEC_test.cpp
rename to lib/IRremoteESP8266-2.5.2.03/test/ir_NEC_test.cpp
index 781aa38d777a..6b84b0ec9157 100644
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_NEC_test.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_NEC_test.cpp
@@ -11,18 +11,21 @@ TEST(TestSendNEC, SendDataOnly) {
IRsendTest irsend(4);
irsend.begin();
irsend.sendNEC(0);
- EXPECT_EQ("m8960s4480m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s560m560s108080", irsend.outputStr());
+ EXPECT_EQ(
+ "m8960s4480m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s58240",
+ irsend.outputStr());
irsend.sendNEC(0xAA00FF55);
- EXPECT_EQ("m8960s4480m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s1680m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s560m560s560m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s1680m560s1680m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s560m560s1680m560s560m560s1680m560s108080",
- irsend.outputStr());
+ EXPECT_EQ(
+ "m8960s4480m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s1680m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s560m560s1680m560s1680m560s1680m560s1680m560s1680"
+ "m560s1680m560s1680m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s560m560s1680m560s560m560s1680m560s40320",
+ irsend.outputStr());
}
// Test sending different bit lengths.
@@ -30,22 +33,26 @@ TEST(TestSendNEC, SendSmallData) {
IRsendTest irsend(4);
irsend.begin();
irsend.sendNEC(0xA, 4); // Send only 4 data bits.
- EXPECT_EQ("m8960s4480m560s1680m560s560m560s1680m560s560m560s108080",
+ EXPECT_EQ("m8960s4480m560s1680m560s560m560s1680m560s560m560s87360",
irsend.outputStr());
irsend.sendNEC(0, 8); // Send only 8 data bits.
- EXPECT_EQ("m8960s4480m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s560m560s108080", irsend.outputStr());
+ EXPECT_EQ(
+ "m8960s4480m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s85120",
+ irsend.outputStr());
irsend.sendNEC(0x1234567890ABCDEF, 64); // Send 64 data bits.
- EXPECT_EQ("m8960s4480m560s560m560s560m560s560m560s1680m560s560m560s560"
- "m560s1680m560s560m560s560m560s560m560s1680m560s1680m560s560"
- "m560s1680m560s560m560s560m560s560m560s1680m560s560m560s1680"
- "m560s560m560s1680m560s1680m560s560m560s560m560s1680m560s1680"
- "m560s1680m560s1680m560s560m560s560m560s560m560s1680m560s560"
- "m560s560m560s1680m560s560m560s560m560s560m560s560m560s1680m560s560"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s1680m560s1680"
- "m560s1680m560s560m560s560m560s1680m560s1680m560s560m560s1680"
- "m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s1680"
- "m560s1680m560s108080", irsend.outputStr());
+ EXPECT_EQ(
+ "m8960s4480m560s560m560s560m560s560m560s1680m560s560m560s560"
+ "m560s1680m560s560m560s560m560s560m560s1680m560s1680m560s560"
+ "m560s1680m560s560m560s560m560s560m560s1680m560s560m560s1680"
+ "m560s560m560s1680m560s1680m560s560m560s560m560s1680m560s1680"
+ "m560s1680m560s1680m560s560m560s560m560s560m560s1680m560s560"
+ "m560s560m560s1680m560s560m560s560m560s560m560s560m560s1680m560s560"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s1680m560s1680"
+ "m560s1680m560s560m560s560m560s1680m560s1680m560s560m560s1680"
+ "m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s1680"
+ "m560s1680m560s22400",
+ irsend.outputStr());
}
// Test sending with repeats.
@@ -53,20 +60,24 @@ TEST(TestSendNEC, SendWithRepeats) {
IRsendTest irsend(4);
irsend.begin();
irsend.sendNEC(0, 8, 0); // Send a command with 0 repeats.
- EXPECT_EQ("m8960s4480m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s560m560s108080", irsend.outputStr());
+ EXPECT_EQ(
+ "m8960s4480m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s85120",
+ irsend.outputStr());
irsend.sendNEC(0xAA, 8, 1); // Send a command with 1 repeat.
- EXPECT_EQ("m8960s4480m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s1680m560s560m560s108080"
- "m8960s2240m560s108080",
- irsend.outputStr());
+ EXPECT_EQ(
+ "m8960s4480m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s1680m560s560m560s80640"
+ "m8960s2240m560s96320",
+ irsend.outputStr());
irsend.sendNEC(0xAA, 8, 3); // Send a command with 3 repeats.
- EXPECT_EQ("m8960s4480m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s1680m560s560m560s108080"
- "m8960s2240m560s108080"
- "m8960s2240m560s108080"
- "m8960s2240m560s108080",
- irsend.outputStr());
+ EXPECT_EQ(
+ "m8960s4480m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s1680m560s560m560s80640"
+ "m8960s2240m560s96320"
+ "m8960s2240m560s96320"
+ "m8960s2240m560s96320",
+ irsend.outputStr());
}
// Tests for encodeNEC().
@@ -101,7 +112,7 @@ TEST(TestDecodeNEC, NormalNECDecodeWithStrict) {
irsend.makeDecodeResult();
EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture));
EXPECT_EQ(NEC, irsend.capture.decode_type);
- EXPECT_EQ(NEC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
EXPECT_EQ(0x807F40BF, irsend.capture.value);
EXPECT_EQ(0x1, irsend.capture.address);
EXPECT_EQ(0x2, irsend.capture.command);
@@ -112,7 +123,7 @@ TEST(TestDecodeNEC, NormalNECDecodeWithStrict) {
irsend.makeDecodeResult();
EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture));
EXPECT_EQ(NEC, irsend.capture.decode_type);
- EXPECT_EQ(NEC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
EXPECT_EQ(0xC1A28877, irsend.capture.value);
EXPECT_EQ(0x4583, irsend.capture.address);
EXPECT_EQ(0x11, irsend.capture.command);
@@ -129,7 +140,7 @@ TEST(TestDecodeNEC, NormalNECDecodeWithStrict) {
irsend.makeDecodeResult();
EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture));
EXPECT_EQ(NEC, irsend.capture.decode_type);
- EXPECT_EQ(NEC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
EXPECT_EQ(0x807F40BF, irsend.capture.value);
EXPECT_EQ(0x1, irsend.capture.address);
EXPECT_EQ(0x2, irsend.capture.command);
@@ -146,7 +157,7 @@ TEST(TestDecodeNEC, NormalNECDecodeWithoutStrict) {
irsend.makeDecodeResult();
EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture, 32, false));
EXPECT_EQ(NEC, irsend.capture.decode_type);
- EXPECT_EQ(NEC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
EXPECT_EQ(0, irsend.capture.value);
EXPECT_EQ(0, irsend.capture.address);
EXPECT_EQ(0, irsend.capture.command);
@@ -156,7 +167,7 @@ TEST(TestDecodeNEC, NormalNECDecodeWithoutStrict) {
irsend.makeDecodeResult();
EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture, 32, false));
EXPECT_EQ(NEC, irsend.capture.decode_type);
- EXPECT_EQ(NEC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
EXPECT_EQ(0x12345678, irsend.capture.value);
EXPECT_EQ(0x2C48, irsend.capture.address);
EXPECT_EQ(0, irsend.capture.command);
@@ -225,18 +236,18 @@ TEST(TestDecodeNEC, NoTrailingGap_Issue243) {
irsend.begin();
irsend.reset();
- uint16_t rawData[67] = {9000, 4500, 650, 550, 650, 1650, 600, 550, 650, 550,
- 600, 1650, 650, 550, 600, 1650, 650, 1650, 650, 1650,
- 600, 550, 650, 1650, 650, 1650, 650, 550, 600, 1650,
- 650, 1650, 650, 550, 650, 550, 650, 1650, 650, 550,
- 650, 550, 650, 550, 600, 550, 650, 550, 650, 550,
- 650, 1650, 600, 550, 650, 1650, 650, 1650, 650, 1650,
- 650, 1650, 650, 1650, 650, 1650, 600};
+ uint16_t rawData[67] = {
+ 9000, 4500, 650, 550, 650, 1650, 600, 550, 650, 550, 600, 1650,
+ 650, 550, 600, 1650, 650, 1650, 650, 1650, 600, 550, 650, 1650,
+ 650, 1650, 650, 550, 600, 1650, 650, 1650, 650, 550, 650, 550,
+ 650, 1650, 650, 550, 650, 550, 650, 550, 600, 550, 650, 550,
+ 650, 550, 650, 1650, 600, 550, 650, 1650, 650, 1650, 650, 1650,
+ 650, 1650, 650, 1650, 650, 1650, 600};
irsend.sendRaw(rawData, 67, 38);
irsend.makeDecodeResult();
EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture));
EXPECT_EQ(NEC, irsend.capture.decode_type);
- EXPECT_EQ(NEC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
EXPECT_EQ(0x4BB640BF, irsend.capture.value);
EXPECT_EQ(0x6DD2, irsend.capture.address);
EXPECT_EQ(0x2, irsend.capture.command);
@@ -246,16 +257,16 @@ TEST(TestDecodeNEC, NoTrailingGap_Issue243) {
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(NEC, irsend.capture.decode_type);
- EXPECT_EQ(NEC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
EXPECT_EQ(0x4BB640BF, irsend.capture.value);
// Add a zero length space to the message to test how it handles that as
- // a end of command gap.
+ // an end of command gap.
irsend.addGap(0);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(NEC, irsend.capture.decode_type);
- EXPECT_EQ(NEC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
EXPECT_EQ(0x4BB640BF, irsend.capture.value);
}
@@ -270,18 +281,18 @@ TEST(TestDecodeNEC, NonStrictNECDecode_Issue264) {
irsend.reset();
// Slightly modified example than reported due to poor timings that are too
// far out of spec.
- uint16_t rawData[67] = {9150, 4650, 550, 600, 550, 1800, 600, 1750, 600, 1800,
- 550, 600, 550, 1800, 550, 1750, 600, 1750, 600, 1750,
- 600, 1750, 600, 1700, 600, 600, 600, 600, 550, 600,
- 600, 600, 600, 1750, 600, 1750, 600, 600, 550, 1800,
- 600, 600, 600, 600, 600, 600, 500, 600, 600, 600,
- 600, 600, 600, 1750, 600, 600, 600, 550, 600, 600,
- 600, 600, 600, 600, 600, 550, 600};
+ uint16_t rawData[67] = {
+ 9150, 4650, 550, 600, 550, 1800, 600, 1750, 600, 1800, 550, 600,
+ 550, 1800, 550, 1750, 600, 1750, 600, 1750, 600, 1750, 600, 1700,
+ 600, 600, 600, 600, 550, 600, 600, 600, 600, 1750, 600, 1750,
+ 600, 600, 550, 1800, 600, 600, 600, 600, 600, 600, 500, 600,
+ 600, 600, 600, 600, 600, 1750, 600, 600, 600, 550, 600, 600,
+ 600, 600, 600, 600, 600, 550, 600};
irsend.sendRaw(rawData, 67, 38);
irsend.makeDecodeResult();
EXPECT_FALSE(irrecv.decodeNEC(&irsend.capture)); // Not strictly NEC
- EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture, NEC_BITS, false));
+ EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture, kNECBits, false));
EXPECT_EQ(0x77E1A040, irsend.capture.value);
// Do it all again, but with a normal decode.
@@ -290,7 +301,7 @@ TEST(TestDecodeNEC, NonStrictNECDecode_Issue264) {
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(NEC_LIKE, irsend.capture.decode_type);
- EXPECT_EQ(NEC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
EXPECT_EQ(0x77E1A040, irsend.capture.value);
}
@@ -303,18 +314,18 @@ TEST(TestDecodeNEC, AutoReceiveCalibration) {
// Data from Issue #264, for a remote that is slightly off spec.
// Should be matched as a NEC-like message however without self-calibrating
// the timings of the short spaces is out.
- uint16_t rawData[67] = {9150, 4600, 650, 600, 650, 1650, 650, 1700, 650, 1750,
- 650, 600, 650, 1700, 650, 1750, 650, 1750, 650, 1700,
- 650, 1700, 650, 1700, 650, 600, 650, 600, 650, 600,
- 600, 600, 650, 1750, 650, 1750, 650, 600, 650, 1700,
- 600, 600, 700, 550, 650, 550, 650, 600, 650, 600,
- 650, 600, 650, 1750, 600, 600, 650, 600, 650, 550,
- 650, 600, 650, 600, 650, 600, 600};
+ uint16_t rawData[67] = {
+ 9150, 4600, 650, 600, 650, 1650, 650, 1700, 650, 1750, 650, 600,
+ 650, 1700, 650, 1750, 650, 1750, 650, 1700, 650, 1700, 650, 1700,
+ 650, 600, 650, 600, 650, 600, 600, 600, 650, 1750, 650, 1750,
+ 650, 600, 650, 1700, 600, 600, 700, 550, 650, 550, 650, 600,
+ 650, 600, 650, 600, 650, 1750, 600, 600, 650, 600, 650, 550,
+ 650, 600, 650, 600, 650, 600, 600};
irsend.sendRaw(rawData, 67, 38);
irsend.makeDecodeResult();
- EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture, NEC_BITS, false));
+ EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture, kNECBits, false));
EXPECT_EQ(NEC, irsend.capture.decode_type);
- EXPECT_EQ(NEC_BITS, irsend.capture.bits);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
EXPECT_EQ(0x77E1A040, irsend.capture.value);
}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Nikai_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Nikai_test.cpp
new file mode 100644
index 000000000000..4a4ea05bb07a
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Nikai_test.cpp
@@ -0,0 +1,212 @@
+// Copyright 2017 David Conran
+
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests for sendNikai().
+// Test sending typical data only.
+TEST(TestSendNikai, SendDataOnly) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendNikai(0xD5F2A); // Nikai TV Power Off.
+ EXPECT_EQ(
+ "m4000s4000"
+ "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000"
+ "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000"
+ "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000"
+ "m500s2000m500s1000m500s2000m500s8500",
+ irsend.outputStr());
+
+ irsend.reset();
+}
+
+// Test sending with different repeats.
+TEST(TestSendNikai, SendWithRepeats) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendNikai(0xD5F2A, kNikaiBits, 1); // 1 repeat.
+ EXPECT_EQ(
+ "m4000s4000"
+ "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000"
+ "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000"
+ "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000"
+ "m500s2000m500s1000m500s2000m500s8500"
+ "m4000s4000"
+ "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000"
+ "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000"
+ "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000"
+ "m500s2000m500s1000m500s2000m500s8500",
+ irsend.outputStr());
+ irsend.sendNikai(0xD5F2A, kNikaiBits, 2); // 2 repeat.
+ EXPECT_EQ(
+ "m4000s4000"
+ "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000"
+ "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000"
+ "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000"
+ "m500s2000m500s1000m500s2000m500s8500"
+ "m4000s4000"
+ "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000"
+ "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000"
+ "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000"
+ "m500s2000m500s1000m500s2000m500s8500"
+ "m4000s4000"
+ "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000"
+ "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000"
+ "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000"
+ "m500s2000m500s1000m500s2000m500s8500",
+ irsend.outputStr());
+}
+
+// Tests for decodeNikai().
+
+// Decode normal Nikai messages.
+TEST(TestDecodeNikai, NormalDecodeWithStrict) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ // Normal Nikai 24-bit message.
+ irsend.reset();
+ irsend.sendNikai(0x123456);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, true));
+ EXPECT_EQ(NIKAI, irsend.capture.decode_type);
+ EXPECT_EQ(kNikaiBits, irsend.capture.bits);
+ EXPECT_EQ(0x123456, irsend.capture.value);
+
+ irsend.reset();
+ irsend.sendNikai(0x101);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, true));
+ EXPECT_EQ(NIKAI, irsend.capture.decode_type);
+ EXPECT_EQ(kNikaiBits, irsend.capture.bits);
+ EXPECT_EQ(0x101, irsend.capture.value);
+}
+
+// Decode normal repeated Nikai messages.
+TEST(TestDecodeNikai, NormalDecodeWithRepeatAndStrict) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ // Normal Nikai 24-bit message.
+ irsend.reset();
+ irsend.sendNikai(0xD5F2A, kNikaiBits, 2);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, true));
+ EXPECT_EQ(NIKAI, irsend.capture.decode_type);
+ EXPECT_EQ(kNikaiBits, irsend.capture.bits);
+ EXPECT_EQ(0xD5F2A, irsend.capture.value);
+}
+
+TEST(TestDecodeNikai, NormalDecodeWithNonStrict) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ // Illegal under length (16-bit) message
+ irsend.reset();
+ irsend.sendNikai(0x0, 16);
+ irsend.makeDecodeResult();
+ // Should fail with strict on.
+ ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, true));
+ // And it should fail when we expect more bits.
+ ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, false));
+
+ // Should pass if strict off if we ask for correct nr. of bits sent.
+ ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, 16, false));
+ EXPECT_EQ(NIKAI, irsend.capture.decode_type);
+ EXPECT_EQ(16, irsend.capture.bits);
+ EXPECT_EQ(0x0, irsend.capture.value);
+
+ // Should fail as we are expecting less bits than there are.
+ ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, 12, false));
+}
+
+// Decode (non-standard) 64-bit messages.
+// Decode unsupported Nikai messages.
+TEST(TestDecodeNikai, Decode64BitMessages) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Illegal size Nikai 64-bit message.
+ irsend.sendNikai(0xFFFFFFFFFFFFFFFF, 64);
+ irsend.makeDecodeResult();
+ ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, true));
+ // Should work with a 'normal' match (not strict)
+ ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, 64, false));
+ EXPECT_EQ(NIKAI, irsend.capture.decode_type);
+ EXPECT_EQ(64, irsend.capture.bits);
+ EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
+}
+
+// Decode real example via Issue #309
+TEST(TestDecodeNikai, DecodeExamples) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Nikai TV Power Off from Issue #309
+ uint16_t rawdata_off[100] = {
+ 4060, 3918, 508, 2004, 508, 2002, 510, 2002, 508, 2004, 506,
+ 1050, 508, 1048, 510, 2004, 508, 1048, 508, 2002, 510, 1050,
+ 508, 2004, 510, 1048, 508, 1050, 508, 1048, 508, 1050, 508,
+ 1050, 508, 2004, 508, 2002, 510, 1048, 508, 2004, 508, 1050,
+ 506, 2004, 508, 1048, 510, 2002, 456, 8446, 3956, 3998, 508,
+ 2004, 508, 2002, 508, 2004, 508, 1978, 532, 1050, 508, 1050,
+ 508, 2002, 508, 1050, 508, 2004, 508, 1050, 508, 2002, 510,
+ 1050, 508, 1050, 508, 1048, 508, 1050, 508, 1050, 508, 2002,
+ 510, 2002, 508, 1050, 508, 2002, 510, 1050, 508, 2002, 508};
+ irsend.sendRaw(rawdata_off, 100, 38);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(NIKAI, irsend.capture.decode_type);
+ EXPECT_EQ(kNikaiBits, irsend.capture.bits);
+ EXPECT_EQ(0xD5F2A, irsend.capture.value);
+
+ // Nikai TV Volume Up from Issue #309
+ uint16_t rawdata_volup[52] = {
+ 3972, 4002, 504, 1982, 526, 2010, 502, 2010, 502, 2010, 500,
+ 1056, 502, 1056, 502, 2010, 500, 1056, 502, 2010, 502, 2010,
+ 500, 2010, 502, 2010, 502, 1056, 502, 1056, 502, 1056, 500,
+ 1056, 502, 2010, 502, 2010, 500, 1056, 502, 2008, 502, 1054,
+ 504, 1054, 504, 1054, 500, 1056, 450};
+
+ irsend.reset();
+ irsend.sendRaw(rawdata_volup, 52, 38);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(NIKAI, irsend.capture.decode_type);
+ EXPECT_EQ(kNikaiBits, irsend.capture.bits);
+ EXPECT_EQ(0xD0F2F, irsend.capture.value);
+}
+
+// Fail to decode a non-Nikai example via GlobalCache
+TEST(TestDecodeNikai, FailToDecodeNonNikaiExample) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ uint16_t gc_test[71] = {38000, 1, 1, 172, 172, 22, 64, 22, 64, 22, 64, 22,
+ 21, 22, 21, 22, 21, 22, 11, 22, 21, 22, 128, 22,
+ 64, 22, 64, 22, 21, 22, 21, 22, 21, 22, 21, 22,
+ 21, 22, 64, 22, 21, 22, 21, 22, 64, 22, 64, 22,
+ 21, 22, 21, 22, 64, 22, 21, 22, 64, 22, 64, 22,
+ 21, 22, 21, 22, 64, 22, 64, 22, 21, 22, 1820};
+ irsend.sendGC(gc_test, 71);
+ irsend.makeDecodeResult();
+
+ ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture));
+ ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, false));
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Panasonic_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Panasonic_test.cpp
new file mode 100644
index 000000000000..a1d8a7979407
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Panasonic_test.cpp
@@ -0,0 +1,1135 @@
+// Copyright 2017, 2018 David Conran
+
+#include "ir_Panasonic.h"
+#include "IRrecv.h"
+#include "IRrecv_test.h"
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "IRutils.h"
+#include "gtest/gtest.h"
+
+// Tests for encodePanasonic().
+
+TEST(TestEncodePanasonic, General) {
+ IRsendTest irsend(4);
+ EXPECT_EQ(0x0, irsend.encodePanasonic(0, 0, 0, 0));
+ EXPECT_EQ(0x101010101, irsend.encodePanasonic(1, 1, 1, 1));
+ EXPECT_EQ(0xFFFF, irsend.encodePanasonic(0, 0, 0, 0xFF));
+ EXPECT_EQ(0xFF00FF, irsend.encodePanasonic(0, 0, 0xFF, 0));
+ EXPECT_EQ(0xFF0000FF, irsend.encodePanasonic(0, 0xFF, 0, 0));
+ EXPECT_EQ(0xFFFF00000000, irsend.encodePanasonic(0xFFFF, 0, 0, 0));
+ EXPECT_EQ(0xFFFFFFFFFFFF, irsend.encodePanasonic(0xFFFF, 0xFF, 0xFF, 0xFF));
+ EXPECT_EQ(0x40040190ED7C, irsend.encodePanasonic(0x4004, 0x01, 0x90, 0xED));
+}
+
+// Tests for sendPanasonic64().
+
+// Test sending typical data only.
+TEST(TestSendPanasonic64, SendDataOnly) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendPanasonic64(0x0);
+ EXPECT_EQ(
+ "m3456s1728"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s116208",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendPanasonic64(0x40040190ED7C);
+ EXPECT_EQ(
+ "m3456s1728"
+ "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
+ "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
+ "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
+ "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
+ "m432s102384",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendPanasonic64(0xFFFFFFFFFFFF);
+ EXPECT_EQ(
+ "m3456s1728"
+ "m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296"
+ "m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296"
+ "m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296"
+ "m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296"
+ "m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296"
+ "m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296"
+ "m432s74736",
+ irsend.outputStr());
+}
+
+// Test sending with different repeats.
+TEST(TestSendPanasonic64, SendWithRepeats) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendPanasonic64(0x40040190ED7C, kPanasonicBits, 0); // 0 repeats.
+ EXPECT_EQ(
+ "m3456s1728"
+ "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
+ "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
+ "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
+ "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
+ "m432s102384",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendPanasonic64(0x40040190ED7C, kPanasonicBits, 1); // 1 repeat.
+ EXPECT_EQ(
+ "m3456s1728"
+ "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
+ "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
+ "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
+ "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
+ "m432s102384"
+ "m3456s1728"
+ "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
+ "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
+ "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
+ "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
+ "m432s102384",
+ irsend.outputStr());
+
+ irsend.sendPanasonic64(0x40040190ED7C, kPanasonicBits, 2); // 2 repeats.
+ EXPECT_EQ(
+ "m3456s1728"
+ "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
+ "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
+ "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
+ "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
+ "m432s102384"
+ "m3456s1728"
+ "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
+ "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
+ "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
+ "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
+ "m432s102384"
+ "m3456s1728"
+ "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
+ "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
+ "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
+ "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
+ "m432s102384",
+ irsend.outputStr());
+}
+
+// Test sending an atypical data size.
+TEST(TestSendPanasonic64, SendUnusualSize) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendPanasonic64(0x0, 8);
+ EXPECT_EQ(
+ "m3456s1728"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s150768",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendPanasonic64(0x1234567890ABCDEF, 64);
+ EXPECT_EQ(
+ "m3456s1728"
+ "m432s432m432s432m432s432m432s1296m432s432m432s432m432s1296m432s432"
+ "m432s432m432s432m432s1296m432s1296m432s432m432s1296m432s432m432s432"
+ "m432s432m432s1296m432s432m432s1296m432s432m432s1296m432s1296m432s432"
+ "m432s432m432s1296m432s1296m432s1296m432s1296m432s432m432s432m432s432"
+ "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
+ "m432s1296m432s432m432s1296m432s432m432s1296m432s432m432s1296m432s1296"
+ "m432s1296m432s1296m432s432m432s432m432s1296m432s1296m432s432m432s1296"
+ "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s1296m432s1296"
+ "m432s74736",
+ irsend.outputStr());
+}
+
+// Tests for sendPanasonic().
+
+TEST(TestSendPanasonic, CompareToSendPanasonic64) {
+ IRsendTest panasonic(4);
+ IRsendTest panasonic64(0);
+
+ panasonic.begin();
+ panasonic64.begin();
+
+ panasonic.reset();
+ panasonic64.reset();
+
+ panasonic.sendPanasonic(0x4004, 0x0190ED7C);
+ panasonic64.sendPanasonic64(0x40040190ED7C);
+ EXPECT_EQ(panasonic64.outputStr(), panasonic.outputStr());
+
+ panasonic.sendPanasonic(0x0, 0x0);
+ panasonic64.sendPanasonic64(0x0);
+ EXPECT_EQ(panasonic64.outputStr(), panasonic.outputStr());
+
+ panasonic.sendPanasonic(0x0, 0x0, 8);
+ panasonic64.sendPanasonic64(0x0, 8);
+ EXPECT_EQ(panasonic64.outputStr(), panasonic.outputStr());
+
+ panasonic.sendPanasonic(0x1234, 0x567890AB, 64);
+ panasonic64.sendPanasonic64(0x1234567890AB, 64);
+ EXPECT_EQ(panasonic64.outputStr(), panasonic.outputStr());
+
+ panasonic.sendPanasonic(0x1234, 0x567890AB, kPanasonicBits, 2);
+ panasonic64.sendPanasonic64(0x1234567890AB, kPanasonicBits, 2);
+ EXPECT_EQ(panasonic64.outputStr(), panasonic.outputStr());
+}
+
+// Tests for decodePanasonic().
+
+// Decode normal Panasonic messages.
+TEST(TestDecodePanasonic, NormalDecodeWithStrict) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ // Normal Panasonic 48-bit message.
+ irsend.reset();
+ irsend.sendPanasonic64(0x40040190ED7C);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
+ EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
+ EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
+ EXPECT_EQ(0x4004, irsend.capture.address);
+ EXPECT_EQ(0x0190ED7C, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ // Synthesised Normal Panasonic 48-bit message.
+ irsend.reset();
+ irsend.sendPanasonic64(irsend.encodePanasonic(0x4004, 0x12, 0x34, 0x56));
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
+ EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
+ EXPECT_EQ(0x400412345670, irsend.capture.value);
+ EXPECT_EQ(0x4004, irsend.capture.address);
+ EXPECT_EQ(0x12345670, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ // Synthesised Normal Panasonic 48-bit message.
+ irsend.reset();
+ irsend.sendPanasonic64(irsend.encodePanasonic(0x4004, 0x1, 0x1, 0x1));
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
+ EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
+ EXPECT_EQ(0x400401010101, irsend.capture.value);
+ EXPECT_EQ(0x4004, irsend.capture.address);
+ EXPECT_EQ(0x1010101, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+}
+
+// Decode normal repeated Panasonic messages.
+TEST(TestDecodePanasonic, NormalDecodeWithRepeatAndStrict) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ // Normal Panasonic 48-bit message with 2 repeats.
+ irsend.reset();
+ irsend.sendPanasonic64(0x40040190ED7C, kPanasonicBits, 2);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
+ EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
+ EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
+ EXPECT_EQ(0x4004, irsend.capture.address);
+ EXPECT_EQ(0x190ED7C, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ irsend.makeDecodeResult(2 * kPanasonicBits + 4);
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
+ EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
+ EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
+
+ irsend.makeDecodeResult(2 * (2 * kPanasonicBits + 4));
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
+ EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
+ EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
+}
+
+// Decode Panasonic messages with unsupported values.
+TEST(TestDecodePanasonic, DecodeWithNonStrictValues) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendPanasonic64(0x0); // Illegal value Panasonic 48-bit message.
+ irsend.makeDecodeResult();
+ // Should fail with strict on.
+ ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ // Should pass if strict off.
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, false));
+ EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
+ EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
+ EXPECT_EQ(0x0, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+
+ irsend.reset();
+ // Illegal address/Manufacturer code. The rest is legal.
+ irsend.sendPanasonic64(irsend.encodePanasonic(0, 1, 2, 3));
+ irsend.makeDecodeResult();
+ // Should fail with strict on.
+ ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ // Should pass if strict off.
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, false));
+ EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
+ EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
+ EXPECT_EQ(0x1020300, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x1020300, irsend.capture.command);
+}
+
+// Decode Panasonic messages with unsupported size/lengths.
+TEST(TestDecodePanasonic, DecodeWithNonStrictSize) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendPanasonic64(0x12345678, 32); // Illegal size Panasonic message.
+ irsend.makeDecodeResult();
+
+ ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+
+ irsend.makeDecodeResult();
+ // Should fail with strict when we ask for the wrong bit size.
+ ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, 32, true));
+ // Should pass if strict off.
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, 32, false));
+ EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
+ EXPECT_EQ(32, irsend.capture.bits);
+ EXPECT_EQ(0x12345678, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x12345678, irsend.capture.command);
+
+ // Illegal over length (56-bit) message.
+ irsend.reset();
+ irsend.sendPanasonic64(irsend.encodePanasonic(0x4004, 1, 2, 3), 56);
+ irsend.makeDecodeResult();
+
+ ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ // Shouldn't pass if strict off and wrong bit size.
+ ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, false));
+ // Re-decode with correct bit size.
+ ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, 56, true));
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, 56, false));
+ EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
+ EXPECT_EQ(56, irsend.capture.bits);
+ EXPECT_EQ(0x400401020300, irsend.capture.value);
+ EXPECT_EQ(0x4004, irsend.capture.address);
+ EXPECT_EQ(0x01020300, irsend.capture.command);
+}
+
+// Decode (non-standard) 64-bit messages.
+TEST(TestDecodePanasonic, Decode64BitMessages) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Illegal value & size Panasonic 64-bit message.
+ irsend.sendPanasonic64(0xFFFFFFFFFFFFFFFF, 64);
+ irsend.makeDecodeResult();
+ ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, 64, true));
+ // Should work with a 'normal' match (not strict)
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, 64, false));
+ EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
+ EXPECT_EQ(64, irsend.capture.bits);
+ EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
+ EXPECT_EQ(0xFFFFFFFF, irsend.capture.address);
+ EXPECT_EQ(0xFFFFFFFF, irsend.capture.command);
+}
+
+// Decode a 'real' example via GlobalCache
+TEST(TestDecodePanasonic, DecodeGlobalCacheExample) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Panasonic code from Global Cache.
+ uint16_t gc_test[103] = {
+ 37000, 1, 1, 126, 64, 16, 17, 16, 49, 15, 16, 16, 16, 16, 16,
+ 16, 17, 15, 17, 15, 17, 15, 17, 15, 16, 16, 16, 16, 16, 16,
+ 17, 15, 49, 16, 16, 16, 16, 16, 17, 15, 17, 15, 17, 15, 17,
+ 15, 16, 16, 16, 16, 16, 16, 49, 15, 49, 16, 17, 15, 17, 15,
+ 49, 16, 16, 16, 17, 16, 17, 15, 17, 15, 49, 16, 49, 15, 49,
+ 16, 17, 16, 49, 15, 49, 16, 17, 15, 48, 16, 16, 16, 49, 15,
+ 48, 16, 49, 15, 49, 16, 49, 15, 17, 15, 16, 16, 2721};
+ irsend.sendGC(gc_test, 103);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
+ EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
+ EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
+ EXPECT_EQ(0x4004, irsend.capture.address);
+ EXPECT_EQ(0x0190ED7C, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture));
+ EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
+ EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
+ EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
+ EXPECT_EQ(0x4004, irsend.capture.address);
+ EXPECT_EQ(0x0190ED7C, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+}
+
+// Fail to decode a non-Panasonic example via GlobalCache
+TEST(TestDecodePanasonic, FailToDecodeNonPanasonicExample) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Modified a few entries to unexpected values, based on previous test case.
+ uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
+ 20, 20, 20, 20, 20, 20, 127, 20, 61, 9,
+ 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
+ 61, 20, 20, 20, 20, 20, 20, 20, 884};
+ irsend.sendGC(gc_test, 39);
+ irsend.makeDecodeResult();
+
+ ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture));
+ ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, false));
+}
+
+// Failing to decode Panasonic in Issue #245
+TEST(TestDecodePanasonic, DecodeIssue245) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+
+ uint16_t rawData[100] = {
+ 3550, 1750, 500, 450, 500, 1300, 500, 450, 500, 450, 500, 450,
+ 500, 450, 500, 450, 500, 450, 500, 450, 500, 450, 500, 450,
+ 500, 450, 500, 450, 500, 1300, 500, 450, 500, 450, 500, 450,
+ 500, 450, 500, 450, 500, 450, 500, 450, 500, 450, 500, 450,
+ 500, 1300, 500, 450, 500, 450, 500, 450, 500, 450, 500, 450,
+ 500, 450, 500, 450, 500, 450, 500, 1300, 500, 450, 500, 1300,
+ 500, 1300, 500, 1300, 500, 1300, 500, 450, 500, 450, 500, 1300,
+ 500, 450, 500, 1300, 500, 1300, 500, 1300, 500, 1300, 500, 450,
+ 500, 1300, 500, 5000};
+
+ irsend.sendRaw(rawData, 100, 37);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture));
+ EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
+ EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
+ EXPECT_EQ(0x40040100BCBD, irsend.capture.value);
+ EXPECT_EQ(0x4004, irsend.capture.address);
+ EXPECT_EQ(0x100BCBD, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ irsend.reset();
+ irsend.sendRaw(rawData, 99, 37);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
+ EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
+ EXPECT_EQ(0x40040100BCBD, irsend.capture.value);
+ EXPECT_EQ(0x4004, irsend.capture.address);
+ EXPECT_EQ(0x100BCBD, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+}
+
+// Tests for sendPanasonicAC().
+
+// Test sending typical data only.
+TEST(TestSendPanasonicAC, SendDataOnly) {
+ IRsendTest irsend(0);
+ irsend.begin();
+
+ irsend.reset();
+
+ uint8_t state[kPanasonicAcStateLength] = {
+ 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
+ 0x20, 0xE0, 0x04, 0x00, 0x30, 0x32, 0x80, 0xAF, 0x00,
+ 0x00, 0x06, 0x60, 0x00, 0x00, 0x80, 0x00, 0x06, 0x83};
+ irsend.sendPanasonicAC(state);
+ EXPECT_EQ(
+ "m3456s1728"
+ "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s1296m432s1296m432s1296"
+ "m432s432m432s432m432s1296m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s1296m432s1296m432s432m432s432m432s432m432s432m432s432"
+ "m432s10000"
+ "m3456s1728"
+ "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s1296m432s1296m432s1296"
+ "m432s432m432s432m432s1296m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s1296m432s1296m432s432m432s432"
+ "m432s432m432s1296m432s432m432s432m432s1296m432s1296m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
+ "m432s1296m432s1296m432s1296m432s1296m432s432m432s1296m432s432m432s1296"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s1296m432s1296m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s1296m432s1296m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
+ "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
+ "m432s432m432s1296m432s1296m432s432m432s432m432s432m432s432m432s432"
+ "m432s1296m432s1296m432s432m432s432m432s432m432s432m432s432m432s1296"
+ "m432s100000",
+ irsend.outputStr());
+}
+
+// Tests for the IRPanasonicAc class.
+
+TEST(TestIRPanasonicAcClass, ChecksumCalculation) {
+ IRPanasonicAc pana(0);
+
+ const uint8_t originalstate[kPanasonicAcStateLength] = {
+ 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
+ 0x20, 0xE0, 0x04, 0x00, 0x30, 0x32, 0x80, 0xAF, 0x00,
+ 0x00, 0x06, 0x60, 0x00, 0x00, 0x80, 0x00, 0x06, 0x83};
+ uint8_t examplestate[kPanasonicAcStateLength] = {
+ 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
+ 0x20, 0xE0, 0x04, 0x00, 0x30, 0x32, 0x80, 0xAF, 0x00,
+ 0x00, 0x06, 0x60, 0x00, 0x00, 0x80, 0x00, 0x06, 0x83};
+
+ EXPECT_TRUE(IRPanasonicAc::validChecksum(examplestate));
+ EXPECT_EQ(0x83, IRPanasonicAc::calcChecksum(examplestate));
+
+ examplestate[kPanasonicAcStateLength - 1] = 0x0; // Set incoorect checksum.
+ EXPECT_FALSE(IRPanasonicAc::validChecksum(examplestate));
+ EXPECT_EQ(0x83, IRPanasonicAc::calcChecksum(examplestate));
+ pana.setRaw(examplestate);
+ // Extracting the state from the object should have a correct checksum.
+ EXPECT_TRUE(IRPanasonicAc::validChecksum(pana.getRaw()));
+ EXPECT_STATE_EQ(originalstate, pana.getRaw(), kPanasonicAcBits);
+ examplestate[kPanasonicAcStateLength - 1] = 0x83; // Restore old checksum.
+
+ // Change the state to force a different checksum.
+ examplestate[6] = 0x01; // Should increase checksum by 1.
+ EXPECT_FALSE(IRPanasonicAc::validChecksum(examplestate));
+ EXPECT_EQ(0x84, IRPanasonicAc::calcChecksum(examplestate));
+}
+
+TEST(TestIRPanasonicAcClass, SetAndGetPower) {
+ IRPanasonicAc pana(0);
+ pana.on();
+ EXPECT_TRUE(pana.getPower());
+ pana.off();
+ EXPECT_FALSE(pana.getPower());
+ pana.setPower(true);
+ EXPECT_TRUE(pana.getPower());
+ pana.setPower(false);
+ EXPECT_FALSE(pana.getPower());
+}
+
+TEST(TestIRPanasonicAcClass, SetAndGetModel) {
+ IRPanasonicAc pana(0);
+ EXPECT_EQ(kPanasonicJke, pana.getModel());
+ pana.setModel(kPanasonicDke);
+ EXPECT_EQ(kPanasonicDke, pana.getModel());
+ pana.setModel(kPanasonicLke);
+ EXPECT_EQ(kPanasonicLke, pana.getModel());
+ pana.setModel(kPanasonicNke);
+ EXPECT_EQ(kPanasonicNke, pana.getModel());
+ pana.setModel(kPanasonicUnknown); // shouldn't change.
+ EXPECT_EQ(kPanasonicNke, pana.getModel());
+ pana.setModel((panasonic_ac_remote_model_t)255); // shouldn't change.
+ EXPECT_EQ(kPanasonicNke, pana.getModel());
+ pana.setModel(kPanasonicJke);
+ EXPECT_EQ(kPanasonicJke, pana.getModel());
+
+ // This state tickled a bug in getModel(). Should read as a JKE.
+ uint8_t jkeState[27] = {0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
+ 0x20, 0xE0, 0x04, 0x00, 0x32, 0x2E, 0x80, 0xA2, 0x00,
+ 0x00, 0x06, 0x60, 0x00, 0x00, 0x80, 0x00, 0x06, 0x74};
+ pana.setModel(kPanasonicDke); // Make sure it isn't somehow set to JKE
+ pana.setRaw(jkeState);
+ EXPECT_EQ(kPanasonicJke, pana.getModel());
+ EXPECT_STATE_EQ(jkeState, pana.getRaw(), kPanasonicAcBits);
+
+ // This state tickled a bug in getModel(). Should read as CKP.
+ uint8_t ckpState[27] = {0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
+ 0x20, 0xE0, 0x04, 0x00, 0x67, 0x2E, 0x80, 0xAF, 0x00,
+ 0xC0, 0x6B, 0x98, 0x10, 0x00, 0x81, 0x64, 0x05, 0x87};
+ pana.setModel(kPanasonicDke); // Make sure it isn't somehow set to CKP
+ pana.setRaw(ckpState);
+ EXPECT_EQ(kPanasonicCkp, pana.getModel());
+ EXPECT_STATE_EQ(ckpState, pana.getRaw(), kPanasonicAcBits);
+}
+
+TEST(TestIRPanasonicAcClass, SetAndGetMode) {
+ IRPanasonicAc pana(0);
+ pana.setMode(kPanasonicAcCool);
+ pana.setTemp(21);
+ EXPECT_EQ(kPanasonicAcCool, pana.getMode());
+ pana.setMode(kPanasonicAcHeat);
+ EXPECT_EQ(kPanasonicAcHeat, pana.getMode());
+ pana.setMode(kPanasonicAcAuto);
+ EXPECT_EQ(kPanasonicAcAuto, pana.getMode());
+ pana.setMode(kPanasonicAcDry);
+ EXPECT_EQ(kPanasonicAcDry, pana.getMode());
+ EXPECT_EQ(21, pana.getTemp()); // Temp should be unchanged.
+ pana.setMode(kPanasonicAcFan);
+ EXPECT_EQ(kPanasonicAcFan, pana.getMode());
+ EXPECT_EQ(kPanasonicAcFanModeTemp, pana.getTemp()); // Temp should change.
+ pana.setMode(kPanasonicAcCool);
+ EXPECT_EQ(kPanasonicAcCool, pana.getMode());
+ // Temp should be unchanged from the last manual change.
+ EXPECT_EQ(21, pana.getTemp());
+}
+
+TEST(TestIRPanasonicAcClass, SetAndGetTemp) {
+ IRPanasonicAc pana(0);
+ pana.setTemp(25);
+ EXPECT_EQ(25, pana.getTemp());
+ pana.setTemp(kPanasonicAcMinTemp);
+ EXPECT_EQ(kPanasonicAcMinTemp, pana.getTemp());
+ pana.setTemp(kPanasonicAcMinTemp - 1);
+ EXPECT_EQ(kPanasonicAcMinTemp, pana.getTemp());
+ pana.setTemp(kPanasonicAcMaxTemp);
+ EXPECT_EQ(kPanasonicAcMaxTemp, pana.getTemp());
+ pana.setTemp(kPanasonicAcMaxTemp + 1);
+ EXPECT_EQ(kPanasonicAcMaxTemp, pana.getTemp());
+}
+
+TEST(TestIRPanasonicAcClass, SetAndGetFan) {
+ IRPanasonicAc pana(0);
+ pana.setFan(kPanasonicAcFanAuto);
+ EXPECT_EQ(kPanasonicAcFanAuto, pana.getFan());
+ pana.setFan(kPanasonicAcFanMin);
+ EXPECT_EQ(kPanasonicAcFanMin, pana.getFan());
+ pana.setFan(kPanasonicAcFanMin - 1);
+ EXPECT_EQ(kPanasonicAcFanMin, pana.getFan());
+ pana.setFan(kPanasonicAcFanMin + 1);
+ EXPECT_EQ(kPanasonicAcFanMin + 1, pana.getFan());
+ pana.setFan(kPanasonicAcFanMax);
+ EXPECT_EQ(kPanasonicAcFanMax, pana.getFan());
+ pana.setFan(kPanasonicAcFanMax + 1);
+ EXPECT_EQ(kPanasonicAcFanMax, pana.getFan());
+ pana.setFan(kPanasonicAcFanMax - 1);
+ EXPECT_EQ(kPanasonicAcFanMax - 1, pana.getFan());
+}
+
+TEST(TestIRPanasonicAcClass, SetAndGetSwings) {
+ IRPanasonicAc pana(0);
+
+ // Vertical
+ pana.setSwingVertical(kPanasonicAcSwingVAuto);
+ EXPECT_EQ(kPanasonicAcSwingVAuto, pana.getSwingVertical());
+
+ pana.setSwingVertical(kPanasonicAcSwingVUp);
+ EXPECT_EQ(kPanasonicAcSwingVUp, pana.getSwingVertical());
+ pana.setSwingVertical(kPanasonicAcSwingVUp - 1);
+ EXPECT_EQ(kPanasonicAcSwingVUp, pana.getSwingVertical());
+ pana.setSwingVertical(kPanasonicAcSwingVUp + 1);
+ EXPECT_EQ(kPanasonicAcSwingVUp + 1, pana.getSwingVertical());
+
+ pana.setSwingVertical(kPanasonicAcSwingVDown);
+ EXPECT_EQ(kPanasonicAcSwingVDown, pana.getSwingVertical());
+ pana.setSwingVertical(kPanasonicAcSwingVDown + 1);
+ EXPECT_EQ(kPanasonicAcSwingVDown, pana.getSwingVertical());
+ pana.setSwingVertical(kPanasonicAcSwingVDown - 1);
+ EXPECT_EQ(kPanasonicAcSwingVDown - 1, pana.getSwingVertical());
+
+ pana.setSwingVertical(kPanasonicAcSwingVAuto);
+ EXPECT_EQ(kPanasonicAcSwingVAuto, pana.getSwingVertical());
+
+ // Horizontal is model dependant.
+ pana.setModel(kPanasonicNke); // NKE is always fixed in the middle.
+ EXPECT_EQ(kPanasonicAcSwingHMiddle, pana.getSwingHorizontal());
+ pana.setSwingHorizontal(kPanasonicAcSwingHAuto);
+ EXPECT_EQ(kPanasonicAcSwingHMiddle, pana.getSwingHorizontal());
+
+ pana.setModel(kPanasonicJke); // JKE has no H swing.
+ EXPECT_EQ(0, pana.getSwingHorizontal());
+ pana.setSwingHorizontal(kPanasonicAcSwingHMiddle);
+ EXPECT_EQ(0, pana.getSwingHorizontal());
+
+ pana.setModel(kPanasonicLke); // LKE is always fixed in the middle.
+ EXPECT_EQ(kPanasonicAcSwingHMiddle, pana.getSwingHorizontal());
+ pana.setSwingHorizontal(kPanasonicAcSwingHAuto);
+ EXPECT_EQ(kPanasonicAcSwingHMiddle, pana.getSwingHorizontal());
+
+ pana.setModel(kPanasonicDke); // DKE has full control.
+ ASSERT_EQ(kPanasonicDke, pana.getModel());
+ // Auto was last requested.
+ EXPECT_EQ(kPanasonicAcSwingHAuto, pana.getSwingHorizontal());
+ pana.setSwingHorizontal(kPanasonicAcSwingHLeft);
+ EXPECT_EQ(kPanasonicAcSwingHLeft, pana.getSwingHorizontal());
+ // Changing models from DKE to something else, then back should not change
+ // the intended swing.
+ pana.setModel(kPanasonicLke);
+ EXPECT_EQ(kPanasonicAcSwingHMiddle, pana.getSwingHorizontal());
+ pana.setModel(kPanasonicDke);
+ EXPECT_EQ(kPanasonicAcSwingHLeft, pana.getSwingHorizontal());
+}
+
+TEST(TestIRPanasonicAcClass, QuietAndPowerful) {
+ IRPanasonicAc pana(0);
+ pana.setQuiet(false);
+ EXPECT_FALSE(pana.getQuiet());
+ pana.setQuiet(true);
+ EXPECT_TRUE(pana.getQuiet());
+ EXPECT_FALSE(pana.getPowerful());
+ pana.setPowerful(false);
+ EXPECT_FALSE(pana.getPowerful());
+ EXPECT_TRUE(pana.getQuiet());
+ pana.setPowerful(true);
+ EXPECT_TRUE(pana.getPowerful());
+ EXPECT_FALSE(pana.getQuiet());
+ pana.setPowerful(false);
+ EXPECT_FALSE(pana.getPowerful());
+ EXPECT_FALSE(pana.getQuiet());
+ pana.setPowerful(true);
+ pana.setQuiet(true);
+ EXPECT_TRUE(pana.getQuiet());
+ EXPECT_FALSE(pana.getPowerful());
+}
+
+TEST(TestIRPanasonicAcClass, HumanReadable) {
+ IRPanasonicAc pana(0);
+ EXPECT_EQ(
+ "Model: 4 (JKE), Power: Off, Mode: 0 (AUTO), Temp: 0C, "
+ "Fan: 253 (UNKNOWN), Swing (Vertical): 0 (UNKNOWN), Quiet: Off, "
+ "Powerful: Off, Clock: 0:00, On Timer: Off, Off Timer: Off",
+ pana.toString());
+ pana.setPower(true);
+ pana.setTemp(kPanasonicAcMaxTemp);
+ pana.setMode(kPanasonicAcHeat);
+ pana.setFan(kPanasonicAcFanMax);
+ pana.setSwingVertical(kPanasonicAcSwingVAuto);
+ pana.setPowerful(true);
+ EXPECT_EQ(
+ "Model: 4 (JKE), Power: On, Mode: 4 (HEAT), Temp: 30C, "
+ "Fan: 4 (MAX), Swing (Vertical): 15 (AUTO), Quiet: Off, "
+ "Powerful: On, Clock: 0:00, On Timer: Off, Off Timer: Off",
+ pana.toString());
+ pana.setQuiet(true);
+ pana.setModel(kPanasonicLke);
+ EXPECT_EQ(
+ "Model: 1 (LKE), Power: Off, Mode: 4 (HEAT), Temp: 30C, "
+ "Fan: 4 (MAX), Swing (Vertical): 15 (AUTO), "
+ "Swing (Horizontal): 6 (Middle), Quiet: On, Powerful: Off, "
+ "Clock: 0:00, On Timer: 0:00, Off Timer: Off",
+ pana.toString());
+ pana.setModel(kPanasonicDke);
+ pana.setSwingHorizontal(kPanasonicAcSwingHRight);
+ EXPECT_EQ(
+ "Model: 3 (DKE), Power: Off, Mode: 4 (HEAT), Temp: 30C, "
+ "Fan: 4 (MAX), Swing (Vertical): 15 (AUTO), "
+ "Swing (Horizontal): 11 (Right), Quiet: On, Powerful: Off, "
+ "Clock: 0:00, On Timer: Off, Off Timer: Off",
+ pana.toString());
+}
+
+// Tests for decodePanasonicAC().
+
+// Decode normal Panasonic AC messages.
+TEST(TestDecodePanasonicAC, RealExample) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ // Data from Issue #525
+ uint16_t rawData[439] = {
+ 3582, 1686, 488, 378, 488, 1238, 488, 378, 488, 378, 488, 378,
+ 488, 378, 488, 378, 488, 384, 488, 378, 488, 378, 488, 378,
+ 488, 378, 488, 378, 488, 1242, 486, 378, 488, 384, 488, 378,
+ 488, 378, 488, 380, 486, 382, 484, 382, 484, 1264, 464, 1266,
+ 460, 1272, 462, 378, 488, 406, 460, 1266, 462, 380, 488, 382,
+ 484, 388, 478, 406, 462, 410, 462, 404, 462, 406, 462, 396,
+ 470, 406, 462, 404, 462, 406, 460, 404, 462, 410, 462, 404,
+ 462, 404, 462, 406, 464, 406, 462, 404, 462, 406, 462, 404,
+ 462, 410, 462, 404, 462, 406, 462, 404, 462, 404, 462, 404,
+ 462, 406, 460, 406, 462, 410, 462, 404, 462, 1264, 484, 1244,
+ 486, 382, 482, 382, 486, 382, 486, 378, 486, 382, 488, 9924,
+ 3554, 1686, 488, 378, 490, 1240, 486, 378, 488, 378, 488, 378,
+ 488, 378, 488, 382, 484, 386, 486, 378, 488, 382, 486, 378,
+ 488, 382, 486, 382, 484, 1242, 486, 380, 488, 386, 484, 382,
+ 486, 380, 486, 382, 486, 380, 486, 380, 486, 1242, 486, 1242,
+ 484, 1248, 484, 380, 488, 382, 484, 1242, 486, 382, 484, 382,
+ 484, 382, 484, 382, 486, 386, 484, 382, 486, 382, 484, 382,
+ 486, 382, 486, 380, 484, 382, 486, 382, 488, 380, 486, 382,
+ 484, 380, 462, 406, 488, 376, 484, 1246, 482, 1246, 460, 404,
+ 480, 392, 484, 386, 482, 1244, 484, 382, 484, 382, 484, 1242,
+ 482, 1244, 484, 382, 464, 410, 460, 404, 462, 406, 462, 404,
+ 462, 404, 470, 396, 462, 406, 462, 404, 462, 1286, 460, 1268,
+ 458, 1268, 460, 1266, 460, 1266, 460, 406, 460, 1266, 462, 406,
+ 460, 1272, 462, 406, 460, 406, 460, 406, 460, 406, 462, 404,
+ 462, 406, 460, 406, 462, 410, 462, 404, 462, 406, 460, 406,
+ 460, 406, 462, 404, 462, 406, 460, 406, 460, 410, 462, 406,
+ 460, 1268, 460, 1266, 460, 404, 460, 406, 462, 406, 460, 406,
+ 460, 412, 456, 410, 460, 410, 438, 428, 460, 410, 456, 410,
+ 456, 1272, 436, 1288, 438, 434, 438, 428, 438, 428, 438, 428,
+ 438, 428, 438, 428, 438, 428, 438, 428, 438, 434, 438, 428,
+ 438, 428, 438, 428, 438, 428, 438, 428, 440, 428, 438, 428,
+ 438, 432, 438, 428, 438, 428, 438, 428, 438, 428, 438, 428,
+ 438, 428, 438, 430, 438, 1294, 438, 428, 438, 428, 438, 428,
+ 438, 428, 438, 428, 438, 428, 438, 428, 438, 434, 438, 428,
+ 438, 1288, 438, 1290, 438, 428, 438, 428, 438, 428, 438, 428,
+ 438, 432, 438, 1288, 438, 1290, 438, 430, 438, 428, 438, 428,
+ 438, 428, 438, 428, 438, 1292, 438};
+ uint8_t expectedState[kPanasonicAcStateLength] = {
+ 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
+ 0x20, 0xE0, 0x04, 0x00, 0x30, 0x32, 0x80, 0xAF, 0x00,
+ 0x00, 0x06, 0x60, 0x00, 0x00, 0x80, 0x00, 0x06, 0x83};
+
+ irsend.sendRaw(rawData, 439, kPanasonicFreq);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(PANASONIC_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kPanasonicAcBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+ EXPECT_FALSE(irsend.capture.repeat);
+}
+
+// Decode synthetic Panasonic AC message.
+TEST(TestDecodePanasonicAC, SyntheticExample) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ // Data from Issue #525
+ uint8_t expectedState[kPanasonicAcStateLength] = {
+ 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
+ 0x20, 0xE0, 0x04, 0x00, 0x30, 0x32, 0x80, 0xAF, 0x00,
+ 0x00, 0x06, 0x60, 0x00, 0x00, 0x80, 0x00, 0x06, 0x83};
+
+ irsend.sendPanasonicAC(expectedState);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(PANASONIC_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kPanasonicAcBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ IRPanasonicAc pana(0);
+ pana.setRaw(irsend.capture.state);
+ EXPECT_EQ(
+ "Model: 4 (JKE), Power: Off, Mode: 3 (COOL), Temp: 25C, "
+ "Fan: 7 (AUTO), Swing (Vertical): 15 (AUTO), Quiet: Off, "
+ "Powerful: Off, Clock: 0:00, On Timer: Off, Off Timer: Off",
+ pana.toString());
+}
+
+// Tests for general utility functions.
+TEST(TestGeneralPanasonic, hasACState) {
+ EXPECT_TRUE(hasACState(PANASONIC_AC));
+ ASSERT_FALSE(hasACState(PANASONIC));
+}
+
+TEST(TestGeneralPanasonic, typeToString) {
+ EXPECT_EQ("PANASONIC_AC", typeToString(PANASONIC_AC));
+ EXPECT_EQ("PANASONIC", typeToString(PANASONIC));
+}
+
+// Decode a problematic Panasonic AC message
+TEST(TestDecodePanasonicAC, Issue540) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ // Data from Issue #540
+ uint16_t rawData[439] = {
+ 3512, 1714, 466, 408, 466, 1280, 470, 408, 466, 412, 466, 408,
+ 466, 412, 462, 412, 466, 414, 466, 408, 466, 412, 462, 412,
+ 466, 412, 466, 408, 466, 1280, 466, 412, 462, 416, 462, 412,
+ 466, 408, 466, 412, 462, 416, 462, 412, 462, 1282, 462, 1284,
+ 462, 1288, 466, 412, 462, 412, 462, 1284, 462, 416, 440, 438,
+ 462, 412, 462, 412, 462, 416, 466, 412, 462, 412, 462, 412,
+ 440, 442, 462, 412, 462, 412, 460, 418, 462, 416, 462, 412,
+ 462, 418, 462, 412, 462, 416, 462, 412, 436, 442, 462, 412,
+ 460, 418, 462, 416, 462, 412, 460, 412, 462, 420, 436, 438,
+ 462, 412, 462, 416, 432, 448, 436, 438, 436, 1310, 436, 1310,
+ 462, 420, 432, 442, 436, 438, 462, 416, 432, 444, 432, 10008,
+ 3480, 1744, 492, 382, 492, 1254, 492, 386, 488, 390, 492, 382,
+ 492, 386, 488, 386, 492, 386, 492, 386, 488, 386, 488, 386,
+ 492, 386, 492, 382, 492, 1258, 488, 386, 488, 390, 492, 386,
+ 488, 386, 488, 386, 492, 390, 488, 386, 488, 1256, 488, 1258,
+ 488, 1262, 488, 390, 488, 386, 488, 1258, 488, 390, 488, 392,
+ 488, 386, 488, 386, 488, 394, 488, 386, 488, 386, 488, 390,
+ 488, 390, 488, 386, 488, 390, 462, 412, 488, 390, 462, 1282,
+ 488, 390, 456, 416, 458, 1292, 456, 1288, 488, 1258, 488, 392,
+ 456, 422, 488, 390, 484, 392, 484, 1262, 458, 420, 484, 1262,
+ 482, 1262, 488, 392, 484, 394, 484, 416, 436, 442, 458, 416,
+ 458, 422, 430, 448, 432, 442, 458, 416, 458, 1296, 432, 1314,
+ 458, 1288, 432, 1312, 432, 1322, 428, 446, 428, 1318, 432, 442,
+ 432, 1318, 432, 1318, 428, 446, 428, 1318, 428, 1322, 430, 448,
+ 426, 448, 428, 452, 426, 452, 426, 448, 428, 472, 400, 478,
+ 402, 478, 402, 472, 402, 476, 402, 472, 402, 478, 402, 472,
+ 402, 1348, 398, 1348, 398, 1352, 398, 508, 370, 478, 398, 476,
+ 398, 512, 366, 508, 370, 502, 372, 508, 340, 538, 372, 504,
+ 344, 1400, 344, 1400, 346, 1434, 314, 560, 316, 588, 290, 560,
+ 314, 564, 396, 400, 474, 400, 480, 394, 480, 404, 474, 400,
+ 454, 446, 454, 426, 448, 430, 424, 450, 428, 452, 448, 426,
+ 426, 452, 424, 1322, 454, 426, 450, 424, 426, 452, 428, 452,
+ 450, 424, 428, 446, 426, 1322, 454, 426, 422, 450, 454, 426,
+ 448, 430, 454, 426, 448, 426, 428, 446, 454, 430, 454, 422,
+ 452, 424, 424, 452, 452, 430, 424, 452, 452, 426, 448, 426,
+ 426, 456, 448, 426, 448, 1296, 424, 1322, 426, 1326, 450, 1270,
+ 478, 422, 454, 424, 424, 450, 454};
+ uint8_t expectedState[kPanasonicAcStateLength] = {
+ 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
+ 0x20, 0xE0, 0x04, 0x00, 0x39, 0x34, 0x80, 0xAF, 0x0D,
+ 0x00, 0x0E, 0xE0, 0x00, 0x00, 0x81, 0x00, 0x00, 0x1E};
+
+ irsend.sendRaw(rawData, 439, kPanasonicFreq);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(PANASONIC_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kPanasonicAcBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+ EXPECT_FALSE(irsend.capture.repeat);
+ IRPanasonicAc pana(0);
+ pana.setRaw(irsend.capture.state);
+ // TODO(crankyoldgit): Try to figure out what model this should be.
+ EXPECT_EQ(
+ "Model: 0 (UNKNOWN), Power: On, Mode: 3 (COOL), Temp: 26C, "
+ "Fan: 7 (AUTO), Swing (Vertical): 15 (AUTO), "
+ "Swing (Horizontal): 13 (AUTO), Quiet: Off, Powerful: Off, "
+ "Clock: 0:00, On Timer: Off, Off Timer: Off",
+ pana.toString());
+}
+
+TEST(TestIRPanasonicAcClass, TimeBasics) {
+ EXPECT_EQ(0x186, IRPanasonicAc::encodeTime(6, 30));
+ EXPECT_EQ(0x3CA, IRPanasonicAc::encodeTime(16, 10));
+ EXPECT_EQ(0x448, IRPanasonicAc::encodeTime(18, 16));
+ EXPECT_EQ(0, IRPanasonicAc::encodeTime(0, 0));
+ EXPECT_EQ(kPanasonicAcTimeMax, IRPanasonicAc::encodeTime(23, 59));
+ EXPECT_EQ("16:10",
+ IRPanasonicAc::timeToString(IRPanasonicAc::encodeTime(16, 10)));
+ EXPECT_EQ("6:30",
+ IRPanasonicAc::timeToString(IRPanasonicAc::encodeTime(6, 30)));
+ EXPECT_EQ("18:16",
+ IRPanasonicAc::timeToString(IRPanasonicAc::encodeTime(18, 16)));
+ EXPECT_EQ("1:01",
+ IRPanasonicAc::timeToString(IRPanasonicAc::encodeTime(1, 1)));
+ EXPECT_EQ(kPanasonicAcTimeMax, IRPanasonicAc::encodeTime(23, 59));
+ EXPECT_EQ(kPanasonicAcTimeMax, IRPanasonicAc::encodeTime(25, 72));
+ EXPECT_EQ(59, IRPanasonicAc::encodeTime(0, 72));
+ EXPECT_EQ(23 * 60, IRPanasonicAc::encodeTime(27, 0));
+ EXPECT_EQ("0:00", IRPanasonicAc::timeToString(0));
+ EXPECT_EQ("23:59", IRPanasonicAc::timeToString(kPanasonicAcTimeMax));
+}
+
+TEST(TestIRPanasonicAcClass, TimersAndClock) {
+ IRPanasonicAc pana(0);
+ // Data from Issue #544
+ uint8_t state[27] = {0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
+ 0x20, 0xE0, 0x04, 0x00, 0x4E, 0x2E, 0x80, 0xAF, 0x00,
+ 0xCA, 0x6B, 0x98, 0x10, 0x00, 0x01, 0x48, 0x04, 0xDB};
+ pana.setRaw(state);
+ EXPECT_TRUE(pana.isOnTimerEnabled());
+ EXPECT_EQ(0x3CA, pana.getOnTimer());
+ EXPECT_TRUE(pana.isOffTimerEnabled());
+ EXPECT_EQ(0x186, pana.getOffTimer());
+ EXPECT_EQ(0x448, pana.getClock());
+
+ pana.cancelOnTimer();
+ EXPECT_FALSE(pana.isOnTimerEnabled());
+ EXPECT_EQ(0, pana.getOnTimer());
+ EXPECT_TRUE(pana.isOffTimerEnabled());
+ EXPECT_EQ(0x186, pana.getOffTimer());
+ EXPECT_EQ(0x448, pana.getClock());
+
+ pana.cancelOffTimer();
+ EXPECT_FALSE(pana.isOnTimerEnabled());
+ EXPECT_EQ(0, pana.getOnTimer());
+ EXPECT_FALSE(pana.isOffTimerEnabled());
+ EXPECT_EQ(0, pana.getOffTimer());
+ EXPECT_EQ(0x448, pana.getClock());
+
+ pana.setOnTimer(7 * 60 + 50);
+ EXPECT_TRUE(pana.isOnTimerEnabled());
+ EXPECT_EQ(7 * 60 + 50, pana.getOnTimer());
+ EXPECT_FALSE(pana.isOffTimerEnabled());
+ EXPECT_EQ(0, pana.getOffTimer());
+ EXPECT_EQ(0x448, pana.getClock());
+
+ pana.setOnTimer(7 * 60 + 57); // It should round down.
+ EXPECT_EQ(7 * 60 + 50, pana.getOnTimer());
+ pana.setOnTimer(28 * 60); // It should round down.
+ EXPECT_EQ(kPanasonicAcTimeMax - 9, pana.getOnTimer());
+ pana.setOnTimer(kPanasonicAcTimeSpecial);
+ EXPECT_EQ(0, pana.getOnTimer());
+
+ pana.setOnTimer(7 * 60 + 50);
+ pana.setOffTimer(19 * 60 + 30);
+
+ EXPECT_TRUE(pana.isOnTimerEnabled());
+ EXPECT_EQ(7 * 60 + 50, pana.getOnTimer());
+ EXPECT_TRUE(pana.isOffTimerEnabled());
+ EXPECT_EQ(19 * 60 + 30, pana.getOffTimer());
+ EXPECT_EQ(0x448, pana.getClock());
+
+ pana.setOffTimer(19 * 60 + 57); // It should round down.
+ EXPECT_EQ(19 * 60 + 50, pana.getOffTimer());
+ pana.setOffTimer(28 * 60); // It should round down.
+ EXPECT_EQ(kPanasonicAcTimeMax - 9, pana.getOffTimer());
+ pana.setOffTimer(kPanasonicAcTimeSpecial);
+ EXPECT_EQ(0, pana.getOffTimer());
+
+ pana.setClock(0);
+ EXPECT_EQ(0, pana.getClock());
+ pana.setClock(kPanasonicAcTimeMax);
+ EXPECT_EQ(kPanasonicAcTimeMax, pana.getClock());
+ pana.setClock(kPanasonicAcTimeMax - 1);
+ EXPECT_EQ(kPanasonicAcTimeMax - 1, pana.getClock());
+ pana.setClock(kPanasonicAcTimeMax + 1);
+ EXPECT_EQ(kPanasonicAcTimeMax, pana.getClock());
+ pana.setClock(kPanasonicAcTimeSpecial);
+ EXPECT_EQ(0, pana.getClock());
+}
+
+// Decode a real short Panasonic AC message
+TEST(TestDecodePanasonicAC, RealExampleOfShortMessage) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ // Data from Issue #544 (Odour Wash)
+ uint16_t rawData[263] = {
+ 3496, 1734, 506, 366, 448, 1294, 504, 368, 498, 374, 452, 418,
+ 448, 424, 444, 428, 450, 422, 446, 426, 450, 420, 448, 424,
+ 452, 418, 448, 422, 444, 1300, 498, 374, 504, 368, 448, 424,
+ 452, 418, 448, 424, 444, 428, 450, 422, 446, 1296, 500, 1242,
+ 502, 1242, 504, 368, 498, 374, 452, 1292, 504, 366, 450, 422,
+ 444, 426, 450, 420, 446, 424, 452, 418, 448, 424, 444, 428,
+ 450, 422, 444, 426, 450, 420, 446, 424, 452, 418, 448, 422,
+ 444, 428, 450, 422, 446, 426, 452, 420, 446, 426, 452, 418,
+ 448, 424, 442, 428, 448, 422, 444, 426, 450, 420, 446, 426,
+ 452, 418, 448, 424, 444, 428, 450, 422, 444, 1298, 500, 1244,
+ 500, 372, 444, 428, 450, 422, 446, 426, 452, 418, 448, 10020,
+ 3500, 1732, 498, 372, 452, 1290, 506, 366, 450, 422, 446, 426,
+ 452, 420, 448, 424, 452, 418, 448, 422, 444, 426, 450, 420,
+ 446, 426, 452, 420, 446, 1296, 500, 370, 444, 428, 450, 422,
+ 446, 426, 452, 420, 446, 424, 442, 428, 448, 1294, 502, 1240,
+ 504, 1238, 506, 366, 448, 422, 444, 1298, 498, 374, 452, 418,
+ 448, 424, 444, 428, 450, 422, 446, 426, 450, 420, 446, 424,
+ 452, 418, 448, 422, 444, 428, 450, 420, 446, 1298, 498, 1244,
+ 500, 1242, 502, 368, 446, 1298, 500, 1244, 500, 372, 444, 428,
+ 450, 1292, 504, 368, 446, 1296, 502, 370, 444, 426, 452, 1290,
+ 504, 1238, 506, 366, 450, 422, 446, 1298, 498, 1246, 500, 372,
+ 444, 428, 450, 1294, 452, 420, 446, 1296, 448, 422, 444}; // UNKNOWN
+ // 1FB51F79
+
+ uint8_t expectedState[kPanasonicAcStateShortLength] = {
+ 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06,
+ 0x02, 0x20, 0xE0, 0x04, 0x80, 0x9B, 0x32, 0x53};
+
+ irsend.sendRaw(rawData, 263, kPanasonicFreq);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(PANASONIC_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kPanasonicAcShortBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+}
+
+// Create and decode a short Panasonic AC message
+TEST(TestDecodePanasonicAC, SyntheticShortMessage) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ uint8_t odourWash[kPanasonicAcStateShortLength] = {
+ 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06,
+ 0x02, 0x20, 0xE0, 0x04, 0x80, 0x9B, 0x32, 0x53};
+
+ irsend.sendPanasonicAC(odourWash, kPanasonicAcStateShortLength);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(PANASONIC_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kPanasonicAcShortBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(odourWash, irsend.capture.state, irsend.capture.bits);
+}
+//
+// Test for CKP model / see issue #544
+TEST(TestDecodePanasonicAC, CkpModelSpecifics) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ // Data from Issue #544
+ uint8_t ckpPowerfulOn[kPanasonicAcStateLength] = {
+ 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
+ 0x20, 0xE0, 0x04, 0x00, 0x4E, 0x2E, 0x80, 0xAF, 0x00,
+ 0x00, 0x0E, 0xE0, 0x11, 0x00, 0x01, 0x00, 0x06, 0xB7};
+ uint8_t ckpQuietOn[kPanasonicAcStateLength] = {
+ 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
+ 0x20, 0xE0, 0x04, 0x00, 0x4E, 0x2E, 0x80, 0xAF, 0x00,
+ 0x00, 0x0E, 0xE0, 0x30, 0x00, 0x01, 0x00, 0x06, 0xD6};
+
+ irsend.sendPanasonicAC(ckpPowerfulOn);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(PANASONIC_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kPanasonicAcBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(ckpPowerfulOn, irsend.capture.state, irsend.capture.bits);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ IRPanasonicAc pana(0);
+ pana.setRaw(irsend.capture.state);
+ EXPECT_EQ(
+ "Model: 5 (CKP), Power: Off, Mode: 4 (HEAT), Temp: 23C, "
+ "Fan: 7 (AUTO), Swing (Vertical): 15 (AUTO), Quiet: Off, "
+ "Powerful: On, Clock: 0:00, On Timer: 0:00, Off Timer: 0:00",
+ pana.toString());
+
+ pana.setQuiet(true);
+ EXPECT_FALSE(pana.getPowerful());
+ EXPECT_TRUE(pana.getQuiet());
+ EXPECT_EQ(kPanasonicCkp, pana.getModel());
+ EXPECT_STATE_EQ(ckpQuietOn, pana.getRaw(), kPanasonicAcBits);
+
+ pana.setPowerful(true);
+ EXPECT_TRUE(pana.getPowerful());
+ EXPECT_FALSE(pana.getQuiet());
+ EXPECT_EQ(kPanasonicCkp, pana.getModel());
+ EXPECT_STATE_EQ(ckpPowerfulOn, pana.getRaw(), kPanasonicAcBits);
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Pioneer_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Pioneer_test.cpp
new file mode 100644
index 000000000000..b78469adda1f
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Pioneer_test.cpp
@@ -0,0 +1,152 @@
+// Copyright 2018 David Conran
+
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "IRutils.h"
+#include "gtest/gtest.h"
+
+// Tests for sendPioneer().
+
+// Test sending typical data only.
+TEST(TestSendPioneer, SendDataOnly) {
+ IRsendTest irsend(0);
+ irsend.begin();
+ irsend.sendPioneer(0);
+ EXPECT_EQ(
+ "m8960s4480"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s58240"
+ "m8960s4480"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s58240",
+ irsend.outputStr());
+ irsend.sendPioneer(0x55FF00AAAA00FF55);
+ EXPECT_EQ(
+ "m8960s4480"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s40320"
+ "m8960s4480"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s40320",
+ irsend.outputStr());
+}
+
+// Tests for IRutils.
+
+TEST(TestIRUtils, TypeToString) { EXPECT_EQ("PIONEER", typeToString(PIONEER)); }
+
+// Tests for encodePioneer().
+
+TEST(TestEncodePioneer, SimpleEncoding) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+
+ // Spotify button (A556+AF20)
+ // via
+ // https://www.pioneerelectronics.com/StaticFiles/PUSA/Files/Home%20Custom%20Install/2015%20Pioneer%20&%20Elite%20AVR%20IR%20with%20Hex_1.xls
+ EXPECT_EQ(0xA55A6A95F50A04FB, irsend.encodePioneer(0xA556, 0xAF20));
+
+ // "Source" from
+ // https://github.com/markszabo/IRremoteESP8266/pull/547#issuecomment-429616582
+ EXPECT_EQ(0x659A05FAF50AC53A, irsend.encodePioneer(0xA6A0, 0xAFA3));
+}
+
+// Tests for decodePioneer().
+
+// Synthesised Normal Pioneer message.
+TEST(TestDecodePioneer, SyntheticPioneerDecode) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendPioneer(0x659A05FAF50AC53A);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(PIONEER, irsend.capture.decode_type);
+ EXPECT_EQ(kPioneerBits, irsend.capture.bits);
+ EXPECT_EQ(0x659A05FAF50AC53A, irsend.capture.value);
+ EXPECT_EQ(0xA6A0, irsend.capture.address);
+ EXPECT_EQ(0xAFA3, irsend.capture.command);
+}
+
+// Real long Pioneer message.
+TEST(TestDecodePioneer, RealExampleLongDecodeSourceButton) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ // "Source" button.
+ // https://github.com/markszabo/IRremoteESP8266/pull/547#issuecomment-429616582
+ uint16_t rawData[135] = {
+ 8552, 4184, 596, 472, 592, 1524, 594, 1524, 594, 472, 592, 472,
+ 598, 1520, 596, 472, 594, 1524, 592, 1524, 592, 472, 592, 472,
+ 596, 1520, 598, 1520, 596, 472, 592, 1524, 592, 472, 592, 476,
+ 592, 472, 592, 472, 592, 476, 592, 472, 592, 1524, 592, 472,
+ 598, 1518, 598, 1520, 596, 1520, 596, 1520, 596, 1520, 596, 1520,
+ 596, 472, 592, 1524, 592, 472, 598, 25282, 8552, 4182, 596, 1520,
+ 598, 1518, 598, 1520, 596, 1520, 596, 472, 592, 1524, 592, 472,
+ 598, 1520, 596, 472, 594, 472, 592, 472, 596, 472, 592, 1524,
+ 592, 472, 592, 1524, 596, 472, 594, 1520, 596, 1520, 598, 472,
+ 592, 472, 598, 472, 594, 1522, 594, 472, 592, 1524, 594, 472,
+ 596, 472, 594, 1524, 592, 1524, 592, 1524, 592, 472, 594, 1524,
+ 598, 472, 592};
+
+ irsend.sendRaw(rawData, 135, 38000);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(PIONEER, irsend.capture.decode_type);
+ EXPECT_EQ(kPioneerBits, irsend.capture.bits);
+ EXPECT_EQ(0x659A05FAF50AC53A, irsend.capture.value);
+ EXPECT_EQ(0xA6A0, irsend.capture.address);
+ EXPECT_EQ(0xAFA3, irsend.capture.command);
+}
+
+// Synthetic Pioneer message.
+// For:
+// https://github.com/markszabo/IRremoteESP8266/pull/547#issuecomment-430800734
+TEST(TestDecodePioneer, SyntheticPioneerMessage) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendPioneer(0x659A857AF50A3DC2, 64, 0);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(PIONEER, irsend.capture.decode_type);
+ EXPECT_EQ(kPioneerBits, irsend.capture.bits);
+ EXPECT_EQ(0x659A857AF50A3DC2, irsend.capture.value);
+ EXPECT_EQ(0xA6A1, irsend.capture.address);
+ EXPECT_EQ(0xAFBC, irsend.capture.command);
+
+ irsend.reset();
+ irsend.sendPioneer(0x659A857AF50A3DC2, 64, 0);
+ EXPECT_EQ(
+ "m8960s4480"
+ "m560s560m560s1680m560s1680m560s560m560s560m560s1680m560s560m560s1680"
+ "m560s1680m560s560m560s560m560s1680m560s1680m560s560m560s1680m560s560"
+ "m560s1680m560s560m560s560m560s560m560s560m560s1680m560s560m560s1680"
+ "m560s560m560s1680m560s1680m560s1680m560s1680m560s560m560s1680m560s560"
+ "m560s40320"
+ "m8960s4480"
+ "m560s1680m560s1680m560s1680m560s1680m560s560m560s1680m560s560m560s1680"
+ "m560s560m560s560m560s560m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s560m560s1680m560s1680m560s1680m560s1680m560s560m560s1680"
+ "m560s1680m560s1680m560s560m560s560m560s560m560s560m560s1680m560s560"
+ "m560s40320",
+ irsend.outputStr());
+}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_Pronto_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Pronto_test.cpp
similarity index 81%
rename from lib/IRremoteESP8266-2.2.1.02/test/ir_Pronto_test.cpp
rename to lib/IRremoteESP8266-2.5.2.03/test/ir_Pronto_test.cpp
index 7fbe395545d7..e52c6dd908f9 100644
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_Pronto_test.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Pronto_test.cpp
@@ -79,8 +79,8 @@ TEST(TestSendPronto, MoreDataThanNeededInBoth) {
irsend.reset();
// We should handle when we are given more data than needed. (repeat seq.)
- uint16_t pronto_test[10] = {0x0000, 0x0067, 0x0001, 0x0001,
- 0x0001, 0x0002, 0x0003, 0x0004, 0x5, 0x6};
+ uint16_t pronto_test[10] = {0x0000, 0x0067, 0x0001, 0x0001, 0x0001,
+ 0x0002, 0x0003, 0x0004, 0x5, 0x6};
irsend.sendPronto(pronto_test, 10);
EXPECT_EQ("m25s50", irsend.outputStr()); // Only send the data required.
irsend.sendPronto(pronto_test, 10, 1);
@@ -110,25 +110,29 @@ TEST(TestSendPronto, NonRepeatingCode) {
// It was an example of a poor Pronto code.
// It turned out to be a 4 copies of a Sony 12-bit code. Who knew!?!
uint16_t pronto_test[108] = {
- 0x0000, 0x0067, 0x0034, 0x0000,
- 0x0060, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
- 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
- 0x0030, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
- 0x0018, 0x0452, 0x0060, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
- 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
- 0x0018, 0x0018, 0x0030, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
- 0x0018, 0x0018, 0x0018, 0x0452, 0x0060, 0x0018, 0x0018, 0x0018,
- 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
- 0x0018, 0x0018, 0x0018, 0x0018, 0x0030, 0x0018, 0x0018, 0x0018,
- 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0452, 0x0060, 0x0018,
- 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
- 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0030, 0x0018,
- 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018};
+ 0x0000, 0x0067, 0x0034, 0x0000, 0x0060, 0x0018, 0x0018, 0x0018, 0x0018,
+ 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
+ 0x0018, 0x0018, 0x0030, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
+ 0x0018, 0x0018, 0x0452, 0x0060, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
+ 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
+ 0x0018, 0x0030, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
+ 0x0018, 0x0452, 0x0060, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
+ 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
+ 0x0030, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
+ 0x0452, 0x0060, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
+ 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0030,
+ 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018};
// Send the Pronto code without any repeats set.
irsend.reset();
irsend.sendPronto(pronto_test, 108);
irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(SONY, irsend.capture.decode_type);
+ EXPECT_EQ(kSony12Bits, irsend.capture.bits);
+ EXPECT_EQ(0x10, irsend.capture.value);
+ EXPECT_EQ(0x1, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
EXPECT_EQ(
"m2400s600"
"m600s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
@@ -141,19 +145,20 @@ TEST(TestSendPronto, NonRepeatingCode) {
"m600s600m600s600m600s600m600s27650"
"m2400s600"
"m600s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
- "m600s600m600s600m600s600m600s600", irsend.outputStr());
- EXPECT_TRUE(irrecv.decode(&irsend.capture));
- EXPECT_EQ(SONY, irsend.capture.decode_type);
- EXPECT_EQ(SONY_12_BITS, irsend.capture.bits);
- EXPECT_EQ(0x10, irsend.capture.value);
- EXPECT_EQ(0x1, irsend.capture.address);
- EXPECT_EQ(0x0, irsend.capture.command);
+ "m600s600m600s600m600s600m600s600",
+ irsend.outputStr());
// Now try repeating it.
// As it has no repeat sequence, we shouldn't repeat it. (I think)
irsend.reset();
irsend.sendPronto(pronto_test, 108, 3);
irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(SONY, irsend.capture.decode_type);
+ EXPECT_EQ(kSony12Bits, irsend.capture.bits);
+ EXPECT_EQ(0x10, irsend.capture.value);
+ EXPECT_EQ(0x1, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
EXPECT_EQ(
"m2400s600"
"m600s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
@@ -166,13 +171,8 @@ TEST(TestSendPronto, NonRepeatingCode) {
"m600s600m600s600m600s600m600s27650"
"m2400s600"
"m600s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
- "m600s600m600s600m600s600m600s600", irsend.outputStr());
- EXPECT_TRUE(irrecv.decode(&irsend.capture));
- EXPECT_EQ(SONY, irsend.capture.decode_type);
- EXPECT_EQ(SONY_12_BITS, irsend.capture.bits);
- EXPECT_EQ(0x10, irsend.capture.value);
- EXPECT_EQ(0x1, irsend.capture.address);
- EXPECT_EQ(0x0, irsend.capture.command);
+ "m600s600m600s600m600s600m600s600",
+ irsend.outputStr());
}
// Test sending a Pronto code that only has a repeat sequence (Sony).
@@ -183,34 +183,40 @@ TEST(TestSendPronto, RepeatSequenceOnlyForSony) {
// Sony 20-bit command.
uint16_t pronto_test[46] = {
- 0x0000, 0x0067, 0x0000, 0x0015,
- 0x0060, 0x0018, 0x0018, 0x0018, 0x0030, 0x0018, 0x0030, 0x0018,
- 0x0030, 0x0018, 0x0018, 0x0018, 0x0030, 0x0018, 0x0018, 0x0018,
- 0x0018, 0x0018, 0x0030, 0x0018, 0x0018, 0x0018, 0x0030, 0x0018,
- 0x0030, 0x0018, 0x0030, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
+ 0x0000, 0x0067, 0x0000, 0x0015, 0x0060, 0x0018, 0x0018, 0x0018,
+ 0x0030, 0x0018, 0x0030, 0x0018, 0x0030, 0x0018, 0x0018, 0x0018,
0x0030, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0030, 0x0018,
- 0x0018, 0x03f6};
+ 0x0018, 0x0018, 0x0030, 0x0018, 0x0030, 0x0018, 0x0030, 0x0018,
+ 0x0018, 0x0018, 0x0018, 0x0018, 0x0030, 0x0018, 0x0018, 0x0018,
+ 0x0018, 0x0018, 0x0030, 0x0018, 0x0018, 0x03f6};
// Send the Pronto code without any repeats set.
irsend.reset();
irsend.sendPronto(pronto_test, 46);
irsend.makeDecodeResult();
- EXPECT_EQ(
- "m2400s600"
- "m600s600m1200s600m1200s600m1200s600m600s600m1200s600m600s600m600s600"
- "m1200s600m600s600m1200s600m1200s600m1200s600m600s600m600s600m1200s600"
- "m600s600m600s600m1200s600m600s25350", irsend.outputStr());
EXPECT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(SONY, irsend.capture.decode_type);
- EXPECT_EQ(SONY_20_BITS, irsend.capture.bits);
+ EXPECT_EQ(kSony20Bits, irsend.capture.bits);
EXPECT_EQ(0x74B92, irsend.capture.value);
EXPECT_EQ(0x1A, irsend.capture.address);
EXPECT_EQ(0x24AE, irsend.capture.command);
+ EXPECT_EQ(
+ "m2400s600"
+ "m600s600m1200s600m1200s600m1200s600m600s600m1200s600m600s600m600s600"
+ "m1200s600m600s600m1200s600m1200s600m1200s600m600s600m600s600m1200s600"
+ "m600s600m600s600m1200s600m600s25350",
+ irsend.outputStr());
// Send the Pronto code with 2 repeats.
irsend.reset();
- irsend.sendPronto(pronto_test, 46, SONY_MIN_REPEAT);
+ irsend.sendPronto(pronto_test, 46, kSonyMinRepeat);
irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(SONY, irsend.capture.decode_type);
+ EXPECT_EQ(kSony20Bits, irsend.capture.bits);
+ EXPECT_EQ(0x74B92, irsend.capture.value);
+ EXPECT_EQ(0x1A, irsend.capture.address);
+ EXPECT_EQ(0x24AE, irsend.capture.command);
EXPECT_EQ(
"m2400s600"
"m600s600m1200s600m1200s600m1200s600m600s600m1200s600m600s600m600s600"
@@ -223,14 +229,8 @@ TEST(TestSendPronto, RepeatSequenceOnlyForSony) {
"m2400s600"
"m600s600m1200s600m1200s600m1200s600m600s600m1200s600m600s600m600s600"
"m1200s600m600s600m1200s600m1200s600m1200s600m600s600m600s600m1200s600"
- "m600s600m600s600m1200s600m600s25350", irsend.outputStr());
-
- EXPECT_TRUE(irrecv.decode(&irsend.capture));
- EXPECT_EQ(SONY, irsend.capture.decode_type);
- EXPECT_EQ(SONY_20_BITS, irsend.capture.bits);
- EXPECT_EQ(0x74B92, irsend.capture.value);
- EXPECT_EQ(0x1A, irsend.capture.address);
- EXPECT_EQ(0x24AE, irsend.capture.command);
+ "m600s600m600s600m1200s600m600s25350",
+ irsend.outputStr());
}
// Test sending a Pronto code that only has a repeat sequence (Panasonic).
@@ -241,25 +241,29 @@ TEST(TestSendPronto, RepeatSequenceOnlyForPanasonic) {
// Panasonic Plasma TV Descrete code (Power On).
uint16_t pronto_test[104] = {
- 0x0000, 0x0071, 0x0000, 0x0032,
- 0x0080, 0x003F, 0x0010, 0x0010, 0x0010, 0x0030, 0x0010, 0x0010,
- 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
- 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
- 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0030, 0x0010, 0x0010,
- 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
- 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
- 0x0010, 0x0030, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
- 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
- 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0030, 0x0010, 0x0030,
- 0x0010, 0x0030, 0x0010, 0x0030, 0x0010, 0x0030, 0x0010, 0x0010,
- 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0030, 0x0010, 0x0030,
- 0x0010, 0x0030, 0x0010, 0x0030, 0x0010, 0x0030, 0x0010, 0x0010,
- 0x0010, 0x0030, 0x0010, 0x0A98};
+ 0x0000, 0x0071, 0x0000, 0x0032, 0x0080, 0x003F, 0x0010, 0x0010, 0x0010,
+ 0x0030, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
+ 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
+ 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0030, 0x0010, 0x0010,
+ 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
+ 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0030,
+ 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
+ 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
+ 0x0010, 0x0030, 0x0010, 0x0030, 0x0010, 0x0030, 0x0010, 0x0030, 0x0010,
+ 0x0030, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0030,
+ 0x0010, 0x0030, 0x0010, 0x0030, 0x0010, 0x0030, 0x0010, 0x0030, 0x0010,
+ 0x0010, 0x0010, 0x0030, 0x0010, 0x0A98};
// Send the Pronto code without any repeats set.
irsend.reset();
irsend.sendPronto(pronto_test, 104);
irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
+ EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
+ EXPECT_EQ(0x400401007C7D, irsend.capture.value);
+ EXPECT_EQ(0x4004, irsend.capture.address);
+ EXPECT_EQ(0x1007C7D, irsend.capture.command);
EXPECT_EQ(
"m3456s1701"
"m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
@@ -268,17 +272,10 @@ TEST(TestSendPronto, RepeatSequenceOnlyForPanasonic) {
"m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
"m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
"m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s1296"
- "m432s73224", irsend.outputStr());
-
- EXPECT_TRUE(irrecv.decode(&irsend.capture));
- EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
- EXPECT_EQ(PANASONIC_BITS, irsend.capture.bits);
- EXPECT_EQ(0x400401007C7D, irsend.capture.value);
- EXPECT_EQ(0x4004, irsend.capture.address);
- EXPECT_EQ(0x1007C7D, irsend.capture.command);
+ "m432s73224",
+ irsend.outputStr());
}
-
// Test sending a Pronto code that has a normal & arepeat sequence (NEC).
TEST(TestSendPronto, NormalPlusRepeatSequence) {
IRsendTest irsend(4);
@@ -287,40 +284,45 @@ TEST(TestSendPronto, NormalPlusRepeatSequence) {
// NEC 32 bit power on command.
uint16_t pronto_test[76] = {
- 0x0000, 0x006D, 0x0022, 0x0002,
- 0x0156, 0x00AB, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015,
- 0x0015, 0x0040, 0x0015, 0x0040, 0x0015, 0x0015, 0x0015, 0x0015,
- 0x0015, 0x0015, 0x0015, 0x0040, 0x0015, 0x0040, 0x0015, 0x0040,
- 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0040, 0x0015, 0x0040,
- 0x0015, 0x0040, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015,
- 0x0015, 0x0040, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015,
- 0x0015, 0x0015, 0x0015, 0x0040, 0x0015, 0x0040, 0x0015, 0x0040,
- 0x0015, 0x0015, 0x0015, 0x0040, 0x0015, 0x0040, 0x0015, 0x0040,
- 0x0015, 0x0040, 0x0015, 0x05FD,
+ 0x0000, 0x006D, 0x0022, 0x0002, 0x0156, 0x00AB, 0x0015, 0x0015, 0x0015,
+ 0x0015, 0x0015, 0x0015, 0x0015, 0x0040, 0x0015, 0x0040, 0x0015, 0x0015,
+ 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0040, 0x0015, 0x0040, 0x0015,
+ 0x0040, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0040, 0x0015, 0x0040,
+ 0x0015, 0x0040, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015,
+ 0x0040, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015,
+ 0x0015, 0x0040, 0x0015, 0x0040, 0x0015, 0x0040, 0x0015, 0x0015, 0x0015,
+ 0x0040, 0x0015, 0x0040, 0x0015, 0x0040, 0x0015, 0x0040, 0x0015, 0x05FD,
0x0156, 0x0055, 0x0015, 0x0E4E};
// Send the Pronto code without any repeats set.
irsend.reset();
irsend.sendPronto(pronto_test, 76);
irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x18E710EF, irsend.capture.value);
+ EXPECT_EQ(0x18, irsend.capture.address);
+ EXPECT_EQ(0x8, irsend.capture.command);
EXPECT_EQ(
"m8892s4446"
"m546s546m546s546m546s546m546s1664m546s1664m546s546m546s546m546s546"
"m546s1664m546s1664m546s1664m546s546m546s546m546s1664m546s1664m546s1664"
"m546s546m546s546m546s546m546s1664m546s546m546s546m546s546m546s546"
"m546s1664m546s1664m546s1664m546s546m546s1664m546s1664m546s1664m546s1664"
- "m546s39858", irsend.outputStr());
- EXPECT_TRUE(irrecv.decode(&irsend.capture));
- EXPECT_EQ(NEC, irsend.capture.decode_type);
- EXPECT_EQ(NEC_BITS, irsend.capture.bits);
- EXPECT_EQ(0x18E710EF, irsend.capture.value);
- EXPECT_EQ(0x18, irsend.capture.address);
- EXPECT_EQ(0x8, irsend.capture.command);
+ "m546s39858",
+ irsend.outputStr());
// Send it again with a single repeat.
irsend.reset();
irsend.sendPronto(pronto_test, 76, 1);
irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x18E710EF, irsend.capture.value);
+ EXPECT_EQ(0x18, irsend.capture.address);
+ EXPECT_EQ(0x8, irsend.capture.command);
EXPECT_EQ(
"m8892s4446"
"m546s546m546s546m546s546m546s1664m546s1664m546s546m546s546m546s546"
@@ -328,18 +330,19 @@ TEST(TestSendPronto, NormalPlusRepeatSequence) {
"m546s546m546s546m546s546m546s1664m546s546m546s546m546s546m546s546"
"m546s1664m546s1664m546s1664m546s546m546s1664m546s1664m546s1664m546s1664"
"m546s39858"
- "m8892s2210m546s95212", irsend.outputStr());
- EXPECT_TRUE(irrecv.decode(&irsend.capture));
- EXPECT_EQ(NEC, irsend.capture.decode_type);
- EXPECT_EQ(NEC_BITS, irsend.capture.bits);
- EXPECT_EQ(0x18E710EF, irsend.capture.value);
- EXPECT_EQ(0x18, irsend.capture.address);
- EXPECT_EQ(0x8, irsend.capture.command);
+ "m8892s2210m546s95212",
+ irsend.outputStr());
// Send it again with a two repeats.
irsend.reset();
irsend.sendPronto(pronto_test, 76, 2);
irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x18E710EF, irsend.capture.value);
+ EXPECT_EQ(0x18, irsend.capture.address);
+ EXPECT_EQ(0x8, irsend.capture.command);
EXPECT_EQ(
"m8892s4446"
"m546s546m546s546m546s546m546s1664m546s1664m546s546m546s546m546s546"
@@ -348,11 +351,6 @@ TEST(TestSendPronto, NormalPlusRepeatSequence) {
"m546s1664m546s1664m546s1664m546s546m546s1664m546s1664m546s1664m546s1664"
"m546s39858"
"m8892s2210m546s95212"
- "m8892s2210m546s95212", irsend.outputStr());
- EXPECT_TRUE(irrecv.decode(&irsend.capture));
- EXPECT_EQ(NEC, irsend.capture.decode_type);
- EXPECT_EQ(NEC_BITS, irsend.capture.bits);
- EXPECT_EQ(0x18E710EF, irsend.capture.value);
- EXPECT_EQ(0x18, irsend.capture.address);
- EXPECT_EQ(0x8, irsend.capture.command);
+ "m8892s2210m546s95212",
+ irsend.outputStr());
}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_RC5_RC6_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_RC5_RC6_test.cpp
similarity index 70%
rename from lib/IRremoteESP8266-2.2.1.02/test/ir_RC5_RC6_test.cpp
rename to lib/IRremoteESP8266-2.5.2.03/test/ir_RC5_RC6_test.cpp
index ef508e40e846..e8aa9bfc1a85 100644
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_RC5_RC6_test.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_RC5_RC6_test.cpp
@@ -77,55 +77,59 @@ TEST(TestSendRC5, SendDataOnly) {
irsend.begin();
irsend.reset();
- irsend.sendRC5(0x0, RC5_BITS);
+ irsend.sendRC5(0x0, kRC5Bits);
EXPECT_EQ(
"m889s889m1778s889m889s889m889s889m889s889m889s889m889"
- "s889m889s889m889s889m889s889m889s889m889s889m889s114667",
+ "s889m889s889m889s889m889s889m889s889m889s889m889s90664",
irsend.outputStr());
irsend.reset();
- irsend.sendRC5(0x1AAA, RC5_BITS);
+ irsend.sendRC5(0x1AAA, kRC5Bits);
EXPECT_EQ(
"m889s889m889s889m1778s1778m1778s1778m1778s1778"
- "m1778s1778m1778s1778m1778s114667", irsend.outputStr());
+ "m1778s1778m1778s1778m1778s90664",
+ irsend.outputStr());
irsend.reset();
- irsend.sendRC5(0x175, RC5_BITS);
+ irsend.sendRC5(0x175, kRC5Bits);
EXPECT_EQ(
"m889s889m1778s889m889s889m889s1778m1778s1778"
- "m889s889m889s889m1778s1778m1778s1778m889s113778", irsend.outputStr());
+ "m889s889m889s889m1778s1778m1778s1778m889s89775",
+ irsend.outputStr());
irsend.reset();
- irsend.sendRC5(0x3FFF, RC5_BITS);
+ irsend.sendRC5(0x3FFF, kRC5Bits);
EXPECT_EQ(
"m889s889m889s889m889s889m889s889m889s889m889s889m889s889"
- "m889s889m889s889m889s889m889s889m889s889m889s889m889s113778",
+ "m889s889m889s889m889s889m889s889m889s889m889s889m889s89775",
irsend.outputStr());
irsend.reset();
- irsend.sendRC5(0x0, RC5X_BITS);
+ irsend.sendRC5(0x0, kRC5XBits);
EXPECT_EQ(
"m889s889m1778s889m889s889m889s889m889s889m889s889m889"
- "s889m889s889m889s889m889s889m889s889m889s889m889s114667",
+ "s889m889s889m889s889m889s889m889s889m889s889m889s90664",
irsend.outputStr());
irsend.reset();
- irsend.sendRC5(0x1AAA, RC5X_BITS);
+ irsend.sendRC5(0x1AAA, kRC5XBits);
EXPECT_EQ(
"m1778s1778m1778s1778m1778s1778m1778"
- "s1778m1778s1778m1778s1778m1778s114667", irsend.outputStr());
+ "s1778m1778s1778m1778s1778m1778s90664",
+ irsend.outputStr());
irsend.reset();
- irsend.sendRC5(0x175, RC5X_BITS);
+ irsend.sendRC5(0x175, kRC5XBits);
EXPECT_EQ(
"m889s889m1778s889m889s889m889s1778m1778s1778"
- "m889s889m889s889m1778s1778m1778s1778m889s113778", irsend.outputStr());
+ "m889s889m889s889m1778s1778m1778s1778m889s89775",
+ irsend.outputStr());
irsend.reset();
- irsend.sendRC5(0x3FFF, RC5X_BITS);
+ irsend.sendRC5(0x3FFF, kRC5XBits);
EXPECT_EQ(
"m1778s1778m889s889m889s889m889s889m889s889m889s889m889"
- "s889m889s889m889s889m889s889m889s889m889s889m889s113778",
+ "s889m889s889m889s889m889s889m889s889m889s889m889s89775",
irsend.outputStr());
}
@@ -135,40 +139,44 @@ TEST(TestSendRC5, SendWithRepeats) {
irsend.begin();
irsend.reset();
- irsend.sendRC5(0x175, RC5_BITS, 1);
+ irsend.sendRC5(0x175, kRC5Bits, 1);
EXPECT_EQ(
"m889s889m1778s889m889s889m889s1778m1778s1778"
- "m889s889m889s889m1778s1778m1778s1778m889s114667"
+ "m889s889m889s889m1778s1778m1778s1778m889s90664"
"m889s889m1778s889m889s889m889s1778m1778s1778"
- "m889s889m889s889m1778s1778m1778s1778m889s113778", irsend.outputStr());
+ "m889s889m889s889m1778s1778m1778s1778m889s88886",
+ irsend.outputStr());
irsend.reset();
- irsend.sendRC5(0x175, RC5_BITS, 2);
+ irsend.sendRC5(0x175, kRC5Bits, 2);
EXPECT_EQ(
"m889s889m1778s889m889s889m889s1778m1778s1778"
- "m889s889m889s889m1778s1778m1778s1778m889s114667"
+ "m889s889m889s889m1778s1778m1778s1778m889s90664"
"m889s889m1778s889m889s889m889s1778m1778s1778"
- "m889s889m889s889m1778s1778m1778s1778m889s114667"
+ "m889s889m889s889m1778s1778m1778s1778m889s89775"
"m889s889m1778s889m889s889m889s1778m1778s1778"
- "m889s889m889s889m1778s1778m1778s1778m889s113778", irsend.outputStr());
+ "m889s889m889s889m1778s1778m1778s1778m889s88886",
+ irsend.outputStr());
irsend.reset();
- irsend.sendRC5(0x175, RC5X_BITS, 1);
+ irsend.sendRC5(0x175, kRC5XBits, 1);
EXPECT_EQ(
"m889s889m1778s889m889s889m889s1778m1778s1778"
- "m889s889m889s889m1778s1778m1778s1778m889s114667"
+ "m889s889m889s889m1778s1778m1778s1778m889s90664"
"m889s889m1778s889m889s889m889s1778m1778s1778"
- "m889s889m889s889m1778s1778m1778s1778m889s113778", irsend.outputStr());
+ "m889s889m889s889m1778s1778m1778s1778m889s88886",
+ irsend.outputStr());
irsend.reset();
- irsend.sendRC5(0x1175, RC5X_BITS, 2);
+ irsend.sendRC5(0x1175, kRC5XBits, 2);
EXPECT_EQ(
"m1778s889m889s889m889s889m889s1778m1778s1778"
- "m889s889m889s889m1778s1778m1778s1778m889s114667"
+ "m889s889m889s889m1778s1778m1778s1778m889s90664"
"m1778s889m889s889m889s889m889s1778m1778s1778"
- "m889s889m889s889m1778s1778m1778s1778m889s114667"
+ "m889s889m889s889m1778s1778m1778s1778m889s89775"
"m1778s889m889s889m889s889m889s1778m1778s1778"
- "m889s889m889s889m1778s1778m1778s1778m889s113778", irsend.outputStr());
+ "m889s889m889s889m1778s1778m1778s1778m889s88886",
+ irsend.outputStr());
}
// Tests for decodeRC5().
@@ -182,9 +190,9 @@ TEST(TestDecodeRC5, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendRC5(0x175);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, RC5_BITS, true));
+ ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kRC5Bits, true));
EXPECT_EQ(RC5, irsend.capture.decode_type);
- EXPECT_EQ(RC5_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC5Bits, irsend.capture.bits);
EXPECT_EQ(0x175, irsend.capture.value);
EXPECT_EQ(0x05, irsend.capture.address);
EXPECT_EQ(0x35, irsend.capture.command);
@@ -194,9 +202,9 @@ TEST(TestDecodeRC5, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendRC5(0x175);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, RC5X_BITS, true));
+ ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kRC5XBits, true));
EXPECT_EQ(RC5, irsend.capture.decode_type);
- EXPECT_EQ(RC5_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC5Bits, irsend.capture.bits);
EXPECT_EQ(0x175, irsend.capture.value);
EXPECT_EQ(0x05, irsend.capture.address);
EXPECT_EQ(0x35, irsend.capture.command);
@@ -205,11 +213,11 @@ TEST(TestDecodeRC5, NormalDecodeWithStrict) {
// A RC-5X 13-bit message but with a value that is valid for RC-5 decoded
// as RC5-X.
irsend.reset();
- irsend.sendRC5(0x175, RC5X_BITS);
+ irsend.sendRC5(0x175, kRC5XBits);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, RC5X_BITS, true));
+ ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kRC5XBits, true));
EXPECT_EQ(RC5, irsend.capture.decode_type);
- EXPECT_EQ(RC5_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC5Bits, irsend.capture.bits);
EXPECT_EQ(0x175, irsend.capture.value);
EXPECT_EQ(0x05, irsend.capture.address);
EXPECT_EQ(0x35, irsend.capture.command);
@@ -219,9 +227,9 @@ TEST(TestDecodeRC5, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendRC5(irsend.encodeRC5(0x00, 0x0B, true));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, RC5_BITS, true));
+ ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kRC5Bits, true));
EXPECT_EQ(RC5, irsend.capture.decode_type);
- EXPECT_EQ(RC5_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC5Bits, irsend.capture.bits);
EXPECT_EQ(0x80B, irsend.capture.value);
EXPECT_EQ(0x00, irsend.capture.address);
EXPECT_EQ(0x0B, irsend.capture.command);
@@ -229,11 +237,11 @@ TEST(TestDecodeRC5, NormalDecodeWithStrict) {
// Synthesised Normal RC-5X 13-bit message.
irsend.reset();
- irsend.sendRC5(irsend.encodeRC5X(0x02, 0x41, true), RC5X_BITS);
+ irsend.sendRC5(irsend.encodeRC5X(0x02, 0x41, true), kRC5XBits);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, RC5X_BITS, true));
+ ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kRC5XBits, true));
EXPECT_EQ(RC5X, irsend.capture.decode_type);
- EXPECT_EQ(RC5X_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC5XBits, irsend.capture.bits);
EXPECT_EQ(0x1881, irsend.capture.value);
EXPECT_EQ(0x02, irsend.capture.address);
EXPECT_EQ(0x41, irsend.capture.command);
@@ -242,9 +250,9 @@ TEST(TestDecodeRC5, NormalDecodeWithStrict) {
// Synthesised Normal RC-5X 13-bit message should fail at being decoded
// as a normal RC-5 (12 bit) message.
irsend.reset();
- irsend.sendRC5(irsend.encodeRC5X(0x02, 0x41, true), RC5X_BITS);
+ irsend.sendRC5(irsend.encodeRC5X(0x02, 0x41, true), kRC5XBits);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, RC5_BITS, true));
+ ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kRC5Bits, true));
}
// Decode normal repeated RC5 messages.
@@ -255,33 +263,33 @@ TEST(TestDecodeRC5, NormalDecodeWithRepeatAndStrict) {
// Normal RC-5 12-bit (even) message with one repeat.
irsend.reset();
- irsend.sendRC5(0x174, RC5_BITS, 1);
+ irsend.sendRC5(0x174, kRC5Bits, 1);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, RC5_BITS, true));
+ ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kRC5Bits, true));
EXPECT_EQ(RC5, irsend.capture.decode_type);
- EXPECT_EQ(RC5_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC5Bits, irsend.capture.bits);
EXPECT_EQ(0x174, irsend.capture.value);
EXPECT_EQ(0x05, irsend.capture.address);
EXPECT_EQ(0x34, irsend.capture.command);
// Normal RC-5 12-bit (odd) message with one repeat.
irsend.reset();
- irsend.sendRC5(0x175, RC5_BITS, 1);
+ irsend.sendRC5(0x175, kRC5Bits, 1);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, RC5_BITS, true));
+ ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kRC5Bits, true));
EXPECT_EQ(RC5, irsend.capture.decode_type);
- EXPECT_EQ(RC5_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC5Bits, irsend.capture.bits);
EXPECT_EQ(0x175, irsend.capture.value);
EXPECT_EQ(0x05, irsend.capture.address);
EXPECT_EQ(0x35, irsend.capture.command);
// Synthesised Normal RC-5X 13-bit message with 2 repeats.
irsend.reset();
- irsend.sendRC5(irsend.encodeRC5X(0x02, 0x41, true), RC5X_BITS, 2);
+ irsend.sendRC5(irsend.encodeRC5X(0x02, 0x41, true), kRC5XBits, 2);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, RC5X_BITS, true));
+ ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kRC5XBits, true));
EXPECT_EQ(RC5X, irsend.capture.decode_type);
- EXPECT_EQ(RC5X_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC5XBits, irsend.capture.bits);
EXPECT_EQ(0x1881, irsend.capture.value);
EXPECT_EQ(0x02, irsend.capture.address);
EXPECT_EQ(0x41, irsend.capture.command);
@@ -297,8 +305,8 @@ TEST(TestDecodeRC5, DecodeWithNonStrictValues) {
irsend.sendRC5(0xFA, 8); // Illegal value RC5 8-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, RC5_BITS, true));
- ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, RC5X_BITS, true));
+ ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kRC5Bits, true));
+ ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kRC5XBits, true));
// Should pass if strict off.
ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, 8, false));
EXPECT_EQ(RC5, irsend.capture.decode_type);
@@ -311,8 +319,8 @@ TEST(TestDecodeRC5, DecodeWithNonStrictValues) {
irsend.sendRC5(0x12345678, 32); // Illegal size RC5 32-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, RC5_BITS, true));
- ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, RC5X_BITS, true));
+ ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kRC5Bits, true));
+ ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kRC5XBits, true));
irsend.makeDecodeResult();
// Should fail with strict when we ask for the wrong bit size.
@@ -327,8 +335,8 @@ TEST(TestDecodeRC5, DecodeWithNonStrictValues) {
irsend.sendRC5(0x87654321, 32); // Illegal size RC5 32-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, RC5_BITS, true));
- ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, RC5X_BITS, true));
+ ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kRC5Bits, true));
+ ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kRC5XBits, true));
irsend.makeDecodeResult();
// Should fail with strict when we ask for the wrong bit size.
@@ -364,14 +372,15 @@ TEST(TestDecodeRC5, FailToDecodeNonRC5Example) {
irsend.begin();
irsend.reset();
- uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20, 20, 20, 20,
- 20, 20, 20, 127, 20, 61, 9, 20, 20, 61, 20, 20, 20,
- 61, 20, 61, 20, 61, 20, 20, 20, 20, 20, 20, 20, 884};
+ uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
+ 20, 20, 20, 20, 20, 20, 127, 20, 61, 9,
+ 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
+ 61, 20, 20, 20, 20, 20, 20, 20, 884};
irsend.sendGC(gc_test, 39);
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, RC5_BITS, false));
+ ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kRC5Bits, false));
}
// RRRRRR CCCCC 666
@@ -383,24 +392,24 @@ TEST(TestDecodeRC5, FailToDecodeNonRC5Example) {
// Tests for encodeRC6().
TEST(TestEncodeRC6, Mode0Encoding) {
IRsendTest irsend(4);
- EXPECT_EQ(0x0, irsend.encodeRC6(0, 0, RC6_MODE0_BITS));
- EXPECT_EQ(0x1234, irsend.encodeRC6(0x12, 0x34, RC6_MODE0_BITS));
- EXPECT_EQ(0x12345, irsend.encodeRC6(0x123, 0x45, RC6_MODE0_BITS));
- EXPECT_EQ(0xFFFFF, irsend.encodeRC6(0xFFF, 0xFF, RC6_MODE0_BITS));
- EXPECT_EQ(0xFFF00, irsend.encodeRC6(0xFFFF, 0x00, RC6_MODE0_BITS));
- EXPECT_EQ(0xFF, irsend.encodeRC6(0x00, 0xFF, RC6_MODE0_BITS));
+ EXPECT_EQ(0x0, irsend.encodeRC6(0, 0, kRC6Mode0Bits));
+ EXPECT_EQ(0x1234, irsend.encodeRC6(0x12, 0x34, kRC6Mode0Bits));
+ EXPECT_EQ(0x12345, irsend.encodeRC6(0x123, 0x45, kRC6Mode0Bits));
+ EXPECT_EQ(0xFFFFF, irsend.encodeRC6(0xFFF, 0xFF, kRC6Mode0Bits));
+ EXPECT_EQ(0xFFF00, irsend.encodeRC6(0xFFFF, 0x00, kRC6Mode0Bits));
+ EXPECT_EQ(0xFF, irsend.encodeRC6(0x00, 0xFF, kRC6Mode0Bits));
}
TEST(TestEncodeRC6, 36BitEncoding) {
IRsendTest irsend(4);
- EXPECT_EQ(0x0, irsend.encodeRC6(0, 0, RC6_36_BITS));
- EXPECT_EQ(0x1234, irsend.encodeRC6(0x12, 0x34, RC6_36_BITS));
- EXPECT_EQ(0x123456789, irsend.encodeRC6(0x1234567, 0x89, RC6_36_BITS));
- EXPECT_EQ(0xFFFFFFFFF, irsend.encodeRC6(0xFFFFFFF, 0xFF, RC6_36_BITS));
- EXPECT_EQ(0xFFFFFFFFF, irsend.encodeRC6(0xFFFFFFFF, 0xFF, RC6_36_BITS));
- EXPECT_EQ(0xFFFFFFF00, irsend.encodeRC6(0xFFFFFFF, 0x00, RC6_36_BITS));
- EXPECT_EQ(0xFF, irsend.encodeRC6(0x0, 0xFF, RC6_36_BITS));
- EXPECT_EQ(0xFFFFFFFFF, irsend.encodeRC6(0xFFFFFFFF, 0xFF, RC6_36_BITS));
+ EXPECT_EQ(0x0, irsend.encodeRC6(0, 0, kRC6_36Bits));
+ EXPECT_EQ(0x1234, irsend.encodeRC6(0x12, 0x34, kRC6_36Bits));
+ EXPECT_EQ(0x123456789, irsend.encodeRC6(0x1234567, 0x89, kRC6_36Bits));
+ EXPECT_EQ(0xFFFFFFFFF, irsend.encodeRC6(0xFFFFFFF, 0xFF, kRC6_36Bits));
+ EXPECT_EQ(0xFFFFFFFFF, irsend.encodeRC6(0xFFFFFFFF, 0xFF, kRC6_36Bits));
+ EXPECT_EQ(0xFFFFFFF00, irsend.encodeRC6(0xFFFFFFF, 0x00, kRC6_36Bits));
+ EXPECT_EQ(0xFF, irsend.encodeRC6(0x0, 0xFF, kRC6_36Bits));
+ EXPECT_EQ(0xFFFFFFFFF, irsend.encodeRC6(0xFFFFFFFF, 0xFF, kRC6_36Bits));
}
// Tests for toggleRC6().
@@ -410,7 +419,7 @@ TEST(TestToggleRC6, Mode0) {
IRsendTest irsend(4);
EXPECT_EQ(0x10000, irsend.toggleRC6(0x0));
- EXPECT_EQ(irsend.toggleRC6(0x0), irsend.toggleRC6(0x0, RC6_MODE0_BITS));
+ EXPECT_EQ(irsend.toggleRC6(0x0), irsend.toggleRC6(0x0, kRC6Mode0Bits));
EXPECT_EQ(0x0, irsend.toggleRC6(0x10000));
EXPECT_EQ(0x0, irsend.toggleRC6(irsend.toggleRC6(0x0)));
}
@@ -419,10 +428,10 @@ TEST(TestToggleRC6, Mode0) {
TEST(TestToggleRC6, 36BitUse) {
IRsendTest irsend(4);
- EXPECT_EQ(0x8000, irsend.toggleRC6(0x0, RC6_36_BITS));
- EXPECT_EQ(0x0, irsend.toggleRC6(0x8000, RC6_36_BITS));
- EXPECT_EQ(0x0, irsend.toggleRC6(irsend.toggleRC6(0x0, RC6_36_BITS),
- RC6_36_BITS));
+ EXPECT_EQ(0x8000, irsend.toggleRC6(0x0, kRC6_36Bits));
+ EXPECT_EQ(0x0, irsend.toggleRC6(0x8000, kRC6_36Bits));
+ EXPECT_EQ(0x0,
+ irsend.toggleRC6(irsend.toggleRC6(0x0, kRC6_36Bits), kRC6_36Bits));
}
// Tests for sendRC6().
@@ -439,7 +448,8 @@ TEST(TestSendRC6, SendMode0DataOnly) {
"m444s888m444s444m444s444m444s888m888s444m444s444m444s444"
"m444s444m444s444m444s444m444s444m444s444m444s444m444s444"
"m444s444m444s444m444s444m444s444m444s444m444s444m444"
- "s83028", irsend.outputStr());
+ "s83028",
+ irsend.outputStr());
irsend.reset();
irsend.sendRC6(0x1FFFF);
@@ -448,7 +458,8 @@ TEST(TestSendRC6, SendMode0DataOnly) {
"m444s888m444s444m444s444m1332s888m444s444m444s444m444s444"
"m444s444m444s444m444s444m444s444m444s444m444s444m444s444"
"m444s444m444s444m444s444m444s444m444s444m444"
- "s83472", irsend.outputStr());
+ "s83472",
+ irsend.outputStr());
irsend.reset();
irsend.sendRC6(0x15555);
@@ -456,7 +467,8 @@ TEST(TestSendRC6, SendMode0DataOnly) {
"m2664s888"
"m444s888m444s444m444s444m1332s1332m888s888m888s888"
"m888s888m888s888m888s888m888s888m888s888m888"
- "s83472", irsend.outputStr());
+ "s83472",
+ irsend.outputStr());
}
// Test sending typical RC-6 36-bit data only.
@@ -465,7 +477,7 @@ TEST(TestSendRC6, Send36BitDataOnly) {
irsend.begin();
irsend.reset();
- irsend.sendRC6(0x0, RC6_36_BITS);
+ irsend.sendRC6(0x0, kRC6_36Bits);
EXPECT_EQ(
"m2664s888"
"m444s888m444s444m444s444m444"
@@ -474,10 +486,11 @@ TEST(TestSendRC6, Send36BitDataOnly) {
"s444m444s444m444s444m444s444m444s444m444s444m444s444m444s444m444"
"s444m444s444m444s444m444s444m444s444m444s444m444s444m444s444m444"
"s444m444s444m444s444m444s444m444s444m444s444m444s444m444s444m444"
- "s83028", irsend.outputStr());
+ "s83028",
+ irsend.outputStr());
irsend.reset();
- irsend.sendRC6(0xFFFFFFFFF, RC6_36_BITS);
+ irsend.sendRC6(0xFFFFFFFFF, kRC6_36Bits);
EXPECT_EQ(
"m2664s888"
"m444s444m444s444m444s444m444s444"
@@ -486,10 +499,11 @@ TEST(TestSendRC6, Send36BitDataOnly) {
"m444s444m444s444m444s444m444s444m444s444m444s444m444s444m444s444"
"m444s444m444s444m444s444m444s444m444s444m444s444m444s444m444s444"
"m444s444m444s444m444s444m444s444m444s444m444s444m444s444m444"
- "s83472", irsend.outputStr());
+ "s83472",
+ irsend.outputStr());
irsend.reset();
- irsend.sendRC6(0xAAAAAAAAAA, RC6_36_BITS);
+ irsend.sendRC6(0xAAAAAAAAAA, kRC6_36Bits);
EXPECT_EQ(
"m2664s888m444s444m444s888m888"
"s1332m1332"
@@ -498,7 +512,7 @@ TEST(TestSendRC6, Send36BitDataOnly) {
irsend.outputStr());
irsend.reset();
- irsend.sendRC6(0xC800F740C, RC6_36_BITS); // Xbox 360 OnOff code
+ irsend.sendRC6(0xC800F740C, kRC6_36Bits); // Xbox 360 OnOff code
EXPECT_EQ(
"m2664s888"
"m444s444m444s444m444s888m444"
@@ -506,10 +520,11 @@ TEST(TestSendRC6, Send36BitDataOnly) {
"s888m444s444m444s444m444s444m444s444m444s444m444s444m444s444m444"
"s444m444s444m444s444m888s444m444s444m444s444m444s888m888s444m444"
"s444m444s888m888s888m444s444m444s444m444s444m444s444m444s444m888"
- "s444m444s888m444s444m444s83028", irsend.outputStr());
+ "s444m444s888m444s444m444s83028",
+ irsend.outputStr());
irsend.reset();
- irsend.sendRC6(irsend.toggleRC6(0xC800F740C, RC6_36_BITS),
- RC6_36_BITS); // Xbox 360 OnOff code (toggled)
+ irsend.sendRC6(irsend.toggleRC6(0xC800F740C, kRC6_36Bits),
+ kRC6_36Bits); // Xbox 360 OnOff code (toggled)
EXPECT_EQ(
"m2664s888"
"m444s444m444s444m444s888m444"
@@ -517,7 +532,8 @@ TEST(TestSendRC6, Send36BitDataOnly) {
"s888m444s444m444s444m444s444m444s444m444s444m444s444m444s444m444"
"s444m444s444m444s444m888s444m444s444m444s444m444s444m444s444m444"
"s444m444s444m444s888m888s888m444s444m444s444m444s444m444s444m444"
- "s444m888s444m444s888m444s444m444s83028", irsend.outputStr());
+ "s444m888s444m444s888m444s444m444s83028",
+ irsend.outputStr());
}
// Test sending RC-6 Mode 0 with different repeats.
@@ -526,16 +542,17 @@ TEST(TestSendRC6, SendMode0WithRepeats) {
irsend.begin();
irsend.reset();
- irsend.sendRC6(0x175, RC6_MODE0_BITS, 0);
+ irsend.sendRC6(0x175, kRC6Mode0Bits, 0);
EXPECT_EQ(
"m2664s888"
"m444s888m444s444m444s444m444"
"s888m888"
"s444m444s444m444s444m444s444m444s444m444s444m444s444m888s888m888"
- "s444m444s444m444s888m888s888m888s83472", irsend.outputStr());
+ "s444m444s444m444s888m888s888m888s83472",
+ irsend.outputStr());
irsend.reset();
- irsend.sendRC6(0x175, RC6_MODE0_BITS, 1);
+ irsend.sendRC6(0x175, kRC6Mode0Bits, 1);
EXPECT_EQ(
"m2664s888"
"m444s888m444s444m444s444m444"
@@ -546,10 +563,11 @@ TEST(TestSendRC6, SendMode0WithRepeats) {
"m444s888m444s444m444s444m444"
"s888m888"
"s444m444s444m444s444m444s444m444s444m444s444m444s444m888s888m888"
- "s444m444s444m444s888m888s888m888s83472", irsend.outputStr());
+ "s444m444s444m444s888m888s888m888s83472",
+ irsend.outputStr());
irsend.reset();
- irsend.sendRC6(0x175, RC6_MODE0_BITS, 2);
+ irsend.sendRC6(0x175, kRC6Mode0Bits, 2);
EXPECT_EQ(
"m2664s888"
"m444s888m444s444m444s444m444"
@@ -565,7 +583,8 @@ TEST(TestSendRC6, SendMode0WithRepeats) {
"m444s888m444s444m444s444m444"
"s888m888"
"s444m444s444m444s444m444s444m444s444m444s444m444s444m888s888m888"
- "s444m444s444m444s888m888s888m888s83472", irsend.outputStr());
+ "s444m444s444m444s888m888s888m888s83472",
+ irsend.outputStr());
}
// Test sending RC-6 36-bit with different repeats.
@@ -574,7 +593,7 @@ TEST(TestSendRC6, Send36BitWithRepeats) {
irsend.begin();
irsend.reset();
- irsend.sendRC6(0x175, RC6_36_BITS, 0);
+ irsend.sendRC6(0x175, kRC6_36Bits, 0);
EXPECT_EQ(
"m2664s888"
"m444s888m444s444m444s444m444"
@@ -582,10 +601,11 @@ TEST(TestSendRC6, Send36BitWithRepeats) {
"s444m444s444m444s444m444s444m444s444m444s444m444s444m444s444m444"
"s444m444s444m444s444m444s444m444s444m444s444m444s444m444s444m444"
"s444m444s444m444s444m444s444m444s444m444s444m444s444m888s888m888"
- "s444m444s444m444s888m888s888m888s83472", irsend.outputStr());
+ "s444m444s444m444s888m888s888m888s83472",
+ irsend.outputStr());
irsend.reset();
- irsend.sendRC6(0x175, RC6_36_BITS, 1);
+ irsend.sendRC6(0x175, kRC6_36Bits, 1);
EXPECT_EQ(
"m2664s888"
"m444s888m444s444m444s444m444"
@@ -600,10 +620,11 @@ TEST(TestSendRC6, Send36BitWithRepeats) {
"s444m444s444m444s444m444s444m444s444m444s444m444s444m444s444m444"
"s444m444s444m444s444m444s444m444s444m444s444m444s444m444s444m444"
"s444m444s444m444s444m444s444m444s444m444s444m444s444m888s888m888"
- "s444m444s444m444s888m888s888m888s83472", irsend.outputStr());
+ "s444m444s444m444s888m888s888m888s83472",
+ irsend.outputStr());
irsend.reset();
- irsend.sendRC6(0x175, RC6_36_BITS, 2);
+ irsend.sendRC6(0x175, kRC6_36Bits, 2);
EXPECT_EQ(
"m2664s888"
"m444s888m444s444m444s444m444"
@@ -625,7 +646,8 @@ TEST(TestSendRC6, Send36BitWithRepeats) {
"s444m444s444m444s444m444s444m444s444m444s444m444s444m444s444m444"
"s444m444s444m444s444m444s444m444s444m444s444m444s444m444s444m444"
"s444m444s444m444s444m444s444m444s444m444s444m444s444m888s888m888"
- "s444m444s444m444s888m888s888m888s83472", irsend.outputStr());
+ "s444m444s444m444s888m888s888m888s83472",
+ irsend.outputStr());
}
// Tests for decodeRC6().
@@ -640,9 +662,9 @@ TEST(TestDecodeRC6, NormalMode0DecodeWithStrict) {
irsend.reset();
irsend.sendRC6(0x175);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, RC6_MODE0_BITS, true));
+ ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kRC6Mode0Bits, true));
EXPECT_EQ(RC6, irsend.capture.decode_type);
- EXPECT_EQ(RC6_MODE0_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC6Mode0Bits, irsend.capture.bits);
EXPECT_EQ(0x175, irsend.capture.value);
EXPECT_EQ(0x01, irsend.capture.address);
EXPECT_EQ(0x75, irsend.capture.command);
@@ -650,11 +672,11 @@ TEST(TestDecodeRC6, NormalMode0DecodeWithStrict) {
// Normal Synthesised RC-6 Mode 0 (20-bit) message.
irsend.reset();
- irsend.sendRC6(irsend.encodeRC6(0x1234567, 0x89, RC6_MODE0_BITS));
+ irsend.sendRC6(irsend.encodeRC6(0x1234567, 0x89, kRC6Mode0Bits));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, RC6_MODE0_BITS, true));
+ ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kRC6Mode0Bits, true));
EXPECT_EQ(RC6, irsend.capture.decode_type);
- EXPECT_EQ(RC6_MODE0_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC6Mode0Bits, irsend.capture.bits);
EXPECT_EQ(0x56789, irsend.capture.value);
EXPECT_EQ(0x567, irsend.capture.address);
EXPECT_EQ(0x89, irsend.capture.command);
@@ -662,11 +684,11 @@ TEST(TestDecodeRC6, NormalMode0DecodeWithStrict) {
// Same again, but encoded manually.
irsend.reset();
- irsend.sendRC6(0x123456789, RC6_MODE0_BITS);
+ irsend.sendRC6(0x123456789, kRC6Mode0Bits);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, RC6_MODE0_BITS, true));
+ ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kRC6Mode0Bits, true));
EXPECT_EQ(RC6, irsend.capture.decode_type);
- EXPECT_EQ(RC6_MODE0_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC6Mode0Bits, irsend.capture.bits);
EXPECT_EQ(0x56789, irsend.capture.value);
EXPECT_EQ(0x567, irsend.capture.address);
EXPECT_EQ(0x89, irsend.capture.command);
@@ -681,11 +703,11 @@ TEST(TestDecodeRC6, Normal36BitDecodeWithStrict) {
// Normal RC-6 36-bit message.
irsend.reset();
- irsend.sendRC6(0x175, RC6_36_BITS);
+ irsend.sendRC6(0x175, kRC6_36Bits);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, RC6_36_BITS, true));
+ ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kRC6_36Bits, true));
EXPECT_EQ(RC6, irsend.capture.decode_type);
- EXPECT_EQ(RC6_36_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC6_36Bits, irsend.capture.bits);
EXPECT_EQ(0x175, irsend.capture.value);
EXPECT_EQ(0x01, irsend.capture.address);
EXPECT_EQ(0x75, irsend.capture.command);
@@ -693,11 +715,11 @@ TEST(TestDecodeRC6, Normal36BitDecodeWithStrict) {
// Normal Synthesised RC-6 36-bit message.
irsend.reset();
- irsend.sendRC6(irsend.encodeRC6(0x1234567, 0x89, RC6_36_BITS), RC6_36_BITS);
+ irsend.sendRC6(irsend.encodeRC6(0x1234567, 0x89, kRC6_36Bits), kRC6_36Bits);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, RC6_36_BITS, true));
+ ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kRC6_36Bits, true));
EXPECT_EQ(RC6, irsend.capture.decode_type);
- EXPECT_EQ(RC6_36_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC6_36Bits, irsend.capture.bits);
EXPECT_EQ(0x123456789, irsend.capture.value);
EXPECT_EQ(0x1234567, irsend.capture.address);
EXPECT_EQ(0x89, irsend.capture.command);
@@ -712,22 +734,22 @@ TEST(TestDecodeRC6, NormalMode0DecodeWithRepeatAndStrict) {
// Normal RC-6 Mode 0 (20-bit) even message with one repeat.
irsend.reset();
- irsend.sendRC6(0x174, RC6_MODE0_BITS, 1);
+ irsend.sendRC6(0x174, kRC6Mode0Bits, 1);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, RC6_MODE0_BITS, true));
+ ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kRC6Mode0Bits, true));
EXPECT_EQ(RC6, irsend.capture.decode_type);
- EXPECT_EQ(RC6_MODE0_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC6Mode0Bits, irsend.capture.bits);
EXPECT_EQ(0x174, irsend.capture.value);
EXPECT_EQ(0x1, irsend.capture.address);
EXPECT_EQ(0x74, irsend.capture.command);
// Normal RC-6 Mode 0 (20-bit) odd message with one repeat.
irsend.reset();
- irsend.sendRC6(0x175, RC6_MODE0_BITS, 1);
+ irsend.sendRC6(0x175, kRC6Mode0Bits, 1);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, RC6_MODE0_BITS, true));
+ ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kRC6Mode0Bits, true));
EXPECT_EQ(RC6, irsend.capture.decode_type);
- EXPECT_EQ(RC6_MODE0_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC6Mode0Bits, irsend.capture.bits);
EXPECT_EQ(0x175, irsend.capture.value);
EXPECT_EQ(0x1, irsend.capture.address);
EXPECT_EQ(0x75, irsend.capture.command);
@@ -741,22 +763,22 @@ TEST(TestDecodeRC6, Normal36BitDecodeWithRepeatAndStrict) {
// Normal RC-6 36-bit odd message with one repeat.
irsend.reset();
- irsend.sendRC6(0x175, RC6_36_BITS, 1);
+ irsend.sendRC6(0x175, kRC6_36Bits, 1);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, RC6_36_BITS, true));
+ ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kRC6_36Bits, true));
EXPECT_EQ(RC6, irsend.capture.decode_type);
- EXPECT_EQ(RC6_36_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC6_36Bits, irsend.capture.bits);
EXPECT_EQ(0x175, irsend.capture.value);
EXPECT_EQ(0x1, irsend.capture.address);
EXPECT_EQ(0x75, irsend.capture.command);
// Normal RC-6 36-bit even message with one repeat.
irsend.reset();
- irsend.sendRC6(0x174, RC6_36_BITS, 1);
+ irsend.sendRC6(0x174, kRC6_36Bits, 1);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, RC6_36_BITS, true));
+ ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kRC6_36Bits, true));
EXPECT_EQ(RC6, irsend.capture.decode_type);
- EXPECT_EQ(RC6_36_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC6_36Bits, irsend.capture.bits);
EXPECT_EQ(0x174, irsend.capture.value);
EXPECT_EQ(0x1, irsend.capture.address);
EXPECT_EQ(0x74, irsend.capture.command);
@@ -770,11 +792,11 @@ TEST(TestDecodeRC6, NormalDecodeWithoutStrict) {
// Normal RC-6 Mode 0 (20-bit) message.
irsend.reset();
- irsend.sendRC6(0x175, RC6_MODE0_BITS);
+ irsend.sendRC6(0x175, kRC6Mode0Bits);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture));
EXPECT_EQ(RC6, irsend.capture.decode_type);
- EXPECT_EQ(RC6_MODE0_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC6Mode0Bits, irsend.capture.bits);
EXPECT_EQ(0x175, irsend.capture.value);
EXPECT_EQ(0x01, irsend.capture.address);
EXPECT_EQ(0x75, irsend.capture.command);
@@ -782,11 +804,11 @@ TEST(TestDecodeRC6, NormalDecodeWithoutStrict) {
// Normal RC-6 Mode 0 (20-bit) message.
irsend.reset();
- irsend.sendRC6(0x174, RC6_MODE0_BITS);
+ irsend.sendRC6(0x174, kRC6Mode0Bits);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture));
EXPECT_EQ(RC6, irsend.capture.decode_type);
- EXPECT_EQ(RC6_MODE0_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC6Mode0Bits, irsend.capture.bits);
EXPECT_EQ(0x174, irsend.capture.value);
EXPECT_EQ(0x01, irsend.capture.address);
EXPECT_EQ(0x74, irsend.capture.command);
@@ -794,11 +816,11 @@ TEST(TestDecodeRC6, NormalDecodeWithoutStrict) {
// Normal RC-6 36-bit message.
irsend.reset();
- irsend.sendRC6(0x174, RC6_36_BITS);
+ irsend.sendRC6(0x174, kRC6_36Bits);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture));
EXPECT_EQ(RC6, irsend.capture.decode_type);
- EXPECT_EQ(RC6_36_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC6_36Bits, irsend.capture.bits);
EXPECT_EQ(0x174, irsend.capture.value);
EXPECT_EQ(0x01, irsend.capture.address);
EXPECT_EQ(0x74, irsend.capture.command);
@@ -806,11 +828,11 @@ TEST(TestDecodeRC6, NormalDecodeWithoutStrict) {
// Normal Synthesised RC-6 36-bit message.
irsend.reset();
- irsend.sendRC6(irsend.encodeRC6(0x1234567, 0x89, RC6_36_BITS), RC6_36_BITS);
+ irsend.sendRC6(irsend.encodeRC6(0x1234567, 0x89, kRC6_36Bits), kRC6_36Bits);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture));
EXPECT_EQ(RC6, irsend.capture.decode_type);
- EXPECT_EQ(RC6_36_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC6_36Bits, irsend.capture.bits);
EXPECT_EQ(0x123456789, irsend.capture.value);
EXPECT_EQ(0x1234567, irsend.capture.address);
EXPECT_EQ(0x89, irsend.capture.command);
@@ -825,17 +847,17 @@ TEST(TestDecodeRC6, Decode36BitGlobalCacheExample) {
irsend.reset();
// Xbox-360 Power On from Global Cache.
- uint16_t gc_test[65] = {36000, 1, 1, 96, 32, 16, 16, 16, 16, 16, 32, 16, 32,
- 48, 32, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 32, 16, 16, 16,
- 16, 16, 16, 32, 32, 16, 16, 16, 16, 32, 32, 32, 16,
- 16, 16, 16, 16, 16, 32, 32, 32, 32, 32, 32, 16, 2476};
+ uint16_t gc_test[65] = {
+ 36000, 1, 1, 96, 32, 16, 16, 16, 16, 16, 32, 16, 32, 48, 32, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 32, 16, 16, 16, 16, 16, 16, 32, 32, 16, 16, 16, 16, 32, 32, 32,
+ 16, 16, 16, 16, 16, 16, 32, 32, 32, 32, 32, 32, 16, 2476};
irsend.sendGC(gc_test, 65);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, RC6_36_BITS));
+ ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kRC6_36Bits));
EXPECT_EQ(RC6, irsend.capture.decode_type);
- EXPECT_EQ(RC6_36_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRC6_36Bits, irsend.capture.bits);
EXPECT_EQ(0xC800F742A, irsend.capture.value);
EXPECT_EQ(0xC800F74, irsend.capture.address);
EXPECT_EQ(0x2A, irsend.capture.command);
@@ -849,25 +871,26 @@ TEST(TestDecodeRC5, FailToDecodeNonRC6Example) {
irsend.begin();
irsend.reset();
- uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20, 20, 20, 20,
- 20, 20, 20, 127, 20, 61, 9, 20, 20, 61, 20, 20, 20,
- 61, 20, 61, 20, 61, 20, 20, 20, 20, 20, 20, 20, 884};
+ uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
+ 20, 20, 20, 20, 20, 20, 127, 20, 61, 9,
+ 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
+ 61, 20, 20, 20, 20, 20, 20, 20, 884};
irsend.sendGC(gc_test, 39);
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, RC6_MODE0_BITS, true));
- ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, RC6_MODE0_BITS, false));
- ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, RC6_36_BITS, true));
- ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, RC6_36_BITS, false));
+ ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kRC6Mode0Bits, true));
+ ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kRC6Mode0Bits, false));
+ ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kRC6_36Bits, true));
+ ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kRC6_36Bits, false));
irsend.reset();
irsend.sendRC5(0x0);
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, RC6_MODE0_BITS, true));
- ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, RC6_MODE0_BITS, false));
- ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, RC6_36_BITS, true));
- ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, RC6_36_BITS, false));
+ ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kRC6Mode0Bits, true));
+ ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kRC6Mode0Bits, false));
+ ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kRC6_36Bits, true));
+ ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kRC6_36Bits, false));
}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_RCMM_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_RCMM_test.cpp
similarity index 72%
rename from lib/IRremoteESP8266-2.2.1.02/test/ir_RCMM_test.cpp
rename to lib/IRremoteESP8266-2.5.2.03/test/ir_RCMM_test.cpp
index 2115dcb2ee22..028dbd8b3b6f 100644
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_RCMM_test.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_RCMM_test.cpp
@@ -13,16 +13,20 @@ TEST(TestSendRCMM, SendDataOnly) {
irsend.reset();
irsend.sendRCMM(0xe0a600);
- EXPECT_EQ("m416s277"
- "m166s777m166s611m166s277m166s277"
- "m166s611m166s611m166s444m166s611m166s277m166s277m166s277m166s277"
- "m166s27778", irsend.outputStr());
+ EXPECT_EQ(
+ "m416s277"
+ "m166s777m166s611m166s277m166s277"
+ "m166s611m166s611m166s444m166s611m166s277m166s277m166s277m166s277"
+ "m166s19600",
+ irsend.outputStr());
irsend.reset();
irsend.sendRCMM(0x28e0a600UL, 32);
- EXPECT_EQ("m416s277"
- "m166s277m166s611m166s611m166s277m166s777m166s611m166s277m166s277"
- "m166s611m166s611m166s444m166s611m166s277m166s277m166s277m166s277"
- "m166s27778", irsend.outputStr());
+ EXPECT_EQ(
+ "m416s277"
+ "m166s277m166s611m166s611m166s277m166s777m166s611m166s277m166s277"
+ "m166s611m166s611m166s444m166s611m166s277m166s277m166s277m166s277"
+ "m166s17160",
+ irsend.outputStr());
}
// Test sending with different repeats.
@@ -32,36 +36,42 @@ TEST(TestSendRCMM, SendWithRepeats) {
irsend.reset();
irsend.sendRCMM(0x28e0a600, 32, 2); // 2 repeats.
- EXPECT_EQ("m416s277"
- "m166s277m166s611m166s611m166s277m166s777m166s611m166s277m166s277"
- "m166s611m166s611m166s444m166s611m166s277m166s277m166s277m166s277"
- "m166s27778"
- "m416s277"
- "m166s277m166s611m166s611m166s277m166s777m166s611m166s277m166s277"
- "m166s611m166s611m166s444m166s611m166s277m166s277m166s277m166s277"
- "m166s27778"
- "m416s277"
- "m166s277m166s611m166s611m166s277m166s777m166s611m166s277m166s277"
- "m166s611m166s611m166s444m166s611m166s277m166s277m166s277m166s277"
- "m166s27778", irsend.outputStr());
+ EXPECT_EQ(
+ "m416s277"
+ "m166s277m166s611m166s611m166s277m166s777m166s611m166s277m166s277"
+ "m166s611m166s611m166s444m166s611m166s277m166s277m166s277m166s277"
+ "m166s17160"
+ "m416s277"
+ "m166s277m166s611m166s611m166s277m166s777m166s611m166s277m166s277"
+ "m166s611m166s611m166s444m166s611m166s277m166s277m166s277m166s277"
+ "m166s17160"
+ "m416s277"
+ "m166s277m166s611m166s611m166s277m166s777m166s611m166s277m166s277"
+ "m166s611m166s611m166s444m166s611m166s277m166s277m166s277m166s277"
+ "m166s17160",
+ irsend.outputStr());
}
// Test sending an atypical data size.
-TEST(TestSendRCMM, SendUsualSize) {
+TEST(TestSendRCMM, SendUnusualSize) {
IRsendTest irsend(4);
irsend.begin();
irsend.reset();
irsend.sendRCMM(0xE0, 8);
- EXPECT_EQ("m416s277"
- "m166s777m166s611m166s277m166s277"
- "m166s27778", irsend.outputStr());
+ EXPECT_EQ(
+ "m416s277"
+ "m166s777m166s611m166s277m166s277"
+ "m166s24313",
+ irsend.outputStr());
irsend.reset();
irsend.sendRCMM(0x28e0a60000UL, 40);
- EXPECT_EQ("m416s277"
- "m166s277m166s611m166s611m166s277m166s777m166s611m166s277m166s277"
- "m166s611m166s611m166s444m166s611m166s277m166s277m166s277m166s277"
- "m166s277m166s277m166s277m166s277m166s27778", irsend.outputStr());
+ EXPECT_EQ(
+ "m416s277"
+ "m166s277m166s611m166s611m166s277m166s777m166s611m166s277m166s277"
+ "m166s611m166s611m166s444m166s611m166s277m166s277m166s277m166s277"
+ "m166s277m166s277m166s277m166s277m166s15388",
+ irsend.outputStr());
}
// Tests for decodeRCMM().
@@ -76,9 +86,9 @@ TEST(TestDecodeRCMM, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendRCMM(0xe0a600);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRCMM(&irsend.capture, RCMM_BITS, true));
+ ASSERT_TRUE(irrecv.decodeRCMM(&irsend.capture, kRCMMBits, true));
EXPECT_EQ(RCMM, irsend.capture.decode_type);
- EXPECT_EQ(RCMM_BITS, irsend.capture.bits);
+ EXPECT_EQ(kRCMMBits, irsend.capture.bits);
EXPECT_EQ(0xe0a600, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
@@ -203,14 +213,15 @@ TEST(TestDecodeRCMM, FailToDecodeNonRCMMExample) {
irsend.reset();
// Modified a few entries to unexpected values, based on previous test case.
- uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20, 20, 20, 20,
- 20, 20, 20, 127, 20, 61, 9, 20, 20, 61, 20, 20, 20,
- 61, 20, 61, 20, 61, 20, 20, 20, 20, 20, 20, 20, 884};
+ uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
+ 20, 20, 20, 20, 20, 20, 127, 20, 61, 9,
+ 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
+ 61, 20, 20, 20, 20, 20, 20, 20, 884};
irsend.sendGC(gc_test, 39);
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeRCMM(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeRCMM(&irsend.capture, RCMM_BITS, false));
+ ASSERT_FALSE(irrecv.decodeRCMM(&irsend.capture, kRCMMBits, false));
}
// Issue 281 Debugging
@@ -220,11 +231,12 @@ TEST(TestDecodeRCMM, DebugIssue281) {
irsend.begin();
// Data from Issue #281 (shortened version)
- uint16_t rawData[36] = {448, 276, 150, 285, 164, 613, 163, 447, 162, 613,
- 164, 445, 164, 776, 167, 278, 163, 280, 163, 280,
- 162, 611, 168, 444, 163, 612, 164, 277, 168, 447,
- 157, 282, 165, 276,
- 165, 65535}; // Last value modified from 89729
+ uint16_t
+ rawData[36] = {448, 276, 150, 285, 164, 613, 163, 447, 162, 613,
+ 164, 445, 164, 776, 167, 278, 163, 280, 163, 280,
+ 162, 611, 168, 444, 163, 612, 164, 277, 168, 447,
+ 157, 282, 165, 276, 165, 65535}; // Last value modified
+ // from 89729
irsend.reset();
irsend.sendRaw(rawData, 36, 36);
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Samsung_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Samsung_test.cpp
new file mode 100644
index 000000000000..9ee1fcabbc6a
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Samsung_test.cpp
@@ -0,0 +1,907 @@
+// Copyright 2017 David Conran
+
+#include "ir_Samsung.h"
+#include "IRrecv.h"
+#include "IRrecv_test.h"
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests for sendSAMSUNG().
+
+// Test sending typical data only.
+TEST(TestSendSamsung, SendDataOnly) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendSAMSUNG(0xE0E09966); // Samsung TV Power On.
+ EXPECT_EQ(
+ "m4480s4480"
+ "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560"
+ "m560s560m560s1680m560s1680m560s1680m560s560m560s560m560s560"
+ "m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
+ "m560s560m560s560m560s1680m560s560m560s1680m560s1680m560s560"
+ "m560s560m560s1680m560s1680m560s560m560s47040",
+ irsend.outputStr());
+
+ irsend.reset();
+}
+
+// Test sending with different repeats.
+TEST(TestSendSamsung, SendWithRepeats) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendSAMSUNG(0xE0E09966, kSamsungBits, 1); // 1 repeat.
+ EXPECT_EQ(
+ "m4480s4480"
+ "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560"
+ "m560s560m560s1680m560s1680m560s1680m560s560m560s560m560s560"
+ "m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
+ "m560s560m560s560m560s1680m560s560m560s1680m560s1680m560s560"
+ "m560s560m560s1680m560s1680m560s560m560s47040"
+ "m4480s4480"
+ "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560"
+ "m560s560m560s1680m560s1680m560s1680m560s560m560s560m560s560"
+ "m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
+ "m560s560m560s560m560s1680m560s560m560s1680m560s1680m560s560"
+ "m560s560m560s1680m560s1680m560s560m560s47040",
+ irsend.outputStr());
+ irsend.sendSAMSUNG(0xE0E09966, kSamsungBits, 2); // 2 repeats.
+ EXPECT_EQ(
+ "m4480s4480"
+ "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560"
+ "m560s560m560s1680m560s1680m560s1680m560s560m560s560m560s560"
+ "m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
+ "m560s560m560s560m560s1680m560s560m560s1680m560s1680m560s560"
+ "m560s560m560s1680m560s1680m560s560m560s47040"
+ "m4480s4480"
+ "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560"
+ "m560s560m560s1680m560s1680m560s1680m560s560m560s560m560s560"
+ "m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
+ "m560s560m560s560m560s1680m560s560m560s1680m560s1680m560s560"
+ "m560s560m560s1680m560s1680m560s560m560s47040"
+ "m4480s4480"
+ "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560"
+ "m560s560m560s1680m560s1680m560s1680m560s560m560s560m560s560"
+ "m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
+ "m560s560m560s560m560s1680m560s560m560s1680m560s1680m560s560"
+ "m560s560m560s1680m560s1680m560s560m560s47040",
+ irsend.outputStr());
+}
+
+// Tests for encodeSAMSUNG().
+
+TEST(TestEncodeSamsung, NormalEncoding) {
+ IRsendTest irsend(4);
+ EXPECT_EQ(0xFF, irsend.encodeSAMSUNG(0, 0));
+ EXPECT_EQ(0x8080807F, irsend.encodeSAMSUNG(1, 1));
+ EXPECT_EQ(0xF8F805FA, irsend.encodeSAMSUNG(0x1F, 0xA0));
+ EXPECT_EQ(0xA0A0CC33, irsend.encodeSAMSUNG(0x05, 0x33));
+ EXPECT_EQ(0xFFFFFF00, irsend.encodeSAMSUNG(0xFF, 0xFF));
+ EXPECT_EQ(0xE0E09966, irsend.encodeSAMSUNG(0x07, 0x99));
+}
+
+// Tests for decodeSAMSUNG().
+
+// Decode normal Samsung messages.
+TEST(TestDecodeSamsung, NormalDecodeWithStrict) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ // Normal Samsung 32-bit message.
+ irsend.reset();
+ irsend.sendSAMSUNG(0xE0E09966);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
+ EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
+ EXPECT_EQ(kSamsungBits, irsend.capture.bits);
+ EXPECT_EQ(0xE0E09966, irsend.capture.value);
+ EXPECT_EQ(0x07, irsend.capture.address);
+ EXPECT_EQ(0x99, irsend.capture.command);
+
+ // Synthesised Normal Samsung 32-bit message.
+ irsend.reset();
+ irsend.sendSAMSUNG(irsend.encodeSAMSUNG(0x07, 0x99));
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
+ EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
+ EXPECT_EQ(kSamsungBits, irsend.capture.bits);
+ EXPECT_EQ(0xE0E09966, irsend.capture.value);
+ EXPECT_EQ(0x07, irsend.capture.address);
+ EXPECT_EQ(0x99, irsend.capture.command);
+
+ // Synthesised Normal Samsung 32-bit message.
+ irsend.reset();
+ irsend.sendSAMSUNG(irsend.encodeSAMSUNG(0x1, 0x1));
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
+ EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
+ EXPECT_EQ(kSamsungBits, irsend.capture.bits);
+ EXPECT_EQ(0x8080807F, irsend.capture.value);
+ EXPECT_EQ(0x1, irsend.capture.address);
+ EXPECT_EQ(0x1, irsend.capture.command);
+}
+
+// Decode normal repeated Samsung messages.
+TEST(TestDecodeSamsung, NormalDecodeWithRepeatAndStrict) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ // Normal Samsung 32-bit message.
+ irsend.reset();
+ irsend.sendSAMSUNG(0xE0E09966, kSamsungBits, 2);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
+ EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
+ EXPECT_EQ(kSamsungBits, irsend.capture.bits);
+ EXPECT_EQ(0xE0E09966, irsend.capture.value);
+ EXPECT_EQ(0x07, irsend.capture.address);
+ EXPECT_EQ(0x99, irsend.capture.command);
+}
+
+// Decode unsupported Samsung messages.
+TEST(TestDecodeSamsung, DecodeWithNonStrictValues) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendSAMSUNG(0x0); // Illegal value Samsung 32-bit message.
+ irsend.makeDecodeResult();
+ // Should fail with strict on.
+ ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
+ // Should pass if strict off.
+ ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, false));
+ EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
+ EXPECT_EQ(kSamsungBits, irsend.capture.bits);
+ EXPECT_EQ(0x0, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+
+ irsend.reset();
+ irsend.sendSAMSUNG(0x12345678); // Illegal value Samsung 32-bit message.
+ irsend.makeDecodeResult();
+ // Should fail with strict on.
+ ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
+ // Should pass if strict off.
+ ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, false));
+ EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
+ EXPECT_EQ(kSamsungBits, irsend.capture.bits);
+ EXPECT_EQ(0x12345678, irsend.capture.value);
+ EXPECT_EQ(0x48, irsend.capture.address);
+ EXPECT_EQ(0x6A, irsend.capture.command);
+
+ // Illegal over length (36-bit) message.
+ irsend.reset();
+ irsend.sendSAMSUNG(irsend.encodeSAMSUNG(0, 0), 36);
+ irsend.makeDecodeResult();
+ // Should fail with strict on.
+ ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
+ // Shouldn't pass if strict off and wrong expected bit size.
+ ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, false));
+ // Re-decode with correct bit size.
+ ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, 36, true));
+ ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, 36, false));
+ EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
+ EXPECT_EQ(36, irsend.capture.bits);
+ EXPECT_EQ(0xFF, irsend.capture.value); // We told it to expect 8 bits less.
+ EXPECT_EQ(0x00, irsend.capture.address);
+ EXPECT_EQ(0x00, irsend.capture.command);
+
+ // Illegal under length (16-bit) message
+ irsend.reset();
+ irsend.sendSAMSUNG(irsend.encodeSAMSUNG(0x0, 0x0), 16);
+ irsend.makeDecodeResult();
+ // Should fail with strict on.
+ ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
+ // And it should fail when we expect more bits.
+ ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, false));
+
+ // Should pass if strict off if we ask for correct nr. of bits sent.
+ ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, 16, false));
+ EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
+ EXPECT_EQ(16, irsend.capture.bits);
+ EXPECT_EQ(0xFF, irsend.capture.value); // We told it to expect 4 bits less.
+ EXPECT_EQ(0x00, irsend.capture.address);
+ EXPECT_EQ(0x00, irsend.capture.command);
+
+ // Should fail as we are expecting less bits than there are.
+ ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, 12, false));
+}
+
+// Decode (non-standard) 64-bit messages.
+// Decode unsupported Samsung messages.
+TEST(TestDecodeSamsung, Decode64BitMessages) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Illegal value & size Samsung 64-bit message.
+ irsend.sendSAMSUNG(0xFFFFFFFFFFFFFFFF, 64);
+ irsend.makeDecodeResult();
+ ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
+ // Should work with a 'normal' match (not strict)
+ ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, 64, false));
+ EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
+ EXPECT_EQ(64, irsend.capture.bits);
+ EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
+ EXPECT_EQ(0xFF, irsend.capture.address);
+ EXPECT_EQ(0xFF, irsend.capture.command);
+}
+
+// Decode a 'real' example via GlobalCache
+TEST(TestDecodeSamsung, DecodeGlobalCacheExample) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Samsung TV Power On from Global Cache.
+ uint16_t gc_test[71] = {38000, 1, 1, 172, 172, 22, 64, 22, 64, 22, 64, 22,
+ 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 64, 22,
+ 64, 22, 64, 22, 21, 22, 21, 22, 21, 22, 21, 22,
+ 21, 22, 64, 22, 21, 22, 21, 22, 64, 22, 64, 22,
+ 21, 22, 21, 22, 64, 22, 21, 22, 64, 22, 64, 22,
+ 21, 22, 21, 22, 64, 22, 64, 22, 21, 22, 1820};
+ irsend.sendGC(gc_test, 71);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture));
+ EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
+ EXPECT_EQ(kSamsungBits, irsend.capture.bits);
+ EXPECT_EQ(0xE0E09966, irsend.capture.value);
+ EXPECT_EQ(0x07, irsend.capture.address);
+ EXPECT_EQ(0x99, irsend.capture.command);
+}
+
+// Fail to decode a non-Samsung example via GlobalCache
+TEST(TestDecodeSamsung, FailToDecodeNonSamsungExample) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Modified a few entries to unexpected values, based on previous test case.
+ uint16_t gc_test[71] = {38000, 1, 1, 172, 172, 22, 64, 22, 64, 22, 64, 22,
+ 21, 22, 21, 22, 21, 22, 11, 22, 21, 22, 128, 22,
+ 64, 22, 64, 22, 21, 22, 21, 22, 21, 22, 21, 22,
+ 21, 22, 64, 22, 21, 22, 21, 22, 64, 22, 64, 22,
+ 21, 22, 21, 22, 64, 22, 21, 22, 64, 22, 64, 22,
+ 21, 22, 21, 22, 64, 22, 64, 22, 21, 22, 1820};
+ irsend.sendGC(gc_test, 71);
+ irsend.makeDecodeResult();
+
+ ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture));
+ ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, false));
+}
+
+// Tests for sendSamsungAC().
+
+// Test sending typical data only.
+TEST(TestSendSamsungAC, SendDataOnly) {
+ IRsendTest irsend(0);
+ irsend.begin();
+ uint8_t data[kSamsungAcStateLength] = {0x02, 0x92, 0x0F, 0x00, 0x00,
+ 0x00, 0xF0, 0x01, 0x02, 0xAF,
+ 0x71, 0x00, 0x15, 0xF0};
+ irsend.sendSamsungAC(data);
+ EXPECT_EQ(
+ "m690s17844"
+ "m3086s8864"
+ "m586s436m586s1432m586s436m586s436m586s436m586s436m586s436m586s436"
+ "m586s436m586s1432m586s436m586s436m586s1432m586s436m586s436m586s1432"
+ "m586s1432m586s1432m586s1432m586s1432m586s436m586s436m586s436m586s436"
+ "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
+ "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
+ "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
+ "m586s436m586s436m586s436m586s436m586s1432m586s1432m586s1432m586s1432"
+ "m586s2886"
+ "m3086s8864"
+ "m586s1432m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
+ "m586s436m586s1432m586s436m586s436m586s436m586s436m586s436m586s436"
+ "m586s1432m586s1432m586s1432m586s1432m586s436m586s1432m586s436m586s1432"
+ "m586s1432m586s436m586s436m586s436m586s1432m586s1432m586s1432m586s436"
+ "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
+ "m586s1432m586s436m586s1432m586s436m586s1432m586s436m586s436m586s436"
+ "m586s436m586s436m586s436m586s436m586s1432m586s1432m586s1432m586s1432"
+ "m586s100000",
+ irsend.outputStr());
+}
+
+// Test sending extended data.
+TEST(TestSendSamsungAC, SendExtendedData) {
+ IRsendTest irsend(0);
+ irsend.begin();
+ // "Off" message.
+ uint8_t data[kSamsungAcExtendedStateLength] = {
+ 0x02, 0xB2, 0x0F, 0x00, 0x00, 0x00, 0xC0, 0x01, 0xD2, 0x0F, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x02, 0xFF, 0x71, 0x80, 0x11, 0xC0};
+ irsend.sendSamsungAC(data, kSamsungAcExtendedStateLength);
+ EXPECT_EQ(
+ "m690s17844"
+ "m3086s8864"
+ "m586s436m586s1432m586s436m586s436m586s436m586s436m586s436m586s436"
+ "m586s436m586s1432m586s436m586s436m586s1432m586s1432m586s436m586s1432"
+ "m586s1432m586s1432m586s1432m586s1432m586s436m586s436m586s436m586s436"
+ "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
+ "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
+ "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
+ "m586s436m586s436m586s436m586s436m586s436m586s436m586s1432m586s1432"
+ "m586s2886"
+ "m3086s8864"
+ "m586s1432m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
+ "m586s436m586s1432m586s436m586s436m586s1432m586s436m586s1432m586s1432"
+ "m586s1432m586s1432m586s1432m586s1432m586s436m586s436m586s436m586s436"
+ "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
+ "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
+ "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
+ "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
+ "m586s2886"
+ "m3086s8864"
+ "m586s1432m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
+ "m586s436m586s1432m586s436m586s436m586s436m586s436m586s436m586s436"
+ "m586s1432m586s1432m586s1432m586s1432m586s1432m586s1432m586s1432m586s1432"
+ "m586s1432m586s436m586s436m586s436m586s1432m586s1432m586s1432m586s436"
+ "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s1432"
+ "m586s1432m586s436m586s436m586s436m586s1432m586s436m586s436m586s436"
+ "m586s436m586s436m586s436m586s436m586s436m586s436m586s1432m586s1432"
+ "m586s100000",
+ irsend.outputStr());
+}
+
+// Tests for IRSamsungAc class.
+
+TEST(TestIRSamsungAcClass, SetAndGetRaw) {
+ uint8_t expectedState[kSamsungAcStateLength] = {0x02, 0x92, 0x0F, 0x00, 0x00,
+ 0x00, 0xF0, 0x01, 0xE2, 0xFE,
+ 0x71, 0x40, 0x11, 0xF0};
+ IRSamsungAc samsung(0);
+ samsung.setRaw(expectedState);
+ EXPECT_STATE_EQ(expectedState, samsung.getRaw(), kSamsungAcBits);
+ uint8_t extendedState[kSamsungAcExtendedStateLength] = {
+ 0x02, 0x92, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0x01, 0xD2, 0x0F, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0xE2, 0xFE, 0x71, 0x40, 0x11, 0xF0};
+ samsung.setRaw(extendedState, kSamsungAcExtendedStateLength);
+ // We should NOT get the extended state back.
+ EXPECT_STATE_EQ(expectedState, samsung.getRaw(), kSamsungAcBits);
+}
+
+TEST(TestIRSamsungAcClass, SetAndGetPower) {
+ IRSamsungAc samsung(0);
+ samsung.on();
+ EXPECT_TRUE(samsung.getPower());
+ samsung.off();
+ EXPECT_FALSE(samsung.getPower());
+ samsung.setPower(true);
+ EXPECT_TRUE(samsung.getPower());
+ samsung.setPower(false);
+ EXPECT_FALSE(samsung.getPower());
+}
+
+TEST(TestIRSamsungAcClass, SetAndGetSwing) {
+ IRSamsungAc samsung(0);
+ samsung.setSwing(true);
+ EXPECT_TRUE(samsung.getSwing());
+ samsung.setSwing(false);
+ EXPECT_FALSE(samsung.getSwing());
+ samsung.setSwing(true);
+ EXPECT_TRUE(samsung.getSwing());
+
+ // Real examples from:
+ // https://github.com/markszabo/IRremoteESP8266/issues/505#issuecomment-424036602
+ // TODO(Hollako): Explain why state[9] lowest bit changes between on and off.
+ const uint8_t expected_off[kSamsungAcStateLength] = {
+ 0x02, 0x92, 0x0F, 0x00, 0x00, 0x00, 0xF0,
+ 0x01, 0xE2, 0xFE, 0x71, 0x80, 0x11, 0xF0};
+ samsung.setRaw(expected_off);
+ EXPECT_FALSE(samsung.getSwing());
+ const uint8_t expected_on[kSamsungAcStateLength] = {
+ 0x02, 0x92, 0x0F, 0x00, 0x00, 0x00, 0xF0,
+ 0x01, 0x02, 0xAF, 0x71, 0x80, 0x11, 0xF0};
+ samsung.setRaw(expected_on);
+ EXPECT_TRUE(samsung.getSwing());
+}
+
+TEST(TestIRSamsungAcClass, SetAndGetClean) {
+ IRSamsungAc samsung(0);
+ samsung.setClean(true);
+ EXPECT_TRUE(samsung.getClean());
+ samsung.setClean(false);
+ EXPECT_FALSE(samsung.getClean());
+ samsung.setClean(true);
+ EXPECT_TRUE(samsung.getClean());
+}
+
+TEST(TestIRSamsungAcClass, SetAndGetBeep) {
+ IRSamsungAc samsung(0);
+ samsung.setBeep(false);
+ EXPECT_FALSE(samsung.getBeep());
+ samsung.setBeep(true);
+ EXPECT_TRUE(samsung.getBeep());
+ samsung.setBeep(false);
+ EXPECT_FALSE(samsung.getBeep());
+ samsung.setBeep(true);
+ EXPECT_TRUE(samsung.getBeep());
+}
+
+TEST(TestIRSamsungAcClass, SetAndGetTemp) {
+ IRSamsungAc samsung(0);
+ samsung.setTemp(25);
+ EXPECT_EQ(25, samsung.getTemp());
+ samsung.setTemp(kSamsungAcMinTemp);
+ EXPECT_EQ(kSamsungAcMinTemp, samsung.getTemp());
+ samsung.setTemp(kSamsungAcMinTemp - 1);
+ EXPECT_EQ(kSamsungAcMinTemp, samsung.getTemp());
+ samsung.setTemp(kSamsungAcMaxTemp);
+ EXPECT_EQ(kSamsungAcMaxTemp, samsung.getTemp());
+ samsung.setTemp(kSamsungAcMaxTemp + 1);
+ EXPECT_EQ(kSamsungAcMaxTemp, samsung.getTemp());
+}
+
+TEST(TestIRSamsungAcClass, SetAndGetMode) {
+ IRSamsungAc samsung(0);
+ samsung.setMode(kSamsungAcCool);
+ EXPECT_EQ(kSamsungAcCool, samsung.getMode());
+ EXPECT_NE(kSamsungAcFanAuto2, samsung.getFan());
+ samsung.setMode(kSamsungAcHeat);
+ EXPECT_EQ(kSamsungAcHeat, samsung.getMode());
+ EXPECT_NE(kSamsungAcFanAuto2, samsung.getFan());
+ samsung.setMode(kSamsungAcAuto);
+ EXPECT_EQ(kSamsungAcAuto, samsung.getMode());
+ EXPECT_EQ(kSamsungAcFanAuto2, samsung.getFan());
+ samsung.setMode(kSamsungAcDry);
+ EXPECT_EQ(kSamsungAcDry, samsung.getMode());
+ EXPECT_NE(kSamsungAcFanAuto2, samsung.getFan());
+}
+
+TEST(TestIRSamsungAcClass, SetAndGetFan) {
+ IRSamsungAc samsung(0);
+ samsung.setMode(kSamsungAcCool); // Most fan modes avail in this setting.
+ samsung.setFan(kSamsungAcFanAuto);
+ EXPECT_EQ(kSamsungAcFanAuto, samsung.getFan());
+ samsung.setFan(kSamsungAcFanLow);
+ EXPECT_EQ(kSamsungAcFanLow, samsung.getFan());
+ samsung.setFan(kSamsungAcFanAuto2); // Not available in Cool mode.
+ EXPECT_EQ(kSamsungAcFanLow, samsung.getFan()); // Shouldn't change.
+ samsung.setMode(kSamsungAcAuto); // Has special fan setting.
+ EXPECT_EQ(kSamsungAcFanAuto2, samsung.getFan());
+ samsung.setFan(kSamsungAcFanLow); // Shouldn't be available in Auto mode.
+ EXPECT_EQ(kSamsungAcFanAuto2, samsung.getFan());
+ samsung.setMode(kSamsungAcHeat); // Most fan modes avail in this setting.
+ samsung.setFan(kSamsungAcFanHigh);
+ EXPECT_EQ(kSamsungAcFanHigh, samsung.getFan());
+}
+
+TEST(TestIRSamsungAcClass, SetAndGetQuiet) {
+ IRSamsungAc samsung(0);
+ samsung.setQuiet(false);
+ EXPECT_FALSE(samsung.getQuiet());
+ samsung.setFan(kSamsungAcFanHigh);
+ samsung.setQuiet(true);
+ EXPECT_TRUE(samsung.getQuiet());
+ EXPECT_EQ(kSamsungAcFanAuto, samsung.getFan());
+ samsung.setQuiet(false);
+ EXPECT_FALSE(samsung.getQuiet());
+}
+
+TEST(TestIRSamsungAcClass, ChecksumCalculation) {
+ IRSamsungAc samsung(0);
+
+ const uint8_t originalstate[kSamsungAcStateLength] = {
+ 0x02, 0x92, 0x0F, 0x00, 0x00, 0x00, 0xF0,
+ 0x01, 0x02, 0xAF, 0x71, 0x00, 0x15, 0xF0};
+ uint8_t examplestate[kSamsungAcStateLength] = {0x02, 0x92, 0x0F, 0x00, 0x00,
+ 0x00, 0xF0, 0x01, 0x02, 0xAF,
+ 0x71, 0x00, 0x15, 0xF0};
+
+ EXPECT_TRUE(IRSamsungAc::validChecksum(examplestate));
+ EXPECT_EQ(0, IRSamsungAc::calcChecksum(examplestate));
+
+ examplestate[8] = 0x12; // Set an incoorect checksum.
+ EXPECT_FALSE(IRSamsungAc::validChecksum(examplestate));
+ EXPECT_EQ(0, IRSamsungAc::calcChecksum(examplestate));
+ samsung.setRaw(examplestate);
+ // Extracting the state from the object should have a correct checksum.
+ EXPECT_TRUE(IRSamsungAc::validChecksum(samsung.getRaw()));
+ EXPECT_STATE_EQ(originalstate, samsung.getRaw(), kSamsungAcBits);
+ examplestate[8] = 0x02; // Restore old checksum value.
+
+ // Change the state to force a different checksum.
+ examplestate[11] = 0x01;
+ EXPECT_FALSE(IRSamsungAc::validChecksum(examplestate));
+ EXPECT_EQ(0xF, IRSamsungAc::calcChecksum(examplestate));
+}
+
+TEST(TestIRSamsungAcClass, HumanReadable) {
+ IRSamsungAc samsung(0);
+ EXPECT_EQ(
+ "Power: On, Mode: 1 (COOL), Temp: 16C, Fan: 2 (LOW), Swing: On, "
+ "Beep: Off, Clean: Off, Quiet: Off",
+ samsung.toString());
+ samsung.setTemp(kSamsungAcMaxTemp);
+ samsung.setMode(kSamsungAcHeat);
+ samsung.off();
+ samsung.setFan(kSamsungAcFanHigh);
+ samsung.setSwing(false);
+ samsung.setBeep(true);
+ samsung.setClean(true);
+ EXPECT_EQ(
+ "Power: Off, Mode: 4 (HEAT), Temp: 30C, Fan: 5 (HIGH), Swing: Off, "
+ "Beep: On, Clean: On, Quiet: Off",
+ samsung.toString());
+ samsung.setQuiet(true);
+ EXPECT_EQ(
+ "Power: Off, Mode: 4 (HEAT), Temp: 30C, Fan: 0 (AUTO), Swing: Off, "
+ "Beep: On, Clean: On, Quiet: On",
+ samsung.toString());
+}
+
+TEST(TestIRSamsungAcClass, GeneralConstruction) {
+ IRSamsungAc samsung(0);
+
+ uint8_t OnCoolFAutoBOffCOffQOffT20Soff[kSamsungAcStateLength] = {
+ 0x02, 0x92, 0x0F, 0x00, 0x00, 0x00, 0xF0,
+ 0x01, 0xE2, 0xFE, 0x71, 0x40, 0x11, 0xF0};
+
+ samsung.setPower(true);
+ samsung.setMode(kSamsungAcCool);
+ samsung.setFan(kSamsungAcFanAuto);
+ samsung.setSwing(false);
+ samsung.setBeep(false);
+ samsung.setClean(false);
+ samsung.setQuiet(false);
+ samsung.setTemp(20);
+ EXPECT_STATE_EQ(OnCoolFAutoBOffCOffQOffT20Soff, samsung.getRaw(),
+ kSamsungAcBits);
+ /* Disabled until we understand why LSB bit of the swing byte changes.
+ // TODO(Hollako): Explain why sometimes the LSB of state[9] is a 1.
+ // e.g. 0xAE or 0XAF for swing move.
+ uint8_t OnHeatFAutoBOffCOffQOffT17Son[kSamsungAcStateLength] = {
+ 0x02, 0x92, 0x0F, 0x00, 0x00, 0x00, 0xF0,
+ 0x01, 0x02, 0xAF, 0x71, 0x10, 0x41, 0xF0};
+ samsung.setPower(true);
+ samsung.setMode(kSamsungAcHeat);
+ samsung.setFan(kSamsungAcFanAuto);
+ samsung.setSwing(true);
+ samsung.setBeep(false);
+ samsung.setClean(false);
+ samsung.setQuiet(false);
+ samsung.setTemp(17);
+ EXPECT_STATE_EQ(OnHeatFAutoBOffCOffQOffT17Son, samsung.getRaw(),
+ kSamsungAcBits);
+ */
+}
+// Tests for decodeSamsungAC().
+
+// Decode normal SamsungAC messages.
+TEST(TestDecodeSamsungAC, SyntheticDecode) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+ irsend.reset();
+ uint8_t expectedState[kSamsungAcStateLength] = {0x02, 0x92, 0x0F, 0x00, 0x00,
+ 0x00, 0xF0, 0x01, 0x02, 0xAF,
+ 0x71, 0x00, 0x15, 0xF0};
+ // Synthesised Normal Samsung A/C message.
+ irsend.sendSamsungAC(expectedState);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(SAMSUNG_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kSamsungAcBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+}
+
+// Decode a real Samsung A/C example from Issue #505
+TEST(TestDecodeSamsungAC, DecodeRealExample) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Samsung A/C example from Issue #505
+ uint16_t rawData[233] = {
+ 690, 17844, 3084, 8864, 606, 406, 586, 1410, 580, 436, 570, 424,
+ 570, 426, 570, 404, 596, 418, 580, 416, 584, 410, 586, 1402,
+ 588, 408, 586, 410, 584, 1380, 610, 408, 586, 408, 586, 1404,
+ 586, 1404, 586, 1408, 594, 1396, 596, 1394, 602, 418, 582, 410,
+ 586, 408, 584, 408, 586, 408, 586, 410, 586, 408, 586, 410,
+ 586, 408, 586, 408, 586, 408, 586, 408, 586, 410, 584, 436,
+ 558, 436, 570, 424, 570, 424, 574, 420, 578, 416, 582, 412,
+ 586, 410, 586, 408, 584, 410, 586, 408, 586, 410, 584, 410,
+ 584, 408, 586, 408, 586, 410, 586, 408, 586, 412, 584, 436,
+ 556, 1410, 592, 1396, 602, 1390, 608, 1384, 608, 2886, 3086, 8858,
+ 610, 1380, 610, 410, 586, 408, 586, 410, 586, 408, 586, 410,
+ 586, 408, 586, 436, 558, 436, 554, 1410, 594, 426, 572, 422,
+ 578, 418, 582, 412, 586, 410, 584, 410, 586, 1380, 610, 1382,
+ 608, 1404, 586, 1404, 586, 408, 586, 1432, 558, 436, 554, 1414,
+ 590, 1398, 602, 418, 580, 414, 586, 410, 584, 1382, 606, 1382,
+ 608, 1382, 608, 408, 586, 408, 586, 408, 586, 408, 586, 410,
+ 584, 436, 560, 434, 570, 426, 566, 430, 568, 1400, 600, 416,
+ 584, 1406, 586, 410, 584, 1384, 606, 410, 586, 410, 584, 408,
+ 586, 408, 586, 408, 586, 408, 588, 410, 584, 1408, 590, 1400,
+ 592, 1398, 602, 1388, 612};
+ uint8_t expectedState[kSamsungAcStateLength] = {0x02, 0x92, 0x0F, 0x00, 0x00,
+ 0x00, 0xF0, 0x01, 0x02, 0xAF,
+ 0x71, 0x00, 0x15, 0xF0};
+
+ irsend.sendRaw(rawData, 233, 38000);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(SAMSUNG_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kSamsungAcBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+
+ IRSamsungAc samsung(0);
+ samsung.setRaw(irsend.capture.state);
+ EXPECT_EQ(
+ "Power: On, Mode: 1 (COOL), Temp: 16C, Fan: 2 (LOW), Swing: On, "
+ "Beep: Off, Clean: Off, Quiet: Off",
+ samsung.toString());
+}
+
+// Decode a real Samsung A/C example from Issue #505
+TEST(TestDecodeSamsungAC, DecodeRealExample2) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Samsung A/C example from Issue #505
+ uint16_t rawData[233] = {
+ 668, 17834, 3092, 8862, 608, 410, 586, 1378, 612, 410, 584, 410,
+ 586, 410, 584, 410, 586, 408, 586, 408, 586, 410, 586, 1404,
+ 588, 436, 558, 436, 570, 1398, 592, 424, 576, 420, 578, 1388,
+ 608, 1382, 610, 1382, 608, 1380, 610, 1384, 606, 408, 586, 408,
+ 588, 408, 588, 408, 586, 436, 558, 436, 570, 424, 570, 426,
+ 572, 422, 578, 418, 582, 412, 586, 408, 586, 410, 584, 410,
+ 584, 410, 584, 410, 586, 410, 586, 408, 586, 408, 586, 408,
+ 586, 408, 586, 408, 586, 438, 558, 436, 568, 426, 570, 424,
+ 574, 422, 576, 418, 582, 414, 584, 410, 586, 410, 584, 410,
+ 586, 1380, 610, 1382, 608, 1404, 586, 1404, 602, 2872, 3096, 8878,
+ 582, 1432, 570, 426, 568, 426, 574, 420, 578, 416, 582, 412,
+ 586, 410, 584, 410, 586, 410, 586, 1382, 608, 410, 586, 410,
+ 586, 408, 586, 1404, 586, 1408, 582, 1410, 590, 428, 568, 1400,
+ 598, 1394, 606, 1382, 610, 1382, 608, 1378, 612, 1382, 608, 1384,
+ 606, 1404, 586, 408, 586, 414, 582, 436, 558, 1410, 590, 1422,
+ 576, 1390, 608, 410, 586, 410, 586, 410, 584, 410, 584, 410,
+ 586, 410, 586, 410, 584, 410, 586, 1404, 586, 1404, 588, 436,
+ 560, 436, 486, 510, 566, 1400, 598, 420, 576, 418, 582, 414,
+ 586, 410, 584, 410, 584, 410, 586, 410, 584, 1382, 608, 1384,
+ 606, 1384, 606, 1408, 600};
+ uint8_t expectedState[kSamsungAcStateLength] = {0x02, 0x92, 0x0F, 0x00, 0x00,
+ 0x00, 0xF0, 0x01, 0xE2, 0xFE,
+ 0x71, 0x80, 0x11, 0xF0};
+
+ irsend.sendRaw(rawData, 233, 38000);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(SAMSUNG_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kSamsungAcBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+
+ IRSamsungAc samsung(0);
+ samsung.setRaw(irsend.capture.state);
+ EXPECT_EQ(
+ "Power: On, Mode: 1 (COOL), Temp: 24C, Fan: 0 (AUTO), Swing: Off, "
+ "Beep: Off, Clean: Off, Quiet: Off",
+ samsung.toString());
+}
+
+// Decode a real Samsung A/C example from:
+// https://github.com/markszabo/IRremoteESP8266/issues/505#issuecomment-424036602
+TEST(TestDecodeSamsungAC, DecodePowerOnSample) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ uint16_t rawData[349] = {
+ 662, 17870, 3026, 8966, 540, 484, 514, 1482, 518, 482, 514, 482,
+ 518, 482, 516, 510, 490, 508, 490, 508, 572, 428, 576, 1398,
+ 542, 482, 514, 484, 514, 1460, 540, 482, 518, 482, 516, 1456,
+ 544, 1480, 518, 1480, 518, 1480, 518, 1484, 514, 510, 566, 432,
+ 576, 424, 574, 426, 540, 458, 516, 482, 516, 482, 516, 482,
+ 518, 480, 518, 482, 518, 482, 518, 482, 516, 482, 518, 482,
+ 516, 482, 518, 480, 516, 508, 492, 508, 490, 508, 572, 428,
+ 576, 422, 572, 428, 542, 456, 514, 484, 518, 480, 518, 480,
+ 518, 480, 516, 482, 516, 482, 520, 478, 518, 482, 518, 480,
+ 518, 1480, 518, 1480, 516, 1484, 594, 1428, 518, 2964, 3032, 8964,
+ 540, 1458, 542, 480, 518, 480, 520, 480, 518, 482, 520, 480,
+ 520, 478, 518, 480, 520, 478, 520, 1478, 522, 478, 518, 506,
+ 494, 1484, 594, 426, 574, 1400, 564, 1434, 540, 1454, 544, 1478,
+ 520, 1454, 544, 1458, 540, 480, 520, 480, 518, 480, 520, 480,
+ 518, 508, 490, 506, 568, 432, 572, 426, 576, 424, 544, 454,
+ 518, 480, 516, 482, 520, 478, 520, 478, 522, 478, 518, 480,
+ 520, 478, 520, 478, 520, 478, 520, 478, 520, 478, 518, 478,
+ 522, 506, 494, 504, 566, 432, 576, 424, 576, 424, 570, 428,
+ 518, 482, 518, 480, 518, 482, 520, 478, 520, 478, 520, 480,
+ 520, 478, 520, 478, 520, 2964, 3032, 8986, 520, 1478, 520, 506,
+ 492, 506, 492, 506, 568, 430, 574, 424, 546, 454, 516, 482,
+ 518, 482, 518, 1456, 544, 478, 546, 452, 520, 478, 544, 1432,
+ 542, 1478, 520, 1478, 520, 478, 520, 1482, 586, 1412, 598, 1400,
+ 564, 1432, 540, 1458, 544, 1454, 544, 1454, 544, 1456, 542, 480,
+ 518, 480, 520, 480, 520, 1462, 536, 1482, 588, 1410, 598, 424,
+ 572, 426, 542, 456, 518, 482, 520, 478, 520, 478, 522, 478,
+ 520, 478, 520, 1456, 542, 1458, 540, 478, 520, 478, 520, 478,
+ 520, 1482, 540, 482, 568, 430, 576, 424, 570, 428, 542, 458,
+ 518, 480, 520, 480, 520, 1454, 568, 1430, 566, 1432, 566, 1454,
+ 594};
+ uint8_t expectedState[kSamsungAcExtendedStateLength] = {
+ 0x02, 0x92, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0x01, 0xD2, 0x0F, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0xE2, 0xFE, 0x71, 0x80, 0x11, 0xF0};
+
+ irsend.sendRaw(rawData, 349, 38000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(SAMSUNG_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kSamsungAcExtendedBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+
+ IRSamsungAc samsung(0);
+ samsung.setRaw(irsend.capture.state, kSamsungAcExtendedStateLength);
+ EXPECT_EQ(
+ "Power: On, Mode: 1 (COOL), Temp: 24C, Fan: 0 (AUTO), Swing: Off, "
+ "Beep: Off, Clean: Off, Quiet: Off",
+ samsung.toString());
+}
+
+// Decode a real Samsung A/C example from:
+// https://github.com/markszabo/IRremoteESP8266/issues/505#issuecomment-424036602
+TEST(TestDecodeSamsungAC, DecodePowerOffSample) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ uint16_t rawData[349] = {
+ 670, 17802, 3096, 8898, 602, 420, 580, 1418, 582, 418, 582, 416,
+ 582, 416, 584, 442, 550, 448, 568, 430, 570, 430, 576, 1396,
+ 600, 424, 546, 452, 578, 1394, 604, 1396, 600, 420, 580, 1398,
+ 602, 1416, 586, 1412, 582, 1420, 576, 1422, 592, 428, 574, 424,
+ 576, 422, 578, 420, 548, 452, 578, 420, 578, 420, 584, 416,
+ 580, 418, 580, 418, 582, 418, 580, 418, 582, 414, 584, 414,
+ 584, 416, 582, 418, 584, 442, 558, 442, 568, 430, 576, 424,
+ 578, 420, 576, 424, 576, 422, 580, 420, 584, 414, 584, 416,
+ 584, 414, 582, 418, 580, 418, 582, 416, 582, 416, 584, 414,
+ 584, 414, 586, 442, 554, 1420, 570, 1452, 578, 2884, 3120, 8898,
+ 596, 1400, 602, 422, 582, 418, 584, 414, 582, 416, 584, 414,
+ 584, 416, 582, 416, 584, 416, 584, 1410, 586, 414, 582, 444,
+ 556, 1420, 590, 432, 572, 1402, 602, 1396, 600, 1398, 606, 1414,
+ 582, 1394, 604, 1394, 604, 414, 584, 414, 586, 412, 586, 410,
+ 586, 442, 556, 440, 544, 456, 568, 430, 576, 424, 578, 420,
+ 578, 420, 576, 424, 584, 412, 586, 412, 586, 412, 584, 414,
+ 586, 412, 584, 414, 586, 412, 586, 412, 586, 414, 586, 412,
+ 584, 442, 558, 442, 558, 440, 566, 432, 574, 424, 578, 422,
+ 576, 422, 578, 420, 586, 414, 586, 414, 586, 412, 584, 414,
+ 586, 414, 586, 414, 586, 2902, 3096, 8900, 600, 1416, 586, 442,
+ 556, 442, 558, 440, 564, 434, 572, 428, 578, 420, 580, 420,
+ 578, 420, 584, 1392, 608, 414, 586, 414, 582, 414, 586, 412,
+ 586, 412, 586, 414, 584, 1394, 606, 1416, 580, 1418, 568, 1432,
+ 594, 1402, 602, 1398, 606, 1392, 606, 1390, 608, 1390, 608, 414,
+ 584, 414, 586, 414, 584, 1412, 586, 1398, 600, 1418, 590, 430,
+ 566, 432, 576, 422, 578, 420, 578, 422, 582, 416, 586, 414,
+ 586, 412, 584, 1390, 606, 1392, 608, 414, 586, 412, 584, 412,
+ 588, 1410, 586, 442, 558, 440, 568, 430, 566, 434, 574, 426,
+ 578, 420, 578, 420, 582, 416, 586, 412, 586, 1390, 608, 1390,
+ 608};
+
+ uint8_t expectedState[kSamsungAcExtendedStateLength] = {
+ 0x02, 0xB2, 0x0F, 0x00, 0x00, 0x00, 0xC0, 0x01, 0xD2, 0x0F, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x02, 0xFF, 0x71, 0x80, 0x11, 0xC0};
+
+ irsend.sendRaw(rawData, 349, 38000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(SAMSUNG_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kSamsungAcExtendedBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+
+ IRSamsungAc samsung(0);
+ samsung.setRaw(irsend.capture.state, kSamsungAcExtendedStateLength);
+ EXPECT_EQ(
+ "Power: Off, Mode: 1 (COOL), Temp: 24C, Fan: 0 (AUTO), Swing: Off, "
+ "Beep: Off, Clean: Off, Quiet: Off",
+ samsung.toString());
+}
+
+TEST(TestDecodeSamsungAC, DecodeHeatSample) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ uint16_t rawData[233] = {
+ 650, 16260, 3014, 8934, 534, 486, 508, 1478, 514, 484, 510, 486,
+ 508, 512, 484, 510, 562, 432, 572, 422, 540, 454, 514, 1452,
+ 534, 486, 510, 484, 510, 1456, 536, 484, 510, 484, 510, 1454,
+ 536, 1478, 512, 1476, 514, 1482, 508, 1482, 592, 428, 570, 424,
+ 538, 456, 508, 486, 510, 484, 512, 484, 510, 486, 510, 484,
+ 510, 484, 510, 486, 510, 484, 510, 484, 510, 484, 510, 484,
+ 510, 484, 510, 486, 508, 510, 484, 510, 568, 428, 570, 424,
+ 538, 458, 512, 482, 510, 486, 510, 484, 510, 484, 510, 484,
+ 510, 484, 510, 484, 510, 484, 510, 484, 510, 484, 510, 484,
+ 510, 1474, 516, 1502, 534, 1432, 594, 1398, 536, 2954, 3018, 8932,
+ 536, 1458, 532, 484, 510, 484, 512, 484, 510, 484, 510, 484,
+ 510, 484, 512, 484, 510, 484, 510, 1480, 508, 510, 530, 464,
+ 568, 426, 568, 426, 514, 480, 508, 486, 508, 1456, 534, 1478,
+ 514, 1452, 538, 1478, 512, 484, 510, 1456, 534, 486, 510, 1478,
+ 512, 1480, 570, 450, 570, 424, 540, 454, 512, 1452, 534, 1458,
+ 534, 1454, 536, 484, 512, 482, 512, 484, 512, 484, 512, 482,
+ 512, 1474, 514, 484, 512, 510, 486, 508, 534, 1430, 594, 426,
+ 512, 482, 512, 482, 510, 484, 512, 482, 512, 1452, 538, 482,
+ 512, 482, 512, 482, 510, 484, 510, 484, 510, 1478, 512, 1504,
+ 488, 1480, 560, 1454, 514};
+
+ uint8_t expectedState[kSamsungAcStateLength] = {0x02, 0x92, 0x0F, 0x00, 0x00,
+ 0x00, 0xF0, 0x01, 0x02, 0xAF,
+ 0x71, 0x10, 0x41, 0xF0};
+
+ irsend.sendRaw(rawData, 233, 38000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(SAMSUNG_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kSamsungAcBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+
+ IRSamsungAc samsung(0);
+ samsung.setRaw(irsend.capture.state);
+ EXPECT_EQ(
+ "Power: On, Mode: 4 (HEAT), Temp: 17C, Fan: 0 (AUTO), Swing: On, "
+ "Beep: Off, Clean: Off, Quiet: Off",
+ samsung.toString());
+}
+
+TEST(TestDecodeSamsungAC, DecodeCoolSample) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ uint16_t rawData[233] = {
+ 690, 17854, 3086, 8862, 610, 410, 584, 1382, 610, 410, 586, 408,
+ 586, 408, 586, 408, 588, 410, 584, 436, 558, 436, 570, 1396,
+ 598, 422, 576, 418, 580, 1384, 612, 410, 586, 410, 584, 1380,
+ 612, 1382, 608, 1384, 606, 1404, 586, 1404, 586, 436, 558, 438,
+ 566, 428, 568, 426, 570, 424, 576, 418, 578, 416, 584, 410,
+ 586, 408, 584, 410, 586, 408, 586, 408, 586, 410, 586, 408,
+ 586, 408, 588, 408, 586, 408, 588, 408, 586, 438, 558, 436,
+ 568, 426, 568, 428, 568, 426, 576, 418, 578, 416, 584, 412,
+ 584, 410, 586, 408, 586, 410, 586, 410, 584, 410, 586, 408,
+ 586, 1384, 606, 1402, 588, 1410, 580, 1410, 608, 2864, 3108, 8864,
+ 594, 1394, 604, 416, 584, 410, 586, 410, 586, 410, 586, 410,
+ 584, 410, 586, 410, 586, 408, 586, 1404, 588, 408, 586, 408,
+ 586, 436, 560, 1408, 592, 1400, 596, 1396, 600, 416, 584, 1382,
+ 608, 1380, 610, 1404, 586, 1384, 608, 1384, 606, 1402, 588, 1408,
+ 582, 1410, 564, 452, 568, 428, 572, 424, 576, 1414, 582, 1386,
+ 608, 1382, 608, 410, 584, 410, 584, 410, 586, 408, 586, 408,
+ 586, 408, 586, 408, 588, 1408, 582, 436, 540, 1426, 590, 428,
+ 574, 420, 578, 418, 580, 1384, 610, 410, 584, 410, 584, 410,
+ 584, 412, 584, 408, 586, 410, 586, 408, 586, 1404, 586, 1408,
+ 582, 1410, 562, 1426, 610};
+
+ uint8_t expectedState[kSamsungAcStateLength] = {0x02, 0x92, 0x0F, 0x00, 0x00,
+ 0x00, 0xF0, 0x01, 0xE2, 0xFE,
+ 0x71, 0x40, 0x11, 0xF0};
+
+ irsend.sendRaw(rawData, 233, 38000);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(SAMSUNG_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kSamsungAcBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+
+ IRSamsungAc samsung(0);
+ samsung.setRaw(irsend.capture.state);
+ EXPECT_EQ(
+ "Power: On, Mode: 1 (COOL), Temp: 20C, Fan: 0 (AUTO), Swing: Off, "
+ "Beep: Off, Clean: Off, Quiet: Off",
+ samsung.toString());
+}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_Sanyo_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Sanyo_test.cpp
similarity index 63%
rename from lib/IRremoteESP8266-2.2.1.02/test/ir_Sanyo_test.cpp
rename to lib/IRremoteESP8266-2.5.2.03/test/ir_Sanyo_test.cpp
index 9442f3db5bcb..14c1c7da08df 100644
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_Sanyo_test.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Sanyo_test.cpp
@@ -4,7 +4,6 @@
#include "IRsend_test.h"
#include "gtest/gtest.h"
-
// Tests for encodeSanyoLC7461().
TEST(TestEncodeSanyoLC7461, NormalEncoding) {
@@ -34,7 +33,8 @@ TEST(TestEncodeSanyoLC7461, SendDataOnly) {
"m560s560m560s1680m560s560m560s560m560s1680m560s1680m560s1680m560s1680"
"m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560m560s560"
"m560s560m560s560m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s1680m560s1680m560s108080", irsend.outputStr());
+ "m560s1680m560s1680m560s23520",
+ irsend.outputStr());
}
// Test sending with different repeats.
@@ -43,7 +43,7 @@ TEST(TestEncodeSanyoLC7461, SendWithRepeats) {
irsend.begin();
irsend.reset();
- irsend.sendSanyoLC7461(0x1D8113F00FF, SANYO_LC7461_BITS, 1); // 1 repeat.
+ irsend.sendSanyoLC7461(0x1D8113F00FF, kSanyoLC7461Bits, 1); // 1 repeat.
EXPECT_EQ(
"m8960s4480"
"m560s560m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s560"
@@ -51,8 +51,9 @@ TEST(TestEncodeSanyoLC7461, SendWithRepeats) {
"m560s560m560s1680m560s560m560s560m560s1680m560s1680m560s1680m560s1680"
"m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560m560s560"
"m560s560m560s560m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s1680m560s1680m560s108080"
- "m8960s2240m560s108080", irsend.outputStr());
+ "m560s1680m560s1680m560s23520"
+ "m8960s2240m560s96320",
+ irsend.outputStr());
}
// Tests for decodeSanyoLC7461().
@@ -67,10 +68,10 @@ TEST(TestDecodeSanyoLC7461, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendSanyoLC7461(0x1D8113F00FF);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSanyoLC7461(&irsend.capture, SANYO_LC7461_BITS,
- true));
+ ASSERT_TRUE(
+ irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, true));
EXPECT_EQ(SANYO_LC7461, irsend.capture.decode_type);
- EXPECT_EQ(SANYO_LC7461_BITS, irsend.capture.bits);
+ EXPECT_EQ(kSanyoLC7461Bits, irsend.capture.bits);
EXPECT_EQ(0x1D8113F00FF, irsend.capture.value);
EXPECT_EQ(0xEC0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
@@ -80,10 +81,10 @@ TEST(TestDecodeSanyoLC7461, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendSanyoLC7461(irsend.encodeSanyoLC7461(0x1234, 0x56));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSanyoLC7461(&irsend.capture, SANYO_LC7461_BITS,
- true));
+ ASSERT_TRUE(
+ irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, true));
EXPECT_EQ(SANYO_LC7461, irsend.capture.decode_type);
- EXPECT_EQ(SANYO_LC7461_BITS, irsend.capture.bits);
+ EXPECT_EQ(kSanyoLC7461Bits, irsend.capture.bits);
EXPECT_EQ(0x2468DCB56A9, irsend.capture.value);
EXPECT_EQ(0x1234, irsend.capture.address);
EXPECT_EQ(0x56, irsend.capture.command);
@@ -93,10 +94,10 @@ TEST(TestDecodeSanyoLC7461, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendSanyoLC7461(irsend.encodeSanyoLC7461(0x1, 0x1));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSanyoLC7461(&irsend.capture, SANYO_LC7461_BITS,
- true));
+ ASSERT_TRUE(
+ irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, true));
EXPECT_EQ(SANYO_LC7461, irsend.capture.decode_type);
- EXPECT_EQ(SANYO_LC7461_BITS, irsend.capture.bits);
+ EXPECT_EQ(kSanyoLC7461Bits, irsend.capture.bits);
EXPECT_EQ(0x3FFE01FE, irsend.capture.value);
EXPECT_EQ(0x1, irsend.capture.address);
EXPECT_EQ(0x1, irsend.capture.command);
@@ -111,12 +112,12 @@ TEST(TestDecodeSanyoLC7461, NormalDecodeWithRepeatAndStrict) {
// Normal Sanyo LC7461 16-bit message with 1 repeat.
irsend.reset();
- irsend.sendSanyoLC7461(0x3FFE01FE, SANYO_LC7461_BITS, 1);
+ irsend.sendSanyoLC7461(0x3FFE01FE, kSanyoLC7461Bits, 1);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSanyoLC7461(&irsend.capture, SANYO_LC7461_BITS,
- true));
+ ASSERT_TRUE(
+ irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, true));
EXPECT_EQ(SANYO_LC7461, irsend.capture.decode_type);
- EXPECT_EQ(SANYO_LC7461_BITS, irsend.capture.bits);
+ EXPECT_EQ(kSanyoLC7461Bits, irsend.capture.bits);
EXPECT_EQ(0x3FFE01FE, irsend.capture.value);
EXPECT_EQ(0x1, irsend.capture.address);
EXPECT_EQ(0x1, irsend.capture.command);
@@ -133,13 +134,13 @@ TEST(TestDecodeSanyoLC7461, DecodeWithNonStrictValues) {
irsend.sendSanyoLC7461(0x0); // Illegal value Sanyo LC7461 message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeSanyoLC7461(&irsend.capture, SANYO_LC7461_BITS,
- true));
+ ASSERT_FALSE(
+ irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeSanyoLC7461(&irsend.capture, SANYO_LC7461_BITS,
- false));
+ ASSERT_TRUE(
+ irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, false));
EXPECT_EQ(SANYO_LC7461, irsend.capture.decode_type);
- EXPECT_EQ(SANYO_LC7461_BITS, irsend.capture.bits);
+ EXPECT_EQ(kSanyoLC7461Bits, irsend.capture.bits);
EXPECT_EQ(0x0, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
@@ -148,22 +149,20 @@ TEST(TestDecodeSanyoLC7461, DecodeWithNonStrictValues) {
// Illegal value Sanyo LC7461 42-bit message.
irsend.sendSanyoLC7461(0x1234567890A);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeSanyoLC7461(&irsend.capture, SANYO_LC7461_BITS,
- true));
+ ASSERT_FALSE(
+ irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, true));
// Should fail with strict when we ask for the wrong bit size.
- ASSERT_FALSE(irrecv.decodeSanyoLC7461(&irsend.capture, 32,
- true));
- ASSERT_FALSE(irrecv.decodeSanyoLC7461(&irsend.capture, 64,
- true));
+ ASSERT_FALSE(irrecv.decodeSanyoLC7461(&irsend.capture, 32, true));
+ ASSERT_FALSE(irrecv.decodeSanyoLC7461(&irsend.capture, 64, true));
// And should fail for a bad value.
- ASSERT_FALSE(irrecv.decodeSanyoLC7461(&irsend.capture, SANYO_LC7461_BITS,
- true));
+ ASSERT_FALSE(
+ irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeSanyoLC7461(&irsend.capture, SANYO_LC7461_BITS,
- false));
+ ASSERT_TRUE(
+ irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, false));
EXPECT_EQ(SANYO_LC7461, irsend.capture.decode_type);
- EXPECT_EQ(SANYO_LC7461_BITS, irsend.capture.bits);
+ EXPECT_EQ(kSanyoLC7461Bits, irsend.capture.bits);
EXPECT_EQ(0x1234567890A, irsend.capture.value);
EXPECT_EQ(0x91A, irsend.capture.address);
EXPECT_EQ(0x89, irsend.capture.command);
@@ -193,33 +192,33 @@ TEST(TestDecodeSanyoLC7461, Decode64BitMessages) {
// Decode a 'real' example via GlobalCache
TEST(TestDecodeSanyoLC7461, DecodeGlobalCacheExample) {
-IRsendTest irsend(4);
-IRrecv irrecv(4);
-irsend.begin();
-
-irsend.reset();
-uint16_t gc_test[95] = {38000, 1, 89, 342, 171, 21, 21, 21, 64, 21, 64,
- 21, 64, 21, 21, 21, 64, 21, 64, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 64, 21, 21,
- 21, 21, 21, 21, 21, 64, 21, 21, 21, 21, 21, 64,
- 21, 64, 21, 64, 21, 64, 21, 64, 21, 64, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 64, 21, 64, 21, 64, 21, 64, 21, 64,
- 21, 64, 21, 64, 21, 64, 21, 875, 342, 171, 21, 3565};
-irsend.sendGC(gc_test, 95);
-irsend.makeDecodeResult();
-
-ASSERT_TRUE(irrecv.decodeSanyoLC7461(&irsend.capture, SANYO_LC7461_BITS, true));
-EXPECT_EQ(SANYO_LC7461, irsend.capture.decode_type);
-EXPECT_EQ(SANYO_LC7461_BITS, irsend.capture.bits);
-EXPECT_EQ(0x1D8113F00FF, irsend.capture.value);
-EXPECT_EQ(0xEC0, irsend.capture.address);
-EXPECT_EQ(0x0, irsend.capture.command);
-EXPECT_FALSE(irsend.capture.repeat);
-
-// Confirm what the 42-bit NEC decode is.
-ASSERT_TRUE(irrecv.decodeNEC(&irsend.capture, 42, false));
-EXPECT_EQ(0x1D8113F00FF, irsend.capture.value);
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ uint16_t gc_test[95] = {
+ 38000, 1, 89, 342, 171, 21, 21, 21, 64, 21, 64, 21, 64, 21, 21, 21,
+ 64, 21, 64, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 64, 21, 21, 21, 21, 21, 21, 21, 64, 21, 21, 21, 21, 21, 64, 21,
+ 64, 21, 64, 21, 64, 21, 64, 21, 64, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 64, 21, 64, 21, 64, 21,
+ 64, 21, 64, 21, 64, 21, 64, 21, 64, 21, 875, 342, 171, 21, 3565};
+ irsend.sendGC(gc_test, 95);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(
+ irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, true));
+ EXPECT_EQ(SANYO_LC7461, irsend.capture.decode_type);
+ EXPECT_EQ(kSanyoLC7461Bits, irsend.capture.bits);
+ EXPECT_EQ(0x1D8113F00FF, irsend.capture.value);
+ EXPECT_EQ(0xEC0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+ EXPECT_FALSE(irsend.capture.repeat);
+
+ // Confirm what the 42-bit NEC decode is.
+ ASSERT_TRUE(irrecv.decodeNEC(&irsend.capture, 42, false));
+ EXPECT_EQ(0x1D8113F00FF, irsend.capture.value);
}
// Fail to decode a non-Sanyo LC7461 example via GlobalCache
@@ -230,13 +229,14 @@ TEST(TestDecodeSanyoLC7461, FailToDecodeNonSanyoLC7461Example) {
irsend.reset();
// Modified a few entries to unexpected values, based on previous test case.
- uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20, 20, 20, 20,
- 20, 20, 20, 127, 20, 61, 9, 20, 20, 61, 20, 20, 20,
- 61, 20, 61, 20, 61, 20, 20, 20, 20, 20, 20, 20, 884};
+ uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
+ 20, 20, 20, 20, 20, 20, 127, 20, 61, 9,
+ 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
+ 61, 20, 20, 20, 20, 20, 20, 20, 884};
irsend.sendGC(gc_test, 39);
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeSanyoLC7461(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeSanyoLC7461(&irsend.capture, SANYO_LC7461_BITS,
- false));
+ ASSERT_FALSE(
+ irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, false));
}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_Sharp_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Sharp_test.cpp
similarity index 79%
rename from lib/IRremoteESP8266-2.2.1.02/test/ir_Sharp_test.cpp
rename to lib/IRremoteESP8266-2.5.2.03/test/ir_Sharp_test.cpp
index 0329b4e27dcd..8481a464997d 100644
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_Sharp_test.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Sharp_test.cpp
@@ -37,7 +37,6 @@ TEST(TestEncodeSharp, AdvancedEncoding) {
EXPECT_EQ(0x454A, irsend.encodeSharp(0x11, 0x52, 1, 0, true));
}
-
// Tests for sendSharp().
// Test sending typical data only.
@@ -53,7 +52,8 @@ TEST(TestSendSharp, SendDataOnly) {
"m260s43602"
"m260s1820m260s780m260s780m260s780m260s1820m260s1820m260s780m260s1820"
"m260s780m260s1820m260s1820m260s780m260s1820m260s780m260s1820"
- "m260s43602", irsend.outputStr());
+ "m260s43602",
+ irsend.outputStr());
}
// Test sending with different repeats.
@@ -62,7 +62,7 @@ TEST(TestSendSharp, SendWithRepeats) {
irsend.begin();
irsend.reset();
- irsend.sendSharp(0x11, 0x52, SHARP_BITS, 1); // 1 repeat.
+ irsend.sendSharp(0x11, 0x52, kSharpBits, 1); // 1 repeat.
EXPECT_EQ(
"m260s1820m260s780m260s780m260s780m260s1820m260s780m260s1820m260s780"
"m260s1820m260s780m260s780m260s1820m260s780m260s1820m260s780"
@@ -75,7 +75,8 @@ TEST(TestSendSharp, SendWithRepeats) {
"m260s43602"
"m260s1820m260s780m260s780m260s780m260s1820m260s1820m260s780m260s1820"
"m260s780m260s1820m260s1820m260s780m260s1820m260s780m260s1820"
- "m260s43602", irsend.outputStr());
+ "m260s43602",
+ irsend.outputStr());
}
// Test sending an atypical data size.
@@ -89,7 +90,8 @@ TEST(TestSendSharp, SendUnusualSize) {
"m260s780m260s780m260s780m260s780m260s780m260s780m260s1820m260s780"
"m260s43602"
"m260s1820m260s1820m260s1820m260s1820m260s1820m260s1820m260s780m260s1820"
- "m260s43602", irsend.outputStr());
+ "m260s43602",
+ irsend.outputStr());
irsend.reset();
irsend.sendSharp(0x0, 0x0, 16);
@@ -99,7 +101,8 @@ TEST(TestSendSharp, SendUnusualSize) {
"m260s43602"
"m260s780m260s780m260s780m260s780m260s780m260s780m260s1820m260s1820"
"m260s1820m260s1820m260s1820m260s1820m260s1820m260s1820m260s780m260s1820"
- "m260s43602", irsend.outputStr());
+ "m260s43602",
+ irsend.outputStr());
}
// Tests for sendSharpRaw().
@@ -117,7 +120,8 @@ TEST(TestSendSharpRaw, SendDataOnly) {
"m260s43602"
"m260s1820m260s780m260s780m260s780m260s1820m260s1820m260s780m260s1820"
"m260s780m260s1820m260s1820m260s780m260s1820m260s780m260s1820"
- "m260s43602", irsend.outputStr());
+ "m260s43602",
+ irsend.outputStr());
}
// Test sending with different repeats.
@@ -126,7 +130,7 @@ TEST(TestSendSharpRaw, SendWithRepeats) {
irsend.begin();
irsend.reset();
- irsend.sendSharpRaw(0x454A, SHARP_BITS, 1); // 1 repeat.
+ irsend.sendSharpRaw(0x454A, kSharpBits, 1); // 1 repeat.
EXPECT_EQ(
"m260s1820m260s780m260s780m260s780m260s1820m260s780m260s1820m260s780"
"m260s1820m260s780m260s780m260s1820m260s780m260s1820m260s780"
@@ -139,7 +143,8 @@ TEST(TestSendSharpRaw, SendWithRepeats) {
"m260s43602"
"m260s1820m260s780m260s780m260s780m260s1820m260s1820m260s780m260s1820"
"m260s780m260s1820m260s1820m260s780m260s1820m260s780m260s1820"
- "m260s43602", irsend.outputStr());
+ "m260s43602",
+ irsend.outputStr());
}
// Test sending an atypical data size.
@@ -153,7 +158,8 @@ TEST(TestSendSharpRaw, SendUnusualSize) {
"m260s780m260s780m260s780m260s780m260s780m260s780m260s1820m260s780"
"m260s43602"
"m260s1820m260s1820m260s1820m260s1820m260s1820m260s1820m260s780m260s1820"
- "m260s43602", irsend.outputStr());
+ "m260s43602",
+ irsend.outputStr());
irsend.reset();
irsend.sendSharpRaw(0x2, 16);
@@ -163,7 +169,8 @@ TEST(TestSendSharpRaw, SendUnusualSize) {
"m260s43602"
"m260s780m260s780m260s780m260s780m260s780m260s780m260s1820m260s1820"
"m260s1820m260s1820m260s1820m260s1820m260s1820m260s1820m260s780m260s1820"
- "m260s43602", irsend.outputStr());
+ "m260s43602",
+ irsend.outputStr());
}
// Tests for decodeSharp().
@@ -178,9 +185,9 @@ TEST(TestDecodeSharp, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendSharpRaw(0x454A);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, SHARP_BITS, true));
+ ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
EXPECT_EQ(SHARP, irsend.capture.decode_type);
- EXPECT_EQ(SHARP_BITS, irsend.capture.bits);
+ EXPECT_EQ(kSharpBits, irsend.capture.bits);
EXPECT_EQ(0x454A, irsend.capture.value);
EXPECT_EQ(0x11, irsend.capture.address);
EXPECT_EQ(0x4A, irsend.capture.command);
@@ -190,9 +197,9 @@ TEST(TestDecodeSharp, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendSharpRaw(irsend.encodeSharp(0x07, 0x99));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, SHARP_BITS, true));
+ ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
EXPECT_EQ(SHARP, irsend.capture.decode_type);
- EXPECT_EQ(SHARP_BITS, irsend.capture.bits);
+ EXPECT_EQ(kSharpBits, irsend.capture.bits);
EXPECT_EQ(0x7266, irsend.capture.value);
EXPECT_EQ(0x07, irsend.capture.address);
EXPECT_EQ(0x99, irsend.capture.command);
@@ -202,9 +209,9 @@ TEST(TestDecodeSharp, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendSharpRaw(irsend.encodeSharp(0x1, 0x1));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, SHARP_BITS, true));
+ ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
EXPECT_EQ(SHARP, irsend.capture.decode_type);
- EXPECT_EQ(SHARP_BITS, irsend.capture.bits);
+ EXPECT_EQ(kSharpBits, irsend.capture.bits);
EXPECT_EQ(0x4202, irsend.capture.value);
EXPECT_EQ(0x1, irsend.capture.address);
EXPECT_EQ(0x1, irsend.capture.command);
@@ -219,19 +226,19 @@ TEST(TestDecodeSharp, NormalDecodeWithRepeatAndStrict) {
// Normal Sharp 15-bit message with 1 repeat.
irsend.reset();
- irsend.sendSharpRaw(0x7266, SHARP_BITS, 1);
+ irsend.sendSharpRaw(0x7266, kSharpBits, 1);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, SHARP_BITS, true));
+ ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
EXPECT_EQ(SHARP, irsend.capture.decode_type);
- EXPECT_EQ(SHARP_BITS, irsend.capture.bits);
+ EXPECT_EQ(kSharpBits, irsend.capture.bits);
EXPECT_EQ(0x7266, irsend.capture.value);
EXPECT_EQ(0x07, irsend.capture.address);
EXPECT_EQ(0x99, irsend.capture.command);
- irsend.makeDecodeResult(2 * (2 * SHARP_BITS + FOOTER));
- ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, SHARP_BITS, true));
+ irsend.makeDecodeResult(2 * (2 * kSharpBits + kFooter));
+ ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
EXPECT_EQ(SHARP, irsend.capture.decode_type);
- EXPECT_EQ(SHARP_BITS, irsend.capture.bits);
+ EXPECT_EQ(kSharpBits, irsend.capture.bits);
EXPECT_EQ(0x7266, irsend.capture.value);
}
@@ -245,7 +252,7 @@ TEST(TestDecodeSharp, DecodeWithNonStrict) {
irsend.sendSharpRaw(0x0, 8); // Illegal length Sharp 8-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, SHARP_BITS, true));
+ ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
// Should pass if strict off.
ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, 8, false));
EXPECT_EQ(SHARP, irsend.capture.decode_type);
@@ -258,7 +265,7 @@ TEST(TestDecodeSharp, DecodeWithNonStrict) {
irsend.sendSharpRaw(0x12345678, 32); // Illegal length Sharp 32-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, SHARP_BITS, true));
+ ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
// Should fail with strict when we ask for the wrong bit size.
ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, 32, true));
@@ -298,21 +305,17 @@ TEST(TestDecodeSharp, DecodeGlobalCacheExample) {
irsend.reset();
// Sharp Power On from Global Cache.
- uint16_t gc_test[67] = {38000, 1, 1,
- 10, 70, 10, 30, 10, 30, 10, 30, 10, 70, 10, 30,
- 10, 70, 10, 30, 10, 70, 10, 30, 10, 30, 10, 70,
- 10, 30, 10, 70, 10, 30,
- 10, 1657,
- 10, 70, 10, 30, 10, 30, 10, 30, 10, 70, 10, 70,
- 10, 30, 10, 70, 10, 30, 10, 70, 10, 70, 10, 30,
- 10, 70, 10, 30, 10, 70,
- 10, 1657};
+ uint16_t gc_test[67] = {
+ 38000, 1, 1, 10, 70, 10, 30, 10, 30, 10, 30, 10, 70, 10, 30, 10, 70,
+ 10, 30, 10, 70, 10, 30, 10, 30, 10, 70, 10, 30, 10, 70, 10, 30, 10,
+ 1657, 10, 70, 10, 30, 10, 30, 10, 30, 10, 70, 10, 70, 10, 30, 10, 70,
+ 10, 30, 10, 70, 10, 70, 10, 30, 10, 70, 10, 30, 10, 70, 10, 1657};
irsend.sendGC(gc_test, 67);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture));
EXPECT_EQ(SHARP, irsend.capture.decode_type);
- EXPECT_EQ(SHARP_BITS, irsend.capture.bits);
+ EXPECT_EQ(kSharpBits, irsend.capture.bits);
EXPECT_EQ(0x454A, irsend.capture.value);
EXPECT_EQ(0x11, irsend.capture.address);
EXPECT_EQ(0x4A, irsend.capture.command);
@@ -327,31 +330,25 @@ TEST(TestDecodeSharp, FailToDecodeNonSharpExample) {
irsend.reset();
// Modified a few entries to unexpected values, based on previous test case.
- uint16_t gc_test[67] = {38000, 1, 1,
- 10, 70, 30, 30, 10, 30, 10, 30, 10, 70, 10, 30,
- 10, 70, 10, 30, 10, 70, 10, 30, 10, 30, 10, 70,
- 10, 30, 10, 70, 10, 30,
- 10, 1657,
- 10, 70, 10, 30, 10, 30, 10, 30, 10, 70, 10, 70,
- 10, 30, 10, 60, 10, 30, 10, 70, 10, 70, 10, 30,
- 10, 10, 70, 30, 10, 70,
- 10, 1657};
+ uint16_t gc_test[67] = {
+ 38000, 1, 1, 10, 70, 30, 30, 10, 30, 10, 30, 10, 70, 10, 30, 10, 70,
+ 10, 30, 10, 70, 10, 30, 10, 30, 10, 70, 10, 30, 10, 70, 10, 30, 10,
+ 1657, 10, 70, 10, 30, 10, 30, 10, 30, 10, 70, 10, 70, 10, 30, 10, 60,
+ 10, 30, 10, 70, 10, 70, 10, 30, 10, 10, 70, 30, 10, 70, 10, 1657};
irsend.sendGC(gc_test, 67);
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, SHARP_BITS, false));
+ ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, kSharpBits, false));
// Test only half of a good message, as it is sent (sort of) twice.
- uint16_t gc_half[35] = {38000, 1, 1,
- 10, 70, 10, 30, 10, 30, 10, 30, 10, 70, 10, 30,
- 10, 70, 10, 30, 10, 70, 10, 30, 10, 30, 10, 70,
- 10, 30, 10, 70, 10, 30,
- 10, 1657};
+ uint16_t gc_half[35] = {38000, 1, 1, 10, 70, 10, 30, 10, 30, 10, 30, 10,
+ 70, 10, 30, 10, 70, 10, 30, 10, 70, 10, 30, 10,
+ 30, 10, 70, 10, 30, 10, 70, 10, 30, 10, 1657};
irsend.sendGC(gc_half, 35);
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, SHARP_BITS, false));
+ ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, kSharpBits, false));
}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Sherwood_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Sherwood_test.cpp
new file mode 100644
index 000000000000..22d9ead3826d
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Sherwood_test.cpp
@@ -0,0 +1,78 @@
+// Copyright 2017 David Conran
+
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests for sendSherwood().
+
+// Test sending typical data only.
+TEST(TestSendSherwood, SendDataOnly) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendSherwood(0xC1A28877);
+ EXPECT_EQ(
+ "m8960s4480m560s1680m560s1680m560s560m560s560m560s560m560s560"
+ "m560s560m560s1680m560s1680m560s560m560s1680m560s560m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s560m560s560"
+ "m560s1680m560s560m560s560m560s560m560s560m560s1680m560s1680"
+ "m560s1680m560s560m560s1680m560s1680m560s1680m560s42560"
+ "m8960s2240m560s96320",
+ irsend.outputStr());
+}
+
+// Test sending typical data with extra repeats.
+TEST(TestSendSherwood, SendDataWithRepeats) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendSherwood(0xC1A28877, 32, 2);
+ EXPECT_EQ(
+ "m8960s4480m560s1680m560s1680m560s560m560s560m560s560m560s560"
+ "m560s560m560s1680m560s1680m560s560m560s1680m560s560m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s560m560s560"
+ "m560s1680m560s560m560s560m560s560m560s560m560s1680m560s1680"
+ "m560s1680m560s560m560s1680m560s1680m560s1680m560s42560"
+ "m8960s2240m560s96320"
+ "m8960s2240m560s96320",
+ irsend.outputStr());
+}
+
+// Test sending typical data with explicit no repeats.
+TEST(TestSendSherwood, SendDataWithZeroRepeats) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendSherwood(0xC1A28877, 32, 0);
+ // Should have a single NEC repeat, as we always send one.
+ EXPECT_EQ(
+ "m8960s4480m560s1680m560s1680m560s560m560s560m560s560m560s560"
+ "m560s560m560s1680m560s1680m560s560m560s1680m560s560m560s560"
+ "m560s560m560s1680m560s560m560s1680m560s560m560s560m560s560"
+ "m560s1680m560s560m560s560m560s560m560s560m560s1680m560s1680"
+ "m560s1680m560s560m560s1680m560s1680m560s1680m560s42560"
+ "m8960s2240m560s96320",
+ irsend.outputStr());
+}
+
+// Test that a typical Sherwood send decodes as the appropriate NEC value.
+TEST(TestSendSherwood, DecodesAsNEC) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendSherwood(0xC1A28877);
+ irsend.makeDecodeResult();
+
+ EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0xC1A28877, irsend.capture.value);
+ EXPECT_EQ(0x4583, irsend.capture.address);
+ EXPECT_EQ(0x11, irsend.capture.command);
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Sony_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Sony_test.cpp
new file mode 100644
index 000000000000..c79ff6175e26
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Sony_test.cpp
@@ -0,0 +1,357 @@
+// Copyright 2017 David Conran
+
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests for sendSony().
+
+// Test sending typical data only.
+TEST(TestSendSony, SendDataOnly) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendSony(0);
+ // We expect three 20-bit commands to be sent.
+ EXPECT_EQ(
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s18600"
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s18600"
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s18600",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendSony(0x240C, kSony20Bits);
+ // We expect three 20-bit commands to be sent.
+ EXPECT_EQ(
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
+ "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m1200s600m1200s600m600s600m600s16200"
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
+ "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m1200s600m1200s600m600s600m600s16200"
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
+ "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m1200s600m1200s600m600s600m600s16200",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendSony(0x240C, kSony15Bits);
+ // We expect three 15-bit commands to be sent.
+ EXPECT_EQ(
+ "m2400s600m600s600m1200s600m600s600m600s600m1200s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s600m1200s600m1200s600m600s600"
+ "m600s22200"
+ "m2400s600m600s600m1200s600m600s600m600s600m1200s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s600m1200s600m1200s600m600s600"
+ "m600s22200"
+ "m2400s600m600s600m1200s600m600s600m600s600m1200s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s600m1200s600m1200s600m600s600"
+ "m600s22200",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendSony(0xA90, kSony12Bits);
+ // We expect three 15-bit commands to be sent.
+ EXPECT_EQ(
+ "m2400s600m1200s600m600s600m1200s600m600s600m1200s600m600s600"
+ "m600s600m1200s600m600s600m600s600m600s600m600s25800"
+ "m2400s600m1200s600m600s600m1200s600m600s600m1200s600m600s600"
+ "m600s600m1200s600m600s600m600s600m600s600m600s25800"
+ "m2400s600m1200s600m600s600m1200s600m600s600m1200s600m600s600"
+ "m600s600m1200s600m600s600m600s600m600s600m600s25800",
+ irsend.outputStr());
+}
+
+// Test sending with different repeats.
+TEST(TestSendSony, SendWithDiffRepeats) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendSony(0x240C, kSony20Bits, 0); // Send a command with 0 repeats.
+ EXPECT_EQ(
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
+ "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m1200s600m1200s600m600s600m600s16200",
+ irsend.outputStr());
+ irsend.sendSony(0x240C, kSony20Bits, 1); // Send a command with 1 repeat.
+ EXPECT_EQ(
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
+ "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m1200s600m1200s600m600s600m600s16200"
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
+ "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m1200s600m1200s600m600s600m600s16200",
+ irsend.outputStr());
+ irsend.sendSony(0x240C, kSony20Bits, 3); // Send a command with 3 repeats.
+ EXPECT_EQ(
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
+ "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m1200s600m1200s600m600s600m600s16200"
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
+ "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m1200s600m1200s600m600s600m600s16200"
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
+ "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m1200s600m1200s600m600s600m600s16200"
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
+ "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m1200s600m1200s600m600s600m600s16200",
+ irsend.outputStr());
+}
+
+// Tests for encodeSony().
+
+TEST(TestEncodeSony, NormalSonyEncoding) {
+ IRsendTest irsend(4);
+ EXPECT_EQ(0x0, irsend.encodeSony(kSony12Bits, 0, 0));
+ EXPECT_EQ(0xA90, irsend.encodeSony(kSony12Bits, 21, 1));
+ EXPECT_EQ(0xFFF, irsend.encodeSony(kSony12Bits, 0x7F, 0x1F));
+
+ EXPECT_EQ(0x0, irsend.encodeSony(kSony15Bits, 0, 0));
+ EXPECT_EQ(0x5480, irsend.encodeSony(kSony15Bits, 21, 1));
+ EXPECT_EQ(0x5455, irsend.encodeSony(kSony15Bits, 21, 0xAA));
+ EXPECT_EQ(0x7FFF, irsend.encodeSony(kSony15Bits, 0x7F, 0xFF));
+
+ EXPECT_EQ(0x0, irsend.encodeSony(kSony20Bits, 0, 0, 0));
+ EXPECT_EQ(0x81080, irsend.encodeSony(kSony20Bits, 1, 1, 1));
+ EXPECT_EQ(0xFFFFF, irsend.encodeSony(kSony20Bits, 0x7F, 0x1F, 0xFF));
+}
+
+TEST(TestEncodeSony, SonyEncodingWithOversizedValues) {
+ IRsendTest irsend(4);
+ EXPECT_EQ(0xFFF, irsend.encodeSony(kSony12Bits, 0xFFFF, 0xFFFF));
+
+ EXPECT_EQ(0x7FFF, irsend.encodeSony(kSony15Bits, 0xFFFF, 0xFFFF));
+
+ EXPECT_EQ(0xFFFFF, irsend.encodeSony(kSony20Bits, 0xFFFF, 0xFFFF, 0xFFFF));
+}
+
+// Tests for decodeSony().
+
+// Decode normal Sony messages.
+TEST(TestDecodeSony, NormalSonyDecodeWithStrict) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ // Synthesised Normal Sony 20-bit message.
+ irsend.reset();
+ irsend.sendSony(irsend.encodeSony(kSony20Bits, 0x1, 0x1, 0x1));
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeSony(&irsend.capture, kSony20Bits, true));
+ EXPECT_EQ(SONY, irsend.capture.decode_type);
+ EXPECT_EQ(kSony20Bits, irsend.capture.bits);
+ EXPECT_EQ(0x81080, irsend.capture.value);
+ EXPECT_EQ(0x1, irsend.capture.address);
+ EXPECT_EQ(0x81, irsend.capture.command);
+
+ // Synthesised Normal Sony 15-bit message.
+ irsend.reset();
+ irsend.sendSony(irsend.encodeSony(kSony15Bits, 21, 1), kSony15Bits);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeSony(&irsend.capture, kSony15Bits, true));
+ EXPECT_EQ(SONY, irsend.capture.decode_type);
+ EXPECT_EQ(kSony15Bits, irsend.capture.bits);
+ EXPECT_EQ(0x5480, irsend.capture.value);
+ EXPECT_EQ(1, irsend.capture.address);
+ EXPECT_EQ(21, irsend.capture.command);
+
+ // Synthesised Normal Sony 12-bit message.
+ irsend.reset();
+ irsend.sendSony(irsend.encodeSony(kSony12Bits, 21, 1), kSony12Bits);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeSony(&irsend.capture, kSony12Bits, true));
+ EXPECT_EQ(SONY, irsend.capture.decode_type);
+ EXPECT_EQ(kSony12Bits, irsend.capture.bits);
+ EXPECT_EQ(0xA90, irsend.capture.value);
+ EXPECT_EQ(1, irsend.capture.address);
+ EXPECT_EQ(21, irsend.capture.command);
+}
+
+// Decode unexpected Sony messages. i.e longer than minimum etc.
+TEST(TestDecodeSony, SonyDecodeWithUnexpectedLegalSize) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ // Synthesised Normal Sony 20-bit message decoded when looking for 12-bits
+ irsend.reset();
+ irsend.sendSony(irsend.encodeSony(kSony20Bits, 0x1, 0x1, 0x1));
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeSony(&irsend.capture, kSonyMinBits));
+ EXPECT_EQ(SONY, irsend.capture.decode_type);
+ EXPECT_EQ(kSony20Bits, irsend.capture.bits);
+ EXPECT_EQ(0x81080, irsend.capture.value);
+ EXPECT_EQ(0x1, irsend.capture.address);
+ EXPECT_EQ(0x81, irsend.capture.command);
+
+ // Synthesised Normal Sony 12-bit message when expecting 20-bits.
+ irsend.reset();
+ irsend.sendSony(irsend.encodeSony(kSony12Bits, 21, 1), kSony12Bits);
+ irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decodeSony(&irsend.capture, kSony20Bits));
+ EXPECT_EQ(SONY, irsend.capture.decode_type);
+ EXPECT_EQ(kSony12Bits, irsend.capture.bits);
+ EXPECT_EQ(0xA90, irsend.capture.value);
+ EXPECT_EQ(1, irsend.capture.address);
+ EXPECT_EQ(21, irsend.capture.command);
+
+ // 12-bit message should be regected when using strict and a different size.
+ irsend.reset();
+ irsend.sendSony(irsend.encodeSony(kSony12Bits, 21, 1), kSony12Bits);
+ irsend.makeDecodeResult();
+ ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, kSony20Bits, true));
+ ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, kSony15Bits, true));
+
+ // 15-bit message should be regected when using strict and a different size.
+ irsend.reset();
+ irsend.sendSony(irsend.encodeSony(kSony15Bits, 21, 1), kSony15Bits);
+ irsend.makeDecodeResult();
+ ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, kSony12Bits, true));
+ ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, kSony20Bits, true));
+
+ // 20-bit message should be regected when using strict and a different size.
+ irsend.reset();
+ irsend.sendSony(irsend.encodeSony(kSony20Bits, 1, 1, 1), kSony20Bits);
+ irsend.makeDecodeResult();
+ ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, kSony12Bits, true));
+ ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, kSony15Bits, true));
+}
+
+// Decode unsupported Sony messages. i.e non-standard sizes.
+TEST(TestDecodeSony, SonyDecodeWithIllegalSize) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendSony(0xFF, 8); // Illegal 8-bit Sony-like message.
+ irsend.makeDecodeResult();
+ // Should fail with strict on.
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSonyMinBits, true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony12Bits, true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony15Bits, true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony20Bits, true));
+ // Should work with a 'normal' match (not strict)
+ ASSERT_TRUE(irrecv.decodeSony(&irsend.capture));
+ EXPECT_EQ(SONY, irsend.capture.decode_type);
+ EXPECT_EQ(8, irsend.capture.bits);
+ EXPECT_EQ(0xFF, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+
+ irsend.reset();
+ irsend.sendSony(0x1FFF, 13); // Illegal 13-bit Sony-like message.
+ irsend.makeDecodeResult();
+ // Should fail with strict on.
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSonyMinBits, true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony12Bits, true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony15Bits, true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony20Bits, true));
+ // Should work with a 'normal' match (not strict)
+ ASSERT_TRUE(irrecv.decodeSony(&irsend.capture));
+ EXPECT_EQ(SONY, irsend.capture.decode_type);
+ EXPECT_EQ(13, irsend.capture.bits);
+ EXPECT_EQ(0x1FFF, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+
+ irsend.reset();
+ irsend.sendSony(0x1FFFF, 17); // Illegal 17-bit Sony-like message.
+ irsend.makeDecodeResult();
+ // Should fail with strict on.
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSonyMinBits, true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony12Bits, true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony15Bits, true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony20Bits, true));
+ // Should work with a 'normal' match (not strict)
+ ASSERT_TRUE(irrecv.decodeSony(&irsend.capture));
+ EXPECT_EQ(SONY, irsend.capture.decode_type);
+ EXPECT_EQ(17, irsend.capture.bits);
+ EXPECT_EQ(0x1FFFF, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+
+ irsend.reset();
+ irsend.sendSony(0x1FFFFF, 21); // Illegal 21-bit Sony-like message.
+ irsend.makeDecodeResult();
+ // Should fail with strict on.
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSonyMinBits, true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony12Bits, true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony15Bits, true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony20Bits, true));
+ // Should work with a 'normal' match (not strict)
+ ASSERT_TRUE(irrecv.decodeSony(&irsend.capture));
+ EXPECT_EQ(SONY, irsend.capture.decode_type);
+ EXPECT_EQ(21, irsend.capture.bits);
+ EXPECT_EQ(0x1FFFFF, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+
+ irsend.reset();
+ // Illegal 64-bit (max) Sony-like message.
+ irsend.sendSony(0xFFFFFFFFFFFFFFFF, 64, 0);
+ irsend.makeDecodeResult();
+ // Should work with a 'normal' match (not strict)
+ ASSERT_TRUE(irrecv.decodeSony(&irsend.capture));
+ EXPECT_EQ(SONY, irsend.capture.decode_type);
+ EXPECT_EQ(64, irsend.capture.bits);
+ EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
+ EXPECT_EQ(0x0, irsend.capture.address);
+ EXPECT_EQ(0x0, irsend.capture.command);
+}
+
+// Decode unsupported Sony messages. i.e non-standard sizes.
+TEST(TestDecodeSony, DecodeGlobalCacheExample) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ irsend.reset();
+ // Sony "Power On" from Global Cache.
+ uint16_t gc_test[29] = {40000, 1, 1, 96, 24, 24, 24, 48, 24, 48,
+ 24, 48, 24, 24, 24, 48, 24, 24, 24, 48,
+ 24, 24, 24, 24, 24, 24, 24, 24, 1013};
+ irsend.sendGC(gc_test, 29);
+ irsend.makeDecodeResult();
+
+ // Without strict.
+ ASSERT_TRUE(irrecv.decodeSony(&irsend.capture));
+ EXPECT_EQ(SONY, irsend.capture.decode_type);
+ EXPECT_EQ(12, irsend.capture.bits);
+ EXPECT_EQ(0x750, irsend.capture.value);
+ EXPECT_EQ(0x1, irsend.capture.address);
+ EXPECT_EQ(0x2E, irsend.capture.command);
+ // With strict and correct size.
+ ASSERT_TRUE(irrecv.decodeSony(&irsend.capture, kSony12Bits, true));
+}
+
+// Encoding & Decode 20 bit Sony messages. Issue #476
+TEST(TestEncodeSony, Issue476) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendSony(0x6AB47, 20);
+ irsend.makeDecodeResult();
+
+ // Without strict.
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(SONY, irsend.capture.decode_type);
+ EXPECT_EQ(20, irsend.capture.bits);
+ EXPECT_EQ(0x6AB47, irsend.capture.value); // 20 bits
+ EXPECT_EQ(0x1A, irsend.capture.address); // 5 bits
+ EXPECT_EQ(0x7156, irsend.capture.command); // 15 bits
+ EXPECT_EQ(0x56, 0x7156 & 0x7F); // command (lower 7 bits)
+ EXPECT_EQ(0xE2, (0x7156 >> 7) & 0xFF); // extended (top 8 of 15 bits)
+ EXPECT_EQ(0x6AB47, irsend.encodeSony(20, 0x56, 0x1A, 0xE2));
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Toshiba_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Toshiba_test.cpp
new file mode 100644
index 000000000000..b5e1e07a988a
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Toshiba_test.cpp
@@ -0,0 +1,664 @@
+// Copyright 2017 David Conran
+#include "ir_Toshiba.h"
+#include "IRrecv.h"
+#include "IRrecv_test.h"
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests for Toshiba A/C methods.
+
+// Test sending typical data only.
+TEST(TestSendToshibaAC, SendDataOnly) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ uint8_t toshiba_code[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
+ 0x00, 0x00, 0x00, 0x00};
+ irsend.reset();
+ irsend.sendToshibaAC(toshiba_code);
+ EXPECT_EQ(
+ "m4400s4300"
+ "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
+ "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
+ "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s7048"
+ "m4400s4300"
+ "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
+ "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
+ "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s7048",
+ irsend.outputStr());
+}
+
+// Test sending with repeats.
+TEST(TestSendToshibaAC, SendWithRepeats) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ irsend.reset();
+ uint8_t toshiba_code[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
+ 0x00, 0x00, 0x00, 0x00};
+
+ irsend.sendToshibaAC(toshiba_code, kToshibaACStateLength, 0);
+ EXPECT_EQ(
+ "m4400s4300"
+ "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
+ "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
+ "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s7048",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendToshibaAC(toshiba_code, kToshibaACStateLength, 2);
+ EXPECT_EQ(
+ "m4400s4300"
+ "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
+ "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
+ "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s7048"
+ "m4400s4300"
+ "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
+ "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
+ "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s7048"
+ "m4400s4300"
+ "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
+ "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
+ "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s7048",
+ irsend.outputStr());
+}
+
+// Test sending atypical sizes.
+TEST(TestSendToshibaAC, SendUnexpectedSizes) {
+ IRsendTest irsend(4);
+ irsend.begin();
+
+ uint8_t toshiba_short_code[8] = {0x01, 0x02, 0x03, 0x04,
+ 0x05, 0x06, 0x07, 0x08};
+ uint8_t toshiba_long_code[10] = {0x01, 0x02, 0x03, 0x04, 0x05,
+ 0x06, 0x07, 0x08, 0x09, 0x0A};
+ irsend.reset();
+ irsend.sendToshibaAC(toshiba_short_code, kToshibaACStateLength - 1);
+ ASSERT_EQ("", irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendToshibaAC(toshiba_long_code, kToshibaACStateLength + 1);
+ ASSERT_EQ(
+ "m4400s4300"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s1623m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s1623m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623m543s1623"
+ "m543s472m543s472m543s472m543s472m543s1623m543s472m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s1623m543s472m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s1623m543s472m543s1623m543s472"
+ "m543s7048"
+ "m4400s4300"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s1623m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s1623m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623m543s1623"
+ "m543s472m543s472m543s472m543s472m543s1623m543s472m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s1623m543s472m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s1623m543s472m543s1623m543s472"
+ "m543s7048",
+ irsend.outputStr());
+}
+
+// Tests for IRToshibaAC class.
+
+TEST(TestToshibaACClass, Power) {
+ IRToshibaAC toshiba(0);
+ toshiba.begin();
+
+ toshiba.on();
+ EXPECT_TRUE(toshiba.getPower());
+
+ toshiba.off();
+ EXPECT_FALSE(toshiba.getPower());
+
+ toshiba.setPower(true);
+ EXPECT_TRUE(toshiba.getPower());
+
+ toshiba.setPower(false);
+ EXPECT_FALSE(toshiba.getPower());
+}
+
+TEST(TestToshibaACClass, Temperature) {
+ IRToshibaAC toshiba(0);
+ toshiba.begin();
+
+ toshiba.setTemp(0);
+ EXPECT_EQ(kToshibaAcMinTemp, toshiba.getTemp());
+
+ toshiba.setTemp(255);
+ EXPECT_EQ(kToshibaAcMaxTemp, toshiba.getTemp());
+
+ toshiba.setTemp(kToshibaAcMinTemp);
+ EXPECT_EQ(kToshibaAcMinTemp, toshiba.getTemp());
+
+ toshiba.setTemp(kToshibaAcMaxTemp);
+ EXPECT_EQ(kToshibaAcMaxTemp, toshiba.getTemp());
+
+ toshiba.setTemp(kToshibaAcMinTemp - 1);
+ EXPECT_EQ(kToshibaAcMinTemp, toshiba.getTemp());
+
+ toshiba.setTemp(kToshibaAcMaxTemp + 1);
+ EXPECT_EQ(kToshibaAcMaxTemp, toshiba.getTemp());
+
+ toshiba.setTemp(17);
+ EXPECT_EQ(17, toshiba.getTemp());
+
+ toshiba.setTemp(21);
+ EXPECT_EQ(21, toshiba.getTemp());
+
+ toshiba.setTemp(25);
+ EXPECT_EQ(25, toshiba.getTemp());
+
+ toshiba.setTemp(30);
+ EXPECT_EQ(30, toshiba.getTemp());
+}
+
+TEST(TestToshibaACClass, OperatingMode) {
+ IRToshibaAC toshiba(0);
+ toshiba.begin();
+
+ toshiba.setMode(kToshibaAcAuto);
+ EXPECT_EQ(kToshibaAcAuto, toshiba.getMode());
+
+ toshiba.setMode(kToshibaAcCool);
+ EXPECT_EQ(kToshibaAcCool, toshiba.getMode());
+
+ toshiba.setMode(kToshibaAcHeat);
+ EXPECT_EQ(kToshibaAcHeat, toshiba.getMode());
+
+ toshiba.setMode(kToshibaAcDry);
+ EXPECT_EQ(kToshibaAcDry, toshiba.getMode());
+
+ toshiba.setMode(kToshibaAcHeat + 1);
+ EXPECT_EQ(kToshibaAcAuto, toshiba.getMode());
+
+ toshiba.setMode(255);
+ EXPECT_EQ(kToshibaAcAuto, toshiba.getMode());
+
+ // Setting the power off changes the underlying mode in the state to heat.
+ toshiba.setPower(true);
+ toshiba.setMode(kToshibaAcCool);
+ EXPECT_EQ(kToshibaAcCool, toshiba.getMode());
+ EXPECT_EQ(kToshibaAcCool, toshiba.getMode(true));
+ toshiba.setPower(false);
+ EXPECT_EQ(kToshibaAcCool, toshiba.getMode());
+ EXPECT_EQ(kToshibaAcHeat, toshiba.getMode(true));
+}
+
+TEST(TestToshibaACClass, FanSpeed) {
+ IRToshibaAC toshiba(0);
+ toshiba.begin();
+
+ toshiba.setFan(kToshibaAcFanAuto);
+ EXPECT_EQ(kToshibaAcFanAuto, toshiba.getFan());
+
+ toshiba.setFan(255);
+ EXPECT_EQ(kToshibaAcFanMax, toshiba.getFan());
+
+ toshiba.setFan(kToshibaAcFanMax);
+ EXPECT_EQ(kToshibaAcFanMax, toshiba.getFan());
+
+ toshiba.setFan(kToshibaAcFanMax - 1);
+ EXPECT_EQ(kToshibaAcFanMax - 1, toshiba.getFan());
+
+ toshiba.setFan(1);
+ EXPECT_EQ(1, toshiba.getFan());
+
+ toshiba.setFan(2);
+ EXPECT_EQ(2, toshiba.getFan());
+
+ toshiba.setFan(3);
+ EXPECT_EQ(3, toshiba.getFan());
+
+ toshiba.setFan(4);
+ EXPECT_EQ(4, toshiba.getFan());
+
+ toshiba.setFan(kToshibaAcFanMax + 1);
+ EXPECT_EQ(kToshibaAcFanMax, toshiba.getFan());
+}
+
+TEST(TestToshibaACClass, RawState) {
+ IRToshibaAC toshiba(0);
+ toshiba.begin();
+
+ uint8_t initial_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
+ 0x00, 0x00, 0x00, 0x01};
+ uint8_t modified_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
+ 0x00, 0xC1, 0x00, 0xC0};
+
+ // Verify the starting state.
+ EXPECT_STATE_EQ(initial_state, toshiba.getRaw(), kToshibaACBits);
+ EXPECT_TRUE(toshiba.getPower());
+ EXPECT_EQ(kToshibaAcAuto, toshiba.getMode());
+ EXPECT_EQ(kToshibaAcFanAuto, toshiba.getFan());
+
+ // Change some settings.
+ toshiba.setMode(kToshibaAcCool);
+ toshiba.setFan(kToshibaAcFanMax);
+ toshiba.setTemp(kToshibaAcMinTemp);
+ // Verify those were set.
+ EXPECT_EQ(kToshibaAcCool, toshiba.getMode());
+ EXPECT_EQ(kToshibaAcFanMax, toshiba.getFan());
+ EXPECT_EQ(kToshibaAcMinTemp, toshiba.getTemp());
+ // Retrieve the modified state.
+ EXPECT_STATE_EQ(modified_state, toshiba.getRaw(), kToshibaACBits);
+
+ // Set it back to the initial state.
+ toshiba.setRaw(initial_state);
+
+ // Check the new state was set correctly.
+ EXPECT_TRUE(toshiba.getPower());
+ EXPECT_EQ(kToshibaAcAuto, toshiba.getMode());
+ EXPECT_EQ(kToshibaAcFanAuto, toshiba.getFan());
+ EXPECT_STATE_EQ(initial_state, toshiba.getRaw(), kToshibaACBits);
+}
+
+TEST(TestToshibaACClass, Checksums) {
+ IRToshibaAC toshiba(0);
+ toshiba.begin();
+
+ uint8_t initial_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
+ 0x00, 0x00, 0x00, 0x01};
+ uint8_t modified_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
+ 0x00, 0xC1, 0x00, 0xC0};
+ uint8_t invalid_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
+ 0x00, 0x00, 0x00, 0x00};
+
+ EXPECT_EQ(0x01, toshiba.calcChecksum(initial_state));
+ EXPECT_EQ(0xC0, toshiba.calcChecksum(modified_state));
+ // Check we can call it without instantiating the object.
+ EXPECT_EQ(0x01, IRToshibaAC::calcChecksum(initial_state));
+ // Use different lengths.
+ EXPECT_EQ(0x01, IRToshibaAC::calcChecksum(initial_state,
+ kToshibaACStateLength - 1));
+ EXPECT_EQ(0xFF, IRToshibaAC::calcChecksum(initial_state, 3));
+ // Minimum length that actually means anything.
+ EXPECT_EQ(0xF2, IRToshibaAC::calcChecksum(initial_state, 2));
+ // Technically, there is no such thing as a checksum for a length of < 2
+ // But test it anyway
+ EXPECT_EQ(0x00, IRToshibaAC::calcChecksum(initial_state, 1));
+ EXPECT_EQ(0x00, IRToshibaAC::calcChecksum(initial_state, 0));
+
+ // Validity tests.
+ EXPECT_TRUE(IRToshibaAC::validChecksum(initial_state));
+ EXPECT_TRUE(IRToshibaAC::validChecksum(modified_state));
+ EXPECT_FALSE(IRToshibaAC::validChecksum(invalid_state));
+ EXPECT_FALSE(IRToshibaAC::validChecksum(initial_state, 0));
+ EXPECT_FALSE(IRToshibaAC::validChecksum(initial_state, 1));
+ EXPECT_FALSE(IRToshibaAC::validChecksum(initial_state, 2));
+}
+
+TEST(TestToshibaACClass, HumanReadableOutput) {
+ IRToshibaAC toshiba(0);
+ toshiba.begin();
+
+ uint8_t initial_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
+ 0x00, 0x00, 0x00, 0x01};
+ uint8_t modified_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
+ 0x00, 0xC1, 0x00, 0xC0};
+
+ toshiba.setRaw(initial_state);
+ EXPECT_EQ("Power: On, Mode: 0 (AUTO), Temp: 17C, Fan: 0 (AUTO)",
+ toshiba.toString());
+ toshiba.setRaw(modified_state);
+ EXPECT_EQ("Power: On, Mode: 1 (COOL), Temp: 17C, Fan: 5 (MAX)",
+ toshiba.toString());
+ toshiba.off();
+ toshiba.setTemp(25);
+ toshiba.setFan(3);
+ toshiba.setMode(kToshibaAcDry);
+ EXPECT_EQ("Power: Off, Mode: 2 (DRY), Temp: 25C, Fan: 3", toshiba.toString());
+}
+
+TEST(TestToshibaACClass, MessageConstuction) {
+ IRToshibaAC toshiba(0);
+ IRsendTest irsend(4);
+ toshiba.begin();
+ irsend.begin();
+
+ toshiba.setFan(1);
+ toshiba.setMode(kToshibaAcCool);
+ toshiba.setTemp(27);
+ toshiba.on();
+
+ // Check everything for kicks.
+ EXPECT_EQ(1, toshiba.getFan());
+ EXPECT_EQ(kToshibaAcCool, toshiba.getMode());
+ EXPECT_EQ(27, toshiba.getTemp());
+ EXPECT_TRUE(toshiba.getPower());
+
+ irsend.reset();
+ irsend.sendToshibaAC(toshiba.getRaw());
+ EXPECT_EQ(
+ "m4400s4300"
+ "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
+ "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
+ "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
+ "m543s1623m543s472m543s1623m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s1623m543s472m543s472m543s472m543s472m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s1623m543s1623m543s1623m543s472m543s472m543s472m543s472m543s472"
+ "m543s7048"
+ "m4400s4300"
+ "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
+ "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
+ "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
+ "m543s1623m543s472m543s1623m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s1623m543s472m543s472m543s472m543s472m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s1623m543s1623m543s1623m543s472m543s472m543s472m543s472m543s472"
+ "m543s7048",
+ irsend.outputStr());
+
+ // Turn off the power and re-check.
+ toshiba.setPower(false);
+ // Check everything for kicks.
+ EXPECT_EQ(1, toshiba.getFan());
+ EXPECT_EQ(kToshibaAcCool, toshiba.getMode());
+ EXPECT_EQ(27, toshiba.getTemp());
+ EXPECT_FALSE(toshiba.getPower());
+
+ irsend.reset();
+ irsend.sendToshibaAC(toshiba.getRaw());
+ EXPECT_EQ(
+ "m4400s4300"
+ "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
+ "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
+ "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
+ "m543s1623m543s472m543s1623m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s1623m543s472m543s472m543s472m543s1623m543s1623m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s1623m543s472"
+ "m543s7048"
+ "m4400s4300"
+ "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
+ "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
+ "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
+ "m543s1623m543s472m543s1623m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s1623m543s472m543s472m543s472m543s1623m543s1623m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s1623m543s472"
+ "m543s7048",
+ irsend.outputStr());
+
+ // Turn the power back on, and check nothing changed.
+ toshiba.on();
+
+ EXPECT_EQ(1, toshiba.getFan());
+ EXPECT_EQ(kToshibaAcCool, toshiba.getMode());
+ EXPECT_EQ(27, toshiba.getTemp());
+ EXPECT_TRUE(toshiba.getPower());
+
+ irsend.reset();
+ irsend.sendToshibaAC(toshiba.getRaw());
+ EXPECT_EQ(
+ "m4400s4300"
+ "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
+ "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
+ "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
+ "m543s1623m543s472m543s1623m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s1623m543s472m543s472m543s472m543s472m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s1623m543s1623m543s1623m543s472m543s472m543s472m543s472m543s472"
+ "m543s7048"
+ "m4400s4300"
+ "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
+ "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
+ "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
+ "m543s1623m543s472m543s1623m543s472m543s472m543s472m543s472m543s472"
+ "m543s472m543s1623m543s472m543s472m543s472m543s472m543s472m543s1623"
+ "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
+ "m543s1623m543s1623m543s1623m543s472m543s472m543s472m543s472m543s472"
+ "m543s7048",
+ irsend.outputStr());
+}
+
+// Decoding a message we entirely constructed based solely on a given state.
+TEST(TestDecodeToshibaAC, SyntheticExample) {
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ uint8_t expectedState[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
+ 0x00, 0x00, 0x00, 0x01};
+
+ irsend.reset();
+ irsend.sendToshibaAC(expectedState);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type);
+ ASSERT_EQ(kToshibaACBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+}
+
+// Test decoding against captures from a real Toshiba A/C remote.
+// Recorded by @mwildbolz
+TEST(TestDecodeToshibaAC, RealExamples) {
+ IRToshibaAC toshiba(0);
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+
+ uint16_t rawData1[295] = {
+ 4442, 4292, 612, 1544, 616, 1544, 616, 1544, 612, 1548, 610, 468,
+ 612, 468, 662, 1494, 640, 438, 616, 464, 614, 464, 616, 464,
+ 612, 468, 610, 1544, 616, 1544, 616, 468, 612, 1544, 616, 464,
+ 694, 386, 616, 464, 612, 468, 612, 468, 636, 444, 610, 1546,
+ 616, 1544, 612, 1546, 614, 1546, 616, 1546, 740, 1420, 612, 1544,
+ 616, 1546, 616, 464, 610, 468, 610, 470, 612, 468, 610, 468,
+ 610, 470, 636, 438, 616, 464, 616, 464, 616, 1546, 636, 442,
+ 612, 1546, 614, 1544, 616, 464, 614, 464, 610, 468, 612, 468,
+ 612, 468, 612, 468, 636, 440, 614, 464, 616, 464, 616, 464,
+ 612, 468, 636, 442, 638, 442, 662, 418, 610, 464, 616, 464,
+ 616, 464, 610, 468, 612, 468, 636, 444, 610, 468, 638, 438,
+ 614, 1546, 612, 1548, 612, 470, 610, 468, 636, 442, 612, 468,
+ 612, 1544, 612, 7396, 4442, 4292, 610, 1546, 616, 1544, 612, 1548,
+ 612, 1546, 616, 464, 616, 464, 616, 1544, 612, 468, 662, 418,
+ 610, 468, 638, 442, 638, 438, 616, 1546, 616, 1544, 612, 468,
+ 610, 1546, 616, 464, 616, 464, 642, 438, 616, 464, 612, 468,
+ 610, 470, 610, 1546, 616, 1544, 612, 1546, 616, 1546, 614, 1546,
+ 612, 1550, 610, 1544, 616, 1546, 614, 464, 642, 438, 610, 468,
+ 612, 468, 612, 468, 612, 468, 610, 468, 638, 438, 614, 464,
+ 616, 1544, 636, 444, 636, 1520, 616, 1544, 616, 464, 616, 464,
+ 612, 468, 612, 468, 612, 468, 612, 468, 612, 464, 612, 470,
+ 636, 442, 638, 442, 612, 470, 692, 384, 614, 464, 616, 464,
+ 612, 468, 610, 468, 612, 468, 610, 470, 610, 464, 616, 464,
+ 616, 464, 616, 464, 610, 1550, 610, 1546, 640, 444, 688, 386,
+ 616, 464, 612, 468, 612, 1544, 642};
+
+ irsend.reset();
+ irsend.sendRaw(rawData1, 295, 38000);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type);
+ ASSERT_EQ(kToshibaACBits, irsend.capture.bits);
+ toshiba.setRaw(irsend.capture.state);
+ EXPECT_TRUE(toshiba.getPower());
+ EXPECT_EQ(23, toshiba.getTemp());
+ EXPECT_EQ(kToshibaAcFanAuto, toshiba.getFan());
+ EXPECT_EQ(kToshibaAcAuto, toshiba.getMode());
+
+ uint16_t rawData2[295] = {
+ 4500, 4236, 636, 1520, 642, 1520, 640, 1520, 664, 1492, 642, 440,
+ 668, 412, 642, 1518, 638, 438, 666, 414, 640, 438, 642, 438,
+ 638, 442, 642, 1516, 640, 1520, 642, 438, 642, 1520, 636, 438,
+ 668, 412, 640, 440, 666, 412, 642, 438, 668, 412, 640, 1516,
+ 668, 1492, 642, 1520, 666, 1494, 638, 1520, 642, 1520, 668, 1490,
+ 666, 1494, 642, 438, 638, 438, 668, 412, 668, 412, 642, 438,
+ 642, 438, 664, 412, 642, 438, 642, 438, 642, 1518, 642, 434,
+ 668, 412, 642, 438, 668, 412, 692, 388, 666, 412, 642, 434,
+ 642, 438, 642, 1518, 668, 412, 668, 412, 640, 438, 638, 438,
+ 642, 438, 640, 438, 668, 1492, 642, 440, 666, 412, 640, 438,
+ 642, 438, 642, 434, 668, 412, 668, 412, 666, 414, 666, 1494,
+ 640, 438, 642, 434, 668, 412, 642, 438, 642, 438, 668, 412,
+ 668, 414, 640, 7362, 4474, 4262, 642, 1518, 638, 1520, 640, 1520,
+ 668, 1494, 640, 434, 642, 438, 640, 1520, 642, 438, 642, 438,
+ 642, 438, 642, 438, 642, 434, 668, 1494, 642, 1518, 638, 442,
+ 638, 1520, 642, 438, 642, 438, 668, 414, 664, 408, 642, 438,
+ 668, 412, 642, 1520, 666, 1494, 642, 1514, 642, 1518, 642, 1520,
+ 636, 1520, 668, 1494, 666, 1494, 638, 438, 666, 414, 640, 440,
+ 666, 412, 668, 412, 668, 412, 642, 434, 668, 412, 668, 412,
+ 668, 1494, 642, 438, 642, 434, 642, 438, 642, 438, 642, 438,
+ 642, 438, 642, 434, 646, 434, 642, 1518, 668, 412, 642, 438,
+ 642, 434, 666, 414, 640, 438, 642, 438, 642, 1518, 642, 438,
+ 642, 434, 668, 412, 642, 438, 642, 438, 642, 438, 642, 438,
+ 642, 438, 640, 1520, 636, 438, 642, 438, 642, 438, 666, 414,
+ 668, 412, 642, 440, 640, 438, 640};
+
+ irsend.reset();
+ irsend.sendRaw(rawData2, 295, 38000);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type);
+ ASSERT_EQ(kToshibaACBits, irsend.capture.bits);
+ toshiba.setRaw(irsend.capture.state);
+ EXPECT_TRUE(toshiba.getPower());
+ EXPECT_EQ(17, toshiba.getTemp());
+ EXPECT_EQ(3, toshiba.getFan());
+ EXPECT_EQ(kToshibaAcCool, toshiba.getMode());
+
+ uint16_t rawData3[295] = {
+ 4474, 4262, 642, 1514, 642, 1520, 642, 1520, 642, 1514, 642, 438,
+ 642, 438, 642, 1520, 636, 438, 642, 438, 642, 438, 642, 438,
+ 642, 438, 640, 1520, 638, 1520, 642, 438, 640, 1520, 642, 438,
+ 642, 434, 642, 438, 642, 438, 642, 438, 668, 414, 636, 1520,
+ 642, 1520, 642, 1514, 642, 1520, 642, 1520, 640, 1518, 638, 1520,
+ 666, 1494, 642, 438, 642, 434, 642, 438, 640, 438, 642, 438,
+ 642, 440, 640, 434, 642, 438, 642, 438, 642, 1520, 642, 438,
+ 642, 1514, 642, 1520, 640, 1520, 636, 438, 642, 438, 642, 438,
+ 666, 414, 642, 1520, 636, 1520, 642, 438, 642, 438, 640, 438,
+ 642, 434, 642, 1518, 642, 1520, 642, 438, 642, 434, 640, 438,
+ 642, 438, 642, 438, 642, 440, 642, 438, 668, 408, 642, 1520,
+ 642, 438, 642, 1520, 638, 1518, 642, 438, 642, 438, 640, 1520,
+ 640, 438, 642, 7362, 4474, 4262, 642, 1518, 638, 1520, 640, 1520,
+ 642, 1520, 638, 438, 642, 438, 642, 1518, 642, 438, 638, 438,
+ 642, 438, 642, 438, 642, 438, 642, 1514, 642, 1520, 642, 438,
+ 666, 1490, 642, 438, 642, 438, 642, 440, 640, 438, 642, 434,
+ 640, 438, 642, 1520, 642, 1520, 636, 1520, 642, 1520, 642, 1514,
+ 642, 1518, 642, 1518, 640, 1516, 642, 438, 642, 438, 642, 438,
+ 640, 438, 638, 442, 642, 434, 642, 440, 640, 438, 642, 438,
+ 642, 1518, 642, 438, 642, 1514, 642, 1520, 642, 1518, 642, 438,
+ 642, 432, 642, 438, 642, 438, 642, 1520, 642, 1514, 642, 438,
+ 642, 438, 642, 438, 642, 438, 642, 1514, 642, 1520, 642, 438,
+ 642, 438, 638, 438, 642, 438, 642, 438, 640, 440, 642, 438,
+ 640, 434, 642, 1520, 642, 438, 640, 1520, 668, 1490, 666, 414,
+ 640, 438, 642, 1520, 642, 438, 636};
+
+ irsend.reset();
+ irsend.sendRaw(rawData3, 295, 38000);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type);
+ ASSERT_EQ(kToshibaACBits, irsend.capture.bits);
+ toshiba.setRaw(irsend.capture.state);
+ EXPECT_TRUE(toshiba.getPower());
+ EXPECT_EQ(24, toshiba.getTemp());
+ EXPECT_EQ(kToshibaAcFanMax, toshiba.getFan());
+ EXPECT_EQ(kToshibaAcHeat, toshiba.getMode());
+
+ uint16_t rawData4[295] = {
+ 4474, 4262, 636, 1520, 640, 1520, 640, 1520, 638, 1518, 642, 438,
+ 642, 438, 642, 1520, 636, 438, 642, 438, 642, 438, 642, 438,
+ 636, 444, 636, 1520, 640, 1520, 642, 438, 638, 1524, 638, 438,
+ 640, 438, 642, 438, 640, 438, 642, 438, 638, 438, 642, 1518,
+ 642, 1520, 666, 1494, 636, 1520, 640, 1520, 640, 1520, 636, 1524,
+ 638, 1520, 640, 440, 640, 438, 642, 438, 636, 444, 636, 438,
+ 642, 438, 640, 440, 640, 438, 642, 438, 642, 1518, 638, 438,
+ 642, 1518, 642, 438, 640, 1520, 636, 444, 636, 438, 640, 438,
+ 642, 438, 668, 1494, 640, 438, 642, 1518, 636, 444, 636, 438,
+ 640, 1520, 642, 1518, 642, 1520, 636, 444, 636, 438, 642, 438,
+ 642, 438, 640, 440, 640, 438, 640, 440, 640, 438, 640, 1518,
+ 642, 1520, 636, 1524, 636, 1518, 642, 438, 642, 1518, 642, 1518,
+ 640, 438, 642, 7364, 4472, 4262, 642, 1518, 642, 1518, 638, 1518,
+ 642, 1520, 642, 438, 642, 438, 640, 1520, 636, 440, 640, 438,
+ 642, 438, 640, 438, 642, 438, 642, 1518, 636, 1524, 636, 438,
+ 640, 1520, 642, 438, 642, 438, 640, 438, 636, 444, 636, 438,
+ 668, 412, 642, 1518, 642, 1520, 642, 1520, 636, 1518, 642, 1518,
+ 642, 1520, 636, 1520, 668, 1494, 642, 438, 636, 444, 664, 412,
+ 642, 438, 668, 412, 642, 438, 636, 442, 638, 442, 638, 438,
+ 642, 1518, 642, 438, 642, 1518, 638, 438, 642, 1518, 642, 440,
+ 640, 438, 636, 444, 636, 444, 636, 1520, 642, 438, 642, 1520,
+ 636, 444, 636, 438, 642, 1520, 640, 1520, 636, 1520, 668, 412,
+ 642, 438, 642, 438, 642, 438, 638, 442, 636, 438, 642, 438,
+ 668, 412, 640, 1520, 638, 1524, 636, 1520, 642, 1520, 636, 444,
+ 638, 1522, 638, 1518, 640, 438, 642};
+
+ irsend.reset();
+ irsend.sendRaw(rawData4, 295, 38000);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type);
+ ASSERT_EQ(kToshibaACBits, irsend.capture.bits);
+ toshiba.setRaw(irsend.capture.state);
+ EXPECT_FALSE(toshiba.getPower());
+ EXPECT_EQ(22, toshiba.getTemp());
+ EXPECT_EQ(4, toshiba.getFan());
+
+ // Confirming the quirky behaviour that the 'Power OFF' signal
+ // sets the mode to heat.
+ // The previous state the remote was in was 'AUTO' just prior to
+ // sending the power off message.
+ EXPECT_EQ(kToshibaAcHeat, toshiba.getMode());
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/test/ir_Whirlpool_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Whirlpool_test.cpp
new file mode 100644
index 000000000000..c30cb21d335f
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Whirlpool_test.cpp
@@ -0,0 +1,118 @@
+// Copyright 2018 David Conran
+
+#include "IRrecv.h"
+#include "IRrecv_test.h"
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests for sendWhirlpoolAC().
+
+// Test sending typical data only.
+TEST(TestSendWhirlpoolAC, SendDataOnly) {
+ IRsendTest irsend(0);
+ irsend.begin();
+ uint8_t data[kWhirlpoolAcStateLength] = {
+ 0x83, 0x06, 0x10, 0x71, 0x00, 0x00, 0x91, 0x1F, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xEF, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02};
+
+ irsend.sendWhirlpoolAC(data);
+ EXPECT_EQ(
+ "m8950s4484"
+ "m597s1649m597s1649m597s533m597s533m597s533m597s533m597s533m597s1649"
+ "m597s533m597s1649m597s1649m597s533m597s533m597s533m597s533m597s533"
+ "m597s533m597s533m597s533m597s533m597s1649m597s533m597s533m597s533"
+ "m597s1649m597s533m597s533m597s533m597s1649m597s1649m597s1649m597s533"
+ "m597s533m597s533m597s533m597s533m597s533m597s533m597s533m597s533"
+ "m597s533m597s533m597s533m597s533m597s533m597s533m597s533m597s533"
+ "m597s7920"
+ "m597s1649m597s533m597s533m597s533m597s1649m597s533m597s533m597s1649"
+ "m597s1649m597s1649m597s1649m597s1649m597s1649m597s533m597s533m597s533"
+ "m597s533m597s533m597s533m597s533m597s533m597s533m597s533m597s533"
+ "m597s533m597s533m597s533m597s533m597s533m597s533m597s533m597s533"
+ "m597s533m597s533m597s533m597s533m597s533m597s533m597s533m597s533"
+ "m597s533m597s533m597s533m597s533m597s533m597s533m597s533m597s533"
+ "m597s533m597s533m597s533m597s533m597s533m597s533m597s533m597s533"
+ "m597s1649m597s1649m597s1649m597s1649m597s533m597s1649m597s1649m597s1649"
+ "m597s7920"
+ "m597s533m597s533m597s533m597s533m597s533m597s533m597s533m597s533"
+ "m597s533m597s1649m597s533m597s533m597s533m597s533m597s533m597s533"
+ "m597s533m597s533m597s533m597s533m597s533m597s533m597s533m597s533"
+ "m597s533m597s533m597s533m597s533m597s533m597s533m597s533m597s533"
+ "m597s533m597s533m597s533m597s533m597s533m597s533m597s533m597s533"
+ "m597s533m597s533m597s533m597s533m597s533m597s533m597s533m597s533"
+ "m597s533m597s1649m597s533m597s533m597s533m597s533m597s533m597s533"
+ "m597s100000",
+ irsend.outputStr());
+}
+
+// Tests for decodeWhirlpoolAC().
+// Decode normal WhirlpoolAC messages.
+TEST(TestDecodeWhirlpoolAC, SyntheticDecode) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ // Synthesised Normal WhirlpoolAC message.
+ irsend.reset();
+ uint8_t expectedState[kWhirlpoolAcStateLength] = {
+ 0x83, 0x06, 0x10, 0x71, 0x00, 0x00, 0x91, 0x1F, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xEF, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02};
+ irsend.sendWhirlpoolAC(expectedState);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(WHIRLPOOL_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kWhirlpoolAcBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+}
+
+// Decode a recorded example
+TEST(TestDecodeWhirlpoolAC, RealExampleDecode) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ // Real WhirlpoolAC message.
+ // Ref: https://github.com/markszabo/IRremoteESP8266/issues/509
+ uint16_t rawData[343] = {
+ 8950, 4484, 598, 1642, 598, 1646, 594, 534, 594, 538, 602, 532,
+ 598, 540, 600, 542, 598, 1650, 600, 522, 598, 1644, 596, 1650,
+ 600, 532, 598, 538, 602, 536, 594, 548, 592, 538, 602, 518,
+ 600, 524, 596, 532, 598, 532, 598, 1654, 596, 544, 596, 544,
+ 596, 536, 594, 1644, 596, 528, 600, 528, 592, 538, 602, 1648,
+ 602, 1654, 596, 1664, 598, 534, 594, 526, 594, 530, 598, 528,
+ 602, 530, 600, 534, 596, 542, 598, 542, 598, 534, 596, 526,
+ 594, 530, 600, 528, 602, 530, 600, 534, 596, 542, 598, 544,
+ 596, 518, 602, 7916, 598, 1642, 598, 528, 600, 528, 602, 530,
+ 600, 1652, 598, 542, 598, 544, 596, 1654, 596, 1644, 596, 1648,
+ 602, 1644, 596, 1654, 596, 1656, 604, 536, 594, 548, 602, 528,
+ 600, 520, 600, 524, 596, 532, 598, 532, 596, 538, 602, 536,
+ 594, 546, 594, 538, 602, 518, 600, 524, 596, 532, 598, 532,
+ 598, 536, 594, 544, 596, 544, 596, 536, 594, 526, 592, 530,
+ 600, 528, 600, 530, 602, 532, 596, 542, 598, 542, 598, 534,
+ 596, 524, 596, 528, 600, 526, 592, 538, 592, 542, 598, 540,
+ 600, 540, 600, 530, 598, 522, 598, 526, 594, 534, 596, 534,
+ 594, 540, 602, 536, 592, 548, 592, 538, 600, 1636, 594, 1648,
+ 602, 1642, 598, 1652, 598, 538, 602, 1680, 570, 1662, 598, 1634,
+ 596, 7924, 600, 520, 598, 526, 592, 534, 596, 534, 596, 540,
+ 600, 536, 604, 538, 602, 530, 600, 520, 598, 1640, 600, 528,
+ 600, 530, 600, 534, 594, 544, 596, 544, 596, 534, 596, 526,
+ 594, 528, 600, 526, 594, 536, 592, 542, 598, 538, 602, 538,
+ 602, 528, 600, 520, 600, 524, 596, 530, 600, 532, 598, 534,
+ 596, 542, 598, 542, 598, 532, 598, 524, 596, 528, 602, 526,
+ 594, 536, 594, 540, 600, 536, 594, 548, 592, 538, 602, 518,
+ 602, 522, 596, 530, 600, 530, 600, 534, 596, 542, 598, 544,
+ 596, 534, 596, 524, 594, 1644, 596, 532, 596, 534, 596, 538,
+ 602, 536, 594, 546, 594, 520, 600};
+ uint8_t expectedState[kWhirlpoolAcStateLength] = {
+ 0x83, 0x06, 0x10, 0x71, 0x00, 0x00, 0x91, 0x1F, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xEF, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02};
+
+ irsend.reset();
+ irsend.sendRaw(rawData, 343, 38000);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(WHIRLPOOL_AC, irsend.capture.decode_type);
+ EXPECT_EQ(kWhirlpoolAcBits, irsend.capture.bits);
+ EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
+}
diff --git a/lib/IRremoteESP8266-2.2.1.02/test/ir_Whynter_test.cpp b/lib/IRremoteESP8266-2.5.2.03/test/ir_Whynter_test.cpp
similarity index 82%
rename from lib/IRremoteESP8266-2.2.1.02/test/ir_Whynter_test.cpp
rename to lib/IRremoteESP8266-2.5.2.03/test/ir_Whynter_test.cpp
index 4978bb6f5dca..748a4c9bf460 100644
--- a/lib/IRremoteESP8266-2.2.1.02/test/ir_Whynter_test.cpp
+++ b/lib/IRremoteESP8266-2.5.2.03/test/ir_Whynter_test.cpp
@@ -19,7 +19,8 @@ TEST(TestSendWhynter, SendDataOnly) {
"m750s750m750s750m750s750m750s750m750s750m750s750m750s750m750s750"
"m750s750m750s750m750s750m750s750m750s750m750s750m750s750m750s750"
"m750s750m750s750m750s750m750s750m750s750m750s750m750s750m750s750"
- "m750s108000", irsend.outputStr());
+ "m750s52050",
+ irsend.outputStr());
irsend.reset();
irsend.sendWhynter(0xFFFFFFFF);
@@ -29,7 +30,8 @@ TEST(TestSendWhynter, SendDataOnly) {
"m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150"
"m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150"
"m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150"
- "m750s108000", irsend.outputStr());
+ "m750s12200",
+ irsend.outputStr());
irsend.reset();
irsend.sendWhynter(0x87654321);
@@ -39,7 +41,8 @@ TEST(TestSendWhynter, SendDataOnly) {
"m750s750m750s2150m750s2150m750s750m750s750m750s2150m750s750m750s2150"
"m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150"
"m750s750m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150"
- "m750s108000", irsend.outputStr());
+ "m750s33850",
+ irsend.outputStr());
}
// Test sending with different repeats.
@@ -48,50 +51,55 @@ TEST(TestSendWhynter, SendWithRepeats) {
irsend.begin();
irsend.reset();
- irsend.sendWhynter(0x87654321, WHYNTER_BITS, 0); // 0 repeats.
+ irsend.sendWhynter(0x87654321, kWhynterBits, 0); // 0 repeats.
EXPECT_EQ(
"m750s750m2850s2850"
"m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150m750s2150"
"m750s750m750s2150m750s2150m750s750m750s750m750s2150m750s750m750s2150"
"m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150"
"m750s750m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150"
- "m750s108000", irsend.outputStr());
+ "m750s33850",
+ irsend.outputStr());
irsend.reset();
- irsend.sendWhynter(0x87654321, WHYNTER_BITS, 1); // 1 repeat.
+ irsend.sendWhynter(0x87654321, kWhynterBits, 1); // 1 repeat.
EXPECT_EQ(
"m750s750m2850s2850"
"m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150m750s2150"
"m750s750m750s2150m750s2150m750s750m750s750m750s2150m750s750m750s2150"
"m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150"
"m750s750m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150"
- "m750s108000"
+ "m750s33850"
"m750s750m2850s2850"
"m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150m750s2150"
"m750s750m750s2150m750s2150m750s750m750s750m750s2150m750s750m750s2150"
"m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150"
"m750s750m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150"
- "m750s108000", irsend.outputStr());
- irsend.sendWhynter(0x87654321, WHYNTER_BITS, 2); // 2 repeats.
+ "m750s33850",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendWhynter(0x87654321, kWhynterBits, 2); // 2 repeats.
EXPECT_EQ(
"m750s750m2850s2850"
"m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150m750s2150"
"m750s750m750s2150m750s2150m750s750m750s750m750s2150m750s750m750s2150"
"m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150"
"m750s750m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150"
- "m750s108000"
+ "m750s33850"
"m750s750m2850s2850"
"m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150m750s2150"
"m750s750m750s2150m750s2150m750s750m750s750m750s2150m750s750m750s2150"
"m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150"
"m750s750m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150"
- "m750s108000"
+ "m750s33850"
"m750s750m2850s2850"
"m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150m750s2150"
"m750s750m750s2150m750s2150m750s750m750s750m750s2150m750s750m750s2150"
"m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150"
"m750s750m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150"
- "m750s108000", irsend.outputStr());
+ "m750s33850",
+ irsend.outputStr());
}
// Test sending an atypical data size.
@@ -104,7 +112,8 @@ TEST(TestSendWhynter, SendUnusualSize) {
EXPECT_EQ(
"m750s750m2850s2850"
"m750s750m750s750m750s750m750s750m750s750m750s750m750s750m750s750"
- "m750s108000", irsend.outputStr());
+ "m750s88050",
+ irsend.outputStr());
irsend.reset();
irsend.sendWhynter(0x1234567890ABCDEF, 64);
@@ -118,7 +127,8 @@ TEST(TestSendWhynter, SendUnusualSize) {
"m750s2150m750s750m750s2150m750s750m750s2150m750s750m750s2150m750s2150"
"m750s2150m750s2150m750s750m750s750m750s2150m750s2150m750s750m750s2150"
"m750s2150m750s2150m750s2150m750s750m750s2150m750s2150m750s2150m750s2150"
- "m750s108000", irsend.outputStr());
+ "m750s12200",
+ irsend.outputStr());
}
// Tests for decodeWhynter().
@@ -133,9 +143,9 @@ TEST(TestDecodeWhynter, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendWhynter(0x87654321);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, WHYNTER_BITS, true));
+ ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, kWhynterBits, true));
EXPECT_EQ(WHYNTER, irsend.capture.decode_type);
- EXPECT_EQ(WHYNTER_BITS, irsend.capture.bits);
+ EXPECT_EQ(kWhynterBits, irsend.capture.bits);
EXPECT_EQ(0x87654321, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
@@ -150,24 +160,24 @@ TEST(TestDecodeWhynter, NormalDecodeWithRepeatAndStrict) {
// Normal Whynter 32-bit message with 2 repeats.
irsend.reset();
- irsend.sendWhynter(0x87654321, WHYNTER_BITS, 2);
+ irsend.sendWhynter(0x87654321, kWhynterBits, 2);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, WHYNTER_BITS, true));
+ ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, kWhynterBits, true));
EXPECT_EQ(WHYNTER, irsend.capture.decode_type);
- EXPECT_EQ(WHYNTER_BITS, irsend.capture.bits);
+ EXPECT_EQ(kWhynterBits, irsend.capture.bits);
EXPECT_EQ(0x87654321, irsend.capture.value);
EXPECT_FALSE(irsend.capture.repeat);
- irsend.makeDecodeResult(2 * WHYNTER_BITS + 6);
- ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, WHYNTER_BITS, true));
+ irsend.makeDecodeResult(2 * kWhynterBits + 6);
+ ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, kWhynterBits, true));
EXPECT_EQ(WHYNTER, irsend.capture.decode_type);
- EXPECT_EQ(WHYNTER_BITS, irsend.capture.bits);
+ EXPECT_EQ(kWhynterBits, irsend.capture.bits);
EXPECT_EQ(0x87654321, irsend.capture.value);
- irsend.makeDecodeResult(2 * (2 * WHYNTER_BITS + 6));
- ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, WHYNTER_BITS, true));
+ irsend.makeDecodeResult(2 * (2 * kWhynterBits + 6));
+ ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, kWhynterBits, true));
EXPECT_EQ(WHYNTER, irsend.capture.decode_type);
- EXPECT_EQ(WHYNTER_BITS, irsend.capture.bits);
+ EXPECT_EQ(kWhynterBits, irsend.capture.bits);
EXPECT_EQ(0x87654321, irsend.capture.value);
}
@@ -181,7 +191,7 @@ TEST(TestDecodeWhynter, DecodeWithNonStrictSizes) {
irsend.sendWhynter(0x12, 8); // Illegal sized Whynter 8-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, WHYNTER_BITS, true));
+ ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, kWhynterBits, true));
ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, 8, true));
// Should pass if strict off.
ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, 8, false));
@@ -195,7 +205,7 @@ TEST(TestDecodeWhynter, DecodeWithNonStrictSizes) {
irsend.sendWhynter(0x1234567890, 40); // Illegal size Whynter 40-bit message.
irsend.makeDecodeResult();
// Shouldn't pass with strict when we ask for less bits than we got.
- ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, WHYNTER_BITS, true));
+ ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, kWhynterBits, true));
irsend.makeDecodeResult();
// Should fail with strict when we ask for the wrong bit size.
@@ -236,12 +246,13 @@ TEST(TestDecodeWhynter, FailToDecodeNonWhynterExample) {
irsend.reset();
// Modified a few entries to unexpected values, based on previous test case.
- uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20, 20, 20, 20,
- 20, 20, 20, 127, 20, 61, 9, 20, 20, 61, 20, 20, 20,
- 61, 20, 61, 20, 61, 20, 20, 20, 20, 20, 20, 20, 884};
+ uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
+ 20, 20, 20, 20, 20, 20, 127, 20, 61, 9,
+ 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
+ 61, 20, 20, 20, 20, 20, 20, 20, 884};
irsend.sendGC(gc_test, 39);
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, WHYNTER_BITS, false));
+ ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, kWhynterBits, false));
}
diff --git a/lib/IRremoteESP8266-2.2.1.02/tools/Makefile b/lib/IRremoteESP8266-2.5.2.03/tools/Makefile
similarity index 63%
rename from lib/IRremoteESP8266-2.2.1.02/tools/Makefile
rename to lib/IRremoteESP8266-2.5.2.03/tools/Makefile
index 84bf6569b6e7..c303e051db39 100644
--- a/lib/IRremoteESP8266-2.2.1.02/tools/Makefile
+++ b/lib/IRremoteESP8266-2.5.2.03/tools/Makefile
@@ -22,10 +22,22 @@ CPPFLAGS += -DUNIT_TEST
# Flags passed to the C++ compiler.
CXXFLAGS += -g -Wall -Wextra -pthread
-all : gc_decode
+all : gc_decode mode2_decode
+
+run_tests : all
+ failed=""; \
+ for py_unittest in *_test.py; do \
+ echo "RUNNING: $${py_unittest}"; \
+ python ./$${py_unittest} || failed="$${failed} $${py_unittest}"; \
+ done; \
+ if [ -n "$${failed}" ]; then \
+ echo "FAIL: :-( :-( Unit test(s)$${failed} failed! :-( :-("; exit 1; \
+ else \
+ echo "PASS: \o/ \o/ All unit tests passed. \o/ \o/"; \
+ fi
clean :
- rm -f *.o gc_decode
+ rm -f *.o *.pyc gc_decode mode2_decode
# All the IR protocol object files.
@@ -33,9 +45,13 @@ PROTOCOLS = ir_NEC.o ir_Sony.o ir_Samsung.o ir_JVC.o ir_RCMM.o ir_RC5_RC6.o \
ir_LG.o ir_Mitsubishi.o ir_Fujitsu.o ir_Sharp.o ir_Sanyo.o \
ir_Denon.o ir_Dish.o ir_Panasonic.o ir_Whynter.o ir_Coolix.o \
ir_Aiwa.o ir_Sherwood.o ir_Kelvinator.o ir_Daikin.o ir_Gree.o \
- ir_Pronto.o ir_GlobalCache.o ir_Nikai.o
+ ir_Pronto.o ir_GlobalCache.o ir_Nikai.o ir_Toshiba.o ir_Midea.o \
+ ir_Magiquest.o ir_Lasertag.o ir_Carrier.o ir_Haier.o ir_Hitachi.o \
+ ir_GICable.o ir_Whirlpool.o ir_Lutron.o ir_Electra.o ir_Pioneer.o \
+ ir_MWM.o
+
# Common object files
-COMMON_OBJ = IRutils.o IRtimer.o IRsend.o IRrecv.o $(PROTOCOLS)
+COMMON_OBJ = IRutils.o IRtimer.o IRsend.o IRrecv.o $(PROTOCOLS)
# Common dependencies
COMMON_DEPS = $(USER_DIR)/IRrecv.h $(USER_DIR)/IRsend.h $(USER_DIR)/IRtimer.h \
@@ -49,8 +65,13 @@ gc_decode.o : gc_decode.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
gc_decode : $(COMMON_OBJ) gc_decode.o
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
+mode2_decode.o : mode2_decode.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I$(USER_DIR) -I$(TEST_DIR) -c mode2_decode.cpp
+
+mode2_decode : $(COMMON_OBJ) mode2_decode.o
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
-IRutils.o : $(USER_DIR)/IRutils.cpp $(USER_DIR)/IRutils.h
+IRutils.o : $(USER_DIR)/IRutils.cpp $(USER_DIR)/IRutils.h $(USER_DIR)/IRremoteESP8266.h
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/IRutils.cpp
IRtimer.o : $(USER_DIR)/IRtimer.cpp $(USER_DIR)/IRtimer.h
@@ -75,7 +96,7 @@ ir_Sherwood.o : $(USER_DIR)/ir_Sherwood.cpp $(COMMON_DEPS)
ir_Sony.o : $(USER_DIR)/ir_Sony.cpp $(COMMON_DEPS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Sony.cpp
-ir_Samsung.o : $(USER_DIR)/ir_Samsung.cpp $(COMMON_DEPS)
+ir_Samsung.o : $(USER_DIR)/ir_Samsung.cpp $(USER_DIR)/ir_Samsung.h $(COMMON_DEPS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Samsung.cpp
ir_Kelvinator.o : $(USER_DIR)/ir_Kelvinator.cpp $(USER_DIR)/ir_Kelvinator.h $(COMMON_DEPS)
@@ -134,3 +155,42 @@ ir_Pronto.o : $(USER_DIR)/ir_Pronto.cpp $(GTEST_HEADERS)
ir_Nikai.o : $(USER_DIR)/ir_Nikai.cpp $(GTEST_HEADERS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Nikai.cpp
+
+ir_Toshiba.o : $(USER_DIR)/ir_Toshiba.h $(USER_DIR)/ir_Toshiba.cpp $(COMMON_DEPS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Toshiba.cpp
+
+ir_Midea.o : $(USER_DIR)/ir_Midea.cpp $(COMMON_DEPS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Midea.cpp
+
+ir_Magiquest.o : $(USER_DIR)/ir_Magiquest.cpp $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Magiquest.cpp
+
+ir_Lasertag.o : $(USER_DIR)/ir_Lasertag.cpp $(USER_DIR)/ir_RC5_RC6.cpp $(COMMON_DEPS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Lasertag.cpp
+
+ir_Carrier.o : $(USER_DIR)/ir_Carrier.cpp $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Carrier.cpp
+
+ir_Haier.o : $(USER_DIR)/ir_Haier.cpp $(USER_DIR)/ir_Haier.h $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Haier.cpp
+
+ir_Hitachi.o : $(USER_DIR)/ir_Hitachi.cpp $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Hitachi.cpp
+
+ir_GICable.o : $(USER_DIR)/ir_GICable.cpp $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_GICable.cpp
+
+ir_Whirlpool.o : $(USER_DIR)/ir_Whirlpool.cpp $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Whirlpool.cpp
+
+ir_Lutron.o : $(USER_DIR)/ir_Lutron.cpp $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Lutron.cpp
+
+ir_Electra.o : $(USER_DIR)/ir_Electra.cpp $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Electra.cpp
+
+ir_Pioneer.o : $(USER_DIR)/ir_Pioneer.cpp $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_Pioneer.cpp
+
+ir_MWM.o : $(USER_DIR)/ir_MWM.cpp $(USER_DIR)/ir_RC5_RC6.cpp $(COMMON_DEPS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_MWM.cpp
diff --git a/lib/IRremoteESP8266-2.5.2.03/tools/RawToGlobalCache.sh b/lib/IRremoteESP8266-2.5.2.03/tools/RawToGlobalCache.sh
new file mode 100644
index 000000000000..e0b0ebe35f58
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/tools/RawToGlobalCache.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+# Convert IRremoteESP8266's rawData output into Global Cache format.
+
+function isDigits()
+{
+ [[ "$1" =~ ^[0-9]+$ ]]
+}
+
+function usage()
+{
+cat << EOF
+Usage: $0 Frequency_in_Hz
+ Reads an IRremoteESP8266 rawData declaration from STDIN and converts it to
+ GlobalCache format.
+ e.g.
+ uint16_t rawbuf[37] = {
+ 7930, 3952, 494, 1482, 520, 1482, 494, 1508,
+ 494, 520, 494, 1482, 494, 520, 494, 1482,
+ 494, 1482, 494, 3978, 494, 520, 494, 520,
+ 494, 520, 494, 520, 520, 520, 494, 520,
+ 494, 520, 494, 520, 494};
+EOF
+ exit 1
+}
+
+# We need a frequency argument.
+if [[ $# -ne 1 ]]; then
+ usage
+fi
+HZ="$1"
+# HZ must be a positive number
+if ! isDigits "${HZ}"; then
+ usage
+fi
+# HZ must not be zero.
+if [[ ${HZ} == 0 ]]; then
+ usage
+fi
+
+
+PERIOD_OFFSET=0
+period=$((((1000000 + (${HZ} / 2)) / ${HZ}) + ${PERIOD_OFFSET}))
+result="${HZ},1,1"
+while read line; do
+ # Quick and Dirty Removal of any array declaration syntax, and any commas.
+ line="$(echo ${line} | sed 's/uint.*{//i' | sed 's/,//g' | sed 's/};.*//g')"
+ for msecs in ${line}; do
+ if isDigits "${msecs}"; then
+ result="${result},$((${msecs} / ${period}))"
+ fi
+ done
+done
+echo "GlobalCache code = \"${result}\""
diff --git a/lib/IRremoteESP8266-2.5.2.03/tools/auto_analyse_raw_data.py b/lib/IRremoteESP8266-2.5.2.03/tools/auto_analyse_raw_data.py
new file mode 100644
index 000000000000..5fd399807a60
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/tools/auto_analyse_raw_data.py
@@ -0,0 +1,432 @@
+#!/usr/bin/python
+"""Attempt an automatic analysis of IRremoteESP8266's Raw data output.
+ Makes suggestions on key values and tried to break down the message
+ into likely chunks."""
+#
+# Copyright 2018 David Conran
+import argparse
+import sys
+
+
+class RawIRMessage(object):
+ """Basic analyse functions & structure for raw IR messages."""
+
+ # pylint: disable=too-many-instance-attributes
+
+ def __init__(self, margin, timings, output=sys.stdout, verbose=True):
+ self.hdr_mark = None
+ self.hdr_space = None
+ self.bit_mark = None
+ self.zero_space = None
+ self.one_space = None
+ self.gaps = []
+ self.margin = margin
+ self.marks = []
+ self.mark_buckets = {}
+ self.spaces = []
+ self.space_buckets = {}
+ self.output = output
+ self.verbose = verbose
+ if len(timings) <= 3:
+ raise ValueError("Too few message timings supplied.")
+ self.timings = timings
+ self._generate_timing_candidates()
+ self._calc_values()
+
+ def _generate_timing_candidates(self):
+ """Determine the likely values from the given data."""
+ count = 0
+ for usecs in self.timings:
+ count = count + 1
+ if count % 2:
+ self.marks.append(usecs)
+ else:
+ self.spaces.append(usecs)
+ self.marks, self.mark_buckets = self.reduce_list(self.marks)
+ self.spaces, self.space_buckets = self.reduce_list(self.spaces)
+
+ def reduce_list(self, items):
+ """Reduce a list of numbers into buckets that are at least margin apart."""
+ result = []
+ last = -1
+ buckets = {}
+ for item in sorted(items, reverse=True):
+ if last == -1 or item < last - self.margin:
+ result.append(item)
+ last = item
+ buckets[last] = [item]
+ else:
+ buckets[last].append(item)
+ return result, buckets
+
+ def _usec_compare(self, seen, expected):
+ """Compare two usec values and see if they match within a
+ subtractive margin."""
+ return seen <= expected and seen > expected - self.margin
+
+ def _usec_compares(self, usecs, expecteds):
+ """Compare a usec value to a list of values and return True
+ if they are within a subtractive margin."""
+ for expected in expecteds:
+ if self._usec_compare(usecs, expected):
+ return True
+ return False
+
+ def display_binary(self, binary_str):
+ """Display common representations of the suppied binary string."""
+ num = int(binary_str, 2)
+ bits = len(binary_str)
+ rev_binary_str = binary_str[::-1]
+ rev_num = int(rev_binary_str, 2)
+ self.output.write("\n Bits: %d\n"
+ " Hex: %s (MSB first)\n"
+ " %s (LSB first)\n"
+ " Dec: %s (MSB first)\n"
+ " %s (LSB first)\n"
+ " Bin: 0b%s (MSB first)\n"
+ " 0b%s (LSB first)\n" %
+ (bits, "0x{0:0{1}X}".format(num, bits / 4),
+ "0x{0:0{1}X}".format(rev_num, bits / 4), num, rev_num,
+ binary_str, rev_binary_str))
+
+ def add_data_code(self, bin_str, footer=True):
+ """Add the common "data" sequence of code to send the bulk of a message."""
+ # pylint: disable=no-self-use
+ code = []
+ code.append(" // Data")
+ code.append(" // e.g. data = 0x%X, nbits = %d" % (int(bin_str, 2),
+ len(bin_str)))
+ code.append(" sendData(kBitMark, kOneSpace, kBitMark, kZeroSpace, data, "
+ "nbits, true);")
+ if footer:
+ code.append(" // Footer")
+ code.append(" mark(kBitMark);")
+ return code
+
+ def _calc_values(self):
+ """Calculate the values which describe the standard timings
+ for the protocol."""
+ if self.verbose:
+ self.output.write("Potential Mark Candidates:\n"
+ "%s\n"
+ "Potential Space Candidates:\n"
+ "%s\n" % (str(self.marks), str(self.spaces)))
+ # Largest mark is likely the kHdrMark
+ self.hdr_mark = self.marks[0]
+ # The bit mark is likely to be the smallest mark.
+ self.bit_mark = self.marks[-1]
+
+ if self.is_space_encoded() and len(self.spaces) >= 3:
+ if self.verbose and len(self.marks) > 2:
+ self.output.write("DANGER: Unexpected and unused mark timings!")
+ # We should have 3 space candidates at least.
+ # They should be: zero_space (smallest), one_space, & hdr_space (largest)
+ spaces = list(self.spaces)
+ self.zero_space = spaces.pop()
+ self.one_space = spaces.pop()
+ self.hdr_space = spaces.pop()
+ # Rest are probably message gaps
+ self.gaps = spaces
+
+ def is_space_encoded(self):
+ """Make an educated guess if the message is space encoded."""
+ return len(self.spaces) > len(self.marks)
+
+ def is_hdr_mark(self, usec):
+ """Is usec the header mark?"""
+ return self._usec_compare(usec, self.hdr_mark)
+
+ def is_hdr_space(self, usec):
+ """Is usec the header space?"""
+ return self._usec_compare(usec, self.hdr_space)
+
+ def is_bit_mark(self, usec):
+ """Is usec the bit mark?"""
+ return self._usec_compare(usec, self.bit_mark)
+
+ def is_one_space(self, usec):
+ """Is usec the one space?"""
+ return self._usec_compare(usec, self.one_space)
+
+ def is_zero_space(self, usec):
+ """Is usec the zero_space?"""
+ return self._usec_compare(usec, self.zero_space)
+
+ def is_gap(self, usec):
+ """Is usec the a space gap?"""
+ return self._usec_compares(usec, self.gaps)
+
+
+def avg_list(items):
+ """Return the average of a list of numbers."""
+ if items:
+ return sum(items) / len(items)
+ return 0
+
+
+def add_bit(so_far, bit, output=sys.stdout):
+ """Add a bit to the end of the bits collected so far."""
+ if bit == "reset":
+ return ""
+ output.write(str(bit)) # This effectively displays in LSB first order.
+ return so_far + str(bit) # Storing it in MSB first order.
+
+
+def convert_rawdata(data_str):
+ """Parse a C++ rawdata declaration into a list of values."""
+ start = data_str.find('{')
+ end = data_str.find('}')
+ if end == -1:
+ end = len(data_str)
+ if start > end:
+ raise ValueError("Raw Data not parsible due to parentheses placement.")
+ data_str = data_str[start + 1:end]
+ results = []
+ for timing in [x.strip() for x in data_str.split(',')]:
+ try:
+ results.append(int(timing))
+ except ValueError:
+ raise ValueError(
+ "Raw Data contains a non-numeric value of '%s'." % timing)
+ return results
+
+
+def dump_constants(message, defines, output=sys.stdout):
+ """Dump the key constants and generate the C++ #defines."""
+ hdr_mark = avg_list(message.mark_buckets[message.hdr_mark])
+ bit_mark = avg_list(message.mark_buckets[message.bit_mark])
+ hdr_space = avg_list(message.space_buckets[message.hdr_space])
+ one_space = avg_list(message.space_buckets[message.one_space])
+ zero_space = avg_list(message.space_buckets[message.zero_space])
+
+ output.write("Guessing key value:\n"
+ "kHdrMark = %d\n"
+ "kHdrSpace = %d\n"
+ "kBitMark = %d\n"
+ "kOneSpace = %d\n"
+ "kZeroSpace = %d\n" % (hdr_mark, hdr_space, bit_mark, one_space,
+ zero_space))
+ defines.append("const uint16_t kHdrMark = %d;" % hdr_mark)
+ defines.append("const uint16_t kBitMark = %d;" % bit_mark)
+ defines.append("const uint16_t kHdrSpace = %d;" % hdr_space)
+ defines.append("const uint16_t kOneSpace = %d;" % one_space)
+ defines.append("const uint16_t kZeroSpace = %d;" % zero_space)
+
+ avg_gaps = [avg_list(message.space_buckets[x]) for x in message.gaps]
+ if len(message.gaps) == 1:
+ output.write("kSpaceGap = %d\n" % avg_gaps[0])
+ defines.append("const uint16_t kSpaceGap = %d;" % avg_gaps[0])
+ else:
+ count = 0
+ for gap in avg_gaps:
+ # We probably (still) have a gap in the protocol.
+ count = count + 1
+ output.write("kSpaceGap%d = %d\n" % (count, gap))
+ defines.append("const uint16_t kSpaceGap%d = %d;" % (count, gap))
+
+
+def parse_and_report(rawdata_str, margin, gen_code=False, output=sys.stdout):
+ """Analyse the rawdata c++ definition of a IR message."""
+ defines = []
+ function_code = []
+
+ # Parse the input.
+ rawdata = convert_rawdata(rawdata_str)
+
+ output.write("Found %d timing entries.\n" % len(rawdata))
+
+ message = RawIRMessage(margin, rawdata, output)
+ output.write("\nGuessing encoding type:\n")
+ if message.is_space_encoded():
+ output.write("Looks like it uses space encoding. Yay!\n\n")
+ dump_constants(message, defines, output)
+ else:
+ output.write("Sorry, it looks like it is Mark encoded. "
+ "I can't do that yet. Exiting.\n")
+ sys.exit(1)
+ total_bits = decode_data(message, defines, function_code, output)
+ if gen_code:
+ generate_irsend_code(defines, function_code, total_bits, output)
+
+
+def decode_data(message, defines, function_code, output=sys.stdout):
+ """Decode the data sequence with the given values in mind."""
+ # pylint: disable=too-many-branches,too-many-statements
+
+ # Now we have likely candidates for the key values, go through the original
+ # sequence and break it up and indicate accordingly.
+
+ output.write("\nDecoding protocol based on analysis so far:\n\n")
+ state = ""
+ count = 1
+ total_bits = ""
+ binary_value = add_bit("", "reset")
+
+ function_code.extend([
+ "// Function should be safe up to 64 bits.",
+ "void IRsend::sendXyz(const uint64_t data, const uint16_t"
+ " nbits, const uint16_t repeat) {",
+ " enableIROut(38); // A guess. Most common frequency.",
+ " for (uint16_t r = 0; r <= repeat; r++) {"
+ ])
+
+ for usec in message.timings:
+ if (message.is_hdr_mark(usec) and count % 2 and
+ not message.is_bit_mark(usec)):
+ state = "HM"
+ if binary_value:
+ message.display_binary(binary_value)
+ function_code.extend(message.add_data_code(binary_value, False))
+ total_bits = total_bits + binary_value
+ binary_value = add_bit(binary_value, "reset")
+ output.write("kHdrMark+")
+ function_code.extend([" // Header", " mark(kHdrMark);"])
+ elif message.is_hdr_space(usec) and not message.is_one_space(usec):
+ if state != "HM":
+ if binary_value:
+ message.display_binary(binary_value)
+ total_bits = total_bits + binary_value
+ function_code.extend(message.add_data_code(binary_value))
+ binary_value = add_bit(binary_value, "reset")
+ output.write("UNEXPECTED->")
+ state = "HS"
+ output.write("kHdrSpace+")
+ function_code.append(" space(kHdrSpace);")
+ elif message.is_bit_mark(usec) and count % 2:
+ if state != "HS" and state != "BS":
+ output.write("kBitMark(UNEXPECTED)")
+ state = "BM"
+ elif message.is_zero_space(usec):
+ if state != "BM":
+ output.write("kZeroSpace(UNEXPECTED)")
+ state = "BS"
+ binary_value = add_bit(binary_value, 0, output)
+ elif message.is_one_space(usec):
+ if state != "BM":
+ output.write("kOneSpace(UNEXPECTED)")
+ state = "BS"
+ binary_value = add_bit(binary_value, 1, output)
+ elif message.is_gap(usec):
+ if state != "BM":
+ output.write("UNEXPECTED->")
+ state = "GS"
+ output.write("GAP(%d)" % usec)
+ if binary_value:
+ message.display_binary(binary_value)
+ function_code.extend(message.add_data_code(binary_value))
+ else:
+ function_code.extend([" // Gap", " mark(kBitMark);"])
+ function_code.append(" space(kSpaceGap);")
+ total_bits = total_bits + binary_value
+ binary_value = add_bit(binary_value, "reset")
+ else:
+ output.write("UNKNOWN(%d)" % usec)
+ state = "UNK"
+ count = count + 1
+ if binary_value:
+ message.display_binary(binary_value)
+ function_code.extend(message.add_data_code(binary_value))
+ function_code.extend([
+ " space(100000); // A 100% made up guess of the gap"
+ " between messages.", " }", "}"
+ ])
+
+ total_bits = total_bits + binary_value
+ output.write("\nTotal Nr. of suspected bits: %d\n" % len(total_bits))
+ defines.append("const uint16_t kXyzBits = %d;" % len(total_bits))
+ if len(total_bits) > 64:
+ defines.append("const uint16_t kXyzStateLength = %d;" %
+ (len(total_bits) / 8))
+ return total_bits
+
+
+def generate_irsend_code(defines, normal, bits_str, output=sys.stdout):
+ """Output the estimated C++ code to reproduce the IR message."""
+ output.write("\nGenerating a VERY rough code outline:\n\n"
+ "// WARNING: This probably isn't directly usable."
+ " It's a guide only.\n")
+ for line in defines:
+ output.write("%s\n" % line)
+
+ if len(bits_str) > 64: # Will it fit in a uint64_t?
+ output.write("// DANGER: More than 64 bits detected. A uint64_t for "
+ "'data' won't work!\n")
+ # Display the "normal" version's code incase there are some
+ # oddities in it.
+ for line in normal:
+ output.write("%s\n" % line)
+
+ if len(bits_str) > 64: # Will it fit in a uint64_t?
+ output.write("\n\n// Alternative >64 bit Function\n"
+ "void IRsend::sendXyz(uint8_t data[], uint16_t nbytes,"
+ " uint16_t repeat) {\n"
+ " // nbytes should typically be kXyzStateLength\n"
+ " // data should typically be:\n"
+ " // uint8_t data[kXyzStateLength] = {0x%s};\n"
+ " // data[] is assumed to be in MSB order for this code.\n"
+ " for (uint16_t r = 0; r <= repeat; r++) {\n"
+ " sendGeneric(kHdrMark, kHdrSpace,\n"
+ " kBitMark, kOneSpace,\n"
+ " kBitMark, kZeroSpace,\n"
+ " kBitMark,\n"
+ " 100000, // 100%% made-up guess at the"
+ " message gap.\n"
+ " data, nbytes,\n"
+ " 38000, // Complete guess of the modulation"
+ " frequency.\n"
+ " true, 0, 50);\n"
+ " }\n"
+ "}\n" % ", 0x".join("%02X" % int(bits_str[i:i + 8], 2)
+ for i in range(0, len(bits_str), 8)))
+
+
+def main():
+ """Parse the commandline arguments and call the method."""
+ arg_parser = argparse.ArgumentParser(
+ description="Read an IRremoteESP8266 rawData declaration and tries to "
+ "analyse it.",
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter)
+ arg_parser.add_argument(
+ "-g",
+ "--code",
+ action="store_true",
+ default=False,
+ dest="gen_code",
+ help="Generate a C++ code outline to aid making an IRsend function.")
+ arg_group = arg_parser.add_mutually_exclusive_group(required=True)
+ arg_group.add_argument(
+ "rawdata",
+ help="A rawData line from IRrecvDumpV2. e.g. 'uint16_t rawbuf[37] = {"
+ "7930, 3952, 494, 1482, 520, 1482, 494, 1508, 494, 520, 494, 1482, 494, "
+ "520, 494, 1482, 494, 1482, 494, 3978, 494, 520, 494, 520, 494, 520, "
+ "494, 520, 520, 520, 494, 520, 494, 520, 494, 520, 494};'",
+ nargs="?")
+ arg_group.add_argument(
+ "-f", "--file", help="Read in a rawData line from the file.")
+ arg_parser.add_argument(
+ "-r",
+ "--range",
+ type=int,
+ help="Max number of micro-seconds difference between values to consider"
+ " it the same value.",
+ dest="margin",
+ default=200)
+ arg_group.add_argument(
+ "--stdin",
+ help="Read in a rawData line from STDIN.",
+ action="store_true",
+ default=False)
+ arg_options = arg_parser.parse_args()
+
+ if arg_options.stdin:
+ data = sys.stdin.read()
+ elif arg_options.file:
+ with open(arg_options.file) as input_file:
+ data = input_file.read()
+ else:
+ data = arg_options.rawdata
+ parse_and_report(data, arg_options.margin, arg_options.gen_code)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/lib/IRremoteESP8266-2.5.2.03/tools/auto_analyse_raw_data_test.py b/lib/IRremoteESP8266-2.5.2.03/tools/auto_analyse_raw_data_test.py
new file mode 100644
index 000000000000..681ff5520cf7
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/tools/auto_analyse_raw_data_test.py
@@ -0,0 +1,492 @@
+#!/usr/bin/python
+"""Unit tests for auto_analyse_raw_data.py"""
+import StringIO
+import unittest
+import auto_analyse_raw_data as analyse
+
+
+class TestRawIRMessage(unittest.TestCase):
+ """Unit tests for the RawIRMessage class."""
+
+ # pylint: disable=too-many-public-methods
+
+ def test_display_binary(self):
+ """Test the display_binary() method."""
+ output = StringIO.StringIO()
+ message = analyse.RawIRMessage(100, [8000, 4000, 500, 500, 500], output,
+ False)
+ self.assertEqual(output.getvalue(), '')
+ message.display_binary("10101010")
+ message.display_binary("0000000000000000")
+ message.display_binary("00010010001101000101011001111000")
+ self.assertEqual(output.getvalue(), '\n'
+ ' Bits: 8\n'
+ ' Hex: 0xAA (MSB first)\n'
+ ' 0x55 (LSB first)\n'
+ ' Dec: 170 (MSB first)\n'
+ ' 85 (LSB first)\n'
+ ' Bin: 0b10101010 (MSB first)\n'
+ ' 0b01010101 (LSB first)\n'
+ '\n'
+ ' Bits: 16\n'
+ ' Hex: 0x0000 (MSB first)\n'
+ ' 0x0000 (LSB first)\n'
+ ' Dec: 0 (MSB first)\n'
+ ' 0 (LSB first)\n'
+ ' Bin: 0b0000000000000000 (MSB first)\n'
+ ' 0b0000000000000000 (LSB first)\n'
+ '\n'
+ ' Bits: 32\n'
+ ' Hex: 0x12345678 (MSB first)\n'
+ ' 0x1E6A2C48 (LSB first)\n'
+ ' Dec: 305419896 (MSB first)\n'
+ ' 510274632 (LSB first)\n'
+ ' Bin: 0b00010010001101000101011001111000 (MSB first)\n'
+ ' 0b00011110011010100010110001001000 (LSB first)\n')
+
+
+class TestAutoAnalyseRawData(unittest.TestCase):
+ """Unit tests for the functions in AutoAnalyseRawData."""
+
+ # pylint: disable=too-many-public-methods
+
+ def test_dump_constants_simple(self):
+ """Simple tests for the dump_constants() function."""
+ ignore = StringIO.StringIO()
+ output = StringIO.StringIO()
+ defs = []
+ message = analyse.RawIRMessage(200, [
+ 7930, 3952, 494, 1482, 520, 1482, 494, 1508, 494, 520, 494, 1482, 494,
+ 520, 494, 1482, 494, 1482, 494, 3978, 494, 520, 494, 520, 494, 520, 494,
+ 520, 520, 520, 494, 520, 494, 520, 494, 1482, 494
+ ], ignore)
+ analyse.dump_constants(message, defs, output)
+ self.assertEqual(defs, [
+ 'const uint16_t kHdrMark = 7930;', 'const uint16_t kBitMark = 496;',
+ 'const uint16_t kHdrSpace = 3965;', 'const uint16_t kOneSpace = 1485;',
+ 'const uint16_t kZeroSpace = 520;'
+ ])
+ self.assertEqual(output.getvalue(), 'Guessing key value:\n'
+ 'kHdrMark = 7930\n'
+ 'kHdrSpace = 3965\n'
+ 'kBitMark = 496\n'
+ 'kOneSpace = 1485\n'
+ 'kZeroSpace = 520\n')
+
+ def test_dump_constants_aircon(self):
+ """More complex tests for the dump_constants() function."""
+ ignore = StringIO.StringIO()
+ output = StringIO.StringIO()
+ defs = []
+ message = analyse.RawIRMessage(200, [
+ 9008, 4496, 644, 1660, 676, 530, 648, 558, 672, 1636, 646, 1660, 644,
+ 556, 650, 584, 626, 560, 644, 580, 628, 1680, 624, 560, 648, 1662, 644,
+ 582, 648, 536, 674, 530, 646, 580, 628, 560, 670, 532, 646, 562, 644,
+ 556, 672, 536, 648, 1662, 646, 1660, 652, 554, 644, 558, 672, 538, 644,
+ 560, 668, 560, 648, 1638, 668, 536, 644, 1660, 668, 532, 648, 560, 648,
+ 1660, 674, 554, 622, 19990, 646, 580, 624, 1660, 648, 556, 648, 558,
+ 674, 556, 622, 560, 644, 564, 668, 536, 646, 1662, 646, 1658, 672, 534,
+ 648, 558, 644, 562, 648, 1662, 644, 584, 622, 558, 648, 562, 668, 534,
+ 670, 536, 670, 532, 672, 536, 646, 560, 646, 558, 648, 558, 670, 534,
+ 650, 558, 646, 560, 646, 560, 668, 1638, 646, 1662, 646, 1660, 646,
+ 1660, 648
+ ], ignore)
+ analyse.dump_constants(message, defs, output)
+ self.assertEqual(defs, [
+ 'const uint16_t kHdrMark = 9008;', 'const uint16_t kBitMark = 650;',
+ 'const uint16_t kHdrSpace = 4496;', 'const uint16_t kOneSpace = 1657;',
+ 'const uint16_t kZeroSpace = 554;', 'const uint16_t kSpaceGap = 19990;'
+ ])
+ self.assertEqual(output.getvalue(), 'Guessing key value:\n'
+ 'kHdrMark = 9008\n'
+ 'kHdrSpace = 4496\n'
+ 'kBitMark = 650\n'
+ 'kOneSpace = 1657\n'
+ 'kZeroSpace = 554\n'
+ 'kSpaceGap = 19990\n')
+
+ def test_convert_rawdata(self):
+ """Tests for the convert_rawdata() function."""
+ # trivial cases
+ self.assertEqual(analyse.convert_rawdata("0"), [0])
+ with self.assertRaises(ValueError) as context:
+ analyse.convert_rawdata("")
+ self.assertEqual(context.exception.message,
+ "Raw Data contains a non-numeric value of ''.")
+
+ # Single parenthesis
+ self.assertEqual(analyse.convert_rawdata("foo {10"), [10])
+ self.assertEqual(analyse.convert_rawdata("20} bar"), [20])
+
+ # No parentheses
+ self.assertEqual(analyse.convert_rawdata("10,20 , 30"), [10, 20, 30])
+
+ # Dual parentheses
+ self.assertEqual(analyse.convert_rawdata("{10,20 , 30}"), [10, 20, 30])
+ self.assertEqual(analyse.convert_rawdata("foo{10,20}bar"), [10, 20])
+
+ # Many parentheses
+ self.assertEqual(analyse.convert_rawdata("foo{10,20}{bar}"), [10, 20])
+ self.assertEqual(analyse.convert_rawdata("foo{10,20}{bar}}{"), [10, 20])
+
+ # Bad parentheses
+ with self.assertRaises(ValueError) as context:
+ analyse.convert_rawdata("}10{")
+ self.assertEqual(context.exception.message,
+ "Raw Data not parsible due to parentheses placement.")
+
+ # Non base-10 values
+ with self.assertRaises(ValueError) as context:
+ analyse.convert_rawdata("10, 20, foo, bar, 30")
+ self.assertEqual(context.exception.message,
+ "Raw Data contains a non-numeric value of 'foo'.")
+
+ # A messy usual "good" case.
+ input_str = """uint16_t rawbuf[6] = {
+ 9008, 4496, 644,
+ 1660, 676,
+
+ 530}
+ ;"""
+ self.assertEqual(
+ analyse.convert_rawdata(input_str), [9008, 4496, 644, 1660, 676, 530])
+
+ def test_parse_and_report(self):
+ """Tests for the parse_and_report() function."""
+
+ # Without code generation.
+ output = StringIO.StringIO()
+ input_str = """
+ uint16_t rawbuf[139] = {9008, 4496, 644, 1660, 676, 530, 648, 558, 672,
+ 1636, 646, 1660, 644, 556, 650, 584, 626, 560, 644, 580, 628, 1680,
+ 624, 560, 648, 1662, 644, 582, 648, 536, 674, 530, 646, 580, 628,
+ 560, 670, 532, 646, 562, 644, 556, 672, 536, 648, 1662, 646, 1660,
+ 652, 554, 644, 558, 672, 538, 644, 560, 668, 560, 648, 1638, 668,
+ 536, 644, 1660, 668, 532, 648, 560, 648, 1660, 674, 554, 622, 19990,
+ 646, 580, 624, 1660, 648, 556, 648, 558, 674, 556, 622, 560, 644,
+ 564, 668, 536, 646, 1662, 646, 1658, 672, 534, 648, 558, 644, 562,
+ 648, 1662, 644, 584, 622, 558, 648, 562, 668, 534, 670, 536, 670,
+ 532, 672, 536, 646, 560, 646, 558, 648, 558, 670, 534, 650, 558,
+ 646, 560, 646, 560, 668, 1638, 646, 1662, 646, 1660, 646, 1660,
+ 648};"""
+ analyse.parse_and_report(input_str, 200, False, output)
+ self.assertEqual(
+ output.getvalue(), 'Found 139 timing entries.\n'
+ 'Potential Mark Candidates:\n'
+ '[9008, 676]\n'
+ 'Potential Space Candidates:\n'
+ '[19990, 4496, 1680, 584]\n'
+ '\n'
+ 'Guessing encoding type:\n'
+ 'Looks like it uses space encoding. Yay!\n'
+ '\n'
+ 'Guessing key value:\n'
+ 'kHdrMark = 9008\n'
+ 'kHdrSpace = 4496\n'
+ 'kBitMark = 650\n'
+ 'kOneSpace = 1657\n'
+ 'kZeroSpace = 554\n'
+ 'kSpaceGap = 19990\n'
+ '\n'
+ 'Decoding protocol based on analysis so far:\n'
+ '\n'
+ 'kHdrMark+kHdrSpace+10011000010100000000011000001010010GAP(19990)\n'
+ ' Bits: 35\n'
+ ' Hex: 0x4C2803052 (MSB first)\n'
+ ' 0x250600A19 (LSB first)\n'
+ ' Dec: 20443050066 (MSB first)\n'
+ ' 9938405913 (LSB first)\n'
+ ' Bin: 0b10011000010100000000011000001010010 (MSB first)\n'
+ ' 0b01001010000011000000000101000011001 (LSB first)\n'
+ 'kBitMark(UNEXPECTED)01000000110001000000000000001111\n'
+ ' Bits: 32\n'
+ ' Hex: 0x40C4000F (MSB first)\n'
+ ' 0xF0002302 (LSB first)\n'
+ ' Dec: 1086586895 (MSB first)\n'
+ ' 4026540802 (LSB first)\n'
+ ' Bin: 0b01000000110001000000000000001111 (MSB first)\n'
+ ' 0b11110000000000000010001100000010 (LSB first)\n'
+ '\n'
+ 'Total Nr. of suspected bits: 67\n')
+
+ # With code generation.
+ output = StringIO.StringIO()
+ input_str = """
+ uint16_t rawbuf[37] = {7930, 3952, 494, 1482, 520, 1482, 494,
+ 1508, 494, 520, 494, 1482, 494, 520, 494, 1482, 494, 1482, 494,
+ 3978, 494, 520, 494, 520, 494, 520, 494, 520, 520, 520, 494, 520,
+ 494, 520, 494, 1482, 494};"""
+ analyse.parse_and_report(input_str, 200, True, output)
+ self.assertEqual(
+ output.getvalue(), 'Found 37 timing entries.\n'
+ 'Potential Mark Candidates:\n'
+ '[7930, 520]\n'
+ 'Potential Space Candidates:\n'
+ '[3978, 1508, 520]\n'
+ '\n'
+ 'Guessing encoding type:\n'
+ 'Looks like it uses space encoding. Yay!\n'
+ '\n'
+ 'Guessing key value:\n'
+ 'kHdrMark = 7930\n'
+ 'kHdrSpace = 3965\n'
+ 'kBitMark = 496\n'
+ 'kOneSpace = 1485\n'
+ 'kZeroSpace = 520\n'
+ '\n'
+ 'Decoding protocol based on analysis so far:\n'
+ '\n'
+ 'kHdrMark+kHdrSpace+11101011\n'
+ ' Bits: 8\n'
+ ' Hex: 0xEB (MSB first)\n'
+ ' 0xD7 (LSB first)\n'
+ ' Dec: 235 (MSB first)\n'
+ ' 215 (LSB first)\n'
+ ' Bin: 0b11101011 (MSB first)\n'
+ ' 0b11010111 (LSB first)\n'
+ 'UNEXPECTED->kHdrSpace+00000001\n'
+ ' Bits: 8\n'
+ ' Hex: 0x01 (MSB first)\n'
+ ' 0x80 (LSB first)\n'
+ ' Dec: 1 (MSB first)\n'
+ ' 128 (LSB first)\n'
+ ' Bin: 0b00000001 (MSB first)\n'
+ ' 0b10000000 (LSB first)\n'
+ '\n'
+ 'Total Nr. of suspected bits: 16\n'
+ '\n'
+ 'Generating a VERY rough code outline:\n'
+ '\n'
+ "// WARNING: This probably isn't directly usable. It's a guide only.\n"
+ 'const uint16_t kHdrMark = 7930;\n'
+ 'const uint16_t kBitMark = 496;\n'
+ 'const uint16_t kHdrSpace = 3965;\n'
+ 'const uint16_t kOneSpace = 1485;\n'
+ 'const uint16_t kZeroSpace = 520;\n'
+ 'const uint16_t kXyzBits = 16;\n'
+ '// Function should be safe up to 64 bits.\n'
+ 'void IRsend::sendXyz(const uint64_t data, const uint16_t nbits,'
+ ' const uint16_t repeat) {\n'
+ ' enableIROut(38); // A guess. Most common frequency.\n'
+ ' for (uint16_t r = 0; r <= repeat; r++) {\n'
+ ' // Header\n'
+ ' mark(kHdrMark);\n'
+ ' space(kHdrSpace);\n'
+ ' // Data\n'
+ ' // e.g. data = 0xEB, nbits = 8\n'
+ ' sendData(kBitMark, kOneSpace, kBitMark, kZeroSpace, data, nbits,'
+ ' true);\n'
+ ' // Footer\n'
+ ' mark(kBitMark);\n'
+ ' space(kHdrSpace);\n'
+ ' // Data\n'
+ ' // e.g. data = 0x1, nbits = 8\n'
+ ' sendData(kBitMark, kOneSpace, kBitMark, kZeroSpace, data, nbits,'
+ ' true);\n'
+ ' // Footer\n'
+ ' mark(kBitMark);\n'
+ ' space(100000); // A 100% made up guess of the gap between'
+ ' messages.\n'
+ ' }\n'
+ '}\n')
+
+ def test_unusual_gaps(self):
+ """Tests for unusual Space Gaps in parse_and_report() function."""
+
+ # Tests for unusual Gaps. (Issue #482)
+ output = StringIO.StringIO()
+ input_str = """
+ uint16_t rawbuf[272] = {3485, 3512, 864, 864, 864, 2620, 864, 864,
+ 864, 2620, 864, 2620, 864, 2620, 864, 2620, 864, 2620, 864, 864,
+ 864, 2620, 864, 864, 864, 2620, 864, 2620, 864, 2620, 864, 2620,
+ 864, 2620, 864, 864, 864, 2620, 864, 864, 864, 864, 864, 864,
+ 864, 864, 864, 864, 864, 864, 864, 864, 864, 2620, 864, 864,
+ 864, 864, 864, 864, 864, 864, 864, 864, 864, 864,
+ 3485, 3512, 864, 864, 864, 2620, 864, 864, 864, 2620, 864, 2620,
+ 864, 2620, 864, 2620, 864, 2620, 864, 864, 864, 2620, 864, 864,
+ 864, 2620, 864, 2620, 864, 2620, 864, 2620, 864, 2620, 864, 864,
+ 864, 2620, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864,
+ 864, 864, 864, 864, 2620, 864, 864, 864, 864, 864, 864, 864, 864,
+ 864, 864, 864, 864,
+ 3485, 3512, 864, 13996,
+ 3485, 3512, 864, 864, 864, 864, 864, 2620, 864, 864, 864, 2620,
+ 864, 2620, 864, 2620, 864, 2620, 864, 864, 864, 864, 864, 2620,
+ 864, 864, 864, 2620, 864, 2620, 864, 2620, 864, 2620, 864, 864,
+ 864, 2620, 864, 2620, 864, 864, 864, 2620, 864, 2620, 864, 864,
+ 864, 864, 864, 864, 864, 2620, 864, 2620, 864, 864, 864, 2620,
+ 864, 2620, 864, 864, 864, 864,
+ 3485, 3512, 864, 864, 864, 864, 864, 2620, 864, 864, 864, 2620,
+ 864, 2620, 864, 2620, 864, 2620, 864, 864, 864, 864, 864, 2620,
+ 864, 864, 864, 2620, 864, 2620, 864, 2620, 864, 2620, 864, 864,
+ 864, 2620, 864, 2620, 864, 864, 864, 2620, 864, 2620, 864, 864,
+ 864, 864, 864, 864, 864, 2620, 864, 2620, 864, 864, 864, 2620,
+ 864, 2620, 864, 864, 864, 864, 3485, 3512, 864, 13996};"""
+ analyse.parse_and_report(input_str, 200, True, output)
+ self.assertEqual(
+ output.getvalue(), 'Found 272 timing entries.\n'
+ 'Potential Mark Candidates:\n'
+ '[3485, 864]\n'
+ 'Potential Space Candidates:\n'
+ '[13996, 3512, 2620, 864]\n'
+ '\n'
+ 'Guessing encoding type:\n'
+ 'Looks like it uses space encoding. Yay!\n'
+ '\n'
+ 'Guessing key value:\n'
+ 'kHdrMark = 3485\n'
+ 'kHdrSpace = 3512\n'
+ 'kBitMark = 864\n'
+ 'kOneSpace = 2620\n'
+ 'kZeroSpace = 864\n'
+ 'kSpaceGap = 13996\n'
+ '\n'
+ 'Decoding protocol based on analysis so far:\n'
+ '\n'
+ 'kHdrMark+kHdrSpace+01011111010111110100000001000000\n'
+ ' Bits: 32\n'
+ ' Hex: 0x5F5F4040 (MSB first)\n'
+ ' 0x0202FAFA (LSB first)\n'
+ ' Dec: 1600077888 (MSB first)\n'
+ ' 33749754 (LSB first)\n'
+ ' Bin: 0b01011111010111110100000001000000 (MSB first)\n'
+ ' 0b00000010000000101111101011111010 (LSB first)\n'
+ 'kHdrMark+kHdrSpace+01011111010111110100000001000000\n'
+ ' Bits: 32\n'
+ ' Hex: 0x5F5F4040 (MSB first)\n'
+ ' 0x0202FAFA (LSB first)\n'
+ ' Dec: 1600077888 (MSB first)\n'
+ ' 33749754 (LSB first)\n'
+ ' Bin: 0b01011111010111110100000001000000 (MSB first)\n'
+ ' 0b00000010000000101111101011111010 (LSB first)\n'
+ 'kHdrMark+kHdrSpace+GAP(13996)'
+ 'kHdrMark+kHdrSpace+00101111001011110110110001101100\n'
+ ' Bits: 32\n'
+ ' Hex: 0x2F2F6C6C (MSB first)\n'
+ ' 0x3636F4F4 (LSB first)\n'
+ ' Dec: 791637100 (MSB first)\n'
+ ' 909571316 (LSB first)\n'
+ ' Bin: 0b00101111001011110110110001101100 (MSB first)\n'
+ ' 0b00110110001101101111010011110100 (LSB first)\n'
+ 'kHdrMark+kHdrSpace+00101111001011110110110001101100\n'
+ ' Bits: 32\n'
+ ' Hex: 0x2F2F6C6C (MSB first)\n'
+ ' 0x3636F4F4 (LSB first)\n'
+ ' Dec: 791637100 (MSB first)\n'
+ ' 909571316 (LSB first)\n'
+ ' Bin: 0b00101111001011110110110001101100 (MSB first)\n'
+ ' 0b00110110001101101111010011110100 (LSB first)\n'
+ 'kHdrMark+kHdrSpace+GAP(13996)\n'
+ 'Total Nr. of suspected bits: 128\n'
+ '\n'
+ 'Generating a VERY rough code outline:\n'
+ '\n'
+ "// WARNING: This probably isn't directly usable. It's a guide only.\n"
+ 'const uint16_t kHdrMark = 3485;\n'
+ 'const uint16_t kBitMark = 864;\n'
+ 'const uint16_t kHdrSpace = 3512;\n'
+ 'const uint16_t kOneSpace = 2620;\n'
+ 'const uint16_t kZeroSpace = 864;\n'
+ 'const uint16_t kSpaceGap = 13996;\n'
+ 'const uint16_t kXyzBits = 128;\n'
+ 'const uint16_t kXyzStateLength = 16;\n'
+ "// DANGER: More than 64 bits detected. A uint64_t for 'data' won't"
+ ' work!\n'
+ '// Function should be safe up to 64 bits.\n'
+ 'void IRsend::sendXyz(const uint64_t data, const uint16_t nbits,'
+ ' const uint16_t repeat) {\n'
+ ' enableIROut(38); // A guess. Most common frequency.\n'
+ ' for (uint16_t r = 0; r <= repeat; r++) {\n'
+ ' // Header\n'
+ ' mark(kHdrMark);\n'
+ ' space(kHdrSpace);\n'
+ ' // Data\n'
+ ' // e.g. data = 0x5F5F4040, nbits = 32\n'
+ ' sendData(kBitMark, kOneSpace, kBitMark, kZeroSpace, data, nbits,'
+ ' true);\n'
+ ' // Header\n'
+ ' mark(kHdrMark);\n'
+ ' space(kHdrSpace);\n'
+ ' // Data\n'
+ ' // e.g. data = 0x5F5F4040, nbits = 32\n'
+ ' sendData(kBitMark, kOneSpace, kBitMark, kZeroSpace, data, nbits,'
+ ' true);\n'
+ ' // Header\n'
+ ' mark(kHdrMark);\n'
+ ' space(kHdrSpace);\n'
+ ' // Gap\n'
+ ' mark(kBitMark);\n'
+ ' space(kSpaceGap);\n'
+ ' // Header\n'
+ ' mark(kHdrMark);\n'
+ ' space(kHdrSpace);\n'
+ ' // Data\n'
+ ' // e.g. data = 0x2F2F6C6C, nbits = 32\n'
+ ' sendData(kBitMark, kOneSpace, kBitMark, kZeroSpace, data, nbits,'
+ ' true);\n'
+ ' // Header\n'
+ ' mark(kHdrMark);\n'
+ ' space(kHdrSpace);\n'
+ ' // Data\n'
+ ' // e.g. data = 0x2F2F6C6C, nbits = 32\n'
+ ' sendData(kBitMark, kOneSpace, kBitMark, kZeroSpace, data, nbits,'
+ ' true);\n'
+ ' // Header\n'
+ ' mark(kHdrMark);\n'
+ ' space(kHdrSpace);\n'
+ ' // Gap\n'
+ ' mark(kBitMark);\n'
+ ' space(kSpaceGap);\n'
+ ' space(100000); // A 100% made up guess of the gap between'
+ ' messages.\n'
+ ' }\n'
+ '}\n'
+ '\n'
+ '\n'
+ '// Alternative >64 bit Function\n'
+ 'void IRsend::sendXyz(uint8_t data[], uint16_t nbytes, uint16_t repeat)'
+ ' {\n'
+ ' // nbytes should typically be kXyzStateLength\n'
+ ' // data should typically be:\n'
+ ' // uint8_t data[kXyzStateLength] = {0x5F, 0x5F, 0x40, 0x40, 0x5F,'
+ ' 0x5F, 0x40, 0x40, 0x2F, 0x2F, 0x6C, 0x6C, 0x2F, 0x2F, 0x6C, 0x6C};\n'
+ ' // data[] is assumed to be in MSB order for this code.\n'
+ ' for (uint16_t r = 0; r <= repeat; r++) {\n'
+ ' sendGeneric(kHdrMark, kHdrSpace,\n'
+ ' kBitMark, kOneSpace,\n'
+ ' kBitMark, kZeroSpace,\n'
+ ' kBitMark,\n'
+ ' 100000, // 100% made-up guess at the message gap.\n'
+ ' data, nbytes,\n'
+ ' 38000, // Complete guess of the modulation'
+ ' frequency.\n'
+ ' true, 0, 50);\n'
+ ' }\n'
+ '}\n')
+
+ def test_reduce_list(self):
+ """Tests for the reduce_list method."""
+
+ ignore = StringIO.StringIO()
+ message = analyse.RawIRMessage(200, [
+ 7930, 3952, 494, 1482, 520, 1482, 494, 1508, 494, 520, 494, 1482, 494,
+ 520, 494, 1482, 494, 1482, 494, 3978, 494, 520, 494, 520, 494, 520, 494,
+ 520, 520, 520, 494, 520, 494, 520, 494, 1482, 494
+ ], ignore)
+ test_space_data = [4496, 1660, 530, 558, 1636, 1660, 556]
+ result_list, result_dict = message.reduce_list(test_space_data)
+ self.assertEqual([4496, 1660, 558], result_list)
+ self.assertEqual({
+ 558: [558, 556, 530],
+ 1660: [1660, 1660, 1636],
+ 4496: [4496]
+ }, result_dict)
+
+ def test_avg_list(self):
+ """Tests for the avg_list method."""
+
+ self.assertEqual(0, analyse.avg_list([]))
+ self.assertEqual(23, analyse.avg_list([10, 20, 40]))
+
+
+if __name__ == '__main__':
+ unittest.main(verbosity=2)
diff --git a/lib/IRremoteESP8266-2.5.2.03/tools/gc_decode.cpp b/lib/IRremoteESP8266-2.5.2.03/tools/gc_decode.cpp
new file mode 100644
index 000000000000..52ffd17b713b
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/tools/gc_decode.cpp
@@ -0,0 +1,109 @@
+// Quick and dirty tool to decode GlobalCache (GC) codes
+// and ProntoHex codes
+// Copyright 2017 Jorge Cisneros
+
+#include
+#include
+#include
+#include
+#include
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "IRutils.h"
+
+const uint16_t kMaxGcCodeLength = 10000;
+
+void str_to_uint16(char *str, uint16_t *res, uint8_t base) {
+ char *end;
+ errno = 0;
+ intmax_t val = strtoimax(str, &end, base);
+ if (errno == ERANGE || val < 0 || val > UINT16_MAX || end == str ||
+ *end != '\0')
+ return;
+ *res = (uint16_t)val;
+}
+
+void usage_error(char *name) {
+ std::cerr << "Usage: " << name << " [-raw] " << std::endl
+ << "Usage: " << name << " -prontohex [-raw] "
+ << std::endl;
+}
+
+int main(int argc, char *argv[]) {
+ int argv_offset = 1;
+ bool dumpraw = false;
+ bool prontohex = false;
+
+ // Check the invocation/calling usage.
+ if (argc < 2 || argc > 4) {
+ usage_error(argv[0]);
+ return 1;
+ }
+ if (strncmp("-prontohex", argv[argv_offset], 10) == 0) {
+ prontohex = true;
+ argv_offset++;
+ }
+
+ if (strncmp("-raw", argv[argv_offset], 4) == 0) {
+ dumpraw = true;
+ argv_offset++;
+ }
+ if (argc - argv_offset != 1) {
+ usage_error(argv[0]);
+ return 1;
+ }
+
+ uint16_t gc_test[kMaxGcCodeLength];
+ int index = 0;
+ char *pch;
+ char *saveptr1;
+ char *sep = const_cast(",");
+ int codebase = 10;
+
+ if (prontohex) {
+ sep = const_cast(" ");
+ codebase = 16;
+ }
+
+ pch = strtok_r(argv[argv_offset], sep, &saveptr1);
+ while (pch != NULL && index < kMaxGcCodeLength) {
+ str_to_uint16(pch, &gc_test[index], codebase);
+ pch = strtok_r(NULL, sep, &saveptr1);
+ index++;
+ }
+
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+ irsend.reset();
+
+ if (prontohex) {
+ irsend.sendPronto(gc_test, index);
+ } else {
+ irsend.sendGC(gc_test, index);
+ }
+ irsend.makeDecodeResult();
+ irrecv.decode(&irsend.capture);
+
+ std::cout << "Code length " << index << std::endl
+ << "Code type " << irsend.capture.decode_type << " ("
+ << typeToString(irsend.capture.decode_type) << ")" << std::endl
+ << "Code bits " << irsend.capture.bits << std::endl;
+ if (hasACState(irsend.capture.decode_type)) {
+ std::cout << "State value 0x";
+ for (uint16_t i = 0; i < irsend.capture.bits / 8; i++)
+ printf("%02X", irsend.capture.state[i]);
+ std::cout << std::endl;
+ } else {
+ std::cout << "Code value 0x" << std::hex << irsend.capture.value
+ << std::endl
+ << "Code address 0x" << std::hex << irsend.capture.address
+ << std::endl
+ << "Code command 0x" << std::hex << irsend.capture.command
+ << std::endl;
+ }
+
+ if (dumpraw || irsend.capture.decode_type == UNKNOWN) irsend.dumpRawResult();
+
+ return 0;
+}
diff --git a/lib/IRremoteESP8266-2.5.2.03/tools/mkkeywords b/lib/IRremoteESP8266-2.5.2.03/tools/mkkeywords
new file mode 100644
index 000000000000..a2cdccd9bea1
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/tools/mkkeywords
@@ -0,0 +1,82 @@
+#!/bin/bash
+# Generate a keywords.txt for the library that is suitable for the Arduino IDE.
+# Expects to run from the top directory of the library.
+
+# Set the locale for sorting
+export LC_ALL=C
+
+cat << EndOfTextEndOfTextEndOfText
+#########################################
+# Syntax Coloring Map For IRremoteESP8266
+#########################################
+
+################################################
+# WARNING: Do NOT edit this file directly.
+# It is generated by 'tools/mkkeywords'
+# e.g. tools/mkkeywords > keywords.txt
+################################################
+
+#######################################################
+# The Arduino IDE requires the use of a tab separator
+# between the name and identifier. Without this tab the
+# keyword is not highlighted.
+#
+# Reference: https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5:-Library-specification#keywords
+#######################################################
+
+#######################################
+# Datatypes & Classes (KEYWORD1)
+#######################################
+
+EndOfTextEndOfTextEndOfText
+
+CLASSES=$(grep "^class " src/*.h | cut -d' ' -f2 | sort -u)
+# Manually add typedefs as they are hard to parse out.
+CLASSES="${CLASSES} ir_params_t match_result_t"
+for i in ${CLASSES}; do
+ echo -e "${i}\tKEYWORD1"
+done | sort -du
+
+cat << EndOfTextEndOfTextEndOfText
+
+#######################################
+# Methods and Functions (KEYWORD2)
+#######################################
+
+EndOfTextEndOfTextEndOfText
+
+METHODS=$(egrep "^(u?int|void|bool|String|static|match_result_t).*\(" src/*.cpp|
+ cut -d' ' -f2- | sed 's/^.*:://' | cut -d'(' -f1 | sort -u |
+ grep -v ICACHE_RAM_ATTR)
+for i in ${METHODS}; do
+ echo -e "${i}\tKEYWORD2"
+done | sort -u
+
+cat << EndOfTextEndOfTextEndOfText
+
+#######################################
+# Constants (LITERAL1)
+#######################################
+
+EndOfTextEndOfTextEndOfText
+LITERALS=$(grep "^#define [A-Z]" src/*.cpp src/*.h |
+ while read ignore define ignore; do
+ echo ${define};
+ done | sort -u |
+ grep -v [\(\)] | grep -v ^_ | grep -v _\$ | grep -v VIRTUAL)
+CONSTS=$(grep "^const " src/*.cpp src/*.h |
+ sed 's/\[.*\] =.*//;s/ =.*//;s/^.* k/k/')
+ENUMS=$(cat src/*.h | while read a b; do
+ if [[ ${a} == "};" ]]; then
+ ENUM=0;
+ fi;
+ if [[ ${ENUM} -eq 1 ]]; then
+ echo $a | sed 's/,//g';
+ fi;
+ if [[ ${a} == "enum" ]]; then
+ ENUM=1;
+ fi;
+ done)
+for i in ${LITERALS} ${CONSTS} ${ENUMS}; do
+ echo -e "${i}\tLITERAL1"
+done | sort -u
diff --git a/lib/IRremoteESP8266-2.5.2.03/tools/mode2_decode.cpp b/lib/IRremoteESP8266-2.5.2.03/tools/mode2_decode.cpp
new file mode 100644
index 000000000000..63dfa62210b6
--- /dev/null
+++ b/lib/IRremoteESP8266-2.5.2.03/tools/mode2_decode.cpp
@@ -0,0 +1,122 @@
+// Quick and dirty tool to decode mode2 data from LIRC
+// Copyright 2018 Brett T. Warden
+// based on c2_decode.cpp, Copyright 2017 Jorge Cisneros
+
+// Usage example:
+// mode2 -H udp -d 5000 | ./mode2_decode
+
+/* Sample input (alternating space and pulse durations in microseconds):
+space 500000
+pulse 915
+space 793
+pulse 488
+space 366
+pulse 915
+space 793
+pulse 427
+space 500000
+*/
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "IRutils.h"
+
+const uint16_t kMaxGcCodeLength = 10000;
+
+void str_to_uint16(char *str, uint16_t *res, uint8_t base) {
+ char *end;
+ errno = 0;
+ intmax_t val = strtoimax(str, &end, base);
+ if (errno == ERANGE || val < 0 || val > UINT16_MAX || end == str ||
+ *end != '\0')
+ return;
+ *res = (uint16_t)val;
+}
+
+void usage_error(char *name) {
+ std::cerr << "Usage: " << name << " [-raw]" << std::endl;
+}
+
+int main(int argc, char *argv[]) {
+ bool dumpraw = false;
+
+ // Check the invocation/calling usage.
+ if (argc > 2) {
+ usage_error(argv[0]);
+ return 1;
+ }
+
+ if (argc == 2 && strncmp("-raw", argv[1], 4) == 0) {
+ dumpraw = true;
+ }
+
+ int index = 0;
+ std::string line, type;
+ std::string pulse = "pulse";
+ std::string space = "space";
+ int duration;
+
+ IRsendTest irsend(4);
+ IRrecv irrecv(4);
+ irsend.begin();
+ irsend.reset();
+
+ while (getline(std::cin, line)) {
+ std::istringstream iss1(line);
+ iss1 >> type;
+ iss1 >> duration;
+
+ // Clamp duration to int16_t
+ if (duration > 0xFFFF) {
+ duration = 0xFFFF;
+ }
+ if (pulse.compare(type) == 0) {
+ irsend.mark(duration);
+ } else if (space.compare(type) == 0) {
+ irsend.space(duration);
+ }
+ index++;
+
+ if (duration > 20000 || index >= kMaxGcCodeLength) {
+ // Skip long spaces at beginning
+ if (index > 1) {
+ irsend.makeDecodeResult();
+ irrecv.decode(&irsend.capture);
+
+ std::cout << "Code length " << index << std::endl
+ << "Code type " << irsend.capture.decode_type << " ("
+ << typeToString(irsend.capture.decode_type) << ")"
+ << std::endl
+ << "Code bits " << irsend.capture.bits << std::endl;
+ if (hasACState(irsend.capture.decode_type)) {
+ std::cout << "State value 0x";
+ for (uint16_t i = 0; i < irsend.capture.bits / 8; i++)
+ printf("%02X", irsend.capture.state[i]);
+ std::cout << std::endl;
+ } else {
+ std::cout << "Code value 0x" << std::hex << irsend.capture.value
+ << std::endl
+ << "Code address 0x" << std::hex << irsend.capture.address
+ << std::endl
+ << "Code command 0x" << std::hex << irsend.capture.command
+ << std::endl;
+ }
+
+ if (dumpraw || irsend.capture.decode_type == UNKNOWN)
+ irsend.dumpRawResult();
+ }
+
+ irsend.reset();
+ index = 0;
+ }
+ }
+
+ return 0;
+}
diff --git a/lib/LiquidCrystal_I2C-1.1.3/LiquidCrystal_I2C.cpp b/lib/LiquidCrystal_I2C-1.1.3/LiquidCrystal_I2C.cpp
new file mode 100644
index 000000000000..08a41f78aa28
--- /dev/null
+++ b/lib/LiquidCrystal_I2C-1.1.3/LiquidCrystal_I2C.cpp
@@ -0,0 +1,315 @@
+// Based on the work by DFRobot
+
+#include "LiquidCrystal_I2C.h"
+#include
+#if defined(ARDUINO) && ARDUINO >= 100
+
+#include "Arduino.h"
+
+#define printIIC(args) Wire.write(args)
+inline size_t LiquidCrystal_I2C::write(uint8_t value) {
+ send(value, Rs);
+ return 1;
+}
+
+#else
+#include "WProgram.h"
+
+#define printIIC(args) Wire.send(args)
+inline void LiquidCrystal_I2C::write(uint8_t value) {
+ send(value, Rs);
+}
+
+#endif
+#include "Wire.h"
+
+
+
+// When the display powers up, it is configured as follows:
+//
+// 1. Display clear
+// 2. Function set:
+// DL = 1; 8-bit interface data
+// N = 0; 1-line display
+// F = 0; 5x8 dot character font
+// 3. Display on/off control:
+// D = 0; Display off
+// C = 0; Cursor off
+// B = 0; Blinking off
+// 4. Entry mode set:
+// I/D = 1; Increment by 1
+// S = 0; No shift
+//
+// Note, however, that resetting the Arduino doesn't reset the LCD, so we
+// can't assume that its in that state when a sketch starts (and the
+// LiquidCrystal constructor is called).
+
+LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows)
+{
+ _Addr = lcd_Addr;
+ _cols = lcd_cols;
+ _rows = lcd_rows;
+ _backlightval = LCD_NOBACKLIGHT;
+}
+
+void LiquidCrystal_I2C::init(){
+ init_priv();
+}
+
+void LiquidCrystal_I2C::init_priv()
+{
+ Wire.begin();
+ _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
+ begin(_cols, _rows);
+}
+
+void LiquidCrystal_I2C::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) {
+ if (lines > 1) {
+ _displayfunction |= LCD_2LINE;
+ }
+ _numlines = lines;
+
+ // for some 1 line displays you can select a 10 pixel high font
+ if ((dotsize != 0) && (lines == 1)) {
+ _displayfunction |= LCD_5x10DOTS;
+ }
+
+ // SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION!
+ // according to datasheet, we need at least 40ms after power rises above 2.7V
+ // before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50
+ delay(50);
+
+ // Now we pull both RS and R/W low to begin commands
+ expanderWrite(_backlightval); // reset expanderand turn backlight off (Bit 8 =1)
+ delay(1000);
+
+ //put the LCD into 4 bit mode
+ // this is according to the hitachi HD44780 datasheet
+ // figure 24, pg 46
+
+ // we start in 8bit mode, try to set 4 bit mode
+ write4bits(0x03 << 4);
+ delayMicroseconds(4500); // wait min 4.1ms
+
+ // second try
+ write4bits(0x03 << 4);
+ delayMicroseconds(4500); // wait min 4.1ms
+
+ // third go!
+ write4bits(0x03 << 4);
+ delayMicroseconds(150);
+
+ // finally, set to 4-bit interface
+ write4bits(0x02 << 4);
+
+
+ // set # lines, font size, etc.
+ command(LCD_FUNCTIONSET | _displayfunction);
+
+ // turn the display on with no cursor or blinking default
+ _displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF;
+ display();
+
+ // clear it off
+ clear();
+
+ // Initialize to default text direction (for roman languages)
+ _displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT;
+
+ // set the entry mode
+ command(LCD_ENTRYMODESET | _displaymode);
+
+ home();
+
+}
+
+/********** high level commands, for the user! */
+void LiquidCrystal_I2C::clear(){
+ command(LCD_CLEARDISPLAY);// clear display, set cursor position to zero
+ delayMicroseconds(2000); // this command takes a long time!
+}
+
+void LiquidCrystal_I2C::home(){
+ command(LCD_RETURNHOME); // set cursor position to zero
+ delayMicroseconds(2000); // this command takes a long time!
+}
+
+void LiquidCrystal_I2C::setCursor(uint8_t col, uint8_t row){
+ int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
+ if ( row > _numlines ) {
+ row = _numlines-1; // we count rows starting w/0
+ }
+ command(LCD_SETDDRAMADDR | (col + row_offsets[row]));
+}
+
+// Turn the display on/off (quickly)
+void LiquidCrystal_I2C::noDisplay() {
+ _displaycontrol &= ~LCD_DISPLAYON;
+ command(LCD_DISPLAYCONTROL | _displaycontrol);
+}
+void LiquidCrystal_I2C::display() {
+ _displaycontrol |= LCD_DISPLAYON;
+ command(LCD_DISPLAYCONTROL | _displaycontrol);
+}
+
+// Turns the underline cursor on/off
+void LiquidCrystal_I2C::noCursor() {
+ _displaycontrol &= ~LCD_CURSORON;
+ command(LCD_DISPLAYCONTROL | _displaycontrol);
+}
+void LiquidCrystal_I2C::cursor() {
+ _displaycontrol |= LCD_CURSORON;
+ command(LCD_DISPLAYCONTROL | _displaycontrol);
+}
+
+// Turn on and off the blinking cursor
+void LiquidCrystal_I2C::noBlink() {
+ _displaycontrol &= ~LCD_BLINKON;
+ command(LCD_DISPLAYCONTROL | _displaycontrol);
+}
+void LiquidCrystal_I2C::blink() {
+ _displaycontrol |= LCD_BLINKON;
+ command(LCD_DISPLAYCONTROL | _displaycontrol);
+}
+
+// These commands scroll the display without changing the RAM
+void LiquidCrystal_I2C::scrollDisplayLeft(void) {
+ command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT);
+}
+void LiquidCrystal_I2C::scrollDisplayRight(void) {
+ command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT);
+}
+
+// This is for text that flows Left to Right
+void LiquidCrystal_I2C::leftToRight(void) {
+ _displaymode |= LCD_ENTRYLEFT;
+ command(LCD_ENTRYMODESET | _displaymode);
+}
+
+// This is for text that flows Right to Left
+void LiquidCrystal_I2C::rightToLeft(void) {
+ _displaymode &= ~LCD_ENTRYLEFT;
+ command(LCD_ENTRYMODESET | _displaymode);
+}
+
+// This will 'right justify' text from the cursor
+void LiquidCrystal_I2C::autoscroll(void) {
+ _displaymode |= LCD_ENTRYSHIFTINCREMENT;
+ command(LCD_ENTRYMODESET | _displaymode);
+}
+
+// This will 'left justify' text from the cursor
+void LiquidCrystal_I2C::noAutoscroll(void) {
+ _displaymode &= ~LCD_ENTRYSHIFTINCREMENT;
+ command(LCD_ENTRYMODESET | _displaymode);
+}
+
+// Allows us to fill the first 8 CGRAM locations
+// with custom characters
+void LiquidCrystal_I2C::createChar(uint8_t location, uint8_t charmap[]) {
+ location &= 0x7; // we only have 8 locations 0-7
+ command(LCD_SETCGRAMADDR | (location << 3));
+ for (int i=0; i<8; i++) {
+ write(charmap[i]);
+ }
+}
+
+// Turn the (optional) backlight off/on
+void LiquidCrystal_I2C::noBacklight(void) {
+ _backlightval=LCD_NOBACKLIGHT;
+ expanderWrite(0);
+}
+
+void LiquidCrystal_I2C::backlight(void) {
+ _backlightval=LCD_BACKLIGHT;
+ expanderWrite(0);
+}
+
+
+
+/*********** mid level commands, for sending data/cmds */
+
+inline void LiquidCrystal_I2C::command(uint8_t value) {
+ send(value, 0);
+}
+
+
+/************ low level data pushing commands **********/
+
+// write either command or data
+void LiquidCrystal_I2C::send(uint8_t value, uint8_t mode) {
+ uint8_t highnib=value&0xf0;
+ uint8_t lownib=(value<<4)&0xf0;
+ write4bits((highnib)|mode);
+ write4bits((lownib)|mode);
+}
+
+void LiquidCrystal_I2C::write4bits(uint8_t value) {
+ expanderWrite(value);
+ pulseEnable(value);
+}
+
+void LiquidCrystal_I2C::expanderWrite(uint8_t _data){
+ Wire.beginTransmission(_Addr);
+ printIIC((int)(_data) | _backlightval);
+ Wire.endTransmission();
+}
+
+void LiquidCrystal_I2C::pulseEnable(uint8_t _data){
+ expanderWrite(_data | En); // En high
+ delayMicroseconds(1); // enable pulse must be >450ns
+
+ expanderWrite(_data & ~En); // En low
+ delayMicroseconds(50); // commands need > 37us to settle
+}
+
+
+// Alias functions
+
+void LiquidCrystal_I2C::cursor_on(){
+ cursor();
+}
+
+void LiquidCrystal_I2C::cursor_off(){
+ noCursor();
+}
+
+void LiquidCrystal_I2C::blink_on(){
+ blink();
+}
+
+void LiquidCrystal_I2C::blink_off(){
+ noBlink();
+}
+
+void LiquidCrystal_I2C::load_custom_character(uint8_t char_num, uint8_t *rows){
+ createChar(char_num, rows);
+}
+
+void LiquidCrystal_I2C::setBacklight(uint8_t new_val){
+ if(new_val){
+ backlight(); // turn backlight on
+ }else{
+ noBacklight(); // turn backlight off
+ }
+}
+
+void LiquidCrystal_I2C::printstr(const char c[]){
+ //This function is not identical to the function used for "real" I2C displays
+ //it's here so the user sketch doesn't have to be changed
+ print(c);
+}
+
+
+// unsupported API functions
+void LiquidCrystal_I2C::off(){}
+void LiquidCrystal_I2C::on(){}
+void LiquidCrystal_I2C::setDelay (int cmdDelay,int charDelay) {}
+uint8_t LiquidCrystal_I2C::status(){return 0;}
+uint8_t LiquidCrystal_I2C::keypad (){return 0;}
+uint8_t LiquidCrystal_I2C::init_bargraph(uint8_t graphtype){return 0;}
+void LiquidCrystal_I2C::draw_horizontal_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_col_end){}
+void LiquidCrystal_I2C::draw_vertical_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_row_end){}
+void LiquidCrystal_I2C::setContrast(uint8_t new_val){}
+
+
diff --git a/lib/LiquidCrystal_I2C-1.1.3/LiquidCrystal_I2C.h b/lib/LiquidCrystal_I2C-1.1.3/LiquidCrystal_I2C.h
new file mode 100644
index 000000000000..faf19fbeae7d
--- /dev/null
+++ b/lib/LiquidCrystal_I2C-1.1.3/LiquidCrystal_I2C.h
@@ -0,0 +1,126 @@
+//YWROBOT
+#ifndef LiquidCrystal_I2C_h
+#define LiquidCrystal_I2C_h
+
+#include
+#include "Print.h"
+#include
+
+// commands
+#define LCD_CLEARDISPLAY 0x01
+#define LCD_RETURNHOME 0x02
+#define LCD_ENTRYMODESET 0x04
+#define LCD_DISPLAYCONTROL 0x08
+#define LCD_CURSORSHIFT 0x10
+#define LCD_FUNCTIONSET 0x20
+#define LCD_SETCGRAMADDR 0x40
+#define LCD_SETDDRAMADDR 0x80
+
+// flags for display entry mode
+#define LCD_ENTRYRIGHT 0x00
+#define LCD_ENTRYLEFT 0x02
+#define LCD_ENTRYSHIFTINCREMENT 0x01
+#define LCD_ENTRYSHIFTDECREMENT 0x00
+
+// flags for display on/off control
+#define LCD_DISPLAYON 0x04
+#define LCD_DISPLAYOFF 0x00
+#define LCD_CURSORON 0x02
+#define LCD_CURSOROFF 0x00
+#define LCD_BLINKON 0x01
+#define LCD_BLINKOFF 0x00
+
+// flags for display/cursor shift
+#define LCD_DISPLAYMOVE 0x08
+#define LCD_CURSORMOVE 0x00
+#define LCD_MOVERIGHT 0x04
+#define LCD_MOVELEFT 0x00
+
+// flags for function set
+#define LCD_8BITMODE 0x10
+#define LCD_4BITMODE 0x00
+#define LCD_2LINE 0x08
+#define LCD_1LINE 0x00
+#define LCD_5x10DOTS 0x04
+#define LCD_5x8DOTS 0x00
+
+// flags for backlight control
+#define LCD_BACKLIGHT 0x08
+#define LCD_NOBACKLIGHT 0x00
+
+#define En B00000100 // Enable bit
+#define Rw B00000010 // Read/Write bit
+#define Rs B00000001 // Register select bit
+
+class LiquidCrystal_I2C : public Print {
+public:
+ LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows);
+ void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS );
+ void clear();
+ void home();
+ void noDisplay();
+ void display();
+ void noBlink();
+ void blink();
+ void noCursor();
+ void cursor();
+ void scrollDisplayLeft();
+ void scrollDisplayRight();
+ void printLeft();
+ void printRight();
+ void leftToRight();
+ void rightToLeft();
+ void shiftIncrement();
+ void shiftDecrement();
+ void noBacklight();
+ void backlight();
+ void autoscroll();
+ void noAutoscroll();
+ void createChar(uint8_t, uint8_t[]);
+ void setCursor(uint8_t, uint8_t);
+#if defined(ARDUINO) && ARDUINO >= 100
+ virtual size_t write(uint8_t);
+#else
+ virtual void write(uint8_t);
+#endif
+ void command(uint8_t);
+ void init();
+
+////compatibility API function aliases
+void blink_on(); // alias for blink()
+void blink_off(); // alias for noBlink()
+void cursor_on(); // alias for cursor()
+void cursor_off(); // alias for noCursor()
+void setBacklight(uint8_t new_val); // alias for backlight() and nobacklight()
+void load_custom_character(uint8_t char_num, uint8_t *rows); // alias for createChar()
+void printstr(const char[]);
+
+////Unsupported API functions (not implemented in this library)
+uint8_t status();
+void setContrast(uint8_t new_val);
+uint8_t keypad();
+void setDelay(int,int);
+void on();
+void off();
+uint8_t init_bargraph(uint8_t graphtype);
+void draw_horizontal_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_col_end);
+void draw_vertical_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_col_end);
+
+
+private:
+ void init_priv();
+ void send(uint8_t, uint8_t);
+ void write4bits(uint8_t);
+ void expanderWrite(uint8_t);
+ void pulseEnable(uint8_t);
+ uint8_t _Addr;
+ uint8_t _displayfunction;
+ uint8_t _displaycontrol;
+ uint8_t _displaymode;
+ uint8_t _numlines;
+ uint8_t _cols;
+ uint8_t _rows;
+ uint8_t _backlightval;
+};
+
+#endif
diff --git a/lib/LiquidCrystal_I2C-1.1.3/LiquidCrystal_I2C.o b/lib/LiquidCrystal_I2C-1.1.3/LiquidCrystal_I2C.o
new file mode 100644
index 000000000000..bca78e0d24df
Binary files /dev/null and b/lib/LiquidCrystal_I2C-1.1.3/LiquidCrystal_I2C.o differ
diff --git a/lib/LiquidCrystal_I2C-1.1.3/README.md b/lib/LiquidCrystal_I2C-1.1.3/README.md
new file mode 100644
index 000000000000..aee58d3a272f
--- /dev/null
+++ b/lib/LiquidCrystal_I2C-1.1.3/README.md
@@ -0,0 +1,2 @@
+# LiquidCrystal_I2C
+LiquidCrystal Arduino library for the DFRobot I2C LCD displays
diff --git a/lib/LiquidCrystal_I2C-1.1.3/examples/CustomChars/CustomChars.pde b/lib/LiquidCrystal_I2C-1.1.3/examples/CustomChars/CustomChars.pde
new file mode 100644
index 000000000000..492612d71c6e
--- /dev/null
+++ b/lib/LiquidCrystal_I2C-1.1.3/examples/CustomChars/CustomChars.pde
@@ -0,0 +1,70 @@
+//YWROBOT
+//Compatible with the Arduino IDE 1.0
+//Library version:1.1
+#include
+#include
+
+#if defined(ARDUINO) && ARDUINO >= 100
+#define printByte(args) write(args);
+#else
+#define printByte(args) print(args,BYTE);
+#endif
+
+uint8_t bell[8] = {0x4,0xe,0xe,0xe,0x1f,0x0,0x4};
+uint8_t note[8] = {0x2,0x3,0x2,0xe,0x1e,0xc,0x0};
+uint8_t clock[8] = {0x0,0xe,0x15,0x17,0x11,0xe,0x0};
+uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0};
+uint8_t duck[8] = {0x0,0xc,0x1d,0xf,0xf,0x6,0x0};
+uint8_t check[8] = {0x0,0x1,0x3,0x16,0x1c,0x8,0x0};
+uint8_t cross[8] = {0x0,0x1b,0xe,0x4,0xe,0x1b,0x0};
+uint8_t retarrow[8] = { 0x1,0x1,0x5,0x9,0x1f,0x8,0x4};
+
+LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
+
+void setup()
+{
+ lcd.init(); // initialize the lcd
+ lcd.backlight();
+
+ lcd.createChar(0, bell);
+ lcd.createChar(1, note);
+ lcd.createChar(2, clock);
+ lcd.createChar(3, heart);
+ lcd.createChar(4, duck);
+ lcd.createChar(5, check);
+ lcd.createChar(6, cross);
+ lcd.createChar(7, retarrow);
+ lcd.home();
+
+ lcd.print("Hello world...");
+ lcd.setCursor(0, 1);
+ lcd.print(" i ");
+ lcd.printByte(3);
+ lcd.print(" arduinos!");
+ delay(5000);
+ displayKeyCodes();
+
+}
+
+// display all keycodes
+void displayKeyCodes(void) {
+ uint8_t i = 0;
+ while (1) {
+ lcd.clear();
+ lcd.print("Codes 0x"); lcd.print(i, HEX);
+ lcd.print("-0x"); lcd.print(i+16, HEX);
+ lcd.setCursor(0, 1);
+ for (int j=0; j<16; j++) {
+ lcd.printByte(i+j);
+ }
+ i+=16;
+
+ delay(4000);
+ }
+}
+
+void loop()
+{
+
+}
+
diff --git a/lib/LiquidCrystal_I2C-1.1.3/examples/HelloWorld/HelloWorld.pde b/lib/LiquidCrystal_I2C-1.1.3/examples/HelloWorld/HelloWorld.pde
new file mode 100644
index 000000000000..6dfdee8f8e6d
--- /dev/null
+++ b/lib/LiquidCrystal_I2C-1.1.3/examples/HelloWorld/HelloWorld.pde
@@ -0,0 +1,28 @@
+//YWROBOT
+//Compatible with the Arduino IDE 1.0
+//Library version:1.1
+#include
+#include
+
+LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
+
+void setup()
+{
+ lcd.init(); // initialize the lcd
+ lcd.init();
+ // Print a message to the LCD.
+ lcd.backlight();
+ lcd.setCursor(3,0);
+ lcd.print("Hello, world!");
+ lcd.setCursor(2,1);
+ lcd.print("Ywrobot Arduino!");
+ lcd.setCursor(0,2);
+ lcd.print("Arduino LCM IIC 2004");
+ lcd.setCursor(2,3);
+ lcd.print("Power By Ec-yuan!");
+}
+
+
+void loop()
+{
+}
diff --git a/lib/LiquidCrystal_I2C-1.1.3/examples/SerialDisplay/SerialDisplay.pde b/lib/LiquidCrystal_I2C-1.1.3/examples/SerialDisplay/SerialDisplay.pde
new file mode 100644
index 000000000000..fdbbc64ebcbf
--- /dev/null
+++ b/lib/LiquidCrystal_I2C-1.1.3/examples/SerialDisplay/SerialDisplay.pde
@@ -0,0 +1,34 @@
+/*
+ * Displays text sent over the serial port (e.g. from the Serial Monitor) on
+ * an attached LCD.
+ * YWROBOT
+ *Compatible with the Arduino IDE 1.0
+ *Library version:1.1
+ */
+#include
+#include
+
+LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
+
+void setup()
+{
+ lcd.init(); // initialize the lcd
+ lcd.backlight();
+ Serial.begin(9600);
+}
+
+void loop()
+{
+ // when characters arrive over the serial port...
+ if (Serial.available()) {
+ // wait a bit for the entire message to arrive
+ delay(100);
+ // clear the screen
+ lcd.clear();
+ // read all the available characters
+ while (Serial.available() > 0) {
+ // display each character to the LCD
+ lcd.write(Serial.read());
+ }
+ }
+}
diff --git a/lib/LiquidCrystal_I2C-1.1.3/keywords.txt b/lib/LiquidCrystal_I2C-1.1.3/keywords.txt
new file mode 100644
index 000000000000..8c450a9e94cb
--- /dev/null
+++ b/lib/LiquidCrystal_I2C-1.1.3/keywords.txt
@@ -0,0 +1,46 @@
+###########################################
+# Syntax Coloring Map For LiquidCrystal_I2C
+###########################################
+
+###########################################
+# Datatypes (KEYWORD1)
+###########################################
+
+LiquidCrystal_I2C KEYWORD1
+
+###########################################
+# Methods and Functions (KEYWORD2)
+###########################################
+init KEYWORD2
+begin KEYWORD2
+clear KEYWORD2
+home KEYWORD2
+noDisplay KEYWORD2
+display KEYWORD2
+noBlink KEYWORD2
+blink KEYWORD2
+noCursor KEYWORD2
+cursor KEYWORD2
+scrollDisplayLeft KEYWORD2
+scrollDisplayRight KEYWORD2
+leftToRight KEYWORD2
+rightToLeft KEYWORD2
+shiftIncrement KEYWORD2
+shiftDecrement KEYWORD2
+noBacklight KEYWORD2
+backlight KEYWORD2
+autoscroll KEYWORD2
+noAutoscroll KEYWORD2
+createChar KEYWORD2
+setCursor KEYWORD2
+print KEYWORD2
+blink_on KEYWORD2
+blink_off KEYWORD2
+cursor_on KEYWORD2
+cursor_off KEYWORD2
+setBacklight KEYWORD2
+load_custom_character KEYWORD2
+printstr KEYWORD2
+###########################################
+# Constants (LITERAL1)
+###########################################
diff --git a/lib/LiquidCrystal_I2C-1.1.3/library.json b/lib/LiquidCrystal_I2C-1.1.3/library.json
new file mode 100644
index 000000000000..5a23a39893b5
--- /dev/null
+++ b/lib/LiquidCrystal_I2C-1.1.3/library.json
@@ -0,0 +1,15 @@
+{
+ "name": "LiquidCrystal_I2C",
+ "keywords": "LCD, liquidcrystal, I2C",
+ "description": "A library for DFRobot I2C LCD displays",
+ "repository":
+ {
+ "type": "git",
+ "url": "https://github.com/marcoschwartz/LiquidCrystal_I2C.git"
+ },
+ "frameworks": "arduino",
+ "platforms":
+ [
+ "atmelavr"
+ ]
+}
\ No newline at end of file
diff --git a/lib/LiquidCrystal_I2C-1.1.3/library.properties b/lib/LiquidCrystal_I2C-1.1.3/library.properties
new file mode 100644
index 000000000000..ad8b02c15e39
--- /dev/null
+++ b/lib/LiquidCrystal_I2C-1.1.3/library.properties
@@ -0,0 +1,9 @@
+name=LiquidCrystal_I2C
+version=1.1.2
+author=Frank de Brabander
+maintainer=Marco Schwartz
+sentence=A library for I2C LCD displays.
+paragraph= The library allows to control I2C displays with functions extremely similar to LiquidCrystal library. THIS LIBRARY MIGHT NOT BE COMPATIBLE WITH EXISTING SKETCHES.
+category=Display
+url=https://github.com/marcoschwartz/LiquidCrystal_I2C
+architectures=*
diff --git a/lib/NewPing-1.9.1/README.md b/lib/NewPing-1.9.1/README.md
new file mode 100644
index 000000000000..5044422a4252
--- /dev/null
+++ b/lib/NewPing-1.9.1/README.md
@@ -0,0 +1,3 @@
+# NewPing Arduino Library for Arduino
+
+## See the [NewPing Wiki](https://bitbucket.org/teckel12/arduino-new-ping/wiki/Home) for documentation
diff --git a/lib/NewPing-1.9.1/examples/NewPing15SensorsTimer/NewPing15SensorsTimer.pde b/lib/NewPing-1.9.1/examples/NewPing15SensorsTimer/NewPing15SensorsTimer.pde
new file mode 100644
index 000000000000..f34c6d7d3f64
--- /dev/null
+++ b/lib/NewPing-1.9.1/examples/NewPing15SensorsTimer/NewPing15SensorsTimer.pde
@@ -0,0 +1,78 @@
+// ---------------------------------------------------------------------------
+// Before attempting to use this sketch, please read the "Help with 15 Sensors Example Sketch":
+// https://bitbucket.org/teckel12/arduino-new-ping/wiki/Help%20with%2015%20Sensors%20Example%20Sketch
+//
+// This example code was used to successfully communicate with 15 ultrasonic sensors. You can adjust
+// the number of sensors in your project by changing SONAR_NUM and the number of NewPing objects in the
+// "sonar" array. You also need to change the pins for each sensor for the NewPing objects. Each sensor
+// is pinged at 33ms intervals. So, one cycle of all sensors takes 495ms (33 * 15 = 495ms). The results
+// are sent to the "oneSensorCycle" function which currently just displays the distance data. Your project
+// would normally process the sensor results in this function (for example, decide if a robot needs to
+// turn and call the turn function). Keep in mind this example is event-driven. Your complete sketch needs
+// to be written so there's no "delay" commands and the loop() cycles at faster than a 33ms rate. If other
+// processes take longer than 33ms, you'll need to increase PING_INTERVAL so it doesn't get behind.
+// ---------------------------------------------------------------------------
+#include
+
+#define SONAR_NUM 15 // Number of sensors.
+#define MAX_DISTANCE 200 // Maximum distance (in cm) to ping.
+#define PING_INTERVAL 33 // Milliseconds between sensor pings (29ms is about the min to avoid cross-sensor echo).
+
+unsigned long pingTimer[SONAR_NUM]; // Holds the times when the next ping should happen for each sensor.
+unsigned int cm[SONAR_NUM]; // Where the ping distances are stored.
+uint8_t currentSensor = 0; // Keeps track of which sensor is active.
+
+NewPing sonar[SONAR_NUM] = { // Sensor object array.
+ NewPing(41, 42, MAX_DISTANCE), // Each sensor's trigger pin, echo pin, and max distance to ping.
+ NewPing(43, 44, MAX_DISTANCE),
+ NewPing(45, 20, MAX_DISTANCE),
+ NewPing(21, 22, MAX_DISTANCE),
+ NewPing(23, 24, MAX_DISTANCE),
+ NewPing(25, 26, MAX_DISTANCE),
+ NewPing(27, 28, MAX_DISTANCE),
+ NewPing(29, 30, MAX_DISTANCE),
+ NewPing(31, 32, MAX_DISTANCE),
+ NewPing(34, 33, MAX_DISTANCE),
+ NewPing(35, 36, MAX_DISTANCE),
+ NewPing(37, 38, MAX_DISTANCE),
+ NewPing(39, 40, MAX_DISTANCE),
+ NewPing(50, 51, MAX_DISTANCE),
+ NewPing(52, 53, MAX_DISTANCE)
+};
+
+void setup() {
+ Serial.begin(115200);
+ pingTimer[0] = millis() + 75; // First ping starts at 75ms, gives time for the Arduino to chill before starting.
+ for (uint8_t i = 1; i < SONAR_NUM; i++) // Set the starting time for each sensor.
+ pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;
+}
+
+void loop() {
+ for (uint8_t i = 0; i < SONAR_NUM; i++) { // Loop through all the sensors.
+ if (millis() >= pingTimer[i]) { // Is it this sensor's time to ping?
+ pingTimer[i] += PING_INTERVAL * SONAR_NUM; // Set next time this sensor will be pinged.
+ if (i == 0 && currentSensor == SONAR_NUM - 1) oneSensorCycle(); // Sensor ping cycle complete, do something with the results.
+ sonar[currentSensor].timer_stop(); // Make sure previous timer is canceled before starting a new ping (insurance).
+ currentSensor = i; // Sensor being accessed.
+ cm[currentSensor] = 0; // Make distance zero in case there's no ping echo for this sensor.
+ sonar[currentSensor].ping_timer(echoCheck); // Do the ping (processing continues, interrupt will call echoCheck to look for echo).
+ }
+ }
+ // Other code that *DOESN'T* analyze ping results can go here.
+}
+
+void echoCheck() { // If ping received, set the sensor distance to array.
+ if (sonar[currentSensor].check_timer())
+ cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM;
+}
+
+void oneSensorCycle() { // Sensor ping cycle complete, do something with the results.
+ // The following code would be replaced with your code that does something with the ping results.
+ for (uint8_t i = 0; i < SONAR_NUM; i++) {
+ Serial.print(i);
+ Serial.print("=");
+ Serial.print(cm[i]);
+ Serial.print("cm ");
+ }
+ Serial.println();
+}
diff --git a/lib/NewPing-1.9.1/examples/NewPing3Sensors/NewPing3Sensors.pde b/lib/NewPing-1.9.1/examples/NewPing3Sensors/NewPing3Sensors.pde
new file mode 100644
index 000000000000..c558320841e9
--- /dev/null
+++ b/lib/NewPing-1.9.1/examples/NewPing3Sensors/NewPing3Sensors.pde
@@ -0,0 +1,29 @@
+// ---------------------------------------------------------------------------
+// Example NewPing library sketch that pings 3 sensors 20 times a second.
+// ---------------------------------------------------------------------------
+
+#include
+
+#define SONAR_NUM 3 // Number of sensors.
+#define MAX_DISTANCE 200 // Maximum distance (in cm) to ping.
+
+NewPing sonar[SONAR_NUM] = { // Sensor object array.
+ NewPing(4, 5, MAX_DISTANCE), // Each sensor's trigger pin, echo pin, and max distance to ping.
+ NewPing(6, 7, MAX_DISTANCE),
+ NewPing(8, 9, MAX_DISTANCE)
+};
+
+void setup() {
+ Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
+}
+
+void loop() {
+ for (uint8_t i = 0; i < SONAR_NUM; i++) { // Loop through each sensor and display results.
+ delay(50); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
+ Serial.print(i);
+ Serial.print("=");
+ Serial.print(sonar[i].ping_cm());
+ Serial.print("cm ");
+ }
+ Serial.println();
+}
diff --git a/lib/NewPing-1.9.1/examples/NewPingEventTimer/NewPingEventTimer.pde b/lib/NewPing-1.9.1/examples/NewPingEventTimer/NewPingEventTimer.pde
new file mode 100644
index 000000000000..d9d26673e97b
--- /dev/null
+++ b/lib/NewPing-1.9.1/examples/NewPingEventTimer/NewPingEventTimer.pde
@@ -0,0 +1,46 @@
+// ---------------------------------------------------------------------------
+// This example shows how to use NewPing's ping_timer method which uses the Timer2 interrupt to get the
+// ping time. The advantage of using this method over the standard ping method is that it permits a more
+// event-driven sketch which allows you to appear to do two things at once. An example would be to ping
+// an ultrasonic sensor for a possible collision while at the same time navigating. This allows a
+// properly developed sketch to multitask. Be aware that because the ping_timer method uses Timer2,
+// other features or libraries that also use Timer2 would be effected. For example, the PWM function on
+// pins 3 & 11 on Arduino Uno (pins 9 and 11 on Arduino Mega) and the Tone library. Note, only the PWM
+// functionality of the pins is lost (as they use Timer2 to do PWM), the pins are still available to use.
+// NOTE: For Teensy/Leonardo (ATmega32U4) the library uses Timer4 instead of Timer2.
+// ---------------------------------------------------------------------------
+#include
+
+#define TRIGGER_PIN 12 // Arduino pin tied to trigger pin on ping sensor.
+#define ECHO_PIN 11 // Arduino pin tied to echo pin on ping sensor.
+#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
+
+NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
+
+unsigned int pingSpeed = 50; // How frequently are we going to send out a ping (in milliseconds). 50ms would be 20 times a second.
+unsigned long pingTimer; // Holds the next ping time.
+
+void setup() {
+ Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
+ pingTimer = millis(); // Start now.
+}
+
+void loop() {
+ // Notice how there's no delays in this sketch to allow you to do other processing in-line while doing distance pings.
+ if (millis() >= pingTimer) { // pingSpeed milliseconds since last ping, do another ping.
+ pingTimer += pingSpeed; // Set the next ping time.
+ sonar.ping_timer(echoCheck); // Send out the ping, calls "echoCheck" function every 24uS where you can check the ping status.
+ }
+ // Do other stuff here, really. Think of it as multi-tasking.
+}
+
+void echoCheck() { // Timer2 interrupt calls this function every 24uS where you can check the ping status.
+ // Don't do anything here!
+ if (sonar.check_timer()) { // This is how you check to see if the ping was received.
+ // Here's where you can add code.
+ Serial.print("Ping: ");
+ Serial.print(sonar.ping_result / US_ROUNDTRIP_CM); // Ping returned, uS result in ping_result, convert to cm with US_ROUNDTRIP_CM.
+ Serial.println("cm");
+ }
+ // Don't do anything here!
+}
\ No newline at end of file
diff --git a/lib/NewPing-1.9.1/examples/NewPingExample/NewPingExample.pde b/lib/NewPing-1.9.1/examples/NewPingExample/NewPingExample.pde
new file mode 100644
index 000000000000..12f6fdaaf9d2
--- /dev/null
+++ b/lib/NewPing-1.9.1/examples/NewPingExample/NewPingExample.pde
@@ -0,0 +1,22 @@
+// ---------------------------------------------------------------------------
+// Example NewPing library sketch that does a ping about 20 times per second.
+// ---------------------------------------------------------------------------
+
+#include
+
+#define TRIGGER_PIN 12 // Arduino pin tied to trigger pin on the ultrasonic sensor.
+#define ECHO_PIN 11 // Arduino pin tied to echo pin on the ultrasonic sensor.
+#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
+
+NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
+
+void setup() {
+ Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
+}
+
+void loop() {
+ delay(50); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
+ Serial.print("Ping: ");
+ Serial.print(sonar.ping_cm()); // Send ping, get distance in cm and print result (0 = outside set distance range)
+ Serial.println("cm");
+}
\ No newline at end of file
diff --git a/lib/NewPing-1.9.1/examples/NewPingTimerMedian/NewPingTimerMedian.pde b/lib/NewPing-1.9.1/examples/NewPingTimerMedian/NewPingTimerMedian.pde
new file mode 100644
index 000000000000..16fe3fff35a9
--- /dev/null
+++ b/lib/NewPing-1.9.1/examples/NewPingTimerMedian/NewPingTimerMedian.pde
@@ -0,0 +1,60 @@
+// ---------------------------------------------------------------------------
+// Calculate a ping median using the ping_timer() method.
+// ---------------------------------------------------------------------------
+
+#include
+
+#define ITERATIONS 5 // Number of iterations.
+#define TRIGGER_PIN 12 // Arduino pin tied to trigger pin on ping sensor.
+#define ECHO_PIN 11 // Arduino pin tied to echo pin on ping sensor.
+#define MAX_DISTANCE 200 // Maximum distance (in cm) to ping.
+#define PING_INTERVAL 33 // Milliseconds between sensor pings (29ms is about the min to avoid cross-sensor echo).
+
+unsigned long pingTimer[ITERATIONS]; // Holds the times when the next ping should happen for each iteration.
+unsigned int cm[ITERATIONS]; // Where the ping distances are stored.
+uint8_t currentIteration = 0; // Keeps track of iteration step.
+
+NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
+
+void setup() {
+ Serial.begin(115200);
+ pingTimer[0] = millis() + 75; // First ping starts at 75ms, gives time for the Arduino to chill before starting.
+ for (uint8_t i = 1; i < ITERATIONS; i++) // Set the starting time for each iteration.
+ pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;
+}
+
+void loop() {
+ for (uint8_t i = 0; i < ITERATIONS; i++) { // Loop through all the iterations.
+ if (millis() >= pingTimer[i]) { // Is it this iteration's time to ping?
+ pingTimer[i] += PING_INTERVAL * ITERATIONS; // Set next time this sensor will be pinged.
+ if (i == 0 && currentIteration == ITERATIONS - 1) oneSensorCycle(); // Sensor ping cycle complete, do something with the results.
+ sonar.timer_stop(); // Make sure previous timer is canceled before starting a new ping (insurance).
+ currentIteration = i; // Sensor being accessed.
+ cm[currentIteration] = 0; // Make distance zero in case there's no ping echo for this iteration.
+ sonar.ping_timer(echoCheck); // Do the ping (processing continues, interrupt will call echoCheck to look for echo).
+ }
+ }
+ // Other code that *DOESN'T* analyze ping results can go here.
+}
+
+void echoCheck() { // If ping received, set the sensor distance to array.
+ if (sonar.check_timer())
+ cm[currentIteration] = sonar.ping_result / US_ROUNDTRIP_CM;
+}
+
+void oneSensorCycle() { // All iterations complete, calculate the median.
+ unsigned int uS[ITERATIONS];
+ uint8_t j, it = ITERATIONS;
+ uS[0] = NO_ECHO;
+ for (uint8_t i = 0; i < it; i++) { // Loop through iteration results.
+ if (cm[i] != NO_ECHO) { // Ping in range, include as part of median.
+ if (i > 0) { // Don't start sort till second ping.
+ for (j = i; j > 0 && uS[j - 1] < cm[i]; j--) // Insertion sort loop.
+ uS[j] = uS[j - 1]; // Shift ping array to correct position for sort insertion.
+ } else j = 0; // First ping is sort starting point.
+ uS[j] = cm[i]; // Add last ping to array in sorted position.
+ } else it--; // Ping out of range, skip and don't include as part of median.
+ }
+ Serial.print(uS[it >> 1]);
+ Serial.println("cm");
+}
diff --git a/lib/NewPing-1.9.1/examples/TimerExample/TimerExample.pde b/lib/NewPing-1.9.1/examples/TimerExample/TimerExample.pde
new file mode 100644
index 000000000000..58dc5219fca3
--- /dev/null
+++ b/lib/NewPing-1.9.1/examples/TimerExample/TimerExample.pde
@@ -0,0 +1,25 @@
+// ---------------------------------------------------------------------------
+// While the NewPing library's primary goal is to interface with ultrasonic sensors, interfacing with
+// the Timer2 interrupt was a result of creating an interrupt-based ping method. Since these Timer2
+// interrupt methods were built, the library may as well provide the functionality to use these methods
+// in your sketches. This shows how simple it is (no ultrasonic sensor required). Keep in mind that
+// these methods use Timer2, as does NewPing's ping_timer method for using ultrasonic sensors. You
+// can't use ping_timer at the same time you're using timer_ms or timer_us as all use the same timer.
+// ---------------------------------------------------------------------------
+
+#include
+
+#define LED_PIN 13 // Pin with LED attached.
+
+void setup() {
+ pinMode(LED_PIN, OUTPUT);
+ NewPing::timer_ms(500, toggleLED); // Create a Timer2 interrupt that calls toggleLED in your sketch once every 500 milliseconds.
+}
+
+void loop() {
+ // Do anything here, the Timer2 interrupt will take care of the flashing LED without your intervention.
+}
+
+void toggleLED() {
+ digitalWrite(LED_PIN, !digitalRead(LED_PIN)); // Toggle the LED.
+}
diff --git a/lib/NewPing-1.9.1/keywords.txt b/lib/NewPing-1.9.1/keywords.txt
new file mode 100644
index 000000000000..abf479714b71
--- /dev/null
+++ b/lib/NewPing-1.9.1/keywords.txt
@@ -0,0 +1,30 @@
+###################################
+# Syntax Coloring Map For NewPing
+###################################
+
+###################################
+# Datatypes (KEYWORD1)
+###################################
+
+NewPing KEYWORD1
+
+###################################
+# Methods and Functions (KEYWORD2)
+###################################
+
+ping KEYWORD2
+ping_in KEYWORD2
+ping_cm KEYWORD2
+ping_median KEYWORD2
+ping_timer KEYWORD2
+check_timer KEYWORD2
+ping_result KEYWORD2
+timer_us KEYWORD2
+timer_ms KEYWORD2
+timer_stop KEYWORD2
+convert_in KEYWORD2
+convert_cm KEYWORD2
+
+###################################
+# Constants (LITERAL1)
+###################################
diff --git a/lib/NewPing-1.9.1/library.properties b/lib/NewPing-1.9.1/library.properties
new file mode 100644
index 000000000000..c825146d920e
--- /dev/null
+++ b/lib/NewPing-1.9.1/library.properties
@@ -0,0 +1,10 @@
+name=NewPing
+version=1.9.1
+author=Tim Eckel
+maintainer=Tim Eckel
+sentence=A library that makes working with ultrasonic sensors easy.
+paragraph=When I first received an ultrasonic sensor I was not happy with how poorly it performed. I soon realized the problem was not the sensor, it was the available ping and ultrasonic libraries causing the problem. The NewPing library totally fixes these problems, adds many new features, and breathes new life into these very affordable distance sensors.
+category=Sensors
+url=https://bitbucket.org/teckel12/arduino-new-ping/wiki/Home
+architectures=avr,arm,esp8266
+includes=NewPing.h
diff --git a/lib/NewPing-1.9.1/src/NewPing.cpp b/lib/NewPing-1.9.1/src/NewPing.cpp
new file mode 100644
index 000000000000..e71f6181f89c
--- /dev/null
+++ b/lib/NewPing-1.9.1/src/NewPing.cpp
@@ -0,0 +1,365 @@
+// ---------------------------------------------------------------------------
+// Created by Tim Eckel - teckel@leethost.com
+//
+// See NewPing.h for license, purpose, syntax, version history, links, etc.
+// ---------------------------------------------------------------------------
+
+#include "NewPing.h"
+
+
+// ---------------------------------------------------------------------------
+// NewPing constructor
+// ---------------------------------------------------------------------------
+
+NewPing::NewPing(uint8_t trigger_pin, uint8_t echo_pin, unsigned int max_cm_distance) {
+#if DO_BITWISE == true
+ _triggerBit = digitalPinToBitMask(trigger_pin); // Get the port register bitmask for the trigger pin.
+ _echoBit = digitalPinToBitMask(echo_pin); // Get the port register bitmask for the echo pin.
+
+ _triggerOutput = portOutputRegister(digitalPinToPort(trigger_pin)); // Get the output port register for the trigger pin.
+ _echoInput = portInputRegister(digitalPinToPort(echo_pin)); // Get the input port register for the echo pin.
+
+ _triggerMode = (uint8_t *) portModeRegister(digitalPinToPort(trigger_pin)); // Get the port mode register for the trigger pin.
+#else
+ _triggerPin = trigger_pin;
+ _echoPin = echo_pin;
+#endif
+
+ set_max_distance(max_cm_distance); // Call function to set the max sensor distance.
+
+#if (defined (__arm__) && (defined (TEENSYDUINO) || defined(PARTICLE))) || DO_BITWISE != true
+ pinMode(echo_pin, INPUT); // Set echo pin to input (on Teensy 3.x (ARM), pins default to disabled, at least one pinMode() is needed for GPIO mode).
+ pinMode(trigger_pin, OUTPUT); // Set trigger pin to output (on Teensy 3.x (ARM), pins default to disabled, at least one pinMode() is needed for GPIO mode).
+#endif
+
+#if defined (ARDUINO_AVR_YUN)
+ pinMode(echo_pin, INPUT); // Set echo pin to input for the Arduino Yun, not sure why it doesn't default this way.
+#endif
+
+#if ONE_PIN_ENABLED != true && DO_BITWISE == true
+ *_triggerMode |= _triggerBit; // Set trigger pin to output.
+#endif
+}
+
+
+// ---------------------------------------------------------------------------
+// Standard ping methods
+// ---------------------------------------------------------------------------
+
+unsigned int NewPing::ping(unsigned int max_cm_distance) {
+ if (max_cm_distance > 0) set_max_distance(max_cm_distance); // Call function to set a new max sensor distance.
+
+ if (!ping_trigger()) return NO_ECHO; // Trigger a ping, if it returns false, return NO_ECHO to the calling function.
+
+#if URM37_ENABLED == true
+ #if DO_BITWISE == true
+ while (!(*_echoInput & _echoBit)) // Wait for the ping echo.
+ #else
+ while (!digitalRead(_echoPin)) // Wait for the ping echo.
+ #endif
+ if (micros() > _max_time) return NO_ECHO; // Stop the loop and return NO_ECHO (false) if we're beyond the set maximum distance.
+#else
+ #if DO_BITWISE == true
+ while (*_echoInput & _echoBit) // Wait for the ping echo.
+ #else
+ while (digitalRead(_echoPin)) // Wait for the ping echo.
+ #endif
+ if (micros() > _max_time) return NO_ECHO; // Stop the loop and return NO_ECHO (false) if we're beyond the set maximum distance.
+#endif
+
+ return (micros() - (_max_time - _maxEchoTime) - PING_OVERHEAD); // Calculate ping time, include overhead.
+}
+
+
+unsigned long NewPing::ping_cm(unsigned int max_cm_distance) {
+ unsigned long echoTime = NewPing::ping(max_cm_distance); // Calls the ping method and returns with the ping echo distance in uS.
+#if ROUNDING_ENABLED == false
+ return (echoTime / US_ROUNDTRIP_CM); // Call the ping method and returns the distance in centimeters (no rounding).
+#else
+ return NewPingConvert(echoTime, US_ROUNDTRIP_CM); // Convert uS to centimeters.
+#endif
+}
+
+
+unsigned long NewPing::ping_in(unsigned int max_cm_distance) {
+ unsigned long echoTime = NewPing::ping(max_cm_distance); // Calls the ping method and returns with the ping echo distance in uS.
+#if ROUNDING_ENABLED == false
+ return (echoTime / US_ROUNDTRIP_IN); // Call the ping method and returns the distance in inches (no rounding).
+#else
+ return NewPingConvert(echoTime, US_ROUNDTRIP_IN); // Convert uS to inches.
+#endif
+}
+
+
+unsigned long NewPing::ping_median(uint8_t it, unsigned int max_cm_distance) {
+ unsigned int uS[it], last;
+ uint8_t j, i = 0;
+ unsigned long t;
+ uS[0] = NO_ECHO;
+
+ while (i < it) {
+ t = micros(); // Start ping timestamp.
+ last = ping(max_cm_distance); // Send ping.
+
+ if (last != NO_ECHO) { // Ping in range, include as part of median.
+ if (i > 0) { // Don't start sort till second ping.
+ for (j = i; j > 0 && uS[j - 1] < last; j--) // Insertion sort loop.
+ uS[j] = uS[j - 1]; // Shift ping array to correct position for sort insertion.
+ } else j = 0; // First ping is sort starting point.
+ uS[j] = last; // Add last ping to array in sorted position.
+ i++; // Move to next ping.
+ } else it--; // Ping out of range, skip and don't include as part of median.
+
+ if (i < it && micros() - t < PING_MEDIAN_DELAY)
+ delay((PING_MEDIAN_DELAY + t - micros()) / 1000); // Millisecond delay between pings.
+
+ }
+ return (uS[it >> 1]); // Return the ping distance median.
+}
+
+
+// ---------------------------------------------------------------------------
+// Standard and timer interrupt ping method support functions (not called directly)
+// ---------------------------------------------------------------------------
+
+boolean NewPing::ping_trigger() {
+#if DO_BITWISE == true
+ #if ONE_PIN_ENABLED == true
+ *_triggerMode |= _triggerBit; // Set trigger pin to output.
+ #endif
+
+ *_triggerOutput &= ~_triggerBit; // Set the trigger pin low, should already be low, but this will make sure it is.
+ delayMicroseconds(4); // Wait for pin to go low.
+ *_triggerOutput |= _triggerBit; // Set trigger pin high, this tells the sensor to send out a ping.
+ delayMicroseconds(10); // Wait long enough for the sensor to realize the trigger pin is high. Sensor specs say to wait 10uS.
+ *_triggerOutput &= ~_triggerBit; // Set trigger pin back to low.
+
+ #if ONE_PIN_ENABLED == true
+ *_triggerMode &= ~_triggerBit; // Set trigger pin to input (when using one Arduino pin, this is technically setting the echo pin to input as both are tied to the same Arduino pin).
+ #endif
+
+ #if URM37_ENABLED == true
+ if (!(*_echoInput & _echoBit)) return false; // Previous ping hasn't finished, abort.
+ _max_time = micros() + _maxEchoTime + MAX_SENSOR_DELAY; // Maximum time we'll wait for ping to start (most sensors are <450uS, the SRF06 can take up to 34,300uS!)
+ while (*_echoInput & _echoBit) // Wait for ping to start.
+ if (micros() > _max_time) return false; // Took too long to start, abort.
+ #else
+ if (*_echoInput & _echoBit) return false; // Previous ping hasn't finished, abort.
+ _max_time = micros() + _maxEchoTime + MAX_SENSOR_DELAY; // Maximum time we'll wait for ping to start (most sensors are <450uS, the SRF06 can take up to 34,300uS!)
+ while (!(*_echoInput & _echoBit)) // Wait for ping to start.
+ if (micros() > _max_time) return false; // Took too long to start, abort.
+ #endif
+#else
+ #if ONE_PIN_ENABLED == true
+ pinMode(_triggerPin, OUTPUT); // Set trigger pin to output.
+ #endif
+
+ digitalWrite(_triggerPin, LOW); // Set the trigger pin low, should already be low, but this will make sure it is.
+ delayMicroseconds(4); // Wait for pin to go low.
+ digitalWrite(_triggerPin, HIGH); // Set trigger pin high, this tells the sensor to send out a ping.
+ delayMicroseconds(10); // Wait long enough for the sensor to realize the trigger pin is high. Sensor specs say to wait 10uS.
+ digitalWrite(_triggerPin, LOW); // Set trigger pin back to low.
+
+ #if ONE_PIN_ENABLED == true
+ pinMode(_triggerPin, INPUT); // Set trigger pin to input (when using one Arduino pin, this is technically setting the echo pin to input as both are tied to the same Arduino pin).
+ #endif
+
+ #if URM37_ENABLED == true
+ if (!digitalRead(_echoPin)) return false; // Previous ping hasn't finished, abort.
+ _max_time = micros() + _maxEchoTime + MAX_SENSOR_DELAY; // Maximum time we'll wait for ping to start (most sensors are <450uS, the SRF06 can take up to 34,300uS!)
+ while (digitalRead(_echoPin)) // Wait for ping to start.
+ if (micros() > _max_time) return false; // Took too long to start, abort.
+ #else
+ if (digitalRead(_echoPin)) return false; // Previous ping hasn't finished, abort.
+ _max_time = micros() + _maxEchoTime + MAX_SENSOR_DELAY; // Maximum time we'll wait for ping to start (most sensors are <450uS, the SRF06 can take up to 34,300uS!)
+ while (!digitalRead(_echoPin)) // Wait for ping to start.
+ if (micros() > _max_time) return false; // Took too long to start, abort.
+ #endif
+#endif
+
+ _max_time = micros() + _maxEchoTime; // Ping started, set the time-out.
+ return true; // Ping started successfully.
+}
+
+
+void NewPing::set_max_distance(unsigned int max_cm_distance) {
+#if ROUNDING_ENABLED == false
+ _maxEchoTime = min(max_cm_distance + 1, (unsigned int) MAX_SENSOR_DISTANCE + 1) * US_ROUNDTRIP_CM; // Calculate the maximum distance in uS (no rounding).
+#else
+ _maxEchoTime = min(max_cm_distance, (unsigned int) MAX_SENSOR_DISTANCE) * US_ROUNDTRIP_CM + (US_ROUNDTRIP_CM / 2); // Calculate the maximum distance in uS.
+#endif
+}
+
+
+#if TIMER_ENABLED == true && DO_BITWISE == true
+
+ // ---------------------------------------------------------------------------
+ // Timer interrupt ping methods (won't work with ATmega128, ATtiny and most non-AVR microcontrollers)
+ // ---------------------------------------------------------------------------
+
+ void NewPing::ping_timer(void (*userFunc)(void), unsigned int max_cm_distance) {
+ if (max_cm_distance > 0) set_max_distance(max_cm_distance); // Call function to set a new max sensor distance.
+
+ if (!ping_trigger()) return; // Trigger a ping, if it returns false, return without starting the echo timer.
+ timer_us(ECHO_TIMER_FREQ, userFunc); // Set ping echo timer check every ECHO_TIMER_FREQ uS.
+ }
+
+
+ boolean NewPing::check_timer() {
+ if (micros() > _max_time) { // Outside the time-out limit.
+ timer_stop(); // Disable timer interrupt
+ return false; // Cancel ping timer.
+ }
+
+ #if URM37_ENABLED == false
+ if (!(*_echoInput & _echoBit)) { // Ping echo received.
+ #else
+ if (*_echoInput & _echoBit) { // Ping echo received.
+ #endif
+ timer_stop(); // Disable timer interrupt
+ ping_result = (micros() - (_max_time - _maxEchoTime) - PING_TIMER_OVERHEAD); // Calculate ping time including overhead.
+ return true; // Return ping echo true.
+ }
+
+ return false; // Return false because there's no ping echo yet.
+ }
+
+
+ // ---------------------------------------------------------------------------
+ // Timer2/Timer4 interrupt methods (can be used for non-ultrasonic needs)
+ // ---------------------------------------------------------------------------
+
+ // Variables used for timer functions
+ void (*intFunc)();
+ void (*intFunc2)();
+ unsigned long _ms_cnt_reset;
+ volatile unsigned long _ms_cnt;
+ #if defined(__arm__) && (defined (TEENSYDUINO) || defined(PARTICLE))
+ IntervalTimer itimer;
+ #endif
+
+
+ void NewPing::timer_us(unsigned int frequency, void (*userFunc)(void)) {
+ intFunc = userFunc; // User's function to call when there's a timer event.
+ timer_setup(); // Configure the timer interrupt.
+
+ #if defined (__AVR_ATmega32U4__) // Use Timer4 for ATmega32U4 (Teensy/Leonardo).
+ OCR4C = min((frequency>>2) - 1, 255); // Every count is 4uS, so divide by 4 (bitwise shift right 2) subtract one, then make sure we don't go over 255 limit.
+ TIMSK4 = (1<>2) - 1, 255); // Every count is 4uS, so divide by 4 (bitwise shift right 2) subtract one, then make sure we don't go over 255 limit.
+ TIMSK2 |= (1<= 100
+ #include
+ #else
+ #include
+ #if defined (PARTICLE)
+ #include
+ #else
+ #include
+ #endif
+ #endif
+
+ #if defined (__AVR__)
+ #include
+ #include
+ #endif
+
+ // Shouldn't need to change these values unless you have a specific need to do so.
+ #define MAX_SENSOR_DISTANCE 500 // Maximum sensor distance can be as high as 500cm, no reason to wait for ping longer than sound takes to travel this distance and back. Default=500
+ #define US_ROUNDTRIP_CM 57 // Microseconds (uS) it takes sound to travel round-trip 1cm (2cm total), uses integer to save compiled code space. Default=57
+ #define US_ROUNDTRIP_IN 146 // Microseconds (uS) it takes sound to travel round-trip 1 inch (2 inches total), uses integer to save compiled code space. Defalult=146
+ #define ONE_PIN_ENABLED true // Set to "false" to disable one pin mode which saves around 14-26 bytes of binary size. Default=true
+ #define ROUNDING_ENABLED false // Set to "true" to enable distance rounding which also adds 64 bytes to binary size. Default=false
+ #define URM37_ENABLED false // Set to "true" to enable support for the URM37 sensor in PWM mode. Default=false
+ #define TIMER_ENABLED true // Set to "false" to disable the timer ISR (if getting "__vector_7" compile errors set this to false). Default=true
+
+ // Probably shouldn't change these values unless you really know what you're doing.
+ #define NO_ECHO 0 // Value returned if there's no ping echo within the specified MAX_SENSOR_DISTANCE or max_cm_distance. Default=0
+ #define MAX_SENSOR_DELAY 5800 // Maximum uS it takes for sensor to start the ping. Default=5800
+ #define ECHO_TIMER_FREQ 24 // Frequency to check for a ping echo (every 24uS is about 0.4cm accuracy). Default=24
+ #define PING_MEDIAN_DELAY 29000 // Microsecond delay between pings in the ping_median method. Default=29000
+ #define PING_OVERHEAD 5 // Ping overhead in microseconds (uS). Default=5
+ #define PING_TIMER_OVERHEAD 13 // Ping timer overhead in microseconds (uS). Default=13
+ #if URM37_ENABLED == true
+ #undef US_ROUNDTRIP_CM
+ #undef US_ROUNDTRIP_IN
+ #define US_ROUNDTRIP_CM 50 // Every 50uS PWM signal is low indicates 1cm distance. Default=50
+ #define US_ROUNDTRIP_IN 127 // If 50uS is 1cm, 1 inch would be 127uS (50 x 2.54 = 127). Default=127
+ #endif
+
+ // Conversion from uS to distance (round result to nearest cm or inch).
+ #define NewPingConvert(echoTime, conversionFactor) (max(((unsigned int)echoTime + conversionFactor / 2) / conversionFactor, (echoTime ? 1 : 0)))
+
+ // Detect non-AVR microcontrollers (Teensy 3.x, Arduino DUE, etc.) and don't use port registers or timer interrupts as required.
+ #if (defined (__arm__) && (defined (TEENSYDUINO) || defined (PARTICLE)))
+ #undef PING_OVERHEAD
+ #define PING_OVERHEAD 1
+ #undef PING_TIMER_OVERHEAD
+ #define PING_TIMER_OVERHEAD 1
+ #define DO_BITWISE true
+ #elif !defined (__AVR__)
+ #undef PING_OVERHEAD
+ #define PING_OVERHEAD 1
+ #undef PING_TIMER_OVERHEAD
+ #define PING_TIMER_OVERHEAD 1
+ #undef TIMER_ENABLED
+ #define TIMER_ENABLED false
+ #define DO_BITWISE false
+ #else
+ #define DO_BITWISE true
+ #endif
+
+ // Disable the timer interrupts when using ATmega128 and all ATtiny microcontrollers.
+ #if defined (__AVR_ATmega128__) || defined (__AVR_ATtiny24__) || defined (__AVR_ATtiny44__) || defined (__AVR_ATtiny441__) || defined (__AVR_ATtiny84__) || defined (__AVR_ATtiny841__) || defined (__AVR_ATtiny25__) || defined (__AVR_ATtiny45__) || defined (__AVR_ATtiny85__) || defined (__AVR_ATtiny261__) || defined (__AVR_ATtiny461__) || defined (__AVR_ATtiny861__) || defined (__AVR_ATtiny43U__)
+ #undef TIMER_ENABLED
+ #define TIMER_ENABLED false
+ #endif
+
+ // Define timers when using ATmega8, ATmega16, ATmega32 and ATmega8535 microcontrollers.
+ #if defined (__AVR_ATmega8__) || defined (__AVR_ATmega16__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega8535__)
+ #define OCR2A OCR2
+ #define TIMSK2 TIMSK
+ #define OCIE2A OCIE2
+ #endif
+
+ class NewPing {
+ public:
+ NewPing(uint8_t trigger_pin, uint8_t echo_pin, unsigned int max_cm_distance = MAX_SENSOR_DISTANCE);
+ unsigned int ping(unsigned int max_cm_distance = 0);
+ unsigned long ping_cm(unsigned int max_cm_distance = 0);
+ unsigned long ping_in(unsigned int max_cm_distance = 0);
+ unsigned long ping_median(uint8_t it = 5, unsigned int max_cm_distance = 0);
+ static unsigned int convert_cm(unsigned int echoTime);
+ static unsigned int convert_in(unsigned int echoTime);
+ #if TIMER_ENABLED == true
+ void ping_timer(void (*userFunc)(void), unsigned int max_cm_distance = 0);
+ boolean check_timer();
+ unsigned long ping_result;
+ static void timer_us(unsigned int frequency, void (*userFunc)(void));
+ static void timer_ms(unsigned long frequency, void (*userFunc)(void));
+ static void timer_stop();
+ #endif
+ private:
+ boolean ping_trigger();
+ void set_max_distance(unsigned int max_cm_distance);
+ #if TIMER_ENABLED == true
+ boolean ping_trigger_timer(unsigned int trigger_delay);
+ boolean ping_wait_timer();
+ static void timer_setup();
+ static void timer_ms_cntdwn();
+ #endif
+ #if DO_BITWISE == true
+ uint8_t _triggerBit;
+ uint8_t _echoBit;
+ #if defined(PARTICLE)
+ #if !defined(portModeRegister)
+ #if defined (STM32F10X_MD)
+ #define portModeRegister(port) ( &(port->CRL) )
+ #elif defined (STM32F2XX)
+ #define portModeRegister(port) ( &(port->MODER) )
+ #endif
+ #endif
+ volatile uint32_t *_triggerOutput;
+ volatile uint32_t *_echoInput;
+ volatile uint32_t *_triggerMode;
+ #else
+ volatile uint8_t *_triggerOutput;
+ volatile uint8_t *_echoInput;
+ volatile uint8_t *_triggerMode;
+ #endif
+ #else
+ uint8_t _triggerPin;
+ uint8_t _echoPin;
+ #endif
+ unsigned int _maxEchoTime;
+ unsigned long _max_time;
+ };
+
+
+#endif
diff --git a/lib/PubSubClient-2.6.09/tests/testcases/mqtt_basic.py b/lib/PubSubClient-2.6.09/tests/testcases/mqtt_basic.py
deleted file mode 100644
index f23ef71c13ea..000000000000
--- a/lib/PubSubClient-2.6.09/tests/testcases/mqtt_basic.py
+++ /dev/null
@@ -1,39 +0,0 @@
-import unittest
-import settings
-import time
-import mosquitto
-
-
-def on_message(mosq, obj, msg):
- obj.message_queue.append(msg)
-
-
-class mqtt_basic(unittest.TestCase):
-
- message_queue = []
-
- @classmethod
- def setUpClass(self):
- self.client = mosquitto.Mosquitto("pubsubclient_ut", clean_session=True, obj=self)
- self.client.connect(settings.server_ip)
- self.client.on_message = on_message
- self.client.subscribe("outTopic", 0)
-
- @classmethod
- def tearDownClass(self):
- self.client.disconnect()
-
- def test_one(self):
- i = 30
- while len(self.message_queue) == 0 and i > 0:
- self.client.loop()
- time.sleep(0.5)
- i -= 1
- self.assertTrue(i > 0, "message receive timed-out")
- self.assertEqual(len(self.message_queue), 1, "unexpected number of messages received")
- msg = self.message_queue[0]
- self.assertEqual(msg.mid, 0, "message id not 0")
- self.assertEqual(msg.topic, "outTopic", "message topic incorrect")
- self.assertEqual(msg.payload, "hello world")
- self.assertEqual(msg.qos, 0, "message qos not 0")
- self.assertEqual(msg.retain, False, "message retain flag incorrect")
diff --git a/lib/PubSubClient-2.6.09/tests/testcases/mqtt_publish_in_callback.py b/lib/PubSubClient-2.6.09/tests/testcases/mqtt_publish_in_callback.py
deleted file mode 100644
index 45b0a8515520..000000000000
--- a/lib/PubSubClient-2.6.09/tests/testcases/mqtt_publish_in_callback.py
+++ /dev/null
@@ -1,59 +0,0 @@
-import unittest
-import settings
-import time
-import mosquitto
-
-
-def on_message(mosq, obj, msg):
- obj.message_queue.append(msg)
-
-
-class mqtt_publish_in_callback(unittest.TestCase):
-
- message_queue = []
-
- @classmethod
- def setUpClass(self):
- self.client = mosquitto.Mosquitto("pubsubclient_ut", clean_session=True, obj=self)
- self.client.connect(settings.server_ip)
- self.client.on_message = on_message
- self.client.subscribe("outTopic", 0)
-
- @classmethod
- def tearDownClass(self):
- self.client.disconnect()
-
- def test_connect(self):
- i = 30
- while len(self.message_queue) == 0 and i > 0:
- self.client.loop()
- time.sleep(0.5)
- i -= 1
- self.assertTrue(i > 0, "message receive timed-out")
- self.assertEqual(len(self.message_queue), 1, "unexpected number of messages received")
- msg = self.message_queue.pop(0)
- self.assertEqual(msg.mid, 0, "message id not 0")
- self.assertEqual(msg.topic, "outTopic", "message topic incorrect")
- self.assertEqual(msg.payload, "hello world")
- self.assertEqual(msg.qos, 0, "message qos not 0")
- self.assertEqual(msg.retain, False, "message retain flag incorrect")
-
- def test_publish(self):
- self.assertEqual(len(self.message_queue), 0, "message queue not empty")
- payload = "abcdefghij"
- self.client.publish("inTopic", payload)
-
- i = 30
- while len(self.message_queue) == 0 and i > 0:
- self.client.loop()
- time.sleep(0.5)
- i -= 1
-
- self.assertTrue(i > 0, "message receive timed-out")
- self.assertEqual(len(self.message_queue), 1, "unexpected number of messages received")
- msg = self.message_queue.pop(0)
- self.assertEqual(msg.mid, 0, "message id not 0")
- self.assertEqual(msg.topic, "outTopic", "message topic incorrect")
- self.assertEqual(msg.payload, payload)
- self.assertEqual(msg.qos, 0, "message qos not 0")
- self.assertEqual(msg.retain, False, "message retain flag incorrect")
diff --git a/lib/PubSubClient-2.6.09/tests/testsuite.py b/lib/PubSubClient-2.6.09/tests/testsuite.py
deleted file mode 100644
index 788fc5d97c7b..000000000000
--- a/lib/PubSubClient-2.6.09/tests/testsuite.py
+++ /dev/null
@@ -1,181 +0,0 @@
-#!/usr/bin/env python
-import os
-import os.path
-import sys
-import shutil
-from subprocess import call
-import importlib
-import unittest
-import re
-
-from testcases import settings
-
-
-class Workspace(object):
-
- def __init__(self):
- self.root_dir = os.getcwd()
- self.build_dir = os.path.join(self.root_dir, "tmpbin")
- self.log_dir = os.path.join(self.root_dir, "logs")
- self.tests_dir = os.path.join(self.root_dir, "testcases")
- self.examples_dir = os.path.join(self.root_dir, "../PubSubClient/examples")
- self.examples = []
- self.tests = []
- if not os.path.isdir("../PubSubClient"):
- raise Exception("Cannot find PubSubClient library")
- try:
- return __import__('ino')
- except ImportError:
- raise Exception("ino tool not installed")
-
- def init(self):
- if os.path.isdir(self.build_dir):
- shutil.rmtree(self.build_dir)
- os.mkdir(self.build_dir)
- if os.path.isdir(self.log_dir):
- shutil.rmtree(self.log_dir)
- os.mkdir(self.log_dir)
-
- os.chdir(self.build_dir)
- call(["ino", "init"])
-
- shutil.copytree("../../PubSubClient", "lib/PubSubClient")
-
- filenames = []
- for root, dirs, files in os.walk(self.examples_dir):
- filenames += [os.path.join(root, f) for f in files if f.endswith(".ino")]
- filenames.sort()
- for e in filenames:
- self.examples.append(Sketch(self, e))
-
- filenames = []
- for root, dirs, files in os.walk(self.tests_dir):
- filenames += [os.path.join(root, f) for f in files if f.endswith(".ino")]
- filenames.sort()
- for e in filenames:
- self.tests.append(Sketch(self, e))
-
- def clean(self):
- shutil.rmtree(self.build_dir)
-
-
-class Sketch(object):
- def __init__(self, wksp, fn):
- self.w = wksp
- self.filename = fn
- self.basename = os.path.basename(self.filename)
- self.build_log = os.path.join(self.w.log_dir, "%s.log" % (os.path.basename(self.filename),))
- self.build_err_log = os.path.join(self.w.log_dir, "%s.err.log" % (os.path.basename(self.filename),))
- self.build_upload_log = os.path.join(self.w.log_dir, "%s.upload.log" % (os.path.basename(self.filename),))
-
- def build(self):
- sys.stdout.write(" Build: ")
- sys.stdout.flush()
-
- # Copy sketch over, replacing IP addresses as necessary
- fin = open(self.filename, "r")
- lines = fin.readlines()
- fin.close()
- fout = open(os.path.join(self.w.build_dir, "src", "sketch.ino"), "w")
- for l in lines:
- if re.match(r"^byte server\[\] = {", l):
- fout.write("byte server[] = { %s };\n" % (settings.server_ip.replace(".", ", "),))
- elif re.match(r"^byte ip\[\] = {", l):
- fout.write("byte ip[] = { %s };\n" % (settings.arduino_ip.replace(".", ", "),))
- else:
- fout.write(l)
- fout.flush()
- fout.close()
-
- # Run build
- fout = open(self.build_log, "w")
- ferr = open(self.build_err_log, "w")
- rc = call(["ino", "build"], stdout=fout, stderr=ferr)
- fout.close()
- ferr.close()
- if rc == 0:
- sys.stdout.write("pass")
- sys.stdout.write("\n")
- return True
- else:
- sys.stdout.write("fail")
- sys.stdout.write("\n")
- with open(self.build_err_log) as f:
- for line in f:
- print(" " + line)
- return False
-
- def upload(self):
- sys.stdout.write(" Upload: ")
- sys.stdout.flush()
- fout = open(self.build_upload_log, "w")
- rc = call(["ino", "upload"], stdout=fout, stderr=fout)
- fout.close()
- if rc == 0:
- sys.stdout.write("pass")
- sys.stdout.write("\n")
- return True
- else:
- sys.stdout.write("fail")
- sys.stdout.write("\n")
- with open(self.build_upload_log) as f:
- for line in f:
- print(" " + line)
- return False
-
- def test(self):
- # import the matching test case, if it exists
- try:
- basename = os.path.basename(self.filename)[:-4]
- i = importlib.import_module("testcases." + basename)
- except:
- sys.stdout.write(" Test: no tests found")
- sys.stdout.write("\n")
- return
- c = getattr(i, basename)
-
- testmethods = [m for m in dir(c) if m.startswith("test_")]
- testmethods.sort()
- tests = []
- for m in testmethods:
- tests.append(c(m))
-
- result = unittest.TestResult()
- c.setUpClass()
- if self.upload():
- sys.stdout.write(" Test: ")
- sys.stdout.flush()
- for t in tests:
- t.run(result)
- print(str(result.testsRun - len(result.failures) - len(result.errors)) + "/" + str(result.testsRun))
- if not result.wasSuccessful():
- if len(result.failures) > 0:
- for f in result.failures:
- print("-- " + str(f[0]))
- print(f[1])
- if len(result.errors) > 0:
- print(" Errors:")
- for f in result.errors:
- print("-- " + str(f[0]))
- print(f[1])
- c.tearDownClass()
-
-
-if __name__ == '__main__':
- run_tests = True
-
- w = Workspace()
- w.init()
-
- for e in w.examples:
- print("--------------------------------------")
- print("[" + e.basename + "]")
- if e.build() and run_tests:
- e.test()
- for e in w.tests:
- print("--------------------------------------")
- print("[" + e.basename + "]")
- if e.build() and run_tests:
- e.test()
-
- w.clean()
diff --git a/lib/PubSubClient-2.6.09/.gitignore b/lib/PubSubClient-EspEasy-2.6.09/.gitignore
similarity index 100%
rename from lib/PubSubClient-2.6.09/.gitignore
rename to lib/PubSubClient-EspEasy-2.6.09/.gitignore
diff --git a/lib/PubSubClient-2.6.09/.travis.yml b/lib/PubSubClient-EspEasy-2.6.09/.travis.yml
similarity index 100%
rename from lib/PubSubClient-2.6.09/.travis.yml
rename to lib/PubSubClient-EspEasy-2.6.09/.travis.yml
diff --git a/lib/PubSubClient-2.6.09/CHANGES.txt b/lib/PubSubClient-EspEasy-2.6.09/CHANGES.txt
similarity index 100%
rename from lib/PubSubClient-2.6.09/CHANGES.txt
rename to lib/PubSubClient-EspEasy-2.6.09/CHANGES.txt
diff --git a/lib/PubSubClient-2.6.09/LICENSE.txt b/lib/PubSubClient-EspEasy-2.6.09/LICENSE.txt
similarity index 100%
rename from lib/PubSubClient-2.6.09/LICENSE.txt
rename to lib/PubSubClient-EspEasy-2.6.09/LICENSE.txt
diff --git a/lib/PubSubClient-2.6.09/README.md b/lib/PubSubClient-EspEasy-2.6.09/README.md
similarity index 100%
rename from lib/PubSubClient-2.6.09/README.md
rename to lib/PubSubClient-EspEasy-2.6.09/README.md
diff --git a/lib/PubSubClient-2.6.09/examples/mqtt_auth/mqtt_auth.ino b/lib/PubSubClient-EspEasy-2.6.09/examples/mqtt_auth/mqtt_auth.ino
similarity index 100%
rename from lib/PubSubClient-2.6.09/examples/mqtt_auth/mqtt_auth.ino
rename to lib/PubSubClient-EspEasy-2.6.09/examples/mqtt_auth/mqtt_auth.ino
diff --git a/lib/PubSubClient-2.6.09/examples/mqtt_basic/mqtt_basic.ino b/lib/PubSubClient-EspEasy-2.6.09/examples/mqtt_basic/mqtt_basic.ino
similarity index 100%
rename from lib/PubSubClient-2.6.09/examples/mqtt_basic/mqtt_basic.ino
rename to lib/PubSubClient-EspEasy-2.6.09/examples/mqtt_basic/mqtt_basic.ino
diff --git a/lib/PubSubClient-2.6.09/examples/mqtt_esp8266/mqtt_esp8266.ino b/lib/PubSubClient-EspEasy-2.6.09/examples/mqtt_esp8266/mqtt_esp8266.ino
similarity index 94%
rename from lib/PubSubClient-2.6.09/examples/mqtt_esp8266/mqtt_esp8266.ino
rename to lib/PubSubClient-EspEasy-2.6.09/examples/mqtt_esp8266/mqtt_esp8266.ino
index 34333c9c1d9b..e46f85f3e412 100644
--- a/lib/PubSubClient-2.6.09/examples/mqtt_esp8266/mqtt_esp8266.ino
+++ b/lib/PubSubClient-EspEasy-2.6.09/examples/mqtt_esp8266/mqtt_esp8266.ino
@@ -38,6 +38,14 @@ long lastMsg = 0;
char msg[50];
int value = 0;
+void setup() {
+ pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output
+ Serial.begin(115200);
+ setup_wifi();
+ client.setServer(mqtt_server, 1883);
+ client.setCallback(callback);
+}
+
void setup_wifi() {
delay(10);
@@ -53,8 +61,6 @@ void setup_wifi() {
Serial.print(".");
}
- randomSeed(micros());
-
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
@@ -85,11 +91,8 @@ void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
- // Create a random client ID
- String clientId = "ESP8266Client-";
- clientId += String(random(0xffff), HEX);
// Attempt to connect
- if (client.connect(clientId.c_str())) {
+ if (client.connect("ESP8266Client")) {
Serial.println("connected");
// Once connected, publish an announcement...
client.publish("outTopic", "hello world");
@@ -104,15 +107,6 @@ void reconnect() {
}
}
}
-
-void setup() {
- pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output
- Serial.begin(115200);
- setup_wifi();
- client.setServer(mqtt_server, 1883);
- client.setCallback(callback);
-}
-
void loop() {
if (!client.connected()) {
diff --git a/lib/PubSubClient-2.6.09/examples/mqtt_publish_in_callback/mqtt_publish_in_callback.ino b/lib/PubSubClient-EspEasy-2.6.09/examples/mqtt_publish_in_callback/mqtt_publish_in_callback.ino
similarity index 100%
rename from lib/PubSubClient-2.6.09/examples/mqtt_publish_in_callback/mqtt_publish_in_callback.ino
rename to lib/PubSubClient-EspEasy-2.6.09/examples/mqtt_publish_in_callback/mqtt_publish_in_callback.ino
diff --git a/lib/PubSubClient-2.6.09/examples/mqtt_reconnect_nonblocking/mqtt_reconnect_nonblocking.ino b/lib/PubSubClient-EspEasy-2.6.09/examples/mqtt_reconnect_nonblocking/mqtt_reconnect_nonblocking.ino
similarity index 100%
rename from lib/PubSubClient-2.6.09/examples/mqtt_reconnect_nonblocking/mqtt_reconnect_nonblocking.ino
rename to lib/PubSubClient-EspEasy-2.6.09/examples/mqtt_reconnect_nonblocking/mqtt_reconnect_nonblocking.ino
diff --git a/lib/PubSubClient-2.6.09/examples/mqtt_stream/mqtt_stream.ino b/lib/PubSubClient-EspEasy-2.6.09/examples/mqtt_stream/mqtt_stream.ino
similarity index 100%
rename from lib/PubSubClient-2.6.09/examples/mqtt_stream/mqtt_stream.ino
rename to lib/PubSubClient-EspEasy-2.6.09/examples/mqtt_stream/mqtt_stream.ino
diff --git a/lib/PubSubClient-2.6.09/keywords.txt b/lib/PubSubClient-EspEasy-2.6.09/keywords.txt
similarity index 100%
rename from lib/PubSubClient-2.6.09/keywords.txt
rename to lib/PubSubClient-EspEasy-2.6.09/keywords.txt
diff --git a/lib/PubSubClient-2.6.09/library.json b/lib/PubSubClient-EspEasy-2.6.09/library.json
similarity index 100%
rename from lib/PubSubClient-2.6.09/library.json
rename to lib/PubSubClient-EspEasy-2.6.09/library.json
diff --git a/lib/PubSubClient-2.6.09/library.properties b/lib/PubSubClient-EspEasy-2.6.09/library.properties
similarity index 100%
rename from lib/PubSubClient-2.6.09/library.properties
rename to lib/PubSubClient-EspEasy-2.6.09/library.properties
diff --git a/lib/PubSubClient-2.6.09/src/PubSubClient.cpp b/lib/PubSubClient-EspEasy-2.6.09/src/PubSubClient.cpp
similarity index 95%
rename from lib/PubSubClient-2.6.09/src/PubSubClient.cpp
rename to lib/PubSubClient-EspEasy-2.6.09/src/PubSubClient.cpp
index 11e1c874a0eb..79eb2d52ee88 100644
--- a/lib/PubSubClient-2.6.09/src/PubSubClient.cpp
+++ b/lib/PubSubClient-EspEasy-2.6.09/src/PubSubClient.cpp
@@ -117,8 +117,8 @@ boolean PubSubClient::connect(const char *id, const char *user, const char *pass
if (!connected()) {
int result = 0;
- if (domain != NULL) {
- result = _client->connect(this->domain, this->port);
+ if (domain.length() != 0) {
+ result = _client->connect(this->domain.c_str(), this->port);
} else {
result = _client->connect(this->ip, this->port);
}
@@ -209,7 +209,7 @@ boolean PubSubClient::connect(const char *id, const char *user, const char *pass
boolean PubSubClient::readByte(uint8_t * result) {
uint32_t previousMillis = millis();
while(!_client->available()) {
- delay(1); // Add esp8266 de-blocking (Tasmota #790)
+ delay(1); // Add esp8266 de-blocking (Tasmota #790, EspEasy #1943)
uint32_t currentMillis = millis();
if(currentMillis - previousMillis >= ((int32_t) MQTT_SOCKET_TIMEOUT * 1000)){
return false;
@@ -241,11 +241,17 @@ uint16_t PubSubClient::readPacket(uint8_t* lengthLength) {
uint8_t start = 0;
do {
+ if (len == 6) {
+ // Invalid remaining length encoding - kill the connection
+ _state = MQTT_DISCONNECTED;
+ _client->stop();
+ return 0;
+ }
if(!readByte(&digit)) return 0;
buffer[len++] = digit;
length += (digit & 127) * multiplier;
multiplier *= 128;
- } while ((digit & 128) != 0);
+ } while ((digit & 128) != 0 && len < (MQTT_MAX_PACKET_SIZE -2));
*lengthLength = len-1;
if (isPublish) {
@@ -336,6 +342,9 @@ boolean PubSubClient::loop() {
} else if (type == MQTTPINGRESP) {
pingOutstanding = false;
}
+ } else if (!connected()) {
+ // readPacket has closed the connection
+ return false;
}
}
return true;
@@ -419,7 +428,7 @@ boolean PubSubClient::publish_P(const char* topic, const uint8_t* payload, unsig
lastOutActivity = millis();
- return rc == tlen + 4 + plength;
+ return rc == tlen + 3 + llen + plength;
}
boolean PubSubClient::write(uint8_t header, uint8_t* buf, uint16_t length) {
@@ -469,7 +478,7 @@ boolean PubSubClient::subscribe(const char* topic) {
}
boolean PubSubClient::subscribe(const char* topic, uint8_t qos) {
- if (qos < 0 || qos > 1) {
+ if (qos > 1) {
return false;
}
if (MQTT_MAX_PACKET_SIZE < 9 + strlen(topic)) {
@@ -514,9 +523,12 @@ boolean PubSubClient::unsubscribe(const char* topic) {
void PubSubClient::disconnect() {
buffer[0] = MQTTDISCONNECT;
buffer[1] = 0;
- _client->write(buffer,2);
+ if (_client != NULL) {
+ _client->write(buffer,2);
+ _client->flush();
+ _client->stop();
+ }
_state = MQTT_DISCONNECTED;
- _client->stop();
lastInActivity = lastOutActivity = millis();
}
@@ -524,7 +536,7 @@ uint16_t PubSubClient::writeString(const char* string, uint8_t* buf, uint16_t po
const char* idp = string;
uint16_t i = 0;
pos += 2;
- while (*idp) {
+ while (*idp && pos < (MQTT_MAX_PACKET_SIZE - 2)) {
buf[pos++] = *idp++;
i++;
}
@@ -559,7 +571,7 @@ PubSubClient& PubSubClient::setServer(uint8_t * ip, uint16_t port) {
PubSubClient& PubSubClient::setServer(IPAddress ip, uint16_t port) {
this->ip = ip;
this->port = port;
- this->domain = NULL;
+ this->domain = "";
return *this;
}
diff --git a/lib/PubSubClient-2.6.09/src/PubSubClient.h b/lib/PubSubClient-EspEasy-2.6.09/src/PubSubClient.h
similarity index 97%
rename from lib/PubSubClient-2.6.09/src/PubSubClient.h
rename to lib/PubSubClient-EspEasy-2.6.09/src/PubSubClient.h
index 7e37a472da5b..003df770ed2d 100644
--- a/lib/PubSubClient-2.6.09/src/PubSubClient.h
+++ b/lib/PubSubClient-EspEasy-2.6.09/src/PubSubClient.h
@@ -24,13 +24,13 @@
// MQTT_MAX_PACKET_SIZE : Maximum packet size
#ifndef MQTT_MAX_PACKET_SIZE
//#define MQTT_MAX_PACKET_SIZE 128
-//#define MQTT_MAX_PACKET_SIZE 512 // Tasmota
#define MQTT_MAX_PACKET_SIZE 1000 // Tasmota v5.11.1c
#endif
// MQTT_KEEPALIVE : keepAlive interval in Seconds
+// Keepalive timeout for default MQTT Broker is 10s
#ifndef MQTT_KEEPALIVE
-#define MQTT_KEEPALIVE 15
+#define MQTT_KEEPALIVE 10
#endif
// MQTT_SOCKET_TIMEOUT: socket timeout interval in Seconds
@@ -75,7 +75,7 @@
#define MQTTQOS1 (1 << 1)
#define MQTTQOS2 (2 << 1)
-#ifdef ESP8266
+#if defined(ESP8266) || defined(ESP32)
#include
#define MQTT_CALLBACK_SIGNATURE std::function callback
#else
@@ -97,7 +97,7 @@ class PubSubClient {
boolean write(uint8_t header, uint8_t* buf, uint16_t length);
uint16_t writeString(const char* string, uint8_t* buf, uint16_t pos);
IPAddress ip;
- const char* domain;
+ String domain;
uint16_t port;
Stream* stream;
int _state;
@@ -116,6 +116,7 @@ class PubSubClient {
PubSubClient(const char*, uint16_t, Client& client, Stream&);
PubSubClient(const char*, uint16_t, MQTT_CALLBACK_SIGNATURE,Client& client);
PubSubClient(const char*, uint16_t, MQTT_CALLBACK_SIGNATURE,Client& client, Stream&);
+ virtual ~PubSubClient() {}
PubSubClient& setServer(IPAddress ip, uint16_t port);
PubSubClient& setServer(uint8_t * ip, uint16_t port);
diff --git a/lib/PubSubClient-2.6.09/tests/.gitignore b/lib/PubSubClient-EspEasy-2.6.09/tests/.gitignore
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/.gitignore
rename to lib/PubSubClient-EspEasy-2.6.09/tests/.gitignore
diff --git a/lib/PubSubClient-2.6.09/tests/Makefile b/lib/PubSubClient-EspEasy-2.6.09/tests/Makefile
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/Makefile
rename to lib/PubSubClient-EspEasy-2.6.09/tests/Makefile
diff --git a/lib/PubSubClient-2.6.09/tests/README.md b/lib/PubSubClient-EspEasy-2.6.09/tests/README.md
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/README.md
rename to lib/PubSubClient-EspEasy-2.6.09/tests/README.md
diff --git a/lib/PubSubClient-2.6.09/tests/src/connect_spec.cpp b/lib/PubSubClient-EspEasy-2.6.09/tests/src/connect_spec.cpp
similarity index 92%
rename from lib/PubSubClient-2.6.09/tests/src/connect_spec.cpp
rename to lib/PubSubClient-EspEasy-2.6.09/tests/src/connect_spec.cpp
index 3c46e0cc4136..69f18646fb35 100644
--- a/lib/PubSubClient-2.6.09/tests/src/connect_spec.cpp
+++ b/lib/PubSubClient-EspEasy-2.6.09/tests/src/connect_spec.cpp
@@ -133,23 +133,6 @@ int test_connect_accepts_username_no_password() {
END_IT
}
-int test_connect_accepts_username_blank_password() {
- IT("accepts a username and blank password");
- ShimClient shimClient;
- shimClient.setAllowConnect(true);
-
- byte connect[] = { 0x10,0x20,0x0,0x4,0x4d,0x51,0x54,0x54,0x4,0xc2,0x0,0xf,0x0,0xc,0x63,0x6c,0x69,0x65,0x6e,0x74,0x5f,0x74,0x65,0x73,0x74,0x31,0x0,0x4,0x75,0x73,0x65,0x72,0x0,0x0};
- byte connack[] = { 0x20, 0x02, 0x00, 0x00 };
- shimClient.expect(connect,0x26);
- shimClient.respond(connack,4);
-
- PubSubClient client(server, 1883, callback, shimClient);
- int rc = client.connect((char*)"client_test1",(char*)"user",(char*)"pass");
- IS_TRUE(rc);
- IS_FALSE(shimClient.error());
-
- END_IT
-}
int test_connect_ignores_password_no_username() {
IT("ignores a password but no username");
diff --git a/lib/PubSubClient-2.6.09/tests/src/keepalive_spec.cpp b/lib/PubSubClient-EspEasy-2.6.09/tests/src/keepalive_spec.cpp
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/src/keepalive_spec.cpp
rename to lib/PubSubClient-EspEasy-2.6.09/tests/src/keepalive_spec.cpp
diff --git a/lib/PubSubClient-2.6.09/tests/src/lib/Arduino.h b/lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/Arduino.h
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/src/lib/Arduino.h
rename to lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/Arduino.h
diff --git a/lib/PubSubClient-2.6.09/tests/src/lib/BDDTest.cpp b/lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/BDDTest.cpp
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/src/lib/BDDTest.cpp
rename to lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/BDDTest.cpp
diff --git a/lib/PubSubClient-2.6.09/tests/src/lib/BDDTest.h b/lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/BDDTest.h
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/src/lib/BDDTest.h
rename to lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/BDDTest.h
diff --git a/lib/PubSubClient-2.6.09/tests/src/lib/Buffer.cpp b/lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/Buffer.cpp
similarity index 86%
rename from lib/PubSubClient-2.6.09/tests/src/lib/Buffer.cpp
rename to lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/Buffer.cpp
index f07759a3a523..59a2fbbbdc53 100644
--- a/lib/PubSubClient-2.6.09/tests/src/lib/Buffer.cpp
+++ b/lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/Buffer.cpp
@@ -2,13 +2,9 @@
#include "Arduino.h"
Buffer::Buffer() {
- this->pos = 0;
- this->length = 0;
}
Buffer::Buffer(uint8_t* buf, size_t size) {
- this->pos = 0;
- this->length = 0;
this->add(buf,size);
}
bool Buffer::available() {
diff --git a/lib/PubSubClient-2.6.09/tests/src/lib/Buffer.h b/lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/Buffer.h
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/src/lib/Buffer.h
rename to lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/Buffer.h
diff --git a/lib/PubSubClient-2.6.09/tests/src/lib/Client.h b/lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/Client.h
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/src/lib/Client.h
rename to lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/Client.h
diff --git a/lib/PubSubClient-2.6.09/tests/src/lib/IPAddress.cpp b/lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/IPAddress.cpp
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/src/lib/IPAddress.cpp
rename to lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/IPAddress.cpp
diff --git a/lib/PubSubClient-2.6.09/tests/src/lib/IPAddress.h b/lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/IPAddress.h
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/src/lib/IPAddress.h
rename to lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/IPAddress.h
diff --git a/lib/PubSubClient-2.6.09/tests/src/lib/ShimClient.cpp b/lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/ShimClient.cpp
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/src/lib/ShimClient.cpp
rename to lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/ShimClient.cpp
diff --git a/lib/PubSubClient-2.6.09/tests/src/lib/ShimClient.h b/lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/ShimClient.h
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/src/lib/ShimClient.h
rename to lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/ShimClient.h
diff --git a/lib/PubSubClient-2.6.09/tests/src/lib/Stream.cpp b/lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/Stream.cpp
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/src/lib/Stream.cpp
rename to lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/Stream.cpp
diff --git a/lib/PubSubClient-2.6.09/tests/src/lib/Stream.h b/lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/Stream.h
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/src/lib/Stream.h
rename to lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/Stream.h
diff --git a/lib/PubSubClient-2.6.09/tests/src/lib/trace.h b/lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/trace.h
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/src/lib/trace.h
rename to lib/PubSubClient-EspEasy-2.6.09/tests/src/lib/trace.h
diff --git a/lib/PubSubClient-2.6.09/tests/src/publish_spec.cpp b/lib/PubSubClient-EspEasy-2.6.09/tests/src/publish_spec.cpp
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/src/publish_spec.cpp
rename to lib/PubSubClient-EspEasy-2.6.09/tests/src/publish_spec.cpp
diff --git a/lib/PubSubClient-2.6.09/tests/src/receive_spec.cpp b/lib/PubSubClient-EspEasy-2.6.09/tests/src/receive_spec.cpp
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/src/receive_spec.cpp
rename to lib/PubSubClient-EspEasy-2.6.09/tests/src/receive_spec.cpp
diff --git a/lib/PubSubClient-2.6.09/tests/src/subscribe_spec.cpp b/lib/PubSubClient-EspEasy-2.6.09/tests/src/subscribe_spec.cpp
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/src/subscribe_spec.cpp
rename to lib/PubSubClient-EspEasy-2.6.09/tests/src/subscribe_spec.cpp
diff --git a/lib/PubSubClient-EspEasy-2.6.09/tests/testcases/__init__.py b/lib/PubSubClient-EspEasy-2.6.09/tests/testcases/__init__.py
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/lib/PubSubClient-EspEasy-2.6.09/tests/testcases/mqtt_basic.py b/lib/PubSubClient-EspEasy-2.6.09/tests/testcases/mqtt_basic.py
new file mode 100644
index 000000000000..1b0cc65bb432
--- /dev/null
+++ b/lib/PubSubClient-EspEasy-2.6.09/tests/testcases/mqtt_basic.py
@@ -0,0 +1,43 @@
+import unittest
+import settings
+
+import time
+import mosquitto
+
+import serial
+
+def on_message(mosq, obj, msg):
+ obj.message_queue.append(msg)
+
+class mqtt_basic(unittest.TestCase):
+
+ message_queue = []
+
+ @classmethod
+ def setUpClass(self):
+ self.client = mosquitto.Mosquitto("pubsubclient_ut", clean_session=True,obj=self)
+ self.client.connect(settings.server_ip)
+ self.client.on_message = on_message
+ self.client.subscribe("outTopic",0)
+
+ @classmethod
+ def tearDownClass(self):
+ self.client.disconnect()
+
+ def test_one(self):
+ i=30
+ while len(self.message_queue) == 0 and i > 0:
+ self.client.loop()
+ time.sleep(0.5)
+ i -= 1
+ self.assertTrue(i>0, "message receive timed-out")
+ self.assertEqual(len(self.message_queue), 1, "unexpected number of messages received")
+ msg = self.message_queue[0]
+ self.assertEqual(msg.mid,0,"message id not 0")
+ self.assertEqual(msg.topic,"outTopic","message topic incorrect")
+ self.assertEqual(msg.payload,"hello world")
+ self.assertEqual(msg.qos,0,"message qos not 0")
+ self.assertEqual(msg.retain,False,"message retain flag incorrect")
+
+
+
diff --git a/lib/PubSubClient-EspEasy-2.6.09/tests/testcases/mqtt_publish_in_callback.py b/lib/PubSubClient-EspEasy-2.6.09/tests/testcases/mqtt_publish_in_callback.py
new file mode 100644
index 000000000000..7989f7f17bed
--- /dev/null
+++ b/lib/PubSubClient-EspEasy-2.6.09/tests/testcases/mqtt_publish_in_callback.py
@@ -0,0 +1,64 @@
+import unittest
+import settings
+
+import time
+import mosquitto
+
+import serial
+
+def on_message(mosq, obj, msg):
+ obj.message_queue.append(msg)
+
+class mqtt_publish_in_callback(unittest.TestCase):
+
+ message_queue = []
+
+ @classmethod
+ def setUpClass(self):
+ self.client = mosquitto.Mosquitto("pubsubclient_ut", clean_session=True,obj=self)
+ self.client.connect(settings.server_ip)
+ self.client.on_message = on_message
+ self.client.subscribe("outTopic",0)
+
+ @classmethod
+ def tearDownClass(self):
+ self.client.disconnect()
+
+ def test_connect(self):
+ i=30
+ while len(self.message_queue) == 0 and i > 0:
+ self.client.loop()
+ time.sleep(0.5)
+ i -= 1
+ self.assertTrue(i>0, "message receive timed-out")
+ self.assertEqual(len(self.message_queue), 1, "unexpected number of messages received")
+ msg = self.message_queue.pop(0)
+ self.assertEqual(msg.mid,0,"message id not 0")
+ self.assertEqual(msg.topic,"outTopic","message topic incorrect")
+ self.assertEqual(msg.payload,"hello world")
+ self.assertEqual(msg.qos,0,"message qos not 0")
+ self.assertEqual(msg.retain,False,"message retain flag incorrect")
+
+
+ def test_publish(self):
+ self.assertEqual(len(self.message_queue), 0, "message queue not empty")
+ payload = "abcdefghij"
+ self.client.publish("inTopic",payload)
+
+ i=30
+ while len(self.message_queue) == 0 and i > 0:
+ self.client.loop()
+ time.sleep(0.5)
+ i -= 1
+
+ self.assertTrue(i>0, "message receive timed-out")
+ self.assertEqual(len(self.message_queue), 1, "unexpected number of messages received")
+ msg = self.message_queue.pop(0)
+ self.assertEqual(msg.mid,0,"message id not 0")
+ self.assertEqual(msg.topic,"outTopic","message topic incorrect")
+ self.assertEqual(msg.payload,payload)
+ self.assertEqual(msg.qos,0,"message qos not 0")
+ self.assertEqual(msg.retain,False,"message retain flag incorrect")
+
+
+
diff --git a/lib/PubSubClient-2.6.09/tests/testcases/settings.py b/lib/PubSubClient-EspEasy-2.6.09/tests/testcases/settings.py
similarity index 100%
rename from lib/PubSubClient-2.6.09/tests/testcases/settings.py
rename to lib/PubSubClient-EspEasy-2.6.09/tests/testcases/settings.py
diff --git a/lib/PubSubClient-EspEasy-2.6.09/tests/testsuite.py b/lib/PubSubClient-EspEasy-2.6.09/tests/testsuite.py
new file mode 100644
index 000000000000..0a8e70dfd986
--- /dev/null
+++ b/lib/PubSubClient-EspEasy-2.6.09/tests/testsuite.py
@@ -0,0 +1,179 @@
+#!/usr/bin/env python
+import os
+import os.path
+import sys
+import shutil
+from subprocess import call
+import importlib
+import unittest
+import re
+
+from testcases import settings
+
+class Workspace(object):
+
+ def __init__(self):
+ self.root_dir = os.getcwd()
+ self.build_dir = os.path.join(self.root_dir,"tmpbin");
+ self.log_dir = os.path.join(self.root_dir,"logs");
+ self.tests_dir = os.path.join(self.root_dir,"testcases");
+ self.examples_dir = os.path.join(self.root_dir,"../PubSubClient/examples")
+ self.examples = []
+ self.tests = []
+ if not os.path.isdir("../PubSubClient"):
+ raise Exception("Cannot find PubSubClient library")
+ try:
+ import ino
+ except:
+ raise Exception("ino tool not installed")
+
+ def init(self):
+ if os.path.isdir(self.build_dir):
+ shutil.rmtree(self.build_dir)
+ os.mkdir(self.build_dir)
+ if os.path.isdir(self.log_dir):
+ shutil.rmtree(self.log_dir)
+ os.mkdir(self.log_dir)
+
+ os.chdir(self.build_dir)
+ call(["ino","init"])
+
+ shutil.copytree("../../PubSubClient","lib/PubSubClient")
+
+ filenames = []
+ for root, dirs, files in os.walk(self.examples_dir):
+ filenames += [os.path.join(root,f) for f in files if f.endswith(".ino")]
+ filenames.sort()
+ for e in filenames:
+ self.examples.append(Sketch(self,e))
+
+ filenames = []
+ for root, dirs, files in os.walk(self.tests_dir):
+ filenames += [os.path.join(root,f) for f in files if f.endswith(".ino")]
+ filenames.sort()
+ for e in filenames:
+ self.tests.append(Sketch(self,e))
+
+ def clean(self):
+ shutil.rmtree(self.build_dir)
+
+class Sketch(object):
+ def __init__(self,wksp,fn):
+ self.w = wksp
+ self.filename = fn
+ self.basename = os.path.basename(self.filename)
+ self.build_log = os.path.join(self.w.log_dir,"%s.log"%(os.path.basename(self.filename),))
+ self.build_err_log = os.path.join(self.w.log_dir,"%s.err.log"%(os.path.basename(self.filename),))
+ self.build_upload_log = os.path.join(self.w.log_dir,"%s.upload.log"%(os.path.basename(self.filename),))
+
+ def build(self):
+ sys.stdout.write(" Build: ")
+ sys.stdout.flush()
+
+ # Copy sketch over, replacing IP addresses as necessary
+ fin = open(self.filename,"r")
+ lines = fin.readlines()
+ fin.close()
+ fout = open(os.path.join(self.w.build_dir,"src","sketch.ino"),"w")
+ for l in lines:
+ if re.match(r"^byte server\[\] = {",l):
+ fout.write("byte server[] = { %s };\n"%(settings.server_ip.replace(".",", "),))
+ elif re.match(r"^byte ip\[\] = {",l):
+ fout.write("byte ip[] = { %s };\n"%(settings.arduino_ip.replace(".",", "),))
+ else:
+ fout.write(l)
+ fout.flush()
+ fout.close()
+
+ # Run build
+ fout = open(self.build_log, "w")
+ ferr = open(self.build_err_log, "w")
+ rc = call(["ino","build"],stdout=fout,stderr=ferr)
+ fout.close()
+ ferr.close()
+ if rc == 0:
+ sys.stdout.write("pass")
+ sys.stdout.write("\n")
+ return True
+ else:
+ sys.stdout.write("fail")
+ sys.stdout.write("\n")
+ with open(self.build_err_log) as f:
+ for line in f:
+ print " ",line,
+ return False
+
+ def upload(self):
+ sys.stdout.write(" Upload: ")
+ sys.stdout.flush()
+ fout = open(self.build_upload_log, "w")
+ rc = call(["ino","upload"],stdout=fout,stderr=fout)
+ fout.close()
+ if rc == 0:
+ sys.stdout.write("pass")
+ sys.stdout.write("\n")
+ return True
+ else:
+ sys.stdout.write("fail")
+ sys.stdout.write("\n")
+ with open(self.build_upload_log) as f:
+ for line in f:
+ print " ",line,
+ return False
+
+
+ def test(self):
+ # import the matching test case, if it exists
+ try:
+ basename = os.path.basename(self.filename)[:-4]
+ i = importlib.import_module("testcases."+basename)
+ except:
+ sys.stdout.write(" Test: no tests found")
+ sys.stdout.write("\n")
+ return
+ c = getattr(i,basename)
+
+ testmethods = [m for m in dir(c) if m.startswith("test_")]
+ testmethods.sort()
+ tests = []
+ for m in testmethods:
+ tests.append(c(m))
+
+ result = unittest.TestResult()
+ c.setUpClass()
+ if self.upload():
+ sys.stdout.write(" Test: ")
+ sys.stdout.flush()
+ for t in tests:
+ t.run(result)
+ print "%d/%d"%(result.testsRun-len(result.failures)-len(result.errors),result.testsRun)
+ if not result.wasSuccessful():
+ if len(result.failures) > 0:
+ for f in result.failures:
+ print "-- %s"%(str(f[0]),)
+ print f[1]
+ if len(result.errors) > 0:
+ print " Errors:"
+ for f in result.errors:
+ print "-- %s"%(str(f[0]),)
+ print f[1]
+ c.tearDownClass()
+
+if __name__ == '__main__':
+ run_tests = True
+
+ w = Workspace()
+ w.init()
+
+ for e in w.examples:
+ print "--------------------------------------"
+ print "[%s]"%(e.basename,)
+ if e.build() and run_tests:
+ e.test()
+ for e in w.tests:
+ print "--------------------------------------"
+ print "[%s]"%(e.basename,)
+ if e.build() and run_tests:
+ e.test()
+
+ w.clean()
diff --git a/lib/TasmotaSerial-2.0.0/README.md b/lib/TasmotaModbus-1.1.0/README.md
similarity index 100%
rename from lib/TasmotaSerial-2.0.0/README.md
rename to lib/TasmotaModbus-1.1.0/README.md
diff --git a/lib/TasmotaModbus-1.1.0/examples/modbustest/modbustest.ino b/lib/TasmotaModbus-1.1.0/examples/modbustest/modbustest.ino
new file mode 100644
index 000000000000..6fb4720c00fb
--- /dev/null
+++ b/lib/TasmotaModbus-1.1.0/examples/modbustest/modbustest.ino
@@ -0,0 +1,31 @@
+
+#include
+
+TasmotaModbus Modbus(14, 12);
+
+void setup() {
+ Serial.begin(115200);
+ Modbus.Begin(9600);
+
+ Serial.println("\nTasmotaModbus test started");
+
+ Modbus.Send(0x01, 0x04, 0, 8);
+}
+
+void loop() {
+ if (Modbus.ReceiveReady()) {
+ uint8_t buffer[26];
+
+ uint8_t error = Modbus.ReceiveBuffer(buffer, 8);
+ if (error) {
+ Serial.print("Modbus response error ");
+ Serial.println(error);
+ } else {
+ Serial.print("Modbus received:");
+ for (int i = 0; i < (buffer[2]) ? buffer[2] +5 : sizeof(buffer); i++) {
+ Serial.print(" ");
+ Serial.print(buffer[i], HEX);
+ }
+ }
+ }
+}
diff --git a/lib/ESPAsyncUDP-master/keywords.txt b/lib/TasmotaModbus-1.1.0/keywords.txt
similarity index 55%
rename from lib/ESPAsyncUDP-master/keywords.txt
rename to lib/TasmotaModbus-1.1.0/keywords.txt
index 67c0b97a7152..e019564cfb2c 100644
--- a/lib/ESPAsyncUDP-master/keywords.txt
+++ b/lib/TasmotaModbus-1.1.0/keywords.txt
@@ -1,33 +1,26 @@
#######################################
-# Syntax Coloring Map For Ultrasound
+# Syntax Coloring Map for TasmotaModbus
+# (esp8266)
#######################################
#######################################
# Datatypes (KEYWORD1)
#######################################
-AsyncUDP KEYWORD1
-AsyncUDPPacket KEYWORD1
+TasmotaModbus KEYWORD1
#######################################
# Methods and Functions (KEYWORD2)
#######################################
-connect KEYWORD2
-connected KEYWORD2
-listen KEYWORD2
-listenMulticast KEYWORD2
-close KEYWORD2
-write KEYWORD2
-broadcast KEYWORD2
-onPacket KEYWORD2
-data KEYWORD2
-length KEYWORD2
-localIP KEYWORD2
-localPort KEYWORD2
-remoteIP KEYWORD2
-remotePort KEYWORD2
+Begin KEYWORD2
+Send KEYWORD2
+ReceiveReady KEYWORD2
+ReceiveBuffer KEYWORD2
+Receive16BitRegister KEYWORD2
+Receive32BitRegister KEYWORD2
#######################################
# Constants (LITERAL1)
#######################################
+
diff --git a/lib/TasmotaModbus-1.1.0/library.json b/lib/TasmotaModbus-1.1.0/library.json
new file mode 100644
index 000000000000..d983bec32cf3
--- /dev/null
+++ b/lib/TasmotaModbus-1.1.0/library.json
@@ -0,0 +1,15 @@
+{
+ "name": "TasmotaModbus",
+ "version": "1.1.0",
+ "keywords": [
+ "serial", "io", "TasmotaModbus"
+ ],
+ "description": "Basic modbus wrapper for TasmotaSerial for ESP8266.",
+ "repository":
+ {
+ "type": "git",
+ "url": "https://github.com/arendst/Sonoff-Tasmota/lib/TasmotaModbus"
+ },
+ "frameworks": "arduino",
+ "platforms": "espressif8266"
+}
diff --git a/lib/TasmotaModbus-1.1.0/library.properties b/lib/TasmotaModbus-1.1.0/library.properties
new file mode 100644
index 000000000000..bb42fb372733
--- /dev/null
+++ b/lib/TasmotaModbus-1.1.0/library.properties
@@ -0,0 +1,9 @@
+name=TasmotaModbus
+version=1.1.0
+author=Theo Arends
+maintainer=Theo Arends
+sentence=Basic modbus wrapper for TasmotaSerial for ESP8266.
+paragraph=
+category=Signal Input/Output
+url=
+architectures=esp8266
diff --git a/lib/TasmotaModbus-1.1.0/src/TasmotaModbus.cpp b/lib/TasmotaModbus-1.1.0/src/TasmotaModbus.cpp
new file mode 100644
index 000000000000..207fc07f8fe3
--- /dev/null
+++ b/lib/TasmotaModbus-1.1.0/src/TasmotaModbus.cpp
@@ -0,0 +1,146 @@
+/*
+ TasmotaModbus.cpp - Basic modbus wrapper for TasmotaSerial for Tasmota
+
+ Copyright (C) 2018 Theo Arends
+
+ This library is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+#include "TasmotaModbus.h"
+
+TasmotaModbus::TasmotaModbus(int receive_pin, int transmit_pin) : TasmotaSerial(receive_pin, transmit_pin, 1)
+{
+ mb_address = 0;
+}
+
+uint16_t CalculateCRC(uint8_t *frame, uint8_t num)
+{
+ uint16_t crc = 0xFFFF;
+
+ for (uint8_t i = 0; i < num; i++) {
+ crc ^= frame[i];
+ for (uint8_t j = 8; j; j--) {
+ if ((crc & 0x0001) != 0) { // If the LSB is set
+ crc >>= 1; // Shift right and XOR 0xA001
+ crc ^= 0xA001;
+ } else { // Else LSB is not set
+ crc >>= 1; // Just shift right
+ }
+ }
+ }
+ return crc;
+}
+
+int TasmotaModbus::Begin(long speed, int stop_bits)
+{
+ int result = 0;
+
+ if (begin(speed, stop_bits)) {
+ result = 1;
+ if (hardwareSerial()) { result = 2; }
+ }
+ return result;
+}
+
+void TasmotaModbus::Send(uint8_t device_address, uint8_t function_code, uint16_t start_address, uint16_t register_count)
+{
+ uint8_t frame[8];
+
+ mb_address = device_address; // Save address for receipt check
+
+ frame[0] = mb_address; // 0xFE default device address or dedicated like 0x01
+ frame[1] = function_code;
+ frame[2] = (uint8_t)(start_address >> 8);
+ frame[3] = (uint8_t)(start_address);
+ frame[4] = (uint8_t)(register_count >> 8);
+ frame[5] = (uint8_t)(register_count);
+ uint16_t crc = CalculateCRC(frame, 6);
+ frame[6] = (uint8_t)(crc);
+ frame[7] = (uint8_t)(crc >> 8);
+
+ flush();
+ write(frame, sizeof(frame));
+}
+
+bool TasmotaModbus::ReceiveReady()
+{
+ return (available() > 4);
+}
+
+uint8_t TasmotaModbus::ReceiveBuffer(uint8_t *buffer, uint8_t register_count)
+{
+ uint8_t len = 0;
+ uint32_t last = millis();
+ while ((available() > 0) && (len < (register_count *2) + 5) && (millis() - last < 10)) {
+ uint8_t data = (uint8_t)read();
+ if (!len) { // Skip leading data as provided by hardware serial
+ if (mb_address == data) {
+ buffer[len++] = data;
+ }
+ } else {
+ buffer[len++] = data;
+ if (3 == len) {
+ if (buffer[1] & 0x80) { // 01 84 02 f2 f1
+ return buffer[2]; // 1 = Illegal Function, 2 = Illegal Address, 3 = Illegal Data, 4 = Slave Error
+ }
+ }
+ }
+ last = millis();
+ }
+
+ if (len < 7) { return 7; } // 7 = Not enough data
+ if (len != buffer[2] + 5) { return 8; } // 8 = Unexpected result
+
+ uint16_t crc = (buffer[len -1] << 8) | buffer[len -2];
+ if (CalculateCRC(buffer, len -2) != crc) { return 9; } // 9 = crc error
+
+ return 0; // 0 = No error
+}
+
+uint8_t TasmotaModbus::Receive16BitRegister(uint16_t *value)
+{
+ // 0 1 2 3 4 5 6
+ // 01 04 02 43 21 HH LL
+ // Id Cc Sz Regis Crc--
+
+ uint8_t buffer[7];
+
+ uint8_t error = ReceiveBuffer(buffer, 1); // 1 x 16bit register
+ if (!error) {
+ *value = (buffer[3] << 8) | buffer[4];
+ }
+
+ return error;
+}
+
+uint8_t TasmotaModbus::Receive32BitRegister(float *value)
+{
+ // 0 1 2 3 4 5 6 7 8
+ // 01 04 04 87 65 43 21 HH LL
+ // Id Cc Sz Register--- Crc--
+
+ uint8_t buffer[9];
+
+ *value = NAN;
+
+ uint8_t error = ReceiveBuffer(buffer, 2); // 1 x 32bit register
+ if (!error) {
+ ((uint8_t*)value)[3] = buffer[3];
+ ((uint8_t*)value)[2] = buffer[4];
+ ((uint8_t*)value)[1] = buffer[5];
+ ((uint8_t*)value)[0] = buffer[6];
+ }
+
+ return error;
+}
diff --git a/lib/TasmotaModbus-1.1.0/src/TasmotaModbus.h b/lib/TasmotaModbus-1.1.0/src/TasmotaModbus.h
new file mode 100644
index 000000000000..5176aa89e06e
--- /dev/null
+++ b/lib/TasmotaModbus-1.1.0/src/TasmotaModbus.h
@@ -0,0 +1,57 @@
+/*
+ TasmotaModbus.h - Basic modbus wrapper for TasmotaSerial for Tasmota
+
+ Copyright (C) 2018 Theo Arends
+
+ This library is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+#ifndef TasmotaModbus_h
+#define TasmotaModbus_h
+
+#include
+#include
+
+#define TM_MODBUS_BAUDRATE 9600 // Default baudrate
+
+class TasmotaModbus : public TasmotaSerial {
+ public:
+ TasmotaModbus(int receive_pin, int transmit_pin);
+ virtual ~TasmotaModbus() {}
+
+ int Begin(long speed = TM_MODBUS_BAUDRATE, int stop_bits = 1);
+
+ void Send(uint8_t device_address, uint8_t function_code, uint16_t start_address, uint16_t register_count);
+
+ bool ReceiveReady();
+
+ /* Return codes:
+ * 0 - No error
+ * 1 - Illegal function
+ * 2 - Illegal address
+ * 3 - Illegal data
+ * 4 - Slave error
+ * 7 - Not enough minimal data received
+ * 8 - Not enough data receieved
+ * 9 - Crc error
+ */
+ uint8_t ReceiveBuffer(uint8_t *buffer, uint8_t register_count);
+ uint8_t Receive16BitRegister(uint16_t *value);
+ uint8_t Receive32BitRegister(float *value);
+
+ private:
+ uint8_t mb_address;
+};
+
+#endif // TasmotaModbus_h
diff --git a/lib/TasmotaSerial-2.2.0/README.md b/lib/TasmotaSerial-2.2.0/README.md
new file mode 100644
index 000000000000..019aafc074af
--- /dev/null
+++ b/lib/TasmotaSerial-2.2.0/README.md
@@ -0,0 +1,7 @@
+# TasmotaSerial
+
+Implementation of software serial with hardware serial fallback library for the ESP8266
+
+Allows for several instances to be active at the same time.
+
+Please note that due to the fact that the ESP always have other activities ongoing, there will be some inexactness in interrupt timings. This may lead to bit errors when having heavy data traffic.
diff --git a/lib/TasmotaSerial-2.0.0/examples/swsertest/swsertest.ino b/lib/TasmotaSerial-2.2.0/examples/swsertest/swsertest.ino
similarity index 100%
rename from lib/TasmotaSerial-2.0.0/examples/swsertest/swsertest.ino
rename to lib/TasmotaSerial-2.2.0/examples/swsertest/swsertest.ino
diff --git a/lib/TasmotaSerial-2.0.0/keywords.txt b/lib/TasmotaSerial-2.2.0/keywords.txt
similarity index 100%
rename from lib/TasmotaSerial-2.0.0/keywords.txt
rename to lib/TasmotaSerial-2.2.0/keywords.txt
diff --git a/lib/TasmotaSerial-2.0.0/library.json b/lib/TasmotaSerial-2.2.0/library.json
similarity index 94%
rename from lib/TasmotaSerial-2.0.0/library.json
rename to lib/TasmotaSerial-2.2.0/library.json
index 00a2a9e0fc36..23a2ddab9cf9 100644
--- a/lib/TasmotaSerial-2.0.0/library.json
+++ b/lib/TasmotaSerial-2.2.0/library.json
@@ -1,6 +1,6 @@
{
"name": "TasmotaSerial",
- "version": "2.0.0",
+ "version": "2.2.0",
"keywords": [
"serial", "io", "TasmotaSerial"
],
diff --git a/lib/TasmotaSerial-2.0.0/library.properties b/lib/TasmotaSerial-2.2.0/library.properties
similarity index 94%
rename from lib/TasmotaSerial-2.0.0/library.properties
rename to lib/TasmotaSerial-2.2.0/library.properties
index b250399b9ddc..54c79e218e61 100644
--- a/lib/TasmotaSerial-2.0.0/library.properties
+++ b/lib/TasmotaSerial-2.2.0/library.properties
@@ -1,5 +1,5 @@
name=TasmotaSerial
-version=2.0.0
+version=2.2.0
author=Theo Arends
maintainer=Theo Arends
sentence=Implementation of software serial with hardware serial fallback for ESP8266.
diff --git a/lib/TasmotaSerial-2.0.0/src/TasmotaSerial.cpp b/lib/TasmotaSerial-2.2.0/src/TasmotaSerial.cpp
similarity index 86%
rename from lib/TasmotaSerial-2.0.0/src/TasmotaSerial.cpp
rename to lib/TasmotaSerial-2.2.0/src/TasmotaSerial.cpp
index cbd2a352300e..3df42f834e00 100644
--- a/lib/TasmotaSerial-2.0.0/src/TasmotaSerial.cpp
+++ b/lib/TasmotaSerial-2.2.0/src/TasmotaSerial.cpp
@@ -76,19 +76,26 @@ static void (*ISRList[16])() = {
tms_isr_15
};
-TasmotaSerial::TasmotaSerial(int receive_pin, int transmit_pin, bool hardware_fallback)
+TasmotaSerial::TasmotaSerial(int receive_pin, int transmit_pin, int hardware_fallback)
{
m_valid = false;
m_hardserial = 0;
+ m_hardswap = 0;
+ m_stop_bits = 1;
if (!((isValidGPIOpin(receive_pin)) && (isValidGPIOpin(transmit_pin) || transmit_pin == 16))) {
return;
}
m_rx_pin = receive_pin;
m_tx_pin = transmit_pin;
m_in_pos = m_out_pos = 0;
- if (hardware_fallback && (((1 == m_rx_pin) && (3 == m_tx_pin)) || ((3 == m_rx_pin) && (-1 == m_tx_pin)) || ((-1 == m_rx_pin) && (1 == m_tx_pin)))) {
+ if (hardware_fallback && (((3 == m_rx_pin) && (1 == m_tx_pin)) || ((3 == m_rx_pin) && (-1 == m_tx_pin)) || ((-1 == m_rx_pin) && (1 == m_tx_pin)))) {
m_hardserial = 1;
- } else {
+ }
+ else if ((2 == hardware_fallback) && (((13 == m_rx_pin) && (15 == m_tx_pin)) || ((13 == m_rx_pin) && (-1 == m_tx_pin)) || ((-1 == m_rx_pin) && (15 == m_tx_pin)))) {
+ m_hardserial = 1;
+ m_hardswap = 1;
+ }
+ else {
if (m_rx_pin > -1) {
m_buffer = (uint8_t*)malloc(TM_SERIAL_BUFFER_SIZE);
if (m_buffer == NULL) return;
@@ -106,15 +113,36 @@ TasmotaSerial::TasmotaSerial(int receive_pin, int transmit_pin, bool hardware_fa
m_valid = true;
}
+TasmotaSerial::~TasmotaSerial()
+{
+ if (!m_hardserial) {
+ if (m_rx_pin > -1) {
+ detachInterrupt(m_rx_pin);
+ tms_obj_list[m_rx_pin] = NULL;
+ if (m_buffer) {
+ free(m_buffer);
+ }
+ }
+ }
+}
+
bool TasmotaSerial::isValidGPIOpin(int pin)
{
return (pin >= -1 && pin <= 5) || (pin >= 12 && pin <= 15);
}
-bool TasmotaSerial::begin(long speed) {
+bool TasmotaSerial::begin(long speed, int stop_bits) {
+ m_stop_bits = ((stop_bits -1) &1) +1;
if (m_hardserial) {
Serial.flush();
- Serial.begin(speed, SERIAL_8N1);
+ if (2 == m_stop_bits) {
+ Serial.begin(speed, SERIAL_8N2);
+ } else {
+ Serial.begin(speed, SERIAL_8N1);
+ }
+ if (m_hardswap) {
+ Serial.swap();
+ }
} else {
// Use getCycleCount() loop to get as exact timing as possible
m_bit_time = ESP.getCpuFreqMHz() *1000000 /speed;
@@ -195,9 +223,11 @@ size_t TasmotaSerial::write(uint8_t b)
TM_SERIAL_WAIT;
b >>= 1;
}
- // Stop bit
- digitalWrite(m_tx_pin, HIGH);
- TM_SERIAL_WAIT;
+ // Stop bit(s)
+ for (int i = 0; i < m_stop_bits; i++) {
+ digitalWrite(m_tx_pin, HIGH);
+ TM_SERIAL_WAIT;
+ }
if (m_high_speed) sei();
return 1;
}
@@ -220,8 +250,12 @@ void TasmotaSerial::rxRead()
rec >>= 1;
if (digitalRead(m_rx_pin)) rec |= 0x80;
}
- // Stop bit
+ // Stop bit(s)
TM_SERIAL_WAIT;
+ if (2 == m_stop_bits) {
+ digitalRead(m_rx_pin);
+ TM_SERIAL_WAIT;
+ }
// Store the received value in the buffer unless we have an overflow
int next = (m_in_pos+1) % TM_SERIAL_BUFFER_SIZE;
if (next != (int)m_out_pos) {
diff --git a/lib/TasmotaSerial-2.0.0/src/TasmotaSerial.h b/lib/TasmotaSerial-2.2.0/src/TasmotaSerial.h
similarity index 90%
rename from lib/TasmotaSerial-2.0.0/src/TasmotaSerial.h
rename to lib/TasmotaSerial-2.2.0/src/TasmotaSerial.h
index d4c993368f0f..de991526a972 100644
--- a/lib/TasmotaSerial-2.0.0/src/TasmotaSerial.h
+++ b/lib/TasmotaSerial-2.2.0/src/TasmotaSerial.h
@@ -33,12 +33,15 @@
#define TM_SERIAL_USE_IRAM // Enable to use iram (+368 bytes)
#endif
+#include
#include
class TasmotaSerial : public Stream {
public:
- TasmotaSerial(int receive_pin, int transmit_pin, bool hardware_fallback = false);
- bool begin(long speed);
+ TasmotaSerial(int receive_pin, int transmit_pin, int hardware_fallback = 0);
+ virtual ~TasmotaSerial();
+
+ bool begin(long speed, int stop_bits = 1);
bool begin();
bool hardwareSerial();
int peek();
@@ -59,9 +62,11 @@ class TasmotaSerial : public Stream {
// Member variables
bool m_valid;
bool m_hardserial;
+ bool m_hardswap;
bool m_high_speed;
int m_rx_pin;
int m_tx_pin;
+ int m_stop_bits;
unsigned long m_bit_time;
unsigned int m_in_pos;
unsigned int m_out_pos;
diff --git a/lib/arduino-mqtt-2.4.0/.editorconfig b/lib/arduino-mqtt-2.4.0/.editorconfig
new file mode 100644
index 000000000000..3edae7b539af
--- /dev/null
+++ b/lib/arduino-mqtt-2.4.0/.editorconfig
@@ -0,0 +1,7 @@
+[Makefile]
+indent_style = tab
+indent_size = 4
+
+[src/*.h,src/*.cpp,examples/**.ino]
+indent_style = space
+indent_size = 2
diff --git a/lib/arduino-mqtt-2.4.0/.gitignore b/lib/arduino-mqtt-2.4.0/.gitignore
new file mode 100644
index 000000000000..0c4fe4711d3a
--- /dev/null
+++ b/lib/arduino-mqtt-2.4.0/.gitignore
@@ -0,0 +1,2 @@
+.DS_Store
+cmake-build-debug/
diff --git a/lib/arduino-mqtt-2.4.0/.travis.yml b/lib/arduino-mqtt-2.4.0/.travis.yml
new file mode 100644
index 000000000000..6971b9fbaa3e
--- /dev/null
+++ b/lib/arduino-mqtt-2.4.0/.travis.yml
@@ -0,0 +1,46 @@
+language: generic
+env:
+ global:
+ - IDE_VERSION=1.8.7
+ matrix:
+ - EXAMPLE="AdafruitHuzzahESP8266" BOARD="esp8266:esp8266:huzzah:FlashSize=4M3M,CpuFrequency=80"
+ - EXAMPLE="AdafruitHuzzahESP8266Secure" BOARD="esp8266:esp8266:huzzah:FlashSize=4M3M,CpuFrequency=80"
+ - EXAMPLE="ArduinoEthernetShield" BOARD="arduino:avr:uno"
+ - EXAMPLE="ArduinoMKRGSM1400" BOARD="arduino:samd:mkrgsm1400"
+ - EXAMPLE="ArduinoMKRGSM1400Secure" BOARD="arduino:samd:mkrgsm1400"
+ - EXAMPLE="ArduinoWiFi101Secure" BOARD="arduino:avr:uno"
+ - EXAMPLE="ArduinoWiFiShield" BOARD="arduino:avr:uno"
+ - EXAMPLE="ArduinoYun" BOARD="arduino:avr:yun"
+ - EXAMPLE="ArduinoYunSecure" BOARD="arduino:avr:yun"
+ - EXAMPLE="ESP32DevelopmentBoard" BOARD="espressif:esp32:esp32:FlashFreq=80"
+ - EXAMPLE="ESP32DevelopmentBoardSecure" BOARD="espressif:esp32:esp32:FlashFreq=80"
+before_install:
+ - /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_1.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :1 -ac -screen 0 1280x1024x16
+ - sleep 3
+ - export DISPLAY=:1.0
+ - wget http://downloads.arduino.cc/arduino-$IDE_VERSION-linux64.tar.xz
+ - tar xf arduino-$IDE_VERSION-linux64.tar.xz
+ - mv arduino-$IDE_VERSION ~/arduino-ide
+ - export PATH=$PATH:~/arduino-ide
+ - if [[ "$BOARD" =~ "esp8266:esp8266:" ]]; then
+ arduino --pref "boardsmanager.additional.urls=http://arduino.esp8266.com/stable/package_esp8266com_index.json" --install-boards esp8266:esp8266;
+ arduino --pref "boardsmanager.additional.urls=" --save-prefs;
+ fi
+ - if [[ "$BOARD" =~ "espressif:esp32:" ]]; then
+ mkdir -p ~/Arduino/hardware/espressif &&
+ cd ~/Arduino/hardware/espressif &&
+ git clone https://github.com/espressif/arduino-esp32.git esp32 &&
+ cd esp32/tools/ &&
+ python get.py &&
+ cd $TRAVIS_BUILD_DIR;
+ fi
+ - if [[ "$BOARD" =~ "arduino:samd:mkrgsm1400" ]]; then
+ arduino --install-boards arduino:samd;
+ arduino --install-library MKRGSM;
+ fi
+ - arduino --install-library WiFi101
+install:
+ - mkdir -p ~/Arduino/libraries
+ - ln -s $PWD ~/Arduino/libraries/.
+script:
+ - arduino --verbose-build --verify --board $BOARD $PWD/examples/$EXAMPLE/$EXAMPLE.ino;
diff --git a/lib/arduino-mqtt-2.4.0/CMakeLists.txt b/lib/arduino-mqtt-2.4.0/CMakeLists.txt
new file mode 100644
index 000000000000..328ce0c8785f
--- /dev/null
+++ b/lib/arduino-mqtt-2.4.0/CMakeLists.txt
@@ -0,0 +1,38 @@
+# Uncompilable CMake File to enable project editing with CLion IDE
+
+cmake_minimum_required(VERSION 2.8.4)
+project(arduino-mqtt)
+
+include_directories(
+ /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/
+ /Users/256dpi/Development/Arduino/libraries/Ethernet/src
+ /Users/256dpi/Development/Arduino/libraries/WiFi101/src
+ /Users/256dpi/Development/Arduino/libraries/MKRGSM/src
+ /Applications/Arduino.app/Contents/Java/libraries/Bridge/src
+ /Users/256dpi/Library/Arduino15/packages/esp8266/hardware/esp8266/2.3.0/libraries/ESP8266WiFi/src
+ /Users/256dpi/Library/Arduino15/packages/esp32/libraries/WiFi/src
+ /Users/256dpi/Library/Arduino15/packages/esp32/libraries/WiFiClientSecure/src
+ src/)
+
+include_directories(src/)
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
+
+set(SOURCE_FILES
+ examples/AdafruitHuzzahESP8266/AdafruitHuzzahESP8266.ino
+ examples/AdafruitHuzzahESP8266Secure/AdafruitHuzzahESP8266Secure.ino
+ examples/ArduinoEthernetShield/ArduinoEthernetShield.ino
+ examples/ArduinoMKRGSM1400/ArduinoMKRGSM1400.ino
+ examples/ArduinoMKRGSM1400Secure/ArduinoMKRGSM1400Secure.ino
+ examples/ArduinoWiFi101/ArduinoWiFi101.ino
+ examples/ArduinoWiFi101Secure/ArduinoWiFi101Secure.ino
+ examples/ArduinoWiFiShield/ArduinoWiFiShield.ino
+ examples/ArduinoYun/ArduinoYun.ino
+ examples/ArduinoYunSecure/ArduinoYunSecure.ino
+ examples/ESP32DevelopmentBoard/ESP32DevelopmentBoard.ino
+ examples/ESP32DevelopmentBoardSecure/ESP32DevelopmentBoardSecure.ino
+ src/lwmqtt
+ src/MQTT.h
+ src/MQTTClient.h)
+
+add_executable(arduino-mqtt ${SOURCE_FILES})
diff --git a/lib/arduino-mqtt-2.4.0/LICENSE.md b/lib/arduino-mqtt-2.4.0/LICENSE.md
new file mode 100644
index 000000000000..325e07cffe58
--- /dev/null
+++ b/lib/arduino-mqtt-2.4.0/LICENSE.md
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Joël Gähwiler
+
+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.
diff --git a/lib/arduino-mqtt-2.4.0/Makefile b/lib/arduino-mqtt-2.4.0/Makefile
new file mode 100644
index 000000000000..9e734fcc30a2
--- /dev/null
+++ b/lib/arduino-mqtt-2.4.0/Makefile
@@ -0,0 +1,14 @@
+all: fmt
+
+fmt:
+ clang-format -i src/*.h -style="{BasedOnStyle: Google, ColumnLimit: 120}"
+
+update:
+ rm -rf ./lwmqtt
+ git clone --branch v0.6.2 https://github.com/256dpi/lwmqtt.git ./lwmqtt
+ mkdir -p ./src/lwmqtt
+ cp -r ./lwmqtt/src/*.c ./src/lwmqtt/
+ cp -r ./lwmqtt/src/*.h ./src/lwmqtt/
+ cp -r ./lwmqtt/include/*.h ./src/lwmqtt/
+ rm -rf ./lwmqtt
+ sed -i '' "s//\"lwmqtt.h\"/g" ./src/lwmqtt/*
diff --git a/lib/arduino-mqtt-2.4.0/README.md b/lib/arduino-mqtt-2.4.0/README.md
new file mode 100644
index 000000000000..92e61ed6e444
--- /dev/null
+++ b/lib/arduino-mqtt-2.4.0/README.md
@@ -0,0 +1,226 @@
+# arduino-mqtt
+
+[![Build Status](https://travis-ci.org/256dpi/arduino-mqtt.svg?branch=master)](https://travis-ci.org/256dpi/arduino-mqtt)
+[![GitHub release](https://img.shields.io/github/release/256dpi/arduino-mqtt.svg)](https://github.com/256dpi/arduino-mqtt/releases)
+
+This library bundles the [lwmqtt](https://github.com/256dpi/lwmqtt) MQTT 3.1.1 client and adds a thin wrapper to get an Arduino like API.
+
+Download the latest version from the [release](https://github.com/256dpi/arduino-mqtt/releases) section. Or even better use the builtin Library Manager in the Arduino IDE and search for "MQTT".
+
+The library is also available on [PlatformIO](https://platformio.org/lib/show/617/MQTT). You can install it by running: `pio lib install "MQTT"`.
+
+## Compatibility
+
+The following examples show how you can use the library with various Arduino compatible hardware:
+
+- [Arduino Yun & Yun-Shield](https://github.com/256dpi/arduino-mqtt/blob/master/examples/ArduinoYun/ArduinoYun.ino) ([Secure](https://github.com/256dpi/arduino-mqtt/blob/master/examples/ArduinoYunSecure/ArduinoYunSecure.ino))
+- [Arduino Ethernet Shield](https://github.com/256dpi/arduino-mqtt/blob/master/examples/ArduinoEthernetShield/ArduinoEthernetShield.ino)
+- [Arduino WiFi Shield](https://github.com/256dpi/arduino-mqtt/blob/master/examples/ArduinoWiFiShield/ArduinoWiFiShield.ino)
+- [Adafruit HUZZAH ESP8266](https://github.com/256dpi/arduino-mqtt/blob/master/examples/AdafruitHuzzahESP8266/AdafruitHuzzahESP8266.ino) ([Secure](https://github.com/256dpi/arduino-mqtt/blob/master/examples/AdafruitHuzzahESP8266Secure/AdafruitHuzzahESP8266Secure.ino))
+- [Arduino/Genuino WiFi101 Shield](https://github.com/256dpi/arduino-mqtt/blob/master/examples/ArduinoWiFi101/ArduinoWiFi101.ino) ([Secure](https://github.com/256dpi/arduino-mqtt/blob/master/examples/ArduinoWiFi101Secure/ArduinoWiFi101Secure.ino))
+- [Arduino MKR GSM 1400](https://github.com/256dpi/arduino-mqtt/blob/master/examples/ArduinoMKRGSM1400/ArduinoMKRGSM1400.ino) ([Secure](https://github.com/256dpi/arduino-mqtt/blob/master/examples/ArduinoMKRGSM1400Secure/ArduinoMKRGSM1400Secure.ino))
+- [ESP32 Development Board](https://github.com/256dpi/arduino-mqtt/blob/master/examples/ESP32DevelopmentBoard/ESP32DevelopmentBoard.ino) ([Secure](https://github.com/256dpi/arduino-mqtt/blob/master/examples/ESP32DevelopmentBoardSecure/ESP32DevelopmentBoardSecure.ino))
+
+Other shields and boards should also work if they provide a [Client](https://www.arduino.cc/en/Reference/ClientConstructor) based network implementation.
+
+## Notes
+
+- The maximum size for packets being published and received is set by default to 128 bytes. To change the buffer sizes, you need to use `MQTTClient client(256)` instead of just `MQTTClient client` on the top of your sketch. The passed value denotes the read and write buffer size.
+
+- On the ESP8266 it has been reported that an additional `delay(10);` after `client.loop();` fixes many stability issues with WiFi connections.
+
+- To use the library with shiftr.io, you need to provide the token key (username) and token secret (password) as the second and third argument to `client.connect(name, key, secret)`.
+
+## Example
+
+The following example uses an Arduino MKR1000 to connect to shiftr.io. You can check on your device after a successful connection here: https://shiftr.io/try.
+
+```c++
+#include
+#include
+#include
+
+const char ssid[] = "ssid";
+const char pass[] = "pass";
+
+WiFiClient net;
+MQTTClient client;
+
+unsigned long lastMillis = 0;
+
+void connect() {
+ Serial.print("checking wifi...");
+ while (WiFi.status() != WL_CONNECTED) {
+ Serial.print(".");
+ delay(1000);
+ }
+
+ Serial.print("\nconnecting...");
+ while (!client.connect("arduino", "try", "try")) {
+ Serial.print(".");
+ delay(1000);
+ }
+
+ Serial.println("\nconnected!");
+
+ client.subscribe("/hello");
+ // client.unsubscribe("/hello");
+}
+
+void messageReceived(String &topic, String &payload) {
+ Serial.println("incoming: " + topic + " - " + payload);
+}
+
+void setup() {
+ Serial.begin(115200);
+ WiFi.begin(ssid, pass);
+
+ // Note: Local domain names (e.g. "Computer.local" on OSX) are not supported by Arduino.
+ // You need to set the IP address directly.
+ client.begin("broker.shiftr.io", net);
+ client.onMessage(messageReceived);
+
+ connect();
+}
+
+void loop() {
+ client.loop();
+
+ if (!client.connected()) {
+ connect();
+ }
+
+ // publish a message roughly every second.
+ if (millis() - lastMillis > 1000) {
+ lastMillis = millis();
+ client.publish("/hello", "world");
+ }
+}
+```
+
+## API
+
+Initialize the object using the hostname of the broker, the brokers port (default: `1883`) and the underlying Client class for network transport:
+
+```c++
+void begin(const char hostname[], Client &client);
+void begin(const char hostname[], int port, Client &client);
+```
+
+- Specify port `8883` when using secure clients for encrypted connections.
+- Local domain names (e.g. `Computer.local` on OSX) are not supported by Arduino. You need to set the IP address directly.
+
+The hostname and port can also be changed after calling `begin()`:
+
+```c++
+void setHost(const char hostname[]);
+void setHost(const char hostname[], int port);
+```
+
+Set a will message (last testament) that gets registered on the broker after connecting. `setWill()` has to be called before calling `connect()`:
+
+```c++
+void setWill(const char topic[]);
+void setWill(const char topic[], const char payload[]);
+void setWill(const char topic[], const char payload[], bool retained, int qos);
+void clearWill();
+```
+
+Register a callback to receive messages:
+
+```c++
+void onMessage(MQTTClientCallbackSimple);
+// Callback signature: void messageReceived(String &topic, String &payload) {}
+
+void onMessageAdvanced(MQTTClientCallbackAdvanced);
+// Callback signature: void messageReceived(MQTTClient *client, char topic[], char payload[], int payload_length) {}
+```
+
+- The set callback is mostly called during a call to `loop()` but may also be called during a call to `subscribe()`, `unsubscribe()` or `publish() // QoS > 0` if messages have been received before receiving the required acknowledgement. Therefore, it is strongly recommended to not call `subscribe()`, `unsubscribe()` or `publish() // QoS > 0` directly in the callback.
+
+Set more advanced options:
+
+```c++
+void setOptions(int keepAlive, bool cleanSession, int timeout);
+```
+
+- The `keepAlive` option controls the keep alive interval in seconds (default: 10).
+- The `cleanSession` option controls the session retention on the broker side (default: true).
+- The `timeout` option controls the default timeout for all commands in milliseconds (default: 1000).
+
+Connect to broker using the supplied client id and an optional username and password:
+
+```c++
+bool connect(const char clientId[], bool skip = false);
+bool connect(const char clientId[], const char username[], bool skip = false);
+bool connect(const char clientId[], const char username[], const char password[], bool skip = false);
+```
+
+- If the `skip` option is set to true, the client will skip the network level connection and jump to the MQTT level connection. This option can be used in order to establish and verify TLS connections manually before giving control to the MQTT client.
+- This functions returns a boolean that indicates if the connection has been established successfully.
+
+Publishes a message to the broker with an optional payload:
+
+```c++
+bool publish(const String &topic);
+bool publish(const char topic[]);
+bool publish(const String &topic, const String &payload);
+bool publish(const String &topic, const String &payload, bool retained, int qos);
+bool publish(const char topic[], const String &payload);
+bool publish(const char topic[], const String &payload, bool retained, int qos);
+bool publish(const char topic[], const char payload[]);
+bool publish(const char topic[], const char payload[], bool retained, int qos);
+bool publish(const char topic[], const char payload[], int length);
+bool publish(const char topic[], const char payload[], int length, bool retained, int qos);
+```
+
+Subscribe to a topic:
+
+```c++
+bool subscribe(const String &topic);
+bool subscribe(const String &topic, int qos);
+bool subscribe(const char topic[]);
+bool subscribe(const char topic[], int qos);
+```
+
+Unsubscribe from a topic:
+
+```c++
+bool unsubscribe(const String &topic);
+bool unsubscribe(const char topic[]);
+```
+
+Sends and receives packets:
+
+```c++
+bool loop();
+```
+
+- This function should be called in every `loop`.
+
+Check if the client is currently connected:
+
+```c++
+bool connected();
+```
+
+Access low-level information for debugging:
+
+```c++
+lwmqtt_err_t lastError();
+lwmqtt_return_code_t returnCode();
+```
+
+- The error codes can be found [here](https://github.com/256dpi/lwmqtt/blob/master/include/lwmqtt.h#L11).
+- The return codes can be found [here](https://github.com/256dpi/lwmqtt/blob/master/include/lwmqtt.h#L243).
+
+Disconnect from the broker:
+
+```c++
+bool disconnect();
+```
+
+## Release Management
+
+- Update version in `library.properties`.
+- Create release on GitHub.
diff --git a/lib/arduino-mqtt-2.4.0/examples/AdafruitHuzzahESP8266/AdafruitHuzzahESP8266.ino b/lib/arduino-mqtt-2.4.0/examples/AdafruitHuzzahESP8266/AdafruitHuzzahESP8266.ino
new file mode 100644
index 000000000000..ca5a22607792
--- /dev/null
+++ b/lib/arduino-mqtt-2.4.0/examples/AdafruitHuzzahESP8266/AdafruitHuzzahESP8266.ino
@@ -0,0 +1,69 @@
+// This example uses an Adafruit Huzzah ESP8266
+// to connect to shiftr.io.
+//
+// You can check on your device after a successful
+// connection here: https://shiftr.io/try.
+//
+// by Joël Gähwiler
+// https://github.com/256dpi/arduino-mqtt
+
+#include
+#include
+
+const char ssid[] = "ssid";
+const char pass[] = "pass";
+
+WiFiClient net;
+MQTTClient client;
+
+unsigned long lastMillis = 0;
+
+void connect() {
+ Serial.print("checking wifi...");
+ while (WiFi.status() != WL_CONNECTED) {
+ Serial.print(".");
+ delay(1000);
+ }
+
+ Serial.print("\nconnecting...");
+ while (!client.connect("arduino", "try", "try")) {
+ Serial.print(".");
+ delay(1000);
+ }
+
+ Serial.println("\nconnected!");
+
+ client.subscribe("/hello");
+ // client.unsubscribe("/hello");
+}
+
+void messageReceived(String &topic, String &payload) {
+ Serial.println("incoming: " + topic + " - " + payload);
+}
+
+void setup() {
+ Serial.begin(115200);
+ WiFi.begin(ssid, pass);
+
+ // Note: Local domain names (e.g. "Computer.local" on OSX) are not supported by Arduino.
+ // You need to set the IP address directly.
+ client.begin("broker.shiftr.io", net);
+ client.onMessage(messageReceived);
+
+ connect();
+}
+
+void loop() {
+ client.loop();
+ delay(10); // <- fixes some issues with WiFi stability
+
+ if (!client.connected()) {
+ connect();
+ }
+
+ // publish a message roughly every second.
+ if (millis() - lastMillis > 1000) {
+ lastMillis = millis();
+ client.publish("/hello", "world");
+ }
+}
diff --git a/lib/arduino-mqtt-2.4.0/examples/AdafruitHuzzahESP8266Secure/AdafruitHuzzahESP8266Secure.ino b/lib/arduino-mqtt-2.4.0/examples/AdafruitHuzzahESP8266Secure/AdafruitHuzzahESP8266Secure.ino
new file mode 100644
index 000000000000..1def5678dacf
--- /dev/null
+++ b/lib/arduino-mqtt-2.4.0/examples/AdafruitHuzzahESP8266Secure/AdafruitHuzzahESP8266Secure.ino
@@ -0,0 +1,71 @@
+// This example uses an Adafruit Huzzah ESP8266
+// to connect to shiftr.io.
+//
+// You can check on your device after a successful
+// connection here: https://shiftr.io/try.
+//
+// by Joël Gähwiler
+// https://github.com/256dpi/arduino-mqtt
+
+#include
+#include
+
+const char ssid[] = "ssid";
+const char pass[] = "pass";
+
+WiFiClientSecure net;
+MQTTClient client;
+
+unsigned long lastMillis = 0;
+
+void connect() {
+ Serial.print("checking wifi...");
+ while (WiFi.status() != WL_CONNECTED) {
+ Serial.print(".");
+ delay(1000);
+ }
+
+ Serial.print("\nconnecting...");
+ while (!client.connect("arduino", "try", "try")) {
+ Serial.print(".");
+ delay(1000);
+ }
+
+ Serial.println("\nconnected!");
+
+ client.subscribe("/hello");
+ // client.unsubscribe("/hello");
+}
+
+void messageReceived(String &topic, String &payload) {
+ Serial.println("incoming: " + topic + " - " + payload);
+}
+
+void setup() {
+ Serial.begin(115200);
+ WiFi.begin(ssid, pass);
+
+ // Note: Local domain names (e.g. "Computer.local" on OSX) are not supported by Arduino.
+ // You need to set the IP address directly.
+ //
+ // MQTT brokers usually use port 8883 for secure connections.
+ client.begin("broker.shiftr.io", 8883, net);
+ client.onMessage(messageReceived);
+
+ connect();
+}
+
+void loop() {
+ client.loop();
+ delay(10); // <- fixes some issues with WiFi stability
+
+ if (!client.connected()) {
+ connect();
+ }
+
+ // publish a message roughly every second.
+ if (millis() - lastMillis > 1000) {
+ lastMillis = millis();
+ client.publish("/hello", "world");
+ }
+}
diff --git a/lib/arduino-mqtt-2.4.0/examples/ArduinoEthernetShield/ArduinoEthernetShield.ino b/lib/arduino-mqtt-2.4.0/examples/ArduinoEthernetShield/ArduinoEthernetShield.ino
new file mode 100644
index 000000000000..8386c77881a8
--- /dev/null
+++ b/lib/arduino-mqtt-2.4.0/examples/ArduinoEthernetShield/ArduinoEthernetShield.ino
@@ -0,0 +1,62 @@
+// This example uses an Arduino Uno together with
+// an Ethernet Shield to connect to shiftr.io.
+//
+// You can check on your device after a successful
+// connection here: https://shiftr.io/try.
+//
+// by Joël Gähwiler
+// https://github.com/256dpi/arduino-mqtt
+
+#include
+#include
+
+byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
+byte ip[] = {192, 168, 1, 177}; // <- change to match your network
+
+EthernetClient net;
+MQTTClient client;
+
+unsigned long lastMillis = 0;
+
+void connect() {
+ Serial.print("connecting...");
+ while (!client.connect("arduino", "try", "try")) {
+ Serial.print(".");
+ delay(1000);
+ }
+
+ Serial.println("\nconnected!");
+
+ client.subscribe("/hello");
+ // client.unsubscribe("/hello");
+}
+
+void messageReceived(String &topic, String &payload) {
+ Serial.println("incoming: " + topic + " - " + payload);
+}
+
+void setup() {
+ Serial.begin(115200);
+ Ethernet.begin(mac, ip);
+
+ // Note: Local domain names (e.g. "Computer.local" on OSX) are not supported by Arduino.
+ // You need to set the IP address directly.
+ client.begin("broker.shiftr.io", net);
+ client.onMessage(messageReceived);
+
+ connect();
+}
+
+void loop() {
+ client.loop();
+
+ if (!client.connected()) {
+ connect();
+ }
+
+ // publish a message roughly every second.
+ if (millis() - lastMillis > 1000) {
+ lastMillis = millis();
+ client.publish("/hello", "world");
+ }
+}
diff --git a/lib/arduino-mqtt-2.4.0/examples/ArduinoMKRGSM1400/ArduinoMKRGSM1400.ino b/lib/arduino-mqtt-2.4.0/examples/ArduinoMKRGSM1400/ArduinoMKRGSM1400.ino
new file mode 100644
index 000000000000..dd56d5e21e7c
--- /dev/null
+++ b/lib/arduino-mqtt-2.4.0/examples/ArduinoMKRGSM1400/ArduinoMKRGSM1400.ino
@@ -0,0 +1,84 @@
+// This example uses an Arduino MKR GSM 1400 board
+// to connect to shiftr.io.
+//
+// IMPORTANT: This example uses the new MKRGSM library.
+//
+// You can check on your device after a successful
+// connection here: https://shiftr.io/try.
+//
+// by Sandeep Mistry
+// https://github.com/256dpi/arduino-mqtt
+
+#include
+#include
+
+const char pin[] = "";
+const char apn[] = "apn";
+const char login[] = "login";
+const char password[] = "password";
+
+GSMClient net;
+GPRS gprs;
+GSM gsmAccess;
+MQTTClient client;
+
+unsigned long lastMillis = 0;
+
+void connect() {
+ // connection state
+ bool connected = false;
+
+ Serial.print("connecting to cellular network ...");
+
+ // After starting the modem with gsmAccess.begin()
+ // attach to the GPRS network with the APN, login and password
+ while (!connected) {
+ if ((gsmAccess.begin(pin) == GSM_READY) &&
+ (gprs.attachGPRS(apn, login, password) == GPRS_READY)) {
+ connected = true;
+ } else {
+ Serial.print(".");
+ delay(1000);
+ }
+ }
+
+ Serial.print("\nconnecting...");
+ while (!client.connect("arduino", "try", "try")) {
+ Serial.print(".");
+ delay(1000);
+ }
+
+ Serial.println("\nconnected!");
+
+ client.subscribe("/hello");
+ // client.unsubscribe("/hello");
+}
+
+void messageReceived(String &topic, String &payload) {
+ Serial.println("incoming: " + topic + " - " + payload);
+}
+
+void setup() {
+ Serial.begin(115200);
+
+ // Note: Local domain names (e.g. "Computer.local" on OSX) are not supported by Arduino.
+ // You need to set the IP address directly.
+ client.begin("broker.shiftr.io", net);
+ client.onMessage(messageReceived);
+
+ connect();
+}
+
+void loop() {
+ client.loop();
+
+ if (!client.connected()) {
+ connect();
+ }
+
+ // publish a message roughly every second.
+ if (millis() - lastMillis > 1000) {
+ lastMillis = millis();
+ client.publish("/hello", "world");
+ }
+}
diff --git a/lib/arduino-mqtt-2.4.0/examples/ArduinoMKRGSM1400Secure/ArduinoMKRGSM1400Secure.ino b/lib/arduino-mqtt-2.4.0/examples/ArduinoMKRGSM1400Secure/ArduinoMKRGSM1400Secure.ino
new file mode 100644
index 000000000000..1b172ab6eaf6
--- /dev/null
+++ b/lib/arduino-mqtt-2.4.0/examples/ArduinoMKRGSM1400Secure/ArduinoMKRGSM1400Secure.ino
@@ -0,0 +1,86 @@
+// This example uses an Arduino MKR GSM 1400 board
+// to securely connect to shiftr.io.
+//
+// IMPORTANT: This example uses the new MKRGSM library.
+//
+// You can check on your device after a successful
+// connection here: https://shiftr.io/try.
+//
+// by Sandeep Mistry
+// https://github.com/256dpi/arduino-mqtt
+
+#include
+#include
+
+const char pin[] = "";
+const char apn[] = "apn";
+const char login[] = "login";
+const char password[] = "password";
+
+GSMSSLClient net;
+GPRS gprs;
+GSM gsmAccess;
+MQTTClient client;
+
+unsigned long lastMillis = 0;
+
+void connect() {
+ // connection state
+ bool connected = false;
+
+ Serial.print("connecting to cellular network ...");
+
+ // After starting the modem with gsmAccess.begin()
+ // attach to the GPRS network with the APN, login and password
+ while (!connected) {
+ if ((gsmAccess.begin(pin) == GSM_READY) &&
+ (gprs.attachGPRS(apn, login, password) == GPRS_READY)) {
+ connected = true;
+ } else {
+ Serial.print(".");
+ delay(1000);
+ }
+ }
+
+ Serial.print("\nconnecting...");
+ while (!client.connect("arduino", "try", "try")) {
+ Serial.print(".");
+ delay(1000);
+ }
+
+ Serial.println("\nconnected!");
+
+ client.subscribe("/hello");
+ // client.unsubscribe("/hello");
+}
+
+void messageReceived(String &topic, String &payload) {
+ Serial.println("incoming: " + topic + " - " + payload);
+}
+
+void setup() {
+ Serial.begin(115200);
+
+ // Note: Local domain names (e.g. "Computer.local" on OSX) are not supported by Arduino.
+ // You need to set the IP address directly.
+ //
+ // MQTT brokers usually use port 8883 for secure connections.
+ client.begin("broker.shiftr.io", 8883, net);
+ client.onMessage(messageReceived);
+
+ connect();
+}
+
+void loop() {
+ client.loop();
+
+ if (!client.connected()) {
+ connect();
+ }
+
+ // publish a message roughly every second.
+ if (millis() - lastMillis > 1000) {
+ lastMillis = millis();
+ client.publish("/hello", "world");
+ }
+}
diff --git a/lib/arduino-mqtt-2.4.0/examples/ArduinoWiFi101/ArduinoWiFi101.ino b/lib/arduino-mqtt-2.4.0/examples/ArduinoWiFi101/ArduinoWiFi101.ino
new file mode 100644
index 000000000000..a36bd65aa67f
--- /dev/null
+++ b/lib/arduino-mqtt-2.4.0/examples/ArduinoWiFi101/ArduinoWiFi101.ino
@@ -0,0 +1,70 @@
+// This example uses an Arduino/Genuino Zero together with
+// a WiFi101 Shield or a MKR1000 to connect to shiftr.io.
+//
+// IMPORTANT: This example uses the new WiFi101 library.
+//
+// You can check on your device after a successful
+// connection here: https://shiftr.io/try.
+//
+// by Gilberto Conti
+// https://github.com/256dpi/arduino-mqtt
+
+#include
+#include
+
+const char ssid[] = "ssid";
+const char pass[] = "pass";
+
+WiFiClient net;
+MQTTClient client;
+
+unsigned long lastMillis = 0;
+
+void connect() {
+ Serial.print("checking wifi...");
+ while (WiFi.status() != WL_CONNECTED) {
+ Serial.print(".");
+ delay(1000);
+ }
+
+ Serial.print("\nconnecting...");
+ while (!client.connect("arduino", "try", "try")) {
+ Serial.print(".");
+ delay(1000);
+ }
+
+ Serial.println("\nconnected!");
+
+ client.subscribe("/hello");
+ // client.unsubscribe("/hello");
+}
+
+void messageReceived(String &topic, String &payload) {
+ Serial.println("incoming: " + topic + " - " + payload);
+}
+
+void setup() {
+ Serial.begin(115200);
+ WiFi.begin(ssid, pass);
+
+ // Note: Local domain names (e.g. "Computer.local" on OSX) are not supported by Arduino.
+ // You need to set the IP address directly.
+ client.begin("broker.shiftr.io", net);
+ client.onMessage(messageReceived);
+
+ connect();
+}
+
+void loop() {
+ client.loop();
+
+ if (!client.connected()) {
+ connect();
+ }
+
+ // publish a message roughly every second.
+ if (millis() - lastMillis > 1000) {
+ lastMillis = millis();
+ client.publish("/hello", "world");
+ }
+}
diff --git a/lib/arduino-mqtt-2.4.0/examples/ArduinoWiFi101Secure/ArduinoWiFi101Secure.ino b/lib/arduino-mqtt-2.4.0/examples/ArduinoWiFi101Secure/ArduinoWiFi101Secure.ino
new file mode 100644
index 000000000000..c21e7ae997ff
--- /dev/null
+++ b/lib/arduino-mqtt-2.4.0/examples/ArduinoWiFi101Secure/ArduinoWiFi101Secure.ino
@@ -0,0 +1,75 @@
+// This example uses an Arduino/Genuino Zero together with
+// a WiFi101 Shield or a MKR1000 to connect to shiftr.io.
+//
+// IMPORTANT: This example uses the new WiFi101 library.
+//
+// IMPORTANT: You need to install/update the SSL certificates first:
+// https://github.com/arduino-libraries/WiFi101-FirmwareUpdater#to-update-ssl-certificates
+//
+// You can check on your device after a successful
+// connection here: https://shiftr.io/try.
+//
+// by Gilberto Conti
+// https://github.com/256dpi/arduino-mqtt
+
+#include
+#include