diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..1b9cc2bd --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: neu-rah +# patreon: # Replace with a single Patreon username +# open_collective: # Replace with a single Open Collective username +# ko_fi: # Replace with a single Ko-fi username +# tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +# community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +# liberapay: # Replace with a single Liberapay username +# issuehunt: # Replace with a single IssueHunt username +# otechie: # Replace with a single Otechie username +# custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.gitignore b/.gitignore index 8c7a9389..3f417932 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.pio .pioenvs .clang_complete .gcc-flags.json @@ -7,11 +8,14 @@ src/main.cpp lib .travis.yml !/.travis.yml -platformio.ini /TODO.txt -/classes.odg .gitignore !/.gitignore -*.odg examples/clickEncoder examples/screenNav +/dev +/examples/dev +/composition_test +/examples/tiny + +**/.DS_Store diff --git a/.travis.yml b/.travis.yml index 05a85f11..428df884 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,11 +25,11 @@ cache: env: - PLATFORMIO_CI_SRC=examples/Blink/Blink/Blink.ino - - PLATFORMIO_CI_SRC=examples/Serial/serialio/serialio/serialio.ino - # - PLATFORMIO_CI_SRC=examples/Serial/ansiSerial/ansiSerial/ansiSerial.ino + - PLATFORMIO_CI_SRC=examples/serialio/serialio/serialio.ino + # - PLATFORMIO_CI_SRC=examples/ansiSerial/ansiSerial/ansiSerial.ino - PLATFORMIO_CI_SRC=examples/codeCtrl/codeCtrl/codeCtrl.ino - - PLATFORMIO_CI_SRC=examples/adafruitGfx/lcdMono/lcdMono/lcdMono.ino - - PLATFORMIO_CI_SRC=examples/adafruitGfx/tft/tft/tft.ino + # - PLATFORMIO_CI_SRC=examples/adafruitGfx/lcdMono/lcdMono/lcdMono.ino + # - PLATFORMIO_CI_SRC=examples/adafruitGfx/tft/tft/tft.ino - PLATFORMIO_CI_SRC=examples/U8GLib/U8GLib/U8GLib.ino install: @@ -41,8 +41,8 @@ install: # - wget https://github.com/nettigo/Assert4a/archive/master.zip -O /tmp/Assert4a.zip # - unzip /tmp/Assert4a.zip -d /tmp/ - - wget https://github.com/adafruit/Adafruit-GFX-Library/archive/master.zip -O /tmp/Adafruit-GFX-Library-master.zip - - unzip /tmp/Adafruit-GFX-Library-master.zip -d /tmp/ + # - wget https://github.com/adafruit/Adafruit-GFX-Library/archive/master.zip -O /tmp/Adafruit-GFX-Library-master.zip + # - unzip /tmp/Adafruit-GFX-Library-master.zip -d /tmp/ - wget https://github.com/neu-rah/PCINT/archive/master.zip -O /tmp/PCINT-master.zip - unzip /tmp/PCINT-master.zip -d /tmp/ @@ -53,15 +53,21 @@ install: - wget https://github.com/neu-rah/AnsiStream/archive/master.zip -O /tmp/AnsiStream-master.zip - unzip /tmp/AnsiStream-master.zip -d /tmp/ - - wget https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/NewliquidCrystal_1.3.4.zip -O /tmp/NewliquidCrystal_1.3.4.zip - - unzip /tmp/NewliquidCrystal_1.3.4.zip -d /tmp/ + # - wget https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/NewliquidCrystal_1.3.4.zip -O /tmp/NewliquidCrystal_1.3.4.zip + # - unzip /tmp/NewliquidCrystal_1.3.4.zip -d /tmp/ - - wget https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library/archive/master.zip -O /tmp/Adafruit-PCD8544-Nokia-5110-LCD-library-master.zip - - unzip /tmp/Adafruit-PCD8544-Nokia-5110-LCD-library-master.zip -d /tmp/ + # - wget https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library/archive/master.zip -O /tmp/Adafruit-PCD8544-Nokia-5110-LCD-library-master.zip + # - unzip /tmp/Adafruit-PCD8544-Nokia-5110-LCD-library-master.zip -d /tmp/ - - wget https://github.com/adafruit/Adafruit-ST7735-Library/archive/master.zip -O /tmp/Adafruit-ST7735-Library-master.zip - - unzip /tmp/Adafruit-ST7735-Library-master.zip -d /tmp/ + # - wget https://github.com/adafruit/Adafruit-ST7735-Library/archive/master.zip -O /tmp/Adafruit-ST7735-Library-master.zip + # - unzip /tmp/Adafruit-ST7735-Library-master.zip -d /tmp/ + + # - wget https://github.com/PaulStoffregen/SD/archive/master.zip -O /tmp/SD-master.zip + # - unzip /tmp/SD-master.zip -d /tmp/ script: - # - platformio ci --lib="." --board=nanoatmega328 --board=teensy31 - - platformio ci --lib="." --lib="/tmp/Streaming-master" --lib="/tmp/Adafruit-GFX-Library-master" --lib="/tmp/PCINT-master" --lib="/tmp/U8glib_Arduino-master" --lib="/tmp/AnsiStream-master" --lib="/tmp/NewliquidCrystal" --lib="/tmp/Adafruit-PCD8544-Nokia-5110-LCD-library-master" --lib="/tmp/Adafruit-ST7735-Library-master" --board=nanoatmega328 --board=teensy31 --board=due + # - platformio ci --lib="." --lib="/tmp/SD-master" --board=nanoatmega328 --board=teensy31 + # - platformio ci --lib="." --lib="/tmp/Streaming-master" --lib="/tmp/Adafruit-GFX-Library-master" --lib="/tmp/PCINT-master" --lib="/tmp/U8glib_Arduino-master" --lib="/tmp/AnsiStream-master" --lib="/tmp/NewliquidCrystal" --lib="/tmp/Adafruit-PCD8544-Nokia-5110-LCD-library-master" --lib="/tmp/Adafruit-ST7735-Library-master" --board=nanoatmega328 --board=teensy31 --board=due + # - platformio ci --lib="." --lib="/tmp/Streaming-master" --lib="/tmp/Adafruit-GFX-Library-master" --lib="/tmp/PCINT-master" --lib="/tmp/U8glib_Arduino-master" --lib="/tmp/AnsiStream-master" --lib="/tmp/NewliquidCrystal" --lib="/tmp/Adafruit-ST7735-Library-master" --board=nanoatmega328 --board=teensy31 --board=due + # - platformio ci --lib="." --lib="/tmp/Streaming-master" --lib="/tmp/PCINT-master" --lib="/tmp/U8glib_Arduino-master" --lib="/tmp/AnsiStream-master" --lib="/tmp/NewliquidCrystal" --board=nanoatmega328 --board=teensy31 --board=due + - platformio ci --lib="." --lib="/tmp/Streaming-master" --lib="/tmp/PCINT-master" --lib="/tmp/U8glib_Arduino-master" --lib="/tmp/AnsiStream-master" --board=nanoatmega328 --board=teensy31 --board=due diff --git a/LICENSE b/LICENSE index 8f65f5df..35a0945f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,437 +1,502 @@ -Attribution-NonCommercial-ShareAlike 4.0 International - -======================================================================= - -Creative Commons Corporation ("Creative Commons") is not a law firm and -does not provide legal services or legal advice. Distribution of -Creative Commons public licenses does not create a lawyer-client or -other relationship. Creative Commons makes its licenses and related -information available on an "as-is" basis. Creative Commons gives no -warranties regarding its licenses, any material licensed under their -terms and conditions, or any related information. Creative Commons -disclaims all liability for damages resulting from their use to the -fullest extent possible. - -Using Creative Commons Public Licenses - -Creative Commons public licenses provide a standard set of terms and -conditions that creators and other rights holders may use to share -original works of authorship and other material subject to copyright -and certain other rights specified in the public license below. The -following considerations are for informational purposes only, are not -exhaustive, and do not form part of our licenses. - - Considerations for licensors: Our public licenses are - intended for use by those authorized to give the public - permission to use material in ways otherwise restricted by - copyright and certain other rights. Our licenses are - irrevocable. Licensors should read and understand the terms - and conditions of the license they choose before applying it. - Licensors should also secure all rights necessary before - applying our licenses so that the public can reuse the - material as expected. Licensors should clearly mark any - material not subject to the license. This includes other CC- - licensed material, or material used under an exception or - limitation to copyright. More considerations for licensors: - wiki.creativecommons.org/Considerations_for_licensors - - Considerations for the public: By using one of our public - licenses, a licensor grants the public permission to use the - licensed material under specified terms and conditions. If - the licensor's permission is not necessary for any reason--for - example, because of any applicable exception or limitation to - copyright--then that use is not regulated by the license. Our - licenses grant only permissions under copyright and certain - other rights that a licensor has authority to grant. Use of - the licensed material may still be restricted for other - reasons, including because others have copyright or other - rights in the material. A licensor may make special requests, - such as asking that all changes be marked or described. - Although not required by our licenses, you are encouraged to - respect those requests where reasonable. More considerations - for the public: - wiki.creativecommons.org/Considerations_for_licensees - -======================================================================= - -Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International -Public License - -By exercising the Licensed Rights (defined below), You accept and agree -to be bound by the terms and conditions of this Creative Commons -Attribution-NonCommercial-ShareAlike 4.0 International Public License -("Public License"). To the extent this Public License may be -interpreted as a contract, You are granted the Licensed Rights in -consideration of Your acceptance of these terms and conditions, and the -Licensor grants You such rights in consideration of benefits the -Licensor receives from making the Licensed Material available under -these terms and conditions. - - -Section 1 -- Definitions. - - a. Adapted Material means material subject to Copyright and Similar - Rights that is derived from or based upon the Licensed Material - and in which the Licensed Material is translated, altered, - arranged, transformed, or otherwise modified in a manner requiring - permission under the Copyright and Similar Rights held by the - Licensor. For purposes of this Public License, where the Licensed - Material is a musical work, performance, or sound recording, - Adapted Material is always produced where the Licensed Material is - synched in timed relation with a moving image. - - b. Adapter's License means the license You apply to Your Copyright - and Similar Rights in Your contributions to Adapted Material in - accordance with the terms and conditions of this Public License. - - c. BY-NC-SA Compatible License means a license listed at - creativecommons.org/compatiblelicenses, approved by Creative - Commons as essentially the equivalent of this Public License. - - d. Copyright and Similar Rights means copyright and/or similar rights - closely related to copyright including, without limitation, - performance, broadcast, sound recording, and Sui Generis Database - Rights, without regard to how the rights are labeled or - categorized. For purposes of this Public License, the rights - specified in Section 2(b)(1)-(2) are not Copyright and Similar - Rights. - - e. Effective Technological Measures means those measures that, in the - absence of proper authority, may not be circumvented under laws - fulfilling obligations under Article 11 of the WIPO Copyright - Treaty adopted on December 20, 1996, and/or similar international - agreements. - - f. Exceptions and Limitations means fair use, fair dealing, and/or - any other exception or limitation to Copyright and Similar Rights - that applies to Your use of the Licensed Material. - - g. License Elements means the license attributes listed in the name - of a Creative Commons Public License. The License Elements of this - Public License are Attribution, NonCommercial, and ShareAlike. - - h. Licensed Material means the artistic or literary work, database, - or other material to which the Licensor applied this Public - License. - - i. Licensed Rights means the rights granted to You subject to the - terms and conditions of this Public License, which are limited to - all Copyright and Similar Rights that apply to Your use of the - Licensed Material and that the Licensor has authority to license. - - j. Licensor means the individual(s) or entity(ies) granting rights - under this Public License. - - k. NonCommercial means not primarily intended for or directed towards - commercial advantage or monetary compensation. For purposes of - this Public License, the exchange of the Licensed Material for - other material subject to Copyright and Similar Rights by digital - file-sharing or similar means is NonCommercial provided there is - no payment of monetary compensation in connection with the - exchange. - - l. Share means to provide material to the public by any means or - process that requires permission under the Licensed Rights, such - as reproduction, public display, public performance, distribution, - dissemination, communication, or importation, and to make material - available to the public including in ways that members of the - public may access the material from a place and at a time - individually chosen by them. - - m. Sui Generis Database Rights means rights other than copyright - resulting from Directive 96/9/EC of the European Parliament and of - the Council of 11 March 1996 on the legal protection of databases, - as amended and/or succeeded, as well as other essentially - equivalent rights anywhere in the world. - - n. You means the individual or entity exercising the Licensed Rights - under this Public License. Your has a corresponding meaning. - - -Section 2 -- Scope. - - a. License grant. - - 1. Subject to the terms and conditions of this Public License, - the Licensor hereby grants You a worldwide, royalty-free, - non-sublicensable, non-exclusive, irrevocable license to - exercise the Licensed Rights in the Licensed Material to: - - a. reproduce and Share the Licensed Material, in whole or - in part, for NonCommercial purposes only; and - - b. produce, reproduce, and Share Adapted Material for - NonCommercial purposes only. - - 2. Exceptions and Limitations. For the avoidance of doubt, where - Exceptions and Limitations apply to Your use, this Public - License does not apply, and You do not need to comply with - its terms and conditions. - - 3. Term. The term of this Public License is specified in Section - 6(a). - - 4. Media and formats; technical modifications allowed. The - Licensor authorizes You to exercise the Licensed Rights in - all media and formats whether now known or hereafter created, - and to make technical modifications necessary to do so. The - Licensor waives and/or agrees not to assert any right or - authority to forbid You from making technical modifications - necessary to exercise the Licensed Rights, including - technical modifications necessary to circumvent Effective - Technological Measures. For purposes of this Public License, - simply making modifications authorized by this Section 2(a) - (4) never produces Adapted Material. - - 5. Downstream recipients. - - a. Offer from the Licensor -- Licensed Material. Every - recipient of the Licensed Material automatically - receives an offer from the Licensor to exercise the - Licensed Rights under the terms and conditions of this - Public License. - - b. Additional offer from the Licensor -- Adapted Material. - Every recipient of Adapted Material from You - automatically receives an offer from the Licensor to - exercise the Licensed Rights in the Adapted Material - under the conditions of the Adapter's License You apply. - - c. No downstream restrictions. You may not offer or impose - any additional or different terms or conditions on, or - apply any Effective Technological Measures to, the - Licensed Material if doing so restricts exercise of the - Licensed Rights by any recipient of the Licensed - Material. - - 6. No endorsement. Nothing in this Public License constitutes or - may be construed as permission to assert or imply that You - are, or that Your use of the Licensed Material is, connected - with, or sponsored, endorsed, or granted official status by, - the Licensor or others designated to receive attribution as - provided in Section 3(a)(1)(A)(i). - - b. Other rights. - - 1. Moral rights, such as the right of integrity, are not - licensed under this Public License, nor are publicity, - privacy, and/or other similar personality rights; however, to - the extent possible, the Licensor waives and/or agrees not to - assert any such rights held by the Licensor to the limited - extent necessary to allow You to exercise the Licensed - Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this - Public License. - - 3. To the extent possible, the Licensor waives any right to - collect royalties from You for the exercise of the Licensed - Rights, whether directly or through a collecting society - under any voluntary or waivable statutory or compulsory - licensing scheme. In all other cases the Licensor expressly - reserves any right to collect such royalties, including when - the Licensed Material is used other than for NonCommercial - purposes. - - -Section 3 -- License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the -following conditions. - - a. Attribution. - - 1. If You Share the Licensed Material (including in modified - form), You must: - - a. retain the following if it is supplied by the Licensor - with the Licensed Material: - - i. identification of the creator(s) of the Licensed - Material and any others designated to receive - attribution, in any reasonable manner requested by - the Licensor (including by pseudonym if - designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of - warranties; - - v. a URI or hyperlink to the Licensed Material to the - extent reasonably practicable; - - b. indicate if You modified the Licensed Material and - retain an indication of any previous modifications; and - - c. indicate the Licensed Material is licensed under this - Public License, and include the text of, or the URI or - hyperlink to, this Public License. - - 2. You may satisfy the conditions in Section 3(a)(1) in any - reasonable manner based on the medium, means, and context in - which You Share the Licensed Material. For example, it may be - reasonable to satisfy the conditions by providing a URI or - hyperlink to a resource that includes the required - information. - 3. If requested by the Licensor, You must remove any of the - information required by Section 3(a)(1)(A) to the extent - reasonably practicable. - - b. ShareAlike. - - In addition to the conditions in Section 3(a), if You Share - Adapted Material You produce, the following conditions also apply. - - 1. The Adapter's License You apply must be a Creative Commons - license with the same License Elements, this version or - later, or a BY-NC-SA Compatible License. - - 2. You must include the text of, or the URI or hyperlink to, the - Adapter's License You apply. You may satisfy this condition - in any reasonable manner based on the medium, means, and - context in which You Share Adapted Material. - - 3. You may not offer or impose any additional or different terms - or conditions on, or apply any Effective Technological - Measures to, Adapted Material that restrict exercise of the - rights granted under the Adapter's License You apply. - - -Section 4 -- Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that -apply to Your use of the Licensed Material: - - a. for the avoidance of doubt, Section 2(a)(1) grants You the right - to extract, reuse, reproduce, and Share all or a substantial - portion of the contents of the database for NonCommercial purposes - only; - - b. if You include all or a substantial portion of the database - contents in a database in which You have Sui Generis Database - Rights, then the database in which You have Sui Generis Database - Rights (but not its individual contents) is Adapted Material, - including for purposes of Section 3(b); and - - c. You must comply with the conditions in Section 3(a) if You Share - all or a substantial portion of the contents of the database. - -For the avoidance of doubt, this Section 4 supplements and does not -replace Your obligations under this Public License where the Licensed -Rights include other Copyright and Similar Rights. - - -Section 5 -- Disclaimer of Warranties and Limitation of Liability. - - a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE - EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS - AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF - ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, - IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, - WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR - PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, - ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT - KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT - ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. - - b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE - TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, - NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, - INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, - COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR - USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR - DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR - IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. - - c. The disclaimer of warranties and limitation of liability provided - above shall be interpreted in a manner that, to the extent - possible, most closely approximates an absolute disclaimer and - waiver of all liability. - - -Section 6 -- Term and Termination. - - a. This Public License applies for the term of the Copyright and - Similar Rights licensed here. However, if You fail to comply with - this Public License, then Your rights under this Public License - terminate automatically. - - b. Where Your right to use the Licensed Material has terminated under - Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided - it is cured within 30 days of Your discovery of the - violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any - right the Licensor may have to seek remedies for Your violations - of this Public License. - - c. For the avoidance of doubt, the Licensor may also offer the - Licensed Material under separate terms or conditions or stop - distributing the Licensed Material at any time; however, doing so - will not terminate this Public License. - - d. Sections 1, 5, 6, 7, and 8 survive termination of this Public - License. - - -Section 7 -- Other Terms and Conditions. - - a. The Licensor shall not be bound by any additional or different - terms or conditions communicated by You unless expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the - Licensed Material not stated herein are separate from and - independent of the terms and conditions of this Public License. - - -Section 8 -- Interpretation. - - a. For the avoidance of doubt, this Public License does not, and - shall not be interpreted to, reduce, limit, restrict, or impose - conditions on any use of the Licensed Material that could lawfully - be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public License is - deemed unenforceable, it shall be automatically reformed to the - minimum extent necessary to make it enforceable. If the provision - cannot be reformed, it shall be severed from this Public License - without affecting the enforceability of the remaining terms and - conditions. - - c. No term or condition of this Public License will be waived and no - failure to comply consented to unless expressly agreed to by the - Licensor. - - d. Nothing in this Public License constitutes or may be interpreted - as a limitation upon, or waiver of, any privileges and immunities - that apply to the Licensor or You, including from the legal - processes of any jurisdiction or authority. - -======================================================================= - -Creative Commons is not a party to its public -licenses. Notwithstanding, Creative Commons may elect to apply one of -its public licenses to material it publishes and in those instances -will be considered the “Licensor.” The text of the Creative Commons -public licenses is dedicated to the public domain under the CC0 Public -Domain Dedication. Except for the limited purpose of indicating that -material is shared under a Creative Commons public license or as -otherwise permitted by the Creative Commons policies published at -creativecommons.org/policies, Creative Commons does not authorize the -use of the trademark "Creative Commons" or any other trademark or logo -of Creative Commons without its prior written consent including, -without limitation, in connection with any unauthorized modifications -to any of its public licenses or any other arrangements, -understandings, or agreements concerning use of licensed material. For -the avoidance of doubt, this paragraph does not form part of the -public licenses. - -Creative Commons may be contacted at creativecommons.org. +GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts +as the successor of the GNU Library Public License, version 2, hence +the version number 2.1.] + + Preamble + +The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + +This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + +When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + +To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + +For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + +We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + +To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + +Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + +Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + +When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + +We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + +For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + +In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + +Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + +The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + +GNU LESSER GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + +A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + +The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + +"Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + +1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + +You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + +2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +a) The modified work must itself be a software library. + +b) You must cause the files modified to carry prominent notices +stating that you changed the files and the date of any change. + +c) You must cause the whole of the work to be licensed at no +charge to all third parties under the terms of this License. + +d) If a facility in the modified Library refers to a function or a +table of data to be supplied by an application program that uses +the facility, other than as an argument passed when the facility +is invoked, then you must make a good faith effort to ensure that, +in the event an application does not supply such function or +table, the facility still operates, and performs whatever part of +its purpose remains meaningful. + +(For example, a function in a library to compute square roots has +a purpose that is entirely well-defined independent of the +application. Therefore, Subsection 2d requires that any +application-supplied function or table used by this function must +be optional: if the application does not supply it, the square +root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + +Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + +This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + +4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + +If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + +5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + +However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + +When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + +If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + +Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + +6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + +You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + +a) Accompany the work with the complete corresponding +machine-readable source code for the Library including whatever +changes were used in the work (which must be distributed under +Sections 1 and 2 above); and, if the work is an executable linked +with the Library, with the complete machine-readable "work that +uses the Library", as object code and/or source code, so that the +user can modify the Library and then relink to produce a modified +executable containing the modified Library. (It is understood +that the user who changes the contents of definitions files in the +Library will not necessarily be able to recompile the application +to use the modified definitions.) + +b) Use a suitable shared library mechanism for linking with the +Library. A suitable mechanism is one that (1) uses at run time a +copy of the library already present on the user's computer system, +rather than copying library functions into the executable, and (2) +will operate properly with a modified version of the library, if +the user installs one, as long as the modified version is +interface-compatible with the version that the work was made with. + +c) Accompany the work with a written offer, valid for at +least three years, to give the same user the materials +specified in Subsection 6a, above, for a charge no more +than the cost of performing this distribution. + +d) If distribution of the work is made by offering access to copy +from a designated place, offer equivalent access to copy the above +specified materials from the same place. + +e) Verify that the user has already received a copy of these +materials or that you have already sent this user a copy. + +For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + +It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + +7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + +a) Accompany the combined library with a copy of the same work +based on the Library, uncombined with any other library +facilities. This must be distributed under the terms of the +Sections above. + +b) Give prominent notice with the combined library of the fact +that part of it is a work based on the Library, and explaining +where to find the accompanying uncombined form of the same work. + +8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + +9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + +10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + +11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + +13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + +14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + +15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Libraries + +If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + +To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the +library `Frob' (a library for tweaking knobs) written by James Random Hacker. + +, 1 April 1990 +Ty Coon, President of Vice + +That's all there is to it! diff --git a/README.md b/README.md index 38c7f94c..64b2742c 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ **Generic menu/interactivity system for the arduino framework** -[![License: CC BY-NC-SA 4.0](https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-lightgrey.svg)](https://spdx.org/licenses/CC-BY-NC-SA-4.0.html) +[![License: LGPL-2.1+](https://img.shields.io/badge/License%20LGPL-2.1+-lightgrey.svg)](https://spdx.org/licenses/LGPL-2.1-or-later.html) [![Build Status](https://travis-ci.org/neu-rah/ArduinoMenu.svg?branch=master)](https://travis-ci.org/neu-rah/ArduinoMenu) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/ruihfazevedo) [![Join Gitter](https://img.shields.io/badge/GITTER-join%20chat-green.svg)](https://gitter.im/ArduinoMenu/Lobby) @@ -16,6 +16,26 @@ Optionally the system can be operated in semi-automated mode, issuing navigation See the [wiki](https://github.com/neu-rah/ArduinoMenu/wiki) +## What's next — OneMenu / HAPI + +A successor is in active development, built on **HAPI**, a zero-overhead +compile-time composition engine (github.com/InternetOfPins/HAPI). Menu +definitions compile down to code indistinguishable from hand-written C — +see it for yourself: [Compiler Explorer demo](https://godbolt.org/z/6srTzdTY7). + +This isn't a release. The core (**OneMenu**) is solid, and a drop-in +compatibility layer for existing AM4 sketches is now in progress on the +**[AM5 branch](https://github.com/neu-rah/ArduinoMenu/tree/AM5)** of this +repo — real, unmodified AM4 examples (Blink, Button, Confirm so far) already +build against it with just a library-dependency swap, at roughly the same +flash/RAM savings as the Compiler Explorer demo above suggests. Still missing +pieces (masked text-field editing, the idle/suspend API, most device +drivers) before it covers AM4's full example set. If you're interested in +the architecture, want to help with the compatibility layer, or just want to +follow along: github.com/InternetOfPins/HAPI + +No migration is required right now. AM4 keeps working exactly as it does today. + ## Simple Example ```c++ #include @@ -28,12 +48,12 @@ using namespace Menu; #define LEDPIN LED_BUILTIN #define MAX_DEPTH 1 -int timeOn=10; -int timeOff=90; +unsigned int timeOn=10; +unsigned int timeOff=90; MENU(mainMenu, "Blink menu", Menu::doNothing, Menu::noEvent, Menu::wrapStyle - ,FIELD(timeOn,"On","ms",0,100,10,1, Menu::doNothing, Menu::noEvent, Menu::noStyle) - ,FIELD(timeOff,"Off","ms",0,100,10,1,Menu::doNothing, Menu::noEvent, Menu::noStyle) + ,FIELD(timeOn,"On","ms",0,1000,10,1, Menu::doNothing, Menu::noEvent, Menu::noStyle) + ,FIELD(timeOff,"Off","ms",0,10000,10,1,Menu::doNothing, Menu::noEvent, Menu::noStyle) ,EXIT("` + +depending on your output driver it may be one of (can install both) +- https://github.com/neu-rah/streamFlow +- https://github.com/scottdky/Streaming ### Input devices @@ -255,6 +329,8 @@ Buttons - simple digital keyboard (builtin) Generic keyboard (no PCINT) - configurable for digital or analog keyboards (builtin) +Analog Joystick + ClickEncoder https://github.com/0xPIT/encoder Matrix keypad @@ -314,6 +390,12 @@ multiple stream packing for input to mix encoder stream with encoder keyboard (u ## History ### 4.0 + - SdFat plugin and example + - EscControl examle + - support Bodmer/TFT_eSPI + - SDCard file picker plugin + - Allow virtual/dynamic data custom menus + - alternative key driver with explicit pin modes - More examples - Text edit fields with validation * - Pad style menus (horizontal list) diff --git a/classes.odg b/classes.odg deleted file mode 100644 index 2eb0cb9a..00000000 Binary files a/classes.odg and /dev/null differ diff --git a/examples/Blink/Blink/Blink.ino b/examples/Blink/Blink/Blink.ino index 7f09afd5..87bbf43e 100644 --- a/examples/Blink/Blink/Blink.ino +++ b/examples/Blink/Blink/Blink.ino @@ -19,12 +19,12 @@ using namespace Menu; #define LEDPIN LED_BUILTIN #define MAX_DEPTH 1 -int timeOn=10; -int timeOff=90; +unsigned int timeOn=10; +unsigned int timeOff=90; MENU(mainMenu, "Blink menu", Menu::doNothing, Menu::noEvent, Menu::wrapStyle - ,FIELD(timeOn,"On","ms",0,100,10,1, Menu::doNothing, Menu::noEvent, Menu::noStyle) - ,FIELD(timeOff,"Off","ms",0,100,10,1,Menu::doNothing, Menu::noEvent, Menu::noStyle) + ,FIELD(timeOn,"On","ms",0,1000,10,1, Menu::doNothing, Menu::noEvent, Menu::noStyle) + ,FIELD(timeOff,"Off","ms",0,10000,10,1,Menu::doNothing, Menu::noEvent, Menu::noStyle) ,EXIT(" +#include +#include +#include + +using namespace Menu; + +#define LEDPIN LED_BUILTIN +#define MAX_DEPTH 1 + +int timeOn=10; +int timeOff=90; + +MENU(mainMenu, "Blink menu", Menu::doNothing, Menu::noEvent, Menu::wrapStyle + ,FIELD(timeOn,"On","ms",0,100,10,1, Menu::doNothing, Menu::noEvent, Menu::noStyle) + ,FIELD(timeOff,"Off","ms",0,100,10,1,Menu::doNothing, Menu::noEvent, Menu::noStyle) + ,EXIT(" +#include +// Pin Description for this screen: +// https://www.arthurwiz.com/software-development/177-inch-tft-lcd-display-with-st7735s-on-arduino-mega-2560 +// GND - GND +// VCC - 3.3v +// SCK - TFT_SCLK 5 +// SDA - TFT_MOSI 18 +// RES - TFT_RST 22 +// RS - TFT_DC 21 +// CS - TFT_CS 19 +// LEDA- 3.3v +#include +#include +#include +#include +// Using this library: https://github.com/soligen2010/encoder.git +#include +#include +#include +#include +// For debugging the TFT_eSPIOut.h library +#include +#include + +using namespace Menu; + +// Declare pins for rotary encoder +#define encA 4 +#define encB 15 +#define encBtn 2 +#define encSteps 4 + +// Setup TFT colors. Probably stop using these and use the colors defined by ArduinoMenu +#define BACKCOLOR TFT_BLACK +#define TEXTCOLOR TFT_WHITE + +int chooseField = 1; +int cutsMade = 0; +int numberOfCuts = 5; +int lengthOfCuts = 50; // Length in mm +int feedLength = 304; +int exitMenuOptions = 0; //Forces the menu to exit and cut the copper tape + +// Declare the clickencoder +// Disable doubleclicks in setup makes the response faster. See: https://github.com/soligen2010/encoder/issues/6 +ClickEncoder clickEncoder = ClickEncoder(encA, encB, encBtn, encSteps); +ClickEncoderStream encStream(clickEncoder, 1); + +// TFT gfx is what the ArduinoMenu TFT_eSPIOut.h is expecting +TFT_eSPI gfx = TFT_eSPI(); + +void feedInOut(); // Function to manually feed the tape without cutting +void runCuts(); // Main loop that feeds tape and calls servoCuts() +void IRAM_ATTR onTimer(); // Start the timer to read the clickEncoder every 1 ms + +////////////////////////////////////////////////////////// +// Start ArduinoMenu +////////////////////////////////////////////////////////// + +result doFeed() +{ + delay(500); + exitMenuOptions = 2; + return proceed; +} + +result doRunCuts() +{ + delay(500); + exitMenuOptions = 1; + return proceed; +} + +result updateEEPROM() +{ + // writeEEPROM(); + return quit; +} + +#define MAX_DEPTH 3 + +MENU(subMenuAdjustServo, "Adjust Servo Settings", doNothing, noEvent, noStyle + // ,FIELD(settingsEEPROM.servoOpen, "Servo Open", " degrees", 0, 180, 10, 1, doNothing, noEvent, noStyle) + // ,FIELD(settingsEEPROM.servoClosed, "Servo Closed", " degrees", 0, 180, 10, 1, doNothing, noEvent, noStyle) + // ,SUBMENU(subMenu) + , + OP("Run!", doFeed, enterEvent), EXIT(" colors[6] MEMMODE = { + //{{disabled normal,disabled selected},{enabled normal,enabled selected, enabled editing}} + {{(uint16_t)Black, (uint16_t)Black}, {(uint16_t)Black, (uint16_t)Red, (uint16_t)Red}}, //bgColor + {{(uint16_t)White, (uint16_t)White}, {(uint16_t)White, (uint16_t)White, (uint16_t)White}},//fgColor + {{(uint16_t)Red, (uint16_t)Red}, {(uint16_t)Yellow, (uint16_t)Yellow, (uint16_t)Yellow}}, //valColor + {{(uint16_t)White, (uint16_t)White}, {(uint16_t)White, (uint16_t)White, (uint16_t)White}}, //unitColor + {{(uint16_t)White, (uint16_t)Gray}, {(uint16_t)Black, (uint16_t)Red, (uint16_t)White}}, //cursorColor + {{(uint16_t)White, (uint16_t)Yellow}, {(uint16_t)Black, (uint16_t)Red, (uint16_t)Red}}, //titleColor +}; + + +// Define the width and height of the TFT and how much of it to take up +#define GFX_WIDTH 160 +#define GFX_HEIGHT 128 +#define fontW 6 +#define fontH 9 + +const panel panels[] MEMMODE = {{0, 0, GFX_WIDTH / fontW, GFX_HEIGHT / fontH}}; // Main menu panel +navNode* nodes[sizeof(panels) / sizeof(panel)]; //navNodes to store navigation status +panelsList pList(panels, nodes, sizeof(panels) / sizeof(panel)); //a list of panels and nodes +//idx_t tops[MAX_DEPTH]={0,0}; // store cursor positions for each level +idx_t eSpiTops[MAX_DEPTH] = {0}; +TFT_eSPIOut eSpiOut(gfx, colors, eSpiTops, pList, fontW, fontH + 1); +idx_t serialTops[MAX_DEPTH] = {0}; +serialOut outSerial(Serial, serialTops); +menuOut *constMEM outputs[] MEMMODE = {&outSerial, &eSpiOut}; //list of output devices +outputsList out(outputs, sizeof(outputs) / sizeof(menuOut *)); //outputs list +serialIn serial(Serial); +MENU_INPUTS(in, &encStream, &serial); // &encButton, +NAVROOT(nav, mainMenu, MAX_DEPTH, in, out); + +// ESP32 timer thanks to: http://www.iotsharing.com/2017/06/how-to-use-interrupt-timer-in-arduino-esp32.html +// and: https://techtutorialsx.com/2017/10/07/esp32-arduino-timer-interrupts/ +hw_timer_t *timer = NULL; +portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED; + +////////////////////////////////////////////////////////// +// End Arduino Menu +////////////////////////////////////////////////////////// + +void setup() +{ + Serial.begin(115200); + delay(3000); + + clickEncoder.setAccelerationEnabled(true); + clickEncoder.setDoubleClickEnabled(false); // Disable doubleclicks makes the response faster. See: https://github.com/soligen2010/encoder/issues/6 + + // // ESP32 timer + timer = timerBegin(0, 80, true); + timerAttachInterrupt(timer, &onTimer, true); + timerAlarmWrite(timer, 1000, true); + timerAlarmEnable(timer); + + // Use this initializer if you're using a 1.8" TFT + // SPI.begin(); + gfx.init(); // Initialize a ST7735S chip + gfx.setRotation(0); // Set the rotation (0-3) to vertical + Serial.println("Initialized ST7735S TFT"); + gfx.fillScreen(TFT_BLACK); + Serial.println("done"); + + + nav.showTitle = true; // Show titles in the menus and submenus + // nav.timeOut = 60; // Timeout after 60 seconds of inactivity + // nav.idleOn(); // Start with the main screen and not the menu +} + +void loop() +{ + // Slow down the menu redraw rate + constexpr int menuFPS = 1000 / 30; + static unsigned long lastMenuFrame = -menuFPS; + unsigned long now = millis(); + //... other stuff on loop, will keep executing + switch (exitMenuOptions) + { + case 1: + { + delay(500); // Pause to allow the button to come up + runCuts(); + break; + } + case 2: + { + delay(500); // Pause to allow the button to come up + feedInOut(); + break; + } + default: // Do the normal program functions with ArduinoMenu + if (now - lastMenuFrame >= menuFPS) + { + lastMenuFrame = millis(); + nav.poll(); // Poll the input devices + } + } +} + +void runCuts() +{ + exitMenuOptions = 0; // Return to the menu + delay(500); + mainMenu.dirty = true; // Force the main menu to redraw itself +} + +void feedInOut() +{ + exitMenuOptions = 0; // Return to the menu + delay(500); + mainMenu.dirty = true; // Force the main menu to redraw itself +} + +// ESP32 timer +void IRAM_ATTR onTimer() +{ + clickEncoder.service(); +} diff --git a/examples/ESP32/platformio.ini b/examples/ESP32/platformio.ini new file mode 100644 index 00000000..35cfa66f --- /dev/null +++ b/examples/ESP32/platformio.ini @@ -0,0 +1,10 @@ +[platformio] +src_dir=ClickEncoderTFT + +[env:lolin32] +platform = espressif32 +board = lolin32 +framework=arduino +build_flags =-Wno-reorder +build_unflags=-Werror=reorder + diff --git a/examples/GroveRGB/GroveRGB/GroveRGB.ino b/examples/GroveRGB/GroveRGB/GroveRGB.ino new file mode 100644 index 00000000..33a57a67 --- /dev/null +++ b/examples/GroveRGB/GroveRGB/GroveRGB.ino @@ -0,0 +1,207 @@ +#include + +/******************** +Sept. 2014 Rui Azevedo - ruihfazevedo(@rrob@)gmail.com +Nov. 2020 Graham Whaley - adapted to Grove RGB LCD + +menu output to Grove RGB LCD I2C +output: GROVERGBLCD : https://wiki.seeedstudio.com/Grove-LCD_RGB_Backlight/ +input: click encoder and Serial +board: PJRC Teensy 4.0 : https://www.pjrc.com/store/teensy40.html +***/ + +#include +#include +#include +#include +#include +#include +#include + +using namespace Menu; + +// LCD, standard Grove I2C devices ///////////// +rgb_lcd lcd; + +// Encoder ///////////////////////////////////// +#define encA 3 +#define encB 2 +//this encoder has a button here +#define encBtn 4 + +ClickEncoder clickEncoder(encA,encB,encBtn,2); +ClickEncoderStream encStream(clickEncoder,1); + +//input from the clickencoder + serial +serialIn serial(Serial); +menuIn* inputsList[]={&encStream,&serial}; +chainStream<2> in(inputsList);//3 is the number of inputs + +#define LEDPIN LED_BUILTIN //Teensy 4.0 LED pin + +result doAlert(eventMask e, prompt &item); + +result showEvent(eventMask e,navNode& nav,prompt& item) { + Serial.print("event: "); + Serial.println(e); + return proceed; +} + +int test=55; + +result action1(eventMask e,navNode& nav, prompt &item) { + Serial.print("action1 event: "); + Serial.print(e); + Serial.println(", proceed menu"); + Serial.flush(); + return proceed; +} + +result action2(eventMask e,navNode& nav, prompt &item) { + Serial.print("action2 event: "); + Serial.print(e); + Serial.print(", quiting menu."); + Serial.flush(); + return quit; +} + +int ledCtrl=LOW; + +result myLedOn() { + ledCtrl=HIGH; + return proceed; +} +result myLedOff() { + ledCtrl=LOW; + return proceed; +} + +TOGGLE(ledCtrl,setLed,"Led: ",doNothing,noEvent,noStyle//,doExit,enterEvent,noStyle + ,VALUE("On",HIGH,doNothing,noEvent) + ,VALUE("Off",LOW,doNothing,noEvent) +); + +int selTest=0; +SELECT(selTest,selMenu,"Select",doNothing,noEvent,noStyle + ,VALUE("Zero",0,doNothing,noEvent) + ,VALUE("One",1,doNothing,noEvent) + ,VALUE("Two",2,doNothing,noEvent) +); + +int chooseTest=-1; +CHOOSE(chooseTest,chooseMenu,"Choose",doNothing,noEvent,noStyle + ,VALUE("First",1,doNothing,noEvent) + ,VALUE("Second",2,doNothing,noEvent) + ,VALUE("Third",3,doNothing,noEvent) + ,VALUE("Last",-1,doNothing,noEvent) +); + +//customizing a prompt look! +//by extending the prompt class +class altPrompt:public prompt { +public: + altPrompt(constMEM promptShadow& p):prompt(p) {} + Used printTo(navRoot &root,bool sel,menuOut& out, idx_t idx,idx_t len,idx_t) override { + return out.printRaw(F("special prompt!"),len);; + } +}; + +MENU(subMenu,"Sub-Menu",showEvent,anyEvent,noStyle + ,OP("Sub1",showEvent,anyEvent) + ,OP("Sub2",showEvent,anyEvent) + ,OP("Sub3",showEvent,anyEvent) + ,altOP(altPrompt,"",showEvent,anyEvent) + ,EXIT(" +#include +#include +#include +#include + +using namespace Menu; + +//from: https://www.arduino.cc/en/Tutorial/listfiles +// The circuit: +// * SD card attached to SPI bus as follows: +// ** MOSI - pin 11 +// ** MISO - pin 12 +// ** CLK - pin 13 +// ** CS - pin 4 (for MKRZero SD: SDCARD_SS_PIN) +//this is for my due tft+sd shield +#define SDCARD_SS 53 + +//function to handle file select +// declared here and implemented bellow because we need +// to give it as event handler for `filePickMenu` +// and we also need to refer to `filePickMenu` inside the function +result filePick(eventMask event, navNode& nav, prompt &item); + + +// SDMenu filePickMenu("SD Card","/",filePick,enterEvent); +//caching 32 file entries +CachedSDMenu<32> filePickMenu("SD Card","/",filePick,enterEvent); + +//implementing the handler here after filePick is defined... +result filePick(eventMask event, navNode& nav, prompt &item) { + // switch(event) {//for now events are filtered only for enter, so we dont need this checking + // case enterCmd: + if (nav.root->navFocus==(navTarget*)&filePickMenu) { + Serial.println(); + Serial.print("selected file:"); + Serial.println(filePickMenu.selectedFile); + Serial.print("from folder:"); + Serial.println(filePickMenu.selectedFolder); + } + // break; + // } + return proceed; +} + +#define MAX_DEPTH 2 + +MENU(mainMenu,"Main menu",doNothing,noEvent,wrapStyle + ,SUBMENU(filePickMenu) + ,OP("Something else...",doNothing,noEvent) + ,EXIT("=nextPool) { + nav.poll(); + nextPool=now+1000/menuFPS; + } +} diff --git a/examples/SDCard/platformio.ini b/examples/SDCard/platformio.ini new file mode 100644 index 00000000..266abb7b --- /dev/null +++ b/examples/SDCard/platformio.ini @@ -0,0 +1,11 @@ +[platformio] +src_dir=SDCard + +[env:due] +board=due +platform = atmelsam +framework = arduino +upload_port=/dev/ttyACM0 +build_flags = + -DMENU_FMT_WRAPS + -DMENU_ASYNC diff --git a/examples/SDCard/test/README b/examples/SDCard/test/README new file mode 100644 index 00000000..df5066e6 --- /dev/null +++ b/examples/SDCard/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html diff --git a/examples/SSD1306Ascii/SSD1306Ascii/SSD1306Ascii.ino b/examples/SSD1306Ascii/SSD1306Ascii/SSD1306Ascii.ino index 1ea4c1bb..b2aafb90 100644 --- a/examples/SSD1306Ascii/SSD1306Ascii/SSD1306Ascii.ino +++ b/examples/SSD1306Ascii/SSD1306Ascii/SSD1306Ascii.ino @@ -34,6 +34,9 @@ #include +constexpr int OLED_SDA=4; +constexpr int OLED_SDC=5; + #define I2C_ADDRESS 0x3C // #include #include "SSD1306Ascii.h" @@ -42,6 +45,8 @@ #include #include #include +//enable this include if using esp8266 +// #include using namespace Menu; //Define your font here. Default font: lcd5x7 @@ -150,7 +155,7 @@ serialOut outSerial(Serial, serialTops); //describing a menu output device without macros //define at least one panel for menu output -constMEM panel panels[] MEMMODE = {{0, 0, 128 / fontW, 64 / fontH}}; +const panel panels[] MEMMODE = {{0, 0, 128 / fontW, 64 / fontH}}; navNode* nodes[sizeof(panels) / sizeof(panel)]; //navNodes to store navigation status panelsList pList(panels, nodes, 1); //a list of panels and nodes idx_t tops[MAX_DEPTH] = {0, 0}; //store cursor positions for each level diff --git a/examples/SSD1306Ascii/platformio.ini b/examples/SSD1306Ascii/platformio.ini index dcd29834..b6d0f712 100644 --- a/examples/SSD1306Ascii/platformio.ini +++ b/examples/SSD1306Ascii/platformio.ini @@ -9,18 +9,25 @@ ; http://docs.platformio.org/page/projectconf.html [platformio] -src_dir=Button_Navigation -;src_dir=SSD1306Ascii +src_dir=SSD1306Ascii -[env:nanoatmega328] -platform = atmelavr -board = nanoatmega328 +[env:adafruit_crickit_m0] +board=adafruit_crickit_m0 +platform = atmelsam framework = arduino -upload_port=/dev/ttyUSB* -upload_flags=-V -upload_speed=57600 -build_flags = -DMENU_DEBUG -src_build_flags = !echo "-Wno-write-strings -Wno-reorder -fno-strict-aliasing -DLOC="$PLATFORMIO_LOC +; build_flags = +; -DMENU_DEBUG +; -Wno-strict-aliasing -Wno-sign-compare -Wno-write-strings + +; [env:nanoatmega328] +; platform = atmelavr +; board = nanoatmega328 +; framework = arduino +; upload_port=/dev/ttyUSB* +; upload_flags=-V +; upload_speed=57600 +; build_flags = -DMENU_DEBUG +; src_build_flags = !echo "-Wno-write-strings -Wno-reorder -fno-strict-aliasing -DLOC="$PLATFORMIO_LOC ; [env:teensy31] ; platform = teensy @@ -34,3 +41,10 @@ src_build_flags = !echo "-Wno-write-strings -Wno-reorder -fno-strict-aliasing -D ; framework = arduino ; upload_speed=921600 ; build_flags = -lstdc++ -DDEBUG + +; [env:wemos] +; platform = espressif8266 +; board = d1_mini_pro +; framework = arduino +; ; upload_speed=1500000 +; upload_speed=921600 diff --git a/examples/SSD1306Ascii/Button_Navigation/Button_Navigation.ino b/examples/SSD1306Ascii_Button_Navigation/Button_Navigation/Button_Navigation.ino similarity index 99% rename from examples/SSD1306Ascii/Button_Navigation/Button_Navigation.ino rename to examples/SSD1306Ascii_Button_Navigation/Button_Navigation/Button_Navigation.ino index 99bbc3eb..b9f82035 100644 --- a/examples/SSD1306Ascii/Button_Navigation/Button_Navigation.ino +++ b/examples/SSD1306Ascii_Button_Navigation/Button_Navigation/Button_Navigation.ino @@ -82,6 +82,7 @@ result adjustBrightness() { int pwm = int(2.55 * float(brightnessValue)); analogWrite(LED_PIN, pwm); } + return proceed; } diff --git a/examples/SSD1306Ascii/Button_Navigation/config.h b/examples/SSD1306Ascii_Button_Navigation/Button_Navigation/config.h similarity index 100% rename from examples/SSD1306Ascii/Button_Navigation/config.h rename to examples/SSD1306Ascii_Button_Navigation/Button_Navigation/config.h diff --git a/examples/SSD1306Ascii_Button_Navigation/platformio.ini b/examples/SSD1306Ascii_Button_Navigation/platformio.ini new file mode 100644 index 00000000..63c024b7 --- /dev/null +++ b/examples/SSD1306Ascii_Button_Navigation/platformio.ini @@ -0,0 +1,41 @@ +[platformio] +src_dir=Button_Navigation +; src_dir=SSD1306Ascii + +[env:adafruit_crickit_m0] +board=adafruit_crickit_m0 +platform = atmelsam +framework = arduino +; build_flags = +; -DMENU_DEBUG +; -Wno-strict-aliasing -Wno-sign-compare -Wno-write-strings + +; [env:nanoatmega328] +; platform = atmelavr +; board = nanoatmega328 +; framework = arduino +; upload_port=/dev/ttyUSB* +; upload_flags=-V +; upload_speed=57600 +; build_flags = -DMENU_DEBUG +; src_build_flags = !echo "-Wno-write-strings -Wno-reorder -fno-strict-aliasing -DLOC="$PLATFORMIO_LOC + +; [env:teensy31] +; platform = teensy +; board = teensy31 +; framework = arduino +;; build_flags = -lstdc++ + +; [env:esp12e] +; platform = espressif8266 +; board = esp12e +; framework = arduino +; upload_speed=921600 +; build_flags = -lstdc++ -DDEBUG + +; [env:wemos] +; platform = espressif8266 +; board = d1_mini_pro +; framework = arduino +; ; upload_speed=1500000 +; upload_speed=921600 diff --git a/examples/SdFat/SdFat/SdFat.ino b/examples/SdFat/SdFat/SdFat.ino new file mode 100644 index 00000000..27e3c832 --- /dev/null +++ b/examples/SdFat/SdFat/SdFat.ino @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include +//enable this include if using esp8266 +#include + +using namespace Menu; + +//esp8266 SS (wemos mini) +#define SDCARD_SS SS +SdFat sd; + +//function to handle file select +// declared here and implemented bellow because we need +// to give it as event handler for `filePickMenu` +// and we also need to refer to `filePickMenu` inside the function +result filePick(eventMask event, navNode& nav, prompt &item); + + +SDMenuT> filePickMenu(sd,"SD Card","/",filePick,enterEvent); + +//implementing the handler here after filePick is defined... +result filePick(eventMask event, navNode& nav, prompt &item) { + // switch(event) {//for now events are filtered only for enter, so we dont need this checking + // case enterCmd: + if (nav.root->navFocus==(navTarget*)&filePickMenu) { + Serial.println(); + Serial.print("selected file:"); + Serial.println(filePickMenu.selectedFile); + Serial.print("from folder:"); + Serial.println(filePickMenu.selectedFolder); + } + // break; + // } + return proceed; +} + +#define MAX_DEPTH 2 + +MENU(mainMenu,"Main menu",doNothing,noEvent,wrapStyle + ,SUBMENU(filePickMenu) + ,OP("Something else...",doNothing,noEvent) + ,EXIT("=nextPool) { + nav.poll(); + nextPool=now+1000/menuFPS; + } +} diff --git a/examples/SdFat/platformio.ini b/examples/SdFat/platformio.ini new file mode 100644 index 00000000..26037967 --- /dev/null +++ b/examples/SdFat/platformio.ini @@ -0,0 +1,19 @@ +[platformio] +src_dir=SdFat + +; [env:due] +; board=due +; platform = atmelsam +; framework = arduino +; upload_port=/dev/ttyACM0 +; build_flags = +; -DMENU_FMT_WRAPS +; -DMENU_ASYNC + +[env:uno] +platform=atmelavr +board=pro8MHzatmega328 +framework=arduino +upload_protocol = usbasp +upload_flags = -Pusb +lib_ignore=WebSockets diff --git a/examples/Serial/ansiSerial/.gitignore b/examples/Serial/ansiSerial/.gitignore deleted file mode 100644 index e05273b2..00000000 --- a/examples/Serial/ansiSerial/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.pioenvs -.clang_complete -.gcc-flags.json -.piolibdeps \ No newline at end of file diff --git a/examples/Serial/ansiSerial/.travis.yml b/examples/Serial/ansiSerial/.travis.yml deleted file mode 100644 index 72c6e43f..00000000 --- a/examples/Serial/ansiSerial/.travis.yml +++ /dev/null @@ -1,65 +0,0 @@ -# Continuous Integration (CI) is the practice, in software -# engineering, of merging all developer working copies with a shared mainline -# several times a day < http://docs.platformio.org/en/stable/ci/index.html > -# -# Documentation: -# -# * Travis CI Embedded Builds with PlatformIO -# < https://docs.travis-ci.com/user/integration/platformio/ > -# -# * PlatformIO integration with Travis CI -# < http://docs.platformio.org/en/stable/ci/travis.html > -# -# * User Guide for `platformio ci` command -# < http://docs.platformio.org/en/stable/userguide/cmd_ci.html > -# -# -# Please choice one of the following templates (proposed below) and uncomment -# it (remove "# " before each line) or use own configuration according to the -# Travis CI documentation (see above). -# - - -# -# Template #1: General project. Test it using existing `platformio.ini`. -# - -# language: python -# python: -# - "2.7" -# -# sudo: false -# cache: -# directories: -# - "~/.platformio" -# -# install: -# - pip install -U platformio -# -# script: -# - platformio run - - -# -# Template #2: The project is intended to by used as a library with examples -# - -# language: python -# python: -# - "2.7" -# -# sudo: false -# cache: -# directories: -# - "~/.platformio" -# -# env: -# - PLATFORMIO_CI_SRC=path/to/test/file.c -# - PLATFORMIO_CI_SRC=examples/file.ino -# - PLATFORMIO_CI_SRC=path/to/test/directory -# -# install: -# - pip install -U platformio -# -# script: -# - platformio ci --lib="." --board=ID_1 --board=ID_2 --board=ID_N diff --git a/examples/Serial/serialio/.gitignore b/examples/Serial/serialio/.gitignore deleted file mode 100644 index e05273b2..00000000 --- a/examples/Serial/serialio/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.pioenvs -.clang_complete -.gcc-flags.json -.piolibdeps \ No newline at end of file diff --git a/examples/Serial/serialio/.travis.yml b/examples/Serial/serialio/.travis.yml deleted file mode 100644 index 72c6e43f..00000000 --- a/examples/Serial/serialio/.travis.yml +++ /dev/null @@ -1,65 +0,0 @@ -# Continuous Integration (CI) is the practice, in software -# engineering, of merging all developer working copies with a shared mainline -# several times a day < http://docs.platformio.org/en/stable/ci/index.html > -# -# Documentation: -# -# * Travis CI Embedded Builds with PlatformIO -# < https://docs.travis-ci.com/user/integration/platformio/ > -# -# * PlatformIO integration with Travis CI -# < http://docs.platformio.org/en/stable/ci/travis.html > -# -# * User Guide for `platformio ci` command -# < http://docs.platformio.org/en/stable/userguide/cmd_ci.html > -# -# -# Please choice one of the following templates (proposed below) and uncomment -# it (remove "# " before each line) or use own configuration according to the -# Travis CI documentation (see above). -# - - -# -# Template #1: General project. Test it using existing `platformio.ini`. -# - -# language: python -# python: -# - "2.7" -# -# sudo: false -# cache: -# directories: -# - "~/.platformio" -# -# install: -# - pip install -U platformio -# -# script: -# - platformio run - - -# -# Template #2: The project is intended to by used as a library with examples -# - -# language: python -# python: -# - "2.7" -# -# sudo: false -# cache: -# directories: -# - "~/.platformio" -# -# env: -# - PLATFORMIO_CI_SRC=path/to/test/file.c -# - PLATFORMIO_CI_SRC=examples/file.ino -# - PLATFORMIO_CI_SRC=path/to/test/directory -# -# install: -# - pip install -U platformio -# -# script: -# - platformio ci --lib="." --board=ID_1 --board=ID_2 --board=ID_N diff --git a/examples/TFT/TFT/TFT.ino b/examples/TFT/TFT/TFT.ino index a72c93a4..104273c1 100644 --- a/examples/TFT/TFT/TFT.ino +++ b/examples/TFT/TFT/TFT.ino @@ -13,6 +13,7 @@ MCU: see TFT library compatibility #include // Hardware-specific library #include +#include #include #include #include @@ -33,8 +34,8 @@ using namespace Menu; TFT tft(CS, DC, RST); -char* constMEM hexDigit MEMMODE="0123456789ABCDEF"; -char* constMEM hexNr[] MEMMODE={"0","x",hexDigit,hexDigit}; +const char* constMEM hexDigit MEMMODE="0123456789ABCDEF"; +const char* constMEM hexNr[] MEMMODE={"0","x",hexDigit,hexDigit}; char buf1[]="0x11";//<-- menu will edit this text MENU(mainMenu,"Main menu",doNothing,noEvent,wrapStyle @@ -47,7 +48,7 @@ MENU(mainMenu,"Main menu",doNothing,noEvent,wrapStyle #define ST7735_GRAY RGB565(128,128,128) -const colorDef colors[] MEMMODE={ +const colorDef colors[6] MEMMODE={ {{ST7735_BLACK,ST7735_BLACK},{ST7735_BLACK,ST7735_BLUE,ST7735_BLUE}},//bgColor {{ST7735_GRAY,ST7735_GRAY},{ST7735_WHITE,ST7735_WHITE,ST7735_WHITE}},//fgColor {{ST7735_WHITE,ST7735_BLACK},{ST7735_YELLOW,ST7735_YELLOW,ST7735_RED}},//valColor diff --git a/examples/TFT_HX8257/TFT_HX8257/TFT_HX8257.ino b/examples/TFT_HX8257/TFT_HX8257/TFT_HX8257.ino index ef8dcf25..d7ae6fbb 100644 --- a/examples/TFT_HX8257/TFT_HX8257/TFT_HX8257.ino +++ b/examples/TFT_HX8257/TFT_HX8257/TFT_HX8257.ino @@ -122,7 +122,7 @@ MENU(mainMenu,"Main menu",doNothing,noEvent,wrapStyle #define TFT_GREY 0x5AEB -const colorDef colors[] MEMMODE={ +const colorDef colors[6] MEMMODE={ {{TFT_BLACK,TFT_BLACK},{TFT_BLACK,TFT_BLUE,TFT_BLUE}},//bgColor {{TFT_GREY,TFT_GREY},{TFT_WHITE,TFT_WHITE,TFT_WHITE}},//fgColor {{TFT_WHITE,TFT_BLACK},{TFT_YELLOW,TFT_YELLOW,TFT_RED}},//valColor @@ -153,7 +153,7 @@ serialIn serial(Serial); idx_t serialTops[MAX_DEPTH]={0}; serialOut outSerial(Serial,serialTops); -constMEM panel panels[] MEMMODE={{0,0,480/fontW,320/fontH}}; +const panel panels[] MEMMODE={{0,0,480/fontW,320/fontH}}; navNode* nodes[sizeof(panels)/sizeof(panel)];//navNodes to store navigation status panelsList pList(panels,nodes,1);//a list of panels and nodes idx_t gfxTops[MAX_DEPTH]={0}; diff --git a/examples/TextField/TextField/TextField.ino b/examples/TextField/TextField/TextField.ino index 0ce28491..913d82b2 100644 --- a/examples/TextField/TextField/TextField.ino +++ b/examples/TextField/TextField/TextField.ino @@ -8,13 +8,13 @@ using namespace Menu; #define LEDPIN LED_BUILTIN //list of allowed characters -char* const digit="0123456789"; -char* const hexChars MEMMODE="0123456789ABCDEF"; -char* const alphaNum[] MEMMODE = {" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"}; +const char* const digit="0123456789"; +const char* const hexChars MEMMODE="0123456789ABCDEF"; +const char* const alphaNum[] MEMMODE = {" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.,+-_"}; //individual character validators -char* constMEM validData[] MEMMODE={hexChars,hexChars,hexChars,hexChars}; +const char* constMEM validData[] MEMMODE={hexChars,hexChars,hexChars,hexChars}; -char* constMEM validIP[] MEMMODE = {"012",digit,digit,"."}; +const char* constMEM validIP[] MEMMODE = {"012",digit,digit,"."}; char buf0[]="000.000.000.000"; //define "Op 0" without macro @@ -27,15 +27,17 @@ constMEM textFieldShadowRaw op1InfoRaw MEMMODE={ noStyle, buf0,//edit buffer validIP, - 4 + 4//this is the number of entries on validators array, not th efield length };//MEMMODE static stuff constMEM textFieldShadow& op1Info=*(textFieldShadow*)&op1InfoRaw;//hacking c++ to use progmem (hugly) textField option0(op1Info); char buf1[]="0000"; +char name[]=" ";//field will initialize its size by this string length MENU(mainMenu,"Main menu",doNothing,noEvent,wrapStyle ,OBJ(option0) ,EDIT("Hex",buf1,validData,doNothing,noEvent,noStyle) + ,EDIT("Name",name,alphaNum,doNothing,noEvent,noStyle) ,EXIT(" colors[] MEMMODE={ +const colorDef colors[6] MEMMODE={ {{0,0},{0,1,1}},//bgColor {{1,1},{1,0,0}},//fgColor {{1,1},{1,0,0}},//valColor @@ -143,7 +143,7 @@ uint16_t mins=0; //define a pad style menu (single line menu) //here with a set of fields to enter a date in YYYY/MM/DD format -altMENU(menu,time,"Time",doNothing,noEvent,noStyle,(systemStyles)(_asPad|Menu::_menuData|Menu::_canNav|_parentDraw) +altMENU(menu,timeMenu,"Time",doNothing,noEvent,noStyle,(systemStyles)(_asPad|Menu::_menuData|Menu::_canNav|_parentDraw) ,FIELD(hrs,"",":",0,11,1,0,doNothing,noEvent,noStyle) ,FIELD(mins,"","",0,59,10,1,doNothing,noEvent,wrapStyle) ); @@ -156,7 +156,7 @@ MENU(mainMenu,"Main menu",doNothing,noEvent,wrapStyle ,OP("Op1",doNothing,noEvent) ,OP("Op2",doNothing,noEvent) //,FIELD(test,"Test","%",0,100,10,1,doNothing,noEvent,wrapStyle) - ,SUBMENU(time) + ,SUBMENU(timeMenu) ,SUBMENU(subMenu) ,SUBMENU(setLed) ,OP("LED On",myLedOn,enterEvent) diff --git a/examples/U8GLib/U8GLib/U8GLib.ino b/examples/U8GLib/U8GLib/U8GLib.ino index 44c8b65d..7e660bb6 100644 --- a/examples/U8GLib/U8GLib/U8GLib.ino +++ b/examples/U8GLib/U8GLib/U8GLib.ino @@ -116,8 +116,8 @@ MENU(subMenu,"Sub-Menu",showEvent,anyEvent,noStyle ,EXIT(" colors[] MEMMODE={ +const colorDef colors[6] MEMMODE={ {{0,0},{0,1,1}},//bgColor {{1,1},{1,0,0}},//fgColor {{1,1},{1,0,0}},//valColor diff --git a/examples/U8GLib/platformio.ini b/examples/U8GLib/platformio.ini index edca50a4..bd3cc29e 100644 --- a/examples/U8GLib/platformio.ini +++ b/examples/U8GLib/platformio.ini @@ -18,7 +18,7 @@ framework = arduino upload_port=/dev/ttyUSB* upload_flags=-V upload_speed=57600 -build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro-redefined -DNODEBUG +; build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro-redefined -DNODEBUG ; [env:teensy31] ; platform = teensy @@ -49,4 +49,3 @@ build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro- ; board = esp12e ; framework = arduino ; upload_speed=921600 -; build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro-redefined -lstdc++ -DNODEBUG -DMENU_SSID="\"r-site.net\"" -DMENU_PASS="\"rsite.2011\"" diff --git a/examples/U8x8/U8x8/U8x8.ino b/examples/U8x8/U8x8/U8x8.ino index 542bf769..ad9c0b9e 100644 --- a/examples/U8x8/U8x8/U8x8.ino +++ b/examples/U8x8/U8x8/U8x8.ino @@ -33,8 +33,8 @@ using namespace Menu; U8X8_PCD8544_84X48_4W_HW_SPI u8x8(U8_CS, U8_DC , U8_RST); -char* constMEM hexDigit MEMMODE="0123456789ABCDEF"; -char* constMEM hexNr[] MEMMODE={"0","x",hexDigit,hexDigit}; +const char* constMEM hexDigit MEMMODE="0123456789ABCDEF"; +const char* constMEM hexNr[] MEMMODE={"0","x",hexDigit,hexDigit}; char buf1[]="0x11";//<-- menu will edit this text int chooseTest=-1; diff --git a/examples/UART/uart_menu/uart_menu.ino b/examples/UART/uart_menu/uart_menu.ino new file mode 100644 index 00000000..50b77082 --- /dev/null +++ b/examples/UART/uart_menu/uart_menu.ino @@ -0,0 +1,97 @@ +/******************** +Arduino generic menu system + +Rui Azevedo - ruihfazevedo(@rrob@)gmail.com + +output: Serial +input: Serial +*/ + +#include + +#include +#include +#include +#include +#include +#include + +using namespace Menu; + +#define LEDPIN LED_BUILTIN + +SoftwareSerial ss(11, 10); + + +#define MAX_DEPTH 2 + +// define menu colors -------------------------------------------------------- +#define C_BLACK 0 +#define C_BLUE 3 +#define C_GRAY 7 +#define C_WHITE 15 +#define C_YELLOW 31 +#define C_RED 1 +#define C_GREEN 2 +//each color is in the format: +// {{disabled normal,disabled selected},{enabled normal,enabled selected, enabled editing}} +const colorDef colors[6] MEMMODE={ + {{C_BLACK,C_BLACK}, {C_BLACK,C_BLUE,C_BLUE}},//bgColor + {{C_GRAY,C_GRAY}, {C_WHITE,C_WHITE,C_WHITE}},//fgColor + {{C_WHITE,C_BLACK}, {C_YELLOW,C_YELLOW,C_RED}},//valColor + {{C_WHITE,C_BLACK}, {C_WHITE,C_YELLOW,C_YELLOW}},//unitColor + {{C_WHITE,C_GRAY}, {C_BLACK,C_BLUE,C_WHITE}},//cursorColor + {{C_WHITE,C_YELLOW},{C_GREEN,C_WHITE,C_WHITE}},//titleColor +}; + + +#define offsetX 0 +#define offsetY 0 +#define U8_Width 240 +#define U8_Height 320 + +#define LEDPIN LED_BUILTIN + + +int timeOn=10; +int timeOff=90; + +MENU(mainMenu, "Settings menu", Menu::doNothing, Menu::noEvent, Menu::wrapStyle + ,FIELD(timeOn,"On","ms",0,100,10,1, Menu::doNothing, Menu::noEvent, Menu::noStyle) + ,FIELD(timeOff,"Off","ms",0,100,10,1,Menu::doNothing, Menu::noEvent, Menu::noStyle) + ,EXIT(" colors[] MEMMODE={ +const colorDef my_colors[6] { {{BLACK,BLACK},{BLACK,BLUE,BLUE}},//bgColor {{GRAY,GRAY},{WHITE,WHITE,WHITE}},//fgColor {{WHITE,BLACK},{YELLOW,YELLOW,RED}},//valColor @@ -81,7 +81,7 @@ const colorDef colors[] MEMMODE={ #define offsetY 0 MENU_OUTPUTS(out,MAX_DEPTH - ,UCG_OUT(ucg,colors,fontX,fontY,offsetX,offsetY,{0,0,UC_Width/fontX,UC_Height/fontY}) + ,UCG_OUT(ucg,my_colors,fontX,fontY,offsetX,offsetY,{0,0,UC_Width/fontX,UC_Height/fontY}) ,SERIAL_OUT(Serial) ); @@ -104,7 +104,7 @@ serialOut outSerial(*(Print*)&Serial,serialTops); //define outputs controller idx_t ucg_tops[MAX_DEPTH]; PANELS(ucgPanels,{0,0,UC_Width/fontX,UC_Height/fontY}); -UCGLibOut ucgOut(ucg,colors,ucg_tops,ucgPanels,fontX,fontY); +UCGLibOut ucgOut(ucg,my_colors,ucg_tops,ucgPanels,fontX,fontY); menuOut* const outputs[] MEMMODE={&outSerial,&ucgOut};//list of output devices outputsList out(outputs,2);//outputs list controller diff --git a/examples/UTFT/UTFT/UTFT.ino b/examples/UTFT/UTFT/UTFT.ino index bbaf1a42..795fffe4 100644 --- a/examples/UTFT/UTFT/UTFT.ino +++ b/examples/UTFT/UTFT/UTFT.ino @@ -119,7 +119,7 @@ MENU(mainMenu,"Main menu",doNothing,noEvent,noStyle // {{disabled normal,disabled selected},{enabled normal,enabled selected, enabled editing}} //monochromatic color table -const colorDef colors[] MEMMODE={ +const colorDef colors[6] MEMMODE={ {{VGA_BLACK,VGA_BLACK},{VGA_BLACK,VGA_BLUE,VGA_BLUE}},//bgColor {{VGA_GRAY,VGA_GRAY},{VGA_WHITE,VGA_WHITE,VGA_WHITE}},//fgColor {{VGA_WHITE,VGA_BLACK},{VGA_YELLOW,VGA_YELLOW,VGA_RED}},//valColor diff --git a/examples/UTFT/platformio.ini b/examples/UTFT/platformio.ini index 98119fd2..65b7ea2a 100644 --- a/examples/UTFT/platformio.ini +++ b/examples/UTFT/platformio.ini @@ -1,13 +1,3 @@ -; PlatformIO Project Configuration File -; -; Build options: build flags, source filter -; Upload options: custom upload port, speed and extra flags -; Library options: dependencies, extra library storages -; Advanced options: extra scripting -; -; Please visit documentation for the other options and examples -; http://docs.platformio.org/page/projectconf.html - [platformio] src_dir=UTFT ; lib_dir=~/Arduino/Libraries @@ -16,7 +6,7 @@ src_dir=UTFT platform = atmelsam board = due framework = arduino -build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro-redefined +; build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro-redefined ; [env:teensy31] ; platform=teensy diff --git a/examples/adafruitGfx/lcdMono/.gitignore b/examples/adafruitGfx/lcdMono/.gitignore deleted file mode 100644 index e05273b2..00000000 --- a/examples/adafruitGfx/lcdMono/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.pioenvs -.clang_complete -.gcc-flags.json -.piolibdeps \ No newline at end of file diff --git a/examples/adafruitGfx/lcdMono/.travis.yml b/examples/adafruitGfx/lcdMono/.travis.yml deleted file mode 100644 index 72c6e43f..00000000 --- a/examples/adafruitGfx/lcdMono/.travis.yml +++ /dev/null @@ -1,65 +0,0 @@ -# Continuous Integration (CI) is the practice, in software -# engineering, of merging all developer working copies with a shared mainline -# several times a day < http://docs.platformio.org/en/stable/ci/index.html > -# -# Documentation: -# -# * Travis CI Embedded Builds with PlatformIO -# < https://docs.travis-ci.com/user/integration/platformio/ > -# -# * PlatformIO integration with Travis CI -# < http://docs.platformio.org/en/stable/ci/travis.html > -# -# * User Guide for `platformio ci` command -# < http://docs.platformio.org/en/stable/userguide/cmd_ci.html > -# -# -# Please choice one of the following templates (proposed below) and uncomment -# it (remove "# " before each line) or use own configuration according to the -# Travis CI documentation (see above). -# - - -# -# Template #1: General project. Test it using existing `platformio.ini`. -# - -# language: python -# python: -# - "2.7" -# -# sudo: false -# cache: -# directories: -# - "~/.platformio" -# -# install: -# - pip install -U platformio -# -# script: -# - platformio run - - -# -# Template #2: The project is intended to by used as a library with examples -# - -# language: python -# python: -# - "2.7" -# -# sudo: false -# cache: -# directories: -# - "~/.platformio" -# -# env: -# - PLATFORMIO_CI_SRC=path/to/test/file.c -# - PLATFORMIO_CI_SRC=examples/file.ino -# - PLATFORMIO_CI_SRC=path/to/test/directory -# -# install: -# - pip install -U platformio -# -# script: -# - platformio ci --lib="." --board=ID_1 --board=ID_2 --board=ID_N diff --git a/examples/adafruitGfx/lcdMono/platformio.ini b/examples/adafruitGfx/lcdMono/platformio.ini deleted file mode 100644 index fc3e93bc..00000000 --- a/examples/adafruitGfx/lcdMono/platformio.ini +++ /dev/null @@ -1,25 +0,0 @@ -; PlatformIO Project Configuration File -; -; Build options: build flags, source filter, extra scripting -; Upload options: custom port, speed and extra flags -; Library options: dependencies, extra library storages -; -; Please visit documentation for the other options and examples -; http://docs.platformio.org/en/stable/projectconf.html - -[platformio] -src_dir=lcdMono -; lib_dir=~/Arduino/Libraries - -[env:nanoatmega328] -platform=atmelavr -board=nanoatmega328 -framework=arduino -upload_flags=-V -build_flags = -DNO_DEBUG -DNO_MENU_ASYNC - -; [env:teensy31] -; platform = teensy -; board = teensy31 -; framework = arduino -; build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro-redefined -Wno-switch diff --git a/examples/adafruitGfx/tft/.gitignore b/examples/adafruitGfx/tft/.gitignore deleted file mode 100644 index e05273b2..00000000 --- a/examples/adafruitGfx/tft/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.pioenvs -.clang_complete -.gcc-flags.json -.piolibdeps \ No newline at end of file diff --git a/examples/adafruitGfx/tft/.travis.yml b/examples/adafruitGfx/tft/.travis.yml deleted file mode 100644 index 72c6e43f..00000000 --- a/examples/adafruitGfx/tft/.travis.yml +++ /dev/null @@ -1,65 +0,0 @@ -# Continuous Integration (CI) is the practice, in software -# engineering, of merging all developer working copies with a shared mainline -# several times a day < http://docs.platformio.org/en/stable/ci/index.html > -# -# Documentation: -# -# * Travis CI Embedded Builds with PlatformIO -# < https://docs.travis-ci.com/user/integration/platformio/ > -# -# * PlatformIO integration with Travis CI -# < http://docs.platformio.org/en/stable/ci/travis.html > -# -# * User Guide for `platformio ci` command -# < http://docs.platformio.org/en/stable/userguide/cmd_ci.html > -# -# -# Please choice one of the following templates (proposed below) and uncomment -# it (remove "# " before each line) or use own configuration according to the -# Travis CI documentation (see above). -# - - -# -# Template #1: General project. Test it using existing `platformio.ini`. -# - -# language: python -# python: -# - "2.7" -# -# sudo: false -# cache: -# directories: -# - "~/.platformio" -# -# install: -# - pip install -U platformio -# -# script: -# - platformio run - - -# -# Template #2: The project is intended to by used as a library with examples -# - -# language: python -# python: -# - "2.7" -# -# sudo: false -# cache: -# directories: -# - "~/.platformio" -# -# env: -# - PLATFORMIO_CI_SRC=path/to/test/file.c -# - PLATFORMIO_CI_SRC=examples/file.ino -# - PLATFORMIO_CI_SRC=path/to/test/directory -# -# install: -# - pip install -U platformio -# -# script: -# - platformio ci --lib="." --board=ID_1 --board=ID_2 --board=ID_N diff --git a/examples/adafruitGfx_MCUFRIEND/MCUFRIEND/MCUFRIEND.ino b/examples/adafruitGfx_MCUFRIEND/MCUFRIEND/MCUFRIEND.ino new file mode 100644 index 00000000..dd182381 --- /dev/null +++ b/examples/adafruitGfx_MCUFRIEND/MCUFRIEND/MCUFRIEND.ino @@ -0,0 +1,244 @@ +/********************* + * Sept. 2014 ~ Oct 2016 Rui Azevedo - ruihfazevedo(@rrob@)gmail.com + * May 2020 - review by: Neftali Loya Garibay + + * This menu example works for Chinese MCUFRIEND_kbv TFT LCD's normally sold by Banggood and + * alike places. It is based on adafruit GFX library and on its own "MCUFRIEND_kbv.h" library, + * downlodble from gitHub. It was tested on an ATMEGA-2560 board and it uses an encoder as the + * navigation device. The encoder has also a switch and it was used as the enter key. + * + * Output: 3.5 inch, 480*320 TFT-LCD Arduino UNO and MEGA shield, ILI9486. + * Input: Serial + encoder + * + * www.r-site.net + * + * Alternative encoder (clickEncoder) uses: + * https://github.com/0xPIT/encoder + * https://github.com/PaulStoffregen/TimerOne + * +*********************/ + +#include + +//**** TFT-LCD RELATED LIBRARIES *** +#include +#include "Adafruit_GFX.h" +#include +MCUFRIEND_kbv tft; + +//*** MENU LIBRARY AND ASSOCIATED ENCODER LIBRARIES *** +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace Menu; + +#define LEDPIN 42 + +//*** ROTARY ENCODER PINS AS USED ON AN ARDUINO MEGA-2560 *** +#define encBtn 44 // Use as input with pull-ups +#define encB 46 // Use as input with pull-ups +#define encC 48 // Set it to GND +#define encA 50 // Use as input with pull-ups +#define encBtn2 52 // Set it as output to GND + +/* HUMAN READABLE COLOR DEFINITIONS. Not all the following color defiitions are used on the + * example. However, it is handy to have them available for tailoring the menu's look according + * to our liking. These definitions are a Bodmer's contribution. + */ +#define BLACK 0x0000 /* 0, 0, 0 */ +#define NAVY 0x000F /* 0, 0, 128 */ +#define DARKGREEN 0x03E0 /* 0, 128, 0 */ +#define DARKCYAN 0x03EF /* 0, 128, 128 */ +#define MAROON 0x7800 /* 128, 0, 0 */ +#define PURPLE 0x780F /* 128, 0, 128 */ +#define OLIVE 0x7BE0 /* 128, 128, 0 */ +/*#define LIGHTGREY 0xC618 /* 128, 128, 0 */ +#define GRAY 0xC618 /* 192, 192, 192 */ +#define DARKGRAY 0x7BEF /* 128, 128, 128 */ +#define BLUE 0x001F /* 0, 0, 255 */ +#define GREEN 0x07E0 /* 0, 255, 0 */ +#define CYAN 0x07FF /* 0, 255, 255 */ +#define RED 0xF800 /* 255, 0, 0 */ +#define MAGENTA 0xF81F /* 255, 0, 255 */ +#define YELLOW 0xFFE0 /* 255, 255, 0 */ +#define WHITE 0xFFFF /* 255, 255, 255 */ +#define ORANGE 0xFDA0 /* 255, 180, 0 */ +#define GREENYELLOW 0xB7E0 /* 180, 255, 0 */ +#define PINK 0xFC9F + + +result doAlert(eventMask e, prompt &item); + +int test=55; + +int ledCtrl=LOW; + +result myLedOn() { + ledCtrl=HIGH; + return proceed; +} +result myLedOff() { + ledCtrl=LOW; + return proceed; +} + +TOGGLE(ledCtrl,setLed,"Led: ",doNothing,noEvent,noStyle//,doExit,enterEvent,noStyle + ,VALUE("On",HIGH,doNothing,noEvent) + ,VALUE("Off",LOW,doNothing,noEvent) +); + +int selTest=0; +SELECT(selTest,selMenu,"Select",doNothing,noEvent,noStyle + ,VALUE("Zero",0,doNothing,noEvent) + ,VALUE("One",1,doNothing,noEvent) + ,VALUE("Two",2,doNothing,noEvent) +); + +int chooseTest=-1; +CHOOSE(chooseTest,chooseMenu,"Choose",doNothing,noEvent,noStyle + ,VALUE("First",1,doNothing,noEvent) + ,VALUE("Second",2,doNothing,noEvent) + ,VALUE("Third",3,doNothing,noEvent) + ,VALUE("Last",-1,doNothing,noEvent) +); + +//customizing a prompt look! +//by extending the prompt class +class altPrompt:public prompt { +public: + altPrompt(constMEM promptShadow& p):prompt(p) {} + Used printTo(navRoot &root,bool sel,menuOut& out, idx_t idx,idx_t len,idx_t) override { + return out.printRaw(F("special prompt!"),len);; + } +}; + +MENU(subMenu,"Sub-Menu",doNothing,noEvent,noStyle + ,altOP(altPrompt,"",doNothing,noEvent) + ,OP("Op",doNothing,noEvent) + ,EXIT(" colors[6] MEMMODE={ + {{(uint16_t)BLACK,(uint16_t)BLACK}, {(uint16_t)BLACK, (uint16_t)BLUE, (uint16_t)BLUE}}, //bgColor + {{(uint16_t)GRAY, (uint16_t)GRAY}, {(uint16_t)WHITE, (uint16_t)WHITE, (uint16_t)WHITE}}, //fgColor + {{(uint16_t)WHITE,(uint16_t)BLACK}, {(uint16_t)YELLOW,(uint16_t)YELLOW,(uint16_t)RED}}, //valColor + {{(uint16_t)WHITE,(uint16_t)BLACK}, {(uint16_t)WHITE, (uint16_t)YELLOW,(uint16_t)YELLOW}},//unitColor + {{(uint16_t)WHITE,(uint16_t)GRAY}, {(uint16_t)BLACK, (uint16_t)BLUE, (uint16_t)WHITE}}, //cursorColor + {{(uint16_t)WHITE,(uint16_t)YELLOW},{(uint16_t)BLUE, (uint16_t)RED, (uint16_t)RED}}, //titleColor +}; + +serialIn serial(Serial); + +#ifdef USE_CLICK_ENCODER + ClickEncoder clickEncoder(encA,encB,encBtn); + ClickEncoderStream encStream(clickEncoder,1); + MENU_INPUTS(in,&encStream,&serial); + void timerIsr() {clickEncoder.service();} +#else + encoderIn encoder;//simple quad encoder driver + encoderInStream encStream(encoder,1);// simple quad encoder fake Stream + //a keyboard with only one key as the encoder button + keyMap encBtn_map[]={{-encBtn,defaultNavCodes[enterCmd].ch}};//negative pin numbers use internal pull-up, this is on when low + keyIn<1> encButton(encBtn_map);//1 is the number of keys + MENU_INPUTS(in,&encStream,&encButton,&serial); +#endif + +#define MAX_DEPTH 5 +#define textScale 2 +MENU_OUTPUTS(out,MAX_DEPTH + ,ADAGFX_OUT(tft,colors,6*textScale,9*textScale,{0,0,14,8},{14,0,14,8}) + ,SERIAL_OUT(Serial) +); + +NAVROOT(nav,mainMenu,MAX_DEPTH,in,out); + +//*** WHEN MENU IS SUSPENDED *** +result idle(menuOut& o,idleEvent e) { + if (e==idling) { + o.println(F("suspended...")); + o.println(F("press [select]")); + o.println(F("to continue")); + } + return proceed; +} + +// config myOptions('*','-',defaultNavCodes,false); + +void setup() { + uint16_t ID; + Serial.begin(9600); + Serial.print("Show BMP files on TFT with ID:0x"); + ID = tft.readID(); + Serial.println(ID, HEX); + if (ID == 0x0D3D3) ID = 0x9481; + tft.begin(ID); + tft.fillScreen(0x001F); + tft.setTextColor(0xFFFF, 0x0000); + + //options=&myOptions;//can customize option + pinMode(encBtn, INPUT_PULLUP); + pinMode(encA, INPUT_PULLUP); + pinMode(encB, INPUT_PULLUP); + pinMode(encC, OUTPUT-LOW); + pinMode(encBtn2, OUTPUT-LOW); + pinMode(LEDPIN,OUTPUT); + Serial.begin(115200); + while(!Serial); + Serial.println("menu 4.x test"); + Serial.flush(); + nav.idleTask=idle;//point a function to be used when menu is suspended + mainMenu[1].disable(); + //outGfx.usePreview=true;//reserve one panel for preview? + //nav.showTitle=false;//show menu title? + + + #ifdef USE_CLICK_ENCODER + Timer1.initialize(1000); + Timer1.attachInterrupt(timerIsr); + #else + encButton.begin(); + encoder.begin(); + #endif + + tft.setRotation(3); + tft.setTextSize(textScale); // test scalling + //tft.setTextWrap(false); // NOT AVAILABLE WITHIN THE "MCUFRIEND_kbv.h" library + tft.fillScreen(BLACK); + tft.setTextColor(RED,BLACK); + tft.println("Menu 4.x T est on GFX"); + delay(1000); +} + +void loop() { + nav.poll(); // This device only draws when needed. + digitalWrite(LEDPIN, ledCtrl); + delay(100); // Simulate a delay when other tasks are done. +} diff --git a/examples/LCDs/LiquidCrystal/include/readme.txt b/examples/adafruitGfx_MCUFRIEND/include/README similarity index 100% rename from examples/LCDs/LiquidCrystal/include/readme.txt rename to examples/adafruitGfx_MCUFRIEND/include/README diff --git a/examples/adafruitGfx_MCUFRIEND/platformio.ini b/examples/adafruitGfx_MCUFRIEND/platformio.ini new file mode 100644 index 00000000..4c2564b0 --- /dev/null +++ b/examples/adafruitGfx_MCUFRIEND/platformio.ini @@ -0,0 +1,10 @@ +[platformio] +src_dir=MCUFRIEND + +[env:megaADK] +platform=atmelavr +board=megaADK +framework=arduino +lib_ignore=Websockets +upload_flags=-V +build_flags = -DNO_MENU_ASYNC diff --git a/examples/adafruitGfx_MCUFRIEND/test/README b/examples/adafruitGfx_MCUFRIEND/test/README new file mode 100644 index 00000000..df5066e6 --- /dev/null +++ b/examples/adafruitGfx_MCUFRIEND/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html diff --git a/examples/adafruitGfx_eTFT/TFT_eSPI/ArduinoMenu_LilyGo_TTGO_T-display_demo/ArduinoMenu_LilyGo_TTGO_T-display_demo.ino b/examples/adafruitGfx_eTFT/TFT_eSPI/ArduinoMenu_LilyGo_TTGO_T-display_demo/ArduinoMenu_LilyGo_TTGO_T-display_demo.ino new file mode 100644 index 00000000..6d134d81 --- /dev/null +++ b/examples/adafruitGfx_eTFT/TFT_eSPI/ArduinoMenu_LilyGo_TTGO_T-display_demo/ArduinoMenu_LilyGo_TTGO_T-display_demo.ino @@ -0,0 +1,400 @@ +#include + +/*************************************************************************************************************************************** +LILYGO TTGO T-DISPLAY DEMO +Created at August 29th, 2019 by Jeroen Maathuis (j [dot] maathuis [at] gmail [dot] com) to support the LilyGo TTGO T-display + +Based on: +- ArduinoMenu TFT_eSPI example on https://github.com/neu-rah/ArduinoMenu/blob/master/examples/adafruitGfx/eTFT/TFT_eSPI/TFT_eSPI.ino. +- TTGO T-display example on https://github.com/Xinyuan-LilyGO/TTGO-T-Display/blob/master/TTGO-T-Display.ino. +- Several Button2 examples on https://github.com/LennartHennigs/Button2/tree/master/examples + +External needed library's: +- TFT_eSPI +- Buttons2 + +Additional needed files: +- bmp.h (should be found at the same place as this sketch file) + +Preparations: +- Create TFT_eSPI User Setup file as described on https://github.com/Xinyuan-LilyGO/TTGO-T-Display/blob/master/README.MD and + https://sites.google.com/site/jmaathuis/arduino/lilygo-ttgo-t-display-esp32/arduinomenu-demo-ttgo-t-display +- Attach a led (and a resistor if needed). This is optional. + +This demo can also work on other setups with displays supported by the TFT_eSPI library. This demo is explicitly for the +TTGO T-display but I had a slightly modifies version working on a Wemos D1 mini with attached ST7735 display and some image +and text modifications as well another User Setup file for TFT_eSPI. + +For a more detailed description about this demo please visit: +https://sites.google.com/site/jmaathuis/arduino/lilygo-ttgo-t-display-esp32/arduinomenu-demo-ttgo-t-display + +This sketch may freely redistributed as long as you mention the sources / authors mentioned above. I would be very happy to here from +you when you have improved the sketch. You can mail me at j [dot] maathuis [at] gmail [dot] com. + +****************************************************************************************************************************************/ +#define PROG_VERSION "0.2" // Don't change this! + +//#include +#include +#include +#include "bmp.h" + +#ifndef TFT_DISPOFF +#define TFT_DISPOFF 0x28 +#endif + +#ifndef TFT_SLPIN +#define TFT_SLPIN 0x10 +#endif + +#define TFT_BL 4 // Display backlight control pin + +#define LED_CTRL 0 // Pinnumber of external led to control. Set to 0 if there isn't a external led attached. + +int ledBacklight = 80; // Initial TFT backlight intensity on a scale of 0 to 255. Initial value is 80. + +#define BTN_UP 35 // Pinnumber for button for up/previous and select / enter actions (don't change this if you want to use the onboard buttons) +#define BTN_DWN 0 // Pinnumber for button for down/next and back / exit actions (don't change this if you want to use the onboard buttons) + +#include +#include +#include +// #include +#include //must include this even if not doing web output... + +using namespace Menu; + +TFT_eSPI gfx = TFT_eSPI(); // Define TFT_eSPI object with the size of the screen: 135 pixels width and 240 pixels height. We will rotate it later a quarter clockwise. + +Button2 btnUp(BTN_UP); // Initialize the up button +Button2 btnDwn(BTN_DWN); // Initialize the down button + +result doAlert(eventMask e, prompt &item); + +int test=55; + +int ledCtrl=LOW; // Initial value for external connected led + +// Setting PWM properties, do not change this! +const int pwmFreq = 5000; +const int pwmResolution = 8; +const int pwmLedChannelTFT = 0; + +result myLedOn() { + ledCtrl=HIGH; + return proceed; +} +result myLedOff() { + ledCtrl=LOW; + return proceed; +} + +TOGGLE(ledCtrl,setLed,"Led: ",doNothing,noEvent,noStyle//,doExit,enterEvent,noStyle + ,VALUE("On",HIGH,doNothing,noEvent) + ,VALUE("Off",LOW,doNothing,noEvent) +); + +int selTest=0; +SELECT(selTest,selMenu,"Select",doNothing,noEvent,noStyle + ,VALUE("Zero",0,doNothing,noEvent) + ,VALUE("One",1,doNothing,noEvent) + ,VALUE("Two",2,doNothing,noEvent) +); + +int chooseTest=-1; +CHOOSE(chooseTest,chooseMenu,"Choose",doNothing,noEvent,noStyle + ,VALUE("First",1,doNothing,noEvent) + ,VALUE("Second",2,doNothing,noEvent) + ,VALUE("Third",3,doNothing,noEvent) + ,VALUE("Last",-1,doNothing,noEvent) +); + +//customizing a prompt look! +//by extending the prompt class +class altPrompt:public prompt { +public: + altPrompt(constMEM promptShadow& p):prompt(p) {} + Used printTo(navRoot &root,bool sel,menuOut& out, idx_t idx,idx_t len,idx_t) override { + return out.printRaw(F("special prompt!"),len);; + } +}; + +MENU(subMenu,"Sub-Menu",doNothing,noEvent,noStyle + ,altOP(altPrompt,"",doNothing,noEvent) + ,OP("Op",doNothing,noEvent) + ,EXIT(" colors[6] MEMMODE={ + { + { + (uint16_t)Black, + (uint16_t)Black + }, + { + (uint16_t)Black, + (uint16_t)DarkerBlue, + (uint16_t)DarkerBlue + } + },//bgColor + { + { + (uint16_t)Gray, + (uint16_t)Gray + }, + { + (uint16_t)White, + (uint16_t)White, + (uint16_t)White + } + },//fgColor + { + { + (uint16_t)White, + (uint16_t)Black + }, + { + (uint16_t)Yellow, + (uint16_t)Yellow, + (uint16_t)Red + } + },//valColor + { + { + (uint16_t)White, + (uint16_t)Black + }, + { + (uint16_t)White, + (uint16_t)Yellow, + (uint16_t)Yellow + } + },//unitColor + { + { + (uint16_t)White, + (uint16_t)Gray + }, + { + (uint16_t)Black, + (uint16_t)Blue, + (uint16_t)White + } + },//cursorColor + { + { + (uint16_t)White, + (uint16_t)Yellow + }, + { + (uint16_t)DarkerRed, + (uint16_t)White, + (uint16_t)White + } + },//titleColor +}; + +#define MAX_DEPTH 5 + +serialIn serial(Serial); + +//MENU_INPUTS(in,&serial);its single, no need to `chainStream` + +//define serial output device +idx_t serialTops[MAX_DEPTH]={0}; +serialOut outSerial(Serial,serialTops); + +#define GFX_WIDTH 240 +#define GFX_HEIGHT 135 +#define fontW 12 +#define fontH 18 + +const panel panels[] MEMMODE = {{0, 0, GFX_WIDTH / fontW, GFX_HEIGHT / fontH}}; +navNode* nodes[sizeof(panels) / sizeof(panel)]; //navNodes to store navigation status +panelsList pList(panels, nodes, 1); //a list of panels and nodes +idx_t eSpiTops[MAX_DEPTH]={0}; +TFT_eSPIOut eSpiOut(gfx,colors,eSpiTops,pList,fontW,fontH+1); +menuOut* constMEM outputs[] MEMMODE={&outSerial,&eSpiOut};//list of output devices +outputsList out(outputs,sizeof(outputs)/sizeof(menuOut*));//outputs list controller + +NAVROOT(nav,mainMenu,MAX_DEPTH,serial,out); + +unsigned long idleTimestamp = millis(); + +//when menu is suspended +result idle(menuOut& o,idleEvent e) { + if (e==idling) { + // Show the idle message once + int xpos = gfx.width() / 2; // Half the screen width + gfx.fillScreen(Black); + + gfx.setTextSize(5); + gfx.setTextColor(Yellow,Black); + gfx.setTextWrap(false); + gfx.setTextDatum(MC_DATUM); + gfx.drawString("IDLE", xpos, 50); + int getFontHeight = gfx.fontHeight(); + + gfx.setTextSize(2); + gfx.setTextColor(White,Black); + gfx.setTextDatum(MC_DATUM); + gfx.drawString("Long press a button", xpos, 90); + gfx.drawString("to exit", xpos, 110); + } + return proceed; +} + +//config myOptions('*','-',defaultNavCodes,false); + +void button_init() +{ + btnUp.setLongClickHandler([](Button2 & b) { + // Select + unsigned int time = b.wasPressedFor(); + if (time >= 1000) { + nav.doNav(enterCmd); + } + }); + + btnUp.setClickHandler([](Button2 & b) { + // Up + nav.doNav(downCmd); // It's called downCmd because it decreases the index of an array. Visually that would mean the selector goes upwards. + }); + + btnDwn.setLongClickHandler([](Button2 & b) { + // Exit + unsigned int time = b.wasPressedFor(); + if (time >= 1000) { + nav.doNav(escCmd); + } + }); + + btnDwn.setClickHandler([](Button2 & b) { + // Down + nav.doNav(upCmd); // It's called upCmd because it increases the index of an array. Visually that would mean the selector goes downwards. + }); +} + +void button_loop() +{ + // Check for button presses + btnUp.loop(); + btnDwn.loop(); +} + +void setup() { + //options=&myOptions;//can customize options + Serial.begin(115200); // Set Serial baudrate at 115200 + while(!Serial); + Serial.flush(); + Serial.println(); + Serial.print("ARDUINOMENU DEMO V"); + Serial.print(PROG_VERSION); + Serial.println(" FOR LILYGO TTGO T-DISPLAY"); + + nav.idleTask=idle;//point a function to be used when menu is suspended + mainMenu[1].disable(); + //outGfx.usePreview=true;//reserve one panel for preview? + //nav.showTitle=false;//show menu title? + + //SPI.begin(); // Leave this commented or else there will be nothing shown on the screen. + gfx.init(); // Initialize the screen. + + Serial.print("Configuring PWM for TFT backlight... "); + ledcSetup(pwmLedChannelTFT, pwmFreq, pwmResolution); + ledcAttachPin(TFT_BL, pwmLedChannelTFT); + Serial.println("DONE"); + + Serial.print("Setting PWM for TFT backlight to default intensity... "); + ledcWrite(pwmLedChannelTFT, ledBacklight); + Serial.println("DONE"); + + gfx.setRotation(1); // Rotate display a quarter clockwise + + gfx.setTextSize(2); + gfx.setTextWrap(false); + gfx.fillScreen(Black); + + Serial.print("Showing bootlogo... "); + gfx.setSwapBytes(true); + gfx.pushImage(0, 0, 240, 135, bootlogo); + delay(1000); + Serial.println("DONE"); + + Serial.print("Initialize buttons... "); + button_init(); + delay(1000); + Serial.println("DONE"); + + Serial.print("Initialize external led... "); + if(LED_CTRL > 0){ + pinMode(LED_CTRL,OUTPUT); + digitalWrite(LED_CTRL,ledCtrl); + delay(500); + Serial.println("DONE"); + } + else{ + delay(500); + Serial.println("NOT SET UP"); + } + + delay(2000); // A little bit more delay so that you will be able to see the bootlogo. + + Serial.println("- READY -"); + + gfx.fillScreen(Black); // Clear the screen to be ready to draw the menu +} + +void loop() { + button_loop(); + nav.poll();//this device only draws when needed + + // External connected led + if(LED_CTRL > 0){ // Only set led state when a pinnumber for the external led has been provided. + digitalWrite(LED_CTRL,ledCtrl); + } + + // Set blacklight intenisty of screen + ledcWrite(pwmLedChannelTFT, ledBacklight); +} diff --git a/examples/adafruitGfx_eTFT/TFT_eSPI/ArduinoMenu_LilyGo_TTGO_T-display_demo/bmp.h b/examples/adafruitGfx_eTFT/TFT_eSPI/ArduinoMenu_LilyGo_TTGO_T-display_demo/bmp.h new file mode 100644 index 00000000..76f6895b --- /dev/null +++ b/examples/adafruitGfx_eTFT/TFT_eSPI/ArduinoMenu_LilyGo_TTGO_T-display_demo/bmp.h @@ -0,0 +1,148 @@ +#if defined(__AVR__) + #include +#elif defined(__PIC32MX__) + #define PROGMEM +#elif defined(__arm__) + #define PROGMEM +#endif + +// ArduinoMenu bootlogo +// Height : 135 pixels +// Width : 240 pixels +const unsigned short bootlogo[32400] PROGMEM={ +0x8410, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x8410, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x118c, 0x2315, 0x1a0f, 0x0908, 0x0041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a0e, 0x2bdb, 0x2316, 0x1a93, 0x22d4, 0x22d3, 0x1a0e, 0x0907, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2292, 0x2b9a, 0x2bdb, 0x2358, 0x1a93, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x1a93, 0x11cd, 0x08c6, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0042, 0x2316, 0x2b9a, 0x2b9a, 0x2bdb, 0x2b59, 0x2294, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x1a93, 0x118c, 0x08c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0884, 0x2b58, 0x2b9a, 0x2b9a, 0x2b9a, 0x2bdb, 0x2b9a, 0x22d4, 0x2293, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x1a92, 0x118b, 0x08c6, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0908, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2bdb, 0x2bdb, 0x2316, 0x2293, 0x1a50, 0x0884, 0x118b, 0x1a92, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x1a51, 0x0041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x11cd, 0x11cc, 0x0883, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x118b, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2316, 0x1108, 0x2316, 0x2bdb, 0x2317, 0x2293, 0x1a0f, 0x0000, 0x0000, 0x0000, 0x08c5, 0x11cc, 0x1a93, 0x22d4, 0x22d4, 0x22d4, 0x1a50, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x1a50, 0x22d4, 0x22d4, 0x22d4, 0x0884, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x19cd, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2316, 0x0883, 0x0000, 0x1a0f, 0x2bdb, 0x2357, 0x1a93, 0x2293, 0x0042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0907, 0x1a0f, 0x11cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0083, 0x1a92, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x1149, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a51, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x22d4, 0x0001, 0x0000, 0x0000, 0x118c, 0x2bdb, 0x2b59, 0x22d4, 0x22d4, 0x08c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c5, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x1149, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0884, 0x2317, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x1a50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0907, 0x2bdb, 0x2b9a, 0x22d4, 0x22d4, 0x1149, 0x0000, 0x0000, 0x0884, 0x0884, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0908, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x1149, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x19cd, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x19cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0042, 0x2b99, 0x2b9a, 0x22d5, 0x2293, 0x118c, 0x0000, 0x0000, 0x0907, 0x22d4, 0x1a0f, 0x0908, 0x0041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x118a, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x0907, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x1149, 0x2315, 0x118b, 0x0000, 0x0000, 0x0000, 0x0042, 0x0042, 0x0000, 0x0000, 0x2316, 0x2bdb, 0x2316, 0x2293, 0x1a50, 0x0000, 0x0000, 0x0083, 0x22d4, 0x22d4, 0x22d4, 0x11cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x11cd, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x08c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0884, 0x2b57, 0x1108, 0x0000, 0x0000, 0x1a51, 0x2bdb, 0x2357, 0x1a93, 0x1a93, 0x0041, 0x0000, 0x0000, 0x1a51, 0x22d4, 0x22d4, 0x1a51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x1a0f, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x1a51, 0x0043, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c5, 0x2b58, 0x2b9a, 0x118b, 0x0000, 0x0000, 0x11cc, 0x2bdb, 0x2358, 0x1a93, 0x22d4, 0x0884, 0x0000, 0x0000, 0x11cd, 0x22d4, 0x22d4, 0x22d4, 0x0883, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0043, 0x1a92, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x1a0f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0884, 0x2b9a, 0x2b9a, 0x2b9a, 0x1a0e, 0x0000, 0x0000, 0x1108, 0x2bdb, 0x2b9a, 0x22d4, 0x22d4, 0x0908, 0x0000, 0x0000, 0x118a, 0x22d4, 0x22d4, 0x22d4, 0x08c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0884, 0x1a93, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x11cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0883, 0x2b99, 0x2b9a, 0x2b9a, 0x22d3, 0x0000, 0x0000, 0x08c5, 0x2bdb, 0x2b9a, 0x22d5, 0x2293, 0x118b, 0x0000, 0x0000, 0x08c6, 0x22d4, 0x22d4, 0x22d4, 0x1149, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0907, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x118b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a50, 0x2b9a, 0x1a50, 0x08c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x22d5, 0x2b9a, 0x2b9a, 0x2b57, 0x0001, 0x0000, 0x0000, 0x2316, 0x2bdb, 0x2316, 0x1a93, 0x1a0f, 0x0000, 0x0000, 0x0883, 0x22d4, 0x22d4, 0x22d4, 0x11cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x1149, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x0907, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2292, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2357, 0x1a0e, 0x08c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a51, 0x2b9a, 0x2b9a, 0x2b9a, 0x08c5, 0x0000, 0x0000, 0x2292, 0x2bdb, 0x2317, 0x1a93, 0x1a52, 0x0000, 0x0000, 0x0001, 0x1a92, 0x22d4, 0x22d4, 0x1a50, 0x0000, 0x0000, 0x0000, 0x11cc, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x08c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2b57, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2316, 0x19cd, 0x0884, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x118b, 0x2b9a, 0x2b9a, 0x2b9a, 0x118b, 0x0000, 0x0000, 0x1a0e, 0x2bdb, 0x2358, 0x1a93, 0x22d4, 0x0884, 0x0000, 0x0000, 0x1a0e, 0x22d4, 0x22d4, 0x1a93, 0x0000, 0x0000, 0x1a0f, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x1a92, 0x0883, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2292, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2315, 0x118b, 0x0043, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0907, 0x2b9a, 0x2b9a, 0x2b9a, 0x19cd, 0x0000, 0x0000, 0x1149, 0x2bdb, 0x2b99, 0x1ad4, 0x22d4, 0x08c6, 0x0000, 0x0000, 0x114a, 0x22d4, 0x22d4, 0x22d4, 0x11cd, 0x1a10, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x1a50, 0x0041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c6, 0x22d4, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x22d4, 0x118b, 0x0042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0043, 0x2b99, 0x2b9a, 0x2b9a, 0x2293, 0x0000, 0x0000, 0x08c5, 0x2bdb, 0x2b9a, 0x22d5, 0x2293, 0x118a, 0x0000, 0x0000, 0x0908, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x19ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0042, 0x118b, 0x22d5, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b99, 0x2292, 0x114a, 0x0042, 0x0000, 0x0000, 0x0000, 0x22d5, 0x2b9a, 0x2b9a, 0x2b57, 0x0001, 0x0000, 0x0001, 0x2b57, 0x2bdb, 0x2316, 0x2293, 0x1a0e, 0x0000, 0x0000, 0x0884, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x118b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0883, 0x11cc, 0x2316, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b99, 0x1a51, 0x0907, 0x0000, 0x22d3, 0x2b9a, 0x2b9a, 0x2b9a, 0x0884, 0x0000, 0x0000, 0x22d4, 0x2bdb, 0x2317, 0x1a93, 0x1a50, 0x0000, 0x0000, 0x0000, 0x1a92, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x0907, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c5, 0x19cd, 0x2316, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b99, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x0907, 0x0000, 0x0000, 0x1a0f, 0x2bdb, 0x2358, 0x1a93, 0x22d4, 0x0083, 0x0000, 0x0000, 0x1a50, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x1a93, 0x0042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x0042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c6, 0x1a0f, 0x2b57, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x11cc, 0x0000, 0x0000, 0x118a, 0x2bdb, 0x2b59, 0x1a93, 0x22d4, 0x08c6, 0x0000, 0x0000, 0x118c, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x1a93, 0x11cc, 0x08c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a50, 0x11cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0906, 0x1a50, 0x2b58, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2292, 0x0000, 0x0000, 0x08c6, 0x2bdb, 0x2b9a, 0x22d4, 0x22d4, 0x114a, 0x0000, 0x0000, 0x08c5, 0x1a92, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x1a92, 0x118c, 0x0884, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x1a10, 0x22d4, 0x1a0e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0908, 0x1a51, 0x2b99, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2316, 0x0000, 0x0000, 0x0041, 0x2b58, 0x2bdb, 0x22d5, 0x1a93, 0x11cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0884, 0x118b, 0x1a92, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x1a52, 0x114a, 0x0001, 0x0000, 0x0000, 0x19ce, 0x22d4, 0x22d4, 0x1a52, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x1148, 0x2b57, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x22d4, 0x0000, 0x0000, 0x0000, 0x22d4, 0x2bdb, 0x2357, 0x2293, 0x1a51, 0x0042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c5, 0x118c, 0x1a93, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x0884, 0x0000, 0x0000, 0x1a0e, 0x22d4, 0x22d4, 0x22d4, 0x0883, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2315, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x22d3, 0x0001, 0x0000, 0x0000, 0x0000, 0x1a92, 0x2b9b, 0x2359, 0x1a93, 0x1a93, 0x22d4, 0x1a0f, 0x0908, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0907, 0x11cd, 0x1a93, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x0908, 0x0000, 0x0000, 0x114a, 0x22d4, 0x22d4, 0x22d4, 0x08c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x22d4, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x1a51, 0x0000, 0x0000, 0x0000, 0x0000, 0x19cd, 0x2b9a, 0x2c1d, 0x1a52, 0x118b, 0x1a93, 0x22d5, 0x2316, 0x22d5, 0x2293, 0x11cd, 0x0907, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0907, 0x1a0e, 0x22d4, 0x22d4, 0x11cd, 0x0000, 0x0000, 0x08c5, 0x22d4, 0x22d4, 0x22d4, 0x1149, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0883, 0x2357, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x1a0e, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a50, 0x2bdb, 0x341e, 0x2316, 0x0908, 0x0907, 0x114a, 0x118c, 0x1a10, 0x1a93, 0x2315, 0x2316, 0x22d5, 0x1a93, 0x11cc, 0x08c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x118a, 0x118c, 0x0000, 0x0000, 0x0042, 0x2293, 0x22d4, 0x22d4, 0x11cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c6, 0x2b99, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x1149, 0x0000, 0x0000, 0x0000, 0x0000, 0x22d3, 0x2bdc, 0x341d, 0x1a93, 0x0908, 0x0908, 0x1149, 0x1149, 0x0908, 0x0908, 0x114a, 0x11cd, 0x1a50, 0x1a93, 0x2316, 0x2316, 0x22d5, 0x1a93, 0x118c, 0x0884, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a51, 0x22d4, 0x22d4, 0x1a50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1149, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b99, 0x08c6, 0x0000, 0x0000, 0x0000, 0x0883, 0x2316, 0x341c, 0x2c1c, 0x1a50, 0x0907, 0x1149, 0x0908, 0x0043, 0x08c5, 0x1149, 0x114a, 0x1149, 0x0908, 0x0908, 0x114a, 0x11cd, 0x1a50, 0x1a93, 0x2316, 0x2316, 0x22d5, 0x1a52, 0x118b, 0x0884, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x11cd, 0x22d4, 0x22d4, 0x1a93, 0x0041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x11cc, 0x08c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x11cc, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b58, 0x0884, 0x0000, 0x0000, 0x0000, 0x08c5, 0x2b58, 0x341d, 0x2bdb, 0x11ce, 0x0907, 0x1149, 0x0907, 0x0000, 0x0000, 0x0000, 0x0000, 0x0043, 0x0906, 0x1149, 0x114a, 0x1149, 0x0908, 0x0908, 0x114a, 0x11ce, 0x1a51, 0x22d4, 0x2316, 0x2315, 0x22d4, 0x1a51, 0x114a, 0x0883, 0x0000, 0x0000, 0x0000, 0x1149, 0x22d4, 0x22d4, 0x22d4, 0x08c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2315, 0x2b9a, 0x2316, 0x118c, 0x0000, 0x0000, 0x0000, 0x2316, 0x2b9a, 0x2b9a, 0x2b9a, 0x22d5, 0x0042, 0x0000, 0x0000, 0x0000, 0x1108, 0x2b9a, 0x341d, 0x2b9a, 0x118c, 0x0907, 0x114a, 0x08c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0883, 0x0907, 0x114a, 0x114a, 0x1149, 0x0908, 0x0949, 0x118a, 0x120e, 0x1a52, 0x22d4, 0x2316, 0x2315, 0x22d4, 0x1a50, 0x0908, 0x0001, 0x118a, 0x22d4, 0x22d4, 0x22d4, 0x1149, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x19cd, 0x2b9a, 0x2b9a, 0x2b9a, 0x08c6, 0x0000, 0x0000, 0x1a51, 0x2b9a, 0x2b9a, 0x1a51, 0x0000, 0x0000, 0x0000, 0x0000, 0x11cc, 0x2bda, 0x341d, 0x2358, 0x114a, 0x0907, 0x114a, 0x0884, 0x0000, 0x0000, 0x0000, 0x0001, 0x0883, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0884, 0x0907, 0x114a, 0x114a, 0x0949, 0x0908, 0x1149, 0x118b, 0x1a0e, 0x1a92, 0x22d5, 0x2316, 0x22d5, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x22d4, 0x118c, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1149, 0x2b9a, 0x2b9a, 0x2b9a, 0x118b, 0x0000, 0x0000, 0x19cd, 0x2b9a, 0x1a0e, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a50, 0x2bdb, 0x341e, 0x2316, 0x0949, 0x0908, 0x114a, 0x0883, 0x0000, 0x0000, 0x0000, 0x0000, 0x0908, 0x114a, 0x1149, 0x08c6, 0x0043, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0884, 0x0908, 0x114a, 0x114a, 0x1149, 0x0908, 0x1149, 0x118c, 0x1a0f, 0x1a92, 0x22d5, 0x2316, 0x22d5, 0x22d4, 0x22d4, 0x1a10, 0x0884, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c6, 0x2b9a, 0x2b9a, 0x2b9a, 0x1a0e, 0x0000, 0x0000, 0x1148, 0x1a0e, 0x0000, 0x0000, 0x0000, 0x0000, 0x2292, 0x2bdb, 0x341d, 0x22d4, 0x0908, 0x0908, 0x1149, 0x0042, 0x0000, 0x0000, 0x0000, 0x0041, 0x1149, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x1149, 0x08c6, 0x0042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x08c5, 0x0908, 0x114a, 0x114a, 0x1109, 0x0908, 0x1149, 0x11cc, 0x1a50, 0x1a93, 0x22d5, 0x2316, 0x2294, 0x0907, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x2b57, 0x2b9a, 0x2b9a, 0x22d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x22d4, 0x33dc, 0x2c1d, 0x1a51, 0x0907, 0x1149, 0x0908, 0x0001, 0x0000, 0x0000, 0x0000, 0x0043, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x1149, 0x08c5, 0x0042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0042, 0x08c5, 0x1149, 0x114a, 0x1149, 0x1109, 0x0908, 0x1149, 0x11cc, 0x1a50, 0x2293, 0x11cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x22d4, 0x2b9a, 0x2b9a, 0x2b58, 0x0041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0884, 0x2b57, 0x341c, 0x2bdc, 0x1a0f, 0x0907, 0x1149, 0x0907, 0x0000, 0x0000, 0x0000, 0x0000, 0x0884, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x1108, 0x08c5, 0x0041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x08c6, 0x114a, 0x114a, 0x1149, 0x0908, 0x0908, 0x118a, 0x08c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a50, 0x2b9a, 0x2b9a, 0x2b9a, 0x0884, 0x0000, 0x0000, 0x0000, 0x1108, 0x2b9a, 0x341d, 0x2b9b, 0x11cd, 0x0907, 0x114a, 0x08c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c5, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x1149, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x0908, 0x08c6, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0884, 0x114a, 0x114a, 0x114a, 0x114a, 0x1149, 0x0041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x118b, 0x2b9a, 0x2b9a, 0x2b9a, 0x1149, 0x0000, 0x0000, 0x118a, 0x2b9a, 0x341d, 0x2b99, 0x118b, 0x0907, 0x114a, 0x08c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c6, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x08c6, 0x0000, 0x0883, 0x0907, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x0907, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c5, 0x114a, 0x114a, 0x114a, 0x114a, 0x0908, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c6, 0x2b9a, 0x2b9a, 0x2b9a, 0x19cd, 0x0000, 0x11cd, 0x2bdb, 0x341e, 0x2317, 0x1149, 0x0907, 0x114a, 0x0884, 0x0000, 0x0000, 0x0000, 0x0000, 0x0908, 0x114a, 0x114a, 0x114a, 0x114a, 0x08c6, 0x0042, 0x1149, 0x114a, 0x114a, 0x114a, 0x0906, 0x0000, 0x0000, 0x0000, 0x0001, 0x0884, 0x0907, 0x114a, 0x114a, 0x114a, 0x0884, 0x0000, 0x0000, 0x0000, 0x0000, 0x0907, 0x114a, 0x114a, 0x114a, 0x114a, 0x0907, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0883, 0x2b9a, 0x2b9a, 0x2b9a, 0x2b58, 0x2315, 0x2bdb, 0x341d, 0x22d5, 0x0908, 0x0908, 0x114a, 0x0043, 0x0000, 0x0000, 0x0000, 0x0041, 0x1109, 0x114a, 0x114a, 0x114a, 0x114a, 0x08c5, 0x0000, 0x0000, 0x0907, 0x114a, 0x114a, 0x114a, 0x1108, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x08c6, 0x0884, 0x0000, 0x0000, 0x0000, 0x0001, 0x0908, 0x114a, 0x114a, 0x114a, 0x114a, 0x08c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2315, 0x2b9a, 0x2b9a, 0x2b9a, 0x2bdc, 0x341d, 0x1a92, 0x0907, 0x1149, 0x1149, 0x0041, 0x0000, 0x0000, 0x0000, 0x0042, 0x1149, 0x114a, 0x114a, 0x114a, 0x114a, 0x0884, 0x0000, 0x0000, 0x0000, 0x08c5, 0x114a, 0x114a, 0x114a, 0x114a, 0x0042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x1149, 0x114a, 0x114a, 0x114a, 0x114a, 0x08c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a50, 0x2b9a, 0x2b9a, 0x341c, 0x2c1c, 0x1a10, 0x0907, 0x1149, 0x0908, 0x0000, 0x0000, 0x0000, 0x0000, 0x0885, 0x114a, 0x114a, 0x114a, 0x114a, 0x1149, 0x0042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0884, 0x114a, 0x114a, 0x114a, 0x114a, 0x0083, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0042, 0x1149, 0x114a, 0x114a, 0x114a, 0x114a, 0x0883, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x19cd, 0x2b9a, 0x341d, 0x2bdb, 0x11ce, 0x0907, 0x1149, 0x0907, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0885, 0x1149, 0x114a, 0x114a, 0x1149, 0x0041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0042, 0x114a, 0x114a, 0x114a, 0x114a, 0x08c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c5, 0x114a, 0x114a, 0x114a, 0x1149, 0x0042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1108, 0x341d, 0x2b9a, 0x118c, 0x0907, 0x114a, 0x114a, 0x08c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0042, 0x08c5, 0x0041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x1149, 0x114a, 0x114a, 0x114a, 0x08c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0883, 0x114a, 0x114a, 0x1108, 0x0041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0883, 0x2317, 0x114a, 0x0907, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x0907, 0x0884, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0908, 0x114a, 0x114a, 0x114a, 0x0908, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0042, 0x114a, 0x0908, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0884, 0x08c6, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x1149, 0x0906, 0x0883, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c6, 0x114a, 0x114a, 0x114a, 0x114a, 0x0041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x08c5, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0042, 0x08c5, 0x0908, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x0883, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0884, 0x114a, 0x114a, 0x114a, 0x114a, 0x0042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0042, 0x08c5, 0x1149, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x114a, 0x0908, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0042, 0x114a, 0x114a, 0x114a, 0x114a, 0x0884, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0042, 0x08c6, 0x1149, 0x114a, 0x114a, 0x114a, 0x1149, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x114a, 0x114a, 0x114a, 0x114a, 0x08c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0043, 0x08c6, 0x114a, 0x114a, 0x0042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0908, 0x114a, 0x114a, 0x114a, 0x0908, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0884, 0x0042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c6, 0x114a, 0x114a, 0x114a, 0x1149, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c5, 0x114a, 0x114a, 0x114a, 0x114a, 0x0042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0883, 0x114a, 0x114a, 0x114a, 0x114a, 0x0884, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x114a, 0x114a, 0x114a, 0x114a, 0x08c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1108, 0x114a, 0x114a, 0x114a, 0x0908, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0907, 0x114a, 0x114a, 0x114a, 0x1149, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c5, 0x114a, 0x114a, 0x114a, 0x114a, 0x0042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0883, 0x114a, 0x114a, 0x114a, 0x114a, 0x0884, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0042, 0x114a, 0x114a, 0x114a, 0x114a, 0x08c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1109, 0x114a, 0x114a, 0x114a, 0x0043, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x08c5, 0x0907, 0x0042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, 0xe71c, 0x9cd3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cd3, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xffdf, 0x9cd3, 0x0000, 0x0000, 0x9cd3, 0xffdf, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c51, 0xffdf, 0xf79e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc618, 0xdedb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb596, 0xffdf, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xffdf, 0xffdf, 0x4208, 0x5acb, 0xffdf, 0xffdf, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc618, 0xffdf, 0xffdf, 0x5acb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4208, 0x9cd3, 0x7bcf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xffdf, 0xffdf, 0xce59, 0xdedb, 0xffdf, 0xffdf, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf79e, 0xffdf, 0xffdf, 0x9cd3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0xce59, 0xffdf, 0xffdf, 0xb596, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b4d, 0xffdf, 0xe71c, 0xffdf, 0xdedb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdedb, 0xb596, 0x2945, 0xc618, 0xffdf, 0xffdf, 0xdedb, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c51, 0xf79e, 0xffdf, 0xffdf, 0xad55, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xad55, 0x0000, 0x0000, 0x0000, 0x0000, 0xc618, 0xdedb, 0x0000, 0x0000, 0x0000, 0x0000, 0x4208, 0xf79e, 0xffdf, 0xffdf, 0xdedb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdedb, 0xc618, 0x4208, 0xce59, 0xffdf, 0xffdf, 0xdedb, 0x2945, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7bcf, 0xe71c, 0xffdf, 0xffdf, 0xe71c, 0x7bcf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x4208, 0xffdf, 0xf79e, 0x2945, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7bcf, 0xf79e, 0xffdf, 0xffdf, 0xe71c, 0x7bcf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdedb, 0xc618, 0x4208, 0xce59, 0xffdf, 0xffdf, 0xdedb, 0x2945, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xad55, 0x0000, 0x0000, 0x0000, 0x0000, 0xc618, 0xdedb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad55, 0xffdf, 0x8c51, 0xe71c, 0xffdf, 0x2945, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xf79e, 0xe71c, 0xffdf, 0xf79e, 0xe71c, 0xffdf, 0xce59, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c51, 0xffdf, 0xffdf, 0xe71c, 0xf79e, 0xffdf, 0xffdf, 0xffdf, 0x0000, 0x0000, 0x0000, 0x2945, 0xffdf, 0xce59, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, 0xce59, 0xe71c, 0xffdf, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xf79e, 0xf79e, 0xffdf, 0xce59, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c51, 0xffdf, 0xffdf, 0xe71c, 0xe71c, 0xffdf, 0xffdf, 0x8c51, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0xdedb, 0xce59, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c51, 0xffdf, 0xffdf, 0xe71c, 0xe71c, 0xffdf, 0xffdf, 0x8c51, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xf79e, 0xf79e, 0xffdf, 0xce59, 0x0000, 0x0000, 0x0000, 0x2945, 0xffdf, 0xce59, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x4208, 0xb596, 0xffdf, 0x8c51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xffdf, 0xffdf, 0xad55, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xf79e, 0xffdf, 0x5acb, 0x0000, 0x2945, 0xce59, 0xffdf, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xffdf, 0xf79e, 0x7bcf, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xf79e, 0xffdf, 0x5acb, 0x0000, 0x0000, 0x5acb, 0xffdf, 0xf79e, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xf79e, 0xf79e, 0x4208, 0x0000, 0x0000, 0x4208, 0xf79e, 0xf79e, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xffdf, 0xf79e, 0x7bcf, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4208, 0xffdf, 0xdedb, 0x0000, 0x6b4d, 0xffdf, 0xc618, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xffdf, 0x8c51, 0x0000, 0x0000, 0x0000, 0x8c51, 0xad55, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xf79e, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xf79e, 0x2945, 0x0000, 0x0000, 0x0000, 0xf79e, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xf79e, 0x2945, 0x0000, 0x0000, 0x0000, 0xf79e, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cd3, 0xffdf, 0xf79e, 0xe71c, 0xe71c, 0xffdf, 0xf79e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xce59, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0x6b4d, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xf79e, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xf79e, 0x0000, 0x0000, 0x0000, 0x2945, 0xf79e, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xffdf, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xc618, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xf79e, 0x0000, 0x0000, 0x0000, 0x2945, 0xf79e, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, 0xffdf, 0xf79e, 0x0000, 0x0000, 0x0000, 0x8c51, 0xffdf, 0xad55, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf79e, 0xffdf, 0x5acb, 0x0000, 0x2945, 0xce59, 0xffdf, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x7bcf, 0xf79e, 0xffdf, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xf79e, 0xffdf, 0x5acb, 0x0000, 0x0000, 0x5acb, 0xffdf, 0xf79e, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xf79e, 0x2945, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x7bcf, 0xf79e, 0xffdf, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7bcf, 0xffdf, 0xb596, 0x0000, 0x0000, 0x0000, 0x4208, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c51, 0xffdf, 0xffdf, 0xe71c, 0xf79e, 0xffdf, 0xffdf, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xce59, 0xffdf, 0xf79e, 0xf79e, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, 0xce59, 0xe71c, 0xffdf, 0xffdf, 0xe71c, 0xdedb, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xce59, 0xffdf, 0x2945, 0x0000, 0x0000, 0x0000, 0x8c51, 0xffdf, 0xffdf, 0xe71c, 0xe71c, 0xffdf, 0xffdf, 0x8c51, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0xad55, 0xffdf, 0xf79e, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xb596, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0xce59, 0xffdf, 0x2945, 0x0000, 0x0000, 0x0000, 0xce59, 0xffdf, 0xf79e, 0xf79e, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b4d, 0xf79e, 0x6b4d, 0x0000, 0x0000, 0x0000, 0x0000, 0xc618, 0xce59, 0x0000, 0x0000, 0x0000, 0x0000, 0xdedb, 0xc618, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7bcf, 0xf79e, 0xffdf, 0xffdf, 0xad55, 0xb596, 0xdedb, 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, 0xce59, 0xffdf, 0xffdf, 0xce59, 0x4208, 0xc618, 0xdedb, 0x0000, 0x0000, 0x0000, 0x0000, 0x4208, 0xf79e, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xf79e, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0xdedb, 0xc618, 0x0000, 0x0000, 0x0000, 0x0000, 0xad55, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c51, 0xf79e, 0xffdf, 0xffdf, 0xf79e, 0x8c51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdedb, 0xc618, 0x0000, 0x0000, 0x0000, 0x0000, 0xc618, 0xdedb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c51, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xdedb, 0x0000, 0x0000, 0x0000, 0x0000, 0xdedb, 0xc618, 0x0000, 0x0000, 0x0000, 0x0000, 0xad55, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, 0xce59, 0xffdf, 0xffdf, 0xce59, 0x4208, 0xc618, 0xdedb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb596, 0xffdf, 0xffdf, 0xffdf, 0x9cd3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b4d, 0xce59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad55, 0x9cd3, 0x9cd3, 0x9cd3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xce59, 0x6b4d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b4d, 0xce59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xce59, 0xdedb, 0x4208, 0x0000, 0x2945, 0x6b4d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf79e, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad55, 0x8c51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad55, 0x8c51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdedb, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5acb, 0xffdf, 0x2945, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b4d, 0xf79e, 0xffdf, 0xdedb, 0x2945, 0x0000, 0xf79e, 0xdedb, 0xffdf, 0xffdf, 0x6b4d, 0x0000, 0x9cd3, 0xffdf, 0xffdf, 0xb596, 0x0000, 0x6b4d, 0xdedb, 0xe71c, 0xffdf, 0x6b4d, 0xce59, 0x0000, 0x6b4d, 0xf79e, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x9cd3, 0xc618, 0xffdf, 0xffdf, 0xad55, 0xdedb, 0xffdf, 0xdedb, 0x2945, 0x0000, 0x9cd3, 0xffdf, 0xffdf, 0xb596, 0x0000, 0x9cd3, 0xdedb, 0xffdf, 0xffdf, 0xce59, 0x0000, 0x8c51, 0xce59, 0x0000, 0x0000, 0xb596, 0x8c51, 0x0000, 0x7bcf, 0xce59, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0xf79e, 0xdedb, 0xffdf, 0xffdf, 0x6b4d, 0x6b4d, 0xe71c, 0xffdf, 0xe71c, 0x0000, 0xce59, 0xffdf, 0xffdf, 0x8c51, 0x0000, 0xce59, 0xc618, 0xffdf, 0x9cd3, 0x6b4d, 0xf79e, 0xffdf, 0xe71c, 0x2945, 0x0000, 0x9cd3, 0xffdf, 0xffdf, 0xb596, 0xc618, 0xffdf, 0xffdf, 0x8c51, 0xce59, 0x6b4d, 0xf79e, 0x5acb, 0x0000, 0x5acb, 0xf79e, 0x6b4d, 0xce59, 0x6b4d, 0xe71c, 0xffdf, 0xe71c, 0xe71c, 0x6b4d, 0x0000, 0x5acb, 0xf79e, 0x0000, 0x0000, 0x0000, 0x9cd3, 0xffdf, 0xffdf, 0xce59, 0x8c51, 0xce59, 0x0000, 0x0000, 0xc618, 0x9cd3, 0xce59, 0xffdf, 0xffdf, 0x9cd3, 0x9cd3, 0xffdf, 0xffdf, 0xb596, 0x4208, 0xdedb, 0xffdf, 0xf79e, 0x5acb, 0x0000, 0xce59, 0xc618, 0xffdf, 0xf79e, 0x9cd3, 0xf79e, 0xffdf, 0xb596, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b4d, 0xe71c, 0x0000, 0x0000, 0xce59, 0xffdf, 0xe71c, 0x0000, 0xf79e, 0x7bcf, 0x0000, 0xb596, 0xad55, 0x0000, 0xffdf, 0x8c51, 0x0000, 0x9cd3, 0xc618, 0x5acb, 0xf79e, 0x4208, 0x0000, 0xe71c, 0x7bcf, 0x6b4d, 0xffdf, 0x6b4d, 0x0000, 0x6b4d, 0xce59, 0x0000, 0xf79e, 0x8c51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cd3, 0xdedb, 0x0000, 0x6b4d, 0xffdf, 0x7bcf, 0x0000, 0xe71c, 0x8c51, 0x5acb, 0xf79e, 0x4208, 0x0000, 0xe71c, 0x7bcf, 0x9cd3, 0xdedb, 0x2945, 0x2945, 0xf79e, 0x5acb, 0x8c51, 0xce59, 0x0000, 0x0000, 0xb596, 0x8c51, 0x0000, 0xc618, 0x8c51, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0xffdf, 0x8c51, 0x0000, 0x9cd3, 0xc618, 0x0000, 0xce59, 0x8c51, 0x0000, 0x9cd3, 0xdedb, 0x0000, 0x4208, 0xffdf, 0x2945, 0xce59, 0xce59, 0x0000, 0x0000, 0x5acb, 0x4208, 0x0000, 0xce59, 0x8c51, 0x5acb, 0xf79e, 0x5acb, 0x0000, 0x0000, 0x6b4d, 0xe71c, 0x0000, 0x0000, 0xce59, 0x6b4d, 0x9cd3, 0xad55, 0x0000, 0xad55, 0x9cd3, 0x6b4d, 0xce59, 0x0000, 0xce59, 0x8c51, 0x0000, 0x8c51, 0xb596, 0x0000, 0xad55, 0x9cd3, 0x0000, 0x0000, 0x0000, 0xdedb, 0x7bcf, 0x0000, 0x5acb, 0x0000, 0xe71c, 0x4208, 0x2945, 0xf79e, 0x2945, 0xf79e, 0x4208, 0x0000, 0x5acb, 0x0000, 0xffdf, 0x4208, 0x0000, 0xc618, 0xad55, 0x0000, 0x8c51, 0xdedb, 0x0000, 0xce59, 0xad55, 0x0000, 0x9cd3, 0xf79e, 0x4208, 0x4208, 0xffdf, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5acb, 0xf79e, 0x2945, 0x0000, 0x0000, 0x4208, 0xe71c, 0x4208, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xce59, 0x0000, 0xffdf, 0x0000, 0x0000, 0x8c51, 0xce59, 0x8c51, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0x9cd3, 0x6b4d, 0xce59, 0x0000, 0x0000, 0x6b4d, 0xce59, 0x0000, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0x4208, 0xffdf, 0x0000, 0x0000, 0xce59, 0x8c51, 0x8c51, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0x9cd3, 0x9cd3, 0x9cd3, 0x0000, 0x0000, 0xe71c, 0x6b4d, 0x8c51, 0xce59, 0x0000, 0x0000, 0xc618, 0x8c51, 0x2945, 0xf79e, 0x2945, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0xffdf, 0x0000, 0x0000, 0x8c51, 0xce59, 0x0000, 0xce59, 0x8c51, 0x0000, 0xb596, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0x6b4d, 0xce59, 0x6b4d, 0x0000, 0x0000, 0xad55, 0xffdf, 0xffdf, 0xffdf, 0x8c51, 0x6b4d, 0xce59, 0x0000, 0x0000, 0x0000, 0x6b4d, 0xe71c, 0x0000, 0x0000, 0xce59, 0x6b4d, 0x4208, 0xf79e, 0x0000, 0xf79e, 0x4208, 0x6b4d, 0xce59, 0x0000, 0xce59, 0x8c51, 0x0000, 0x0000, 0xf79e, 0x4208, 0xf79e, 0x4208, 0x0000, 0x0000, 0x0000, 0x4208, 0xb596, 0xe71c, 0x9cd3, 0x0000, 0x9cd3, 0xad55, 0x9cd3, 0xb596, 0x0000, 0x6b4d, 0xc618, 0xdedb, 0x6b4d, 0x0000, 0xffdf, 0x4208, 0x0000, 0xe71c, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0x0000, 0xce59, 0x6b4d, 0x0000, 0x8c51, 0xce59, 0x0000, 0x0000, 0xffdf, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdedb, 0xdedb, 0x2945, 0x0000, 0x4208, 0xe71c, 0x0000, 0xf79e, 0x7bcf, 0x0000, 0x0000, 0x6b4d, 0x0000, 0xffdf, 0x0000, 0x0000, 0x8c51, 0xce59, 0x5acb, 0xf79e, 0x4208, 0x0000, 0x4208, 0x4208, 0x6b4d, 0xce59, 0x0000, 0x0000, 0x6b4d, 0xce59, 0x0000, 0xf79e, 0x8c51, 0x0000, 0x5acb, 0x0000, 0x0000, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0x4208, 0xffdf, 0x0000, 0x0000, 0xce59, 0x8c51, 0x5acb, 0xf79e, 0x4208, 0x0000, 0x4208, 0x4208, 0x9cd3, 0x9cd3, 0x0000, 0x0000, 0xe71c, 0x6b4d, 0x7bcf, 0xe71c, 0x2945, 0x4208, 0xf79e, 0x8c51, 0x9cd3, 0xad55, 0x0000, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0xffdf, 0x0000, 0x0000, 0x8c51, 0xce59, 0x0000, 0xce59, 0x9cd3, 0x0000, 0x9cd3, 0xdedb, 0x0000, 0x0000, 0x6b4d, 0x0000, 0xce59, 0x6b4d, 0x0000, 0x4208, 0xffdf, 0x2945, 0x0000, 0xe71c, 0x8c51, 0x5acb, 0xf79e, 0x5acb, 0x0000, 0x5acb, 0x6b4d, 0xf79e, 0x0000, 0x0000, 0xce59, 0x6b4d, 0x0000, 0xc618, 0xb596, 0xc618, 0x0000, 0x6b4d, 0xce59, 0x0000, 0xce59, 0x9cd3, 0x0000, 0x0000, 0x9cd3, 0xdedb, 0xc618, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf79e, 0x4208, 0x2945, 0xe71c, 0xe71c, 0x5acb, 0x0000, 0x0000, 0x0000, 0x5acb, 0xe71c, 0x0000, 0xffdf, 0x5acb, 0x0000, 0xc618, 0xad55, 0x0000, 0x0000, 0x6b4d, 0x0000, 0xce59, 0x6b4d, 0x0000, 0x8c51, 0xce59, 0x0000, 0x0000, 0xffdf, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4208, 0xce59, 0xffdf, 0xffdf, 0xffdf, 0xc618, 0x0000, 0x6b4d, 0xe71c, 0xffdf, 0xffdf, 0x6b4d, 0x0000, 0xffdf, 0x0000, 0x0000, 0x8c51, 0xce59, 0x0000, 0x9cd3, 0xffdf, 0xffdf, 0xe71c, 0x4208, 0x6b4d, 0xce59, 0x0000, 0x0000, 0x6b4d, 0xce59, 0x0000, 0x6b4d, 0xf79e, 0xffdf, 0xe71c, 0x0000, 0x0000, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0x4208, 0xffdf, 0x0000, 0x0000, 0xce59, 0x8c51, 0x0000, 0x9cd3, 0xffdf, 0xffdf, 0xe71c, 0x4208, 0x9cd3, 0x9cd3, 0x0000, 0x0000, 0xe71c, 0x6b4d, 0x2945, 0xdedb, 0xffdf, 0xffdf, 0xdedb, 0x8c51, 0xdedb, 0x5acb, 0x0000, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0xffdf, 0x0000, 0x0000, 0x8c51, 0xce59, 0x0000, 0x9cd3, 0xffdf, 0xffdf, 0x0000, 0xc618, 0xffdf, 0xffdf, 0xce59, 0x0000, 0xce59, 0x6b4d, 0x0000, 0x0000, 0xce59, 0xffdf, 0xffdf, 0xdedb, 0x8c51, 0x0000, 0x9cd3, 0xffdf, 0xffdf, 0xb596, 0x2945, 0xe71c, 0xffdf, 0x9cd3, 0xce59, 0x6b4d, 0x0000, 0x7bcf, 0xffdf, 0x7bcf, 0x0000, 0x6b4d, 0xce59, 0x0000, 0x9cd3, 0xffdf, 0xffdf, 0x0000, 0x2945, 0xffdf, 0x6b4d, 0x0000, 0x0000, 0x0000, 0x0000, 0xdedb, 0xffdf, 0xffdf, 0xce59, 0x0000, 0x0000, 0xad55, 0xce59, 0x0000, 0x2945, 0xffdf, 0xffdf, 0xffdf, 0x9cd3, 0x0000, 0xc618, 0xffdf, 0xce59, 0x4208, 0xdedb, 0xffdf, 0xffdf, 0x9cd3, 0x0000, 0xce59, 0x6b4d, 0x0000, 0x8c51, 0xce59, 0x0000, 0x0000, 0xffdf, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cd3, 0xe71c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, 0xe71c, 0x8c51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4208, 0xffdf, 0xf79e, 0x5acb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb596, 0xffdf, 0xb596, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5acb, 0xf79e, 0xffdf, 0x9cd3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b4d, 0xce59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, 0xf79e, 0x8c51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5acb, 0xf79e, 0xffdf, 0x9cd3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cd3, 0xb596, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad55, 0x8c51, 0x0000, 0x6b4d, 0xce59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cd3, 0xdedb, 0xce59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe71c, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cd3, 0xb596, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffdf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7bcf, 0xffdf, 0xffdf, 0xe71c, 0x4208, 0xdedb, 0xffdf, 0xffdf, 0x9cd3, 0x0000, 0x6b4d, 0xdedb, 0xe71c, 0xffdf, 0x0000, 0x0000, 0x6b4d, 0xe71c, 0xffdf, 0xe71c, 0x6b4d, 0xe71c, 0xf79e, 0xffdf, 0xe71c, 0x4208, 0x0000, 0x9cd3, 0xffdf, 0xffdf, 0xb596, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdedb, 0x6b4d, 0xe71c, 0x4208, 0x0000, 0x9cd3, 0xc618, 0xffdf, 0xce59, 0x4208, 0xe71c, 0xffdf, 0xe71c, 0xf79e, 0x4208, 0x8c51, 0xce59, 0x0000, 0x0000, 0xb596, 0x8c51, 0x0000, 0xffdf, 0x0000, 0x9cd3, 0xdedb, 0xffdf, 0xffdf, 0xce59, 0x0000, 0x4208, 0xdedb, 0xffdf, 0xffdf, 0x9cd3, 0x0000, 0x0000, 0x0000, 0x7bcf, 0xffdf, 0xffdf, 0xe71c, 0x9cd3, 0xc618, 0xffdf, 0xce59, 0x0000, 0xce59, 0xffdf, 0xffdf, 0x9cd3, 0x0000, 0xce59, 0xc618, 0xffdf, 0xf79e, 0x9cd3, 0xf79e, 0xffdf, 0xb596, 0x0000, 0x4208, 0xdedb, 0xffdf, 0xf79e, 0x5acb, 0x8c51, 0xc618, 0x0000, 0x7bcf, 0xffdf, 0x4208, 0x0000, 0xf79e, 0x5acb, 0x9cd3, 0xffdf, 0xffdf, 0xdedb, 0x4208, 0x0000, 0xf79e, 0xce59, 0xffdf, 0x6b4d, 0xffdf, 0x0000, 0x7bcf, 0xdedb, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0xc618, 0xb596, 0x0000, 0x5acb, 0xf79e, 0x5acb, 0x6b4d, 0xffdf, 0x6b4d, 0x0000, 0x0000, 0x0000, 0x0000, 0xce59, 0x8c51, 0x0000, 0x6b4d, 0xffdf, 0x5acb, 0x0000, 0xce59, 0x9cd3, 0x5acb, 0xf79e, 0x4208, 0x0000, 0xe71c, 0x7bcf, 0x0000, 0x0000, 0x0000, 0x6b4d, 0xdedb, 0x0000, 0x9cd3, 0xad55, 0x0000, 0x9cd3, 0xe71c, 0x4208, 0x0000, 0xc618, 0xb596, 0x0000, 0x5acb, 0xffdf, 0x4208, 0x8c51, 0xce59, 0x0000, 0x0000, 0xb596, 0x8c51, 0x0000, 0xffdf, 0x0000, 0x9cd3, 0xdedb, 0x2945, 0x2945, 0xf79e, 0x5acb, 0xc618, 0xb596, 0x0000, 0x5acb, 0xf79e, 0x5acb, 0x0000, 0x0000, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0x9cd3, 0xe71c, 0x4208, 0x0000, 0x0000, 0x7bcf, 0x0000, 0x6b4d, 0xe71c, 0x0000, 0xce59, 0xad55, 0x0000, 0x9cd3, 0xf79e, 0x4208, 0x4208, 0xffdf, 0x4208, 0xc618, 0xad55, 0x0000, 0x8c51, 0xdedb, 0x2945, 0xf79e, 0x0000, 0xc618, 0xe71c, 0x9cd3, 0x5acb, 0xdedb, 0x5acb, 0xf79e, 0x5acb, 0x0000, 0xb596, 0xc618, 0x0000, 0xffdf, 0x9cd3, 0x0000, 0x0000, 0xffdf, 0x5acb, 0xdedb, 0x2945, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0xe71c, 0x6b4d, 0x0000, 0x0000, 0xce59, 0x8c51, 0x6b4d, 0xce59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xce59, 0x8c51, 0x0000, 0x6b4d, 0xdedb, 0x0000, 0x0000, 0xb596, 0x9cd3, 0x8c51, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0x9cd3, 0x0000, 0x0000, 0x0000, 0xb596, 0xffdf, 0xffdf, 0xffdf, 0xf79e, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0x0000, 0xce59, 0x6b4d, 0x0000, 0x0000, 0xe71c, 0x4208, 0x8c51, 0xce59, 0x0000, 0x0000, 0xc618, 0x8c51, 0x0000, 0xffdf, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0x0000, 0xe71c, 0x6b4d, 0xe71c, 0x6b4d, 0x0000, 0x0000, 0xce59, 0x8c51, 0x0000, 0x0000, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0x0000, 0x5acb, 0xdedb, 0xffdf, 0xffdf, 0xe71c, 0x0000, 0xce59, 0x6b4d, 0x0000, 0x8c51, 0xce59, 0x0000, 0x0000, 0xffdf, 0x4208, 0xe71c, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0x0000, 0xdedb, 0x8c51, 0xf79e, 0x7bcf, 0xdedb, 0x9cd3, 0xad55, 0x8c51, 0xce59, 0x0000, 0x0000, 0x6b4d, 0xe71c, 0x0000, 0xffdf, 0x0000, 0x0000, 0x0000, 0xffdf, 0xf79e, 0x9cd3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0xb596, 0xb596, 0x0000, 0x5acb, 0xf79e, 0x5acb, 0x6b4d, 0xce59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xce59, 0x9cd3, 0x0000, 0x6b4d, 0xce59, 0x0000, 0x0000, 0xb596, 0x9cd3, 0x5acb, 0xf79e, 0x4208, 0x0000, 0x4208, 0x4208, 0x0000, 0x0000, 0x2945, 0xf79e, 0x4208, 0x0000, 0x0000, 0xdedb, 0x8c51, 0x9cd3, 0x9cd3, 0x0000, 0x0000, 0xc618, 0xad55, 0x0000, 0x5acb, 0xffdf, 0x4208, 0x7bcf, 0xe71c, 0x2945, 0x4208, 0xf79e, 0x8c51, 0x0000, 0xffdf, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0x0000, 0xe71c, 0x6b4d, 0xb596, 0xb596, 0x0000, 0x5acb, 0xf79e, 0x5acb, 0x0000, 0x0000, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0x0000, 0xb596, 0xad55, 0x0000, 0x8c51, 0xe71c, 0x0000, 0xce59, 0x6b4d, 0x0000, 0x8c51, 0xce59, 0x0000, 0x0000, 0xffdf, 0x4208, 0xc618, 0xad55, 0x0000, 0x0000, 0x6b4d, 0x0000, 0x9cd3, 0xe71c, 0xb596, 0x0000, 0xf79e, 0xe71c, 0x6b4d, 0x4208, 0xf79e, 0x5acb, 0x0000, 0xb596, 0xc618, 0x0000, 0xffdf, 0x0000, 0x0000, 0x0000, 0xffdf, 0x7bcf, 0xf79e, 0x7bcf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0x4208, 0xdedb, 0xffdf, 0xffdf, 0x9cd3, 0x0000, 0x6b4d, 0xce59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cd3, 0xffdf, 0xffdf, 0x6b4d, 0xce59, 0x0000, 0x0000, 0xb596, 0x9cd3, 0x0000, 0x9cd3, 0xffdf, 0xffdf, 0xe71c, 0x4208, 0x0000, 0x0000, 0x9cd3, 0xc618, 0x0000, 0x0000, 0x0000, 0x8c51, 0xce59, 0x9cd3, 0x9cd3, 0x0000, 0x0000, 0x4208, 0xe71c, 0xffdf, 0xe71c, 0xe71c, 0x4208, 0x2945, 0xdedb, 0xffdf, 0xffdf, 0xdedb, 0x8c51, 0x0000, 0xffdf, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0x0000, 0xe71c, 0x6b4d, 0x4208, 0xdedb, 0xffdf, 0xffdf, 0x9cd3, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0x9cd3, 0x9cd3, 0x0000, 0x0000, 0x6b4d, 0xffdf, 0xffdf, 0xdedb, 0xe71c, 0x0000, 0xce59, 0x6b4d, 0x0000, 0x8c51, 0xce59, 0x0000, 0x0000, 0xffdf, 0x4208, 0x4208, 0xdedb, 0xffdf, 0xffdf, 0x9cd3, 0x0000, 0x5acb, 0xffdf, 0x7bcf, 0x0000, 0xad55, 0xf79e, 0x0000, 0x0000, 0x9cd3, 0xffdf, 0xffdf, 0xdedb, 0x4208, 0x0000, 0xffdf, 0x0000, 0x0000, 0x0000, 0xffdf, 0x0000, 0x5acb, 0xf79e, 0x5acb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x630c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630c, +0x8410, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x8410 +}; diff --git a/examples/adafruitGfx_eTFT/TFT_eSPI/TFT_eSPI.ino b/examples/adafruitGfx_eTFT/TFT_eSPI/TFT_eSPI.ino new file mode 100644 index 00000000..df90fe4f --- /dev/null +++ b/examples/adafruitGfx_eTFT/TFT_eSPI/TFT_eSPI.ino @@ -0,0 +1,188 @@ +#include + +/******************** +Sept. 2014 ~ Jan 2019 Rui Azevedo - ruihfazevedo(@rrob@)gmail.com + +TFT_eSPI example +output: TFT_eSPI + Serial +input: Serial +www.r-site.net +***/ + +#include + +#include +#include +#include +// #include +#include //must include this even if not doing web output... + +using namespace Menu; + +TFT_eSPI gfx; + +result doAlert(eventMask e, prompt &item); + +int test=55; + +int ledCtrl=LOW; + +result myLedOn() { + ledCtrl=HIGH; + return proceed; +} +result myLedOff() { + ledCtrl=LOW; + return proceed; +} + +TOGGLE(ledCtrl,setLed,"Led: ",doNothing,noEvent,noStyle//,doExit,enterEvent,noStyle + ,VALUE("On",HIGH,doNothing,noEvent) + ,VALUE("Off",LOW,doNothing,noEvent) +); + +int selTest=0; +SELECT(selTest,selMenu,"Select",doNothing,noEvent,noStyle + ,VALUE("Zero",0,doNothing,noEvent) + ,VALUE("One",1,doNothing,noEvent) + ,VALUE("Two",2,doNothing,noEvent) +); + +int chooseTest=-1; +CHOOSE(chooseTest,chooseMenu,"Choose",doNothing,noEvent,noStyle + ,VALUE("First",1,doNothing,noEvent) + ,VALUE("Second",2,doNothing,noEvent) + ,VALUE("Third",3,doNothing,noEvent) + ,VALUE("Last",-1,doNothing,noEvent) +); + +//customizing a prompt look! +//by extending the prompt class +class altPrompt:public prompt { +public: + altPrompt(constMEM promptShadow& p):prompt(p) {} + Used printTo(navRoot &root,bool sel,menuOut& out, idx_t idx,idx_t len,idx_t) override { + return out.printRaw(F("special prompt!"),len);; + } +}; + +MENU(subMenu,"Sub-Menu",doNothing,noEvent,noStyle + ,altOP(altPrompt,"",doNothing,noEvent) + ,OP("Op",doNothing,noEvent) + ,EXIT(" colors[6] MEMMODE={ + {{(uint16_t)Black,(uint16_t)Black}, {(uint16_t)Black, (uint16_t)Blue, (uint16_t)Blue}},//bgColor + {{(uint16_t)Gray, (uint16_t)Gray}, {(uint16_t)White, (uint16_t)White, (uint16_t)White}},//fgColor + {{(uint16_t)White,(uint16_t)Black}, {(uint16_t)Yellow,(uint16_t)Yellow,(uint16_t)Red}},//valColor + {{(uint16_t)White,(uint16_t)Black}, {(uint16_t)White, (uint16_t)Yellow,(uint16_t)Yellow}},//unitColor + {{(uint16_t)White,(uint16_t)Gray}, {(uint16_t)Black, (uint16_t)Blue, (uint16_t)White}},//cursorColor + {{(uint16_t)White,(uint16_t)Yellow},{(uint16_t)Blue, (uint16_t)Red, (uint16_t)Red}},//titleColor +}; + +#define MAX_DEPTH 4 + +serialIn serial(Serial); + +//MENU_INPUTS(in,&serial);its single, no need to `chainStream` + +//define serial output device +idx_t serialTops[MAX_DEPTH]={0}; +serialOut outSerial(Serial,serialTops); + +#define GFX_WIDTH 128 +#define GFX_HEIGHT 64 +#define fontW 6 +#define fontH 9 + +const panel panels[] MEMMODE = {{0, 0, GFX_WIDTH / fontW, GFX_HEIGHT / fontH}}; +navNode* nodes[sizeof(panels) / sizeof(panel)]; //navNodes to store navigation status +panelsList pList(panels, nodes, 1); //a list of panels and nodes +idx_t eSpiTops[MAX_DEPTH]={0}; +TFT_eSPIOut eSpiOut(gfx,colors,eSpiTops,pList,fontW,fontH+1); +menuOut* constMEM outputs[] MEMMODE={&outSerial,&eSpiOut};//list of output devices +outputsList out(outputs,sizeof(outputs)/sizeof(menuOut*));//outputs list controller + +NAVROOT(nav,mainMenu,MAX_DEPTH,serial,out); + +//when menu is suspended +result idle(menuOut& o,idleEvent e) { + if (e==idling) { + o.println(F("suspended...")); + o.println(F("press [select]")); + o.println(F("to continue")); + } + return proceed; +} + +//config myOptions('*','-',defaultNavCodes,false); + +void setup() { + //options=&myOptions;//can customize options + // pinMode(LEDPIN,OUTPUT); + Serial.begin(115200); + while(!Serial); + Serial.println("menu 4.x test"); + Serial.flush(); + nav.idleTask=idle;//point a function to be used when menu is suspended + mainMenu[1].disable(); + //outGfx.usePreview=true;//reserve one panel for preview? + //nav.showTitle=false;//show menu title? + + SPI.begin(); + gfx.init(); + gfx.setRotation(3); + // gfx.setTextSize(textScale);//test scalling + gfx.setTextWrap(false); + gfx.fillScreen(Black); + gfx.setTextColor(Red,Black); + gfx.println("Menu 4.x test on GFX"); + delay(1000); +} + +void loop() { + nav.poll();//this device only draws when needed + // digitalWrite(LEDPIN, ledCtrl); + delay(100);//simulate a delay when other tasks are done +} diff --git a/examples/adafruitGfx/lcdMono/lcdMono/lcdMono.ino b/examples/adafruitGfx_lcdMono/lcdMono/lcdMono.ino similarity index 96% rename from examples/adafruitGfx/lcdMono/lcdMono/lcdMono.ino rename to examples/adafruitGfx_lcdMono/lcdMono/lcdMono.ino index c29c6308..3a04338f 100644 --- a/examples/adafruitGfx/lcdMono/lcdMono/lcdMono.ino +++ b/examples/adafruitGfx_lcdMono/lcdMono/lcdMono.ino @@ -11,6 +11,7 @@ www.r-site.net ***/ #include +#include #include #include #include @@ -63,8 +64,8 @@ TOGGLE(ledCtrl,setLed,"Led: ",doNothing,noEvent,noStyle//,doExit,enterEvent,noSt ,VALUE("Off",LOW,doNothing,noEvent) ); -char* constMEM hexDigit MEMMODE="0123456789ABCDEF"; -char* constMEM hexNr[] MEMMODE={"0","x",hexDigit,hexDigit}; +const char* constMEM hexDigit MEMMODE="0123456789ABCDEF"; +const char* constMEM hexNr[] MEMMODE={"0","x",hexDigit,hexDigit}; char buf1[]="0x11"; MENU(mainMenu,"Main menu",doNothing,noEvent,wrapStyle @@ -80,7 +81,7 @@ MENU(mainMenu,"Main menu",doNothing,noEvent,wrapStyle // define menu colors -------------------------------------------------------- // {{disabled normal,disabled selected},{enabled normal,enabled selected, enabled editing}} //monochromatic color table -const colorDef colors[] MEMMODE={ +const colorDef colors[6] MEMMODE={ {{WHITE,BLACK},{WHITE,BLACK,BLACK}},//bgColor {{BLACK,WHITE},{BLACK,WHITE,WHITE}},//fgColor {{BLACK,WHITE},{BLACK,WHITE,WHITE}},//valColor diff --git a/examples/adafruitGfx_lcdMono/platformio.ini b/examples/adafruitGfx_lcdMono/platformio.ini new file mode 100644 index 00000000..3aa8e093 --- /dev/null +++ b/examples/adafruitGfx_lcdMono/platformio.ini @@ -0,0 +1,9 @@ +[platformio] +src_dir=lcdMono + +[env:nanoatmega328] +platform=atmelavr +board=nanoatmega328 +framework=arduino +upload_flags=-V +build_flags = -DNO_DEBUG -DNO_MENU_ASYNC diff --git a/examples/adafruitGfx_tft/platformio.ini b/examples/adafruitGfx_tft/platformio.ini new file mode 100644 index 00000000..196ea208 --- /dev/null +++ b/examples/adafruitGfx_tft/platformio.ini @@ -0,0 +1,17 @@ +[platformio] +src_dir=tft +; lib_dir=~/Arduino/Libraries + +[env:nanoatmega328] +platform = atmelavr +board = nanoatmega328 +framework = arduino +upload_port=/dev/ttyUSB* +upload_flags=-V +build_flags = -DNODEBUG + +; [env:teensy31] +; platform = teensy +; board = teensy31 +; framework = arduino +; build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro-redefined -Wno-switch diff --git a/examples/adafruitGfx/tft/tft/tft.ino b/examples/adafruitGfx_tft/tft/tft.ino similarity index 83% rename from examples/adafruitGfx/tft/tft/tft.ino rename to examples/adafruitGfx_tft/tft/tft.ino index c72bd039..00064237 100644 --- a/examples/adafruitGfx/tft/tft/tft.ino +++ b/examples/adafruitGfx_tft/tft/tft.ino @@ -17,6 +17,7 @@ https://github.com/PaulStoffregen/TimerOne // #define USE_CLICK_ENCODER #include +#include #include #include #include @@ -100,8 +101,8 @@ MENU(subMenu,"Sub-Menu",doNothing,noEvent,noStyle ,EXIT(" colors[] MEMMODE={ - {{ST7735_BLACK,ST7735_BLACK},{ST7735_BLACK,ST7735_BLUE,ST7735_BLUE}},//bgColor - {{ST7735_GRAY,ST7735_GRAY},{ST7735_WHITE,ST7735_WHITE,ST7735_WHITE}},//fgColor - {{ST7735_WHITE,ST7735_BLACK},{ST7735_YELLOW,ST7735_YELLOW,ST7735_RED}},//valColor - {{ST7735_WHITE,ST7735_BLACK},{ST7735_WHITE,ST7735_YELLOW,ST7735_YELLOW}},//unitColor - {{ST7735_WHITE,ST7735_GRAY},{ST7735_BLACK,ST7735_BLUE,ST7735_WHITE}},//cursorColor - {{ST7735_WHITE,ST7735_YELLOW},{ST7735_BLUE,ST7735_RED,ST7735_RED}},//titleColor +const colorDef colors[6] MEMMODE={ + {{(uint16_t)ST7735_BLACK,(uint16_t)ST7735_BLACK}, {(uint16_t)ST7735_BLACK, (uint16_t)ST7735_BLUE, (uint16_t)ST7735_BLUE}},//bgColor + {{(uint16_t)ST7735_GRAY, (uint16_t)ST7735_GRAY}, {(uint16_t)ST7735_WHITE, (uint16_t)ST7735_WHITE, (uint16_t)ST7735_WHITE}},//fgColor + {{(uint16_t)ST7735_WHITE,(uint16_t)ST7735_BLACK}, {(uint16_t)ST7735_YELLOW,(uint16_t)ST7735_YELLOW,(uint16_t)ST7735_RED}},//valColor + {{(uint16_t)ST7735_WHITE,(uint16_t)ST7735_BLACK}, {(uint16_t)ST7735_WHITE, (uint16_t)ST7735_YELLOW,(uint16_t)ST7735_YELLOW}},//unitColor + {{(uint16_t)ST7735_WHITE,(uint16_t)ST7735_GRAY}, {(uint16_t)ST7735_BLACK, (uint16_t)ST7735_BLUE, (uint16_t)ST7735_WHITE}},//cursorColor + {{(uint16_t)ST7735_WHITE,(uint16_t)ST7735_YELLOW},{(uint16_t)ST7735_BLUE, (uint16_t)ST7735_RED, (uint16_t)ST7735_RED}},//titleColor }; serialIn serial(Serial); diff --git a/examples/adafruitGfx/tft_interrupt/tft_interrupt.ino b/examples/adafruitGfx_tft_interrupt/tft_interrupt.ino similarity index 96% rename from examples/adafruitGfx/tft_interrupt/tft_interrupt.ino rename to examples/adafruitGfx_tft_interrupt/tft_interrupt.ino index 3bfc881c..389cd8f2 100644 --- a/examples/adafruitGfx/tft_interrupt/tft_interrupt.ino +++ b/examples/adafruitGfx_tft_interrupt/tft_interrupt.ino @@ -180,7 +180,7 @@ MENU(mainMenu,"Main menu",doNothing,noEvent,wrapStyle #define ST7735_GRAY RGB565(128,128,128) -const colorDef colors[] MEMMODE={ +const colorDef colors[6] MEMMODE={ {{ST7735_BLACK,ST7735_BLACK},{ST7735_BLACK,ST7735_BLUE,ST7735_BLUE}},//bgColor {{ST7735_GRAY,ST7735_GRAY},{ST7735_WHITE,ST7735_WHITE,ST7735_WHITE}},//fgColor {{ST7735_WHITE,ST7735_BLACK},{ST7735_YELLOW,ST7735_YELLOW,ST7735_RED}},//valColor diff --git a/examples/Serial/ansiSerial/ansiSerial/ansiSerial.ino b/examples/ansiSerial/ansiSerial/ansiSerial.ino similarity index 98% rename from examples/Serial/ansiSerial/ansiSerial/ansiSerial.ino rename to examples/ansiSerial/ansiSerial/ansiSerial.ino index 1cda842d..5342118f 100644 --- a/examples/Serial/ansiSerial/ansiSerial/ansiSerial.ino +++ b/examples/ansiSerial/ansiSerial/ansiSerial.ino @@ -38,7 +38,7 @@ Print& operator<<(Print&o, Menu::prompt&p) { // define menu colors -------------------------------------------------------- //each color is in the format: // {{disabled normal,disabled selected},{enabled normal,enabled selected, enabled editing}} -const colorDef colors[] MEMMODE={ +const colorDef colors[6] MEMMODE={ {{BLUE,WHITE} ,{BLUE,WHITE,WHITE}},//bgColor {{BLACK,BLACK} ,{WHITE,BLUE,BLUE}},//fgColor {{BLACK,BLACK} ,{YELLOW,YELLOW,RED}},//valColor @@ -249,8 +249,8 @@ altMENU(menu,birthDate,"Birth",doNothing,noEvent,noStyle,(systemStyles)(_asPad|M ,FIELD(day,"","",1,31,1,0,doNothing,noEvent,wrapStyle) ); -char* constMEM hexDigit MEMMODE="0123456789ABCDEF"; -char* constMEM hexNr[] MEMMODE={"0","x",hexDigit,hexDigit}; +const char* constMEM hexDigit MEMMODE="0123456789ABCDEF"; +const char* constMEM hexNr[] MEMMODE={"0","x",hexDigit,hexDigit}; char buf1[]="0x11"; MENU(mainMenu,"Main menu",doNothing,noEvent,wrapStyle diff --git a/examples/Serial/ansiSerial/ansiSerial/boxTable.hpp b/examples/ansiSerial/ansiSerial/boxTable.hpp similarity index 100% rename from examples/Serial/ansiSerial/ansiSerial/boxTable.hpp rename to examples/ansiSerial/ansiSerial/boxTable.hpp diff --git a/examples/Serial/ansiSerial/platformio.ini b/examples/ansiSerial/platformio.ini similarity index 100% rename from examples/Serial/ansiSerial/platformio.ini rename to examples/ansiSerial/platformio.ini diff --git a/examples/btnNav/btnNav/btnNav.ino b/examples/btnNav/btnNav/btnNav.ino index 18f048b9..70d5653c 100644 --- a/examples/btnNav/btnNav/btnNav.ino +++ b/examples/btnNav/btnNav/btnNav.ino @@ -8,7 +8,7 @@ Digital keypad (3 buttons) using the menu keyIn driver #include #include #include -#include +#include #include using namespace Menu; @@ -109,9 +109,9 @@ MENU(mainMenu,"Main menu",doNothing,noEvent,wrapStyle ); keyMap joystickBtn_map[]={ - {-BTN_SEL, defaultNavCodes[enterCmd].ch} , - {-BTN_UP, defaultNavCodes[upCmd].ch} , - {-BTN_DOWN, defaultNavCodes[downCmd].ch} , + {-BTN_SEL, defaultNavCodes[enterCmd].ch,INPUT_PULLUP} , + {-BTN_UP, defaultNavCodes[upCmd].ch,INPUT_PULLUP} , + {-BTN_DOWN, defaultNavCodes[downCmd].ch,INPUT_PULLUP} , }; keyIn<3> joystickBtns(joystickBtn_map); diff --git a/examples/clickEncoder/clickEncoder/clickEncoder.ino b/examples/clickEncoder/clickEncoder/clickEncoder.ino index 04787106..3c0694cb 100644 --- a/examples/clickEncoder/clickEncoder/clickEncoder.ino +++ b/examples/clickEncoder/clickEncoder/clickEncoder.ino @@ -143,7 +143,7 @@ MENU(mainMenu,"Main menu",doNothing,noEvent,wrapStyle #define MAX_DEPTH 2 -/*constMEM panel panels[] MEMMODE={{0,0,16,2}}; +/*const panel panels[] MEMMODE={{0,0,16,2}}; navNode* nodes[sizeof(panels)/sizeof(panel)]; panelsList pList(panels,nodes,1); idx_t tops[MAX_DEPTH]; diff --git a/examples/codeCtrl/codeCtrl/codeCtrl.ino b/examples/codeCtrl/codeCtrl/codeCtrl.ino index 81762b77..f559f15a 100644 --- a/examples/codeCtrl/codeCtrl/codeCtrl.ino +++ b/examples/codeCtrl/codeCtrl/codeCtrl.ino @@ -107,7 +107,7 @@ MENU(subMenu,"Sub-Menu",doNothing,anyEvent,wrapStyle ); constText* constMEM textFilter MEMMODE=" .0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTWXYZ"; -constText* constMEM textMask[] MEMMODE={textFilter};//this mask will repear till the end of the field +constText* constMEM textMask[] MEMMODE={textFilter};//this mask will repeat till the end of the field char name[]=" ";//<-- menu will edit this text MENU(mainMenu,"Main menu",doNothing,noEvent,wrapStyle diff --git a/examples/concurrent/concurrent/concurrent.ino b/examples/concurrent/concurrent/concurrent.ino index a803e1fc..692f412e 100644 --- a/examples/concurrent/concurrent/concurrent.ino +++ b/examples/concurrent/concurrent/concurrent.ino @@ -2,7 +2,7 @@ Sept. 2017 Rui Azevedo - ruihfazevedo(@rrob@)gmail.com Concurrent menu test -output: I2C LCD (Malpartida) and Serial +output: I2C LCD (Malpartida) and Serial https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/ input: encoder + Serial purpose: test independent concurrent menus on two different devices the same menu could also be used to independent navigation on two output devices diff --git a/examples/customField/platformio.ini b/examples/customField/platformio.ini index 7d5568c0..7e74484f 100644 --- a/examples/customField/platformio.ini +++ b/examples/customField/platformio.ini @@ -18,7 +18,6 @@ board = nanoatmega328 framework = arduino upload_port=/dev/ttyUSB* upload_flags=-V -build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro-redefined -DNODEBUG ; [env:uno] ; platform=atmelavr diff --git a/examples/LCDs/Malpartida/I2C/include/readme.txt b/examples/dynamic/include/README similarity index 100% rename from examples/LCDs/Malpartida/I2C/include/readme.txt rename to examples/dynamic/include/README diff --git a/examples/dynamic/platformio.ini b/examples/dynamic/platformio.ini new file mode 100644 index 00000000..c12868d1 --- /dev/null +++ b/examples/dynamic/platformio.ini @@ -0,0 +1,17 @@ +[platformio] +src_dir=dynamic +; lib_dir=~/Arduino/Libraries + +[env:nanoatmega328] +platform = atmelavr +board = nanoatmega328 +framework = arduino +upload_port=/dev/ttyUSB* +upload_flags=-V +build_flags = -DNODEBUG -DMENU_USERAM + +; [env:teensy31] +; platform = teensy +; board = teensy31 +; framework = arduino +; build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro-redefined -Wno-switch diff --git a/examples/dynamic/test/README b/examples/dynamic/test/README new file mode 100644 index 00000000..df5066e6 --- /dev/null +++ b/examples/dynamic/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html diff --git a/examples/esp8266/WebMenu/.gitignore b/examples/esp8266/WebMenu/.gitignore deleted file mode 100644 index e05273b2..00000000 --- a/examples/esp8266/WebMenu/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.pioenvs -.clang_complete -.gcc-flags.json -.piolibdeps \ No newline at end of file diff --git a/examples/esp8266/WebMenu/.travis.yml b/examples/esp8266/WebMenu/.travis.yml deleted file mode 100644 index 72c6e43f..00000000 --- a/examples/esp8266/WebMenu/.travis.yml +++ /dev/null @@ -1,65 +0,0 @@ -# Continuous Integration (CI) is the practice, in software -# engineering, of merging all developer working copies with a shared mainline -# several times a day < http://docs.platformio.org/en/stable/ci/index.html > -# -# Documentation: -# -# * Travis CI Embedded Builds with PlatformIO -# < https://docs.travis-ci.com/user/integration/platformio/ > -# -# * PlatformIO integration with Travis CI -# < http://docs.platformio.org/en/stable/ci/travis.html > -# -# * User Guide for `platformio ci` command -# < http://docs.platformio.org/en/stable/userguide/cmd_ci.html > -# -# -# Please choice one of the following templates (proposed below) and uncomment -# it (remove "# " before each line) or use own configuration according to the -# Travis CI documentation (see above). -# - - -# -# Template #1: General project. Test it using existing `platformio.ini`. -# - -# language: python -# python: -# - "2.7" -# -# sudo: false -# cache: -# directories: -# - "~/.platformio" -# -# install: -# - pip install -U platformio -# -# script: -# - platformio run - - -# -# Template #2: The project is intended to by used as a library with examples -# - -# language: python -# python: -# - "2.7" -# -# sudo: false -# cache: -# directories: -# - "~/.platformio" -# -# env: -# - PLATFORMIO_CI_SRC=path/to/test/file.c -# - PLATFORMIO_CI_SRC=examples/file.ino -# - PLATFORMIO_CI_SRC=path/to/test/directory -# -# install: -# - pip install -U platformio -# -# script: -# - platformio ci --lib="." --board=ID_1 --board=ID_2 --board=ID_N diff --git a/examples/esp8266/WebMenu/WebMenu/WebMenu.ino b/examples/esp8266/WebMenu/WebMenu/WebMenu.ino deleted file mode 100644 index 798e4582..00000000 --- a/examples/esp8266/WebMenu/WebMenu/WebMenu.ino +++ /dev/null @@ -1,365 +0,0 @@ -/******************** -Arduino generic menu system -XmlServer menu example -based on WebServer: - https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WebServer - https://github.com/Links2004/arduinoWebSockets - -Dec. 2016 Rui Azevedo - ruihfazevedo(@rrob@)gmail.com - -menu on web browser served by esp8266 device (experimental) -output: ESP8266WebServer -> Web browser -input: ESP8266WebSocket <- Web browser -format: xml - -this requires the data folder to be stored on esp8266 spiff -for development purposes some files are left external, -therefor requiring an external webserver to provide them (just for dev purposes) -i'm using nodejs http-server (https://www.npmjs.com/package/http-server) -to static serve content from the data folder. This allows me to quick change -the files without having to upload them to SPIFFS -also gateway ssid and password are stored on this code (bellow), -so don't forget to change it. -'dynamic' list of detected wi-fi and password request would require the new -added textField (also experimental). - -*/ -#include -#include -#include //to write a menu has html page -#include -// #include -#include -//#include //to send javascript thru web socket (live update) -#include -#include -extern "C" { - #include "user_interface.h" -} - -using namespace Menu; - -#define ANALOG_PIN 4 - -#ifndef MENU_SSID - #error "need to define WiFi SSID here" - #define MENU_SSID "r-site.net" -#endif -#ifndef MENU_PASS - #error "need to define WiFi password here" - #define MENU_PASS "" -#endif - -const char* ssid = MENU_SSID; -const char* password = MENU_PASS; -const char* serverName="192.168.1.79"; -#ifdef DEBUG - // on debug mode I put aux files on external server to allow changes without SPIFF update - // on this mode the browser MUST be instructed to accept cross domain files - #define xslt "http://neurux:8080/menu.xslt" -#else - #define xslt "/menu.xslt" - #define endl "\r\n" - menuOut& operator<<(menuOut&o, long unsigned int i) { - o.print(i); - return o; - } -#endif - -#define HTTP_PORT 80 -#define WS_PORT 81 -#define USE_SERIAL Serial -// ESP8266WiFiMulti WiFiMulti; -ESP8266WebServer server(80); -WebSocketsServer webSocket(81); - -#define MAX_DEPTH 2 -idx_t tops[MAX_DEPTH]; -PANELS(webPanels,{0,0,30,20}); -xmlFmt serverOut(server,tops,webPanels); - -//menu action functions -result action1(eventMask event, navNode& nav, prompt &item) { - Serial.println("action A called!"); - serverOut<<"This is action A web report "<<(millis()%1000)<<"
"; - return proceed; -} -result action2(eventMask event, navNode& nav, prompt &item) { - Serial.println("action B called!"); - serverOut<<"This is action B web report "<<(millis()%1000)<<"
"; - return proceed; -} - -int ledCtrl=LOW; -#define LEDPIN LED_BUILTIN -void updLed() { - digitalWrite(LEDPIN,!ledCtrl); -} - -TOGGLE(ledCtrl,setLed,"Led: ",updLed,enterEvent,noStyle//,doExit,enterEvent,noStyle - ,VALUE("On",HIGH,doNothing,noEvent) - ,VALUE("Off",LOW,doNothing,noEvent) -); - -int selTest=0; -SELECT(selTest,selMenu,"Select",doNothing,noEvent,noStyle - ,VALUE("Zero",0,doNothing,noEvent) - ,VALUE("One",1,doNothing,noEvent) - ,VALUE("Two",2,doNothing,noEvent) -); - -int chooseTest=-1; -CHOOSE(chooseTest,chooseMenu,"Choose",doNothing,noEvent,noStyle - ,VALUE("First",1,doNothing,noEvent) - ,VALUE("Second",2,doNothing,noEvent) - ,VALUE("Third",3,doNothing,noEvent) - ,VALUE("Last",-1,doNothing,noEvent) -); - -int timeOn=50; -void updAnalog() { - analogWrite(ANALOG_PIN,map(timeOn,0,100,0,255/*PWMRANGE*/)); -} - -//the menu -MENU(mainMenu,"Main menu",doNothing,noEvent,wrapStyle - ,SUBMENU(setLed) - ,OP("Action A",action1,enterEvent) - ,OP("Action B",action2,enterEvent) - ,FIELD(timeOn,"On","ms",0,100,10,1, updAnalog, anyEvent, noStyle) - ,SUBMENU(selMenu) - ,SUBMENU(chooseMenu) -); - -result idle(menuOut& o,idleEvent e) { - //if (e==idling) - Serial.println("suspended"); - o<<"suspended..."<\r\n" - "\r\n\r\n" - "" - <"; -} - -void pageEnd() { - serverOut<<""; - server.send(200, "text/xml", serverOut.response); -} - -void handleNotFound(){ - //digitalWrite(led, 1); - Serial.println("404 not found"); - String message = "File Not Found\n\n"; - message += "URI: "; - message += server.uri(); - message += "\nMethod: "; - message += (server.method() == HTTP_GET)?"GET":"POST"; - message += "\nArguments: "; - message += server.args(); - message += "\n"; - for (uint8_t i=0; i 0; t--) { - Serial.printf("[SETUP] BOOT WAIT %d...\n", t); - Serial.flush(); - delay(1000); - } - - // Serial.setDebugOutput(1); - // Serial.setDebugOutput(0); - // while(!Serial); - // delay(10); - // wifi_station_set_hostname((char*)serverName); - Serial.println(""); - Serial.println("Arduino menu webserver example"); - - SPIFFS.begin(); - - //WiFi.hostname(serverName);//not good - - Serial.print("Connecting to "); - Serial.println(ssid); - - // WiFiMulti.addAP(ssid, password); - // while(WiFiMulti.run() != WL_CONNECTED) delay(100); - WiFi.begin(ssid, password); - // Wait for connection - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } - webSocket.begin(); - Serial.println(""); - webSocket.onEvent(webSocketEvent); - Serial.println("Connected."); - Serial.print("IP address: "); - Serial.println(WiFi.localIP()); - - webSocket.begin(); - - // if (MDNS.begin("esp8266")) { - // Serial.println("MDNS responder started"); - // } - - nav.idleTask=idle;//point a function to be used when menu is suspended - - //we have none, so do not ask again! use a standard... - server.on("/favicon.ico",handleNotFound); - - server.on("/", HTTP_GET, []() { - handleMenu();//no output will be done on this mode - if(!handleFileRead("/index.html")) notfound();}//static page - ); - - //menu xml server - server.on("/menu", HTTP_GET, []() { - handleMenu(); - String r(serverOut.response); - serverOut.response.remove(0); - pageStart(); - nav.doOutput(); - serverOut<<""; - serverOut<"; - pageEnd(); - delay(1); - }); - - //file server, if MDNS handler not found. - //so, do not put sensitive info in the data files - server.onNotFound([](){if (!handleFileRead(server.uri())) notfound();}); - - server.begin(); - Serial.println("HTTP server started"); - Serial.println("Serving ArduinoMenu example."); -} - -void loop(void){ - serverOut.response.remove(0); - webSocket.loop(); - server.handleClient(); - delay(1); -} diff --git a/examples/esp8266/WebMenu/WebMenu/data/menu.xslt b/examples/esp8266/WebMenu/WebMenu/data/menu.xslt deleted file mode 100644 index 96f5d155..00000000 --- a/examples/esp8266/WebMenu/WebMenu/data/menu.xslt +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - - - - - - - - - ArduinoMenu library OTA - - - - - - - - - - - - -
-
-
-
-
-

ArduinoMenu library

- -
-
- -
-

on ESP8266

- (dev mode!) - -
- -
-
-

ArduinoMenu library https://github.com/neu-rah/ArduinoMenu.

-
-
-
-
-
- -
- - -
- - -
-
- - -

- - -

-
- - -
    - - -
-
- - - - - - - - - - - - - -
  • - - -
  • -
    - - -
  • - - -
  • -
    - - - - - - menu-range-field - range - - - - - - - - -
    diff --git a/examples/esp8266/WebMenu/WebMenu/data/r-site.js b/examples/esp8266/WebMenu/WebMenu/data/r-site.js deleted file mode 100644 index 073022ac..00000000 --- a/examples/esp8266/WebMenu/WebMenu/data/r-site.js +++ /dev/null @@ -1,113 +0,0 @@ -/*function updateField(e) { - window.location.href=$(e.target).attr("data-path")+"/"+e.target.value; -} -function updateSelect(e) { - console.log($(e.target).attr("data-path")+"/"+e.target.selectedIndex); - window.location.href=$(e.target).attr("data-path")+"/"+e.target.selectedIndex; -} -function init() { - console.log("r-site menu page script starting."); - var f=$("input.aml_field"); - f.change(updateField); - var s=$(".aml_ops select"); - s.change(updateSelect) -}*/ - -wsSrc=sourceURL;//"192.168.1.79"; - -var connection = {}; -function menuIn(o) {connection.send(o.id.split('~').join('/')+"/"+o.value);} - -function sendBinValue(nr,path,value) { - nr*=1; - path+=""; - value*=1; - if (path.endsWith("~")) path=path.slice(0,-1); - path=path.split('~').slice(1); - var len=path.length+4; - var payload=new Uint8Array(len); - payload[0]=nr; - payload[1]=nr>>8; - for(var n in path) payload[n*1+2]=parseInt(path[n]); - payload[len-2]=value; - payload[len-1]=value>>8; - console.log(payload,len); - connection.send(payload, len); -} - -function flushBin() { - if (lastBinData) { - if (binBusy) setTimeout(flushBin,200); - else { - console.log("flushing bin"); - sendBinInp.apply(this,lastBinData); - lastBinData=false; - } - } -} - -binBusy=false; -lastBinData=false; -function sendBinInp(nr,path,inp) { - if (binBusy) { - console.log("overlapping!"); - if (!lastBinData) setTimeout(flushBin,200); - lastBinData=arguments; - return; - } - binBusy=true; - nr*=1; - path+=""; - inp+=""; - if (path.endsWith("/")) path=path.slice(0,-1); - path=path.split('/').slice(1); - var len=path.length+3+inp.length+1; - var payload=new Uint8Array(len); - payload[0]=nr; - payload[1]=nr>>8; - payload[2]=path.length; - for(var n in path) payload[n*1+3]=parseInt(path[n]); - for(var i in inp) payload[3+path.length+i*1]=inp.charCodeAt(i*1); - payload[len-1]=0; - console.log(payload,len); - connection.send(payload, len); - //binBusy=false; -} - -function updateField(e) { - return updateField_(e.target); -} - -function updateField_(o) { - var t$=$(o); - var url=t$.attr("data-path")+"/"+o.value; - if (url.indexOf("/menu?at=")==0) url=url.substr(9); - sendBinInp(activePanel.attr("id"),url,(t$.attr("data-idx")*1+1)+o.value); -} -function updateSelect(e) {updateSelect_(e.target);} - -function updateSelect_(o) { - var url=$(o).attr("data-path")+"/"+o.selectedIndex; - if (url.indexOf("/menu?at=")==0) url=url.substr(9); - console.log("sending: "+url); - connection.send(url); -} -var activePanel=[]; -function init() { - console.log("r-site menu page script starting."); - activePanel=$(".aml_panel"); - var f=$("input.menu-range-field"); - //f.change(updateField); - f.on("input",updateField); - var s=$(".aml_ops select"); - s.change(updateSelect) -} - -$(function() { - console.log( "ready!" ); - connection =new WebSocket('ws://'+wsSrc+':81/', ['arduino']); - connection.onopen = function () {connection.send('Connect ' + new Date());}; - connection.onerror = function (error) {console.log('WebSocket Error ', error);}; - connection.onmessage = function (e) {eval(e.data);}; - init(); -}); diff --git a/examples/esp8266/WebMenu/platformio.ini b/examples/esp8266/WebMenu/platformio.ini deleted file mode 100644 index 441d52a7..00000000 --- a/examples/esp8266/WebMenu/platformio.ini +++ /dev/null @@ -1,27 +0,0 @@ -; PlatformIO Project Configuration File -; -; Build options: build flags, source filter, extra scripting -; Upload options: custom port, speed and extra flags -; Library options: dependencies, extra library storages -; -; Please visit documentation for the other options and examples -; http://docs.platformio.org/en/stable/projectconf.html - -[platformio] -; lib_dir =~/Arduino/Libraries -;lib_dir =~/Sketchbook/libraries -src_dir=WebMenu -data_dir=WebMenu/data - -; [env:esp01_1m] -; platform = espressif8266 -; board = esp01_1m -; framework = arduino -; build_flags = -Wno-comment -Wno-strict-aliasing -Wno-builtin-macro-redefined -DNODEBUG - -[env:esp12e] -platform = espressif8266 -board = esp12e -framework = arduino -upload_speed=921600 -build_flags = -DDEBUG -DMENU_ASYNC -DMENU_FMT_WRAPS -DMENU_SSID="\"r-site.net\"" -DMENU_PASS="\"rsite.2011\"" diff --git a/examples/esp8266_EscControl/EscControl/EscControl.ino b/examples/esp8266_EscControl/EscControl/EscControl.ino new file mode 100644 index 00000000..2a88be75 --- /dev/null +++ b/examples/esp8266_EscControl/EscControl/EscControl.ino @@ -0,0 +1,357 @@ +/******************** +Arduino generic menu system + +Feb. 2019 Rui Azevedo - ruihfazevedo(@rrob@)gmail.com + +IMPORTANT!: +this requires the data folder to be stored on esp8266 spiff +Extra libraries should be present + +arduinoWebSockets - https://github.com/Links2004/arduinoWebSockets +ESP8266WiFi - https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WiFi +ESP8266WebServer - https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WebServer + +*/ +#include + +#include +#include +#include //to write a menu has html page +#include +#include //to write a menu has xml page +#include //to write a menu has xml page +#ifndef ARDUINO_STREAMING + #include //https://github.com/neu-rah/streamFlow +#else + #include //https://github.com/scottdky/Streaming +#endif +//#include //to send javascript thru web socket (live update) +#include +#include +extern "C" { + #include "user_interface.h" +} + +using namespace Menu; + +#ifdef WEB_DEBUG + // on debug mode I put aux files on external server to allow changes without SPIFF update + // on this mode the browser MUST be instructed to accept cross domain files + String xslt("http://neurux:8080/"); +#else + String xslt(""); +#endif + +menuOut& operator<<(menuOut& o,unsigned long int i) { + o.print(i); + return o; +} +menuOut& operator<<(menuOut& o,endlObj) { + o.println(); + return o; +} + +//this version number MUST be the same as data/* +#define CUR_VERSION "1.5" +#define APName "EscControl" + +#define ESCPIN 2 +Servo myservo; + +#ifndef MENU_SSID + #error "need to define WiFi SSID here" + #define MENU_SSID "r-site.net" +#endif +#ifndef MENU_PASS + #error "need to define WiFi password here" + #define MENU_PASS "" +#endif + +// char wifiSSID[wifiSSIDLen+1];//=" "; +// char wifiPwd [wifiPwdLen+1];//=" "; + +const char* ssid = MENU_SSID; +const char* password = MENU_PASS; +// const char* serverName="192.168.1.79"; + +#define HTTP_PORT 80 +#define WS_PORT 81 +#define USE_SERIAL Serial +ESP8266WebServer server(80); +WebSocketsServer webSocket(81); + +#define MAX_DEPTH 2 +idx_t web_tops[MAX_DEPTH]; +PANELS(webPanels,{0,0,80,100}); +xmlFmt serverOut(server,web_tops,webPanels); +jsonFmt jsonOut(server,web_tops,webPanels); +jsonFmt wsOut(web_tops,webPanels); + +int speed=0; +result setEsc() { + myservo.write(map(speed,0,100,90,170));//this parameters are for my esc, please adapt +} +result armEsc() { + // arm the speed controller, modify as necessary for your ESC + speed=0; + setEsc(); + delay(1000); //delay 1 second, some speed controllers may need longer + Serial.println("arming ESC"); + serverOut<<"arming ESC
    "; + return proceed; +} +result stopEsc() { + speed=0; + setEsc(); + Serial.println("ESC stop"); + serverOut<<"ESC stop
    "; + return proceed; +} + +//the menu +MENU(mainMenu,"Main menu",doNothing,noEvent,wrapStyle + ,OP("Stop",stopEsc,enterEvent) + ,OP("Arm",armEsc,enterEvent) + ,FIELD(speed,"Speed","%",0,100,10,1, setEsc, enterEvent, noStyle) + ,EXIT("Exit!") +); + +result idle(menuOut& o,idleEvent e) { + //if (e==idling) + Serial.println("suspended"); + o<<"suspended..."<//some utill to help us calculate array sizes (known at compile time) +constexpr inline size_t len(T& o) {return sizeof(o)/sizeof(decltype(o[0]));} + +//serial menu navigation +MENU_OUTLIST(out,&serverOut); +serialIn serial(Serial); +NAVROOT(nav,mainMenu,MAX_DEPTH,serial,out); + +//xml+http navigation control +noInput none;//web uses its own API +menuOut* web_outputs[]={&serverOut}; +outputsList web_out(web_outputs,len(web_outputs)); +navNode web_cursors[MAX_DEPTH]; +navRoot webNav(mainMenu, web_cursors, MAX_DEPTH, none, web_out); + +//json+http navigation control +menuOut* json_outputs[]={&jsonOut}; +outputsList json_out(json_outputs,len(json_outputs)); +navNode json_cursors[MAX_DEPTH]; +navRoot jsonNav(mainMenu, json_cursors, MAX_DEPTH, none, json_out); + +//websockets navigation control +menuOut* ws_outputs[]={&wsOut}; +outputsList ws_out(ws_outputs,len(ws_outputs)); +navNode ws_cursors[MAX_DEPTH]; +navRoot wsNav(mainMenu, ws_cursors, MAX_DEPTH, none, ws_out); + +//config myOptions('*','-',defaultNavCodes,false); + +void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { + switch(type) { + case WStype_DISCONNECTED: + //USE_SERIAL.printf("[%u] Disconnected!\n", num); + break; + case WStype_CONNECTED: { + IPAddress ip = webSocket.remoteIP(num); + //USE_SERIAL.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); + webSocket.sendTXT(num, "console.log('ArduinoMenu Connected')"); + } + break; + case WStype_TEXT: { + //USE_SERIAL.printf("[%u] get Text: %s\n", num, payload); + // nav.async((const char*)payload);//this is slow!!!!!!!! + __trace(Serial.printf("[%u] get Text: %s\n", num, payload)); + char*s=(char*)payload; + _trace(Serial<<"serve websocket menu"<\r\n" + "\r\n\r\n"; + if (server.hasHeader("host")) + serverOut.print(server.header("host")); + else + serverOut.print(APName); + serverOut<<""; +} + +void pageEnd() { + serverOut<<""; + server.client().stop(); +} + +void jsonStart() { + _trace(Serial<<"jsonStart!"< 0; t--) { + Serial.printf("[SETUP] BOOT WAIT %d...\n", t); + Serial.flush(); + delay(1000); + } + + Serial.println(); + Serial.println("Arduino menu webserver example"); + + SPIFFS.begin(); + + Serial.print("Connecting to "); + Serial.println(ssid); + + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + webSocket.begin(); + Serial.println(""); + webSocket.onEvent(webSocketEvent); + Serial.println("Connected."); + Serial.print("IP address: "); + Serial.println(WiFi.localIP()); + + webSocket.begin(); + + nav.idleTask=idle;//point a function to be used when menu is suspended + + server.on("/",HTTP_GET,mainPage); + + //menu xml server over http + server.on("/menu", HTTP_GET, []() { + pageStart(); + serverOut<<""; + webNav.doOutput(); + pageEnd(); + }); + + //menu json server over http + server.on("/json", HTTP_GET, []() { + _trace(Serial<<"json request!"< + + + + + + + + + + + + +

    +
    + + +
    +
    + + +

    +
    + + +
    +
    + + +
  • + +
  • +
    + + + + + + + + + + + + + / + + + + + + + + + + + + + + + + +
  • + +
  • +
    + +
  • + +
  • +
    +
    +
    + + +
    +
    + + +
  • + +
  • +
    + + + + + + + + + + + + + + + + + + + + / + + + + + + + + + + + / + + + + + + + + + + + + + + + + / + + + fld__ + fld__ + text + slider ledField + + + + + + + window.location='/menu?at='+getAttribute("data-src")+'/'+value + + + + + + + + / + + + + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + 4 + 8 + + + + + + + + + + + + + fld__ + fld__ + text + slider ledField + + + + + + + window.location='/menu?at='+getAttribute("data-src")+'/'+value + + + + + + + + + fld__ + text + + + + + + form-control + + window.location='/menu?at='+getAttribute("data-src")+'/'+value + + + + + + + + + + + + fld__ + form-control + / + window.location.href='/menu?at='+getAttribute('data-src')+'/'+selectedIndex + + + + + + + + + + + + + + fld__ + + form-control + / + window.location='/menu?at='+getAttribute("data-src")+'/'+value + + + +
    diff --git a/examples/esp8266_EscControl/EscControl/data/1.5/device.xslt b/examples/esp8266_EscControl/EscControl/data/1.5/device.xslt new file mode 100644 index 00000000..479057a7 --- /dev/null +++ b/examples/esp8266_EscControl/EscControl/data/1.5/device.xslt @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/examples/esp8266_EscControl/EscControl/data/1.5/index.html b/examples/esp8266_EscControl/EscControl/data/1.5/index.html new file mode 100644 index 00000000..3b2cbd0a --- /dev/null +++ b/examples/esp8266_EscControl/EscControl/data/1.5/index.html @@ -0,0 +1,64 @@ + + + + + + + + + + ArduinoMenu library OTA + + + + + + + + + + + +
    + +
    + +
    + +
    +
    +

    ArduinoMenu library

    + +
    +
    + +
    +

    on ESP8266

    +

    You can customize this page, it is static.

    + Full menu +
    +
    +
    +
    +

    ArduinoMenu library https://github.com/neu-rah/ArduinoMenu.

    +
    +
    + +
    + +
    + +
    + + diff --git a/examples/esp8266/WebMenu/WebMenu/data/menu.css b/examples/esp8266_EscControl/EscControl/data/1.5/menu.css similarity index 56% rename from examples/esp8266/WebMenu/WebMenu/data/menu.css rename to examples/esp8266_EscControl/EscControl/data/1.5/menu.css index fc751cbd..b5b9b91a 100644 --- a/examples/esp8266/WebMenu/WebMenu/data/menu.css +++ b/examples/esp8266_EscControl/EscControl/data/1.5/menu.css @@ -1,7 +1,7 @@ html, body { height: 100%; - background-color: #132; + background-color: #1d80e2; } body { color: #fff; @@ -10,6 +10,36 @@ body { font-size: 18px; } +#outDlg .modal-content, .upForm { + background-color: #888 !important; + padding:1em; +} + +/* .masthead { + background-image: url(nav-bg.jpg); + background-size: cover; + background-position: center; +} */ + +nav { + background-color: #333; +} + +a { + text-decoration: none !important; +} + +input, select { + width: auto; + color: yellow; + background-color: transparent; + /* border: none; */ +} + +input[@type="uint32_t"] { + text-align: right; +} + /* Links */ a, a:focus, @@ -17,14 +47,20 @@ a:hover { color: #fff; } -.aml_op { - font-size:1.3em; +/* .asPad {background-color: gray;} */ +.pad-item {display: inline-block !important;} + +.form-control { + width:auto; + display:inline-block; } +.aml_op.btn {width:100%;} + .actionBtn { display:inline-block; padding:1em; - background-color: #010; + background-color: #0ba6a4; color: lime; border: solid 1px lime; border-radius: 3px; @@ -43,7 +79,7 @@ a:hover { input[type=range] { display:inline-block !important; - width:62% !important; + width:auto !important; background-color:#000800; } @@ -72,17 +108,37 @@ select {color: black;} } /* Padding for spacing */ -.inner { +/* .inner { padding: 30px; -} +} */ /* * Header */ +.masthead{ + background-color: #1d80e2; + height:150px; + overflow:hidden; + z-index:100; +} +/* .masthead-brand { + margin-top: 0px !important; +} */ +.masthead .wrap{ + -webkit-box-shadow: inset 0 0 100px rgba(0,0,0,.5); + box-shadow: inset 0 0 100px rgba(0,0,0,.5); + height:200px; +} + +.masthead .inner{ + /* padding:0 20px 0 60px; */ +} + .masthead-brand { - margin-top: 10px; - margin-bottom: 10px; + margin-top: 0px; + padding-top: 0.5em; + margin-bottom: 0em; } ul { @@ -118,35 +174,40 @@ ul { } @media (min-width: 768px) { + .masthead{ + height:100px; + } .masthead-brand { float: left; } .masthead-nav { + margin-top: 1em; float: right; } } - /* * Cover */ -.cover { - padding: 0 20px; -} .cover .btn-lg { - padding: 10px 20px; + /* padding: 10px 20px; */ font-weight: bold; } +.cover .btn-lg.linkBtn>a { + padding: 10px 20px; +} /* * Footer */ .mastfoot { + font-size: 0.6em; color: #999; /* IE8 proofing */ color: rgba(255,255,255,.5); + /* z-index: -1; */ } @@ -159,6 +220,7 @@ ul { .masthead { position: fixed; top: 0; + left: 0; } .mastfoot { position: fixed; @@ -174,12 +236,67 @@ ul { .cover-container { width: 100%; /* Must be percentage or pixels for horizontal alignment */ } + .cover-container { + width: 700px; + } + .cover { + padding: 100px 1em 1em 1em !important; + } + } @media (min-width: 992px) { - .masthead, + .masterhead { + padding: 1em; + } + .masthead .inner{ + margin: 0 auto; + } + .masthead .inner, .mastfoot, .cover-container { width: 700px; } + .cover { + padding: 100px 1em 1em 1em !important; + } +} + +.btn-active { + color: #fff; + background-color: #333; + border-color: #d58512; +} + +.btn-disabled { + color: #fff; + background-color: #696969; + border-color: #4cae4c; +} + +.slider { + margin-right:1em; + margin-left: 1em; +} + +.slider-selection { + background: #BABABA; +} + +.slider.slider-horizontal { + width:20% !important; +} + +.aml_op .del { + color:red; +} + +div.padOp {display:inline-block;} + +li.linkBtn {padding:0;} +li.linkBtn>a {display:block;margin:0;} + +.btn-space { + padding-left:0.5em; + padding-right:0.5em; } diff --git a/examples/esp8266_EscControl/EscControl/data/1.5/menu.xslt b/examples/esp8266_EscControl/EscControl/data/1.5/menu.xslt new file mode 100644 index 00000000..17884ad6 --- /dev/null +++ b/examples/esp8266_EscControl/EscControl/data/1.5/menu.xslt @@ -0,0 +1,91 @@ + + + + + + + + http://neurux:8080/ + + + + + + + + + + + + + + ArduinoMenu<web> + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +

    + r-site.net +

    + +
    +
    +
    +
    + +
    + +
    +
    +

    ArduinoMenu library https://github.com/neu-rah/ArduinoMenu.

    +
    +
    +
    +
    +
    + + +
    + +
    diff --git a/examples/esp8266_EscControl/EscControl/data/1.5/r-site.js b/examples/esp8266_EscControl/EscControl/data/1.5/r-site.js new file mode 100644 index 00000000..9e948659 --- /dev/null +++ b/examples/esp8266_EscControl/EscControl/data/1.5/r-site.js @@ -0,0 +1,176 @@ +// wsSrc = sourceURL; +wsSrc=window.location.hostname; +var connection = {}; + +// alert("r-site.js loaded!"); +var lastResult=null; +var previousResult=null; + +function connectWS() { + console.log("ws://" + wsSrc + ":81/", ["arduino"]); + connection = new WebSocket("ws://" + wsSrc + ":81/", ["arduino"]); + connection.onopen = init; + connection.onerror = function(e) {console.log("WebSocket Error ", e)}; + connection.onmessage = function(e) { + try { + console.log(JSON.parse(e.data));//just for checking it + } catch(err) { + console.log("NO JSON!",e.data); + } + eval("lastResult="+e.data); + //updatePage(); + }; + return connection.readyState; +} + +function updatePage() { + if (lastResult) mkPath(lastResult);//add path info + if (lastResult==previousResult) return; + if (previousResult&&lastResult.menu.title.prompt===previousResult.menu.title.prompt) + walkStates(lastResult.menu,previousResult.menu); + previousResult=lastResult; +} + +function refreshBtn(_,o) { + var p=$(o).attr("data-src"); + var g=$(o).attr("data-grp"); + var nv=jpath(g,lastResult.menu); + if (nv.value==$(o).text()) + console.log(p,g,nv); +} + +//get a single value out a menu state page by path +//it matches the page postion and selects requested item +//so path is absolute +function jpath(p,m) { + if (m.path!=p.slice(0,m.path.length)) return; + var ps=p.slice(m.path.length).split("/").slice(1); + return _jpath(m,ps); + function _jpath(m,o) { + var i=(m.pad||m.items) + if (!i&&o.length>0) return; + return (o.length&&i)?_jpath(i[o[0]],o.slice(1)):m + } +} + +//traverses previous and last state and +//update controls of changed values +function walkStates(i,j) { + if(!(i&&j)) return; + // console.log("walking states..."); + if (i.path!=j.path) return; + // console.log("path",i.path); + if (i.field&&j.field&&i.field!=j.field) {//numeric field! + var target=$("[data-src='"+i.path+"'"); + if (target.length) { + console.log("setting new field",i.path,i.field,target); + if (target.hasClass("slider")) target.slider("setValue",i.field); + else target.val(i.field); + } + } if (i.options&&j.options&&i.value!=j.value) {//enumerated field + var nvi=i.options.indexOf(i.value); + console.log("looking for",i.path); + var target=$("[data-src='"+i.path+"/"+nvi+"']"); + if (target.length) { + console.log("clicking on button"); + target.click(); + } else { + target=$("select[data-src='"+i.path+"']"); + if (target.length) { + console.log("changing selection",i.path,i.select); + target.val(i.select); + } + + } + } + if (typeof i[Symbol.iterator] === 'function'&&typeof j[Symbol.iterator] === 'function') + for(var n=0;n5) {//give up? + alert("websocket disconnected, please refresh page");//TODO: put mutilang here + return; + } else menu(o,cnt?cnt+1:0); + },500); + return; + } + console.log("send ws",o); + return connection.send(o); +} + +function updateField(e) { + return updateField_(e.target) +} + +function updateField_(e) { + var n = $(e).attr("data-src") + "/" + e.value + String.fromCharCode(255); + menu(n); +} + +function updateLink(e) { + return updateLink_(e.target) +} + +function updateLink_(e) { + var n = $(e), + o = n.attr("data-grp"), + t = n.attr("data-src"); + // console.log("removing selections"); + $("a[data-grp='" + o + "']").removeClass("btn-primary btn-success"); + // console.log("adding selection to", e); + n.addClass("btn-primary"); + // console.log("sending: " + t); + menu(t); + // connection.send(t) +} + +function updateSelect(e) { + updateSelect_(e.target) +} + +function updateSelect_(e) { + var n = $(e).attr("data-src") + "/" + e.selectedIndex; + // console.log("sending: " + n); + menu(n); + // connection.send(n); +} + +function init() { + console.log("menu websocket server connected."); + console.log("r-site menu page script starting."); + activePanel = $(".aml_panel"); + $(".aml_op>input").removeAttr("onchange").off("change").on("change", updateField); + $(".aml_op>select").removeAttr("onchange").off("change").on("change", updateSelect); + $("a.aml_btn").removeAttr("href").off("click").on("click", updateLink); + // $(".aml_op input.ledField").removeAttr("onchange").off("change").on("change", logField); +} +$(function() { + // console.log("ready!"); + connectWS(); + $("p.out").text() && $("#outDlg").modal(); + jQuery().slider && $(".slider").slider({formatter: function(e) {return e + "%"}}); +}); diff --git a/examples/esp8266_EscControl/EscControl/data/bootstrap-slider.min.css b/examples/esp8266_EscControl/EscControl/data/bootstrap-slider.min.css new file mode 100644 index 00000000..c0234bfd --- /dev/null +++ b/examples/esp8266_EscControl/EscControl/data/bootstrap-slider.min.css @@ -0,0 +1,41 @@ +/*! ======================================================= + VERSION 10.0.0 +========================================================= */ +/*! ========================================================= + * bootstrap-slider.js + * + * Maintainers: + * Kyle Kemp + * - Twitter: @seiyria + * - Github: seiyria + * Rohit Kalkur + * - Twitter: @Rovolutionary + * - Github: rovolution + * + * ========================================================= + * + * bootstrap-slider is released under the MIT License + * Copyright (c) 2017 Kyle Kemp, Rohit Kalkur, and contributors + * + * 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. + * + * ========================================================= */.slider{display:inline-block;vertical-align:middle;position:relative}.slider.slider-horizontal{width:210px;height:20px}.slider.slider-horizontal .slider-track{height:10px;width:100%;margin-top:-5px;top:50%;left:0}.slider.slider-horizontal .slider-selection,.slider.slider-horizontal .slider-track-low,.slider.slider-horizontal .slider-track-high{height:100%;top:0;bottom:0}.slider.slider-horizontal .slider-tick,.slider.slider-horizontal .slider-handle{margin-left:-10px}.slider.slider-horizontal .slider-tick.triangle,.slider.slider-horizontal .slider-handle.triangle{position:relative;top:50%;-ms-transform:translateY(-50%);transform:translateY(-50%);border-width:0 10px 10px 10px;width:0;height:0;border-bottom-color:#2e6da4;margin-top:0}.slider.slider-horizontal .slider-tick-container{white-space:nowrap;position:absolute;top:0;left:0;width:100%}.slider.slider-horizontal .slider-tick-label-container{white-space:nowrap;margin-top:20px}.slider.slider-horizontal .slider-tick-label-container .slider-tick-label{padding-top:4px;display:inline-block;text-align:center}.slider.slider-horizontal .tooltip{-ms-transform:translateX(-50%);transform:translateX(-50%)}.slider.slider-horizontal.slider-rtl .slider-track{left:initial;right:0}.slider.slider-horizontal.slider-rtl .slider-tick,.slider.slider-horizontal.slider-rtl .slider-handle{margin-left:initial;margin-right:-10px}.slider.slider-horizontal.slider-rtl .slider-tick-container{left:initial;right:0}.slider.slider-horizontal.slider-rtl .tooltip{-ms-transform:translateX(50%);transform:translateX(50%)}.slider.slider-vertical{height:210px;width:20px}.slider.slider-vertical .slider-track{width:10px;height:100%;left:25%;top:0}.slider.slider-vertical .slider-selection{width:100%;left:0;top:0;bottom:0}.slider.slider-vertical .slider-track-low,.slider.slider-vertical .slider-track-high{width:100%;left:0;right:0}.slider.slider-vertical .slider-tick,.slider.slider-vertical .slider-handle{margin-top:-10px}.slider.slider-vertical .slider-tick.triangle,.slider.slider-vertical .slider-handle.triangle{border-width:10px 0 10px 10px;width:1px;height:1px;border-left-color:#2e6da4;border-right-color:#2e6da4;margin-left:0;margin-right:0}.slider.slider-vertical .slider-tick-label-container{white-space:nowrap}.slider.slider-vertical .slider-tick-label-container .slider-tick-label{padding-left:4px}.slider.slider-vertical .tooltip{-ms-transform:translateY(-50%);transform:translateY(-50%)}.slider.slider-vertical.slider-rtl .slider-track{left:initial;right:25%}.slider.slider-vertical.slider-rtl .slider-selection{left:initial;right:0}.slider.slider-vertical.slider-rtl .slider-tick.triangle,.slider.slider-vertical.slider-rtl .slider-handle.triangle{border-width:10px 10px 10px 0}.slider.slider-vertical.slider-rtl .slider-tick-label-container .slider-tick-label{padding-left:initial;padding-right:4px}.slider.slider-disabled .slider-handle{background-image:-webkit-linear-gradient(top,#dfdfdf 0,#bebebe 100%);background-image:-o-linear-gradient(top,#dfdfdf 0,#bebebe 100%);background-image:linear-gradient(to bottom,#dfdfdf 0,#bebebe 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdfdfdf',endColorstr='#ffbebebe',GradientType=0)}.slider.slider-disabled .slider-track{background-image:-webkit-linear-gradient(top,#e5e5e5 0,#e9e9e9 100%);background-image:-o-linear-gradient(top,#e5e5e5 0,#e9e9e9 100%);background-image:linear-gradient(to bottom,#e5e5e5 0,#e9e9e9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe5e5e5',endColorstr='#ffe9e9e9',GradientType=0);cursor:not-allowed}.slider input{display:none}.slider .tooltip.top{margin-top:-36px}.slider .tooltip-inner{white-space:nowrap;max-width:none}.slider .hide{display:none}.slider-track{position:absolute;cursor:pointer;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#f9f9f9 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#f9f9f9 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#f9f9f9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);border-radius:4px}.slider-selection{position:absolute;background-image:-webkit-linear-gradient(top,#f9f9f9 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#f9f9f9 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#f9f9f9 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-radius:4px}.slider-selection.tick-slider-selection{background-image:-webkit-linear-gradient(top,#8ac1ef 0,#82b3de 100%);background-image:-o-linear-gradient(top,#8ac1ef 0,#82b3de 100%);background-image:linear-gradient(to bottom,#8ac1ef 0,#82b3de 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff8ac1ef',endColorstr='#ff82b3de',GradientType=0)}.slider-track-low,.slider-track-high{position:absolute;background:transparent;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-radius:4px}.slider-handle{position:absolute;top:0;width:20px;height:20px;background-color:#337ab7;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7',endColorstr='#ff2e6da4',GradientType=0);filter:none;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);border:0 solid transparent}.slider-handle.round{border-radius:50%}.slider-handle.triangle{background:transparent none}.slider-handle.custom{background:transparent none}.slider-handle.custom::before{line-height:20px;font-size:20px;content:'\2605';color:#726204}.slider-tick{position:absolute;width:20px;height:20px;background-image:-webkit-linear-gradient(top,#f9f9f9 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#f9f9f9 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#f9f9f9 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;filter:none;opacity:.8;border:0 solid transparent}.slider-tick.round{border-radius:50%}.slider-tick.triangle{background:transparent none}.slider-tick.custom{background:transparent none}.slider-tick.custom::before{line-height:20px;font-size:20px;content:'\2605';color:#726204}.slider-tick.in-selection{background-image:-webkit-linear-gradient(top,#8ac1ef 0,#82b3de 100%);background-image:-o-linear-gradient(top,#8ac1ef 0,#82b3de 100%);background-image:linear-gradient(to bottom,#8ac1ef 0,#82b3de 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff8ac1ef',endColorstr='#ff82b3de',GradientType=0);opacity:1} diff --git a/examples/esp8266_EscControl/EscControl/data/bootstrap-slider.min.js b/examples/esp8266_EscControl/EscControl/data/bootstrap-slider.min.js new file mode 100644 index 00000000..bd11ca85 --- /dev/null +++ b/examples/esp8266_EscControl/EscControl/data/bootstrap-slider.min.js @@ -0,0 +1,5 @@ +/*! ======================================================= + VERSION 10.0.0 +========================================================= */ +"use strict";var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},windowIsDefined="object"===("undefined"==typeof window?"undefined":_typeof(window));!function(a){if("function"==typeof define&&define.amd)define(["jquery"],a);else if("object"===("undefined"==typeof module?"undefined":_typeof(module))&&module.exports){var b;try{b=require("jquery")}catch(c){b=null}module.exports=a(b)}else window&&(window.Slider=a(window.jQuery))}(function(a){var b="slider",c="bootstrapSlider";windowIsDefined&&!window.console&&(window.console={}),windowIsDefined&&!window.console.log&&(window.console.log=function(){}),windowIsDefined&&!window.console.warn&&(window.console.warn=function(){});var d;return function(a){function b(){}function c(a){function c(b){b.prototype.option||(b.prototype.option=function(b){a.isPlainObject(b)&&(this.options=a.extend(!0,this.options,b))})}function e(b,c){a.fn[b]=function(e){if("string"==typeof e){for(var g=d.call(arguments,1),h=0,i=this.length;i>h;h++){var j=this[h],k=a.data(j,b);if(k)if(a.isFunction(k[e])&&"_"!==e.charAt(0)){var l=k[e].apply(k,g);if(void 0!==l&&l!==k)return l}else f("no such method '"+e+"' for "+b+" instance");else f("cannot call methods on "+b+" prior to initialization; attempted to call '"+e+"'")}return this}var m=this.map(function(){var d=a.data(this,b);return d?(d.option(e),d._init()):(d=new c(this,e),a.data(this,b,d)),a(this)});return!m||m.length>1?m:m[0]}}if(a){var f="undefined"==typeof console?b:function(a){console.error(a)};return a.bridget=function(a,b){c(b),e(a,b)},a.bridget}}var d=Array.prototype.slice;c(a)}(a),function(a){function e(b,c){function d(a,b){var c="data-slider-"+b.replace(/_/g,"-"),d=a.getAttribute(c);try{return JSON.parse(d)}catch(e){return d}}this._state={value:null,enabled:null,offset:null,size:null,percentage:null,inDrag:!1,over:!1},this.ticksCallbackMap={},this.handleCallbackMap={},"string"==typeof b?this.element=document.querySelector(b):b instanceof HTMLElement&&(this.element=b),c=c?c:{};for(var e=Object.keys(this.defaultOptions),f=0;f0)for(var t=0;t0){for(this.ticksContainer=document.createElement("div"),this.ticksContainer.className="slider-tick-container",f=0;f0)for(this.tickLabelContainer=document.createElement("div"),this.tickLabelContainer.className="slider-tick-label-container",f=0;f0&&(this.options.max=Math.max.apply(Math,this.options.ticks),this.options.min=Math.min.apply(Math,this.options.ticks)),Array.isArray(this.options.value)?(this.options.range=!0,this._state.value=this.options.value):this.options.range?this._state.value=[this.options.value,this.options.max]:this._state.value=this.options.value,this.trackLow=k||this.trackLow,this.trackSelection=j||this.trackSelection,this.trackHigh=l||this.trackHigh,"none"===this.options.selection?(this._addClass(this.trackLow,"hide"),this._addClass(this.trackSelection,"hide"),this._addClass(this.trackHigh,"hide")):("after"===this.options.selection||"before"===this.options.selection)&&(this._removeClass(this.trackLow,"hide"),this._removeClass(this.trackSelection,"hide"),this._removeClass(this.trackHigh,"hide")),this.handle1=m||this.handle1,this.handle2=n||this.handle2,p===!0)for(this._removeClass(this.handle1,"round triangle"),this._removeClass(this.handle2,"round triangle hide"),f=0;f0){for(var d,e,f,g=0,h=1;hthis.options.max?this.options.max:k},toPercentage:function(a){if(this.options.max===this.options.min)return 0;if(this.options.ticks_positions.length>0){for(var b,c,d,e=0,f=0;f0?this.options.ticks[f-1]:0,d=f>0?this.options.ticks_positions[f-1]:0,c=this.options.ticks[f],e=this.options.ticks_positions[f];break}if(f>0){var g=(a-b)/(c-b);return d+g*(e-d)}}return 100*(a-this.options.min)/(this.options.max-this.options.min)}},logarithmic:{toValue:function(a){var b=0===this.options.min?0:Math.log(this.options.min),c=Math.log(this.options.max),d=Math.exp(b+(c-b)*a/100);return Math.round(d)===this.options.max?this.options.max:(d=this.options.min+Math.round((d-this.options.min)/this.options.step)*this.options.step,dthis.options.max?this.options.max:d)},toPercentage:function(a){if(this.options.max===this.options.min)return 0;var b=Math.log(this.options.max),c=0===this.options.min?0:Math.log(this.options.min),d=0===a?0:Math.log(a);return 100*(d-c)/(b-c)}}};if(d=function(a,b){return e.call(this,a,b),this},d.prototype={_init:function(){},constructor:d,defaultOptions:{id:"",min:0,max:10,step:1,precision:0,orientation:"horizontal",value:5,range:!1,selection:"before",tooltip:"show",tooltip_split:!1,handle:"round",reversed:!1,rtl:"auto",enabled:!0,formatter:function(a){return Array.isArray(a)?a[0]+" : "+a[1]:a},natural_arrow_keys:!1,ticks:[],ticks_positions:[],ticks_labels:[],ticks_snap_bounds:0,ticks_tooltip:!1,scale:"linear",focus:!1,tooltip_position:null,labelledby:null,rangeHighlights:[]},getElement:function(){return this.sliderElem},getValue:function(){return this.options.range?this._state.value:this._state.value[0]},setValue:function(a,b,c){a||(a=0);var d=this.getValue();this._state.value=this._validateInputValue(a);var e=this._applyPrecision.bind(this);this.options.range?(this._state.value[0]=e(this._state.value[0]),this._state.value[1]=e(this._state.value[1]),this._state.value[0]=Math.max(this.options.min,Math.min(this.options.max,this._state.value[0])),this._state.value[1]=Math.max(this.options.min,Math.min(this.options.max,this._state.value[1]))):(this._state.value=e(this._state.value),this._state.value=[Math.max(this.options.min,Math.min(this.options.max,this._state.value))],this._addClass(this.handle2,"hide"),"after"===this.options.selection?this._state.value[1]=this.options.max:this._state.value[1]=this.options.min),this.options.max>this.options.min?this._state.percentage=[this._toPercentage(this._state.value[0]),this._toPercentage(this._state.value[1]),100*this.options.step/(this.options.max-this.options.min)]:this._state.percentage=[0,0,100],this._layout();var f=this.options.range?this._state.value:this._state.value[0];return this._setDataVal(f),b===!0&&this._trigger("slide",f),d!==f&&c===!0&&this._trigger("change",{oldValue:d,newValue:f}),this},destroy:function(){this._removeSliderEventHandlers(),this.sliderElem.parentNode.removeChild(this.sliderElem),this.element.style.display="",this._cleanUpEventCallbacksMap(),this.element.removeAttribute("data"),a&&(this._unbindJQueryEventHandlers(),this.$element.removeData("slider"))},disable:function(){return this._state.enabled=!1,this.handle1.removeAttribute("tabindex"),this.handle2.removeAttribute("tabindex"),this._addClass(this.sliderElem,"slider-disabled"),this._trigger("slideDisabled"),this},enable:function(){return this._state.enabled=!0,this.handle1.setAttribute("tabindex",0),this.handle2.setAttribute("tabindex",0),this._removeClass(this.sliderElem,"slider-disabled"),this._trigger("slideEnabled"),this},toggle:function(){return this._state.enabled?this.disable():this.enable(),this},isEnabled:function(){return this._state.enabled},on:function(a,b){return this._bindNonQueryEventHandler(a,b),this},off:function(b,c){a?(this.$element.off(b,c),this.$sliderElem.off(b,c)):this._unbindNonQueryEventHandler(b,c)},getAttribute:function(a){return a?this.options[a]:this.options},setAttribute:function(a,b){return this.options[a]=b,this},refresh:function(){return this._removeSliderEventHandlers(),e.call(this,this.element,this.options),a&&a.data(this.element,"slider",this),this},relayout:function(){return this._resize(),this._layout(),this},_removeSliderEventHandlers:function(){if(this.handle1.removeEventListener("keydown",this.handle1Keydown,!1),this.handle2.removeEventListener("keydown",this.handle2Keydown,!1),this.options.ticks_tooltip){for(var a=this.ticksContainer.getElementsByClassName("slider-tick"),b=0;b=0?c:this.attributes["aria-valuenow"].value,e=parseInt(d,10);b.value[0]=e,b.percentage[0]=a.options.ticks_positions[e],a._setToolTipOnMouseOver(b),a._showTooltip()};return b.addEventListener("mouseenter",d,!1),d},addMouseLeave:function(a,b){var c=function(){a._hideTooltip()};return b.addEventListener("mouseleave",c,!1),c}}},_layout:function(){var a;if(a=this.options.reversed?[100-this._state.percentage[0],this.options.range?100-this._state.percentage[1]:this._state.percentage[1]]:[this._state.percentage[0],this._state.percentage[1]],this.handle1.style[this.stylePos]=a[0]+"%",this.handle1.setAttribute("aria-valuenow",this._state.value[0]),isNaN(this.options.formatter(this._state.value[0]))&&this.handle1.setAttribute("aria-valuetext",this.options.formatter(this._state.value[0])),this.handle2.style[this.stylePos]=a[1]+"%",this.handle2.setAttribute("aria-valuenow",this._state.value[1]),isNaN(this.options.formatter(this._state.value[1]))&&this.handle2.setAttribute("aria-valuetext",this.options.formatter(this._state.value[1])),this.rangeHighlightElements.length>0&&Array.isArray(this.options.rangeHighlights)&&this.options.rangeHighlights.length>0)for(var b=0;b0){var g,h="vertical"===this.options.orientation?"height":"width";g="vertical"===this.options.orientation?"marginTop":this.options.rtl?"marginRight":"marginLeft";var i=this._state.size/(this.options.ticks.length-1);if(this.tickLabelContainer){var j=0;if(0===this.options.ticks_positions.length)"vertical"!==this.options.orientation&&(this.tickLabelContainer.style[g]=-i/2+"px"),j=this.tickLabelContainer.offsetHeight;else for(k=0;kj&&(j=this.tickLabelContainer.childNodes[k].offsetHeight);"horizontal"===this.options.orientation&&(this.sliderElem.style.marginBottom=j+"px")}for(var k=0;k=a[0]&&l<=a[1]&&this._addClass(this.ticks[k],"in-selection"):"after"===this.options.selection&&l>=a[0]?this._addClass(this.ticks[k],"in-selection"):"before"===this.options.selection&&l<=a[0]&&this._addClass(this.ticks[k],"in-selection"),this.tickLabels[k]&&(this.tickLabels[k].style[h]=i+"px","vertical"!==this.options.orientation&&void 0!==this.options.ticks_positions[k]?(this.tickLabels[k].style.position="absolute",this.tickLabels[k].style[this.stylePos]=l+"%",this.tickLabels[k].style[g]=-i/2+"px"):"vertical"===this.options.orientation&&(this.options.rtl?this.tickLabels[k].style.marginRight=this.sliderElem.offsetWidth+"px":this.tickLabels[k].style.marginLeft=this.sliderElem.offsetWidth+"px",this.tickLabelContainer.style[g]=this.sliderElem.offsetWidth/2*-1+"px"))}}var m;if(this.options.range){m=this.options.formatter(this._state.value),this._setText(this.tooltipInner,m),this.tooltip.style[this.stylePos]=(a[1]+a[0])/2+"%";var n=this.options.formatter(this._state.value[0]);this._setText(this.tooltipInner_min,n);var o=this.options.formatter(this._state.value[1]);this._setText(this.tooltipInner_max,o),this.tooltip_min.style[this.stylePos]=a[0]+"%",this.tooltip_max.style[this.stylePos]=a[1]+"%"}else m=this.options.formatter(this._state.value[0]),this._setText(this.tooltipInner,m),this.tooltip.style[this.stylePos]=a[0]+"%";if("vertical"===this.options.orientation)this.trackLow.style.top="0",this.trackLow.style.height=Math.min(a[0],a[1])+"%",this.trackSelection.style.top=Math.min(a[0],a[1])+"%",this.trackSelection.style.height=Math.abs(a[0]-a[1])+"%",this.trackHigh.style.bottom="0",this.trackHigh.style.height=100-Math.min(a[0],a[1])-Math.abs(a[0]-a[1])+"%";else{"right"===this.stylePos?this.trackLow.style.right="0":this.trackLow.style.left="0",this.trackLow.style.width=Math.min(a[0],a[1])+"%","right"===this.stylePos?this.trackSelection.style.right=Math.min(a[0],a[1])+"%":this.trackSelection.style.left=Math.min(a[0],a[1])+"%",this.trackSelection.style.width=Math.abs(a[0]-a[1])+"%","right"===this.stylePos?this.trackHigh.style.left="0":this.trackHigh.style.right="0",this.trackHigh.style.width=100-Math.min(a[0],a[1])-Math.abs(a[0]-a[1])+"%";var p=this.tooltip_min.getBoundingClientRect(),q=this.tooltip_max.getBoundingClientRect();"bottom"===this.options.tooltip_position?p.right>q.left?(this._removeClass(this.tooltip_max,"bottom"),this._addClass(this.tooltip_max,"top"),this.tooltip_max.style.top="",this.tooltip_max.style.bottom="22px"):(this._removeClass(this.tooltip_max,"top"),this._addClass(this.tooltip_max,"bottom"),this.tooltip_max.style.top=this.tooltip_min.style.top,this.tooltip_max.style.bottom=""):p.right>q.left?(this._removeClass(this.tooltip_max,"top"),this._addClass(this.tooltip_max,"bottom"),this.tooltip_max.style.top="18px"):(this._removeClass(this.tooltip_max,"bottom"),this._addClass(this.tooltip_max,"top"),this.tooltip_max.style.top=this.tooltip_min.style.top)}},_createHighlightRange:function(a,b){return this._isHighlightRange(a,b)?a>b?{start:b,size:a-b}:{start:a,size:b-a}:null},_isHighlightRange:function(a,b){return a>=0&&100>=a&&b>=0&&100>=b?!0:!1},_resize:function(a){this._state.offset=this._offset(this.sliderElem),this._state.size=this.sliderElem[this.sizePos],this._layout()},_removeProperty:function(a,b){a.style.removeProperty?a.style.removeProperty(b):a.style.removeAttribute(b)},_mousedown:function(a){if(!this._state.enabled)return!1;this._state.offset=this._offset(this.sliderElem),this._state.size=this.sliderElem[this.sizePos];var b=this._getPercentage(a);if(this.options.range){var c=Math.abs(this._state.percentage[0]-b),d=Math.abs(this._state.percentage[1]-b);this._state.dragged=d>c?0:1,this._adjustPercentageForRangeSliders(b)}else this._state.dragged=0;this._state.percentage[this._state.dragged]=b,this._layout(),this.touchCapable&&(document.removeEventListener("touchmove",this.mousemove,!1),document.removeEventListener("touchend",this.mouseup,!1)),this.mousemove&&document.removeEventListener("mousemove",this.mousemove,!1),this.mouseup&&document.removeEventListener("mouseup",this.mouseup,!1),this.mousemove=this._mousemove.bind(this),this.mouseup=this._mouseup.bind(this),this.touchCapable&&(document.addEventListener("touchmove",this.mousemove,!1),document.addEventListener("touchend",this.mouseup,!1)),document.addEventListener("mousemove",this.mousemove,!1),document.addEventListener("mouseup",this.mouseup,!1),this._state.inDrag=!0;var e=this._calculateValue();return this._trigger("slideStart",e),this._setDataVal(e),this.setValue(e,!1,!0),a.returnValue=!1,this.options.focus&&this._triggerFocusOnHandle(this._state.dragged),!0},_touchstart:function(a){if(void 0===a.changedTouches)return void this._mousedown(a);var b=a.changedTouches[0];this.touchX=b.pageX,this.touchY=b.pageY},_triggerFocusOnHandle:function(a){0===a&&this.handle1.focus(),1===a&&this.handle2.focus()},_keydown:function(a,b){if(!this._state.enabled)return!1;var c;switch(b.keyCode){case 37:case 40:c=-1;break;case 39:case 38:c=1}if(c){if(this.options.natural_arrow_keys){var d="vertical"===this.options.orientation&&!this.options.reversed,e="horizontal"===this.options.orientation&&this.options.reversed;(d||e)&&(c=-c)}var f=this._state.value[a]+c*this.options.step,g=f/this.options.max*100;if(this._state.keyCtrl=a,this.options.range){this._adjustPercentageForRangeSliders(g);var h=this._state.keyCtrl?this._state.value[0]:f,i=this._state.keyCtrl?f:this._state.value[1];f=[h,i]}return this._trigger("slideStart",f),this._setDataVal(f),this.setValue(f,!0,!0),this._setDataVal(f),this._trigger("slideStop",f),this._layout(),this._pauseEvent(b),delete this._state.keyCtrl,!1}},_pauseEvent:function(a){a.stopPropagation&&a.stopPropagation(),a.preventDefault&&a.preventDefault(),a.cancelBubble=!0,a.returnValue=!1},_mousemove:function(a){if(!this._state.enabled)return!1;var b=this._getPercentage(a);this._adjustPercentageForRangeSliders(b),this._state.percentage[this._state.dragged]=b,this._layout();var c=this._calculateValue(!0);return this.setValue(c,!0,!0),!1},_touchmove:function(a){if(void 0!==a.changedTouches){var b=a.changedTouches[0],c=b.pageX-this.touchX,d=b.pageY-this.touchY;this._state.inDrag||("vertical"===this.options.orientation&&5>=c&&c>=-5&&(d>=15||-15>=d)?this._mousedown(a):5>=d&&d>=-5&&(c>=15||-15>=c)&&this._mousedown(a))}},_adjustPercentageForRangeSliders:function(a){if(this.options.range){var b=this._getNumDigitsAfterDecimalPlace(a);b=b?b-1:0;var c=this._applyToFixedAndParseFloat(a,b);0===this._state.dragged&&this._applyToFixedAndParseFloat(this._state.percentage[1],b)c?(this._state.percentage[1]=this._state.percentage[0],this._state.dragged=0):0===this._state.keyCtrl&&this._state.value[1]/this.options.max*100a&&(this._state.percentage[1]=this._state.percentage[0],this._state.keyCtrl=0,this.handle1.focus())}},_mouseup:function(){if(!this._state.enabled)return!1;this.touchCapable&&(document.removeEventListener("touchmove",this.mousemove,!1),document.removeEventListener("touchend",this.mouseup,!1)),document.removeEventListener("mousemove",this.mousemove,!1),document.removeEventListener("mouseup",this.mouseup,!1),this._state.inDrag=!1,this._state.over===!1&&this._hideTooltip();var a=this._calculateValue(!0);return this._layout(),this._setDataVal(a),this._trigger("slideStop",a),!1},_calculateValue:function(a){var b;if(this.options.range?(b=[this.options.min,this.options.max],0!==this._state.percentage[0]&&(b[0]=this._toValue(this._state.percentage[0]),b[0]=this._applyPrecision(b[0])),100!==this._state.percentage[1]&&(b[1]=this._toValue(this._state.percentage[1]),b[1]=this._applyPrecision(b[1]))):(b=this._toValue(this._state.percentage[0]),b=parseFloat(b),b=this._applyPrecision(b)),a){for(var c=[b,1/0],d=0;d Web browser +input: ESP8266WebSocket <- Web browser +format: xml, json + +IMPORTANT!: +this requires the data folder to be stored on esp8266 spiff +Extra libraries should be present + +arduinoWebSockets - https://github.com/Links2004/arduinoWebSockets +ESP8266WiFi - https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WiFi +ESP8266WebServer - https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WebServer + +for development purposes some files are left external, +therefor requiring an external webserver to provide them (just for dev purposes) +i'm using nodejs http-server (https://www.npmjs.com/package/http-server) +to static serve content from the data folder. This allows me to quick change +the files without having to upload them to SPIFFS +also gateway ssid and password are stored on this code (bellow), +so don't forget to change it. + +*/ + +#include +#include +#include //to write a menu has html page +#include +#include //to write a menu has xml page +#include //to write a menu has xml page +#ifndef ARDUINO_STREAMING + #include //https://github.com/neu-rah/streamFlow +#else + #include //https://github.com/scottdky/Streaming +#endif +//#include //to send javascript thru web socket (live update) +#include +#ifdef ESP8266 +#include +extern "C" { + #include "user_interface.h" +} +#elif defined(ESP32) +#include + +// Use external analogWrite library for ESP32 (optional) +// for compatibility with older versions of espressif/arduino-esp32 +// https://github.com/Dlloydev/ESP32-ESP32S2-AnalogWrite +#include +#endif + +using namespace Menu; + +#ifdef WEB_DEBUG + // on debug mode I put aux files on external server to allow changes without SPIFF update + // on this mode the browser MUST be instructed to accept cross domain files + String xslt("http://neurux:8080/"); +#else + String xslt(""); +#endif + +menuOut& operator<<(menuOut& o,unsigned long int i) { + o.print(i); + return o; +} +menuOut& operator<<(menuOut& o,endlObj) { + o.println(); + return o; +} + +//this version numbers MUST be the same as data/1.2 +#define CUR_VERSION "1.5" +#define APName "WebMenu" + +int ledCtrl=LOW; +//on my esp12e led pin is 2 +#define LEDPIN 2 +//this is ok on other boards +// #define LEDPIN LED_BUILTIN +void updLed() { + _trace(Serial<<"update led state!"< serverOut(server,web_tops,webPanels); +jsonFmt jsonOut(server,web_tops,webPanels); +jsonFmt wsOut(web_tops,webPanels); + +//menu action functions +result action1(eventMask event, navNode& nav, prompt &item) { + Serial.println("action A called!"); + serverOut<<"This is action A web report "<<(millis()%1000)<<"
    "; + return proceed; +} +result action2(eventMask event, navNode& nav, prompt &item) { + Serial.println("action B called!"); + serverOut<<"This is action B web report "<<(millis()%1000)<<"
    "; + return proceed; +} + +void debugLedUpd() { + _trace(Serial<<"debug led update! "<//some utill to help us calculate array sizes (known at compile time) +constexpr inline size_t menuData_len(T& o) {return sizeof(o)/sizeof(decltype(o[0]));} + +//serial menu navigation +MENU_OUTLIST(out,&serverOut); +serialIn serial(Serial); +NAVROOT(nav,mainMenu,MAX_DEPTH,serial,out); + +//xml+http navigation control +noInput none;//web uses its own API +menuOut* web_outputs[]={&serverOut}; +outputsList web_out(web_outputs,menuData_len(web_outputs)); +navNode web_cursors[MAX_DEPTH]; +navRoot webNav(mainMenu, web_cursors, MAX_DEPTH, none, web_out); + +//json+http navigation control +menuOut* json_outputs[]={&jsonOut}; +outputsList json_out(json_outputs,menuData_len(json_outputs)); +navNode json_cursors[MAX_DEPTH]; +navRoot jsonNav(mainMenu, json_cursors, MAX_DEPTH, none, json_out); + +//websockets navigation control +menuOut* ws_outputs[]={&wsOut}; +outputsList ws_out(ws_outputs,menuData_len(ws_outputs)); +navNode ws_cursors[MAX_DEPTH]; +navRoot wsNav(mainMenu, ws_cursors, MAX_DEPTH, none, ws_out); + +//config myOptions('*','-',defaultNavCodes,false); + +void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { + switch(type) { + case WStype_DISCONNECTED: + //USE_SERIAL.printf("[%u] Disconnected!\n", num); + break; + case WStype_CONNECTED: { + IPAddress ip = webSocket.remoteIP(num); + //USE_SERIAL.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); + webSocket.sendTXT(num, "console.log('ArduinoMenu Connected')"); + } + break; + case WStype_TEXT: { + //USE_SERIAL.printf("[%u] get Text: %s\n", num, payload); + // nav.async((const char*)payload);//this is slow!!!!!!!! + __trace(Serial.printf("[%u] get Text: %s\n", num, payload)); + char*s=(char*)payload; + _trace(Serial<<"serve websocket menu"<\r\n" + "\r\n\r\n"; + if (server.hasHeader("host")) + serverOut.print(server.header("host")); + else + serverOut.print(APName); + serverOut<<""; +} + +void pageEnd() { + serverOut<<""; + server.client().stop(); +} + +void jsonStart() { + _trace(Serial<<"jsonStart!"< 0; t--) { + Serial.printf("[SETUP] BOOT WAIT %d...\n", t); + Serial.flush(); + delay(1000); + } + + // Serial.setDebugOutput(1); + // Serial.setDebugOutput(0); + // while(!Serial); + // delay(10); + // wifi_station_set_hostname((char*)serverName); + Serial.println(""); + Serial.println("Arduino menu webserver example"); + + SPIFFS.begin(); + + Serial.print("Connecting to "); + Serial.println(ssid); + + WiFi.begin(ssid, password); + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + webSocket.begin(); + Serial.println(""); + webSocket.onEvent(webSocketEvent); + Serial.println("Connected."); + Serial.print("IP address: "); + Serial.println(WiFi.localIP()); + + webSocket.begin(); + + nav.idleTask=idle;//point a function to be used when menu is suspended + + server.on("/",HTTP_GET,mainPage); + + //menu xml server over http + server.on("/menu", HTTP_GET, []() { + pageStart(); + serverOut<<""; + webNav.doOutput(); + pageEnd(); + }); + + //menu json server over http + server.on("/json", HTTP_GET, []() { + _trace(Serial<<"json request!"< + + + + + + + + + + + + +

    +
    + + +
    +
    + + +

    +
    + + +
    +
    + + +
  • + +
  • +
    + + + + + + + + + + + + + / + + + + + + + + + + + + + + + + +
  • + +
  • +
    + +
  • + +
  • +
    +
    +
    + + +
    +
    + + +
  • + +
  • +
    + + + + + + + + + + + + + + + + + + + + / + + + + + + + + + + + / + + + + + + + + + + + + + + + + / + + + fld__ + fld__ + text + slider ledField + + + + + + + window.location='/menu?at='+getAttribute("data-src")+'/'+value + + + + + + + + / + + + + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + 4 + 8 + + + + + + + + + + + + + fld__ + fld__ + text + slider ledField + + + + + + + window.location='/menu?at='+getAttribute("data-src")+'/'+value + + + + + + + + + fld__ + text + + + + + + form-control + + window.location='/menu?at='+getAttribute("data-src")+'/'+value + + + + + + + + + + + + fld__ + form-control + / + window.location.href='/menu?at='+getAttribute('data-src')+'/'+selectedIndex + + + + + + + + + + + + + + fld__ + + form-control + / + window.location='/menu?at='+getAttribute("data-src")+'/'+value + + + +
    diff --git a/examples/esp8266_WebMenu/WebMenu/data/1.5/device.xslt b/examples/esp8266_WebMenu/WebMenu/data/1.5/device.xslt new file mode 100644 index 00000000..479057a7 --- /dev/null +++ b/examples/esp8266_WebMenu/WebMenu/data/1.5/device.xslt @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/examples/esp8266/WebMenu/WebMenu/data/index.html b/examples/esp8266_WebMenu/WebMenu/data/1.5/index.html similarity index 84% rename from examples/esp8266/WebMenu/WebMenu/data/index.html rename to examples/esp8266_WebMenu/WebMenu/data/1.5/index.html index bf9f3149..5fbda736 100644 --- a/examples/esp8266/WebMenu/WebMenu/data/index.html +++ b/examples/esp8266_WebMenu/WebMenu/data/1.5/index.html @@ -18,8 +18,8 @@ - - + +
    @@ -33,16 +33,18 @@

    ArduinoMenu library

    -

    on ESP8266

    +

    on ESP8266

    Example of async menu call on customized static web page.

    Action A Action B diff --git a/examples/esp8266_WebMenu/WebMenu/data/1.5/menu.css b/examples/esp8266_WebMenu/WebMenu/data/1.5/menu.css new file mode 100644 index 00000000..b5b9b91a --- /dev/null +++ b/examples/esp8266_WebMenu/WebMenu/data/1.5/menu.css @@ -0,0 +1,302 @@ +html, +body { + height: 100%; + background-color: #1d80e2; +} +body { + color: #fff; + text-align: center; + text-shadow: 0 1px 3px rgba(0,0,0,.5); + font-size: 18px; +} + +#outDlg .modal-content, .upForm { + background-color: #888 !important; + padding:1em; +} + +/* .masthead { + background-image: url(nav-bg.jpg); + background-size: cover; + background-position: center; +} */ + +nav { + background-color: #333; +} + +a { + text-decoration: none !important; +} + +input, select { + width: auto; + color: yellow; + background-color: transparent; + /* border: none; */ +} + +input[@type="uint32_t"] { + text-align: right; +} + +/* Links */ +a, +a:focus, +a:hover { + color: #fff; +} + +/* .asPad {background-color: gray;} */ +.pad-item {display: inline-block !important;} + +.form-control { + width:auto; + display:inline-block; +} + +.aml_op.btn {width:100%;} + +.actionBtn { + display:inline-block; + padding:1em; + background-color: #0ba6a4; + color: lime; + border: solid 1px lime; + border-radius: 3px; + text-align: right; +} + +/* Custom default button */ +.btn-default, +.btn-default:hover, +.btn-default:focus { + color: #333; + text-shadow: none; /* Prevent inheritance from `body` */ + background-color: #fff; + border: 1px solid #fff; +} + +input[type=range] { + display:inline-block !important; + width:auto !important; + background-color:#000800; +} + +/* + * Base structure + */ + +select {color: black;} + +/* Extra markup and styles for table-esque vertical and horizontal centering */ +.site-wrapper { + display: table; + width: 100%; + height: 100%; /* For at least Firefox */ + min-height: 100%; + -webkit-box-shadow: inset 0 0 100px rgba(0,0,0,.5); + box-shadow: inset 0 0 100px rgba(0,0,0,.5); +} +.site-wrapper-inner { + display: table-cell; + vertical-align: top; +} +.cover-container { + margin-right: auto; + margin-left: auto; +} + +/* Padding for spacing */ +/* .inner { + padding: 30px; +} */ + + +/* + * Header + */ +.masthead{ + background-color: #1d80e2; + height:150px; + overflow:hidden; + z-index:100; +} +/* .masthead-brand { + margin-top: 0px !important; +} */ +.masthead .wrap{ + -webkit-box-shadow: inset 0 0 100px rgba(0,0,0,.5); + box-shadow: inset 0 0 100px rgba(0,0,0,.5); + height:200px; +} + +.masthead .inner{ + /* padding:0 20px 0 60px; */ +} + +.masthead-brand { + margin-top: 0px; + padding-top: 0.5em; + margin-bottom: 0em; +} + +ul { + list-style-type: none; +} + +.masthead-nav > li { + display: inline-block; +} +.masthead-nav > li + li { + margin-left: 0.5em; +} +.masthead-nav > li > a { + padding-right: 0; + padding-left: 0; + font-size: 16px; + font-weight: bold; + color: #fff; /* IE8 proofing */ + color: rgba(255,255,255,.75); + border-bottom: 2px solid transparent; +} +.masthead-nav > li > a:hover, +.masthead-nav > li > a:focus { + background-color: transparent; + border-bottom-color: #a9a9a9; + border-bottom-color: rgba(255,255,255,.25); +} +.masthead-nav > .active > a, +.masthead-nav > .active > a:hover, +.masthead-nav > .active > a:focus { + color: #fff; + border-bottom-color: #fff; +} + +@media (min-width: 768px) { + .masthead{ + height:100px; + } + .masthead-brand { + float: left; + } + .masthead-nav { + margin-top: 1em; + float: right; + } +} + +/* + * Cover + */ + +.cover .btn-lg { + /* padding: 10px 20px; */ + font-weight: bold; +} + +.cover .btn-lg.linkBtn>a { + padding: 10px 20px; +} + +/* + * Footer + */ + +.mastfoot { + font-size: 0.6em; + color: #999; /* IE8 proofing */ + color: rgba(255,255,255,.5); + /* z-index: -1; */ +} + + +/* + * Affix and center + */ + +@media (min-width: 768px) { + /* Pull out the header and footer */ + .masthead { + position: fixed; + top: 0; + left: 0; + } + .mastfoot { + position: fixed; + bottom: 0; + } + /* Start the vertical centering */ + .site-wrapper-inner { + vertical-align: middle; + } + /* Handle the widths */ + .masthead, + .mastfoot, + .cover-container { + width: 100%; /* Must be percentage or pixels for horizontal alignment */ + } + .cover-container { + width: 700px; + } + .cover { + padding: 100px 1em 1em 1em !important; + } + +} + +@media (min-width: 992px) { + .masterhead { + padding: 1em; + } + .masthead .inner{ + margin: 0 auto; + } + .masthead .inner, + .mastfoot, + .cover-container { + width: 700px; + } + .cover { + padding: 100px 1em 1em 1em !important; + } +} + +.btn-active { + color: #fff; + background-color: #333; + border-color: #d58512; +} + +.btn-disabled { + color: #fff; + background-color: #696969; + border-color: #4cae4c; +} + +.slider { + margin-right:1em; + margin-left: 1em; +} + +.slider-selection { + background: #BABABA; +} + +.slider.slider-horizontal { + width:20% !important; +} + +.aml_op .del { + color:red; +} + +div.padOp {display:inline-block;} + +li.linkBtn {padding:0;} +li.linkBtn>a {display:block;margin:0;} + +.btn-space { + padding-left:0.5em; + padding-right:0.5em; +} diff --git a/examples/esp8266_WebMenu/WebMenu/data/1.5/menu.xslt b/examples/esp8266_WebMenu/WebMenu/data/1.5/menu.xslt new file mode 100644 index 00000000..17884ad6 --- /dev/null +++ b/examples/esp8266_WebMenu/WebMenu/data/1.5/menu.xslt @@ -0,0 +1,91 @@ + + + + + + + + http://neurux:8080/ + + + + + + + + + + + + + + ArduinoMenu<web> + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +

    + r-site.net +

    + +
    +
    +
    +
    + +
    + +
    +
    +

    ArduinoMenu library https://github.com/neu-rah/ArduinoMenu.

    +
    +
    +
    +
    +
    + + +
    + +
    diff --git a/examples/esp8266_WebMenu/WebMenu/data/1.5/r-site.js b/examples/esp8266_WebMenu/WebMenu/data/1.5/r-site.js new file mode 100644 index 00000000..9e948659 --- /dev/null +++ b/examples/esp8266_WebMenu/WebMenu/data/1.5/r-site.js @@ -0,0 +1,176 @@ +// wsSrc = sourceURL; +wsSrc=window.location.hostname; +var connection = {}; + +// alert("r-site.js loaded!"); +var lastResult=null; +var previousResult=null; + +function connectWS() { + console.log("ws://" + wsSrc + ":81/", ["arduino"]); + connection = new WebSocket("ws://" + wsSrc + ":81/", ["arduino"]); + connection.onopen = init; + connection.onerror = function(e) {console.log("WebSocket Error ", e)}; + connection.onmessage = function(e) { + try { + console.log(JSON.parse(e.data));//just for checking it + } catch(err) { + console.log("NO JSON!",e.data); + } + eval("lastResult="+e.data); + //updatePage(); + }; + return connection.readyState; +} + +function updatePage() { + if (lastResult) mkPath(lastResult);//add path info + if (lastResult==previousResult) return; + if (previousResult&&lastResult.menu.title.prompt===previousResult.menu.title.prompt) + walkStates(lastResult.menu,previousResult.menu); + previousResult=lastResult; +} + +function refreshBtn(_,o) { + var p=$(o).attr("data-src"); + var g=$(o).attr("data-grp"); + var nv=jpath(g,lastResult.menu); + if (nv.value==$(o).text()) + console.log(p,g,nv); +} + +//get a single value out a menu state page by path +//it matches the page postion and selects requested item +//so path is absolute +function jpath(p,m) { + if (m.path!=p.slice(0,m.path.length)) return; + var ps=p.slice(m.path.length).split("/").slice(1); + return _jpath(m,ps); + function _jpath(m,o) { + var i=(m.pad||m.items) + if (!i&&o.length>0) return; + return (o.length&&i)?_jpath(i[o[0]],o.slice(1)):m + } +} + +//traverses previous and last state and +//update controls of changed values +function walkStates(i,j) { + if(!(i&&j)) return; + // console.log("walking states..."); + if (i.path!=j.path) return; + // console.log("path",i.path); + if (i.field&&j.field&&i.field!=j.field) {//numeric field! + var target=$("[data-src='"+i.path+"'"); + if (target.length) { + console.log("setting new field",i.path,i.field,target); + if (target.hasClass("slider")) target.slider("setValue",i.field); + else target.val(i.field); + } + } if (i.options&&j.options&&i.value!=j.value) {//enumerated field + var nvi=i.options.indexOf(i.value); + console.log("looking for",i.path); + var target=$("[data-src='"+i.path+"/"+nvi+"']"); + if (target.length) { + console.log("clicking on button"); + target.click(); + } else { + target=$("select[data-src='"+i.path+"']"); + if (target.length) { + console.log("changing selection",i.path,i.select); + target.val(i.select); + } + + } + } + if (typeof i[Symbol.iterator] === 'function'&&typeof j[Symbol.iterator] === 'function') + for(var n=0;n5) {//give up? + alert("websocket disconnected, please refresh page");//TODO: put mutilang here + return; + } else menu(o,cnt?cnt+1:0); + },500); + return; + } + console.log("send ws",o); + return connection.send(o); +} + +function updateField(e) { + return updateField_(e.target) +} + +function updateField_(e) { + var n = $(e).attr("data-src") + "/" + e.value + String.fromCharCode(255); + menu(n); +} + +function updateLink(e) { + return updateLink_(e.target) +} + +function updateLink_(e) { + var n = $(e), + o = n.attr("data-grp"), + t = n.attr("data-src"); + // console.log("removing selections"); + $("a[data-grp='" + o + "']").removeClass("btn-primary btn-success"); + // console.log("adding selection to", e); + n.addClass("btn-primary"); + // console.log("sending: " + t); + menu(t); + // connection.send(t) +} + +function updateSelect(e) { + updateSelect_(e.target) +} + +function updateSelect_(e) { + var n = $(e).attr("data-src") + "/" + e.selectedIndex; + // console.log("sending: " + n); + menu(n); + // connection.send(n); +} + +function init() { + console.log("menu websocket server connected."); + console.log("r-site menu page script starting."); + activePanel = $(".aml_panel"); + $(".aml_op>input").removeAttr("onchange").off("change").on("change", updateField); + $(".aml_op>select").removeAttr("onchange").off("change").on("change", updateSelect); + $("a.aml_btn").removeAttr("href").off("click").on("click", updateLink); + // $(".aml_op input.ledField").removeAttr("onchange").off("change").on("change", logField); +} +$(function() { + // console.log("ready!"); + connectWS(); + $("p.out").text() && $("#outDlg").modal(); + jQuery().slider && $(".slider").slider({formatter: function(e) {return e + "%"}}); +}); diff --git a/examples/esp8266_WebMenu/WebMenu/data/bootstrap-slider.min.css b/examples/esp8266_WebMenu/WebMenu/data/bootstrap-slider.min.css new file mode 100644 index 00000000..c0234bfd --- /dev/null +++ b/examples/esp8266_WebMenu/WebMenu/data/bootstrap-slider.min.css @@ -0,0 +1,41 @@ +/*! ======================================================= + VERSION 10.0.0 +========================================================= */ +/*! ========================================================= + * bootstrap-slider.js + * + * Maintainers: + * Kyle Kemp + * - Twitter: @seiyria + * - Github: seiyria + * Rohit Kalkur + * - Twitter: @Rovolutionary + * - Github: rovolution + * + * ========================================================= + * + * bootstrap-slider is released under the MIT License + * Copyright (c) 2017 Kyle Kemp, Rohit Kalkur, and contributors + * + * 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. + * + * ========================================================= */.slider{display:inline-block;vertical-align:middle;position:relative}.slider.slider-horizontal{width:210px;height:20px}.slider.slider-horizontal .slider-track{height:10px;width:100%;margin-top:-5px;top:50%;left:0}.slider.slider-horizontal .slider-selection,.slider.slider-horizontal .slider-track-low,.slider.slider-horizontal .slider-track-high{height:100%;top:0;bottom:0}.slider.slider-horizontal .slider-tick,.slider.slider-horizontal .slider-handle{margin-left:-10px}.slider.slider-horizontal .slider-tick.triangle,.slider.slider-horizontal .slider-handle.triangle{position:relative;top:50%;-ms-transform:translateY(-50%);transform:translateY(-50%);border-width:0 10px 10px 10px;width:0;height:0;border-bottom-color:#2e6da4;margin-top:0}.slider.slider-horizontal .slider-tick-container{white-space:nowrap;position:absolute;top:0;left:0;width:100%}.slider.slider-horizontal .slider-tick-label-container{white-space:nowrap;margin-top:20px}.slider.slider-horizontal .slider-tick-label-container .slider-tick-label{padding-top:4px;display:inline-block;text-align:center}.slider.slider-horizontal .tooltip{-ms-transform:translateX(-50%);transform:translateX(-50%)}.slider.slider-horizontal.slider-rtl .slider-track{left:initial;right:0}.slider.slider-horizontal.slider-rtl .slider-tick,.slider.slider-horizontal.slider-rtl .slider-handle{margin-left:initial;margin-right:-10px}.slider.slider-horizontal.slider-rtl .slider-tick-container{left:initial;right:0}.slider.slider-horizontal.slider-rtl .tooltip{-ms-transform:translateX(50%);transform:translateX(50%)}.slider.slider-vertical{height:210px;width:20px}.slider.slider-vertical .slider-track{width:10px;height:100%;left:25%;top:0}.slider.slider-vertical .slider-selection{width:100%;left:0;top:0;bottom:0}.slider.slider-vertical .slider-track-low,.slider.slider-vertical .slider-track-high{width:100%;left:0;right:0}.slider.slider-vertical .slider-tick,.slider.slider-vertical .slider-handle{margin-top:-10px}.slider.slider-vertical .slider-tick.triangle,.slider.slider-vertical .slider-handle.triangle{border-width:10px 0 10px 10px;width:1px;height:1px;border-left-color:#2e6da4;border-right-color:#2e6da4;margin-left:0;margin-right:0}.slider.slider-vertical .slider-tick-label-container{white-space:nowrap}.slider.slider-vertical .slider-tick-label-container .slider-tick-label{padding-left:4px}.slider.slider-vertical .tooltip{-ms-transform:translateY(-50%);transform:translateY(-50%)}.slider.slider-vertical.slider-rtl .slider-track{left:initial;right:25%}.slider.slider-vertical.slider-rtl .slider-selection{left:initial;right:0}.slider.slider-vertical.slider-rtl .slider-tick.triangle,.slider.slider-vertical.slider-rtl .slider-handle.triangle{border-width:10px 10px 10px 0}.slider.slider-vertical.slider-rtl .slider-tick-label-container .slider-tick-label{padding-left:initial;padding-right:4px}.slider.slider-disabled .slider-handle{background-image:-webkit-linear-gradient(top,#dfdfdf 0,#bebebe 100%);background-image:-o-linear-gradient(top,#dfdfdf 0,#bebebe 100%);background-image:linear-gradient(to bottom,#dfdfdf 0,#bebebe 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdfdfdf',endColorstr='#ffbebebe',GradientType=0)}.slider.slider-disabled .slider-track{background-image:-webkit-linear-gradient(top,#e5e5e5 0,#e9e9e9 100%);background-image:-o-linear-gradient(top,#e5e5e5 0,#e9e9e9 100%);background-image:linear-gradient(to bottom,#e5e5e5 0,#e9e9e9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe5e5e5',endColorstr='#ffe9e9e9',GradientType=0);cursor:not-allowed}.slider input{display:none}.slider .tooltip.top{margin-top:-36px}.slider .tooltip-inner{white-space:nowrap;max-width:none}.slider .hide{display:none}.slider-track{position:absolute;cursor:pointer;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#f9f9f9 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#f9f9f9 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#f9f9f9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);border-radius:4px}.slider-selection{position:absolute;background-image:-webkit-linear-gradient(top,#f9f9f9 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#f9f9f9 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#f9f9f9 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-radius:4px}.slider-selection.tick-slider-selection{background-image:-webkit-linear-gradient(top,#8ac1ef 0,#82b3de 100%);background-image:-o-linear-gradient(top,#8ac1ef 0,#82b3de 100%);background-image:linear-gradient(to bottom,#8ac1ef 0,#82b3de 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff8ac1ef',endColorstr='#ff82b3de',GradientType=0)}.slider-track-low,.slider-track-high{position:absolute;background:transparent;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-radius:4px}.slider-handle{position:absolute;top:0;width:20px;height:20px;background-color:#337ab7;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7',endColorstr='#ff2e6da4',GradientType=0);filter:none;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);border:0 solid transparent}.slider-handle.round{border-radius:50%}.slider-handle.triangle{background:transparent none}.slider-handle.custom{background:transparent none}.slider-handle.custom::before{line-height:20px;font-size:20px;content:'\2605';color:#726204}.slider-tick{position:absolute;width:20px;height:20px;background-image:-webkit-linear-gradient(top,#f9f9f9 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#f9f9f9 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#f9f9f9 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;filter:none;opacity:.8;border:0 solid transparent}.slider-tick.round{border-radius:50%}.slider-tick.triangle{background:transparent none}.slider-tick.custom{background:transparent none}.slider-tick.custom::before{line-height:20px;font-size:20px;content:'\2605';color:#726204}.slider-tick.in-selection{background-image:-webkit-linear-gradient(top,#8ac1ef 0,#82b3de 100%);background-image:-o-linear-gradient(top,#8ac1ef 0,#82b3de 100%);background-image:linear-gradient(to bottom,#8ac1ef 0,#82b3de 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff8ac1ef',endColorstr='#ff82b3de',GradientType=0);opacity:1} diff --git a/examples/esp8266_WebMenu/WebMenu/data/bootstrap-slider.min.js b/examples/esp8266_WebMenu/WebMenu/data/bootstrap-slider.min.js new file mode 100644 index 00000000..bd11ca85 --- /dev/null +++ b/examples/esp8266_WebMenu/WebMenu/data/bootstrap-slider.min.js @@ -0,0 +1,5 @@ +/*! ======================================================= + VERSION 10.0.0 +========================================================= */ +"use strict";var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},windowIsDefined="object"===("undefined"==typeof window?"undefined":_typeof(window));!function(a){if("function"==typeof define&&define.amd)define(["jquery"],a);else if("object"===("undefined"==typeof module?"undefined":_typeof(module))&&module.exports){var b;try{b=require("jquery")}catch(c){b=null}module.exports=a(b)}else window&&(window.Slider=a(window.jQuery))}(function(a){var b="slider",c="bootstrapSlider";windowIsDefined&&!window.console&&(window.console={}),windowIsDefined&&!window.console.log&&(window.console.log=function(){}),windowIsDefined&&!window.console.warn&&(window.console.warn=function(){});var d;return function(a){function b(){}function c(a){function c(b){b.prototype.option||(b.prototype.option=function(b){a.isPlainObject(b)&&(this.options=a.extend(!0,this.options,b))})}function e(b,c){a.fn[b]=function(e){if("string"==typeof e){for(var g=d.call(arguments,1),h=0,i=this.length;i>h;h++){var j=this[h],k=a.data(j,b);if(k)if(a.isFunction(k[e])&&"_"!==e.charAt(0)){var l=k[e].apply(k,g);if(void 0!==l&&l!==k)return l}else f("no such method '"+e+"' for "+b+" instance");else f("cannot call methods on "+b+" prior to initialization; attempted to call '"+e+"'")}return this}var m=this.map(function(){var d=a.data(this,b);return d?(d.option(e),d._init()):(d=new c(this,e),a.data(this,b,d)),a(this)});return!m||m.length>1?m:m[0]}}if(a){var f="undefined"==typeof console?b:function(a){console.error(a)};return a.bridget=function(a,b){c(b),e(a,b)},a.bridget}}var d=Array.prototype.slice;c(a)}(a),function(a){function e(b,c){function d(a,b){var c="data-slider-"+b.replace(/_/g,"-"),d=a.getAttribute(c);try{return JSON.parse(d)}catch(e){return d}}this._state={value:null,enabled:null,offset:null,size:null,percentage:null,inDrag:!1,over:!1},this.ticksCallbackMap={},this.handleCallbackMap={},"string"==typeof b?this.element=document.querySelector(b):b instanceof HTMLElement&&(this.element=b),c=c?c:{};for(var e=Object.keys(this.defaultOptions),f=0;f0)for(var t=0;t0){for(this.ticksContainer=document.createElement("div"),this.ticksContainer.className="slider-tick-container",f=0;f0)for(this.tickLabelContainer=document.createElement("div"),this.tickLabelContainer.className="slider-tick-label-container",f=0;f0&&(this.options.max=Math.max.apply(Math,this.options.ticks),this.options.min=Math.min.apply(Math,this.options.ticks)),Array.isArray(this.options.value)?(this.options.range=!0,this._state.value=this.options.value):this.options.range?this._state.value=[this.options.value,this.options.max]:this._state.value=this.options.value,this.trackLow=k||this.trackLow,this.trackSelection=j||this.trackSelection,this.trackHigh=l||this.trackHigh,"none"===this.options.selection?(this._addClass(this.trackLow,"hide"),this._addClass(this.trackSelection,"hide"),this._addClass(this.trackHigh,"hide")):("after"===this.options.selection||"before"===this.options.selection)&&(this._removeClass(this.trackLow,"hide"),this._removeClass(this.trackSelection,"hide"),this._removeClass(this.trackHigh,"hide")),this.handle1=m||this.handle1,this.handle2=n||this.handle2,p===!0)for(this._removeClass(this.handle1,"round triangle"),this._removeClass(this.handle2,"round triangle hide"),f=0;f0){for(var d,e,f,g=0,h=1;hthis.options.max?this.options.max:k},toPercentage:function(a){if(this.options.max===this.options.min)return 0;if(this.options.ticks_positions.length>0){for(var b,c,d,e=0,f=0;f0?this.options.ticks[f-1]:0,d=f>0?this.options.ticks_positions[f-1]:0,c=this.options.ticks[f],e=this.options.ticks_positions[f];break}if(f>0){var g=(a-b)/(c-b);return d+g*(e-d)}}return 100*(a-this.options.min)/(this.options.max-this.options.min)}},logarithmic:{toValue:function(a){var b=0===this.options.min?0:Math.log(this.options.min),c=Math.log(this.options.max),d=Math.exp(b+(c-b)*a/100);return Math.round(d)===this.options.max?this.options.max:(d=this.options.min+Math.round((d-this.options.min)/this.options.step)*this.options.step,dthis.options.max?this.options.max:d)},toPercentage:function(a){if(this.options.max===this.options.min)return 0;var b=Math.log(this.options.max),c=0===this.options.min?0:Math.log(this.options.min),d=0===a?0:Math.log(a);return 100*(d-c)/(b-c)}}};if(d=function(a,b){return e.call(this,a,b),this},d.prototype={_init:function(){},constructor:d,defaultOptions:{id:"",min:0,max:10,step:1,precision:0,orientation:"horizontal",value:5,range:!1,selection:"before",tooltip:"show",tooltip_split:!1,handle:"round",reversed:!1,rtl:"auto",enabled:!0,formatter:function(a){return Array.isArray(a)?a[0]+" : "+a[1]:a},natural_arrow_keys:!1,ticks:[],ticks_positions:[],ticks_labels:[],ticks_snap_bounds:0,ticks_tooltip:!1,scale:"linear",focus:!1,tooltip_position:null,labelledby:null,rangeHighlights:[]},getElement:function(){return this.sliderElem},getValue:function(){return this.options.range?this._state.value:this._state.value[0]},setValue:function(a,b,c){a||(a=0);var d=this.getValue();this._state.value=this._validateInputValue(a);var e=this._applyPrecision.bind(this);this.options.range?(this._state.value[0]=e(this._state.value[0]),this._state.value[1]=e(this._state.value[1]),this._state.value[0]=Math.max(this.options.min,Math.min(this.options.max,this._state.value[0])),this._state.value[1]=Math.max(this.options.min,Math.min(this.options.max,this._state.value[1]))):(this._state.value=e(this._state.value),this._state.value=[Math.max(this.options.min,Math.min(this.options.max,this._state.value))],this._addClass(this.handle2,"hide"),"after"===this.options.selection?this._state.value[1]=this.options.max:this._state.value[1]=this.options.min),this.options.max>this.options.min?this._state.percentage=[this._toPercentage(this._state.value[0]),this._toPercentage(this._state.value[1]),100*this.options.step/(this.options.max-this.options.min)]:this._state.percentage=[0,0,100],this._layout();var f=this.options.range?this._state.value:this._state.value[0];return this._setDataVal(f),b===!0&&this._trigger("slide",f),d!==f&&c===!0&&this._trigger("change",{oldValue:d,newValue:f}),this},destroy:function(){this._removeSliderEventHandlers(),this.sliderElem.parentNode.removeChild(this.sliderElem),this.element.style.display="",this._cleanUpEventCallbacksMap(),this.element.removeAttribute("data"),a&&(this._unbindJQueryEventHandlers(),this.$element.removeData("slider"))},disable:function(){return this._state.enabled=!1,this.handle1.removeAttribute("tabindex"),this.handle2.removeAttribute("tabindex"),this._addClass(this.sliderElem,"slider-disabled"),this._trigger("slideDisabled"),this},enable:function(){return this._state.enabled=!0,this.handle1.setAttribute("tabindex",0),this.handle2.setAttribute("tabindex",0),this._removeClass(this.sliderElem,"slider-disabled"),this._trigger("slideEnabled"),this},toggle:function(){return this._state.enabled?this.disable():this.enable(),this},isEnabled:function(){return this._state.enabled},on:function(a,b){return this._bindNonQueryEventHandler(a,b),this},off:function(b,c){a?(this.$element.off(b,c),this.$sliderElem.off(b,c)):this._unbindNonQueryEventHandler(b,c)},getAttribute:function(a){return a?this.options[a]:this.options},setAttribute:function(a,b){return this.options[a]=b,this},refresh:function(){return this._removeSliderEventHandlers(),e.call(this,this.element,this.options),a&&a.data(this.element,"slider",this),this},relayout:function(){return this._resize(),this._layout(),this},_removeSliderEventHandlers:function(){if(this.handle1.removeEventListener("keydown",this.handle1Keydown,!1),this.handle2.removeEventListener("keydown",this.handle2Keydown,!1),this.options.ticks_tooltip){for(var a=this.ticksContainer.getElementsByClassName("slider-tick"),b=0;b=0?c:this.attributes["aria-valuenow"].value,e=parseInt(d,10);b.value[0]=e,b.percentage[0]=a.options.ticks_positions[e],a._setToolTipOnMouseOver(b),a._showTooltip()};return b.addEventListener("mouseenter",d,!1),d},addMouseLeave:function(a,b){var c=function(){a._hideTooltip()};return b.addEventListener("mouseleave",c,!1),c}}},_layout:function(){var a;if(a=this.options.reversed?[100-this._state.percentage[0],this.options.range?100-this._state.percentage[1]:this._state.percentage[1]]:[this._state.percentage[0],this._state.percentage[1]],this.handle1.style[this.stylePos]=a[0]+"%",this.handle1.setAttribute("aria-valuenow",this._state.value[0]),isNaN(this.options.formatter(this._state.value[0]))&&this.handle1.setAttribute("aria-valuetext",this.options.formatter(this._state.value[0])),this.handle2.style[this.stylePos]=a[1]+"%",this.handle2.setAttribute("aria-valuenow",this._state.value[1]),isNaN(this.options.formatter(this._state.value[1]))&&this.handle2.setAttribute("aria-valuetext",this.options.formatter(this._state.value[1])),this.rangeHighlightElements.length>0&&Array.isArray(this.options.rangeHighlights)&&this.options.rangeHighlights.length>0)for(var b=0;b0){var g,h="vertical"===this.options.orientation?"height":"width";g="vertical"===this.options.orientation?"marginTop":this.options.rtl?"marginRight":"marginLeft";var i=this._state.size/(this.options.ticks.length-1);if(this.tickLabelContainer){var j=0;if(0===this.options.ticks_positions.length)"vertical"!==this.options.orientation&&(this.tickLabelContainer.style[g]=-i/2+"px"),j=this.tickLabelContainer.offsetHeight;else for(k=0;kj&&(j=this.tickLabelContainer.childNodes[k].offsetHeight);"horizontal"===this.options.orientation&&(this.sliderElem.style.marginBottom=j+"px")}for(var k=0;k=a[0]&&l<=a[1]&&this._addClass(this.ticks[k],"in-selection"):"after"===this.options.selection&&l>=a[0]?this._addClass(this.ticks[k],"in-selection"):"before"===this.options.selection&&l<=a[0]&&this._addClass(this.ticks[k],"in-selection"),this.tickLabels[k]&&(this.tickLabels[k].style[h]=i+"px","vertical"!==this.options.orientation&&void 0!==this.options.ticks_positions[k]?(this.tickLabels[k].style.position="absolute",this.tickLabels[k].style[this.stylePos]=l+"%",this.tickLabels[k].style[g]=-i/2+"px"):"vertical"===this.options.orientation&&(this.options.rtl?this.tickLabels[k].style.marginRight=this.sliderElem.offsetWidth+"px":this.tickLabels[k].style.marginLeft=this.sliderElem.offsetWidth+"px",this.tickLabelContainer.style[g]=this.sliderElem.offsetWidth/2*-1+"px"))}}var m;if(this.options.range){m=this.options.formatter(this._state.value),this._setText(this.tooltipInner,m),this.tooltip.style[this.stylePos]=(a[1]+a[0])/2+"%";var n=this.options.formatter(this._state.value[0]);this._setText(this.tooltipInner_min,n);var o=this.options.formatter(this._state.value[1]);this._setText(this.tooltipInner_max,o),this.tooltip_min.style[this.stylePos]=a[0]+"%",this.tooltip_max.style[this.stylePos]=a[1]+"%"}else m=this.options.formatter(this._state.value[0]),this._setText(this.tooltipInner,m),this.tooltip.style[this.stylePos]=a[0]+"%";if("vertical"===this.options.orientation)this.trackLow.style.top="0",this.trackLow.style.height=Math.min(a[0],a[1])+"%",this.trackSelection.style.top=Math.min(a[0],a[1])+"%",this.trackSelection.style.height=Math.abs(a[0]-a[1])+"%",this.trackHigh.style.bottom="0",this.trackHigh.style.height=100-Math.min(a[0],a[1])-Math.abs(a[0]-a[1])+"%";else{"right"===this.stylePos?this.trackLow.style.right="0":this.trackLow.style.left="0",this.trackLow.style.width=Math.min(a[0],a[1])+"%","right"===this.stylePos?this.trackSelection.style.right=Math.min(a[0],a[1])+"%":this.trackSelection.style.left=Math.min(a[0],a[1])+"%",this.trackSelection.style.width=Math.abs(a[0]-a[1])+"%","right"===this.stylePos?this.trackHigh.style.left="0":this.trackHigh.style.right="0",this.trackHigh.style.width=100-Math.min(a[0],a[1])-Math.abs(a[0]-a[1])+"%";var p=this.tooltip_min.getBoundingClientRect(),q=this.tooltip_max.getBoundingClientRect();"bottom"===this.options.tooltip_position?p.right>q.left?(this._removeClass(this.tooltip_max,"bottom"),this._addClass(this.tooltip_max,"top"),this.tooltip_max.style.top="",this.tooltip_max.style.bottom="22px"):(this._removeClass(this.tooltip_max,"top"),this._addClass(this.tooltip_max,"bottom"),this.tooltip_max.style.top=this.tooltip_min.style.top,this.tooltip_max.style.bottom=""):p.right>q.left?(this._removeClass(this.tooltip_max,"top"),this._addClass(this.tooltip_max,"bottom"),this.tooltip_max.style.top="18px"):(this._removeClass(this.tooltip_max,"bottom"),this._addClass(this.tooltip_max,"top"),this.tooltip_max.style.top=this.tooltip_min.style.top)}},_createHighlightRange:function(a,b){return this._isHighlightRange(a,b)?a>b?{start:b,size:a-b}:{start:a,size:b-a}:null},_isHighlightRange:function(a,b){return a>=0&&100>=a&&b>=0&&100>=b?!0:!1},_resize:function(a){this._state.offset=this._offset(this.sliderElem),this._state.size=this.sliderElem[this.sizePos],this._layout()},_removeProperty:function(a,b){a.style.removeProperty?a.style.removeProperty(b):a.style.removeAttribute(b)},_mousedown:function(a){if(!this._state.enabled)return!1;this._state.offset=this._offset(this.sliderElem),this._state.size=this.sliderElem[this.sizePos];var b=this._getPercentage(a);if(this.options.range){var c=Math.abs(this._state.percentage[0]-b),d=Math.abs(this._state.percentage[1]-b);this._state.dragged=d>c?0:1,this._adjustPercentageForRangeSliders(b)}else this._state.dragged=0;this._state.percentage[this._state.dragged]=b,this._layout(),this.touchCapable&&(document.removeEventListener("touchmove",this.mousemove,!1),document.removeEventListener("touchend",this.mouseup,!1)),this.mousemove&&document.removeEventListener("mousemove",this.mousemove,!1),this.mouseup&&document.removeEventListener("mouseup",this.mouseup,!1),this.mousemove=this._mousemove.bind(this),this.mouseup=this._mouseup.bind(this),this.touchCapable&&(document.addEventListener("touchmove",this.mousemove,!1),document.addEventListener("touchend",this.mouseup,!1)),document.addEventListener("mousemove",this.mousemove,!1),document.addEventListener("mouseup",this.mouseup,!1),this._state.inDrag=!0;var e=this._calculateValue();return this._trigger("slideStart",e),this._setDataVal(e),this.setValue(e,!1,!0),a.returnValue=!1,this.options.focus&&this._triggerFocusOnHandle(this._state.dragged),!0},_touchstart:function(a){if(void 0===a.changedTouches)return void this._mousedown(a);var b=a.changedTouches[0];this.touchX=b.pageX,this.touchY=b.pageY},_triggerFocusOnHandle:function(a){0===a&&this.handle1.focus(),1===a&&this.handle2.focus()},_keydown:function(a,b){if(!this._state.enabled)return!1;var c;switch(b.keyCode){case 37:case 40:c=-1;break;case 39:case 38:c=1}if(c){if(this.options.natural_arrow_keys){var d="vertical"===this.options.orientation&&!this.options.reversed,e="horizontal"===this.options.orientation&&this.options.reversed;(d||e)&&(c=-c)}var f=this._state.value[a]+c*this.options.step,g=f/this.options.max*100;if(this._state.keyCtrl=a,this.options.range){this._adjustPercentageForRangeSliders(g);var h=this._state.keyCtrl?this._state.value[0]:f,i=this._state.keyCtrl?f:this._state.value[1];f=[h,i]}return this._trigger("slideStart",f),this._setDataVal(f),this.setValue(f,!0,!0),this._setDataVal(f),this._trigger("slideStop",f),this._layout(),this._pauseEvent(b),delete this._state.keyCtrl,!1}},_pauseEvent:function(a){a.stopPropagation&&a.stopPropagation(),a.preventDefault&&a.preventDefault(),a.cancelBubble=!0,a.returnValue=!1},_mousemove:function(a){if(!this._state.enabled)return!1;var b=this._getPercentage(a);this._adjustPercentageForRangeSliders(b),this._state.percentage[this._state.dragged]=b,this._layout();var c=this._calculateValue(!0);return this.setValue(c,!0,!0),!1},_touchmove:function(a){if(void 0!==a.changedTouches){var b=a.changedTouches[0],c=b.pageX-this.touchX,d=b.pageY-this.touchY;this._state.inDrag||("vertical"===this.options.orientation&&5>=c&&c>=-5&&(d>=15||-15>=d)?this._mousedown(a):5>=d&&d>=-5&&(c>=15||-15>=c)&&this._mousedown(a))}},_adjustPercentageForRangeSliders:function(a){if(this.options.range){var b=this._getNumDigitsAfterDecimalPlace(a);b=b?b-1:0;var c=this._applyToFixedAndParseFloat(a,b);0===this._state.dragged&&this._applyToFixedAndParseFloat(this._state.percentage[1],b)c?(this._state.percentage[1]=this._state.percentage[0],this._state.dragged=0):0===this._state.keyCtrl&&this._state.value[1]/this.options.max*100a&&(this._state.percentage[1]=this._state.percentage[0],this._state.keyCtrl=0,this.handle1.focus())}},_mouseup:function(){if(!this._state.enabled)return!1;this.touchCapable&&(document.removeEventListener("touchmove",this.mousemove,!1),document.removeEventListener("touchend",this.mouseup,!1)),document.removeEventListener("mousemove",this.mousemove,!1),document.removeEventListener("mouseup",this.mouseup,!1),this._state.inDrag=!1,this._state.over===!1&&this._hideTooltip();var a=this._calculateValue(!0);return this._layout(),this._setDataVal(a),this._trigger("slideStop",a),!1},_calculateValue:function(a){var b;if(this.options.range?(b=[this.options.min,this.options.max],0!==this._state.percentage[0]&&(b[0]=this._toValue(this._state.percentage[0]),b[0]=this._applyPrecision(b[0])),100!==this._state.percentage[1]&&(b[1]=this._toValue(this._state.percentage[1]),b[1]=this._applyPrecision(b[1]))):(b=this._toValue(this._state.percentage[0]),b=parseFloat(b),b=this._applyPrecision(b)),a){for(var c=[b,1/0],d=0;d #include +#include // #include using namespace Menu; @@ -14,8 +15,8 @@ int test=55; template class leadsField:public menuField { public: - leadsField(const menuFieldShadow& shadow):menuField(shadow) {} - Used printTo(navRoot &root,bool sel,menuOut& out, idx_t idx,idx_t len) { + using menuField::menuField; + Used printTo(navRoot &root,bool sel,menuOut& out, idx_t idx,idx_t len,idx_t panelNr=0) override { menuField::reflex=menuField::target(); prompt::printTo(root,sel,out,idx,len); bool ed=this==root.navFocus; @@ -38,12 +39,14 @@ MENU(mainMenu,"Main menu",doNothing,noEvent,wrapStyle #define MAX_DEPTH 1 +serialIn serial(Serial); + MENU_OUTPUTS(out,MAX_DEPTH ,SERIAL_OUT(Serial) ,NONE//must have 2 items at least ); -NAVROOT(nav,mainMenu,MAX_DEPTH,Serial,out); +NAVROOT(nav,mainMenu,MAX_DEPTH,serial,out); void setup() { Serial.begin(115200); diff --git a/examples/fieldFormat/platformio.ini b/examples/fieldFormat/platformio.ini index 2cde9488..02ff00f9 100644 --- a/examples/fieldFormat/platformio.ini +++ b/examples/fieldFormat/platformio.ini @@ -12,19 +12,19 @@ src_dir=fieldFormat lib_dir=~/Arduino/Libraries -[env:esp12e] -platform = espressif8266 -board = esp12e -framework = arduino -upload_speed=921600 -build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro-redefined -lstdc++ -DDEBUG -DNOTRACE +; [env:esp12e] +; platform = espressif8266 +; board = esp12e +; framework = arduino +; upload_speed=921600 +; build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro-redefined -lstdc++ -DDEBUG -DNOTRACE -; [env:nanoatmega328] -; platform=atmelavr -; board=nanoatmega328 -; framework=arduino -; upload_port=/dev/ttyUSB* -; upload_flags=-V +[env:nanoatmega328] +platform=atmelavr +board=nanoatmega328 +framework=arduino +upload_port=/dev/ttyUSB* +upload_flags=-V ; build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro-redefined -DDEBUG -DMENU_USERAM ; [env:teensy31] diff --git a/examples/fullIdle/fullIdle/fullIdle.ino b/examples/fullIdle/fullIdle/fullIdle.ino new file mode 100644 index 00000000..b64081f3 --- /dev/null +++ b/examples/fullIdle/fullIdle/fullIdle.ino @@ -0,0 +1,100 @@ +/******************** +Arduino generic menu system +using menu idle to do complex tasks + +Rui Azevedo - ruihfazevedo(@rrob@)gmail.com + +output: Serial +input: Serial +*/ + +#include +#include +#include + +using namespace Menu; + +MENU(mainMenu,"Main menu",doNothing,noEvent,wrapStyle + ,OP("Op1",doNothing,noEvent) + ,OP("Op2",doNothing,noEvent) + ,EXIT(" +struct Tick { + inline operator bool() { + return millis()>=next?next+=step,true:false; + } + inline void reset() {next=millis()+step;} +protected: + unsigned long next=0; +}; + +//FPS as boolean +// this is an FPS limiter +//return `true` `fps` times per second (max) +//note: this can skip a frame at millis wrap (every 50days ;)) +template +struct FPS:public Tick<(1000/fps)> {}; +//----------------------------------------------------- + +FPS<25> menuFPS;//limit menu pool to 25 frames per second +Tick<10000> idleTimeout; + +result idle(menuOut &o, idleEvent e) { + // o.clear(); + switch(e) { + case idleStart: + o.println("suspending menu!"); + idleTimeout.reset(); + break; + case idleEnd: + o.println("resuming menu."); + // nav.reset(); clear nav state if desired + break; + default:break; + } + return proceed; +} + +void setup() { + Serial.begin(115200); + while(!Serial); + Serial.println("menu 4.x test");Serial.flush(); + nav.timeOut=5;//made very short for demo purposes + nav.idleTask=idle;//point a function to be used when menu is suspended + // nav.idleOn();//this menu will start on idle state, press select to enter menu +} + +void loop() { + if(nav.sleepTask) { + //do your own idle state stuff here + //.... + //we can now use encoder, buttons, serial, display or whatever input/output we have + // because menu is 100% dormant + + //call `nav.idleOff()` to terminate the idle when some condition is met + //... here using a timeout because we have no buttons + Serial.write(Serial.available()?(char)Serial.read():'.'); + delay(200); + if(idleTimeout) { + Serial.println(); + Serial.println("Terminating full idle by timeout!"); + Serial.println(); + nav.idleOff(); + } + } else if(menuFPS) nav.poll(); +} diff --git a/examples/fullIdle/include/README b/examples/fullIdle/include/README new file mode 100644 index 00000000..194dcd43 --- /dev/null +++ b/examples/fullIdle/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/examples/fullIdle/platformio.ini b/examples/fullIdle/platformio.ini new file mode 100644 index 00000000..432c5bcf --- /dev/null +++ b/examples/fullIdle/platformio.ini @@ -0,0 +1,71 @@ +[platformio] +src_dir=fullIdle +; lib_dir=~/Arduino/Libraries + +; [env:yun] +; platform = atmelavr +; board=yun +; framework = arduino +; build_flags = -DNODEBUG +; +; [env:mzeropro] +; platform = atmelsam +; board=mzeropro +; framework = arduino +; build_flags = -DNODEBUG +; +; [env:mzeroproUSB] +; platform = atmelsam +; board=mzeroproUSB +; framework = arduino +; build_flags = -DNODEBUG +; +; [env:mzeroUSB] +; platform = atmelsam +; board=mzeroUSB +; framework = arduino +; build_flags = -DNODEBUG +; +[env:nanoatmega328] +platform = atmelavr +board = nanoatmega328new +framework = arduino +upload_port=/dev/ttyUSB* +upload_flags=-V +build_flags = -DNO_MENU_DEBUG -Wno-strict-aliasing -Wno-sign-compare -Wno-write-strings +; +; [env:teensy31] +; platform = teensy +; board = teensy31 +; framework = arduino +; build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro-redefined -lstdc++ +; +; [env:due] +; platform = atmelsam +; board = due +; framework = arduino +; build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro-redefined -DNODEBUG -DNOTRACE +; +; [env:esp01_1m] +; platform = espressif8266 +; board = esp01_1m +; framework = arduino +; build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro-redefined -lstdc++ +; +; [env:uno] +; platform = atmelavr +; board = uno +; framework = arduino +; upload_speed=921600 +; build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro-redefined -lstdc++ -DDEBUG + +; [env:uno] +; platform = atmelavr +; board = uno +; framework = arduino +; +; [env:redbear_blenano2] +; platform = nordicnrf52 +; board = redbear_blenano2 +; framework = arduino +; build_flags =-DNODEBUG -DARDUINO=10805 diff --git a/examples/fullIdle/test/README b/examples/fullIdle/test/README new file mode 100644 index 00000000..df5066e6 --- /dev/null +++ b/examples/fullIdle/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html diff --git a/examples/handlers/handlers/handlers.ino b/examples/handlers/handlers/handlers.ino new file mode 100644 index 00000000..1617ce97 --- /dev/null +++ b/examples/handlers/handlers/handlers.ino @@ -0,0 +1,211 @@ +/******************** +Arduino generic menu system +printing events and navigation info + +Rui Azevedo - ruihfazevedo(@rrob@)gmail.com + +output: Serial +input: Serial +*/ + +#include +#include +#include + +using namespace Menu; + +#define LEDPIN LED_BUILTIN + +void showPath(navRoot& root) { + Serial.print("nav level:"); + Serial.print(root.level); + Serial.print(" path:["); + for(int n=0;n<=root.level;n++) { + Serial.print(n?",":""); + Serial.print(root.path[n].sel); + } + Serial.println("]"); +} + +result showEvent(eventMask e,navNode& nav,prompt& item) { + Serial.println(); + Serial.println("========"); + Serial.print("Event for target: 0x"); + Serial.println((long)nav.target,HEX); + showPath(*nav.root); + Serial.print(e); + switch(e) { + case noEvent://just ignore all stuff + Serial.println(" noEvent");break; + case activateEvent://this item is about to be active (system event) + Serial.println(" activateEvent");break; + case enterEvent://entering navigation level (this menu is now active) + Serial.println(" enterEvent");break; + case exitEvent://leaving navigation level + Serial.println(" exitEvent");break; + case returnEvent://TODO:entering previous level (return) + Serial.println(" returnEvent");break; + case focusEvent://element just gained focus + Serial.println(" focusEvent");break; + case blurEvent://element about to lose focus + Serial.println(" blurEvent");break; + case selFocusEvent://TODO:child just gained focus + Serial.println(" selFocusEvent");break; + case selBlurEvent://TODO:child about to lose focus + Serial.println(" selBlurEvent");break; + case updateEvent://Field value has been updated + Serial.println(" updateEvent");break; + case anyEvent: + Serial.println(" anyEvent");break; + } + return proceed; +} + +float test=55; + +int ledCtrl=LOW; + +result myLedOn() { + ledCtrl=HIGH; + return proceed; +} +result myLedOff() { + ledCtrl=LOW; + return proceed; +} + +TOGGLE(ledCtrl,setLed,"Led: ",showEvent,anyEvent,noStyle//,doExit,enterEvent,noStyle + ,VALUE("On",HIGH,showEvent,anyEvent) + ,VALUE("Off",LOW,showEvent,anyEvent) +); + +int selTest=0; +SELECT(selTest,selMenu,"Select",showEvent,anyEvent,noStyle + ,VALUE("Zero",0,showEvent,anyEvent) + ,VALUE("One",1,showEvent,anyEvent) + ,VALUE("Two",2,showEvent,anyEvent) +); + +int chooseTest=-1; +CHOOSE(chooseTest,chooseMenu,"Choose",showEvent,anyEvent,noStyle + ,VALUE("First",1,showEvent,anyEvent) + ,VALUE("Second",2,showEvent,anyEvent) + ,VALUE("Third",3,showEvent,anyEvent) + ,VALUE("Last",-1,showEvent,anyEvent) +); + +//customizing a prompt look! +//by extending the prompt class +class altPrompt:public prompt { +public: + // altPrompt(constMEM promptShadow& p):prompt(p) {} + using prompt::prompt; + Used printTo(navRoot &root,bool sel,menuOut& out, idx_t idx,idx_t len,idx_t) override { + return out.printRaw(F("special prompt!"),len); + } +}; + +MENU(subMenu,"Sub-Menu",showEvent,anyEvent,noStyle + ,OP("Sub1",showEvent,anyEvent) + ,OP("Sub2",showEvent,anyEvent) + ,OP("Sub3",showEvent,anyEvent) + ,altOP(altPrompt,"",showEvent,anyEvent) + ,EXIT("::menuField,test,"Test","%",0,100,1,0.001,showEvent,anyEvent,wrapStyle) + ,SUBMENU(subMenu) + ,SUBMENU(setLed) + ,OP("LED On",myLedOn,enterEvent) + ,OP("LED Off",myLedOff,enterEvent) + ,SUBMENU(selMenu) + ,SUBMENU(chooseMenu) + ,OP("Alert test",doAlert,enterEvent) + ,EDIT("Name",name,alphaNumMask,showEvent,anyEvent,noStyle) + ,EDIT("Hex",buf1,hexNr,showEvent,anyEvent,noStyle) + ,SUBMENU(birthDate) + ,EXIT(" colors[] MEMMODE={ +const colorDef colors[6] MEMMODE={ {{0,0},{0,1,1}},//bgColor {{1,1},{1,0,0}},//fgColor {{1,1},{1,0,0}},//valColor @@ -109,17 +109,17 @@ uint16_t mins=0; //define a pad style menu (single line menu) //here with a set of fields to enter a date in YYYY/MM/DD format -altMENU(menu,time,"Time",doNothing,noEvent,noStyle,(systemStyles)(_asPad|Menu::_menuData|Menu::_canNav|_parentDraw) +altMENU(menu,timeMenu,"Time",doNothing,noEvent,noStyle,(systemStyles)(_asPad|Menu::_menuData|Menu::_canNav|_parentDraw) ,FIELD(hrs,"",":",0,11,1,0,doNothing,noEvent,noStyle) ,FIELD(mins,"","",0,59,10,1,doNothing,noEvent,wrapStyle) ); -char* constMEM hexDigit MEMMODE="0123456789ABCDEF"; -char* constMEM hexNr[] MEMMODE={hexDigit}; +const char* constMEM hexDigit MEMMODE="0123456789ABCDEF"; +const char* constMEM hexNr[] MEMMODE={hexDigit}; char buf1[]="0000"; -char* constMEM alphaNum MEMMODE=" 0123456789.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz,\\|!\"#$%&/()=?~*^+-{}[]€"; -char* constMEM alphaNumMask[] MEMMODE={alphaNum}; +const char* constMEM alphaNum MEMMODE=" 0123456789.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz,\\|!\"#$%&/()=?~*^+-{}[]€"; +const char* constMEM alphaNumMask[] MEMMODE={alphaNum}; char name[]=" "; MENU(mainMenu,"Main menu",doNothing,noEvent,wrapStyle @@ -127,7 +127,7 @@ MENU(mainMenu,"Main menu",doNothing,noEvent,wrapStyle ,OP("Op2",doNothing,noEvent) ,FIELD(test,"Test","%",0,100,10,1,doNothing,noEvent,wrapStyle) ,EDIT("Name",name,alphaNumMask,doNothing,noEvent,noStyle) - ,SUBMENU(time) + ,SUBMENU(timeMenu) ,SUBMENU(subMenu) ,SUBMENU(setLed) ,OP("LED On",myLedOn,enterEvent) diff --git a/examples/lolin32/platformio.ini b/examples/lolin32/platformio.ini new file mode 100644 index 00000000..012b786f --- /dev/null +++ b/examples/lolin32/platformio.ini @@ -0,0 +1,9 @@ +[platformio] +src_dir=lolin32 + +[env:lolin32] +platform = espressif32 +board = lolin32 +framework=arduino +; build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro-redefined -Wno-switch +; build_unflags = -Werror=reorder diff --git a/examples/noMacros/noMacros/noMacros.ino b/examples/noMacros/noMacros/noMacros.ino index ad8c7985..1f3099dd 100644 --- a/examples/noMacros/noMacros/noMacros.ino +++ b/examples/noMacros/noMacros/noMacros.ino @@ -6,36 +6,28 @@ using namespace Menu; -#ifndef DEBUG -Print& operator<<(Print&o, Menu::prompt&p) { - print_P(o,p.getText()); - return o; -} -#endif - //define "Op 1" void op1Func(); constMEM char op1Text[] MEMMODE="Op 1"; -constMEM promptShadowRaw op1InfoRaw MEMMODE={(callback)op1Func,_noStyle,op1Text,enterEvent,noStyle}; -constMEM promptShadow& op1Info=*(promptShadow*)&op1InfoRaw; -//or just this line on non MEMMODE devices like teensy or esp8266 instead of the above three +constMEM promptShadows op1Info MEMMODE={(callback)op1Func,_noStyle,op1Text,enterEvent,noStyle}; +//or just this line on non AVR devices like teensy or esp8266 instead of the above three //promptShadow op1Info("Op 1",(callback)op1Func,enterEvent); -prompt op1(op1Info); +prompt op1(op1Info.obj); //define "Op 2" void op2Func(); constMEM char op2Text[] MEMMODE="Op 2"; -constMEM promptShadowRaw op2InfoRaw MEMMODE={(callback)op2Func,_noStyle,op2Text,enterEvent,noStyle}; -constMEM promptShadow& op2Info=*(promptShadow*)&op2InfoRaw; +constMEM promptShadows op2Info MEMMODE={(callback)op2Func,_noStyle,op2Text,enterEvent,noStyle}; +// constMEM promptShadow& op2Info=*(promptShadow*)&op2InfoRaw; //or just this line on non MEMMODE devices like teensy or esp8266 instead of the above three //promptShadow op2Info("Op 2",(callback)op2Func,enterEvent); -prompt op2(op2Info); +prompt op2(op2Info.obj); //define the menu prompt* constMEM menuData[] MEMMODE={&op1,&op2}; //or just prompt* menuData[]={&op1,&op2}; on non avr devices constMEM char menuTitle[] MEMMODE="Main menu"; -constMEM menuNodeShadowRaw menuInfoRaw MEMMODE={ +constMEM menuNodeShadows menuInfo MEMMODE={ (callback)doNothing, (systemStyles)(_menuData|_canNav), menuTitle, @@ -44,10 +36,9 @@ constMEM menuNodeShadowRaw menuInfoRaw MEMMODE={ sizeof(menuData)/sizeof(prompt*), menuData }; -constMEM menuNodeShadow& menuInfo=*(menuNodeShadow*)&menuInfoRaw; -//or just this line on non MEMMODE devices like teensy or esp8266 instead of the above three +//or just this line on non AVR devices like teensy or esp8266 instead of the above three //menuNodeShadow menuInfo("Main menu",2,menuData,(callback)doNothing,noEvent,wrapStyle); -menuNode mainMenu(menuInfo); +menuNode mainMenu(menuInfo.obj); #define MAX_DEPTH 1 @@ -70,8 +61,6 @@ navRoot nav(mainMenu, nav_cursors, MAX_DEPTH, serial, out); void op1Func() {Serial.println("Op 1 executed");} void op2Func() {Serial.println("Op 2 executed");} -#include - ///////////////////////////////////////////////////////////////////////////// // arduino sketch void setup() { diff --git a/examples/noMacros/platformio.ini b/examples/noMacros/platformio.ini index 39bdc0ea..123c36fb 100644 --- a/examples/noMacros/platformio.ini +++ b/examples/noMacros/platformio.ini @@ -31,4 +31,4 @@ platform = espressif8266 board = esp12e framework = arduino upload_speed=921600 -build_flags = -Wno-comment -Wno-strict-aliasing -Wno-builtin-macro-redefined -DNODEBUG +; build_flags = -Wno-comment -Wno-strict-aliasing -Wno-builtin-macro-redefined -DNODEBUG diff --git a/examples/plugin_decimalsField/platformio.ini b/examples/plugin_decimalsField/platformio.ini new file mode 100644 index 00000000..dca1ac12 --- /dev/null +++ b/examples/plugin_decimalsField/platformio.ini @@ -0,0 +1,28 @@ +[platformio] +src_dir=plugin_decimalsField + +; [env:nanoatmega328] +; platform = atmelavr +; board = nanoatmega328 +; framework = arduino +; build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro-redefined + +; [env:disco_f051r8] +; platform = ststm32 +; board = disco_f051r8 +; framework = mbed + +; this is a raw atmega328 on a breadboard +[env:uno] +platform=atmelavr +board=pro8MHzatmega328 +framework=arduino +upload_protocol = usbasp +upload_flags = -Pusb +; build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro-redefined -DDEBUG + +; [env:teensy31] +; platform = teensy +; board = teensy31 +; framework = arduino +; build_flags = -Wno-comment -Wno-reorder -Wno-strict-aliasing -Wno-builtin-macro-redefined diff --git a/examples/plugin_decimalsField/plugin_decimalsField/plugin_decimalsField.ino b/examples/plugin_decimalsField/plugin_decimalsField/plugin_decimalsField.ino new file mode 100644 index 00000000..14688ba9 --- /dev/null +++ b/examples/plugin_decimalsField/plugin_decimalsField/plugin_decimalsField.ino @@ -0,0 +1,118 @@ +/* -*- C++ -*- */ +/******************** +May 2017 Rui Azevedo - ruihfazevedo(@rrob@)gmail.com +www.r-site.net +unlike native objects, pluggins can be device specific, so some pluggins might +not work on all devices. +all sorts of plugins may be available in the future and if you customize +a component and think it of interest of others please do pull request. +contrubutions and contrubutors are welcome. + +decimalslField - To select the number of decimal places that are printed in float and double variables types. Feb 2019 ferchinas + Tested on ESP32, Oled i2c display, u8g2 driver. It could work on other devices. +***/ + +#include +#include +#include +#include + +using namespace Menu; + +#define MAX_DEPTH 1 + +unsigned char cantDecimals = 1; +float floatVar = 0.123456789123456789; +double doubletVar = 0.123456789123456789; + +void updateEvent_cb(eventMask e); + +//-----Custom floatField---------------- +#define DECIMALSFLIED_DEFAULT 1 + +template +class decimalslField :public menuField { //https://github.com/neu-rah/ArduinoMenu/blob/master/examples/customField/customField/customField.ino +private: + idx_t decimals; +public: + decimalslField(constMEM menuFieldShadow& shadow) :menuField(shadow) { decimals = DECIMALSFLIED_DEFAULT; } + decimalslField( + T &value, + constText* text, + constText*units, + T low, + T high, + T step, + T tune, + action a = doNothing, + eventMask e = noEvent, + styles s = noStyle + ) :decimalslField(*new menuFieldShadow(value, text, units, low, high, step, tune, a, e, s)) {} + + Used printTo(navRoot &root, bool sel, menuOut& out, idx_t idx, idx_t len, idx_t panelNr = 0) override {// https://github.com/neu-rah/ArduinoMenu/issues/94#issuecomment-290936646 + //menuFieldShadow& s=*(menuFieldShadow*)shadow; + menuField::reflex = menuField::target(); + idx_t l = prompt::printTo(root, sel, out, idx, len); + // bool ed = this == root.navFocus; + //bool sel=nav.sel==i; + if (l < len) { + out.print((root.navFocus == this&&sel) ? (menuField::tunning ? '>' : ':') : ' '); + l++; + if (l < len) { + l += out.print(menuField::reflex, decimals);//NOTE: this can exceed the limits! + if (l < len) { + l += print_P(out, fieldBase::units(), len); + } + } + } + return l; + } + + void setDecimals(idx_t d) { decimals = d; } + idx_t getDecimals(void) { return(decimals); } +}; +//-----Custom floatField----------------END + + +decimalslField & floatFlied_Object = *new decimalslField(floatVar, "f", "", -100.0, 100.0, 0.1, 1); +decimalslField & doubleFlied_Object = *new decimalslField(doubletVar, "d", "", -100.0, 100.0, 0.1, 1); +decimalslField & DecimalsFlied_Object = *new decimalslField(cantDecimals, "Dec", "", 0, 18, 1, 1, (Menu::callback)updateEvent_cb, updateEvent); + +void updateEvent_cb(eventMask e){ + floatFlied_Object.setDecimals(cantDecimals); + doubleFlied_Object.setDecimals(cantDecimals); + Serial.println("");Serial.print("now using '");Serial.print(cantDecimals);Serial.println("' decimals."); + } + +//---Main menu --------------------------------- +prompt* mainData[] = { + &floatFlied_Object, + &doubleFlied_Object, + &DecimalsFlied_Object, + new Exit(" in(inputsList);//3 is the number of inputs -char* constMEM hexDigit MEMMODE="0123456789ABCDEF"; -char* constMEM hexNr[] MEMMODE={"0","x",hexDigit,hexDigit}; +const char* constMEM hexDigit MEMMODE="0123456789ABCDEF"; +const char* constMEM hexNr[] MEMMODE={"0","x",hexDigit,hexDigit}; char buf1[]="0x11"; //a menu using a plugin field diff --git a/examples/reuse/reuse/reuse.ino b/examples/reuse/reuse/reuse.ino index fd585eec..e0c0207f 100644 --- a/examples/reuse/reuse/reuse.ino +++ b/examples/reuse/reuse/reuse.ino @@ -30,7 +30,7 @@ using namespace Menu; // define menu colors for ANSI terminal //each color is in the format: // {{disabled normal,disabled selected},{enabled normal,enabled selected, enabled editing}} -/*const colorDef colors[] MEMMODE={ +/*const colorDef colors[6] MEMMODE={ {{BLUE,WHITE} ,{BLUE,WHITE,WHITE}},//bgColor {{BLACK,BLACK} ,{WHITE,BLUE,BLUE}},//fgColor {{BLACK,BLACK} ,{YELLOW,YELLOW,RED}},//valColor @@ -141,7 +141,7 @@ class AlarmMenu:public menu { len-=out.print(ss); //dirty=true;useless here because dirty flag is cleaned after all devices print } - bool changed(const navNode &nav,const menuOut& out,bool sub=true) override { + bool changed(const navNode &nav,const menuOut& out,bool sub=true,bool test=false) override { //this does not set the dirty flag, it would redraw all menu causing flick //however printMenu checks this as a title change signal return true;//always changed! diff --git a/examples/rotaryEvent/rotaryEvent/rotaryEvent.ino b/examples/rotaryEvent/rotaryEvent/rotaryEvent.ino new file mode 100644 index 00000000..9139720c --- /dev/null +++ b/examples/rotaryEvent/rotaryEvent/rotaryEvent.ino @@ -0,0 +1,180 @@ +/******************** +March 2020 M. Smit - github@gangkast.nl + +Generic Rotary/Button input +output: SSD1306 OLED +input: clickable rotary encoder + +purpose: + + Having a generic rotary event-based implementation, + leaving rotary and button libraries up to the user. + Example uses QDEC and AceButton, but could be anything + that suits your particular hardware and/or needs. + + TODO: userland rotary/button event mapping to menu actions, + as doubleclick/longpress are now hardcoded to back. + +***/ + + +#include +#include +#include +#include + +// some example libraries to handle the rotation and clicky part +// of the encoder. These will generate our events. +#include //https://github.com/SimpleHacks/QDEC +#include // https://github.com/bxparks/AceButton + + +// Encoder +const int ROTARY_PIN_A = 13; // the first pin connected to the rotary encoder +const int ROTARY_PIN_B = 15; // the second pin connected to the rotary encoder +const int ROTARY_PIN_BUT = 25; + +using namespace ::ace_button; +using namespace ::SimpleHacks; +QDecoder qdec(ROTARY_PIN_A, ROTARY_PIN_B, true); // rotary part +AceButton button(ROTARY_PIN_BUT); // button part +//--// + + +// Display +// LOLIN32 I2C SSD1306 128x64 display +// https://github.com/olikraus/u8g2 +#define SDA 5 +#define SCL 4 + +#include +#define fontName u8g2_font_7x13_mf +#define fontX 7 +#define fontY 16 +#define offsetX 0 +#define offsetY 3 +#define U8_Width 128 +#define U8_Height 64 +#define USE_HWI2C +#define fontMarginX 2 +#define fontMarginY 2 +U8G2_SSD1306_128X64_VCOMH0_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE, SCL, SDA);//allow contrast change + +const colorDef colors[6] MEMMODE={ + {{0,0},{0,1,1}},//bgColor + {{1,1},{1,0,0}},//fgColor + {{1,1},{1,0,0}},//valColor + {{1,1},{1,0,0}},//unitColor + {{0,1},{0,0,1}},//cursorColor + {{1,1},{1,0,0}},//titleColor +}; +//--// + + +// AndroidMenu +// https://github.com/neu-rah/ArduinoMenu +#define MAX_DEPTH 1 + +unsigned int timeOn=10; +unsigned int timeOff=90; + +using namespace Menu; +MENU(mainMenu, "Blink menu", Menu::doNothing, Menu::noEvent, Menu::wrapStyle + ,FIELD(timeOn,"On","ms",0,1000,10,1, Menu::doNothing, Menu::noEvent, Menu::noStyle) + ,FIELD(timeOff,"Off","ms",0,10000,10,1,Menu::doNothing, Menu::noEvent, Menu::noStyle) + ,EXIT("setEventHandler(handleButtonEvent); + buttonConfig->setFeature(ButtonConfig::kFeatureClick); + buttonConfig->setFeature(ButtonConfig::kFeatureDoubleClick); + buttonConfig->setFeature(ButtonConfig::kFeatureLongPress); + buttonConfig->setFeature(ButtonConfig::kFeatureSuppressClickBeforeDoubleClick); + buttonConfig->setFeature(ButtonConfig::kFeatureSuppressAfterClick); + buttonConfig->setFeature(ButtonConfig::kFeatureSuppressAfterDoubleClick); + + // setup OLED disaply + Wire.begin(SDA,SCL); + u8g2.begin(); + u8g2.setFont(fontName); + + do { + u8g2.drawStr(0,fontY,"RotaryEventIn demo"); + } while(u8g2.nextPage()); + // appear + for(int c=255;c>0;c--) { + u8g2.setContrast(255-255.0*log(c)/log(255)); + delay(12); + } + +} + +void loop() { + // put your main code here, to run repeatedly: + button.check(); // acebutton check, rotary is on ISR + nav.doInput(); // menu check + + if (nav.changed(0)) {//only draw if menu changed for gfx device + u8g2.firstPage(); + do nav.doOutput(); while(u8g2.nextPage()); + } + +} \ No newline at end of file diff --git a/examples/serialio/include/readme.txt b/examples/serialio/include/readme.txt new file mode 100644 index 00000000..194dcd43 --- /dev/null +++ b/examples/serialio/include/readme.txt @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/examples/Serial/serialio/platformio.ini b/examples/serialio/platformio.ini similarity index 94% rename from examples/Serial/serialio/platformio.ini rename to examples/serialio/platformio.ini index b846d8c6..bdfb8173 100644 --- a/examples/Serial/serialio/platformio.ini +++ b/examples/serialio/platformio.ini @@ -39,9 +39,9 @@ src_dir=serialio platform = atmelavr board = nanoatmega328 framework = arduino -upload_port=/dev/ttyUSB* +; upload_port=/dev/ttyUSB1 upload_flags=-V -build_flags = -DNO_MENU_DEBUG -Wno-strict-aliasing -Wno-sign-compare -Wno-write-strings +build_flags = -DNO_MENU_DEBUG ; ; [env:teensy31] ; platform = teensy diff --git a/examples/Serial/serialio/serialio/serialio.ino b/examples/serialio/serialio/serialio.ino similarity index 86% rename from examples/Serial/serialio/serialio/serialio.ino rename to examples/serialio/serialio/serialio.ino index 228f0c37..e68c77fb 100644 --- a/examples/Serial/serialio/serialio/serialio.ino +++ b/examples/serialio/serialio/serialio.ino @@ -32,7 +32,7 @@ result action1(eventMask e) { return proceed; } -result action2(eventMask e, prompt &item) { +result action2(eventMask e,navNode& nav,prompt& item) { Serial.print(e); Serial.print(" action2 executed, quiting menu"); return quit; @@ -101,12 +101,12 @@ PADMENU(birthDate,"Birth",doNothing,noEvent,noStyle ,FIELD(day,"","",1,31,1,0,doNothing,noEvent,wrapStyle) ); -char* constMEM hexDigit MEMMODE="0123456789ABCDEF"; -char* constMEM hexNr[] MEMMODE={"0","x",hexDigit,hexDigit}; +const char* constMEM hexDigit MEMMODE="0123456789ABCDEF"; +const char* constMEM hexNr[] MEMMODE={"0","x",hexDigit,hexDigit}; char buf1[]="0x11"; -char* constMEM alphaNum MEMMODE=" 0123456789.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz,\\|!\"#$%&/()=?~*^+-{}[]€"; -char* constMEM alphaNumMask[] MEMMODE={alphaNum}; +const char* constMEM alphaNum MEMMODE=" 0123456789.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz,\\|!\"#$%&/()=?~*^+-{}[]€"; +const char* constMEM alphaNumMask[] MEMMODE={alphaNum}; char name[]=" "; MENU(mainMenu,"Main menu",zZz,noEvent,wrapStyle @@ -153,13 +153,14 @@ result doAlert(eventMask e, prompt &item) { return proceed; } -//when menu is suspended result idle(menuOut &o, idleEvent e) { // o.clear(); switch(e) { case idleStart:o.println("suspending menu!");break; case idling:o.println("suspended...");break; - case idleEnd:o.println("resuming menu.");break; + case idleEnd:o.println("resuming menu."); + nav.reset(); + break; } return proceed; } @@ -171,8 +172,9 @@ void setup() { Serial.begin(115200); while(!Serial); Serial.println("menu 4.x test");Serial.flush(); - //nav.idleTask=idle;//point a function to be used when menu is suspended - //nav.idleOn();//this menu will start on idle state, press select to enter menu + nav.timeOut=3; + nav.idleTask=idle;//point a function to be used when menu is suspended + // nav.idleOn();//this menu will start on idle state, press select to enter menu //nav.doInput("323"); // nav.useAccel=false; } diff --git a/examples/targetSel/include/README b/examples/targetSel/include/README new file mode 100644 index 00000000..194dcd43 --- /dev/null +++ b/examples/targetSel/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/examples/targetSel/platformio.ini b/examples/targetSel/platformio.ini new file mode 100644 index 00000000..24094cb5 --- /dev/null +++ b/examples/targetSel/platformio.ini @@ -0,0 +1,28 @@ +[platformio] +src_dir=targetSel + +; [env:seeeduino_lorawan] +; board=seeeduino_lorawan +; platform = atmelsam +; framework = arduino +; build_flags = +; -DMENU_DEBUG + +[env:nanoatmega328] +platform = atmelavr +board = nanoatmega328 +; board = nanoatmega328new +framework = arduino +; upload_port=/dev/ttyUSB1 +upload_flags=-V +build_flags = + -DMENU_DEBUG + -Wno-strict-aliasing -Wno-sign-compare -Wno-write-strings + +; [env:esp12e] +; platform = espressif8266 +; board = esp12e +; framework = arduino +; upload_speed=921600 +; build_flags = -Wno-comment -Wno-strict-aliasing -Wno-builtin-macro-redefined -Wno-write-strings -DMENU_DEBUG +; build_unflags=-Wno-strict-aliasing diff --git a/examples/targetSel/targetSel/targetSel.ino b/examples/targetSel/targetSel/targetSel.ino new file mode 100644 index 00000000..cb052d5d --- /dev/null +++ b/examples/targetSel/targetSel/targetSel.ino @@ -0,0 +1,188 @@ +/******************** +Arduino generic menu system + +Rui Azevedo - ruihfazevedo(@rrob@)gmail.com + +output: Serial +input: Serial + +user defined array menu (userMenu plugin) +*/ + +#include +#include +#include +#include + +using namespace Menu; + +//=========================================================================== + +//some values for user data record +enum SelTest {Zero=0,One,Two}; +enum ChooseTest {First=1,Second=2,Third=3,Last=-1}; +constexpr int dataSz=3; +constexpr int nameSz=20; + + +//some user data record type to be edited by the menu +struct Data { + char name[nameSz+1]=" "; + bool valid=0; + SelTest selTest=Zero; + ChooseTest chooseTest=First; + //how to copy this data... + Data& operator=(Data& o){ + strncpy(name,o.name,nameSz); + valid=o.valid; + selTest=o.selTest; + chooseTest=o.chooseTest; + return o; + } +}; + +//THE DATA <----------------------------------------- +Data myTargets[dataSz];//our data + +//a temporary to be edited +//the data type must have assignment operator +//because we will later on move data back and forth between the actual data and this temporary +//menu edit is wired to this temp. and menu events will deal with the copy-call (from/to) +Data target; + +//characters allowed on name field +const char* constMEM alphaNum MEMMODE=" 0123456789.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz,\\|!\"#$%&/()=?~*^+-{}[]€"; +const char* constMEM alphaNumMask[] MEMMODE={alphaNum}; + +//some enumeration of values allowed on some fields +TOGGLE(target.valid,editValid,"Valid: ",doNothing,noEvent,noStyle//,doExit,enterEvent,noStyle + ,VALUE("On",HIGH,doNothing,noEvent) + ,VALUE("Off",LOW,doNothing,noEvent) +); + +SELECT(target.selTest,selMenu,"Select",doNothing,noEvent,noStyle + ,VALUE("Zero",Zero,doNothing,noEvent) + ,VALUE("One",One,doNothing,noEvent) + ,VALUE("Two",Two,doNothing,noEvent) +); + +CHOOSE(target.chooseTest,chooseMenu,"Choose",doNothing,noEvent,noStyle + ,VALUE("First",First,doNothing,noEvent) + ,VALUE("Second",Second,doNothing,noEvent) + ,VALUE("Third",Third,doNothing,noEvent) + ,VALUE("Last",Last,doNothing,noEvent) +); + +//a function to save the edited data record +result saveTarget(eventMask e,navNode& nav) { + trace(MENU_DEBUG_OUT<<"saveTarget"<path[nav.root->level-1]; + idx_t n=nn.sel;//get selection of previous level + myTargets[n]=target; + return quit; +} + +//if you want to print the data record name as the title, +//then you MUST create a customized print menu to replace this default one +MENU(targetEdit,"Target edit",doNothing,noEvent,wrapStyle + ,EDIT("Name",target.name,alphaNumMask,doNothing,noEvent,noStyle) + ,SUBMENU(editValid) + ,SUBMENU(selMenu) + ,SUBMENU(chooseMenu) + ,OP("Save",saveTarget,enterEvent) + ,EXIT("lvl)) { + _trace(Serial<<"root.level>lvl:"<<(root.level>lvl)<lvl&&root.path[lvl].sel==n&&root.path[lvl+1].target==&operator[](n)) + )) { + _trace(Serial<<"menuNode, escTo "<=w?cursor-w:0; - trace(MENU_DEBUG_OUT<<"at:"<=ew?cursor-ew:0;//adjust print start + while(buffer()[at]&&l++_style();} inline eventMask events() const {return shadow->_events();} + virtual idx_t sz() const {return 0;} inline bool is(systemStyles chk) const {return (sysStyles()&chk)==chk;} inline bool has(systemStyles chk) const {return sysStyles()&chk;} inline bool is(styles chk) const {return (style()&chk)==chk;} @@ -215,6 +216,15 @@ #endif }; + template + struct decPlaces { + template + struct menuField:Menu::menuField { + using Menu::menuField::menuField; + idx_t printReflex(menuOut& o) const override; + }; + }; + //-------------------------------------------------------------------------- template class menuValue:public prompt { @@ -236,16 +246,27 @@ class menuNode:public navTarget { public: inline menuNode(constMEM menuNodeShadow& s):navTarget(s) {} - inline menuNode(constText* text,idx_t sz,prompt* constMEM data[],action a=noAction,eventMask e=noEvent,styles style=wrapStyle,systemStyles ss=(systemStyles)(_menuData|_canNav)) + inline menuNode(const char* text,idx_t sz,prompt* constMEM data[],action a=noAction,eventMask e=noEvent,styles style=wrapStyle,systemStyles ss=(systemStyles)(_menuData|_canNav)) :navTarget(*new menuNodeShadow(text,sz,data,a,e,style,ss)) {} #ifdef MENU_FMT_WRAPS virtual classes type() const; #endif - inline prompt& operator[](idx_t i) const {return ((menuNodeShadow*)shadow)->operator[](i);} + virtual prompt& operator[](idx_t i) const {return ((menuNodeShadow*)shadow)->operator[](i);} bool changed(const navNode &nav,const menuOut& out,bool sub=true,bool test=false) override; void clearChanged(const navNode &nav,const menuOut& out,bool sub) override; inline idx_t sz() const {return ((menuNodeShadow*)shadow)->_sz();} inline prompt* constMEM* data() const {return ((menuNodeShadow*)shadow)->_data();} + #if defined(MENU_USERAM) && ! defined(swap) + //Adafruit_GFX_AS defines swap macro (what a bad idea) + void swap(idx_t a,idx_t b) { + if (has(_menuData)) {//ignore on virtual data menus + auto ops=((menuNodeShadow*)shadow)->_data(); + auto tmp=ops[a]; + ops[a]=ops[b]; + ops[b]=tmp; + } + } + #endif // #ifdef MENU_ASYNC // prompt* seek(idx_t* uri,idx_t len) override; // #endif diff --git a/src/itemsTemplates.cpp b/src/itemsTemplates.hpp similarity index 79% rename from src/itemsTemplates.cpp rename to src/itemsTemplates.hpp index ba828bb4..c7448bc8 100644 --- a/src/itemsTemplates.cpp +++ b/src/itemsTemplates.hpp @@ -46,9 +46,22 @@ namespace Menu { template void menuField::parseInput(navNode& nav,menuIn& in) { - if (strchr(numericChars,in.peek())) {//a numeric value was entered + //TODO: on a cmd based nav (not streams) this mess will be pushed to stream input only + //can not enter negative number literals by serial, using steps or web is ok + bool neg=false; + char nc=in.peek(); + if (nc=='-') { + in.read(); + if (!strchr(numericChars,in.peek())) { + doNav(nav,downCmd); + return; + } + // Serial.println("NEGATIVE NUMBER PARSE THEN!"); + neg=true; + } + if (neg||strchr(numericChars,nc)) {//a numeric value was entered if (in.numValueInput) { - target()=(T)in.parseFloat();//TODO: use template specialization and proper convertion + target()=(T)((neg?-1:1)*in.parseFloat());//TODO: use template specialization and proper convertion tunning=true; doNav(nav,enterCmd); } else doNav(nav,idxCmd); @@ -89,6 +102,10 @@ namespace Menu { } } + template + template + idx_t decPlaces::menuField::printReflex(menuOut& o) const {return o.print(Menu::menuField::reflex,dps);} + template Used choose::printTo(navRoot &root,bool sel,menuOut& out, idx_t idx,idx_t len,idx_t panelNr) { bool ed=this==root.navFocus; @@ -107,20 +124,29 @@ namespace Menu { const char* toggle::typeName() const {return "toggle";} template bool toggle::async(const char*uri,navRoot& root,idx_t lvl) { - trace(MENU_DEBUG_OUT<<(*(prompt*)this)<<" toggle::async! uri:"<::sync(n); + _trace(MENU_DEBUG_OUT<<"n:"<::sync(n);//sync to index n! + // root.node().event(root.useUpdateEvent?updateEvent:enterEvent); return true; } + //if not by index then do the toggle + _trace(Serial<<"toggle proceed..."< result toggle::sysHandler(SYS_FUNC_PARAMS) { + _trace(Serial<<"toggle sysHandler!"<::sync(); @@ -146,7 +172,7 @@ namespace Menu { for(idx_t i=0;i*)&operator[](i))->target()==target()) return i; #ifdef MENU_DEBUG - MENU_DEBUG_OUT.print(F("value out of range ")); + MENU_DEBUG_OUT.print("value out of range "); MENU_DEBUG_OUT.println(target());MENU_DEBUG_OUT.flush(); assert(false); #endif @@ -157,7 +183,7 @@ namespace Menu { #ifdef MENU_DEBUG if (!(i>=0&&i=0&&i id##ShadowRaw={\ + constMEM MEMMODE Menu::menuVariantShadows id##Shadows={\ (Menu::callback)action,\ ss,\ id##_text,\ @@ -203,8 +235,8 @@ Menu::outputsList id(id##_outPtrs,sizeof(id##_outPtrs)/sizeof(Menu::menuOut*)); id##_data,\ &target\ };\ - constMEM MEMMODE Menu::menuVariantShadow& id##_Shadow=*(menuVariantShadow*)&id##ShadowRaw;\ - objType id (id##_Shadow); + objType id (id##Shadows.obj); + // constMEM MEMMODE Menu::menuVariantShadow& id##_Shadow=*(menuVariantShadow*)&id##ShadowRaw; // bridging macros prepending id's to arguments list // for all elements that need separate allocation and a name to it @@ -224,14 +256,14 @@ Menu::outputsList id(id##_outPtrs,sizeof(id##_outPtrs)/sizeof(Menu::menuOut*)); //allocating space for elements and shadows ------------------------------------- #define DECL_EXIT_(cnt,exitText)\ constText title_##cnt[] MEMMODE=exitText;\ - constMEM MEMMODE Menu::promptShadowRaw opShadowRaw##cnt = {\ + constMEM MEMMODE Menu::promptShadows opShadows##cnt = {\ (Menu::callback)Menu::doExit,\ Menu::_Exit,\ title_##cnt,\ Menu::enterEvent\ };\ - constMEM Menu::promptShadow& opShadow##cnt=*(Menu::promptShadow*)&opShadowRaw##cnt;\ - Menu::prompt op##cnt(opShadow##cnt); + Menu::prompt op##cnt(opShadows##cnt.obj); + // constMEM Menu::promptShadow& opShadow##cnt=*(Menu::promptShadow*)&opShadowRaw##cnt; #define DECL_ITEM_(cnt,objType,text,aFn,mask,ss,...) \ constText title_##cnt[] MEMMODE=text;\ constMEM MEMMODE Menu::promptShadowRaw opShadowRaw##cnt={\ @@ -245,19 +277,19 @@ Menu::outputsList id(id##_outPtrs,sizeof(id##_outPtrs)/sizeof(Menu::menuOut*)); objType op##cnt(opShadow##cnt,__VA_ARGS__); #define DECL_OP_(cnt,objType,text,aFn,mask) \ constText title_##cnt[] MEMMODE=text;\ - constMEM MEMMODE Menu::promptShadowRaw opShadowRaw##cnt={\ + constMEM MEMMODE Menu::promptShadows opShadows##cnt={\ (Menu::callback)aFn,\ _noStyle,\ title_##cnt,\ mask,\ noStyle\ };\ - constMEM Menu::promptShadow& opShadow##cnt=*(promptShadow*)&opShadowRaw##cnt;\ - objType op##cnt(opShadow##cnt); + objType op##cnt(opShadows##cnt.obj); + // constMEM Menu::promptShadow& opShadow##cnt=*(promptShadow*)&opShadowRaw##cnt; #define DECL_FIELD_(cnt,objType,ss,target,text,units,low,high,step,tune,action,mask,style)\ constText fieldLabel##cnt[] MEMMODE=text;\ constText fieldUnit##cnt[] MEMMODE=units;\ - constMEM MEMMODE Menu::menuFieldShadowRaw fieldShadowRaw##cnt={\ + constMEM MEMMODE Menu::menuFieldShadows fieldShadows##cnt={\ (Menu::callback)action,\ ss,\ fieldLabel##cnt,\ @@ -270,11 +302,11 @@ Menu::outputsList id(id##_outPtrs,sizeof(id##_outPtrs)/sizeof(Menu::menuOut*)); step,\ tune\ };\ - constMEM Menu::menuFieldShadow& _fieldShadow##cnt=*(Menu::menuFieldShadow*)&fieldShadowRaw##cnt;\ - objType _menuField##cnt(_fieldShadow##cnt); + objType _menuField##cnt(fieldShadows##cnt.obj); + // constMEM Menu::menuFieldShadow& _fieldShadow##cnt=*(Menu::menuFieldShadow*)&fieldShadowRaw##cnt; #define DECL_EDIT_(cnt,objType,ss,label,buf,valid,action,mask,style)\ - constText textFieldLabel##cnt[] MEMMODE=label;\ - constMEM MEMMODE Menu::textFieldShadowRaw textFieldShadowRaw##cnt={\ + const char textFieldLabel##cnt[] MEMMODE=label;\ + constMEM MEMMODE Menu::textFieldShadows textfieldShadows##cnt={\ (Menu::callback)action,\ ss,\ textFieldLabel##cnt,\ @@ -284,8 +316,8 @@ Menu::outputsList id(id##_outPtrs,sizeof(id##_outPtrs)/sizeof(Menu::menuOut*)); valid,\ sizeof(valid)/sizeof(char*)\ };\ - constMEM Menu::textFieldShadow& _fieldShadow##cnt=*(Menu::textFieldShadow*)&textFieldShadowRaw##cnt;\ - objType _textField##cnt(_fieldShadow##cnt); + objType _textField##cnt(textfieldShadows##cnt.obj); + // constMEM Menu::textFieldShadow& _fieldShadow##cnt=*(Menu::textFieldShadow*)&textFieldShadowRaw##cnt; #define DECL_SUBMENU(id) #define DECL_VALUE(target,...) MK_VALUE(target, _##__VA_ARGS__) #define _VALUE_(...) __VA_ARGS__ @@ -295,7 +327,7 @@ Menu::outputsList id(id##_outPtrs,sizeof(id##_outPtrs)/sizeof(Menu::menuOut*)); #define MK_VALUE(...) GET_VALUE(__VA_ARGS__,_MK_VALUE,_MK_VALUE,_MK_VALUE,_MK_VALUE,IGNORE,_MK_VALUE)(__VA_ARGS__) #define _MK_VALUE(target,cnt,text,value,action,mask)\ constText valueLabel##cnt[] MEMMODE=text;\ - constMEM MEMMODE Menu::menuValueShadowRaw choice##cnt##ShadowRaw={\ + constMEM MEMMODE Menu::menuValueShadows choice##cnt##ShadowRaw={\ (Menu::callback)action,\ Menu::_noStyle,\ valueLabel##cnt,\ @@ -303,9 +335,10 @@ Menu::outputsList id(id##_outPtrs,sizeof(id##_outPtrs)/sizeof(Menu::menuOut*)); Menu::noStyle,\ value\ };\ - constMEM Menu::menuValueShadow& choice##cnt##Shadow=\ - *(menuValueShadow*)&choice##cnt##ShadowRaw;\ - Menu::menuValue menuValue##cnt(choice##cnt##Shadow); + Menu::menuValue menuValue##cnt(choice##cnt##ShadowRaw.obj); + + // constMEM Menu::menuValueShadows& choice##cnt##Shadow= + // *(menuValueShadow*)&choice##cnt##ShadowRaw; // when building a list of elements -------------------------------------------- #define DEF_EXIT_(cnt,...) &op##cnt diff --git a/src/menu.cpp b/src/menu.cpp index 92f34b7e..2e7b5a56 100644 --- a/src/menu.cpp +++ b/src/menu.cpp @@ -15,7 +15,7 @@ result Menu::inaction(menuOut& o,idleEvent) { result Menu::maxDepthError(menuOut& o,idleEvent e) { trace(MENU_DEBUG_OUT<<"maxDepthError"< class select; template class choose; - typedef int8_t idx_t; + #ifdef __AVR_ARCH__ + typedef int8_t idx_t;//int8_t on AVR's + #else + typedef int16_t idx_t;//int16_t on non AVR's + #endif + #if defined(MENU_DEBUG) || defined(MENU_ASYNC) idx_t print_P(Print& s,const char* at,idx_t sz=0); #endif @@ -65,13 +70,13 @@ www.r-site.net enum result {proceed=0,quit}; enum systemStyles { - _noStyle=0, - _menuData=1, - _canNav=1<<1, - _parentDraw=1<<2, - _isVariant=1<<3, - _asPad=1<<4, - _Exit=1<<5 + _noStyle=0,// 000000 + _menuData=1,// 000001 + _canNav=1<<1,// 000010 + _parentDraw=1<<2,//000100 + _isVariant=1<<3,// 001000 + _asPad=1<<4,// 010000 + _Exit=1<<5// 100000 }; //showTitle and noTitle override the default enum styles { @@ -186,7 +191,7 @@ www.r-site.net //config /////////////////////////////////////////////////////////////////////////// - struct navCode {navCmds cmd;char ch;}; + struct navCode {navCmds cmd;uint8_t ch;}; typedef navCode navCodesDef[10]; extern const navCodesDef defaultNavCodes; diff --git a/src/menuDefs.h b/src/menuDefs.h index b9f43966..65698010 100644 --- a/src/menuDefs.h +++ b/src/menuDefs.h @@ -8,6 +8,7 @@ // #define USE_RAM // #define MENU_DEBUG +#include "macros.h" #include "menuBase.h" #include "shadows.h" @@ -20,28 +21,36 @@ using namespace Menu; #endif #if defined(MENU_DEBUG) || defined(MENU_ASYNC) - #ifndef ARDUINO_STREAMING - #include - #else - #include + #ifndef ios_h + #ifndef ARDUINO_STREAMING + //https://github.com/neu-rah/streamFlow + #include + #else + //https://github.com/scottdky/Streaming + #include + #endif #endif #endif -#if defined(MENU_DEBUG) && defined(TRACE) +#if defined(MENU_DEBUG) && defined(TRACE) && !defined(trace) #define trace(x) x #else #define trace(x) #endif -#ifdef MENU_DEBUG +#if defined(MENU_DEBUG) && !defined(_trace) #define _trace(x) x #else - #define _trace(x) + #ifndef _trace + #define _trace(x) + #endif #endif -#ifndef MENU_RELEASE +#if defined(MENU_RELEASE) && !defined(__trace) #define __trace(x) x #else - #define __trace(x) + #ifndef __trace + #define __trace(x) + #endif #endif namespace Menu { diff --git a/src/menuIO/OzOledAsciiOut.h b/src/menuIO/OzOledAsciiOut.h index 438fd3c1..39362b75 100644 --- a/src/menuIO/OzOledAsciiOut.h +++ b/src/menuIO/OzOledAsciiOut.h @@ -17,7 +17,7 @@ OzOLED* device; inline OzOledAsciiOut(OzOLED* o,idx_t *t,panelsList &p,menuOut::styles s=menuOut::minimalRedraw) :menuOut(t,p,s),device(o) {} - size_t write(uint8_t ch) override { device->printChar(ch); return 1;} + size_t write(uint8_t ch) override { device->printChar(ch); return 1;} void clearLine(idx_t ln,idx_t panelNr=0,colorDefs color=bgColor,bool selected=false,status stat=enabledStatus,bool edit=false) override { setCursor(0,ln,panelNr); for(int n=0;n #include @@ -46,4 +46,4 @@ }//namespace Menu #endif -#endif +// #endif diff --git a/src/menuIO/SmartMatrixOut.h b/src/menuIO/SmartMatrixOut.h new file mode 100644 index 00000000..3b6e09d0 --- /dev/null +++ b/src/menuIO/SmartMatrixOut.h @@ -0,0 +1,119 @@ +#ifndef RSITE_ARDUINOP_MENU_SM +#define RSITE_ARDUINOP_MENU_SM + +#include +#include "..\menuDefs.h" +#include + +namespace Menu +{ + inline menuOut::styles operator | (menuOut::styles lhs, menuOut::styles rhs) + { + using T = std::underlying_type_t ; + return static_cast(static_cast(lhs) | static_cast(rhs)); + } + + inline menuOut::styles& operator |= (menuOut::styles& lhs, menuOut::styles rhs) + { + lhs = lhs | rhs; + return lhs; + } + + + template + class SmartMatrixOut : public gfxOut + { + + using SMBackground=SMLayerBackground; + + RGB currentColour{0,0,0}; + uint16_t cursorX=0, cursorY=0,line=0; + + public: + SMBackground &gfx; + const colorDef (&colors)[nColors]; + SmartMatrixOut(SMBackground &gfx, const colorDef (&c)[nColors], idx_t *t, panelsList &p, fontChoices font=fontChoices::font5x7, menuOut::styles s=minimalRedraw) + : gfxOut(fontLookup(font)->Width, fontLookup(font)->Height, t, p, s), gfx(gfx), colors(c) + { + gfx.setFont(font); + setCursor(0,0); + } + + virtual ~SmartMatrixOut() {} + + size_t write(uint8_t ch) override + { + if(ch=='\n') + { + setCursor(0,line+1); + } + else if(ch!='\r') + { + gfx.drawChar(cursorX,cursorY,currentColour,ch); + cursorX+=resX; + } + + return 1; + } + + inline RGB getColor(colorDefs color = bgColor, bool selected = false, status stat = enabledStatus, bool edit = false) const + { + return memWord(&(stat == enabledStatus ? colors[color].enabled[selected + edit] : colors[color].disabled[selected])); + } + + void setColor(colorDefs c, bool selected = false, status s = enabledStatus, bool e = false) override + { + currentColour=getColor(c,selected,s,e); + } + + void clearLine(idx_t ln, idx_t panelNr = 0, colorDefs color = bgColor, bool selected = false, status stat = enabledStatus, bool edit = false) override + { + const panel p = panels[panelNr]; + gfx.fillRectangle(p.x * resX, (p.y + ln) * resY + fontMarginY, (p.x+p.w) * resX, (p.y + ln + 1)*resY, getColor(color, selected, stat, edit)); + //setCursor(0,ln); + } + void clear() override + { + panels.reset(); + gfx.fillScreen(getColor(bgColor, false, enabledStatus, false)); + setCursor(0, 0); + setColor(fgColor); + } + + void box(idx_t panelNr, idx_t x, idx_t y, idx_t w = 1, idx_t h = 1, colorDefs c = bgColor, bool selected = false, status stat = enabledStatus, bool edit = false) override + { + const panel p = panels[panelNr]; + gfx.drawRectangle((p.x + x) * resX, (p.y + y) * resY + fontMarginY, (p.x + x + w) * resX, (p.y + y + h) * resY, getColor(c, selected, stat, edit)); + } + + void rect(idx_t panelNr, idx_t x, idx_t y, idx_t w = 1, idx_t h = 1, colorDefs c = bgColor, bool selected = false, status stat = enabledStatus, bool edit = false) override + { + const panel p = panels[panelNr]; + gfx.fillRectangle((p.x + x) * resX, (p.y + y) * resY + fontMarginY, (p.x + x + w) * resX, (p.y + y + h) * resY, getColor(c, selected, stat, edit)); + } + + void clear(idx_t panelNr) override + { + const panel p = panels[panelNr]; + gfx.fillRectangle(p.x * resX, p.y * resY, (p.x+p.w) * resX, (p.y+p.h) * resY, getColor(bgColor, false, enabledStatus, false)); + panels.nodes[panelNr] = NULL; + } + + void setCursor(idx_t x, idx_t y, idx_t panelNr = 0) override + { + line=y; + const panel p = panels[panelNr]; + cursorX=(p.x + x) * resX; + cursorY= (p.y + line) * resY + fontMarginY; + } + + void drawCursor(idx_t ln, bool selected, status stat, bool edit = false, idx_t panelNr = 0) override + { + const panel p = panels[panelNr]; + // gfxOut::drawCursor(ln,selected,stat); + gfx.drawRectangle(p.x * resX, (p.y + ln) * resY + fontMarginY, (p.x+p.w) * resX, (p.y + ln +1) * resY, getColor(cursorColor, selected, enabledStatus, false)); + } + }; + +}; //namespace adaGfxOut +#endif diff --git a/src/menuIO/TFT_eSPIOut.h b/src/menuIO/TFT_eSPIOut.h new file mode 100644 index 00000000..68ace821 --- /dev/null +++ b/src/menuIO/TFT_eSPIOut.h @@ -0,0 +1,97 @@ +/* -*- C++ -*- */ +/******************** +by: + https://github.com/fa1ke5 (Jan. 2019) + posted here: https://github.com/neu-rah/ArduinoMenu/issues/225 (thank you) +based on: + Rui Azevedo - ruihfazevedo(@rrob@)gmail.com (Sept. 2014) + +Use graphics screens (adafruit library based) as menu output +www.r-site.net + +***/ +#pragma once + +#ifndef RSITE_ARDUINOP_MENU_TFT_ESPI + #define RSITE_ARDUINOP_MENU_TFT_ESPI + #include + #include "../menuDefs.h" + +// usage: +// #include +// TFT_eSPI gfx = TFT_eSPI(); +// #include +// #include +// TTFT_eSPI gfx = TFT_eSPI(); + +namespace Menu { + + #define RGB565(r,g,b) ((((r>>3)<<11) | ((g>>2)<<5) | (b>>3))) + + class TFT_eSPIOut:public gfxOut { + public: + TFT_eSPI& gfx; + const colorDef (&colors)[nColors]; + TFT_eSPIOut(TFT_eSPI& gfx,const colorDef (&c)[nColors],idx_t* t,panelsList &p,idx_t resX=6,idx_t resY=9) + :gfxOut(resX,resY,t,p),gfx(gfx),colors(c) {} + //:gfxOut(gfx.width()/resX,gfx.height()/resY,resX,resY,false),colors(c),gfx(gfx) {} + + size_t write(uint8_t ch) override {return gfx.write(ch);} + + inline uint16_t getColor(colorDefs color=bgColor,bool selected=false,status stat=enabledStatus,bool edit=false) const { + return memWord(&(stat==enabledStatus?colors[color].enabled[selected+edit]:colors[color].disabled[selected])); + } + + void setColor(colorDefs c,bool selected=false,status s=enabledStatus,bool e=false) override { + if (c == titleColor) + { + gfx.setTextColor(getColor(titleColor,selected,s,e), getColor(titleColor, false, s, e)); + } + else + { + gfx.setTextColor(getColor(c,selected,s,e), getColor(bgColor, selected, s, e)); + } + } + + void clearLine(idx_t ln,idx_t panelNr=0,colorDefs color=bgColor,bool selected=false,status stat=enabledStatus,bool edit=false) override { + const panel p=panels[panelNr]; + gfx.fillRect(p.x*resX,(p.y+ln)*resY,p.maxX()*resX,resY,getColor(color,selected,stat,edit)); + //setCursor(0,ln); + } + void clear() override { + panels.reset(); + gfx.fillScreen(getColor(bgColor,false,enabledStatus,false)); + setCursor(0,0); + setColor(fgColor); + } + + void box(idx_t panelNr,idx_t x,idx_t y,idx_t w=1,idx_t h=1,colorDefs c=bgColor,bool selected=false,status stat=enabledStatus,bool edit=false) override { + const panel p=panels[panelNr]; + gfx.drawRect((p.x+x)*resX,(p.y+y)*resY,w*resX,h*resY,getColor(c,selected,stat,edit)); + } + + void rect(idx_t panelNr,idx_t x,idx_t y,idx_t w=1,idx_t h=1,colorDefs c=bgColor,bool selected=false,status stat=enabledStatus,bool edit=false) override { + const panel p=panels[panelNr]; + gfx.fillRect((p.x+x)*resX,(p.y+y)*resY,w*resX,h*resY,getColor(c,selected,stat,edit)); + } + + void clear(idx_t panelNr) override { + const panel p=panels[panelNr]; + gfx.fillRect(p.x*resX,p.y*resY,p.w*resX,p.h*resY,getColor(bgColor,false,enabledStatus,false)); + panels.nodes[panelNr]=NULL; + } + + void setCursor(idx_t x,idx_t y,idx_t panelNr=0) override { + const panel p=panels[panelNr]; + gfx.setCursor((p.x+x)*resX,(p.y+y)*resY+fontMarginY); + } + + void drawCursor(idx_t ln,bool selected,status stat,bool edit=false,idx_t panelNr=0) override { + const panel p=panels[panelNr]; + // gfxOut::drawCursor(ln,selected,stat); + gfx.drawRect(p.x*resX,(p.y+ln)*resY,maxX()*resX,resY,getColor(cursorColor,selected,enabledStatus,false)); + } + }; + +}; +#endif diff --git a/src/menuIO/altKeyIn.h b/src/menuIO/altKeyIn.h new file mode 100644 index 00000000..d8c97161 --- /dev/null +++ b/src/menuIO/altKeyIn.h @@ -0,0 +1,82 @@ +/* -*- C++ -*- */ +/************** +Sept. 2014 Rui Azevedo - ruihfazevedo(@rrob@)gmail.com + +quick and dirty keyboard driver +metaprog keyboard driver where N is the number of keys +all keys are expected to be a pin (buttons) +we can have reverse logic (pull-ups) by entering negative pin numbers +ex: -A0 means: pin A0 normally high, low when button pushed (reverse logic) + +***/ + +#ifndef RSITE_KEYIN_DEF_H + #define RSITE_KEYIN_DEF_H + #include "../menuDefs.h" + + namespace Menu { + + #include "altKeyMapDef.h" + + //if you hold/repeat a key for this ammount of time we will consider it an escape + #ifndef ESCAPE_TIME + #define ESCAPE_TIME 1500 + #endif + //emulate a stream keyboard, this is not using interrupts as a good driver should do + // AND is not using a buffer either! + template + class keyIn:public menuIn { + public: + keyMap* keys; + int lastkey; + unsigned long pressMills=0; + keyIn(keyMap k[]):keys(k),lastkey(-1) {} + void begin() { + for(int n=0;nESCAPE_TIME) return 1; + if (ch==lastkey) return 0; + return 1; + /*int cnt=0; + for(int n=0;nESCAPE_TIME; + //MENU_DEBUG_OUT<<"read lastkey="<getCmdChar(escCmd):tmp;//long press will result in escape + } + void flush() {} + size_t write(uint8_t v) {return 0;} + }; + + }//namespace Menu + +#endif diff --git a/src/menuIO/altKeyMapDef.h b/src/menuIO/altKeyMapDef.h new file mode 100644 index 00000000..16a8425f --- /dev/null +++ b/src/menuIO/altKeyMapDef.h @@ -0,0 +1,12 @@ +/* -*- C++ -*- */ + +#ifndef RSITE_ARDUINO_MENU_KEYMAP + #define RSITE_ARDUINO_MENU_KEYMAP + +struct keyMap { + int8_t pin; + uint8_t code; + uint8_t mode; +}; + +#endif diff --git a/src/menuIO/encoderIn.h b/src/menuIO/encoderIn.h index 4e1c5a16..b05e8dbc 100644 --- a/src/menuIO/encoderIn.h +++ b/src/menuIO/encoderIn.h @@ -64,6 +64,8 @@ quadrature encoder stream (fake, not using buffers) } int read() override { int d=enc.pos-oldPos; + if(d>0 && oldPos<0) d+=sensivity; + else if(d<0 && oldPos>0) d-=sensivity; if (d<=-sensivity) { oldPos-=sensivity; return options->navCodes[downCmd].ch; diff --git a/src/menuIO/esp8266Out.h b/src/menuIO/esp8266Out.h index f0d1d255..de6ca37c 100644 --- a/src/menuIO/esp8266Out.h +++ b/src/menuIO/esp8266Out.h @@ -2,83 +2,139 @@ #ifndef RSITE_ARDUINO_MENU_ESP8266OUT #define RSITE_ARDUINO_MENU_ESP8266OUT - #include "../menuDefs.h" - #include - // #include - //#include - #include - #include - // #include - //#include - //#include - #include + #if defined(ESP8266) || defined(ESP32) + #include "../menuDefs.h" + #ifdef ESP8266 + #include + #include + #elif defined(ESP32) + #include + #include + #endif + // based on WebServer: + // https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WebServer + // https://github.com/Links2004/arduinoWebSockets + #include + #include + #include "xmlFmt.h" - using namespace std; + using namespace std; - namespace Menu { + namespace Menu { - class esp8266Out:public webOut { - public: - esp8266Out( - idx_t* t, - panelsList& p, - menuOut::styles styles=(menuOut::styles)(redraw|expandEnums) - ):webOut(t,p,styles) {} - menuOut& fill( - int x1, int y1, int x2, int y2,char ch=' ', - colorDefs color=bgColor, - bool selected=false, - status stat=enabledStatus, - bool edit=false) override {return *this;} - void setCursor(idx_t x,idx_t y,idx_t panelNr=0) override {} - void clear() override {panels.reset();} - void clear(idx_t panelNr) override { - setCursor(0,0,panelNr); - panels.nodes[panelNr]=NULL; - } - void clearLine( - idx_t ln, - idx_t panelNr=0, - colorDefs color=bgColor, - bool selected=false, - status stat=enabledStatus, - bool edit=false - ) override {} - void setColor(colorDefs c,bool selected=false,status s=enabledStatus,bool e=false) override {}; - //template esp8266Out& operator<<(T t)=0; - }; + class esp8266Out:public webOut { + public: + esp8266Out( + idx_t* t, + panelsList& p, + menuOut::styles styles=(menuOut::styles)(redraw|expandEnums) + ):webOut(t,p,styles) {} + menuOut& fill( + int x1, int y1, int x2, int y2,char ch=' ', + colorDefs color=bgColor, + bool selected=false, + status stat=enabledStatus, + bool edit=false) override {return *this;} + void setCursor(idx_t x,idx_t y,idx_t panelNr=0) override {} + void clear() override {panels.reset();} + void clear(idx_t panelNr) override { + setCursor(0,0,panelNr); + panels.nodes[panelNr]=NULL; + } + void clearLine( + idx_t ln, + idx_t panelNr=0, + colorDefs color=bgColor, + bool selected=false, + status stat=enabledStatus, + bool edit=false + ) override {} + void setColor(colorDefs c,bool selected=false,status s=enabledStatus,bool e=false) override {}; + //template esp8266Out& operator<<(T t)=0; + }; - menuOut& operator<<(menuOut&o,classes c); - template inline String& operator<<(String& o,T t) {return o.operator+=(t);} + class esp8266BufferedOut:public esp8266Out { + public: + String response; + using esp8266Out::esp8266Out; + template inline esp8266BufferedOut& operator<<(T t) {response< (&c)[nColors],*/ - idx_t* t, - panelsList& p - ):esp8266Out(t,p),server(srv) {} - size_t write(uint8_t ch) override {response<<(char)ch;return 1;} - template inline esp8266_WebServerOut& operator<<(T t) {response< inline String& operator<<(String& o,T t) {return o.operator+=(t);} - class esp8266_WebSocketOut:public esp8266Out { - public: - String response; - WebSocketsServer &webSocket; - esp8266_WebSocketOut(WebSocketsServer &socket,idx_t* tops,panelsList& panels) - :webSocket(socket),esp8266Out(tops,panels,(menuOut::styles)(minimalRedraw|expandEnums)) {} - size_t write(uint8_t ch) override {response<<(char)ch;return 1;} - }; + class esp8266_WebServerOut:public esp8266BufferedOut { + public: +#ifdef ESP8266 + ESP8266WebServer &server; + //using esp8266Out::esp8266Out; + esp8266_WebServerOut( + ESP8266WebServer &srv, + /*const colorDef (&c)[nColors],*/ + idx_t* t, + panelsList& p + ):esp8266BufferedOut(t,p),server(srv) {} +#elif defined(ESP32) + WebServer &server; + //using esp8266Out::esp8266Out; + esp8266_WebServerOut( + WebServer &srv, + /*const colorDef (&c)[nColors],*/ + idx_t* t, + panelsList& p + ):esp8266BufferedOut(t,p),server(srv) {} +#endif + size_t write(uint8_t ch) override {response<<(char)ch;return 1;} + // template inline esp8266_WebServerOut& operator<<(T t) {response< inline esp8266_WebServerOut& operator<<(esp8266_WebServerOut&o , T t) {return o.operator<<(t);} - //template inline esp8266_WiFiClientOut& operator<<(esp8266_WiFiClientOut&o , T t) {return o.operator<<(t);} - //template inline esp8266Out& operator<<(esp8266Out&o , T t) {return o.operator<<(t);} + class esp8266_WebServerStreamOut:public esp8266Out { + public: +#ifdef ESP8266 + ESP8266WebServer &server; + inline esp8266_WebServerStreamOut( + ESP8266WebServer &srv, + idx_t* t, + panelsList& p + ):esp8266Out(t,p),server(srv) {} +#elif defined(ESP32) + WebServer &server; + inline esp8266_WebServerStreamOut( + WebServer &srv, + idx_t* t, + panelsList& p + ):esp8266Out(t,p),server(srv) {} +#endif - }//namespace Menu + inline size_t write(uint8_t ch) override { + char c[2]={ch,0}; + server.sendContent(c); + return 1; + } + template inline esp8266_WebServerStreamOut& operator<<(T t) { + server.sendContent(String()+t); + return *this; + } + }; -#endif + // class esp8266_WebSocketOut:public esp8266BufferedOut { + // public: + // //client num... well we only serve a client at a time, so its safe to put t here + // // of course this kind of code is not thead safe...but we dont have theads anyway + // uint8_t num; + // String response; + // WebSocketsServer &webSocket; + // esp8266_WebSocketOut(WebSocketsServer &socket,idx_t* tops,panelsList& panels) + // :webSocket(socket),esp8266BufferedOut(tops,panels,(menuOut::styles)(minimalRedraw|expandEnums)) {} + // size_t write(uint8_t ch) override {response<<(char)ch;return 1;} + // }; + + //template inline esp8266_WebServerOut& operator<<(esp8266_WebServerOut&o , T t) {return o.operator<<(t);} + //template inline esp8266_WiFiClientOut& operator<<(esp8266_WiFiClientOut&o , T t) {return o.operator<<(t);} + //template inline esp8266Out& operator<<(esp8266Out&o , T t) {return o.operator<<(t);} + + }//namespace Menu + #include "esp8266Out.hpp" + #endif +#endif \ No newline at end of file diff --git a/src/menuIO/esp8266Out.cpp b/src/menuIO/esp8266Out.hpp similarity index 79% rename from src/menuIO/esp8266Out.cpp rename to src/menuIO/esp8266Out.hpp index bd08310f..129986cf 100644 --- a/src/menuIO/esp8266Out.cpp +++ b/src/menuIO/esp8266Out.hpp @@ -1,6 +1,8 @@ -#ifdef MENU_FMT_WRAPS -#include "../menuDefs.h" -#include "esp8266Out.h" +#pragma once +#if defined(ESP8266) || defined(ESP32) + #include "../menuDefs.h" + //MENU_FMT_WRAPS + #include "esp8266Out.h" menuOut& operator<<(menuOut&o,classes c) { switch(c) { diff --git a/src/menuIO/groveRGBLCDOut.h b/src/menuIO/groveRGBLCDOut.h new file mode 100644 index 00000000..a627c597 --- /dev/null +++ b/src/menuIO/groveRGBLCDOut.h @@ -0,0 +1,52 @@ +/* -*- C++ -*- */ + +//for using the Grove 2x16 RGB LCD i2c +// https://wiki.seeedstudio.com/Grove-LCD_RGB_Backlight/ +// https://github.com/Seeed-Studio/Grove_LCD_RGB_Backlight +// Uses default I2C device addresses on default I2C bus + +#ifndef RSITE_ARDUINO_MENU_GROVERGBLCDOUT + #define RSITE_ARDUINO_MENU_GROVERGBLCDOUT + + #ifndef ARDUINO_SAM_DUE + #include "../menuDefs.h" + #include + #include + + namespace Menu { + + class grovergblcdOut:public cursorOut { + public: + rgb_lcd* device; + inline grovergblcdOut(rgb_lcd* o,idx_t *t,panelsList &p,menuOut::styles s=menuOut::minimalRedraw) + :cursorOut(t,p,s),device(o) {} + size_t write(uint8_t ch) override {return device->write(ch);} + void clear() override { + device->clear(); + panels.reset(); + } + void setCursor(idx_t x,idx_t y,idx_t panelNr=0) override { + const panel p=panels[panelNr]; + device->setCursor(p.x+x,p.y+y); + } + idx_t startCursor(navRoot& root,idx_t x,idx_t y,bool charEdit,idx_t panelNr=0) override {return 0;} + idx_t endCursor(navRoot& root,idx_t x,idx_t y,bool charEdit,idx_t panelNr=0) override {return 0;} + idx_t editCursor(navRoot& root,idx_t x,idx_t y,bool editing,bool charEdit,idx_t panelNr=0) override { + trace(MENU_DEBUG_OUT<<"lcdOut::editCursor "<noBlink(); + device->noCursor(); + if (editing) { + device->setCursor(x, y); + if (charEdit) device->cursor(); + else device->blink(); + } + return 0; + } + + }; + + }//namespace Menu + + #endif +#endif diff --git a/src/menuIO/jsFmt.h b/src/menuIO/jsFmt.h index 3c6d9e72..31b5d39b 100644 --- a/src/menuIO/jsFmt.h +++ b/src/menuIO/jsFmt.h @@ -3,6 +3,7 @@ #define RSITE_ARDUINO_MENU_JSFMT #include "../menuDefs.h" + //NOT A VALID FILE.. work in progress... maybe namespace Menu { diff --git a/src/menuIO/jsonFmt.cpp b/src/menuIO/jsonFmt.cpp deleted file mode 100644 index 5a23e5f3..00000000 --- a/src/menuIO/jsonFmt.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#ifdef MENU_FMT_WRAPS - #include "../menuDefs.h" - #include "jsonFmt.h" - - namespace Menu { - void jsonOptions(menuOut& o,navNode &nav,menuNode& node,idx_t idx) { - o<<"\"options\":["; - for(idx_t n=0;nprintPath(*this,(menuNode*)&target); + T::print("\",\"sel\":\""); + T::print(nav.sel); + T::print("\""); + T::print(",\"items\":[\n"); + } else T::print("\n]\n"); + break; case menuOut::fmtUnit: - *this<<(start?"\"unit\":":","); + if (start) T::print(",\"unit\":\""); + else T::print("\""); break; case menuOut::fmtOp: if (start) { - *this<<"{" - <<"\"op\":" - <<"\"idx\":\""<0) T::print(",\n"); + T::print("{\"idx\":\""); + T::print(idx); + T::print("\""); + T::print(",\"enabled\":\""); + T::print(target.enabled); + T::print("\""); + } else T::print("}"); break; case menuOut::fmtToggle: if (start) { - *this<<"\"tog\":["; + T::print(",\"value\":\""); + } else { + T::print("\""); jsonOptions(*this,nav,*(menuNode*)&target,idx); - *this<<"],\"value\":"; - } else *this<<","; + // *this<<","; + } break; case menuOut::fmtPrompt: if (start) { - *this<<"\"tog\":"; - jsonOptions(*this,nav,*(menuNode*)&target,idx); - *this<<",\"value\":"; + if (idx>=0) T::print(","); + T::print("\"prompt\":\""); } else { - *this<<","; - *this<<"\"name\":"<"<sync()<<"\""; + o.print("],\"sel\":\""); + o.print(((menuVariantBase*)&node)->sync()); + o.print("\""); + } + }; +#endif diff --git a/src/menuIO/keyMapDef.h b/src/menuIO/keyMapDef.h index 10a9035a..b075ed7d 100644 --- a/src/menuIO/keyMapDef.h +++ b/src/menuIO/keyMapDef.h @@ -5,7 +5,7 @@ struct keyMap { int8_t pin; - int8_t code; + uint8_t code; }; #endif diff --git a/src/menuIO/liquidCrystalOutI2C.h b/src/menuIO/liquidCrystalOutI2C.h new file mode 100644 index 00000000..70ad396c --- /dev/null +++ b/src/menuIO/liquidCrystalOutI2C.h @@ -0,0 +1,43 @@ +/* -*- C++ -*- */ + +//for using I2C LiquidCrystal Library provided by +// https://gitlab.com/tandembyte/LCD_I2C + +#ifndef RSITE_ARDUINO_MENU_LIQUIDCRYSTALOUT + #define RSITE_ARDUINO_MENU_LIQUIDCRYSTALOUT + #include "../menuDefs.h" + #include + + namespace Menu { + + class liquidCrystalOut:public cursorOut { + public: + LiquidCrystal_I2C& device; + inline liquidCrystalOut(LiquidCrystal_I2C& o,idx_t *t,panelsList &p,menuOut::styles s=minimalRedraw) + :cursorOut(t,p,s),device(o) {} + size_t write(uint8_t ch) override {return device.write(ch);} + void clear() override { + device.clear(); + panels.reset(); + } + void setCursor(idx_t x,idx_t y,idx_t panelNr=0) override { + const panel p=panels[panelNr]; + device.setCursor(p.x+x,p.y+y); + } + idx_t startCursor(navRoot& root,idx_t x,idx_t y,bool charEdit,idx_t panelNr=0) override {return 0;} + idx_t endCursor(navRoot& root,idx_t x,idx_t y,bool charEdit,idx_t panelNr=0) override {return 0;} + idx_t editCursor(navRoot& root,idx_t x,idx_t y,bool editing,bool charEdit,idx_t panelNr=0) override { + //text editor cursor + device.noBlink(); + device.noCursor(); + if (editing) { + device.setCursor(x, y); + if (charEdit) device.cursor(); + else device.blink(); + } + return 0; + } + }; + + }//namespace Menu +#endif diff --git a/src/menuIO/rotaryEventIn.h b/src/menuIO/rotaryEventIn.h new file mode 100644 index 00000000..29aa4195 --- /dev/null +++ b/src/menuIO/rotaryEventIn.h @@ -0,0 +1,107 @@ +/* -*- C++ -*- */ +/************** + +RotaryEventIn.h + +March 2020 M. Smit - github@gangkast.nl +Generic Rotary/Button input + +purpose: + + Having a generic rotary event-based implementation, + leaving rotary and button libraries up to the user. + + TODO: userland rotary/button event mapping to menu actions, + as doubleclick/longpress are now hardcoded to back. + +***/ + + +// not sure where to put this.. +template constexpr inline T operator~ (T a) { return (T)~(int)a; } +template constexpr inline T operator| (T a, T b) { return (T)((int)a | (int)b); } +template constexpr inline T operator& (T a, T b) { return (T)((int)a & (int)b); } +template constexpr inline T operator^ (T a, T b) { return (T)((int)a ^ (int)b); } +template constexpr inline T& operator|= (T& a, T b) { return (T&)((int&)a |= (int)b); } +template constexpr inline T& operator&= (T& a, T b) { return (T&)((int&)a &= (int)b); } +template constexpr inline T& operator^= (T& a, T b) { return (T&)((int&)a ^= (int)b); } + + +#ifndef __rotaryEventIn_h__ + #define __rotaryEventIn_h__ + #include "../menuDefs.h" + + namespace Menu { + + class RotaryEventIn:public menuIn { + + public: + + enum EventType { + BUTTON_CLICKED = 1 << 0, + BUTTON_DOUBLE_CLICKED = 1 << 1, + BUTTON_LONG_PRESSED = 1 << 2, + + ROTARY_CW = 1 << 5, // fix for issue #414 + ROTARY_CCW = 1 << 4, + }; +/* +EventType values should be different for codes defined as: +const navCodesDef Menu::defaultNavCodes (menuBase.cpp file) +and special cases in textField::parseInput (items.cpp file) function +*/ + + EventType config; + EventType events; // we could do a fifo if we miss events + + RotaryEventIn(EventType c) + :config(c) { + // config for future use. we could raise if + // we are missing essential stuff + // and we need to absorb an arg anyway... + } + + void registerEvent(EventType e) { + events |= e; // add it to the current events + } + + int peek(void) override { return events; } + int available(void) override {return peek() != 0;} + + int read() override { + // enterCmd + if (events & EventType::BUTTON_CLICKED) { + events &= ~EventType::BUTTON_CLICKED; // remove from events + return options->navCodes[enterCmd].ch; + } + // escCmd + else if (events & (EventType::BUTTON_DOUBLE_CLICKED|EventType::BUTTON_LONG_PRESSED)) { + events &= ~(EventType::BUTTON_DOUBLE_CLICKED|EventType::BUTTON_LONG_PRESSED); // remove + return options->navCodes[escCmd].ch; + } + // downCmd + else if (events & EventType::ROTARY_CW) { + events &= ~EventType::ROTARY_CW; // remove from events + return options->navCodes[upCmd].ch; // down sends up on menu? bug? + } + // upCmd + else if (events & EventType::ROTARY_CCW) { + events &= ~EventType::ROTARY_CCW; // remove from events + return options->navCodes[downCmd].ch; // up sends down on menu? bug? + } + + else + return -1; + } + + void flush() override {} + size_t write(uint8_t v) override {return 0;} + + }; // class + + + }//namespace Menu + + + +#endif /* __rotaryEventIn_h__ */ diff --git a/src/menuIO/serialOut.cpp b/src/menuIO/serialOut.cpp index c0199fd8..9e7b7746 100644 --- a/src/menuIO/serialOut.cpp +++ b/src/menuIO/serialOut.cpp @@ -2,7 +2,12 @@ #include "serialOut.h" namespace Menu { - constMEM panel default_serial_panels[] MEMMODE={{0,0,40,10}}; + #ifdef MENU_DEBUG + constexpr idx_t w=20; + #else + constexpr idx_t w=40; + #endif + constMEM panel default_serial_panels[] MEMMODE={{0,0,w,10}};//arbitrary serial panel dimensions navNode* default_serial_nodes[sizeof(default_serial_panels)/sizeof(panel)]; panelsList default_serial_panel_list( default_serial_panels, diff --git a/src/menuIO/serialOut.h b/src/menuIO/serialOut.h index 929a516a..014f50b4 100644 --- a/src/menuIO/serialOut.h +++ b/src/menuIO/serialOut.h @@ -12,8 +12,8 @@ public: Print& device; idx_t lastLine=-1; - inline serialOut(Print& o,idx_t* t,panelsList &p=default_serial_panel_list,menuOut::styles st=menuOut::none) - :menuOut(t,p,(menuOut::styles)(st|menuOut::drawNumIndex)),device(o) {} + inline serialOut(Print& o,idx_t* t,panelsList &p=default_serial_panel_list,menuOut::styles st=menuOut::drawNumIndex) + :menuOut(t,p,st),device(o) {} size_t write(uint8_t ch) override { //trace(MENU_DEBUG_OUT.write('|')); return device.write(ch); diff --git a/src/menuIO/u8g2Out.h b/src/menuIO/u8g2Out.h index 89fbe69f..e4ec5602 100644 --- a/src/menuIO/u8g2Out.h +++ b/src/menuIO/u8g2Out.h @@ -71,7 +71,7 @@ namespace Menu { void clearLine(idx_t ln,idx_t panelNr=0,colorDefs color=bgColor,bool selected=false,status stat=enabledStatus,bool edit=false) override { const panel p=panels[panelNr]; setColor(color,selected,stat,edit); - gfx.drawBox(p.x*resX + offsetX - 1,(p.y+ln)*resY + offsetY /*- fontMarginY*/,maxX()*resX /*+ fontMarginY*/ /*+ fontMarginY*/,resY /*+ fontMarginY*/ /*+ fontMarginY*/); + gfx.drawBox(p.x*resX + offsetX /*- 1*/,(p.y+ln)*resY + offsetY /*- fontMarginY*/,maxX()*resX /*+ fontMarginY*/ /*+ fontMarginY*/,resY /*+ fontMarginY*/ /*+ fontMarginY*/); //setCursor(0,ln); } void clear() override { @@ -97,16 +97,43 @@ namespace Menu { } void setCursor(idx_t x,idx_t y,idx_t panelNr=0) override { + // _trace(Serial<<"setCursor"< (&colors)[nColors]; + uartOut( + Stream& stream, + const colorDef (&c)[nColors], + idx_t* t, + panelsList &p, + systemFont font = font24, + idx_t offsetX=0, + idx_t offsetY=0, + int fontMarginY=1 + ) :gfxOut(font/2,font,t,p,(styles)(menuOut::redraw|menuOut::rasterDraw)),stream(stream),colors(c) + { + this->offsetX=offsetX; + this->offsetY=offsetY; + this->fontMarginY=fontMarginY; + this->m_Font = font; + } + + size_t write(uint8_t ch) override + { + sprintf(buf,"SBC(%d);DCV%d(%d,%d,'%c',%d);", m_bgColor, m_Font, cursorX, cursorY - resY + fontMarginY, (char)ch, currentColor); + sendCommand(buf); + cursorX = cursorX + resX; + return 1; + } + + inline uint8_t getColor(colorDefs color=bgColor,bool selected=false,status stat=enabledStatus,bool edit=false) const + { + return memByte(&(stat==enabledStatus?colors[color].enabled[selected+edit]:colors[color].disabled[selected])); + } + + void setBgColor(colorDefs c,bool selected=false,status s=enabledStatus,bool edit=false) + { + m_bgColor = getColor(c,selected,s,edit); + } + + void setColor(colorDefs c,bool selected=false,status s=enabledStatus,bool edit=false) override + { + currentColor = getColor(c,selected,s,edit); + } + + void clearLine(idx_t ln,idx_t panelNr=0,colorDefs color=bgColor,bool selected=false,status stat=enabledStatus,bool edit=false) override + { + const panel p=panels[panelNr]; + setBgColor(color,selected,stat,edit); + drawBox(p.x*resX + offsetX, (p.y+ln)*resY + offsetY, maxX()*resX, resY); + } + + void clear() override + { + sendCommand("CLR(7);"); + panels.reset(); + } + + void clear(idx_t panelNr) override + { + const panel p=panels[panelNr]; + setBgColor(bgColor,false,enabledStatus,false);; + drawBox(p.x*resX + offsetX,p.y*resY + offsetY,p.w*resX,p.h*resY); + panels.nodes[panelNr]=NULL; + } + + void box(idx_t panelNr,idx_t x,idx_t y,idx_t w=1,idx_t h=1,colorDefs c=bgColor,bool selected=false,status stat=enabledStatus,bool edit=false) override + { + const panel p=panels[panelNr]; + setBgColor(c, selected, stat, edit); + drawFrame((p.x+x)*resX,(p.y+y)*resY, w*resX, h*resY); + } + + void rect(idx_t panelNr,idx_t x,idx_t y,idx_t w=1,idx_t h=1,colorDefs c=bgColor,bool selected=false,status stat=enabledStatus,bool edit=false) override + { + const panel p=panels[panelNr]; + setBgColor(c, selected, stat, edit); + drawBox((p.x+x)*resX, (p.y+y)*resY, w*resX, h*resY); + } + + void setCursor(idx_t x,idx_t y,idx_t panelNr=0) override + { + const panel p=panels[panelNr]; + cursorX = (p.x+x)*resX+fontMarginX + offsetX; + cursorY = (p.y+y+1)*resY-fontMarginY + offsetY; + } + + void drawCursor(idx_t ln,bool selected,status stat,bool edit=false,idx_t panelNr=0) override + { + const panel p=panels[panelNr]; + setBgColor(cursorColor,selected,stat); + drawFrame(p.x*resX + offsetX, (p.y+ln)*resY + offsetY, maxX()*resX, resY); + } + + idx_t printRaw(const char* at,idx_t len) override + { + sprintf_P(buf,PSTR("SBC(%d);DCV%d(%d,%d,'%S',%d);"), m_bgColor, m_Font, cursorX, cursorY - resY + fontMarginY, at, currentColor); + sendCommand(buf); + cursorX = cursorX + strlen_P(at)*resX; + return strlen_P(at); + } + + private: + + void checkStreamReady() + { + int cnt = 0, timeOutCounter = 1000; + while (timeOutCounter-- > 0) + { + delay(1); + if (stream.available() > 0) + { + stream.read(); + if (++cnt == 4) break; + } + } + } + + void sendCommand(char * cmd) + { + stream.println(cmd); + //Serial.println(cmd); + checkStreamReady(); + } + + void drawFrame(int x, int y, int w, int h) + { + sprintf(buf, "BOX(%d,%d,%d,%d,%d);", x, y, x + w, y + h, m_bgColor); + sendCommand(buf); + } + + void drawBox(int x, int y, int w, int h) + { + sprintf(buf, "BOXF(%d,%d,%d,%d,%d);", x, y, x + w, y + h, m_bgColor); + sendCommand(buf); + } + }; +} +#endif //RSITE_ARDUINOP_MENU_UART diff --git a/src/menuIO/xmlFmt.h b/src/menuIO/xmlFmt.h index 7ad87dce..656d8d4e 100644 --- a/src/menuIO/xmlFmt.h +++ b/src/menuIO/xmlFmt.h @@ -6,7 +6,7 @@ #ifdef MENU_FMT_WRAPS #include "../menuDefs.h" #include "../items.h" - #include "esp8266Out.h" + // #include "esp8266Out.h" namespace Menu { @@ -126,6 +126,10 @@ *this<<"\">"; break; + case menuOut::fmtEditCursor: + if (start) *this<<""; + break; case menuOut::fmtTextField: if (start) *this<<""; @@ -135,6 +139,8 @@ else *this<<"]]>"; break; case menuOut::fmtCursor: + case menuOut::fmtCursorOpen: + case menuOut::fmtCursorClose: if (start) *this<<""; break; @@ -154,5 +160,6 @@ result fmtEnd(prompt& target,menuOut::fmtParts part,navNode &nav,idx_t idx=-1) override {return fmt(false,target,part,nav,idx);} }; }//namespace + #include "xmlFmt.hpp" #endif #endif diff --git a/src/menuIO/xmlFmt.cpp b/src/menuIO/xmlFmt.hpp similarity index 92% rename from src/menuIO/xmlFmt.cpp rename to src/menuIO/xmlFmt.hpp index bcfae1ec..fb38e479 100644 --- a/src/menuIO/xmlFmt.cpp +++ b/src/menuIO/xmlFmt.hpp @@ -1,5 +1,5 @@ +#include "../menuDefs.h" #ifdef MENU_FMT_WRAPS - #include "../menuDefs.h" #include "xmlFmt.h" namespace Menu { diff --git a/src/menuIo.cpp b/src/menuIo.cpp index de986e7e..e3ef3ecf 100644 --- a/src/menuIo.cpp +++ b/src/menuIo.cpp @@ -24,7 +24,7 @@ int noInput::peek() {return -1;} // //////////////////////////////////////////////////////////////////////////////// #if defined(MENU_DEBUG) || defined(MENU_ASYNC) - #ifdef ESP8266 + #if defined(ESP8266) || defined(ESP32) template menuOut& menuOut::operator<<(T o) {(*(Stream*)this)<<(o);return *this;} #endif @@ -52,6 +52,12 @@ idx_t menuOut::printRaw(const char* at,idx_t len) { return at-p-1; } +idx_t menuOut::printText(const char* at,idx_t len) { + for(int n=0;at[n]&&(len==0||nlevel]; @@ -192,6 +198,9 @@ void outputsList::clearChanged(navNode& nav) const { void outputsList::clear() { for(int n=0;nclear(); } +// void outputsList::reset() { +// for(int n=0;nreset(); +// } void outputsList::doNav(navCmd cmd,class navNode &nav) { for(int n=0;ndoNav(cmd,nav); } @@ -401,13 +410,15 @@ Used menuOut::printMenu(navNode &nav,idx_t panelNr) { #endif //------> cursorStart #ifdef MENU_FMT_WRAPS - fmtStart(p,fmtCursor,nav,i); + fmtStart(p,fmtCursorOpen,nav,i); + // fmtStart(p,fmtCursor,nav,i); #endif if (asPad&&selected) print("["); else drawCursor(ist,selected,p.enabled,ed,panelNr);//assuming only one character //<------ cursorEnd #ifdef MENU_FMT_WRAPS - fmtEnd(p,fmtCursor,nav,i); + fmtEnd(p,fmtCursorOpen,nav,i); + // fmtEnd(p,fmtCursor,nav,i); #endif len--; //---->opBodyStart @@ -419,11 +430,13 @@ Used menuOut::printMenu(navNode &nav,idx_t panelNr) { if (len>0) { if (asPad) { #ifdef MENU_FMT_WRAPS - fmtStart(p,fmtCursor,nav,i); + // fmtStart(p,fmtCursor,nav,i); + fmtStart(p,fmtCursorClose,nav,i); #endif print(selected?"]":""); #ifdef MENU_FMT_WRAPS - fmtEnd(p,fmtCursor,nav,i); + fmtEnd(p,fmtCursorClose,nav,i); + // fmtEnd(p,fmtCursor,nav,i); #endif len--; } @@ -457,6 +470,7 @@ Used menuOut::printMenu(navNode &nav,idx_t panelNr) { #ifdef MENU_FMT_WRAPS fmtEnd(*nav.target,fmtPanel,nav,-1); #endif + trace(MENU_DEBUG_OUT<<"ENDING menuOut::printMenu(navNode &nav,idx_t panelNr)"< menuOut& operator<<(T o); #endif #endif @@ -165,6 +169,7 @@ void refresh();//force redraw of all outputs on next output call void clearChanged(navNode& nav) const; void clear(); + // void reset(); void doNav(navCmd cmd,class navNode &nav); result idle(idleFunc f,idleEvent e,bool idleChanged=false); }; diff --git a/src/nav.cpp b/src/nav.cpp index ea2567d0..b8d840e9 100644 --- a/src/nav.cpp +++ b/src/nav.cpp @@ -20,11 +20,26 @@ idx_t panelsList::maxY() const { // //////////////////////////////////////////////////////////////////////////////// +static uint8_t escaped = 0; + navCmd navNode::navKeys(char ch) { trace(MENU_DEBUG_OUT<<"navNode::navKeys"<useAccel&&strchr(numericChars,ch)) { return navCmd(idxCmd,ch-'1'); } + if ((escaped == 0) && (ch == '\e')) {escaped = 1; return noCmd;} + else if ((escaped == 1) && (ch == '[')) {escaped = 2; return noCmd;} + else if (escaped == 1) {escaped = 0; return noCmd;} + else if (escaped == 2) { + escaped = 0; + switch (ch) { + case 'A': return(downCmd); break; + case 'B': return(upCmd); break; + case 'C': return(enterCmd); break; + case 'D': return(escCmd); break; + default: return(noCmd); break; + } + } for(uint8_t i=0;inavCodes)/sizeof(navCode);i++) if (options->navCodes[i].ch==ch) return options->navCodes[i].cmd; return noCmd; @@ -44,18 +59,22 @@ navCmd navNode::doNavigation(navCmd cmd) { root->out.doNav(cmd,*this);*/ case upCmd: // trace(MENU_DEBUG_OUT<<"up"<=sz()) {if(wrap()) nsel=0; else nsel=sz()-1;} - // trace(MENU_DEBUG_OUT<<"new sel:"<=sz()) {if(wrap()) nsel=0; else nsel=sz()-1;} + // trace(MENU_DEBUG_OUT<<"new sel:"<isVariant()) root->out.doNav(cmd,*this);*/ case downCmd: - // trace(MENU_DEBUG_OUT<<"down"<is(_asPad)) { - nsel--; - if (nsel<0) {if(wrap()) nsel=sz()-1; else nsel=0;} + if(sz()) { + nsel--; + if (nsel<0) {if(wrap()) nsel=sz()-1; else nsel=0;} + } break; } case escCmd: @@ -125,8 +144,7 @@ void navRoot::initPath(idx_t d) { path[n].root=this; } void navRoot::useMenu(menuNode &menu) { - navFocus=&menu; - path[0].target=&menu; + path[0].useMenu(menu); reset(); refresh(); } @@ -161,7 +179,7 @@ void navRoot::doOutput() { bool c=idleChanged; idleChanged=false;//turn it off here so that sleepTask can force it on again out.idle(sleepTask,idling,c); - #ifdef MENU_IDLE_BKGND + #ifdef MENU_IDLE_BKGND//cascade menu sysrtem idle behind user idle task if (idleTask!=sleepTask) out.idle(idleTask,idling); #endif } @@ -181,7 +199,7 @@ void navRoot::doNav(navCmd cmd) { } navCmd navRoot::enter() { - trace(MENU_DEBUG_OUT<<"navRoot::enter"<dirty=true; if (!isMenu) in.fieldOn(); } + //node().event(activateEvent);//item is active.. not here, root info is not set yet return rCmd; } return noCmd; @@ -237,6 +258,7 @@ navCmd navRoot::exit() { } active().dirty=true; navFocus=&active(); + if (navFocus->asPad()) exit(); return escCmd; } @@ -300,13 +322,16 @@ bool navRoot::changed(const menuOut& out) { // return e.seek(++uri,--len); // } else return NULL; // } -void navRoot::escTo(idx_t lvl) { +idx_t navRoot::escTo(idx_t lvl) { assert(lvl>=0); // if (lvl<0) return; + idx_t cnt=0; while(level>lvl) { trace(MENU_DEBUG_OUT<<"escaping "< + +using namespace Menu; + +//minimalist SD Card driver (using arduino SD) +//we avoid allocating memory here, instead we read all info from SD +template +class FSO { +public: + using Type=SDC; + Type& sdc; + //idx_t selIdx=0;//preserve selection context, because we preserve folder ctx too + //we should use filename instead! idx is useful for delete operations thou... + + File dir; + + FSO(Type& sdc):sdc(sdc) {} + virtual ~FSO() {dir.close();} + //open a folder + bool goFolder(String folderName) { + dir.close(); + // Serial.println("reopen dir, context"); + dir=sdc.open(folderName.c_str()); + return dir; + } + //count entries on folder (files and dirs) + long count() { + // Serial.print("count:"); + dir.rewindDirectory(); + int cnt=0; + while(true) { + File file=dir.openNextFile(); + if (!file) { + file.close(); + break; + } + file.close(); + cnt++; + } + // Serial.println(cnt); + return cnt; + } + + //get entry index by filename + long entryIdx(String name) { + dir.rewindDirectory(); + int cnt=0; + while(true) { + File file=dir.openNextFile(); + if (!file) { + file.close(); + break; + } + if(name==file.name()) { + file.close(); + return cnt; + } + file.close(); + cnt++; + } + return 0;//stay at menu start if not found + } + + //get folder content entry by index + String entry(long idx) { + dir.rewindDirectory(); + idx_t cnt=0; + while(true) { + File file=dir.openNextFile(); + if (!file) { + file.close(); + break; + } + if(idx==cnt++) { + String n=String(file.name())+(file.isDirectory()?"/":""); + file.close(); + return n; + } + file.close(); + } + return ""; + } + +}; + +////////////////////////////////////////////////////////////////////// +// SD Card cached menu +template +class CachedFSO:public FSO { +public: + using Type=SDC; + long cacheStart=0; + String cache[maxSz]; + long size=0;//folder size (count of files and folders) + CachedFSO(Type& sdc):FSO(sdc) {} + void refresh(long start=0) { + if (start<0) start=0; + // Serial.print("Refreshing from:"); + // Serial.println(start); + cacheStart=start; + FSO::dir.rewindDirectory(); + size=0; + while(true) { + File file=FSO::dir.openNextFile(); + if (!file) { + file.close(); + break; + } + if (start<=size&&size::goFolder(folderName)) return false; + refresh(); + return true; + } + long count() {return size;} + + long entryIdx(String name) { + idx_t sz=min(count(),(long)maxSz); + for(int i=0;i::entryIdx(name); + //put cache around the missing item + refresh(at-(maxSz>>1)); + return at; + } + String entry(long idx) { + if (0>idx||idx>=size) return ""; + if (cacheStart<=idx&&idx<(cacheStart+maxSz)) return cache[idx-cacheStart]; + refresh(idx-(maxSz>>1)); + return entry(idx); + } +}; + +//////////////////////////////////////////////////////////////////////////// +#include +// instead of allocating options for each file we will instead customize a menu +// to print the files list, we can opt to use objects for each file for a +// faster reopening.. but its working quite fast +// On this example we assume the existence of an esc button as we are not drawing +// an exit option (or [..] as would be appropriate for a file system) +// not the mennu presents it self as the menu and as the options +// ands does all drawing navigation. +//TODO: we can specialize input too, for typing filename select + #define USE_BACKDOTS 1 + +template +class SDMenuT:public menuNode,public FS { +public: + String folderName="/";//set this to other folder when needed + String selectedFolder="/"; + String selectedFile=""; + // using menuNode::menuNode;//do not use default constructors as we wont allocate for data + SDMenuT(typename FS::Type& sd,constText* title,const char* at,Menu::action act=doNothing,Menu::eventMask mask=noEvent) + :menuNode(title,0,NULL,act,mask, + wrapStyle,(systemStyles)(_menuData|_canNav)) + ,FS(sd) + {} + + void begin() {FS::goFolder(folderName);} + + //this requires latest menu version to virtualize data tables + prompt& operator[](idx_t i) const override {return *(prompt*)this;}//this will serve both as menu and as its own prompt + result sysHandler(SYS_FUNC_PARAMS) override { + switch(event) { + case enterEvent: + if (nav.root->navFocus!=nav.target) {//on sd card entry + nav.sel=((SDMenuT*)(&item))->entryIdx(((SDMenuT*)(&item))->selectedFile)+USE_BACKDOTS;//restore context + } + } + return proceed; + } + + void doNav(navNode& nav,navCmd cmd) { + switch(cmd.cmd) { + case enterCmd: if (nav.sel>=USE_BACKDOTS) { + String selFile=SDMenuT::entry(nav.sel-USE_BACKDOTS); + if (selFile.endsWith("/")) { + // Serial.print("\nOpen folder..."); + //open folder (reusing the menu) + folderName+=selFile; + SDMenuT::goFolder(folderName); + dirty=true;//redraw menu + nav.sel=0; + } else { + //Serial.print("\nFile selected:"); + //select a file and return + selectedFile=selFile; + selectedFolder=folderName; + nav.root->node().event(enterEvent); + menuNode::doNav(nav,escCmd); + } + return; + } + case escCmd: + if(folderName=="/")//at root? + menuNode::doNav(nav,escCmd);//then exit + else {//previous folder + idx_t at=folderName.lastIndexOf("/",folderName.length()-2)+1; + String fn=folderName.substring(at,folderName.length()-1); + folderName.remove(folderName.lastIndexOf("/",folderName.length()-2)+1); + SDMenuT::goFolder(folderName); + dirty=true;//redraw menu + nav.sel=SDMenuT::entryIdx(fn)+USE_BACKDOTS; + } + return; + } + menuNode::doNav(nav,cmd); + } + + //print menu and items as this is a virtual data menu + Used printTo(navRoot &root,bool sel,menuOut& out, idx_t idx,idx_t len,idx_t pn) { + if(root.navFocus!=this) {//show given title or filename if selected + return selectedFile==""? + /*menuNode::printTo(root,sel,out,idx,len,pn)*/ + out.printRaw(shadow->text,len): + out.printRaw(selectedFile.c_str(),len); + } else if(idx==-1) {//when menu open (show folder name) + ((menuNodeShadow*)shadow)->sz=SDMenuT::count()+USE_BACKDOTS; + idx_t at=folderName.lastIndexOf("/",folderName.length()-2)+1; + String fn=folderName.substring(at,folderName.length()-1); + return out.printRaw(fn.c_str(),len); + // return out.printRaw(folderName.c_str(),len); + // return out.printRaw(SDMenuT::dir.name(),len); + } + //drawing options + out.setColor(fgColor, sel); + idx_t i=out.tops[root.level]+idx; + if (i::entry(out.tops[root.level]+idx-USE_BACKDOTS).c_str(),len); + return len; + } +}; + +class SDMenu:public SDMenuT> { +public: + SDMenu(constText* title,const char* at,Menu::action act=doNothing,Menu::eventMask mask=noEvent) + :SDMenuT>(SD,title,at,act,mask) {} +}; + +template +class CachedSDMenu:public SDMenuT> { +public: + CachedSDMenu(constText* title,const char* at,Menu::action act=doNothing,Menu::eventMask mask=noEvent) + :SDMenuT>(SD,title,at,act,mask) {} +}; diff --git a/src/plugin/SdFatMenu.h b/src/plugin/SdFatMenu.h new file mode 100644 index 00000000..9cd150e8 --- /dev/null +++ b/src/plugin/SdFatMenu.h @@ -0,0 +1,269 @@ +/* -*- C++ -*- */ +#pragma once +// a full automated SDCard file select +// plugin for arduino menu library +// requires a dynamic menu (MENU_USERAM) +// IO: Serial +// Feb 2019 - Rui Azevedo [ruihfazevedo@gmail.com] + +//using SdFat library +//from: https://github.com/greiman/SdFat + +#include + +using namespace Menu; + +#define FN_SIZE 255 + +//minimalist SD Card driver (using arduino SD) +//we avoid allocating memory here, instead we read all info from SD +template +class FSO { +public: + char fname[FN_SIZE+1]; + using Type=SDC; + Type& sdc; + //idx_t selIdx=0;//preserve selection context, because we preserve folder ctx too + //we should use filename instead! idx is useful for delete operations thou... + + File dir; + + FSO(Type& sdc):sdc(sdc) {} + virtual ~FSO() {dir.close();} + //get file name + //open a folder + bool goFolder(String folderName) { + dir.close(); + // Serial.println("reopen dir, context"); + dir=sdc.open(folderName.c_str()); + return dir; + } + //count entries on folder (files and dirs) + long count() { + // Serial.print("count:"); + dir.rewindDirectory(); + int cnt=0; + while(true) { + File file=dir.openNextFile(); + if (!file) { + file.close(); + break; + } + file.close(); + cnt++; + } + // Serial.println(cnt); + return cnt; + } + + //get entry index by filename + long entryIdx(String name) { + dir.rewindDirectory(); + int cnt=0; + while(true) { + File file=dir.openNextFile(); + if (!file) { + file.close(); + break; + } + if(file.getName(fname,fnSize)&&name==fname) { + file.close(); + return cnt; + } + file.close(); + cnt++; + } + return 0;//stay at menu start if not found + } + + //get folder content entry by index + String entry(long idx) { + dir.rewindDirectory(); + idx_t cnt=0; + while(true) { + File file=dir.openNextFile(); + if (!file) { + file.close(); + break; + } + if(idx==cnt++) { + file.getName(fname,fnSize); + String n=String(fname)+(file.isDirectory()?"/":""); + file.close(); + return n; + } + file.close(); + } + return ""; + } + +}; + +////////////////////////////////////////////////////////////////////// +// SD Card cached menu +template +class CachedFSO:public FSO { +public: + using Type=SDC; + long cacheStart=0; + String cache[maxSz]; + long size=0;//folder size (count of files and folders) + CachedFSO(Type& sdc):FSO(sdc) {} + void refresh(long start=0) { + if (start<0) start=0; + // Serial.print("Refreshing from:"); + // Serial.println(start); + cacheStart=start; + FSO::dir.rewindDirectory(); + size=0; + while(true) { + File file=FSO::dir.openNextFile(); + if (!file) { + file.close(); + break; + } + if (start<=size&&size::fname,fnSize); + cache[size-start]=String(FSO::fname)+(file.isDirectory()?"/":""); + } + file.close(); + size++; + } + } + //open a folder + bool goFolder(String folderName) { + if (!FSO::goFolder(folderName)) return false; + refresh(); + return true; + } + long count() {return size;} + + long entryIdx(String name) { + idx_t sz=min(count(),(long)maxSz); + for(int i=0;i::entryIdx(name); + //put cache around the missing item + refresh(at-(maxSz>>1)); + return at; + } + String entry(long idx) { + if (0>idx||idx>=size) return ""; + if (cacheStart<=idx&&idx<(cacheStart+maxSz)) return cache[idx-cacheStart]; + refresh(idx-(maxSz>>1)); + return entry(idx); + } +}; + +//////////////////////////////////////////////////////////////////////////// +#include +// instead of allocating options for each file we will instead customize a menu +// to print the files list, we can opt to use objects for each file for a +// faster reopening.. but its working quite fast +// On this example we assume the existence of an esc button as we are not drawing +// an exit option (or [..] as would be appropriate for a file system) +// not the mennu presents it self as the menu and as the options +// ands does all drawing navigation. +//TODO: we can specialize input too, for typing filename select + #define USE_BACKDOTS 1 + +template +class SDMenuT:public menuNode,public FS { +public: + String folderName="/";//set this to other folder when needed + String selectedFolder="/"; + String selectedFile=""; + // using menuNode::menuNode;//do not use default constructors as we wont allocate for data + SDMenuT(typename FS::Type& sd,constText* title,const char* at,Menu::action act=doNothing,Menu::eventMask mask=noEvent) + :menuNode(title,0,NULL,act,mask, + wrapStyle,(systemStyles)(_menuData|_canNav)) + ,FS(sd) + {} + + void begin() {FS::goFolder(folderName);} + + //this requires latest menu version to virtualize data tables + prompt& operator[](idx_t i) const override {return *(prompt*)this;}//this will serve both as menu and as its own prompt + result sysHandler(SYS_FUNC_PARAMS) override { + switch(event) { + case enterEvent: + if (nav.root->navFocus!=nav.target) {//on sd card entry + nav.sel=((SDMenuT*)(&item))->entryIdx(((SDMenuT*)(&item))->selectedFile)+USE_BACKDOTS;//restore context + } + } + return proceed; + } + + void doNav(navNode& nav,navCmd cmd) { + switch(cmd.cmd) { + case enterCmd: if (nav.sel>=USE_BACKDOTS) { + String selFile=SDMenuT::entry(nav.sel-USE_BACKDOTS); + if (selFile.endsWith("/")) { + // Serial.print("\nOpen folder..."); + //open folder (reusing the menu) + folderName+=selFile; + SDMenuT::goFolder(folderName); + dirty=true;//redraw menu + nav.sel=0; + } else { + //Serial.print("\nFile selected:"); + //select a file and return + selectedFile=selFile; + selectedFolder=folderName; + nav.root->node().event(enterEvent); + menuNode::doNav(nav,escCmd); + } + return; + } + case escCmd: + if(folderName=="/")//at root? + menuNode::doNav(nav,escCmd);//then exit + else {//previous folder + idx_t at=folderName.lastIndexOf("/",folderName.length()-2)+1; + String fn=folderName.substring(at,folderName.length()-1); + folderName.remove(folderName.lastIndexOf("/",folderName.length()-2)+1); + SDMenuT::goFolder(folderName); + dirty=true;//redraw menu + nav.sel=SDMenuT::entryIdx(fn)+USE_BACKDOTS; + } + return; + } + menuNode::doNav(nav,cmd); + } + + //print menu and items as this is a virtual data menu + Used printTo(navRoot &root,bool sel,menuOut& out, idx_t idx,idx_t len,idx_t pn) { + if(root.navFocus!=this) {//show given title or filename if selected + return selectedFile==""? + /*menuNode::printTo(root,sel,out,idx,len,pn)*/ + out.printRaw(shadow->text,len): + out.printRaw(selectedFile.c_str(),len); + } else if(idx==-1) {//when menu open (show folder name) + ((menuNodeShadow*)shadow)->sz=SDMenuT::count()+USE_BACKDOTS; + idx_t at=folderName.lastIndexOf("/",folderName.length()-2)+1; + String fn=folderName.substring(at,folderName.length()-1); + return out.printRaw(fn.c_str(),len); + // return out.printRaw(folderName.c_str(),len); + // return out.printRaw(SDMenuT::dir.name(),len); + } + //drawing options + out.setColor(fgColor, sel); + idx_t i=out.tops[root.level]+idx; + if (i::entry(out.tops[root.level]+idx-USE_BACKDOTS).c_str(),len); + return len; + } +}; + +// class SDMenu:public SDMenuT> { +// public: +// SDMenu(SdFat& sd,constText* title,const char* at,Menu::action act=doNothing,Menu::eventMask mask=noEvent) +// :SDMenuT>(SD,title,at,act,mask) {} +// }; +// +// template +// class CachedSDMenu:public SDMenuT> { +// public: +// CachedSDMenu(constText* title,const char* at,Menu::action act=doNothing,Menu::eventMask mask=noEvent) +// :SDMenuT>(SD,title,at,act,mask) {} +// }; diff --git a/src/plugin/userMenu.h b/src/plugin/userMenu.h new file mode 100644 index 00000000..a5c9146a --- /dev/null +++ b/src/plugin/userMenu.h @@ -0,0 +1,81 @@ +/* -*- C++ -*- */ +/******************** +May 2020 Rui Azevedo - ruihfazevedo(@rrob@)gmail.com + +www.r-site.net + +user print menu with optional submenu +***/ + +#include "../menuDefs.h" + +namespace Menu { + + // menu with no defined data source, user has to provide a printItem method based on index + // menu has static size but user can oiverride sz() function, some info might be placed on flash + class UserMenu:public menuNode { + public: + menu* subMenu=NULL; + const char*backTitle=NULL; + UserMenu(constMEM menuNodeShadow& shadow,const char*backTitle=NULL) + :menuNode(shadow),backTitle(backTitle) {} + UserMenu(constMEM menuNodeShadow& shadow,menu& subMenu,const char*backTitle=NULL) + :menuNode(shadow),subMenu(&subMenu),backTitle(backTitle) {} + UserMenu(const char* text,idx_t size,menu& subMenu,action a=noAction,eventMask e=noEvent,styles style=wrapStyle) + :menuNode(text,size,NULL,a,e,style,(systemStyles)(_menuData|_canNav)),subMenu(&subMenu) {} + UserMenu(const char* text,idx_t size,const char*backTitle,menu& subMenu,action a=noAction,eventMask e=noEvent,styles style=wrapStyle) + :menuNode(text,size,NULL,a,e,style,(systemStyles)(_menuData|_canNav)),subMenu(&subMenu),backTitle(backTitle) {} + + inline idx_t sz() const override {return menuNode::sz()+(backTitle?1:0);} + + prompt& operator[](idx_t i) const override {return *(prompt*)this;} + virtual Used printItem(menuOut& out, int idx,int len)=0; + Used printTo(navRoot &root,bool sel,menuOut& out, idx_t idx,idx_t len,idx_t p) override { + if(root.navFocus!=this) return menuNode::printTo(root,sel,out,idx,len,p); + if(idx<0) return menuNode::printTo(root,sel,out,idx,len,p);//print the title + if(backTitle&&idx==sz()-1) return out.printText(backTitle,len); + trace(MENU_DEBUG_OUT<<"{"<navFocus==this) { + trace(MENU_DEBUG_OUT<<" submenu:"<<(subMenu?"yes":"no")<<" level:"<level<<"\n"); + switch (cmd.cmd) { + case selCmd: + case idxCmd: + trace(MENU_DEBUG_OUT<<"idxCmd "<exit(); + else { + nav.event(enterEvent); + if(subMenu) { + _trace(MENU_DEBUG_OUT<<"edit item"); + assert(nav.root->levelmaxDepth); + nav.root->active().dirty=true; + nav.root->level++; + nav.root->navFocus=nav.root->node().target=subMenu; + nav.root->node().sel=0; + } + } + return; + default:break; + } + } + menuNode::doNav(nav,cmd); + } + }; + + //user menu to use std containers or other structure that provide a size() function + //not tested yes, please provide feedback + template + class StdMenu:UserMenu { + T& src; + StdMenu(constText* text,T& src,action a=noAction,eventMask e=noEvent,styles style=wrapStyle) + :menuNode(text,0,NULL,a,e),src(src) {} + StdMenu(constText* text,T& src,menu& subMenu,action a=noAction,eventMask e=noEvent,styles style=wrapStyle) + :menuNode(text,0,NULL,subMenu,a,e),src(src) {} + idx_t sz() const override {return src.size();} + }; +}; diff --git a/src/shadows.h b/src/shadows.h index 98d48d0c..f7e8b78c 100644 --- a/src/shadows.h +++ b/src/shadows.h @@ -10,7 +10,7 @@ struct promptShadowRaw { actionRaw a;//the hooked callback function systemStyles sysStyles; - constText*text; + const char* text; constMEM eventMask events;//registered events styles style; }; @@ -18,35 +18,39 @@ protected: public: systemStyles sysStyles; - constText*text; + const char* text; eventMask events;//registered events (mask) styles style; public: - promptShadow(constText* t,action a=doNothing,eventMask e=noEvent,styles s=noStyle,systemStyles ss=_noStyle) + promptShadow(const char* t,action a=doNothing,eventMask e=noEvent,styles s=noStyle,systemStyles ss=_noStyle) :action(a),sysStyles(ss),text(t),events(e),style(s) {} inline constText* getText() const {return (constText*)memPtr(text);} inline systemStyles _sysStyles() const {return (systemStyles)memEnum(&sysStyles);} inline eventMask _events() const {return (eventMask)memEnum(&events);} inline styles _style() const {return (styles)memEnum(&style);} }; + union promptShadows { + promptShadowRaw raw; + promptShadow obj; + }; struct textFieldShadowRaw { actionRaw a; systemStyles sysStyles; - constText*text; + const char*text; eventMask events;//registered events styles style; char* buffer; - char* const* validators; + const char* const* validators; idx_t sz; }; class textFieldShadow:public promptShadow { protected: public: char* buffer; - char* const* validators; + const char* const* validators; idx_t sz; textFieldShadow( - constText* label, + const char* label, char* b, idx_t sz, char* const* v, @@ -62,10 +66,14 @@ return (char*)memPtr(((char**)_validators())[i]); } }; + union textFieldShadows { + textFieldShadowRaw raw; + textFieldShadow obj; + }; struct menuNodeShadowRaw { actionRaw a; systemStyles sysStyles; - constText*text; + const char* text; eventMask events;//registered events styles style; idx_t sz; @@ -77,7 +85,7 @@ idx_t sz; prompt* constMEM* data; public: - menuNodeShadow(constText* text,idx_t sz,prompt* constMEM* data,action a,eventMask e,styles style,systemStyles ss=(systemStyles)(_menuData|_canNav)) + menuNodeShadow(const char* text,idx_t sz,prompt* constMEM* data,action a,eventMask e,styles style,systemStyles ss=(systemStyles)(_menuData|_canNav)) :promptShadow(text,a,e,style,ss),sz(sz),data(data) {} idx_t _sz() const {return (idx_t)memIdx(sz);} prompt* constMEM* _data() const {return (prompt* constMEM*)memPtr(data);} @@ -87,10 +95,15 @@ } }; + union menuNodeShadows { + menuNodeShadowRaw raw; + menuNodeShadow obj; + }; + struct fieldBaseShadowRaw { actionRaw a; systemStyles sysStyles; - constText*text; + const char* text; eventMask events;//registered events styles style; constText* units; @@ -106,7 +119,7 @@ struct menuFieldShadowRaw { actionRaw a; systemStyles sysStyles; - constText*text; + const char* text; eventMask events;//registered events styles style; constText* units; @@ -138,12 +151,17 @@ inline T _step() const {return getTypeValue(&step);} inline T _tune() const {return getTypeValue(&tune);} }; + template + union menuFieldShadows { + menuFieldShadowRaw raw; + menuFieldShadow obj; + }; template struct menuValueShadowRaw { actionRaw a; systemStyles sysStyles; - constText*text; + const char* text; eventMask events;//registered events styles style; T value; @@ -169,11 +187,17 @@ inline T target() const {return getTypeValue(&value);} }; + template + union menuValueShadows { + menuValueShadowRaw raw; + menuValueShadow obj; + }; + template struct menuVariantShadowRaw { actionRaw a; systemStyles sysStyles; - constText*text; + const char* text; constMEM eventMask events;//registered events styles style; idx_t sz; @@ -198,5 +222,11 @@ ):menuNodeShadow(text,sz,data,a,e,style,ss),value(&target) {} inline T& target() const {return *((T*)memPtr(value));} }; + template + union menuVariantShadows { + menuVariantShadowRaw raw; + menuVariantShadow obj; + }; }//namespace Menu + #endif