From cff314cbc8201bca12669943a6bd9c7af145ae64 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 3 Feb 2016 19:59:41 -0800 Subject: [PATCH 001/164] Convince compiler to not inline member constructors. --- firmware/baseband/dsp_decimate.cpp | 9 +++++++++ firmware/baseband/dsp_decimate.hpp | 10 ++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/firmware/baseband/dsp_decimate.cpp b/firmware/baseband/dsp_decimate.cpp index abd8e7d0..9b417d85 100644 --- a/firmware/baseband/dsp_decimate.cpp +++ b/firmware/baseband/dsp_decimate.cpp @@ -645,6 +645,15 @@ buffer_s16_t FIR64AndDecimateBy2Real::execute( return { dst.p, src.count / 2, src.sampling_rate / 2 }; } +void FIRAndDecimateComplex::configure_common( + const size_t taps_count, const size_t decimation_factor +) { + samples_ = std::make_unique(taps_count); + taps_reversed_ = std::make_unique(taps_count); + taps_count_ = taps_count; + decimation_factor_ = decimation_factor; +} + buffer_c16_t FIRAndDecimateComplex::execute( const buffer_c16_t& src, const buffer_c16_t& dst diff --git a/firmware/baseband/dsp_decimate.hpp b/firmware/baseband/dsp_decimate.hpp index 1a9bf303..52727075 100644 --- a/firmware/baseband/dsp_decimate.hpp +++ b/firmware/baseband/dsp_decimate.hpp @@ -241,12 +241,14 @@ private: const size_t taps_count, const size_t decimation_factor ) { - samples_ = std::make_unique(taps_count); - taps_reversed_ = std::make_unique(taps_count); - taps_count_ = taps_count; - decimation_factor_ = decimation_factor; + configure_common(taps_count, decimation_factor); std::reverse_copy(&taps[0], &taps[taps_count], &taps_reversed_[0]); } + + void configure_common( + const size_t taps_count, + const size_t decimation_factor + ); }; class DecimateBy2CIC4Real { From af8c9609a8807c8ae8ee2e0bab10b53a4385b6b9 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 3 Feb 2016 22:47:22 -0800 Subject: [PATCH 002/164] Little code size tweak using std::move in constructors. --- firmware/baseband/clock_recovery.hpp | 12 +++++++----- firmware/baseband/packet_builder.hpp | 4 ++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/firmware/baseband/clock_recovery.hpp b/firmware/baseband/clock_recovery.hpp index bd17255d..91f4cf8f 100644 --- a/firmware/baseband/clock_recovery.hpp +++ b/firmware/baseband/clock_recovery.hpp @@ -116,19 +116,21 @@ private: template class ClockRecovery { public: + using SymbolHandler = std::function; + ClockRecovery( const float sampling_rate, const float symbol_rate, ErrorFilter error_filter, - std::function symbol_handler - ) : symbol_handler { symbol_handler } + SymbolHandler symbol_handler + ) : symbol_handler { std::move(symbol_handler) } { configure(sampling_rate, symbol_rate, error_filter); } ClockRecovery( - std::function symbol_handler - ) : symbol_handler { symbol_handler } + SymbolHandler symbol_handler + ) : symbol_handler { std::move(symbol_handler) } { } @@ -155,7 +157,7 @@ private: dsp::interpolation::LinearResampler resampler; GardnerTimingErrorDetector timing_error_detector; ErrorFilter error_filter; - std::function symbol_handler; + const SymbolHandler symbol_handler; void resampler_callback(const float interpolated_sample) { timing_error_detector(interpolated_sample, diff --git a/firmware/baseband/packet_builder.hpp b/firmware/baseband/packet_builder.hpp index d32d129d..e3293529 100644 --- a/firmware/baseband/packet_builder.hpp +++ b/firmware/baseband/packet_builder.hpp @@ -53,8 +53,8 @@ public: const PreambleMatcher preamble_matcher, const UnstuffMatcher unstuff_matcher, const EndMatcher end_matcher, - const PayloadHandlerFunc payload_handler - ) : payload_handler { payload_handler }, + PayloadHandlerFunc payload_handler + ) : payload_handler { std::move(payload_handler) }, preamble(preamble_matcher), unstuff(unstuff_matcher), end(end_matcher) From 20137db8d0317406e203add13a193c57056b1458 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 3 Feb 2016 22:47:44 -0800 Subject: [PATCH 003/164] Move code into .cpp for tiny code size improvement. --- firmware/baseband/dsp_demodulate.cpp | 9 +++++++++ firmware/baseband/dsp_demodulate.hpp | 9 +-------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/firmware/baseband/dsp_demodulate.cpp b/firmware/baseband/dsp_demodulate.cpp index 1c59c174..3a0b7f12 100644 --- a/firmware/baseband/dsp_demodulate.cpp +++ b/firmware/baseband/dsp_demodulate.cpp @@ -137,5 +137,14 @@ buffer_s16_t FM::execute( return { dst.p, src.count, src.sampling_rate }; } +void FM::configure(const float sampling_rate, const float deviation_hz) { + /* + * angle: -pi to pi. output range: -32768 to 32767. + * Maximum delta-theta (output of atan2) at maximum deviation frequency: + * delta_theta_max = 2 * pi * deviation / sampling_rate + */ + k = static_cast(32767.0f / (2.0 * pi * deviation_hz / sampling_rate)); +} + } } diff --git a/firmware/baseband/dsp_demodulate.hpp b/firmware/baseband/dsp_demodulate.hpp index d7117b9d..00f9236a 100644 --- a/firmware/baseband/dsp_demodulate.hpp +++ b/firmware/baseband/dsp_demodulate.hpp @@ -55,14 +55,7 @@ public: const buffer_s16_t& dst ); - void configure(const float sampling_rate, const float deviation_hz) { - /* - * angle: -pi to pi. output range: -32768 to 32767. - * Maximum delta-theta (output of atan2) at maximum deviation frequency: - * delta_theta_max = 2 * pi * deviation / sampling_rate - */ - k = static_cast(32767.0f / (2.0 * pi * deviation_hz / sampling_rate)); - } + void configure(const float sampling_rate, const float deviation_hz); private: complex16_t::rep_type z_ { 0 }; From b2f2b970d2326a08323cc52d14587707c88b6ca2 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 4 Feb 2016 09:14:12 -0800 Subject: [PATCH 004/164] Try to update GCC used by Travis-CI. --- .travis.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index da50f6cf..8aa07466 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,14 +3,21 @@ language: cpp cache: apt before_install: - - sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded -y + # - sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded -y + # - sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa - sudo apt-get update -qq - - sudo apt-get install -y gcc-arm-none-eabi + # - sudo apt-get install -y gcc-arm-none-eabi + # - sudo apt-get install -y gcc-arm-embedded before_script: + - export PATH="gcc-arm-none-eabi-5_2-2015q4/bin:$PATH" - export CC="arm-none-eabi-gcc" - export CXX="arm-none-eabi-g++" +install: + - wget https://launchpad.net/gcc-arm-embedded/5.0/5-2015-q4-major/+download/gcc-arm-none-eabi-5_2-2015q4-20151219-linux.tar.bz2 + - tar -xf gcc-arm-none-eabi-5_2-2015q4-20151219-linux.tar.bz2 + script: # TODO: Introduce top-level Makefile, this is lame. - pushd firmware/ From d98740045f2cbc0b4ae2e2df915e05bb78e9a337 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 4 Feb 2016 09:30:25 -0800 Subject: [PATCH 005/164] Fix Travis GCC compiler path. Sorry for all the commits/pushes... --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8aa07466..0abc9682 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,16 +10,17 @@ before_install: # - sudo apt-get install -y gcc-arm-embedded before_script: - - export PATH="gcc-arm-none-eabi-5_2-2015q4/bin:$PATH" - export CC="arm-none-eabi-gcc" - export CXX="arm-none-eabi-g++" install: - wget https://launchpad.net/gcc-arm-embedded/5.0/5-2015-q4-major/+download/gcc-arm-none-eabi-5_2-2015q4-20151219-linux.tar.bz2 - tar -xf gcc-arm-none-eabi-5_2-2015q4-20151219-linux.tar.bz2 + - export PATH="$TRAVIS_BUILD_DIR/gcc-arm-none-eabi-5_2-2015q4/bin:$PATH" script: # TODO: Introduce top-level Makefile, this is lame. + - ls -l - pushd firmware/ - make release - popd From 1b8b932542cd11682a15d921cbe635192a2794c2 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 4 Feb 2016 09:37:46 -0800 Subject: [PATCH 006/164] Further Travis+GCC clean-up based on examples I found. --- .travis.yml | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0abc9682..6c0382a5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,25 +2,15 @@ language: cpp cache: apt -before_install: - # - sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded -y - # - sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa - - sudo apt-get update -qq - # - sudo apt-get install -y gcc-arm-none-eabi - # - sudo apt-get install -y gcc-arm-embedded - before_script: + - wget https://launchpad.net/gcc-arm-embedded/5.0/5-2015-q4-major/+download/gcc-arm-none-eabi-5_2-2015q4-20151219-linux.tar.bz2 -O /tmp/gcc-arm.tar.bz2 + - tar -xf /tmp/gcc-arm.tar.bz2 + - export PATH="$PWD/gcc-arm-none-eabi-5_2-2015q4/bin:$PATH" - export CC="arm-none-eabi-gcc" - export CXX="arm-none-eabi-g++" -install: - - wget https://launchpad.net/gcc-arm-embedded/5.0/5-2015-q4-major/+download/gcc-arm-none-eabi-5_2-2015q4-20151219-linux.tar.bz2 - - tar -xf gcc-arm-none-eabi-5_2-2015q4-20151219-linux.tar.bz2 - - export PATH="$TRAVIS_BUILD_DIR/gcc-arm-none-eabi-5_2-2015q4/bin:$PATH" - script: # TODO: Introduce top-level Makefile, this is lame. - - ls -l - pushd firmware/ - make release - popd From 8f296e6a5e0a3233ddd7c9d8347ff072660ecd47 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 4 Feb 2016 09:44:24 -0800 Subject: [PATCH 007/164] Travis, Travis, Travis. --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6c0382a5..d9af2d9d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,8 @@ cache: apt before_script: - wget https://launchpad.net/gcc-arm-embedded/5.0/5-2015-q4-major/+download/gcc-arm-none-eabi-5_2-2015q4-20151219-linux.tar.bz2 -O /tmp/gcc-arm.tar.bz2 - tar -xf /tmp/gcc-arm.tar.bz2 - - export PATH="$PWD/gcc-arm-none-eabi-5_2-2015q4/bin:$PATH" + - ls -l + - export PATH=$PWD/gcc-arm-none-eabi-5_2-2015q4/bin:$PATH - export CC="arm-none-eabi-gcc" - export CXX="arm-none-eabi-g++" From 6df906b9da4eb1d67d89bfdd95df9a2be66dca9c Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 4 Feb 2016 09:47:28 -0800 Subject: [PATCH 008/164] More Travis debugging. --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d9af2d9d..0683194b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,8 +5,9 @@ cache: apt before_script: - wget https://launchpad.net/gcc-arm-embedded/5.0/5-2015-q4-major/+download/gcc-arm-none-eabi-5_2-2015q4-20151219-linux.tar.bz2 -O /tmp/gcc-arm.tar.bz2 - tar -xf /tmp/gcc-arm.tar.bz2 - - ls -l + - ls -l gcc-arm-none-eabi-5_2-2015q4/bin - export PATH=$PWD/gcc-arm-none-eabi-5_2-2015q4/bin:$PATH + - echo $PATH - export CC="arm-none-eabi-gcc" - export CXX="arm-none-eabi-g++" From bdbe3146bef377ccad7777af18ca62c123d70354 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 4 Feb 2016 09:50:52 -0800 Subject: [PATCH 009/164] Travis debugging. --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0683194b..fb9e79c0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,14 +5,13 @@ cache: apt before_script: - wget https://launchpad.net/gcc-arm-embedded/5.0/5-2015-q4-major/+download/gcc-arm-none-eabi-5_2-2015q4-20151219-linux.tar.bz2 -O /tmp/gcc-arm.tar.bz2 - tar -xf /tmp/gcc-arm.tar.bz2 - - ls -l gcc-arm-none-eabi-5_2-2015q4/bin - export PATH=$PWD/gcc-arm-none-eabi-5_2-2015q4/bin:$PATH - - echo $PATH - export CC="arm-none-eabi-gcc" - export CXX="arm-none-eabi-g++" script: # TODO: Introduce top-level Makefile, this is lame. + - echo $PATH - pushd firmware/ - make release - popd From 5cf1f9af861db3e5b698acd8ab1bef8877596122 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 4 Feb 2016 09:55:27 -0800 Subject: [PATCH 010/164] And more Travis fiddling. --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fb9e79c0..cb96badf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,8 @@ before_script: script: # TODO: Introduce top-level Makefile, this is lame. - - echo $PATH + - /home/travis/build/sharebrained/portapack-hackrf/gcc-arm-none-eabi-5_2-2015q4/bin/arm-none-eabi-gcc -v + - arm-none-eabi-gcc -v - pushd firmware/ - make release - popd From c40648385adca031c817fa3c60d0bcc65331d2fe Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 4 Feb 2016 09:58:04 -0800 Subject: [PATCH 011/164] More Travis stuff. There must be a better way... --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index cb96badf..eab1fcee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,8 @@ before_script: script: # TODO: Introduce top-level Makefile, this is lame. + - ls -l /home/travis/build/sharebrained/portapack-hackrf + - ls -l /home/travis/build/sharebrained/portapack-hackrf/gcc-arm-none-eabi-5_2-2015q4/bin - /home/travis/build/sharebrained/portapack-hackrf/gcc-arm-none-eabi-5_2-2015q4/bin/arm-none-eabi-gcc -v - arm-none-eabi-gcc -v - pushd firmware/ From 62c3e331585dd6d0fbd183224afbab99a72b9f38 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 4 Feb 2016 10:23:56 -0800 Subject: [PATCH 012/164] Travis is 64-bit environment, ARM GCC 32-bit? --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index eab1fcee..77945550 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,6 +20,10 @@ script: - popd addons: + apt_packages: + - lib32bz2-1.0 + - lib32ncurses5 + - lib32z1 artifacts: paths: - $(ls firmware/portapack-h1-firmware-*.tar.bz2 | tr "\n" ":") From cf6a21364e88eb547ced29d4c3f465865fd47acf Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 4 Feb 2016 10:45:23 -0800 Subject: [PATCH 013/164] Travis mop-up. Remove extras, print correct download URL. --- .travis.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 77945550..75e81e91 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,5 @@ language: cpp -cache: apt - before_script: - wget https://launchpad.net/gcc-arm-embedded/5.0/5-2015-q4-major/+download/gcc-arm-none-eabi-5_2-2015q4-20151219-linux.tar.bz2 -O /tmp/gcc-arm.tar.bz2 - tar -xf /tmp/gcc-arm.tar.bz2 @@ -11,14 +9,18 @@ before_script: script: # TODO: Introduce top-level Makefile, this is lame. - - ls -l /home/travis/build/sharebrained/portapack-hackrf - - ls -l /home/travis/build/sharebrained/portapack-hackrf/gcc-arm-none-eabi-5_2-2015q4/bin - - /home/travis/build/sharebrained/portapack-hackrf/gcc-arm-none-eabi-5_2-2015q4/bin/arm-none-eabi-gcc -v - - arm-none-eabi-gcc -v - pushd firmware/ - make release - popd +after_script: + - echo ######################################################################## + - echo + - echo Correct download URL is: + - echo https://portapack-h1-builds.s3.amazonaws.com/$TRAVIS_REPO_SLUG/$TRAVIS_BUILD_NUMBER/$TRAVIS_JOB_NUMBER/firmware/portapack-h1-firmware-$TRAVIS_COMMIT.tar.bz2 + - echo + - echo ######################################################################## + addons: apt_packages: - lib32bz2-1.0 From 2e7dbe6d44ba570ba2bb375f4ca1410c8a96af4b Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 4 Feb 2016 11:18:03 -0800 Subject: [PATCH 014/164] Final Travis fiddling for now, I think. --- .travis.yml | 14 +++++++------- travis/echo_download_url.sh | 6 ++++++ 2 files changed, 13 insertions(+), 7 deletions(-) create mode 100755 travis/echo_download_url.sh diff --git a/.travis.yml b/.travis.yml index 75e81e91..40b88ade 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,7 @@ language: cpp +cache: apt + before_script: - wget https://launchpad.net/gcc-arm-embedded/5.0/5-2015-q4-major/+download/gcc-arm-none-eabi-5_2-2015q4-20151219-linux.tar.bz2 -O /tmp/gcc-arm.tar.bz2 - tar -xf /tmp/gcc-arm.tar.bz2 @@ -13,13 +15,11 @@ script: - make release - popd -after_script: - - echo ######################################################################## - - echo - - echo Correct download URL is: - - echo https://portapack-h1-builds.s3.amazonaws.com/$TRAVIS_REPO_SLUG/$TRAVIS_BUILD_NUMBER/$TRAVIS_JOB_NUMBER/firmware/portapack-h1-firmware-$TRAVIS_COMMIT.tar.bz2 - - echo - - echo ######################################################################## +after_success: + - travis/echo_download_url.sh + +after_deploy: + - travis/echo_download_url.sh addons: apt_packages: diff --git a/travis/echo_download_url.sh b/travis/echo_download_url.sh new file mode 100755 index 00000000..f8c897b7 --- /dev/null +++ b/travis/echo_download_url.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +echo -e "########################################################################\n\n" +echo -e "Correct download URL is:\n" +echo -e "https://portapack-h1-builds.s3.amazonaws.com/$TRAVIS_REPO_SLUG/$TRAVIS_BUILD_NUMBER/$TRAVIS_JOB_NUMBER/firmware/portapack-h1-firmware-$TRAVIS_COMMIT.tar.bz2\n\n" +echo -e "########################################################################\n" From e206e021c15b41ecd1b7ed8dc7f7cbdd92071345 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 4 Feb 2016 11:49:00 -0800 Subject: [PATCH 015/164] Remove failed attempt to print download URL in Travis. --- .travis.yml | 6 ------ travis/echo_download_url.sh | 6 ------ 2 files changed, 12 deletions(-) delete mode 100755 travis/echo_download_url.sh diff --git a/.travis.yml b/.travis.yml index 40b88ade..9b8a4feb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,12 +15,6 @@ script: - make release - popd -after_success: - - travis/echo_download_url.sh - -after_deploy: - - travis/echo_download_url.sh - addons: apt_packages: - lib32bz2-1.0 diff --git a/travis/echo_download_url.sh b/travis/echo_download_url.sh deleted file mode 100755 index f8c897b7..00000000 --- a/travis/echo_download_url.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -echo -e "########################################################################\n\n" -echo -e "Correct download URL is:\n" -echo -e "https://portapack-h1-builds.s3.amazonaws.com/$TRAVIS_REPO_SLUG/$TRAVIS_BUILD_NUMBER/$TRAVIS_JOB_NUMBER/firmware/portapack-h1-firmware-$TRAVIS_COMMIT.tar.bz2\n\n" -echo -e "########################################################################\n" From aae59181b0d1ceb50e16cff1ee0dd9bbebc7ea9b Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 4 Feb 2016 11:50:07 -0800 Subject: [PATCH 016/164] Add IRC notification of Travis builds. I hope it's not too obnoxious. --- .travis.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.travis.yml b/.travis.yml index 9b8a4feb..fc6a3ea5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,16 @@ language: cpp cache: apt +notifications: + irc: + channels: + - "chat.freenode.net#portapack" + template: + - "%{repository}#%{build_number} (%{branch} - %{commit} : %{author}): %{message}" + - "Change view : %{compare_url}" + - "Build details : %{build_url}" + - "Firmware download : https://portapack-h1-builds.s3.amazonaws.com/%{repository_slug}/%{build_number}/%{build_id}/firmware/portapack-h1-firmware-%{commit}.tar.bz2" + before_script: - wget https://launchpad.net/gcc-arm-embedded/5.0/5-2015-q4-major/+download/gcc-arm-none-eabi-5_2-2015q4-20151219-linux.tar.bz2 -O /tmp/gcc-arm.tar.bz2 - tar -xf /tmp/gcc-arm.tar.bz2 From 80b2a262135927092d26ebb395f4709fece86b12 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 4 Feb 2016 12:04:17 -0800 Subject: [PATCH 017/164] Fix artifact download URL in Travis IRC notification. --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fc6a3ea5..6a6c0b9f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,8 @@ notifications: - "%{repository}#%{build_number} (%{branch} - %{commit} : %{author}): %{message}" - "Change view : %{compare_url}" - "Build details : %{build_url}" - - "Firmware download : https://portapack-h1-builds.s3.amazonaws.com/%{repository_slug}/%{build_number}/%{build_id}/firmware/portapack-h1-firmware-%{commit}.tar.bz2" + # TODO: The "build_number.1" in this URL is almost certainly wrong, but correct value not available from Travis? + - "Firmware download : https://portapack-h1-builds.s3.amazonaws.com/%{repository_slug}/%{build_number}/%{build_number}.1/firmware/portapack-h1-firmware-%{commit}.tar.bz2" before_script: - wget https://launchpad.net/gcc-arm-embedded/5.0/5-2015-q4-major/+download/gcc-arm-none-eabi-5_2-2015q4-20151219-linux.tar.bz2 -O /tmp/gcc-arm.tar.bz2 From 94a6d8340d61a1fc6963ee4c2a3df4dab04d5797 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 4 Feb 2016 12:17:10 -0800 Subject: [PATCH 018/164] Add left key navigation out of newer menus. TODO: Ripe for a base class or something. --- firmware/application/ui_navigation.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index dfa25231..36424279 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -133,6 +133,7 @@ TranspondersMenuView::TranspondersMenuView(NavigationView& nav) { { "ERT: Utility Meters", [&nav](){ nav.push(); } }, { "TPMS: Cars", [&nav](){ nav.push(); } }, } }); + on_left = [&nav](){ nav.pop(); }; } /* ReceiverMenuView ******************************************************/ @@ -142,6 +143,7 @@ ReceiverMenuView::ReceiverMenuView(NavigationView& nav) { { "Audio", [&nav](){ nav.push(); } }, { "Transponders", [&nav](){ nav.push(); } }, } }); + on_left = [&nav](){ nav.pop(); }; } /* SystemMenuView ********************************************************/ From 92fd62eb629a606dc6f7fa4a6dcf5036ce2943f4 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 4 Feb 2016 12:22:27 -0800 Subject: [PATCH 019/164] Try manual Travis "artifacts upload". --- .travis.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6a6c0b9f..741048de 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,12 +26,15 @@ script: - make release - popd +after_success: + - artifacts upload --bucket nine-piece-box firmware/portapack-h1-firmware-*.tar.bz2 firmware/portapack-h1-firmware-*.zip + addons: apt_packages: - lib32bz2-1.0 - lib32ncurses5 - lib32z1 - artifacts: - paths: - - $(ls firmware/portapack-h1-firmware-*.tar.bz2 | tr "\n" ":") - - $(ls firmware/portapack-h1-firmware-*.zip | tr "\n" ":") + # artifacts: + # paths: + # - $(ls firmware/portapack-h1-firmware-*.tar.bz2 | tr "\n" ":") + # - $(ls firmware/portapack-h1-firmware-*.zip | tr "\n" ":") From 97bbbb705cdbd5a822074afcc05d433ff1f37e81 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 4 Feb 2016 12:28:44 -0800 Subject: [PATCH 020/164] Fix Travis artifacts command not found. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 741048de..bd8867e4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,7 +34,7 @@ addons: - lib32bz2-1.0 - lib32ncurses5 - lib32z1 - # artifacts: + artifacts: true # paths: # - $(ls firmware/portapack-h1-firmware-*.tar.bz2 | tr "\n" ":") # - $(ls firmware/portapack-h1-firmware-*.zip | tr "\n" ":") From bf77abd247ff36fb1ef13d6c83a8689a3b93fdcd Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 4 Feb 2016 12:33:55 -0800 Subject: [PATCH 021/164] Back out Travis artifact upload changes. --- .travis.yml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index bd8867e4..6a6c0b9f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,15 +26,12 @@ script: - make release - popd -after_success: - - artifacts upload --bucket nine-piece-box firmware/portapack-h1-firmware-*.tar.bz2 firmware/portapack-h1-firmware-*.zip - addons: apt_packages: - lib32bz2-1.0 - lib32ncurses5 - lib32z1 - artifacts: true - # paths: - # - $(ls firmware/portapack-h1-firmware-*.tar.bz2 | tr "\n" ":") - # - $(ls firmware/portapack-h1-firmware-*.zip | tr "\n" ":") + artifacts: + paths: + - $(ls firmware/portapack-h1-firmware-*.tar.bz2 | tr "\n" ":") + - $(ls firmware/portapack-h1-firmware-*.zip | tr "\n" ":") From 80511ac93f99b449fbb099f04fa73c3e7a40c6bb Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 5 Feb 2016 10:44:09 -0800 Subject: [PATCH 022/164] Improve repaint scope when widgets removed from parent. Addresses flickering (again!) when switching between options views in receiver app. --- firmware/common/ui_widget.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/firmware/common/ui_widget.cpp b/firmware/common/ui_widget.cpp index bc188360..0ee1ac08 100644 --- a/firmware/common/ui_widget.cpp +++ b/firmware/common/ui_widget.cpp @@ -241,11 +241,8 @@ void View::add_children(const std::vector& children) { void View::remove_child(Widget* const widget) { if( widget ) { children_.erase(std::remove(children_.begin(), children_.end(), widget), children_.end()); - dirty_screen_rect += widget->screen_rect(); + dirty_overlapping_children_in_rect(widget->screen_rect()); widget->set_parent(nullptr); - if( dirty_screen_rect ) { - set_dirty(); - } } } From cefab197da54de524a9395d9374dfb24c1960a9e Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 5 Feb 2016 10:44:27 -0800 Subject: [PATCH 023/164] Add virtual destructor for ThreadBase. Oops! --- firmware/baseband/thread_base.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/firmware/baseband/thread_base.hpp b/firmware/baseband/thread_base.hpp index 9b5e8a99..b318b240 100644 --- a/firmware/baseband/thread_base.hpp +++ b/firmware/baseband/thread_base.hpp @@ -32,6 +32,8 @@ public: { } + virtual ~ThreadBase() = default; + protected: static msg_t fn(void* arg) { auto obj = static_cast(arg); From 9430c94dec9b3b5f3b4c5dc169c473d401ab901d Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 5 Feb 2016 15:22:28 -0800 Subject: [PATCH 024/164] Move I2S management to application side. --- firmware/application/Makefile | 1 + firmware/application/analog_audio_app.cpp | 7 +++++++ firmware/{common => application}/audio.cpp | 0 firmware/{common => application}/audio.hpp | 14 -------------- firmware/application/portapack.cpp | 9 +++++++++ firmware/baseband/Makefile | 1 - firmware/baseband/audio_dma.hpp | 15 ++++++++++++++- firmware/baseband/audio_output.cpp | 5 +---- firmware/baseband/main.cpp | 10 ---------- 9 files changed, 32 insertions(+), 30 deletions(-) rename firmware/{common => application}/audio.cpp (100%) rename firmware/{common => application}/audio.hpp (92%) diff --git a/firmware/application/Makefile b/firmware/application/Makefile index 5b2262e6..c3d347ef 100755 --- a/firmware/application/Makefile +++ b/firmware/application/Makefile @@ -146,6 +146,7 @@ CPPSRC = main.cpp \ touch.cpp \ touch_adc.cpp \ encoder.cpp \ + audio.cpp \ lcd_ili9341.cpp \ ui.cpp \ ui_text.cpp \ diff --git a/firmware/application/analog_audio_app.cpp b/firmware/application/analog_audio_app.cpp index fcd9cda1..37c1e308 100644 --- a/firmware/application/analog_audio_app.cpp +++ b/firmware/application/analog_audio_app.cpp @@ -25,6 +25,9 @@ #include "portapack_shared_memory.hpp" using namespace portapack; +#include "i2s.hpp" +using namespace lpc43xx; + #include "utility.hpp" namespace ui { @@ -136,6 +139,8 @@ AnalogAudioView::AnalogAudioView( AnalogAudioView::~AnalogAudioView() { // TODO: Manipulating audio codec here, and in ui_receiver.cpp. Good to do // both? + i2s::i2s0::tx_mute(); + audio_codec.headphone_mute(); receiver_model.disable(); @@ -294,6 +299,8 @@ void AnalogAudioView::update_modulation(const ReceiverModel::Mode modulation) { }); receiver_model.set_baseband_bandwidth(is_wideband_spectrum_mode ? 12000000 : 1750000); receiver_model.enable(); + + i2s::i2s0::tx_unmute(); } } /* namespace ui */ diff --git a/firmware/common/audio.cpp b/firmware/application/audio.cpp similarity index 100% rename from firmware/common/audio.cpp rename to firmware/application/audio.cpp diff --git a/firmware/common/audio.hpp b/firmware/application/audio.hpp similarity index 92% rename from firmware/common/audio.hpp rename to firmware/application/audio.hpp index a9ccaefa..d672f744 100644 --- a/firmware/common/audio.hpp +++ b/firmware/application/audio.hpp @@ -22,25 +22,11 @@ #ifndef __AUDIO_H__ #define __AUDIO_H__ -#include "buffer.hpp" - #include "i2s.hpp" using namespace lpc43xx; namespace audio { -struct sample_t { - union { - struct { - int16_t left; - int16_t right; - }; - uint32_t raw; - }; -}; - -using buffer_t = buffer_t; - constexpr i2s::ConfigTX i2s0_config_tx { .dao = i2s::DAO { .wordwidth = i2s::WordWidth::Bits16, diff --git a/firmware/application/portapack.cpp b/firmware/application/portapack.cpp index 6621a5b8..7b463cc8 100644 --- a/firmware/application/portapack.cpp +++ b/firmware/application/portapack.cpp @@ -32,6 +32,7 @@ using namespace hackrf::one; #include "i2c_pp.hpp" #include "touch_adc.hpp" +#include "audio.hpp" namespace portapack { @@ -133,6 +134,14 @@ void init() { clock_manager.start_audio_pll(); audio_codec.init(); + i2s::i2s0::configure( + audio::i2s0_config_tx, + audio::i2s0_config_rx, + audio::i2s0_config_dma + ); + i2s::i2s0::tx_start(); + i2s::i2s0::rx_start(); + clock_manager.enable_first_if_clock(); clock_manager.enable_second_if_clock(); clock_manager.enable_codec_clocks(); diff --git a/firmware/baseband/Makefile b/firmware/baseband/Makefile index 413ed0de..3aba34e1 100755 --- a/firmware/baseband/Makefile +++ b/firmware/baseband/Makefile @@ -154,7 +154,6 @@ CPPSRC = main.cpp \ rssi.cpp \ rssi_dma.cpp \ rssi_thread.cpp \ - audio.cpp \ audio_output.cpp \ audio_dma.cpp \ audio_stats_collector.cpp \ diff --git a/firmware/baseband/audio_dma.hpp b/firmware/baseband/audio_dma.hpp index ec85f080..863a4f39 100644 --- a/firmware/baseband/audio_dma.hpp +++ b/firmware/baseband/audio_dma.hpp @@ -24,9 +24,22 @@ #include -#include "audio.hpp" +#include "buffer.hpp" namespace audio { + +struct sample_t { + union { + struct { + int16_t left; + int16_t right; + }; + uint32_t raw; + }; +}; + +using buffer_t = buffer_t; + namespace dma { void init(); diff --git a/firmware/baseband/audio_output.cpp b/firmware/baseband/audio_output.cpp index fa67eab2..7b9f9799 100644 --- a/firmware/baseband/audio_output.cpp +++ b/firmware/baseband/audio_output.cpp @@ -77,10 +77,7 @@ void AudioOutput::on_block( audio_present_history = (audio_present_history << 1) | (audio_present_now ? 1 : 0); const bool audio_present = (audio_present_history != 0); - if( audio_present ) { - i2s::i2s0::tx_unmute(); - } else { - i2s::i2s0::tx_mute(); + if( !audio_present ) { for(size_t i=0; iDMAMUX = portapack::gpdma_mux; gpdma::controller.enable(); nvicEnableVector(DMA_IRQn, CORTEX_PRIORITY_MASK(LPC_DMA_IRQ_PRIORITY)); From 1b793da17f1ec69cec908e36fbcfb754ef0c976a Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 5 Feb 2016 16:21:03 -0800 Subject: [PATCH 025/164] Expose I2C0 via portapack.hpp. --- firmware/application/portapack.cpp | 2 -- firmware/application/portapack.hpp | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware/application/portapack.cpp b/firmware/application/portapack.cpp index 7b463cc8..9f8f9c4f 100644 --- a/firmware/application/portapack.cpp +++ b/firmware/application/portapack.cpp @@ -29,8 +29,6 @@ using namespace hackrf::one; #include "clock_manager.hpp" -#include "i2c_pp.hpp" - #include "touch_adc.hpp" #include "audio.hpp" diff --git a/firmware/application/portapack.hpp b/firmware/application/portapack.hpp index 886c4a43..bb8e0042 100644 --- a/firmware/application/portapack.hpp +++ b/firmware/application/portapack.hpp @@ -23,6 +23,7 @@ #include "receiver_model.hpp" +#include "i2c_pp.hpp" #include "spi_pp.hpp" #include "wm8731.hpp" #include "si5351.hpp" @@ -38,6 +39,7 @@ extern portapack::IO io; extern lcd::ILI9341 display; +extern I2C i2c0; extern SPI ssp0; extern SPI ssp1; From 029416548159c7dfb110b120a1298782332e413c Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 5 Feb 2016 16:25:43 -0800 Subject: [PATCH 026/164] Extract LOTS of stuff into an audio API. Prevent all manner of type and implementation leakage. --- firmware/application/analog_audio_app.cpp | 19 +-- firmware/application/audio.cpp | 148 ++++++++++++++++++++++ firmware/application/audio.hpp | 97 ++++++-------- firmware/application/portapack.cpp | 17 +-- firmware/application/portapack.hpp | 3 - firmware/application/receiver_model.cpp | 10 +- firmware/application/ui_debug.cpp | 6 +- firmware/common/portapack_hal.hpp | 4 - 8 files changed, 208 insertions(+), 96 deletions(-) diff --git a/firmware/application/analog_audio_app.cpp b/firmware/application/analog_audio_app.cpp index 37c1e308..361e5e80 100644 --- a/firmware/application/analog_audio_app.cpp +++ b/firmware/application/analog_audio_app.cpp @@ -25,8 +25,7 @@ #include "portapack_shared_memory.hpp" using namespace portapack; -#include "i2s.hpp" -using namespace lpc43xx; +#include "audio.hpp" #include "utility.hpp" @@ -128,20 +127,20 @@ AnalogAudioView::AnalogAudioView( this->on_show_options_modulation(); }; - field_volume.set_value((receiver_model.headphone_volume() - wolfson::wm8731::headphone_gain_range.max).decibel() + 99); + field_volume.set_value((receiver_model.headphone_volume() - audio::headphone::volume_range().max).decibel() + 99); field_volume.on_change = [this](int32_t v) { this->on_headphone_volume_changed(v); }; + audio::output::start(); + update_modulation(static_cast(modulation)); } AnalogAudioView::~AnalogAudioView() { // TODO: Manipulating audio codec here, and in ui_receiver.cpp. Good to do // both? - i2s::i2s0::tx_mute(); - - audio_codec.headphone_mute(); + audio::output::stop(); receiver_model.disable(); } @@ -286,11 +285,13 @@ void AnalogAudioView::on_reference_ppm_correction_changed(int32_t v) { } void AnalogAudioView::on_headphone_volume_changed(int32_t v) { - const auto new_volume = volume_t::decibel(v - 99) + wolfson::wm8731::headphone_gain_range.max; + const auto new_volume = volume_t::decibel(v - 99) + audio::headphone::volume_range().max; receiver_model.set_headphone_volume(new_volume); } void AnalogAudioView::update_modulation(const ReceiverModel::Mode modulation) { + audio::output::mute(); + const auto is_wideband_spectrum_mode = (modulation == ReceiverModel::Mode::SpectrumAnalysis); receiver_model.set_baseband_configuration({ .mode = toUType(modulation), @@ -300,7 +301,9 @@ void AnalogAudioView::update_modulation(const ReceiverModel::Mode modulation) { receiver_model.set_baseband_bandwidth(is_wideband_spectrum_mode ? 12000000 : 1750000); receiver_model.enable(); - i2s::i2s0::tx_unmute(); + if( !is_wideband_spectrum_mode ) { + audio::output::unmute(); + } } } /* namespace ui */ diff --git a/firmware/application/audio.cpp b/firmware/application/audio.cpp index 2f7f17ed..ac04e106 100644 --- a/firmware/application/audio.cpp +++ b/firmware/application/audio.cpp @@ -21,6 +21,154 @@ #include "audio.hpp" +#include "portapack.hpp" +using portapack::i2c0; +using portapack::clock_manager; + +#include "wm8731.hpp" +using wolfson::wm8731::WM8731; + +#include "i2s.hpp" +using namespace lpc43xx; + namespace audio { +namespace { + +constexpr i2s::ConfigTX i2s0_config_tx { + .dao = i2s::DAO { + .wordwidth = i2s::WordWidth::Bits16, + .mono = 0, + .stop = 1, + .reset = 0, + .ws_sel = 0, + .ws_halfperiod = 0x0f, + .mute = 1, + }, + .txrate = i2s::MCLKRate { + .x_divider = 0, + .y_divider = 0, + }, + .txbitrate = i2s::BitRate { + .bitrate = 7, + }, + .txmode = i2s::Mode { + .clksel = i2s::ClockSelect::BaseAudioClkOrExternalMCLK, + .four_pin = 0, + .mclk_out_en = 1, + }, +}; + +constexpr i2s::ConfigRX i2s0_config_rx { + .dai = i2s::DAI { + .wordwidth = i2s::WordWidth::Bits16, + .mono = 0, + .stop = 1, + .reset = 0, + .ws_sel = 1, + .ws_halfperiod = 0x0f, + }, + .rxrate = i2s::MCLKRate { + .x_divider = 0, + .y_divider = 0, + }, + .rxbitrate = i2s::BitRate { + .bitrate = 7, + }, + .rxmode = i2s::Mode { + .clksel = i2s::ClockSelect::BaseAudioClkOrExternalMCLK, + .four_pin = 1, + .mclk_out_en = 0, + }, +}; + +constexpr i2s::ConfigDMA i2s0_config_dma { + .dma1 = i2s::DMA { + .rx_enable = 1, + .tx_enable = 0, + .rx_depth = 4, + .tx_depth = 0, + }, + .dma2 = i2s::DMA { + .rx_enable = 0, + .tx_enable = 1, + .rx_depth = 0, + .tx_depth = 4, + }, +}; + +constexpr uint8_t wm8731_i2c_address = 0x1a; + +WM8731 audio_codec { i2c0, wm8731_i2c_address }; + +} /* namespace */ + +namespace output { + +void start() { + i2s::i2s0::tx_start(); + unmute(); +} + +void stop() { + mute(); + i2s::i2s0::tx_stop(); +} + +void mute() { + i2s::i2s0::tx_mute(); + + audio_codec.headphone_mute(); +} + +void unmute() { + i2s::i2s0::tx_unmute(); +} + +} /* namespace output */ + +namespace headphone { + +volume_range_t volume_range() { + return wolfson::wm8731::headphone_gain_range; +} + +void set_volume(const volume_t volume) { + audio_codec.set_headphone_volume(volume); +} + +} /* namespace headphone */ + +namespace debug { + +int reg_count() { + return wolfson::wm8731::reg_count; +} + +uint16_t reg_read(const int register_number) { + return audio_codec.read(register_number); +} + +} /* namespace debug */ + +void init() { + clock_manager.start_audio_pll(); + audio_codec.init(); + + i2s::i2s0::configure( + i2s0_config_tx, + i2s0_config_rx, + i2s0_config_dma + ); +} + +void shutdown() { + audio_codec.reset(); + output::stop(); +} + +void set_rate(const Rate rate) { + clock_manager.set_base_audio_clock_divider(toUType(rate)); +} + } /* namespace audio */ diff --git a/firmware/application/audio.hpp b/firmware/application/audio.hpp index d672f744..e3d7544f 100644 --- a/firmware/application/audio.hpp +++ b/firmware/application/audio.hpp @@ -22,72 +22,47 @@ #ifndef __AUDIO_H__ #define __AUDIO_H__ -#include "i2s.hpp" -using namespace lpc43xx; +#include "volume.hpp" + +#include namespace audio { -constexpr i2s::ConfigTX i2s0_config_tx { - .dao = i2s::DAO { - .wordwidth = i2s::WordWidth::Bits16, - .mono = 0, - .stop = 1, - .reset = 0, - .ws_sel = 0, - .ws_halfperiod = 0x0f, - .mute = 1, - }, - .txrate = i2s::MCLKRate { - .x_divider = 0, - .y_divider = 0, - }, - .txbitrate = i2s::BitRate { - .bitrate = 7, - }, - .txmode = i2s::Mode { - .clksel = i2s::ClockSelect::BaseAudioClkOrExternalMCLK, - .four_pin = 0, - .mclk_out_en = 1, - }, +namespace output { + +void start(); +void stop(); + +void mute(); +void unmute(); + +} /* namespace output */ + +namespace headphone { + +volume_range_t volume_range(); + +void set_volume(const volume_t volume); + +} /* namespace headphone */ + +namespace debug { + +int reg_count(); +uint16_t reg_read(const int register_number); + +} /* namespace debug */ + +void init(); +void shutdown(); + +enum class Rate { + Hz_12000 = 4, + Hz_24000 = 2, + Hz_48000 = 1, }; -constexpr i2s::ConfigRX i2s0_config_rx { - .dai = i2s::DAI { - .wordwidth = i2s::WordWidth::Bits16, - .mono = 0, - .stop = 1, - .reset = 0, - .ws_sel = 1, - .ws_halfperiod = 0x0f, - }, - .rxrate = i2s::MCLKRate { - .x_divider = 0, - .y_divider = 0, - }, - .rxbitrate = i2s::BitRate { - .bitrate = 7, - }, - .rxmode = i2s::Mode { - .clksel = i2s::ClockSelect::BaseAudioClkOrExternalMCLK, - .four_pin = 1, - .mclk_out_en = 0, - }, -}; - -constexpr i2s::ConfigDMA i2s0_config_dma { - .dma1 = i2s::DMA { - .rx_enable = 1, - .tx_enable = 0, - .rx_depth = 4, - .tx_depth = 0, - }, - .dma2 = i2s::DMA { - .rx_enable = 0, - .tx_enable = 1, - .rx_depth = 0, - .tx_depth = 4, - }, -}; +void set_rate(const Rate rate); } /* namespace audio */ diff --git a/firmware/application/portapack.cpp b/firmware/application/portapack.cpp index 9f8f9c4f..12bae224 100644 --- a/firmware/application/portapack.cpp +++ b/firmware/application/portapack.cpp @@ -50,8 +50,6 @@ I2C i2c0(&I2CD0); SPI ssp0(&SPID1); SPI ssp1(&SPID2); -wolfson::wm8731::WM8731 audio_codec { i2c0, portapack::wm8731_i2c_address }; - si5351::Si5351 clock_generator { i2c0, hackrf::one::si5351_i2c_address }; @@ -129,17 +127,8 @@ void init() { clock_manager.set_reference_ppb(persistent_memory::correction_ppb()); clock_manager.run_at_full_speed(); - clock_manager.start_audio_pll(); - audio_codec.init(); - - i2s::i2s0::configure( - audio::i2s0_config_tx, - audio::i2s0_config_rx, - audio::i2s0_config_dma - ); - i2s::i2s0::tx_start(); - i2s::i2s0::rx_start(); - + audio::init(); + clock_manager.enable_first_if_clock(); clock_manager.enable_second_if_clock(); clock_manager.enable_codec_clocks(); @@ -152,7 +141,7 @@ void shutdown() { display.shutdown(); radio::disable(); - audio_codec.reset(); + audio::shutdown(); clock_manager.shutdown(); power.shutdown(); diff --git a/firmware/application/portapack.hpp b/firmware/application/portapack.hpp index bb8e0042..004ab5e9 100644 --- a/firmware/application/portapack.hpp +++ b/firmware/application/portapack.hpp @@ -25,7 +25,6 @@ #include "i2c_pp.hpp" #include "spi_pp.hpp" -#include "wm8731.hpp" #include "si5351.hpp" #include "lcd_ili9341.hpp" @@ -43,8 +42,6 @@ extern I2C i2c0; extern SPI ssp0; extern SPI ssp1; -extern wolfson::wm8731::WM8731 audio_codec; - extern si5351::Si5351 clock_generator; extern ClockManager clock_manager; diff --git a/firmware/application/receiver_model.cpp b/firmware/application/receiver_model.cpp index 7947a652..89e43eb7 100644 --- a/firmware/application/receiver_model.cpp +++ b/firmware/application/receiver_model.cpp @@ -26,6 +26,8 @@ #include "portapack.hpp" using namespace portapack; +#include "audio.hpp" + #include "dsp_fir_taps.hpp" #include "dsp_iir.hpp" #include "dsp_iir_config.hpp" @@ -62,7 +64,7 @@ void AMConfig::apply() const { audio_12k_hpf_300hz_config }; shared_memory.baseband_queue.push(message); - clock_manager.set_base_audio_clock_divider(4); + audio::set_rate(audio::Rate::Hz_12000); } void NBFMConfig::apply() const { @@ -76,7 +78,7 @@ void NBFMConfig::apply() const { audio_24k_deemph_300_6_config }; shared_memory.baseband_queue.push(message); - clock_manager.set_base_audio_clock_divider(2); + audio::set_rate(audio::Rate::Hz_24000); } void WFMConfig::apply() const { @@ -89,7 +91,7 @@ void WFMConfig::apply() const { audio_48k_deemph_2122_6_config }; shared_memory.baseband_queue.push(message); - clock_manager.set_base_audio_clock_divider(1); + audio::set_rate(audio::Rate::Hz_48000); } static constexpr std::array am_configs { { @@ -314,7 +316,7 @@ void ReceiverModel::update_headphone_volume() { // TODO: Manipulating audio codec here, and in ui_receiver.cpp. Good to do // both? - audio_codec.set_headphone_volume(headphone_volume_); + audio::headphone::set_volume(headphone_volume_); } void ReceiverModel::update_modulation_configuration() { diff --git a/firmware/application/ui_debug.cpp b/firmware/application/ui_debug.cpp index 7dde4ab3..4b76080f 100644 --- a/firmware/application/ui_debug.cpp +++ b/firmware/application/ui_debug.cpp @@ -26,6 +26,8 @@ #include "radio.hpp" #include "string_format.hpp" +#include "audio.hpp" + namespace ui { /* DebugMemoryView *******************************************************/ @@ -260,8 +262,8 @@ DebugMenuView::DebugMenuView(NavigationView& nav) { [](const size_t register_number) { return portapack::clock_generator.read_register(register_number); } ); } }, { "WM8731", [&nav](){ nav.push( - "WM8731", RegistersWidgetConfig { wolfson::wm8731::reg_count, 1, 3, 4 }, - [](const size_t register_number) { return portapack::audio_codec.read(register_number); } + "WM8731", RegistersWidgetConfig { audio::debug::reg_count(), 1, 3, 4 }, + [](const size_t register_number) { return audio::debug::reg_read(register_number); } ); } }, { "Temperature", [&nav](){ nav.push(); } }, } }); diff --git a/firmware/common/portapack_hal.hpp b/firmware/common/portapack_hal.hpp index ccf88656..00098f23 100644 --- a/firmware/common/portapack_hal.hpp +++ b/firmware/common/portapack_hal.hpp @@ -56,10 +56,6 @@ constexpr GPIO gpio_cpld_tdo = gpio[GPIO1_8]; // P1_5 constexpr GPIO gpio_cpld_tck = gpio[GPIO3_0]; // P6_1 constexpr GPIO gpio_cpld_tdi = gpio[GPIO3_1]; // P6_2 -/* I2C0 */ - -constexpr uint8_t wm8731_i2c_address = 0x1a; - } /* namespace portapack */ #endif/*__PORTAPACK_HAL_H__*/ From 682c87e3ff97d7878b6b2487ea858024e46582f2 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 5 Feb 2016 16:36:36 -0800 Subject: [PATCH 027/164] Wrap baseband sampling rate function to radio:: function. --- firmware/application/radio.cpp | 4 ++++ firmware/application/radio.hpp | 1 + firmware/application/receiver_model.cpp | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/firmware/application/radio.cpp b/firmware/application/radio.cpp index b58222c5..1223e291 100644 --- a/firmware/application/radio.cpp +++ b/firmware/application/radio.cpp @@ -148,6 +148,10 @@ void set_baseband_filter_bandwidth(const uint32_t bandwidth_minimum) { second_if.set_lpf_rf_bandwidth(bandwidth_minimum); } +void set_baseband_rate(const uint32_t rate) { + portapack::clock_manager.set_sampling_frequency(rate); +} + void set_baseband_decimation_by(const size_t n) { baseband_cpld.set_decimation_by(n); } diff --git a/firmware/application/radio.hpp b/firmware/application/radio.hpp index 715fd0d5..1be95b00 100644 --- a/firmware/application/radio.hpp +++ b/firmware/application/radio.hpp @@ -41,6 +41,7 @@ void set_lna_gain(const int_fast8_t db); void set_vga_gain(const int_fast8_t db); void set_sampling_frequency(const uint32_t frequency); void set_baseband_filter_bandwidth(const uint32_t bandwidth_minimum); +void set_baseband_rate(const uint32_t rate); void set_baseband_decimation_by(const size_t n); void set_antenna_bias(const bool on); diff --git a/firmware/application/receiver_model.cpp b/firmware/application/receiver_model.cpp index 89e43eb7..f2658ade 100644 --- a/firmware/application/receiver_model.cpp +++ b/firmware/application/receiver_model.cpp @@ -304,7 +304,7 @@ void ReceiverModel::update_baseband_configuration() { // Disabling baseband while changing sampling rates seems like a good idea... baseband_disable(); - clock_manager.set_sampling_frequency(sampling_rate() * baseband_oversampling()); + radio::set_baseband_rate(sampling_rate() * baseband_oversampling()); update_tuning_frequency(); radio::set_baseband_decimation_by(baseband_oversampling()); From fd3f962e408828249d8a646b250ac020cc589a89 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 5 Feb 2016 16:45:23 -0800 Subject: [PATCH 028/164] Define and utilize memory region backup_ram. --- firmware/common/memory_map.hpp | 2 ++ firmware/common/portapack_persistent_memory.cpp | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/firmware/common/memory_map.hpp b/firmware/common/memory_map.hpp index 6f4eae1e..8b32a0cd 100644 --- a/firmware/common/memory_map.hpp +++ b/firmware/common/memory_map.hpp @@ -69,6 +69,8 @@ constexpr region_t ahb_ram_0 { 0x20000000, 32_KiB }; constexpr region_t ahb_ram_1 { 0x20008000, 16_KiB }; constexpr region_t ahb_ram_2 { 0x2000c000, 16_KiB }; +constexpr region_t backup_ram { LPC_BACKUP_REG_BASE, 256 }; + constexpr region_t spifi_uncached { LPC_SPIFI_DATA_BASE, 1_MiB }; constexpr region_t spifi_cached { LPC_SPIFI_DATA_CACHED_BASE, spifi_uncached.size() }; diff --git a/firmware/common/portapack_persistent_memory.cpp b/firmware/common/portapack_persistent_memory.cpp index de4ce64a..c94fa0eb 100644 --- a/firmware/common/portapack_persistent_memory.cpp +++ b/firmware/common/portapack_persistent_memory.cpp @@ -25,6 +25,9 @@ #include "utility.hpp" +#include "memory_map.hpp" +using portapack::memory::map::backup_ram; + #include #include @@ -43,9 +46,9 @@ struct data_t { int32_t correction_ppb; }; -static_assert(sizeof(data_t) <= 0x100, "Persistent memory structure too large for VBAT-maintained region"); +static_assert(sizeof(data_t) <= backup_ram.size(), "Persistent memory structure too large for VBAT-maintained region"); -static data_t* const data = reinterpret_cast(LPC_BACKUP_REG_BASE); +static data_t* const data = reinterpret_cast(backup_ram.base()); rf::Frequency tuned_frequency() { rf::tuning_range.reset_if_outside(data->tuned_frequency, tuned_frequency_reset_value); From a9451c17b4ee18ddb7755b9111990a0b25ddeda9 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 5 Feb 2016 16:52:34 -0800 Subject: [PATCH 029/164] Move PPB clock adjustment out of ReceiverModel. --- firmware/application/receiver_model.cpp | 3 +-- firmware/common/portapack_persistent_memory.cpp | 6 +++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/firmware/application/receiver_model.cpp b/firmware/application/receiver_model.cpp index f2658ade..38cb155c 100644 --- a/firmware/application/receiver_model.cpp +++ b/firmware/application/receiver_model.cpp @@ -23,9 +23,9 @@ #include "portapack_shared_memory.hpp" #include "portapack_persistent_memory.hpp" -#include "portapack.hpp" using namespace portapack; +#include "radio.hpp" #include "audio.hpp" #include "dsp_fir_taps.hpp" @@ -135,7 +135,6 @@ int32_t ReceiverModel::reference_ppm_correction() const { void ReceiverModel::set_reference_ppm_correction(int32_t v) { persistent_memory::set_correction_ppb(v * 1000); - clock_manager.set_reference_ppb(v * 1000); } bool ReceiverModel::antenna_bias() const { diff --git a/firmware/common/portapack_persistent_memory.cpp b/firmware/common/portapack_persistent_memory.cpp index c94fa0eb..cd93bd05 100644 --- a/firmware/common/portapack_persistent_memory.cpp +++ b/firmware/common/portapack_persistent_memory.cpp @@ -21,6 +21,8 @@ #include "portapack_persistent_memory.hpp" +#include "portapack.hpp" + #include "hal.h" #include "utility.hpp" @@ -65,7 +67,9 @@ ppb_t correction_ppb() { } void set_correction_ppb(const ppb_t new_value) { - data->correction_ppb = ppb_range.clip(new_value); + const auto clipped_value = ppb_range.clip(new_value); + data->correction_ppb = clipped_value; + portapack::clock_manager.set_reference_ppb(clipped_value); } } /* namespace persistent_memory */ From 3172fb1ad691afcc437d636624c895b24aeaebfd Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sat, 6 Feb 2016 16:23:20 -0800 Subject: [PATCH 030/164] Make assorted arguments pass-by-reference. --- firmware/application/file.cpp | 4 ++-- firmware/application/file.hpp | 4 ++-- firmware/application/ui_console.cpp | 4 ++-- firmware/application/ui_console.hpp | 4 ++-- firmware/application/ui_menu.hpp | 2 +- firmware/application/ui_setup.cpp | 4 ++-- firmware/application/ui_setup.hpp | 4 ++-- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/firmware/application/file.cpp b/firmware/application/file.cpp index 439c0a9c..4898ee74 100644 --- a/firmware/application/file.cpp +++ b/firmware/application/file.cpp @@ -25,7 +25,7 @@ File::~File() { close(); } -bool File::open_for_append(const std::string file_path) { +bool File::open_for_append(const std::string& file_path) { const auto open_result = f_open(&f, file_path.c_str(), FA_WRITE | FA_OPEN_ALWAYS); if( open_result == FR_OK ) { const auto seek_result = f_lseek(&f, f_size(&f)); @@ -60,7 +60,7 @@ bool File::write(const void* const data, const size_t bytes_to_write) { return (result == FR_OK) && (bytes_written == bytes_to_write); } -bool File::puts(const std::string string) { +bool File::puts(const std::string& string) { const auto result = f_puts(string.c_str(), &f); return (result >= 0); } diff --git a/firmware/application/file.hpp b/firmware/application/file.hpp index 363bd866..24705a8e 100644 --- a/firmware/application/file.hpp +++ b/firmware/application/file.hpp @@ -31,7 +31,7 @@ class File { public: ~File(); - bool open_for_append(const std::string file_path); + bool open_for_append(const std::string& file_path); bool close(); bool is_ready(); @@ -39,7 +39,7 @@ public: bool read(void* const data, const size_t bytes_to_read); bool write(const void* const data, const size_t bytes_to_write); - bool puts(const std::string string); + bool puts(const std::string& string); bool sync(); diff --git a/firmware/application/ui_console.cpp b/firmware/application/ui_console.cpp index 65482236..28b9f298 100644 --- a/firmware/application/ui_console.cpp +++ b/firmware/application/ui_console.cpp @@ -35,7 +35,7 @@ void Console::clear() { display.scroll_set_position(0); } -void Console::write(const std::string message) { +void Console::write(const std::string& message) { const Style& s = style(); const Font& font = s.font; const auto rect = screen_rect(); @@ -58,7 +58,7 @@ void Console::write(const std::string message) { } } -void Console::writeln(const std::string message) { +void Console::writeln(const std::string& message) { write(message); crlf(); } diff --git a/firmware/application/ui_console.hpp b/firmware/application/ui_console.hpp index 4f29486a..db49acc7 100644 --- a/firmware/application/ui_console.hpp +++ b/firmware/application/ui_console.hpp @@ -33,8 +33,8 @@ namespace ui { class Console : public Widget { public: void clear(); - void write(const std::string message); - void writeln(const std::string message); + void write(const std::string& message); + void writeln(const std::string& message); void paint(Painter& painter) override; diff --git a/firmware/application/ui_menu.hpp b/firmware/application/ui_menu.hpp index 5863e048..3c01e98c 100644 --- a/firmware/application/ui_menu.hpp +++ b/firmware/application/ui_menu.hpp @@ -70,7 +70,7 @@ public: void add_item(const MenuItem item); template - void add_items(const std::array items) { + void add_items(const std::array& items) { for(const auto& item : items) { add_item(item); } diff --git a/firmware/application/ui_setup.cpp b/firmware/application/ui_setup.cpp index 596d1534..95beba9b 100644 --- a/firmware/application/ui_setup.cpp +++ b/firmware/application/ui_setup.cpp @@ -82,7 +82,7 @@ void SetDateTimeView::focus() { button_cancel.focus(); } -void SetDateTimeView::form_init(const SetDateTimeModel model) { +void SetDateTimeView::form_init(const SetDateTimeModel& model) { field_year.set_value(model.year); field_month.set_value(model.month); field_day.set_value(model.day); @@ -134,7 +134,7 @@ void SetFrequencyCorrectionView::focus() { button_cancel.focus(); } -void SetFrequencyCorrectionView::form_init(const SetFrequencyCorrectionModel model) { +void SetFrequencyCorrectionView::form_init(const SetFrequencyCorrectionModel& model) { field_ppm.set_value(model.ppm); } diff --git a/firmware/application/ui_setup.hpp b/firmware/application/ui_setup.hpp index c012d5fc..cb205292 100644 --- a/firmware/application/ui_setup.hpp +++ b/firmware/application/ui_setup.hpp @@ -128,7 +128,7 @@ private: "Cancel", }; - void form_init(const SetDateTimeModel model); + void form_init(const SetDateTimeModel& model); SetDateTimeModel form_collect(); }; @@ -172,7 +172,7 @@ private: "Cancel", }; - void form_init(const SetFrequencyCorrectionModel model); + void form_init(const SetFrequencyCorrectionModel& model); SetFrequencyCorrectionModel form_collect(); }; From cd5684732620239dedc8554279d16431c1618eed Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sat, 6 Feb 2016 16:23:38 -0800 Subject: [PATCH 031/164] Remove some unused member variables. --- firmware/application/file.hpp | 2 -- firmware/application/ui_setup.hpp | 6 ------ 2 files changed, 8 deletions(-) diff --git a/firmware/application/file.hpp b/firmware/application/file.hpp index 24705a8e..533bc456 100644 --- a/firmware/application/file.hpp +++ b/firmware/application/file.hpp @@ -44,8 +44,6 @@ public: bool sync(); private: - const std::string file_path; - FIL f; }; diff --git a/firmware/application/ui_setup.hpp b/firmware/application/ui_setup.hpp index cb205292..8442c711 100644 --- a/firmware/application/ui_setup.hpp +++ b/firmware/application/ui_setup.hpp @@ -41,9 +41,6 @@ struct SetDateTimeModel { class SetDateTimeView : public View { public: - std::function on_ok; - std::function on_cancel; - SetDateTimeView(NavigationView& nav); void focus() override; @@ -138,9 +135,6 @@ struct SetFrequencyCorrectionModel { class SetFrequencyCorrectionView : public View { public: - std::function on_ok; - std::function on_cancel; - SetFrequencyCorrectionView(NavigationView& nav); void focus() override; From ac2320f0c558bd2394a91bae06ff82760cf73a22 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sat, 6 Feb 2016 16:23:55 -0800 Subject: [PATCH 032/164] Limit scope of some function variables. --- firmware/baseband/dsp_decimate.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/firmware/baseband/dsp_decimate.cpp b/firmware/baseband/dsp_decimate.cpp index 9b417d85..64243749 100644 --- a/firmware/baseband/dsp_decimate.cpp +++ b/firmware/baseband/dsp_decimate.cpp @@ -563,20 +563,18 @@ buffer_c16_t DecimateBy2CIC3::execute( */ uint32_t t1 = _iq0; uint32_t t2 = _iq1; - uint32_t t3, t4; const uint32_t taps = 0x00000003; auto s = src.p; auto d = dst.p; const auto d_end = &dst.p[src.count / 2]; - uint32_t i, q; while(d < d_end) { - i = __SXTH(t1, 0); /* 1: I0 */ - q = __SXTH(t1, 16); /* 1: Q0 */ + uint32_t i = __SXTH(t1, 0); /* 1: I0 */ + uint32_t q = __SXTH(t1, 16); /* 1: Q0 */ i = __SMLABB(t2, taps, i); /* 1: I1*3 + I0 */ q = __SMLATB(t2, taps, q); /* 1: Q1*3 + Q0 */ - t3 = *__SIMD32(s)++; /* 3: Q2:I2 */ - t4 = *__SIMD32(s)++; /* Q3:I3 */ + const uint32_t t3 = *__SIMD32(s)++; /* 3: Q2:I2 */ + const uint32_t t4 = *__SIMD32(s)++; /* Q3:I3 */ i = __SMLABB(t3, taps, i); /* 1: I2*3 + I1*3 + I0 */ q = __SMLATB(t3, taps, q); /* 1: Q2*3 + Q1*3 + Q0 */ From aae1a953fc5d21686f227dec86acfc8fcf6dc717 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sat, 6 Feb 2016 16:24:14 -0800 Subject: [PATCH 033/164] Init matched filter output variable. --- firmware/baseband/matched_filter.cpp | 1 + firmware/baseband/matched_filter.hpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/firmware/baseband/matched_filter.cpp b/firmware/baseband/matched_filter.cpp index 511410df..9471a202 100644 --- a/firmware/baseband/matched_filter.cpp +++ b/firmware/baseband/matched_filter.cpp @@ -38,6 +38,7 @@ void MatchedFilter::configure( taps_reversed_ = std::make_unique(taps_count); taps_count_ = taps_count; decimation_factor_ = decimation_factor; + output = 0; std::reverse_copy(&taps[0], &taps[taps_count], &taps_reversed_[0]); } diff --git a/firmware/baseband/matched_filter.hpp b/firmware/baseband/matched_filter.hpp index d3ee30be..49045db8 100644 --- a/firmware/baseband/matched_filter.hpp +++ b/firmware/baseband/matched_filter.hpp @@ -71,7 +71,7 @@ private: size_t taps_count_ { 0 }; size_t decimation_factor_ { 1 }; size_t decimation_phase { 0 }; - float output; + float output { 0 }; void shift_by_decimation_factor(); From 9a33fc884aad897e45bdb50a4704322556e95fda Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sat, 6 Feb 2016 16:44:19 -0800 Subject: [PATCH 034/164] More arguments pass-by-reference. --- firmware/application/touch.cpp | 4 ++-- firmware/application/touch.hpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/firmware/application/touch.cpp b/firmware/application/touch.cpp index 72f6d457..09f8db8f 100644 --- a/firmware/application/touch.cpp +++ b/firmware/application/touch.cpp @@ -29,7 +29,7 @@ struct Metrics { const float r; }; -static Metrics calculate_metrics(const Frame frame) { +static Metrics calculate_metrics(const Frame& frame) { /* TODO: Yikes! M0 doesn't have floating point, so this code is * expensive! On the other hand, it seems to be working well (and * fast *enough*?), so maybe leave it alone at least for now. @@ -66,7 +66,7 @@ static Metrics calculate_metrics(const Frame frame) { }; } -void Manager::feed(const Frame frame) { +void Manager::feed(const Frame& frame) { // touch_debounce.feed(touch_raw); const auto touch_raw = frame.touch; //const auto touch_stable = touch_debounce.state(); diff --git a/firmware/application/touch.hpp b/firmware/application/touch.hpp index cbd13b06..0402243a 100644 --- a/firmware/application/touch.hpp +++ b/firmware/application/touch.hpp @@ -165,7 +165,7 @@ class Manager { public: std::function on_event; - void feed(const Frame frame); + void feed(const Frame& frame); private: enum State { From 7cb3bbc9f84d558e5092633aa817ee7b7a8335c8 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 7 Feb 2016 10:32:38 -0800 Subject: [PATCH 035/164] Make Widget flags private, expose via methods. --- firmware/application/recent_entries.hpp | 2 +- firmware/application/ui_menu.cpp | 13 ++++------ firmware/application/ui_menu.hpp | 4 +--- firmware/application/ui_receiver.cpp | 2 +- firmware/common/ui_widget.cpp | 32 +++++++++++++++++-------- firmware/common/ui_widget.hpp | 9 +++++-- 6 files changed, 37 insertions(+), 25 deletions(-) diff --git a/firmware/application/recent_entries.hpp b/firmware/application/recent_entries.hpp index 8fbbb71a..84afb868 100644 --- a/firmware/application/recent_entries.hpp +++ b/firmware/application/recent_entries.hpp @@ -129,7 +129,7 @@ public: Entries& recent ) : recent { recent } { - flags.focusable = true; + set_focusable(true); } void paint(Painter& painter) override { diff --git a/firmware/application/ui_menu.cpp b/firmware/application/ui_menu.cpp index 7aa098d3..4b79cbb1 100644 --- a/firmware/application/ui_menu.cpp +++ b/firmware/application/ui_menu.cpp @@ -32,17 +32,19 @@ void MenuItemView::select() { } void MenuItemView::highlight() { - set_highlight(true); + set_highlighted(true); + set_dirty(); } void MenuItemView::unhighlight() { - set_highlight(false); + set_highlighted(false); + set_dirty(); } void MenuItemView::paint(Painter& painter) { const auto r = screen_rect(); - const auto paint_style = (flags.highlighted && parent()->has_focus()) ? style().invert() : style(); + const auto paint_style = (highlighted() && parent()->has_focus()) ? style().invert() : style(); const auto font_height = paint_style.font.line_height(); @@ -58,11 +60,6 @@ void MenuItemView::paint(Painter& painter) { ); } -void MenuItemView::set_highlight(const bool value) { - flags.highlighted = value; - set_dirty(); -} - /* MenuView **************************************************************/ MenuView::~MenuView() { diff --git a/firmware/application/ui_menu.hpp b/firmware/application/ui_menu.hpp index 3c01e98c..e5533ce1 100644 --- a/firmware/application/ui_menu.hpp +++ b/firmware/application/ui_menu.hpp @@ -53,8 +53,6 @@ public: private: const MenuItem item; - - void set_highlight(const bool value); }; class MenuView : public View { @@ -62,7 +60,7 @@ public: std::function on_left; MenuView() { - flags.focusable = true; + set_focusable(true); } ~MenuView(); diff --git a/firmware/application/ui_receiver.cpp b/firmware/application/ui_receiver.cpp index f80db742..cf8e8ef3 100644 --- a/firmware/application/ui_receiver.cpp +++ b/firmware/application/ui_receiver.cpp @@ -38,7 +38,7 @@ FrequencyField::FrequencyField( length_ { 11 }, range(rf::tuning_range) { - flags.focusable = true; + set_focusable(true); } rf::Frequency FrequencyField::value() const { diff --git a/firmware/common/ui_widget.cpp b/firmware/common/ui_widget.cpp index 0ee1ac08..913cfb36 100644 --- a/firmware/common/ui_widget.cpp +++ b/firmware/common/ui_widget.cpp @@ -130,6 +130,10 @@ bool Widget::focusable() const { return flags.focusable; } +void Widget::set_focusable(const bool value) { + flags.focusable = value; +} + bool Widget::has_focus() { return (context().focus_manager().focus_widget() == this); } @@ -200,6 +204,14 @@ void Widget::visible(bool v) { } } +bool Widget::highlighted() const { + return flags.highlighted; +} + +void Widget::set_highlighted(const bool value) { + flags.highlighted = value; +} + void Widget::dirty_overlapping_children_in_rect(const Rect& child_rect) { for(auto child : children()) { if( !child_rect.intersect(child->parent_rect).is_empty() ) { @@ -322,7 +334,7 @@ void Text::paint(Painter& painter) { ) : Widget { parent_rect }, text_ { text } { - flags.focusable = true; + set_focusable(true); } void Button::set_text(const std::string value) { @@ -337,7 +349,7 @@ std::string Button::text() const { void Button::paint(Painter& painter) { const auto r = screen_rect(); - const auto paint_style = (has_focus() || flags.highlighted) ? style().invert() : style(); + const auto paint_style = (has_focus() || highlighted()) ? style().invert() : style(); painter.draw_rectangle(r, style().foreground); @@ -368,13 +380,13 @@ bool Button::on_key(const KeyEvent key) { bool Button::on_touch(const TouchEvent event) { switch(event.type) { case TouchEvent::Type::Start: - flags.highlighted = true; + set_highlighted(true); set_dirty(); return true; case TouchEvent::Type::End: - flags.highlighted = false; + set_highlighted(false); set_dirty(); if( on_select ) { on_select(*this); @@ -454,7 +466,7 @@ void Image::set_background(const Color color) { void Image::paint(Painter& painter) { if( bitmap_ ) { // Code also handles ImageButton behavior. - const bool selected = (has_focus() || flags.highlighted); + const bool selected = (has_focus() || highlighted()); painter.draw_bitmap( screen_pos(), *bitmap_, @@ -475,7 +487,7 @@ ImageButton::ImageButton( const Color background ) : Image { parent_rect, bitmap, foreground, background } { - flags.focusable = true; + set_focusable(true); } bool ImageButton::on_key(const KeyEvent key) { @@ -492,13 +504,13 @@ bool ImageButton::on_key(const KeyEvent key) { bool ImageButton::on_touch(const TouchEvent event) { switch(event.type) { case TouchEvent::Type::Start: - flags.highlighted = true; + set_highlighted(true); set_dirty(); return true; case TouchEvent::Type::End: - flags.highlighted = false; + set_highlighted(false); set_dirty(); if( on_select ) { on_select(*this); @@ -520,7 +532,7 @@ OptionsField::OptionsField( length_ { length }, options { options } { - flags.focusable = true; + set_focusable(true); } size_t OptionsField::selected_index() const { @@ -595,7 +607,7 @@ NumberField::NumberField( length_ { length }, fill_char { fill_char } { - flags.focusable = true; + set_focusable(true); } int32_t NumberField::value() const { diff --git a/firmware/common/ui_widget.hpp b/firmware/common/ui_widget.hpp index 80d3de46..ba2172b2 100644 --- a/firmware/common/ui_widget.hpp +++ b/firmware/common/ui_widget.hpp @@ -83,6 +83,7 @@ public: virtual void blur(); virtual void on_blur(); bool focusable() const; + void set_focusable(const bool value); bool has_focus(); virtual Widget* last_child_focus() const; virtual void set_last_child_focus(Widget* const child); @@ -110,12 +111,18 @@ public: void visible(bool v); + bool highlighted() const; + void set_highlighted(const bool value); + protected: /* Widget rectangle relative to parent pos(). */ Rect parent_rect; const Style* style_ { nullptr }; Widget* parent_ { nullptr }; + void dirty_overlapping_children_in_rect(const Rect& child_rect); + +private: struct flags_t { bool dirty : 1; // Widget content has changed. bool hidden : 1; // Hide widget and children. @@ -131,8 +138,6 @@ protected: .highlighted = false, .visible = false, }; - - void dirty_overlapping_children_in_rect(const Rect& child_rect); }; class View : public Widget { From 8f8a9f2b635de9a7ae11e9b83570d817c4711b3e Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 7 Feb 2016 10:33:15 -0800 Subject: [PATCH 036/164] Fix back button repaint/focus quirks. --- firmware/application/ui_navigation.cpp | 7 ++++--- firmware/application/ui_navigation.hpp | 6 ++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index 36424279..efd4c2ea 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -59,8 +59,9 @@ SystemStatusView::SystemStatusView() { }; } -void SystemStatusView::set_back_visible(bool new_value) { - button_back.hidden(!new_value); +void SystemStatusView::set_back_enabled(bool new_value) { + button_back.set_text(new_value ? back_text_enabled : back_text_disabled); + button_back.set_focusable(new_value); } void SystemStatusView::set_title(const std::string new_value) { @@ -193,7 +194,7 @@ SystemView::SystemView( { parent_rect.width(), static_cast(parent_rect.height() - status_view_height) } }); navigation_view.on_view_changed = [this](const View& new_view) { - this->status_view.set_back_visible(!this->navigation_view.is_top()); + this->status_view.set_back_enabled(!this->navigation_view.is_top()); this->status_view.set_title(new_view.title()); }; diff --git a/firmware/application/ui_navigation.hpp b/firmware/application/ui_navigation.hpp index 48c40990..75b0aa2c 100644 --- a/firmware/application/ui_navigation.hpp +++ b/firmware/application/ui_navigation.hpp @@ -66,15 +66,17 @@ public: SystemStatusView(); - void set_back_visible(bool new_value); + void set_back_enabled(bool new_value); void set_title(const std::string new_value); private: static constexpr auto default_title = "PortaPack"; + static constexpr auto back_text_enabled = " < "; + static constexpr auto back_text_disabled = " * "; Button button_back { { 0 * 8, 0 * 16, 3 * 8, 16 }, - " < ", + back_text_disabled, }; Text title { From 3a709c51c494bc6727df805f6131fb98323ea9c4 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 7 Feb 2016 10:40:06 -0800 Subject: [PATCH 037/164] Hide more Widget member variables. --- firmware/application/ui_navigation.cpp | 2 +- firmware/common/ui_widget.hpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index efd4c2ea..97084f6f 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -175,7 +175,7 @@ SystemView::SystemView( ) : View { parent_rect }, context_(context) { - style_ = &style_default; + set_style(&style_default); constexpr ui::Dim status_view_height = 16; diff --git a/firmware/common/ui_widget.hpp b/firmware/common/ui_widget.hpp index ba2172b2..929d46ec 100644 --- a/firmware/common/ui_widget.hpp +++ b/firmware/common/ui_widget.hpp @@ -115,14 +115,14 @@ public: void set_highlighted(const bool value); protected: + void dirty_overlapping_children_in_rect(const Rect& child_rect); + +private: /* Widget rectangle relative to parent pos(). */ Rect parent_rect; const Style* style_ { nullptr }; Widget* parent_ { nullptr }; - void dirty_overlapping_children_in_rect(const Rect& child_rect); - -private: struct flags_t { bool dirty : 1; // Widget content has changed. bool hidden : 1; // Hide widget and children. From 41d4fd0044836c4deb16d4c1866f543b0a4cc8f1 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 7 Feb 2016 10:42:41 -0800 Subject: [PATCH 038/164] Remove unused View::initial_focus(). --- firmware/common/ui_widget.cpp | 4 ---- firmware/common/ui_widget.hpp | 2 -- 2 files changed, 6 deletions(-) diff --git a/firmware/common/ui_widget.cpp b/firmware/common/ui_widget.cpp index 913cfb36..fffe7b96 100644 --- a/firmware/common/ui_widget.cpp +++ b/firmware/common/ui_widget.cpp @@ -262,10 +262,6 @@ const std::vector View::children() const { return children_; } -Widget* View::initial_focus() { - return nullptr; -} - std::string View::title() const { return ""; }; diff --git a/firmware/common/ui_widget.hpp b/firmware/common/ui_widget.hpp index 929d46ec..eac1efe4 100644 --- a/firmware/common/ui_widget.hpp +++ b/firmware/common/ui_widget.hpp @@ -160,8 +160,6 @@ public: void remove_child(Widget* const widget); const std::vector children() const override; - virtual Widget* initial_focus(); - virtual std::string title() const; protected: From a420f018c7db83b8c7d2e77911d3109da6d305e5 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 7 Feb 2016 10:53:40 -0800 Subject: [PATCH 039/164] Remove unused View::dirty_screen_rect member. --- firmware/common/ui_widget.cpp | 5 ----- firmware/common/ui_widget.hpp | 3 --- 2 files changed, 8 deletions(-) diff --git a/firmware/common/ui_widget.cpp b/firmware/common/ui_widget.cpp index fffe7b96..95deeb87 100644 --- a/firmware/common/ui_widget.cpp +++ b/firmware/common/ui_widget.cpp @@ -222,11 +222,6 @@ void Widget::dirty_overlapping_children_in_rect(const Rect& child_rect) { /* View ******************************************************************/ -void View::set_parent_rect(const Rect new_parent_rect) { - Widget::set_parent_rect(new_parent_rect); - dirty_screen_rect += screen_rect(); -} - void View::paint(Painter& painter) { painter.fill_rectangle( screen_rect(), diff --git a/firmware/common/ui_widget.hpp b/firmware/common/ui_widget.hpp index eac1efe4..a752ffcf 100644 --- a/firmware/common/ui_widget.hpp +++ b/firmware/common/ui_widget.hpp @@ -151,8 +151,6 @@ public: // TODO: ~View() should on_hide() all children? - void set_parent_rect(const Rect new_parent_rect) override; - void paint(Painter& painter) override; void add_child(Widget* const widget); @@ -164,7 +162,6 @@ public: protected: std::vector children_; - Rect dirty_screen_rect; void invalidate_child(Widget* const widget); }; From 31499fea5db3cf7f85f2610719598cd3b337a3a4 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 7 Feb 2016 10:55:55 -0800 Subject: [PATCH 040/164] Rewrite Widget::screen_pos() in terms of screen_rect(). --- firmware/common/ui_widget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/common/ui_widget.cpp b/firmware/common/ui_widget.cpp index 95deeb87..f4adf279 100644 --- a/firmware/common/ui_widget.cpp +++ b/firmware/common/ui_widget.cpp @@ -47,7 +47,7 @@ bool is_dirty() { /* Widget ****************************************************************/ Point Widget::screen_pos() { - return parent() ? (parent()->screen_pos() + parent_rect.pos) : parent_rect.pos; + return screen_rect().pos; } Size Widget::size() const { From 2b6bc0340864dba9924009bba36f4d37a4813e21 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 7 Feb 2016 11:06:16 -0800 Subject: [PATCH 041/164] Remove unfinished Widget last child focus code. --- firmware/common/ui_focus.cpp | 4 ---- firmware/common/ui_widget.cpp | 9 --------- firmware/common/ui_widget.hpp | 2 -- 3 files changed, 15 deletions(-) diff --git a/firmware/common/ui_focus.cpp b/firmware/common/ui_focus.cpp index c1d0ed12..08310039 100644 --- a/firmware/common/ui_focus.cpp +++ b/firmware/common/ui_focus.cpp @@ -49,9 +49,6 @@ void FocusManager::set_focus_widget(Widget* const new_focus_widget) { // return; // } if( !new_focus_widget->focusable() ) { - // New widget is not focusable. Does it have a preferred child that - // can receive focus? - set_focus_widget(new_focus_widget->last_child_focus()); return; } } @@ -67,7 +64,6 @@ void FocusManager::set_focus_widget(Widget* const new_focus_widget) { if( focus_widget() ) { focus_widget()->on_focus(); focus_widget()->set_dirty(); - focus_widget()->parent()->set_last_child_focus(focus_widget()); } } diff --git a/firmware/common/ui_widget.cpp b/firmware/common/ui_widget.cpp index f4adf279..8125c30e 100644 --- a/firmware/common/ui_widget.cpp +++ b/firmware/common/ui_widget.cpp @@ -138,15 +138,6 @@ bool Widget::has_focus() { return (context().focus_manager().focus_widget() == this); } -Widget* Widget::last_child_focus() const { - return nullptr; -} - -void Widget::set_last_child_focus(Widget* const child) { - // Ignore. - (void)child; -} - bool Widget::on_key(const KeyEvent event) { (void)event; return false; diff --git a/firmware/common/ui_widget.hpp b/firmware/common/ui_widget.hpp index a752ffcf..bf53ffd5 100644 --- a/firmware/common/ui_widget.hpp +++ b/firmware/common/ui_widget.hpp @@ -85,8 +85,6 @@ public: bool focusable() const; void set_focusable(const bool value); bool has_focus(); - virtual Widget* last_child_focus() const; - virtual void set_last_child_focus(Widget* const child); virtual void paint(Painter& painter) = 0; From 5a66c688616485a834925ec1f4289a75ca44d646 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 7 Feb 2016 11:24:25 -0800 Subject: [PATCH 042/164] Return Widget::children() by reference. --- firmware/common/ui_widget.cpp | 8 +++++--- firmware/common/ui_widget.hpp | 6 ++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/firmware/common/ui_widget.cpp b/firmware/common/ui_widget.cpp index 8125c30e..788b7abf 100644 --- a/firmware/common/ui_widget.cpp +++ b/firmware/common/ui_widget.cpp @@ -46,6 +46,8 @@ bool is_dirty() { /* Widget ****************************************************************/ +const std::vector Widget::no_children { }; + Point Widget::screen_pos() { return screen_rect().pos; } @@ -153,8 +155,8 @@ bool Widget::on_touch(const TouchEvent event) { return false; } -const std::vector Widget::children() const { - return { }; +const std::vector& Widget::children() const { + return no_children; } Context& Widget::context() const { @@ -244,7 +246,7 @@ void View::remove_child(Widget* const widget) { } } -const std::vector View::children() const { +const std::vector& View::children() const { return children_; } diff --git a/firmware/common/ui_widget.hpp b/firmware/common/ui_widget.hpp index bf53ffd5..4a3e080c 100644 --- a/firmware/common/ui_widget.hpp +++ b/firmware/common/ui_widget.hpp @@ -94,7 +94,7 @@ public: virtual bool on_key(const KeyEvent event); virtual bool on_encoder(const EncoderEvent event); virtual bool on_touch(const TouchEvent event); - virtual const std::vector children() const; + virtual const std::vector& children() const; virtual Context& context() const; @@ -136,6 +136,8 @@ private: .highlighted = false, .visible = false, }; + + static const std::vector no_children; }; class View : public Widget { @@ -154,7 +156,7 @@ public: void add_child(Widget* const widget); void add_children(const std::vector& children); void remove_child(Widget* const widget); - const std::vector children() const override; + const std::vector& children() const override; virtual std::string title() const; From 3aabd804d3bacb15bec1cb70178ba33562b016f0 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 7 Feb 2016 21:52:36 -0800 Subject: [PATCH 043/164] Remove commented code. --- firmware/common/ui.hpp | 53 ++---------------------------------------- 1 file changed, 2 insertions(+), 51 deletions(-) diff --git a/firmware/common/ui.hpp b/firmware/common/ui.hpp index 0a44efb6..9715e6c9 100644 --- a/firmware/common/ui.hpp +++ b/firmware/common/ui.hpp @@ -36,13 +36,7 @@ struct Color { ) : v { 0 } { } -/* - explicit constexpr Color( - const uint32_t value - ) : v { static_cast(value) } - { - } -*/ + constexpr Color( uint8_t r, uint8_t g, @@ -80,14 +74,7 @@ struct Color { return { 255, 255, 255 }; } }; -#if 0 -enum class CardinalDirection : uint8_t { - West, - South, - North, - East, -}; -#endif + struct Point { Coord x; Coord y; @@ -123,41 +110,6 @@ struct Point { y += p.y; return *this; } -#if 0 - uint32_t magnitude_squared() const { - return (x * x) + (y * y); - } - - CardinalDirection cardinal_direction() const { - /* TODO: Doesn't handle 0,0 */ - - const auto rotated = sloppy_rotate_by_45_degrees(); - - if( rotated.x > 0 ) { - if( rotated.y > 0 ) { - return CardinalDirection::East; - } else { - // y<=0 - return CardinalDirection::North; - } - } else { - // x<=0 - if( rotated.y > 0 ) { - return CardinalDirection::South; - } else { - return CardinalDirection::West; - } - } - } - -private: - Point sloppy_rotate_by_45_degrees() const { - /* Clockwise rotate (in screen coordinates), with a gain in - * magnitude of sqrt(2). - */ - return { x - y, x + y }; - } -#endif }; struct Size { @@ -208,7 +160,6 @@ struct Rect { size(size) { } - int top() const { return pos.y; From cdd15fcf7908e15e463d1631ab445e42dfcb8863 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Mon, 8 Feb 2016 12:35:20 -0800 Subject: [PATCH 044/164] Rework complex16_mag_squared_to_dbv_norm() to use log2. Small code size reduction and improvement in CPU effort. --- firmware/common/utility.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/firmware/common/utility.cpp b/firmware/common/utility.cpp index b09cf357..5162bcd6 100644 --- a/firmware/common/utility.cpp +++ b/firmware/common/utility.cpp @@ -61,10 +61,14 @@ uint32_t gcd(const uint32_t u, const uint32_t v) { #endif float complex16_mag_squared_to_dbv_norm(const float c16_mag_squared) { - constexpr float mag2_max = -32768.0f * -32768.0f + -32768.0f * -32768.0f; - constexpr float mag2_log10_max = std::log10(mag2_max); - constexpr float mag2_to_db_factor = 20.0f / 2.0f; - return (std::log10(c16_mag_squared) - mag2_log10_max) * mag2_to_db_factor; + constexpr float input_component_max = 32768; + constexpr float mag2_max = (input_component_max * input_component_max) * 2; + constexpr float mag2_log2_max = std::log2(mag2_max); + constexpr float log_mag2_mag_factor = 0.5f; + constexpr float log2_log10_factor = std::log10(2.0f); + constexpr float log10_dbv_factor = 20.0f; + constexpr float mag2_to_db_factor = log_mag2_mag_factor * log2_log10_factor * log10_dbv_factor; + return (std::log2(c16_mag_squared) - mag2_log2_max) * mag2_to_db_factor; } /* GCD implementation derived from recursive implementation at From 5cd423bb202e4e4c4229e3036e36f5bbc5278e3f Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Mon, 8 Feb 2016 12:55:06 -0800 Subject: [PATCH 045/164] Fast log2 implementation. Big improvement in code size (2034 bytes!). Baseband FFT (idle) thread CPU cut in half. --- firmware/common/utility.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/firmware/common/utility.cpp b/firmware/common/utility.cpp index 5162bcd6..715a0496 100644 --- a/firmware/common/utility.cpp +++ b/firmware/common/utility.cpp @@ -22,7 +22,6 @@ #include "utility.hpp" #include -#include #if 0 uint32_t gcd(const uint32_t u, const uint32_t v) { @@ -60,6 +59,20 @@ uint32_t gcd(const uint32_t u, const uint32_t v) { } #endif +static float fast_log2(const float val) { + // Thank you Stack Overflow! + // http://stackoverflow.com/questions/9411823/fast-log2float-x-implementation-c + union { + float val; + int32_t x; + } u = { val }; + float log_2 = (((u.x >> 23) & 255) - 128); + u.x &= ~(255 << 23); + u.x += (127 << 23); + log_2 += ((-0.34484843f) * u.val + 2.02466578f) * u.val - 0.67487759f; + return log_2; +} + float complex16_mag_squared_to_dbv_norm(const float c16_mag_squared) { constexpr float input_component_max = 32768; constexpr float mag2_max = (input_component_max * input_component_max) * 2; @@ -68,7 +81,7 @@ float complex16_mag_squared_to_dbv_norm(const float c16_mag_squared) { constexpr float log2_log10_factor = std::log10(2.0f); constexpr float log10_dbv_factor = 20.0f; constexpr float mag2_to_db_factor = log_mag2_mag_factor * log2_log10_factor * log10_dbv_factor; - return (std::log2(c16_mag_squared) - mag2_log2_max) * mag2_to_db_factor; + return (fast_log2(c16_mag_squared) - mag2_log2_max) * mag2_to_db_factor; } /* GCD implementation derived from recursive implementation at From ae93d8ee58583beb7824b6b70aaa4762682a7227 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 9 Feb 2016 09:46:29 -0800 Subject: [PATCH 046/164] Simplify RSSI/BB DMA, extract to ThreadWait class. Also saved 688 bytes of code. --- firmware/baseband/Makefile | 1 + firmware/baseband/baseband_dma.cpp | 30 ++++++++------------- firmware/baseband/rssi_dma.cpp | 28 ++++++++------------ firmware/common/thread_wait.cpp | 42 ++++++++++++++++++++++++++++++ firmware/common/thread_wait.hpp | 36 +++++++++++++++++++++++++ 5 files changed, 101 insertions(+), 36 deletions(-) create mode 100644 firmware/common/thread_wait.cpp create mode 100644 firmware/common/thread_wait.hpp diff --git a/firmware/baseband/Makefile b/firmware/baseband/Makefile index 3aba34e1..5e971115 100755 --- a/firmware/baseband/Makefile +++ b/firmware/baseband/Makefile @@ -126,6 +126,7 @@ CPPSRC = main.cpp \ message_queue.cpp \ event.cpp \ event_m4.cpp \ + thread_wait.cpp \ gpdma.cpp \ baseband_dma.cpp \ baseband_sgpio.cpp \ diff --git a/firmware/baseband/baseband_dma.cpp b/firmware/baseband/baseband_dma.cpp index 7467f551..f5dcca1e 100644 --- a/firmware/baseband/baseband_dma.cpp +++ b/firmware/baseband/baseband_dma.cpp @@ -32,6 +32,8 @@ using namespace lpc43xx; #include "portapack_dma.hpp" +#include "thread_wait.hpp" + namespace baseband { namespace dma { @@ -99,21 +101,19 @@ constexpr size_t msg_count = transfers_per_buffer - 1; static std::array lli_loop; static constexpr auto& gpdma_channel_sgpio = gpdma::channels[portapack::sgpio_gpdma_channel_number]; -static Semaphore semaphore; - -static volatile const gpdma::channel::LLI* next_lli = nullptr; +static ThreadWait thread_wait; static void transfer_complete() { - next_lli = gpdma_channel_sgpio.next_lli(); - chSemSignalI(&semaphore); + const auto next_lli_index = gpdma_channel_sgpio.next_lli() - &lli_loop[0]; + thread_wait.wake_from_interrupt(next_lli_index); } static void dma_error() { + thread_wait.wake_from_interrupt(-1); disable(); } void init() { - chSemInit(&semaphore, 0); gpdma_channel_sgpio.set_handlers(transfer_complete, dma_error); // LPC_GPDMA->SYNC |= (1 << gpdma_src_peripheral); @@ -138,9 +138,6 @@ void configure( void enable(const baseband::Direction direction) { const auto gpdma_config = config(direction); gpdma_channel_sgpio.configure(lli_loop[0], gpdma_config); - - chSemReset(&semaphore, 0); - gpdma_channel_sgpio.enable(); } @@ -153,16 +150,11 @@ void disable() { } baseband::buffer_t wait_for_rx_buffer() { - const auto status = chSemWait(&semaphore); - if( status == RDY_OK ) { - const auto next = next_lli; - if( next ) { - const size_t next_index = next - &lli_loop[0]; - const size_t free_index = (next_index + transfers_per_buffer - 2) & transfers_mask; - return { reinterpret_cast(lli_loop[free_index].destaddr), transfer_samples }; - } else { - return { }; - } + const auto next_index = thread_wait.sleep(); + + if( next_index >= 0 ) { + const size_t free_index = (next_index + transfers_per_buffer - 2) & transfers_mask; + return { reinterpret_cast(lli_loop[free_index].destaddr), transfer_samples }; } else { return { }; } diff --git a/firmware/baseband/rssi_dma.cpp b/firmware/baseband/rssi_dma.cpp index 91f3b496..355698ad 100644 --- a/firmware/baseband/rssi_dma.cpp +++ b/firmware/baseband/rssi_dma.cpp @@ -33,6 +33,8 @@ using namespace lpc43xx; #include "portapack_dma.hpp" #include "portapack_adc.hpp" +#include "thread_wait.hpp" + namespace rf { namespace rssi { namespace dma { @@ -99,20 +101,19 @@ static buffers_config_t buffers_config; static sample_t *samples { nullptr }; static gpdma::channel::LLI *lli { nullptr }; -static Semaphore semaphore; -static volatile const gpdma::channel::LLI* next_lli = nullptr; +static ThreadWait thread_wait; static void transfer_complete() { - next_lli = gpdma_channel.next_lli(); - chSemSignalI(&semaphore); + const auto next_lli_index = gpdma_channel.next_lli() - &lli[0]; + thread_wait.wake_from_interrupt(next_lli_index); } static void dma_error() { + thread_wait.wake_from_interrupt(-1); disable(); } void init() { - chSemInit(&semaphore, 0); gpdma_channel.set_handlers(transfer_complete, dma_error); // LPC_GPDMA->SYNC |= (1 << gpdma_peripheral); @@ -147,8 +148,6 @@ void free() { void enable() { const auto gpdma_config = config(); gpdma_channel.configure(lli[0], gpdma_config); - - chSemReset(&semaphore, 0); gpdma_channel.enable(); } @@ -161,16 +160,11 @@ void disable() { } rf::rssi::buffer_t wait_for_buffer() { - const auto status = chSemWait(&semaphore); - if( status == RDY_OK ) { - const auto next = next_lli; - if( next ) { - const size_t next_index = next - &lli[0]; - const size_t free_index = (next_index + buffers_config.count - 2) % buffers_config.count; - return { reinterpret_cast(lli[free_index].destaddr), buffers_config.items_per_buffer }; - } else { - return { nullptr, 0 }; - } + const auto next_index = thread_wait.sleep(); + + if( next_index >= 0 ) { + const size_t free_index = (next_index + buffers_config.count - 2) % buffers_config.count; + return { reinterpret_cast(lli[free_index].destaddr), buffers_config.items_per_buffer }; } else { // TODO: Should I return here, or loop if RDY_RESET? return { nullptr, 0 }; diff --git a/firmware/common/thread_wait.cpp b/firmware/common/thread_wait.cpp new file mode 100644 index 00000000..dd3aac27 --- /dev/null +++ b/firmware/common/thread_wait.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "thread_wait.hpp" + +int ThreadWait::sleep() { + chSysLock(); + thread_to_wake = chThdSelf(); + chSchGoSleepS(THD_STATE_SUSPENDED); + const auto result = chThdSelf()->p_u.rdymsg; + chSysUnlock(); + return result; +} + +bool ThreadWait::wake_from_interrupt(const int value) { + if( thread_to_wake ) { + thread_to_wake->p_u.rdymsg = value; + chSchReadyI(thread_to_wake); + thread_to_wake = nullptr; + return true; + } else { + return false; + } +} diff --git a/firmware/common/thread_wait.hpp b/firmware/common/thread_wait.hpp new file mode 100644 index 00000000..9380dc43 --- /dev/null +++ b/firmware/common/thread_wait.hpp @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __THREAD_WAIT_H__ +#define __THREAD_WAIT_H__ + +#include + +class ThreadWait { +public: + int sleep(); + bool wake_from_interrupt(const int value); + +private: + Thread* thread_to_wake { nullptr }; +}; + +#endif/*__THREAD_WAIT_H__*/ From 096e961c67209958d2dd4caee5dd45d8d26b107d Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 9 Feb 2016 11:32:07 -0800 Subject: [PATCH 047/164] Remove ChibiOS registry, thread names. Only useful for debugging, but even then not very visible or useful. Gained 256 bytes of code RAM. --- firmware/baseband/baseband_thread.hpp | 5 ----- firmware/baseband/chconf.h | 2 +- firmware/baseband/rssi_thread.hpp | 5 ----- firmware/baseband/thread_base.hpp | 9 --------- 4 files changed, 1 insertion(+), 20 deletions(-) diff --git a/firmware/baseband/baseband_thread.hpp b/firmware/baseband/baseband_thread.hpp index 81d35433..6da3c493 100644 --- a/firmware/baseband/baseband_thread.hpp +++ b/firmware/baseband/baseband_thread.hpp @@ -30,11 +30,6 @@ class BasebandThread : public ThreadBase { public: - BasebandThread( - ) : ThreadBase { "baseband" } - { - } - Thread* start(const tprio_t priority); void on_message(const Message* const message); diff --git a/firmware/baseband/chconf.h b/firmware/baseband/chconf.h index 8045cf4f..0ad24529 100755 --- a/firmware/baseband/chconf.h +++ b/firmware/baseband/chconf.h @@ -129,7 +129,7 @@ * @note The default is @p TRUE. */ #if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE +#define CH_USE_REGISTRY FALSE #endif /** diff --git a/firmware/baseband/rssi_thread.hpp b/firmware/baseband/rssi_thread.hpp index 0a00ef8e..5233ddd5 100644 --- a/firmware/baseband/rssi_thread.hpp +++ b/firmware/baseband/rssi_thread.hpp @@ -30,11 +30,6 @@ class RSSIThread : public ThreadBase { public: - RSSIThread( - ) : ThreadBase { "rssi" } - { - } - Thread* start(const tprio_t priority); private: diff --git a/firmware/baseband/thread_base.hpp b/firmware/baseband/thread_base.hpp index b318b240..921aeeb9 100644 --- a/firmware/baseband/thread_base.hpp +++ b/firmware/baseband/thread_base.hpp @@ -26,26 +26,17 @@ class ThreadBase { public: - constexpr ThreadBase( - const char* const name - ) : name { name } - { - } - virtual ~ThreadBase() = default; protected: static msg_t fn(void* arg) { auto obj = static_cast(arg); - chRegSetThreadName(obj->name); obj->run(); return 0; } private: - const char* const name; - virtual void run() = 0; }; From dfbcf5bc752a08bd9df8f19c5a5b6db6a6b519a7 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 10 Feb 2016 10:15:42 -0800 Subject: [PATCH 048/164] Extract some constexpr math utilities to utility.hpp ...my dumping ground for so many random bits. --- firmware/common/dsp_fft.hpp | 9 +-------- firmware/common/utility.hpp | 8 ++++++++ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/firmware/common/dsp_fft.hpp b/firmware/common/dsp_fft.hpp index a360721a..65dd8098 100644 --- a/firmware/common/dsp_fft.hpp +++ b/firmware/common/dsp_fft.hpp @@ -32,6 +32,7 @@ #include "dsp_types.hpp" #include "complex.hpp" #include "hal.h" +#include "utility.hpp" namespace std { /* https://github.com/AE9RB/fftbench/blob/master/cxlr.hpp @@ -47,14 +48,6 @@ namespace std { } } /* namespace std */ -constexpr bool power_of_two(const size_t n) { - return (n & (n - 1)) == 0; -} - -constexpr size_t log_2(const size_t n, const size_t p = 0) { - return (n <= 1) ? p : log_2(n / 2, p + 1); -} - template void fft_swap(const buffer_c16_t src, std::array& dst) { static_assert(power_of_two(N), "only defined for N == power of two"); diff --git a/firmware/common/utility.hpp b/firmware/common/utility.hpp index 2a2dc9f4..02caa1a1 100644 --- a/firmware/common/utility.hpp +++ b/firmware/common/utility.hpp @@ -61,6 +61,14 @@ inline constexpr T pow(const T base, unsigned const exponent) { return (exponent == 0) ? 1 : (base * pow(base, exponent - 1)); } +constexpr bool power_of_two(const size_t n) { + return (n & (n - 1)) == 0; +} + +constexpr size_t log_2(const size_t n, const size_t p = 0) { + return (n <= 1) ? p : log_2(n / 2, p + 1); +} + float complex16_mag_squared_to_dbv_norm(const float c16_mag_squared); inline float magnitude_squared(const std::complex c) { From d125a5c662a477e20b8d2c776d31f56b4803d167 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 10 Feb 2016 10:41:06 -0800 Subject: [PATCH 049/164] Remove "K" parameter from FIFO template. --- firmware/baseband/spectrum_collector.hpp | 4 +++- firmware/common/fifo.hpp | 19 +++++++++++++------ firmware/common/message.hpp | 4 +++- firmware/common/message_queue.hpp | 9 ++++++--- firmware/common/portapack_shared_memory.hpp | 18 ++++++++++++++---- 5 files changed, 39 insertions(+), 15 deletions(-) diff --git a/firmware/baseband/spectrum_collector.hpp b/firmware/baseband/spectrum_collector.hpp index 6c50120b..b238c1fe 100644 --- a/firmware/baseband/spectrum_collector.hpp +++ b/firmware/baseband/spectrum_collector.hpp @@ -35,7 +35,8 @@ class SpectrumCollector { public: constexpr SpectrumCollector( - ) : channel_spectrum_decimator { 1 } + ) : channel_spectrum_decimator { 1 }, + fifo { fifo_data, ChannelSpectrumConfigMessage::fifo_k } { } @@ -52,6 +53,7 @@ public: private: BlockDecimator channel_spectrum_decimator; ChannelSpectrumFIFO fifo; + ChannelSpectrum fifo_data[1 << ChannelSpectrumConfigMessage::fifo_k]; volatile bool channel_spectrum_request_update { false }; bool streaming { false }; diff --git a/firmware/common/fifo.hpp b/firmware/common/fifo.hpp index 86c06a73..56e82baa 100644 --- a/firmware/common/fifo.hpp +++ b/firmware/common/fifo.hpp @@ -22,18 +22,24 @@ #ifndef __FIFO_H__ #define __FIFO_H__ +#include #include #include +#include #include /* FIFO implementation inspired by Linux kfifo. */ -template +template class FIFO { public: constexpr FIFO( - ) : _in { 0 }, + T* data, + size_t k + ) : _data { data }, + _size { 1U << k }, + _in { 0 }, _out { 0 } { } @@ -150,15 +156,15 @@ public: } private: - static constexpr size_t size() { - return (1UL << K); + size_t size() const { + return _size; } static constexpr size_t esize() { return sizeof(T); } - static constexpr size_t mask() { + size_t mask() const { return size() - 1; } @@ -224,7 +230,8 @@ private: return buf_len; } - T _data[size()]; + T* const _data; + const size_t _size; volatile size_t _in; volatile size_t _out; }; diff --git a/firmware/common/message.hpp b/firmware/common/message.hpp index c29eb11e..cbce464e 100644 --- a/firmware/common/message.hpp +++ b/firmware/common/message.hpp @@ -244,10 +244,12 @@ struct ChannelSpectrum { uint32_t channel_filter_stop_frequency { 0 }; }; -using ChannelSpectrumFIFO = FIFO; +using ChannelSpectrumFIFO = FIFO; class ChannelSpectrumConfigMessage : public Message { public: + static constexpr size_t fifo_k = 2; + constexpr ChannelSpectrumConfigMessage( ChannelSpectrumFIFO* fifo ) : Message { ID::ChannelSpectrumConfig }, diff --git a/firmware/common/message_queue.hpp b/firmware/common/message_queue.hpp index c4430a23..baba13ef 100644 --- a/firmware/common/message_queue.hpp +++ b/firmware/common/message_queue.hpp @@ -32,10 +32,13 @@ using namespace lpc43xx; #include -template class MessageQueue { public: - MessageQueue() { + MessageQueue( + uint8_t* const data, + size_t k + ) : fifo { data, k } + { chMtxInit(&mutex_write); } @@ -80,7 +83,7 @@ public: } private: - FIFO fifo; + FIFO fifo; Mutex mutex_write; bool push(const void* const buf, const size_t len) { diff --git a/firmware/common/portapack_shared_memory.hpp b/firmware/common/portapack_shared_memory.hpp index a0fd7010..f7c11d0c 100644 --- a/firmware/common/portapack_shared_memory.hpp +++ b/firmware/common/portapack_shared_memory.hpp @@ -23,6 +23,7 @@ #define __PORTAPACK_SHARED_MEMORY_H__ #include +#include #include "message_queue.hpp" @@ -32,8 +33,13 @@ struct TouchADCFrame { /* NOTE: These structures must be located in the same location in both M4 and M0 binaries */ struct SharedMemory { - MessageQueue<12> baseband_queue; - MessageQueue<11> application_queue; + static constexpr size_t baseband_queue_k = 12; + static constexpr size_t application_queue_k = 11; + + MessageQueue baseband_queue; + uint8_t baseband_queue_data[1 << baseband_queue_k]; + MessageQueue application_queue; + uint8_t application_queue_data[1 << application_queue_k]; // TODO: M0 should directly configure and control DMA channel that is // acquiring ADC samples. @@ -44,8 +50,12 @@ extern SharedMemory& shared_memory; #if defined(LPC43XX_M0) inline void init_message_queues() { - new (&shared_memory.baseband_queue) MessageQueue<12>(); - new (&shared_memory.application_queue) MessageQueue<11>(); + new (&shared_memory.baseband_queue) MessageQueue( + shared_memory.baseband_queue_data, SharedMemory::baseband_queue_k + ); + new (&shared_memory.application_queue) MessageQueue( + shared_memory.application_queue_data, SharedMemory::application_queue_k + ); } #endif From b0e76191d7311c0365056740a8039d244550d3c0 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 10 Feb 2016 11:23:41 -0800 Subject: [PATCH 050/164] Simplify some silly math. --- firmware/baseband/proc_am_audio.cpp | 2 +- firmware/baseband/proc_nfm_audio.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware/baseband/proc_am_audio.cpp b/firmware/baseband/proc_am_audio.cpp index 3a073db4..bb207102 100644 --- a/firmware/baseband/proc_am_audio.cpp +++ b/firmware/baseband/proc_am_audio.cpp @@ -86,7 +86,7 @@ void NarrowbandAMAudio::configure(const AMConfigureMessage& message) { channel_filter.configure(message.channel_filter.taps, channel_filter_decimation_factor); channel_filter_pass_f = message.channel_filter.pass_frequency_normalized * channel_filter_input_fs; channel_filter_stop_f = message.channel_filter.stop_frequency_normalized * channel_filter_input_fs; - channel_spectrum.set_decimation_factor(std::floor((channel_filter_output_fs / 2) / ((channel_filter_pass_f + channel_filter_stop_f) / 2))); + channel_spectrum.set_decimation_factor(std::floor(channel_filter_output_fs / (channel_filter_pass_f + channel_filter_stop_f))); modulation_ssb = (message.modulation == AMConfigureMessage::Modulation::SSB); audio_output.configure(message.audio_hpf_config); diff --git a/firmware/baseband/proc_nfm_audio.cpp b/firmware/baseband/proc_nfm_audio.cpp index 2a0349ac..ce9c6634 100644 --- a/firmware/baseband/proc_nfm_audio.cpp +++ b/firmware/baseband/proc_nfm_audio.cpp @@ -76,7 +76,7 @@ void NarrowbandFMAudio::configure(const NBFMConfigureMessage& message) { demod.configure(demod_input_fs, message.deviation); channel_filter_pass_f = message.channel_filter.pass_frequency_normalized * channel_filter_input_fs; channel_filter_stop_f = message.channel_filter.stop_frequency_normalized * channel_filter_input_fs; - channel_spectrum.set_decimation_factor(std::floor((channel_filter_output_fs / 2) / ((channel_filter_pass_f + channel_filter_stop_f) / 2))); + channel_spectrum.set_decimation_factor(std::floor(channel_filter_output_fs / (channel_filter_pass_f + channel_filter_stop_f))); audio_output.configure(message.audio_hpf_config, message.audio_deemph_config, 12288); configured = true; From 6c06549b6e0b403abbe78ea14e3e008e6dd2a76c Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 10 Feb 2016 15:34:33 -0800 Subject: [PATCH 051/164] Remove reference PPM methods from ReceiverModel. --- firmware/application/analog_audio_app.cpp | 5 +++-- firmware/application/receiver_model.cpp | 8 -------- firmware/application/receiver_model.hpp | 3 --- 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/firmware/application/analog_audio_app.cpp b/firmware/application/analog_audio_app.cpp index 361e5e80..7eae0d1c 100644 --- a/firmware/application/analog_audio_app.cpp +++ b/firmware/application/analog_audio_app.cpp @@ -22,6 +22,7 @@ #include "analog_audio_app.hpp" #include "portapack.hpp" +#include "portapack_persistent_memory.hpp" #include "portapack_shared_memory.hpp" using namespace portapack; @@ -225,7 +226,7 @@ void AnalogAudioView::on_show_options_frequency() { widget->on_change_step = [this](rf::Frequency f) { this->on_frequency_step_changed(f); }; - widget->set_reference_ppm_correction(receiver_model.reference_ppm_correction()); + widget->set_reference_ppm_correction(persistent_memory::correction_ppb() / 1000); widget->on_change_reference_ppm_correction = [this](int32_t v) { this->on_reference_ppm_correction_changed(v); }; @@ -281,7 +282,7 @@ void AnalogAudioView::on_frequency_step_changed(rf::Frequency f) { } void AnalogAudioView::on_reference_ppm_correction_changed(int32_t v) { - receiver_model.set_reference_ppm_correction(v); + persistent_memory::set_correction_ppb(v * 1000); } void AnalogAudioView::on_headphone_volume_changed(int32_t v) { diff --git a/firmware/application/receiver_model.cpp b/firmware/application/receiver_model.cpp index 38cb155c..027a2848 100644 --- a/firmware/application/receiver_model.cpp +++ b/firmware/application/receiver_model.cpp @@ -129,14 +129,6 @@ void ReceiverModel::set_frequency_step(rf::Frequency f) { frequency_step_ = f; } -int32_t ReceiverModel::reference_ppm_correction() const { - return persistent_memory::correction_ppb() / 1000; -} - -void ReceiverModel::set_reference_ppm_correction(int32_t v) { - persistent_memory::set_correction_ppb(v * 1000); -} - bool ReceiverModel::antenna_bias() const { return antenna_bias_; } diff --git a/firmware/application/receiver_model.hpp b/firmware/application/receiver_model.hpp index 4b21c87b..23f877b8 100644 --- a/firmware/application/receiver_model.hpp +++ b/firmware/application/receiver_model.hpp @@ -48,9 +48,6 @@ public: rf::Frequency frequency_step() const; void set_frequency_step(rf::Frequency f); - int32_t reference_ppm_correction() const; - void set_reference_ppm_correction(int32_t v); - bool antenna_bias() const; void set_antenna_bias(bool enabled); From 358730070150f3bb9799e4d6f7c2c8f90a752b03 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 10 Feb 2016 16:19:31 -0800 Subject: [PATCH 052/164] Remove extra #include. --- firmware/application/ui_navigation.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index 97084f6f..248b84d5 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -23,7 +23,6 @@ #include "portapack.hpp" #include "event_m0.hpp" -#include "receiver_model.hpp" #include "ui_setup.hpp" #include "ui_debug.hpp" From 5cdbae495a3df36d58e1c05b5a974f91f22e3193 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 10 Feb 2016 16:31:52 -0800 Subject: [PATCH 053/164] Digital modes no longer use ReceiverModel. AIS/TPMS/ERT were changing receiver mode settings -- not my intent. --- firmware/application/ais_app.cpp | 56 ++++++++++++++++++++++--------- firmware/application/ais_app.hpp | 13 ++++++- firmware/application/ert_app.cpp | 32 ++++++++++++------ firmware/application/ert_app.hpp | 4 +++ firmware/application/tpms_app.cpp | 45 +++++++++++++++++-------- firmware/application/tpms_app.hpp | 9 ++++- 6 files changed, 116 insertions(+), 43 deletions(-) diff --git a/firmware/application/ais_app.cpp b/firmware/application/ais_app.cpp index c3867e34..9a416271 100644 --- a/firmware/application/ais_app.cpp +++ b/firmware/application/ais_app.cpp @@ -25,7 +25,7 @@ #include "string_format.hpp" -#include "portapack.hpp" +#include "portapack_shared_memory.hpp" using namespace portapack; #include @@ -340,22 +340,27 @@ AISAppView::AISAppView(NavigationView&) { } } ); + + set_target_frequency(initial_target_frequency); + radio::set_rf_amp(false); + radio::set_lna_gain(32); + radio::set_vga_gain(32); + radio::set_baseband_rate(sampling_rate); + radio::set_baseband_decimation_by(1); + radio::set_baseband_filter_bandwidth(baseband_bandwidth); + radio::set_direction(rf::Direction::Receive); + + BasebandConfigurationMessage message { { + .mode = 3, + .sampling_rate = sampling_rate, + .decimation_factor = 1, + } }; + shared_memory.baseband_queue.push(message); options_channel.on_change = [this](size_t, OptionsField::value_t v) { this->on_frequency_changed(v); }; - options_channel.set_by_value(162025000); - - receiver_model.set_baseband_configuration({ - .mode = 3, - .sampling_rate = 2457600, - .decimation_factor = 1, - }); - receiver_model.set_baseband_bandwidth(1750000); - receiver_model.set_rf_amp(false); - receiver_model.set_lna(32); - receiver_model.set_vga(32); - receiver_model.enable(); + options_channel.set_by_value(target_frequency()); recent_entries_view.on_select = [this](const AISRecentEntry& entry) { this->on_show_detail(entry); @@ -366,7 +371,13 @@ AISAppView::AISAppView(NavigationView&) { } AISAppView::~AISAppView() { - receiver_model.disable(); + shared_memory.baseband_queue.push_and_wait( + BasebandConfigurationMessage { + .configuration = { }, + } + ); + radio::disable(); + EventDispatcher::message_map().unregister_handler(Message::ID::AISPacket); } @@ -405,8 +416,21 @@ void AISAppView::on_show_detail(const AISRecentEntry& entry) { recent_entry_detail_view.focus(); } -void AISAppView::on_frequency_changed(const uint32_t new_frequency) { - receiver_model.set_tuning_frequency(new_frequency); +void AISAppView::on_frequency_changed(const uint32_t new_target_frequency) { + set_target_frequency(new_target_frequency); +} + +void AISAppView::set_target_frequency(const uint32_t new_value) { + target_frequency_ = new_value; + radio::set_tuning_frequency(tuning_frequency()); +} + +uint32_t AISAppView::target_frequency() const { + return target_frequency_; +} + +uint32_t AISAppView::tuning_frequency() const { + return target_frequency() - (sampling_rate / 4); } } /* namespace ui */ diff --git a/firmware/application/ais_app.hpp b/firmware/application/ais_app.hpp index 73b005d3..9e2c81b2 100644 --- a/firmware/application/ais_app.hpp +++ b/firmware/application/ais_app.hpp @@ -145,6 +145,10 @@ public: std::string title() const override { return "AIS"; }; private: + static constexpr uint32_t initial_target_frequency = 162025000; + static constexpr uint32_t sampling_rate = 2457600; + static constexpr uint32_t baseband_bandwidth = 1750000; + AISRecentEntries recent; AISLogger logger; @@ -167,11 +171,18 @@ private: } }; + uint32_t target_frequency_ = initial_target_frequency; + void on_packet(const ais::Packet& packet); void on_show_list(); void on_show_detail(const AISRecentEntry& entry); - void on_frequency_changed(const uint32_t new_frequency); + void on_frequency_changed(const uint32_t new_target_frequency); + + uint32_t target_frequency() const; + void set_target_frequency(const uint32_t new_value); + + uint32_t tuning_frequency() const; }; } /* namespace ui */ diff --git a/firmware/application/ert_app.cpp b/firmware/application/ert_app.cpp index 9ca5800d..485966ff 100644 --- a/firmware/application/ert_app.cpp +++ b/firmware/application/ert_app.cpp @@ -23,7 +23,7 @@ #include "event_m0.hpp" -#include "portapack.hpp" +#include "portapack_shared_memory.hpp" using namespace portapack; #include "manchester.hpp" @@ -131,21 +131,31 @@ ERTAppView::ERTAppView(NavigationView&) { } ); - receiver_model.set_baseband_configuration({ + radio::set_tuning_frequency(initial_target_frequency); + radio::set_rf_amp(false); + radio::set_lna_gain(32); + radio::set_vga_gain(32); + radio::set_baseband_rate(sampling_rate); + radio::set_baseband_decimation_by(1); + radio::set_baseband_filter_bandwidth(baseband_bandwidth); + radio::set_direction(rf::Direction::Receive); + + BasebandConfigurationMessage message { { .mode = 6, - .sampling_rate = 4194304, + .sampling_rate = sampling_rate, .decimation_factor = 1, - }); - receiver_model.set_baseband_bandwidth(2500000); - receiver_model.set_rf_amp(false); - receiver_model.set_lna(32); - receiver_model.set_vga(32); - receiver_model.set_tuning_frequency(911600000); - receiver_model.enable(); + } }; + shared_memory.baseband_queue.push(message); } ERTAppView::~ERTAppView() { - receiver_model.disable(); + shared_memory.baseband_queue.push_and_wait( + BasebandConfigurationMessage { + .configuration = { }, + } + ); + radio::disable(); + EventDispatcher::message_map().unregister_handler(Message::ID::ERTPacket); } diff --git a/firmware/application/ert_app.hpp b/firmware/application/ert_app.hpp index 065f7f9b..4b8c21d5 100644 --- a/firmware/application/ert_app.hpp +++ b/firmware/application/ert_app.hpp @@ -74,6 +74,10 @@ using ERTRecentEntriesView = RecentEntriesView; class ERTAppView : public View { public: + static constexpr uint32_t initial_target_frequency = 911600000; + static constexpr uint32_t sampling_rate = 4194304; + static constexpr uint32_t baseband_bandwidth = 2500000; + ERTAppView(NavigationView& nav); ~ERTAppView(); diff --git a/firmware/application/tpms_app.cpp b/firmware/application/tpms_app.cpp index 2cc05c08..b1e96a63 100644 --- a/firmware/application/tpms_app.cpp +++ b/firmware/application/tpms_app.cpp @@ -23,7 +23,7 @@ #include "event_m0.hpp" -#include "portapack.hpp" +#include "portapack_shared_memory.hpp" using namespace portapack; #include "string_format.hpp" @@ -137,13 +137,12 @@ size_t Packet::crc_valid_length() const { } /* namespace tpms */ -void TPMSLogger::on_packet(const tpms::Packet& packet) { +void TPMSLogger::on_packet(const tpms::Packet& packet, const uint32_t target_frequency) { const auto hex_formatted = packet.symbols_formatted(); if( log_file.is_ready() ) { - const auto tuning_frequency = receiver_model.tuning_frequency(); // TODO: function doesn't take uint64_t, so when >= 1<<32, weirdness will ensue! - const auto tuning_frequency_str = to_string_dec_uint(tuning_frequency, 10); + const auto tuning_frequency_str = to_string_dec_uint(target_frequency, 10); std::string entry = tuning_frequency_str + " FSK 38.4 19.2 " + hex_formatted.data + "/" + hex_formatted.errors; log_file.write_entry(packet.received_at(), entry); @@ -239,21 +238,31 @@ TPMSAppView::TPMSAppView(NavigationView&) { } ); - receiver_model.set_baseband_configuration({ + radio::set_tuning_frequency(tuning_frequency()); + radio::set_rf_amp(false); + radio::set_lna_gain(32); + radio::set_vga_gain(32); + radio::set_baseband_rate(sampling_rate); + radio::set_baseband_decimation_by(1); + radio::set_baseband_filter_bandwidth(baseband_bandwidth); + radio::set_direction(rf::Direction::Receive); + + BasebandConfigurationMessage message { { .mode = 5, .sampling_rate = 2457600, .decimation_factor = 1, - }); - receiver_model.set_baseband_bandwidth(1750000); - receiver_model.set_rf_amp(false); - receiver_model.set_lna(32); - receiver_model.set_vga(32); - receiver_model.set_tuning_frequency(315000000); - receiver_model.enable(); + } }; + shared_memory.baseband_queue.push(message); } TPMSAppView::~TPMSAppView() { - receiver_model.disable(); + shared_memory.baseband_queue.push_and_wait( + BasebandConfigurationMessage { + .configuration = { }, + } + ); + radio::disable(); + EventDispatcher::message_map().unregister_handler(Message::ID::TPMSPacket); } @@ -267,7 +276,7 @@ void TPMSAppView::set_parent_rect(const Rect new_parent_rect) { } void TPMSAppView::on_packet(const tpms::Packet& packet) { - logger.on_packet(packet); + logger.on_packet(packet, target_frequency()); const auto reading_opt = packet.reading(); if( reading_opt.is_valid() ) { @@ -282,4 +291,12 @@ void TPMSAppView::on_show_list() { recent_entries_view.focus(); } +uint32_t TPMSAppView::target_frequency() const { + return initial_target_frequency; +} + +uint32_t TPMSAppView::tuning_frequency() const { + return target_frequency() - (sampling_rate / 4); +} + } /* namespace ui */ diff --git a/firmware/application/tpms_app.hpp b/firmware/application/tpms_app.hpp index 0ecf4884..6a06cbb3 100644 --- a/firmware/application/tpms_app.hpp +++ b/firmware/application/tpms_app.hpp @@ -186,7 +186,7 @@ using TPMSRecentEntries = RecentEntries; class TPMSLogger { public: - void on_packet(const tpms::Packet& packet); + void on_packet(const tpms::Packet& packet, const uint32_t target_frequency); private: LogFile log_file { "tpms.txt" }; @@ -212,6 +212,10 @@ public: std::string title() const override { return "TPMS"; }; private: + static constexpr uint32_t initial_target_frequency = 315000000; + static constexpr uint32_t sampling_rate = 2457600; + static constexpr uint32_t baseband_bandwidth = 1750000; + TPMSRecentEntries recent; TPMSLogger logger; @@ -219,6 +223,9 @@ private: void on_packet(const tpms::Packet& packet); void on_show_list(); + + uint32_t target_frequency() const; + uint32_t tuning_frequency() const; }; } /* namespace ui */ From 472b0a2e795762264cfa67f4aa4d4514e62cf1b7 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 10 Feb 2016 16:32:25 -0800 Subject: [PATCH 054/164] ReceiverModel no longer uses some baseband modes. --- firmware/application/receiver_model.cpp | 3 +-- firmware/application/receiver_model.hpp | 3 --- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/firmware/application/receiver_model.cpp b/firmware/application/receiver_model.cpp index 027a2848..7edd6f24 100644 --- a/firmware/application/receiver_model.cpp +++ b/firmware/application/receiver_model.cpp @@ -229,8 +229,7 @@ void ReceiverModel::disable() { } int32_t ReceiverModel::tuning_offset() { - if( (baseband_configuration.mode == 4) || - (baseband_configuration.mode == 6) ) { + if( (baseband_configuration.mode == 4) ) { return 0; } else { return -(sampling_rate() / 4); diff --git a/firmware/application/receiver_model.hpp b/firmware/application/receiver_model.hpp index 23f877b8..159706e0 100644 --- a/firmware/application/receiver_model.hpp +++ b/firmware/application/receiver_model.hpp @@ -36,10 +36,7 @@ public: AMAudio = 0, NarrowbandFMAudio = 1, WidebandFMAudio = 2, - AIS = 3, SpectrumAnalysis = 4, - TPMS = 5, - ERT = 6, }; rf::Frequency tuning_frequency() const; From f5cdf8ed76766f6fcef4150b9ff99f9812576d8c Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 10 Feb 2016 16:47:36 -0800 Subject: [PATCH 055/164] Remove unused radio:: function. --- firmware/application/radio.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/firmware/application/radio.hpp b/firmware/application/radio.hpp index 1be95b00..b8b4fb8b 100644 --- a/firmware/application/radio.hpp +++ b/firmware/application/radio.hpp @@ -39,7 +39,6 @@ bool set_tuning_frequency(const rf::Frequency frequency); void set_rf_amp(const bool rf_amp); void set_lna_gain(const int_fast8_t db); void set_vga_gain(const int_fast8_t db); -void set_sampling_frequency(const uint32_t frequency); void set_baseband_filter_bandwidth(const uint32_t bandwidth_minimum); void set_baseband_rate(const uint32_t rate); void set_baseband_decimation_by(const size_t n); From 692a262f41987872ada27246af851f4b4e0ffbcf Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 10 Feb 2016 16:48:09 -0800 Subject: [PATCH 056/164] Use TPMS sampling_rate variable instead of literal. --- firmware/application/tpms_app.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/application/tpms_app.cpp b/firmware/application/tpms_app.cpp index b1e96a63..55f6622d 100644 --- a/firmware/application/tpms_app.cpp +++ b/firmware/application/tpms_app.cpp @@ -249,7 +249,7 @@ TPMSAppView::TPMSAppView(NavigationView&) { BasebandConfigurationMessage message { { .mode = 5, - .sampling_rate = 2457600, + .sampling_rate = sampling_rate, .decimation_factor = 1, } }; shared_memory.baseband_queue.push(message); From 49a89b9deeae0c7367c2ca92f24dce119a8be886 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 10 Feb 2016 16:58:25 -0800 Subject: [PATCH 057/164] Single function to configure/enable radio. --- firmware/application/ais_app.cpp | 18 ++++++++++-------- firmware/application/ert_app.cpp | 16 ++++++++-------- firmware/application/radio.cpp | 15 +++++++++++++++ firmware/application/radio.hpp | 13 +++++++++++++ firmware/application/tpms_app.cpp | 16 ++++++++-------- 5 files changed, 54 insertions(+), 24 deletions(-) diff --git a/firmware/application/ais_app.cpp b/firmware/application/ais_app.cpp index 9a416271..cc097357 100644 --- a/firmware/application/ais_app.cpp +++ b/firmware/application/ais_app.cpp @@ -341,14 +341,16 @@ AISAppView::AISAppView(NavigationView&) { } ); - set_target_frequency(initial_target_frequency); - radio::set_rf_amp(false); - radio::set_lna_gain(32); - radio::set_vga_gain(32); - radio::set_baseband_rate(sampling_rate); - radio::set_baseband_decimation_by(1); - radio::set_baseband_filter_bandwidth(baseband_bandwidth); - radio::set_direction(rf::Direction::Receive); + target_frequency_ = initial_target_frequency; + + radio::enable({ + tuning_frequency(), + sampling_rate, + baseband_bandwidth, + rf::Direction::Receive, + false, 32, 32, + 1, + }); BasebandConfigurationMessage message { { .mode = 3, diff --git a/firmware/application/ert_app.cpp b/firmware/application/ert_app.cpp index 485966ff..b555bca4 100644 --- a/firmware/application/ert_app.cpp +++ b/firmware/application/ert_app.cpp @@ -131,14 +131,14 @@ ERTAppView::ERTAppView(NavigationView&) { } ); - radio::set_tuning_frequency(initial_target_frequency); - radio::set_rf_amp(false); - radio::set_lna_gain(32); - radio::set_vga_gain(32); - radio::set_baseband_rate(sampling_rate); - radio::set_baseband_decimation_by(1); - radio::set_baseband_filter_bandwidth(baseband_bandwidth); - radio::set_direction(rf::Direction::Receive); + radio::enable({ + initial_target_frequency, + sampling_rate, + baseband_bandwidth, + rf::Direction::Receive, + false, 32, 32, + 1, + }); BasebandConfigurationMessage message { { .mode = 6, diff --git a/firmware/application/radio.cpp b/firmware/application/radio.cpp index 1223e291..a8603a32 100644 --- a/firmware/application/radio.cpp +++ b/firmware/application/radio.cpp @@ -169,4 +169,19 @@ void disable() { set_rf_amp(false); } +void enable(Configuration configuration) { + configure(configuration); +} + +void configure(Configuration configuration) { + set_tuning_frequency(configuration.tuning_frequency); + set_rf_amp(configuration.rf_amp); + set_lna_gain(configuration.lna_gain); + set_vga_gain(configuration.vga_gain); + set_baseband_rate(configuration.baseband_rate); + set_baseband_decimation_by(configuration.baseband_decimation); + set_baseband_filter_bandwidth(configuration.baseband_filter_bandwidth); + set_direction(configuration.direction); +} + } /* namespace radio */ diff --git a/firmware/application/radio.hpp b/firmware/application/radio.hpp index b8b4fb8b..acc16fe7 100644 --- a/firmware/application/radio.hpp +++ b/firmware/application/radio.hpp @@ -32,6 +32,17 @@ namespace radio { +struct Configuration { + rf::Frequency tuning_frequency; + uint32_t baseband_rate; + uint32_t baseband_filter_bandwidth; + rf::Direction direction; + bool rf_amp; + int8_t lna_gain; + int8_t vga_gain; + uint8_t baseband_decimation; +}; + void init(); void set_direction(const rf::Direction new_direction); @@ -44,6 +55,8 @@ void set_baseband_rate(const uint32_t rate); void set_baseband_decimation_by(const size_t n); void set_antenna_bias(const bool on); +void enable(Configuration configuration); +void configure(Configuration configuration); void disable(); extern rffc507x::RFFC507x first_if; diff --git a/firmware/application/tpms_app.cpp b/firmware/application/tpms_app.cpp index 55f6622d..f580eaf9 100644 --- a/firmware/application/tpms_app.cpp +++ b/firmware/application/tpms_app.cpp @@ -238,14 +238,14 @@ TPMSAppView::TPMSAppView(NavigationView&) { } ); - radio::set_tuning_frequency(tuning_frequency()); - radio::set_rf_amp(false); - radio::set_lna_gain(32); - radio::set_vga_gain(32); - radio::set_baseband_rate(sampling_rate); - radio::set_baseband_decimation_by(1); - radio::set_baseband_filter_bandwidth(baseband_bandwidth); - radio::set_direction(rf::Direction::Receive); + radio::enable({ + tuning_frequency(), + sampling_rate, + baseband_bandwidth, + rf::Direction::Receive, + false, 32, 32, + 1, + }); BasebandConfigurationMessage message { { .mode = 5, From 22e44605b62e47e2852522658b42adef02e98db3 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 10 Feb 2016 20:11:19 -0800 Subject: [PATCH 058/164] Hide baseband queue code inside baseband "API". --- firmware/application/Makefile | 1 + firmware/application/ais_app.cpp | 14 +--- firmware/application/baseband_api.cpp | 105 ++++++++++++++++++++++++ firmware/application/baseband_api.hpp | 63 ++++++++++++++ firmware/application/ert_app.cpp | 14 +--- firmware/application/m4_startup.cpp | 5 +- firmware/application/receiver_model.cpp | 84 ++----------------- firmware/application/receiver_model.hpp | 2 - firmware/application/tpms_app.cpp | 14 +--- firmware/application/ui_spectrum.cpp | 15 +--- 10 files changed, 195 insertions(+), 122 deletions(-) create mode 100644 firmware/application/baseband_api.cpp create mode 100644 firmware/application/baseband_api.hpp diff --git a/firmware/application/Makefile b/firmware/application/Makefile index c3d347ef..ca1be09a 100755 --- a/firmware/application/Makefile +++ b/firmware/application/Makefile @@ -127,6 +127,7 @@ CPPSRC = main.cpp \ hackrf_hal.cpp \ portapack.cpp \ portapack_shared_memory.cpp \ + baseband_api.cpp \ portapack_persistent_memory.cpp \ portapack_io.cpp \ i2c_pp.cpp \ diff --git a/firmware/application/ais_app.cpp b/firmware/application/ais_app.cpp index cc097357..1d511309 100644 --- a/firmware/application/ais_app.cpp +++ b/firmware/application/ais_app.cpp @@ -25,8 +25,7 @@ #include "string_format.hpp" -#include "portapack_shared_memory.hpp" -using namespace portapack; +#include "baseband_api.hpp" #include @@ -352,12 +351,11 @@ AISAppView::AISAppView(NavigationView&) { 1, }); - BasebandConfigurationMessage message { { + baseband::start({ .mode = 3, .sampling_rate = sampling_rate, .decimation_factor = 1, - } }; - shared_memory.baseband_queue.push(message); + }); options_channel.on_change = [this](size_t, OptionsField::value_t v) { this->on_frequency_changed(v); @@ -373,11 +371,7 @@ AISAppView::AISAppView(NavigationView&) { } AISAppView::~AISAppView() { - shared_memory.baseband_queue.push_and_wait( - BasebandConfigurationMessage { - .configuration = { }, - } - ); + baseband::stop(); radio::disable(); EventDispatcher::message_map().unregister_handler(Message::ID::AISPacket); diff --git a/firmware/application/baseband_api.cpp b/firmware/application/baseband_api.cpp new file mode 100644 index 00000000..3c87682b --- /dev/null +++ b/firmware/application/baseband_api.cpp @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "baseband_api.hpp" + +#include "audio.hpp" +#include "dsp_iir_config.hpp" + +#include "portapack_shared_memory.hpp" + +namespace baseband { + +void AMConfig::apply() const { + const AMConfigureMessage message { + taps_6k0_decim_0, + taps_6k0_decim_1, + taps_6k0_decim_2, + channel, + modulation, + audio_12k_hpf_300hz_config + }; + shared_memory.baseband_queue.push(message); + audio::set_rate(audio::Rate::Hz_12000); +} + +void NBFMConfig::apply() const { + const NBFMConfigureMessage message { + decim_0, + decim_1, + channel, + 2, + deviation, + audio_24k_hpf_300hz_config, + audio_24k_deemph_300_6_config + }; + shared_memory.baseband_queue.push(message); + audio::set_rate(audio::Rate::Hz_24000); +} + +void WFMConfig::apply() const { + const WFMConfigureMessage message { + taps_200k_wfm_decim_0, + taps_200k_wfm_decim_1, + taps_64_lp_156_198, + 75000, + audio_48k_hpf_30hz_config, + audio_48k_deemph_2122_6_config + }; + shared_memory.baseband_queue.push(message); + audio::set_rate(audio::Rate::Hz_48000); +} + +void start(BasebandConfiguration configuration) { + BasebandConfigurationMessage message { configuration }; + shared_memory.baseband_queue.push(message); +} + +void stop() { + shared_memory.baseband_queue.push_and_wait( + BasebandConfigurationMessage { + .configuration = { }, + } + ); +} + +void shutdown() { + ShutdownMessage shutdown_message; + shared_memory.baseband_queue.push(shutdown_message); +} + +void spectrum_streaming_start() { + shared_memory.baseband_queue.push_and_wait( + SpectrumStreamingConfigMessage { + SpectrumStreamingConfigMessage::Mode::Running + } + ); +} + +void spectrum_streaming_stop() { + shared_memory.baseband_queue.push_and_wait( + SpectrumStreamingConfigMessage { + SpectrumStreamingConfigMessage::Mode::Stopped + } + ); +} + +} /* namespace baseband */ diff --git a/firmware/application/baseband_api.hpp b/firmware/application/baseband_api.hpp new file mode 100644 index 00000000..15959142 --- /dev/null +++ b/firmware/application/baseband_api.hpp @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __BASEBAND_API_H__ +#define __BASEBAND_API_H__ + +#include "message.hpp" + +#include "dsp_fir_taps.hpp" + +#include + +namespace baseband { + +struct AMConfig { + const fir_taps_complex<64> channel; + const AMConfigureMessage::Modulation modulation; + + void apply() const; +}; + +struct NBFMConfig { + const fir_taps_real<24> decim_0; + const fir_taps_real<32> decim_1; + const fir_taps_real<32> channel; + const size_t deviation; + + void apply() const; +}; + +struct WFMConfig { + void apply() const; +}; + +void start(BasebandConfiguration configuration); +void stop(); + +void shutdown(); + +void spectrum_streaming_start(); +void spectrum_streaming_stop(); + +} /* namespace baseband */ + +#endif/*__BASEBAND_API_H__*/ diff --git a/firmware/application/ert_app.cpp b/firmware/application/ert_app.cpp index b555bca4..6ad67d96 100644 --- a/firmware/application/ert_app.cpp +++ b/firmware/application/ert_app.cpp @@ -23,8 +23,7 @@ #include "event_m0.hpp" -#include "portapack_shared_memory.hpp" -using namespace portapack; +#include "baseband_api.hpp" #include "manchester.hpp" @@ -140,20 +139,15 @@ ERTAppView::ERTAppView(NavigationView&) { 1, }); - BasebandConfigurationMessage message { { + baseband::start({ .mode = 6, .sampling_rate = sampling_rate, .decimation_factor = 1, - } }; - shared_memory.baseband_queue.push(message); + }); } ERTAppView::~ERTAppView() { - shared_memory.baseband_queue.push_and_wait( - BasebandConfigurationMessage { - .configuration = { }, - } - ); + baseband::stop(); radio::disable(); EventDispatcher::message_map().unregister_handler(Message::ID::ERTPacket); diff --git a/firmware/application/m4_startup.cpp b/firmware/application/m4_startup.cpp index 6b9df47b..2313b493 100644 --- a/firmware/application/m4_startup.cpp +++ b/firmware/application/m4_startup.cpp @@ -24,7 +24,7 @@ #include "hal.h" #include "message.hpp" -#include "portapack_shared_memory.hpp" +#include "baseband_api.hpp" #include @@ -49,6 +49,5 @@ void m4_init(const portapack::spi_flash::region_t from, const portapack::memory: } void m4_request_shutdown() { - ShutdownMessage shutdown_message; - shared_memory.baseband_queue.push(shutdown_message); + baseband::shutdown(); } diff --git a/firmware/application/receiver_model.cpp b/firmware/application/receiver_model.cpp index 7edd6f24..cf8607b8 100644 --- a/firmware/application/receiver_model.cpp +++ b/firmware/application/receiver_model.cpp @@ -21,7 +21,8 @@ #include "receiver_model.hpp" -#include "portapack_shared_memory.hpp" +#include "baseband_api.hpp" + #include "portapack_persistent_memory.hpp" using namespace portapack; @@ -34,79 +35,19 @@ using namespace portapack; namespace { -struct AMConfig { - const fir_taps_complex<64> channel; - const AMConfigureMessage::Modulation modulation; - - void apply() const; -}; - -struct NBFMConfig { - const fir_taps_real<24> decim_0; - const fir_taps_real<32> decim_1; - const fir_taps_real<32> channel; - const size_t deviation; - - void apply() const; -}; - -struct WFMConfig { - void apply() const; -}; - -void AMConfig::apply() const { - const AMConfigureMessage message { - taps_6k0_decim_0, - taps_6k0_decim_1, - taps_6k0_decim_2, - channel, - modulation, - audio_12k_hpf_300hz_config - }; - shared_memory.baseband_queue.push(message); - audio::set_rate(audio::Rate::Hz_12000); -} - -void NBFMConfig::apply() const { - const NBFMConfigureMessage message { - decim_0, - decim_1, - channel, - 2, - deviation, - audio_24k_hpf_300hz_config, - audio_24k_deemph_300_6_config - }; - shared_memory.baseband_queue.push(message); - audio::set_rate(audio::Rate::Hz_24000); -} - -void WFMConfig::apply() const { - const WFMConfigureMessage message { - taps_200k_wfm_decim_0, - taps_200k_wfm_decim_1, - taps_64_lp_156_198, - 75000, - audio_48k_hpf_30hz_config, - audio_48k_deemph_2122_6_config - }; - shared_memory.baseband_queue.push(message); - audio::set_rate(audio::Rate::Hz_48000); -} - -static constexpr std::array am_configs { { +static constexpr std::array am_configs { { { taps_6k0_dsb_channel, AMConfigureMessage::Modulation::DSB }, { taps_2k8_usb_channel, AMConfigureMessage::Modulation::SSB }, { taps_2k8_lsb_channel, AMConfigureMessage::Modulation::SSB }, } }; -static constexpr std::array nbfm_configs { { +static constexpr std::array nbfm_configs { { { taps_4k25_decim_0, taps_4k25_decim_1, taps_4k25_channel, 2500 }, { taps_11k0_decim_0, taps_11k0_decim_1, taps_11k0_channel, 2500 }, { taps_16k0_decim_0, taps_16k0_decim_1, taps_16k0_channel, 5000 }, } }; -static constexpr std::array wfm_configs { { +static constexpr std::array wfm_configs { { { }, } }; @@ -210,18 +151,10 @@ void ReceiverModel::enable() { update_headphone_volume(); } -void ReceiverModel::baseband_disable() { - shared_memory.baseband_queue.push_and_wait( - BasebandConfigurationMessage { - .configuration = { }, - } - ); -} - void ReceiverModel::disable() { enabled_ = false; update_antenna_bias(); - baseband_disable(); + baseband::stop(); // TODO: Responsibility for enabling/disabling the radio is muddy. // Some happens in ReceiverModel, some inside radio namespace. @@ -292,14 +225,13 @@ void ReceiverModel::update_baseband_configuration() { // protocols that need quick RX/TX turn-around. // Disabling baseband while changing sampling rates seems like a good idea... - baseband_disable(); + baseband::stop(); radio::set_baseband_rate(sampling_rate() * baseband_oversampling()); update_tuning_frequency(); radio::set_baseband_decimation_by(baseband_oversampling()); - BasebandConfigurationMessage message { baseband_configuration }; - shared_memory.baseband_queue.push(message); + baseband::start(baseband_configuration); } void ReceiverModel::update_headphone_volume() { diff --git a/firmware/application/receiver_model.hpp b/firmware/application/receiver_model.hpp index 159706e0..48839f32 100644 --- a/firmware/application/receiver_model.hpp +++ b/firmware/application/receiver_model.hpp @@ -116,8 +116,6 @@ private: void update_am_configuration(); void update_nbfm_configuration(); void update_wfm_configuration(); - - void baseband_disable(); }; #endif/*__RECEIVER_MODEL_H__*/ diff --git a/firmware/application/tpms_app.cpp b/firmware/application/tpms_app.cpp index f580eaf9..55ef0811 100644 --- a/firmware/application/tpms_app.cpp +++ b/firmware/application/tpms_app.cpp @@ -23,8 +23,7 @@ #include "event_m0.hpp" -#include "portapack_shared_memory.hpp" -using namespace portapack; +#include "baseband_api.hpp" #include "string_format.hpp" @@ -247,20 +246,15 @@ TPMSAppView::TPMSAppView(NavigationView&) { 1, }); - BasebandConfigurationMessage message { { + baseband::start({ .mode = 5, .sampling_rate = sampling_rate, .decimation_factor = 1, - } }; - shared_memory.baseband_queue.push(message); + }); } TPMSAppView::~TPMSAppView() { - shared_memory.baseband_queue.push_and_wait( - BasebandConfigurationMessage { - .configuration = { }, - } - ); + baseband::stop(); radio::disable(); EventDispatcher::message_map().unregister_handler(Message::ID::TPMSPacket); diff --git a/firmware/application/ui_spectrum.cpp b/firmware/application/ui_spectrum.cpp index 27e7da43..4362db67 100644 --- a/firmware/application/ui_spectrum.cpp +++ b/firmware/application/ui_spectrum.cpp @@ -26,9 +26,10 @@ #include "spectrum_color_lut.hpp" #include "portapack.hpp" -#include "portapack_shared_memory.hpp" using namespace portapack; +#include "baseband_api.hpp" + #include "string_format.hpp" #include @@ -251,19 +252,11 @@ void WaterfallWidget::on_show() { } ); - shared_memory.baseband_queue.push_and_wait( - SpectrumStreamingConfigMessage { - SpectrumStreamingConfigMessage::Mode::Running - } - ); + baseband::spectrum_streaming_start(); } void WaterfallWidget::on_hide() { - shared_memory.baseband_queue.push_and_wait( - SpectrumStreamingConfigMessage { - SpectrumStreamingConfigMessage::Mode::Stopped - } - ); + baseband::spectrum_streaming_stop(); EventDispatcher::message_map().unregister_handler(Message::ID::DisplayFrameSync); EventDispatcher::message_map().unregister_handler(Message::ID::ChannelSpectrumConfig); From 58864ebbe77a783439a64a1bc29b741a2cad41ca Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 10 Feb 2016 20:19:27 -0800 Subject: [PATCH 059/164] Remove extra #includes. --- firmware/application/analog_audio_app.cpp | 1 - firmware/application/radio.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/firmware/application/analog_audio_app.cpp b/firmware/application/analog_audio_app.cpp index 7eae0d1c..222610df 100644 --- a/firmware/application/analog_audio_app.cpp +++ b/firmware/application/analog_audio_app.cpp @@ -23,7 +23,6 @@ #include "portapack.hpp" #include "portapack_persistent_memory.hpp" -#include "portapack_shared_memory.hpp" using namespace portapack; #include "audio.hpp" diff --git a/firmware/application/radio.cpp b/firmware/application/radio.cpp index a8603a32..55c67250 100644 --- a/firmware/application/radio.cpp +++ b/firmware/application/radio.cpp @@ -24,7 +24,6 @@ #include "rf_path.hpp" #include "max5864.hpp" #include "baseband_cpld.hpp" -#include "portapack_shared_memory.hpp" #include "tuning.hpp" From 937dad62eec5f4226f60b523ba34677f7f1bcca6 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 10 Feb 2016 20:53:14 -0800 Subject: [PATCH 060/164] Create log files on heap. ...for imminent refactor where user can manually start/stop logging, and maybe even change the filename! *swoon* --- firmware/application/ais_app.cpp | 13 ++++++++++++- firmware/application/ais_app.hpp | 6 ++++-- firmware/application/ert_app.cpp | 12 +++++++++++- firmware/application/ert_app.hpp | 6 ++++-- firmware/application/log_file.cpp | 2 +- firmware/application/log_file.hpp | 2 +- firmware/application/tpms_app.cpp | 12 +++++++++++- firmware/application/tpms_app.hpp | 6 ++++-- 8 files changed, 48 insertions(+), 11 deletions(-) diff --git a/firmware/application/ais_app.cpp b/firmware/application/ais_app.cpp index 1d511309..95c7bd7d 100644 --- a/firmware/application/ais_app.cpp +++ b/firmware/application/ais_app.cpp @@ -159,6 +159,12 @@ static std::string true_heading(const TrueHeading value) { } /* namespace format */ } /* namespace ais */ +AISLogger::AISLogger( + const std::string& file_path +) : log_file { file_path } +{ +} + void AISLogger::on_packet(const ais::Packet& packet) { // TODO: Unstuff here, not in baseband! if( log_file.is_ready() ) { @@ -368,6 +374,8 @@ AISAppView::AISAppView(NavigationView&) { recent_entry_detail_view.on_close = [this]() { this->on_show_list(); }; + + logger = std::make_unique("ais.txt"); } AISAppView::~AISAppView() { @@ -389,7 +397,10 @@ void AISAppView::set_parent_rect(const Rect new_parent_rect) { } void AISAppView::on_packet(const ais::Packet& packet) { - logger.on_packet(packet); + if( logger ) { + logger->on_packet(packet); + } + const auto updated_entry = recent.on_packet(packet.source_id(), packet); recent_entries_view.set_dirty(); diff --git a/firmware/application/ais_app.hpp b/firmware/application/ais_app.hpp index 9e2c81b2..f0f81c91 100644 --- a/firmware/application/ais_app.hpp +++ b/firmware/application/ais_app.hpp @@ -90,10 +90,12 @@ using AISRecentEntries = RecentEntries; class AISLogger { public: + AISLogger(const std::string& file_path); + void on_packet(const ais::Packet& packet); private: - LogFile log_file { "ais.txt" }; + LogFile log_file; }; namespace ui { @@ -150,7 +152,7 @@ private: static constexpr uint32_t baseband_bandwidth = 1750000; AISRecentEntries recent; - AISLogger logger; + std::unique_ptr logger; AISRecentEntriesView recent_entries_view { recent }; AISRecentEntryDetailView recent_entry_detail_view; diff --git a/firmware/application/ert_app.cpp b/firmware/application/ert_app.cpp index 6ad67d96..74080b5f 100644 --- a/firmware/application/ert_app.cpp +++ b/firmware/application/ert_app.cpp @@ -55,6 +55,12 @@ std::string consumption(Consumption value) { } /* namespace ert */ +ERTLogger::ERTLogger( + const std::string& file_path +) : log_file { file_path } +{ +} + void ERTLogger::on_packet(const ert::Packet& packet) { if( log_file.is_ready() ) { const auto formatted = packet.symbols_formatted(); @@ -144,6 +150,8 @@ ERTAppView::ERTAppView(NavigationView&) { .sampling_rate = sampling_rate, .decimation_factor = 1, }); + + logger = std::make_unique("ert.txt"); } ERTAppView::~ERTAppView() { @@ -163,7 +171,9 @@ void ERTAppView::set_parent_rect(const Rect new_parent_rect) { } void ERTAppView::on_packet(const ert::Packet& packet) { - logger.on_packet(packet); + if( logger ) { + logger->on_packet(packet); + } if( packet.crc_ok() ) { recent.on_packet(packet.id(), packet); diff --git a/firmware/application/ert_app.hpp b/firmware/application/ert_app.hpp index 4b8c21d5..560e0228 100644 --- a/firmware/application/ert_app.hpp +++ b/firmware/application/ert_app.hpp @@ -60,10 +60,12 @@ struct ERTRecentEntry { class ERTLogger { public: + ERTLogger(const std::string& file_path); + void on_packet(const ert::Packet& packet); private: - LogFile log_file { "ert.txt" }; + LogFile log_file; }; using ERTRecentEntries = RecentEntries; @@ -93,7 +95,7 @@ public: private: ERTRecentEntries recent; - ERTLogger logger; + std::unique_ptr logger; ERTRecentEntriesView recent_entries_view { recent }; diff --git a/firmware/application/log_file.cpp b/firmware/application/log_file.cpp index 3b5f4f01..e87cce36 100644 --- a/firmware/application/log_file.cpp +++ b/firmware/application/log_file.cpp @@ -27,7 +27,7 @@ using namespace lpc43xx; LogFile::LogFile( - const std::string file_path + const std::string& file_path ) : file_path { file_path } { file.open_for_append(file_path); diff --git a/firmware/application/log_file.hpp b/firmware/application/log_file.hpp index 0ddf781c..30883b0f 100644 --- a/firmware/application/log_file.hpp +++ b/firmware/application/log_file.hpp @@ -32,7 +32,7 @@ using namespace lpc43xx; class LogFile { public: - LogFile(const std::string file_path); + LogFile(const std::string& file_path); ~LogFile(); bool is_ready(); diff --git a/firmware/application/tpms_app.cpp b/firmware/application/tpms_app.cpp index 55ef0811..2c436506 100644 --- a/firmware/application/tpms_app.cpp +++ b/firmware/application/tpms_app.cpp @@ -136,6 +136,12 @@ size_t Packet::crc_valid_length() const { } /* namespace tpms */ +TPMSLogger::TPMSLogger( + const std::string& file_path +) : log_file { file_path } +{ +} + void TPMSLogger::on_packet(const tpms::Packet& packet, const uint32_t target_frequency) { const auto hex_formatted = packet.symbols_formatted(); @@ -251,6 +257,8 @@ TPMSAppView::TPMSAppView(NavigationView&) { .sampling_rate = sampling_rate, .decimation_factor = 1, }); + + logger = std::make_unique("tpms.txt"); } TPMSAppView::~TPMSAppView() { @@ -270,7 +278,9 @@ void TPMSAppView::set_parent_rect(const Rect new_parent_rect) { } void TPMSAppView::on_packet(const tpms::Packet& packet) { - logger.on_packet(packet, target_frequency()); + if( logger ) { + logger->on_packet(packet, target_frequency()); + } const auto reading_opt = packet.reading(); if( reading_opt.is_valid() ) { diff --git a/firmware/application/tpms_app.hpp b/firmware/application/tpms_app.hpp index 6a06cbb3..0c2f6462 100644 --- a/firmware/application/tpms_app.hpp +++ b/firmware/application/tpms_app.hpp @@ -186,10 +186,12 @@ using TPMSRecentEntries = RecentEntries; class TPMSLogger { public: + TPMSLogger(const std::string& file_path); + void on_packet(const tpms::Packet& packet, const uint32_t target_frequency); private: - LogFile log_file { "tpms.txt" }; + LogFile log_file; }; namespace ui { @@ -217,7 +219,7 @@ private: static constexpr uint32_t baseband_bandwidth = 1750000; TPMSRecentEntries recent; - TPMSLogger logger; + std::unique_ptr logger; TPMSRecentEntriesView recent_entries_view { recent }; From c72a4437385b7d58b8686d37b1e2bb1a3c01251f Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 12 Feb 2016 13:51:14 -0800 Subject: [PATCH 061/164] Relabel ChibiOS core free bytes. --- firmware/application/ui_debug.cpp | 8 ++++---- firmware/application/ui_debug.hpp | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/firmware/application/ui_debug.cpp b/firmware/application/ui_debug.cpp index 4b76080f..64b693df 100644 --- a/firmware/application/ui_debug.cpp +++ b/firmware/application/ui_debug.cpp @@ -35,8 +35,8 @@ namespace ui { DebugMemoryView::DebugMemoryView(NavigationView& nav) { add_children({ { &text_title, - &text_label_m0_free, - &text_label_m0_free_value, + &text_label_m0_core_free, + &text_label_m0_core_free_value, &text_label_m0_heap_fragmented_free, &text_label_m0_heap_fragmented_free_value, &text_label_m0_heap_fragments, @@ -44,8 +44,8 @@ DebugMemoryView::DebugMemoryView(NavigationView& nav) { &button_done } }); - const auto m0_free = chCoreStatus(); - text_label_m0_free_value.set(to_string_dec_uint(m0_free, 5)); + const auto m0_core_free = chCoreStatus(); + text_label_m0_core_free_value.set(to_string_dec_uint(m0_core_free, 5)); size_t m0_fragmented_free_space = 0; const auto m0_fragments = chHeapStatus(NULL, &m0_fragmented_free_space); diff --git a/firmware/application/ui_debug.hpp b/firmware/application/ui_debug.hpp index c54d0871..1406b90e 100644 --- a/firmware/application/ui_debug.hpp +++ b/firmware/application/ui_debug.hpp @@ -49,12 +49,12 @@ private: "Memory", }; - Text text_label_m0_free { - { 0, 128, 104, 16 }, - "M0 Free Bytes", + Text text_label_m0_core_free { + { 0, 128, 144, 16 }, + "M0 Core Free Bytes", }; - Text text_label_m0_free_value { + Text text_label_m0_core_free_value { { 200, 128, 40, 16 }, }; From 4321deee1e7bee3f769d9a9a3e0f1f88eb790801 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 12 Feb 2016 13:52:22 -0800 Subject: [PATCH 062/164] ChibiOS memory helper functions. --- firmware/common/chibios_cpp.cpp | 20 ++++++++++++++++++++ firmware/common/chibios_cpp.hpp | 7 +++++++ 2 files changed, 27 insertions(+) diff --git a/firmware/common/chibios_cpp.cpp b/firmware/common/chibios_cpp.cpp index 74f4c5d6..eab2fcb0 100644 --- a/firmware/common/chibios_cpp.cpp +++ b/firmware/common/chibios_cpp.cpp @@ -21,6 +21,8 @@ #include "chibios_cpp.hpp" +#include + #include void* operator new(size_t size) { @@ -38,3 +40,21 @@ void operator delete(void* p) noexcept { void operator delete[](void* p) noexcept { chHeapFree(p); } + +extern uint8_t __heap_base__[]; +extern uint8_t __heap_end__[]; + +namespace chibios { + +size_t heap_size() { + return __heap_end__ - __heap_base__; +} + +size_t heap_used() { + const auto core_free = chCoreStatus(); + size_t heap_free = 0; + chHeapStatus(NULL, &heap_free); + return heap_size() - (core_free + heap_free); +} + +} /* namespace chibios */ diff --git a/firmware/common/chibios_cpp.hpp b/firmware/common/chibios_cpp.hpp index dd423777..5cb4af2e 100644 --- a/firmware/common/chibios_cpp.hpp +++ b/firmware/common/chibios_cpp.hpp @@ -31,4 +31,11 @@ void* operator new[](size_t size); void operator delete(void* p); void operator delete[](void* p); +namespace chibios { + +size_t heap_size(); +size_t heap_used(); + +} /* namespace chibios */ + #endif/*__CHIBIOS_CPP_H__*/ From 7d60b940d64904807977fb498db4d7dceb152566 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 12 Feb 2016 15:05:47 -0800 Subject: [PATCH 063/164] Push hardware peripherals debug views into a sub-menu. --- firmware/application/ui_debug.cpp | 21 +++++++++++++++------ firmware/application/ui_debug.hpp | 5 +++++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/firmware/application/ui_debug.cpp b/firmware/application/ui_debug.cpp index 64b693df..f35faeee 100644 --- a/firmware/application/ui_debug.cpp +++ b/firmware/application/ui_debug.cpp @@ -242,13 +242,10 @@ void RegistersView::focus() { button_done.focus(); } -/* DebugMenuView *********************************************************/ +/* DebugPeripheralsMenuView **********************************************/ -DebugMenuView::DebugMenuView(NavigationView& nav) { - add_items<8>({ { - { "Memory", [&nav](){ nav.push(); } }, - { "Radio State", [&nav](){ nav.push(); } }, - { "SD Card", [&nav](){ nav.push(); } }, +DebugPeripheralsMenuView::DebugPeripheralsMenuView(NavigationView& nav) { + add_items<4>({ { { "RFFC5072", [&nav](){ nav.push( "RFFC5072", RegistersWidgetConfig { 31, 2, 4, 4 }, [](const size_t register_number) { return radio::first_if.read(register_number); } @@ -265,6 +262,18 @@ DebugMenuView::DebugMenuView(NavigationView& nav) { "WM8731", RegistersWidgetConfig { audio::debug::reg_count(), 1, 3, 4 }, [](const size_t register_number) { return audio::debug::reg_read(register_number); } ); } }, + } }); + on_left = [&nav](){ nav.pop(); }; +} + +/* DebugMenuView *********************************************************/ + +DebugMenuView::DebugMenuView(NavigationView& nav) { + add_items<8>({ { + { "Memory", [&nav](){ nav.push(); } }, + { "Radio State", [&nav](){ nav.push(); } }, + { "SD Card", [&nav](){ nav.push(); } }, + { "Peripherals", [&nav](){ nav.push(); } }, { "Temperature", [&nav](){ nav.push(); } }, } }); on_left = [&nav](){ nav.pop(); }; diff --git a/firmware/application/ui_debug.hpp b/firmware/application/ui_debug.hpp index 1406b90e..779461cc 100644 --- a/firmware/application/ui_debug.hpp +++ b/firmware/application/ui_debug.hpp @@ -208,6 +208,11 @@ private: }; }; +class DebugPeripheralsMenuView : public MenuView { +public: + DebugPeripheralsMenuView(NavigationView& nav); +}; + class DebugMenuView : public MenuView { public: DebugMenuView(NavigationView& nav); From d2531016e57065c4841757e2f1b1c1720fec0db0 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sat, 13 Feb 2016 11:18:15 -0800 Subject: [PATCH 064/164] Expose fast_log2(). --- firmware/common/utility.cpp | 2 +- firmware/common/utility.hpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/firmware/common/utility.cpp b/firmware/common/utility.cpp index 715a0496..8c1dce72 100644 --- a/firmware/common/utility.cpp +++ b/firmware/common/utility.cpp @@ -59,7 +59,7 @@ uint32_t gcd(const uint32_t u, const uint32_t v) { } #endif -static float fast_log2(const float val) { +float fast_log2(const float val) { // Thank you Stack Overflow! // http://stackoverflow.com/questions/9411823/fast-log2float-x-implementation-c union { diff --git a/firmware/common/utility.hpp b/firmware/common/utility.hpp index 02caa1a1..4c153a9f 100644 --- a/firmware/common/utility.hpp +++ b/firmware/common/utility.hpp @@ -69,6 +69,8 @@ constexpr size_t log_2(const size_t n, const size_t p = 0) { return (n <= 1) ? p : log_2(n / 2, p + 1); } +float fast_log2(const float val); + float complex16_mag_squared_to_dbv_norm(const float c16_mag_squared); inline float magnitude_squared(const std::complex c) { From 64e4cde7f5d3556b75ad38cd27a145cf958e529e Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sat, 13 Feb 2016 11:18:34 -0800 Subject: [PATCH 065/164] fast_pow2() implemented. --- firmware/common/utility.cpp | 9 +++++++++ firmware/common/utility.hpp | 1 + 2 files changed, 10 insertions(+) diff --git a/firmware/common/utility.cpp b/firmware/common/utility.cpp index 8c1dce72..7959eba0 100644 --- a/firmware/common/utility.cpp +++ b/firmware/common/utility.cpp @@ -73,6 +73,15 @@ float fast_log2(const float val) { return log_2; } +float fast_pow2(const float val) { + union { + float f; + uint32_t n; + } u; + u.n = val * 8388608 + (0x3f800000 - 60801 * 8); + return u.f; +} + float complex16_mag_squared_to_dbv_norm(const float c16_mag_squared) { constexpr float input_component_max = 32768; constexpr float mag2_max = (input_component_max * input_component_max) * 2; diff --git a/firmware/common/utility.hpp b/firmware/common/utility.hpp index 4c153a9f..a23ad3e2 100644 --- a/firmware/common/utility.hpp +++ b/firmware/common/utility.hpp @@ -70,6 +70,7 @@ constexpr size_t log_2(const size_t n, const size_t p = 0) { } float fast_log2(const float val); +float fast_pow2(const float val); float complex16_mag_squared_to_dbv_norm(const float c16_mag_squared); From 9f4c8929ac2015ec13baf9d8b4f7814ebb35a6b6 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sat, 13 Feb 2016 11:19:07 -0800 Subject: [PATCH 066/164] Audio compressor implementation. --- firmware/baseband/audio_compressor.cpp | 53 +++++++++++++ firmware/baseband/audio_compressor.hpp | 102 +++++++++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 firmware/baseband/audio_compressor.cpp create mode 100644 firmware/baseband/audio_compressor.hpp diff --git a/firmware/baseband/audio_compressor.cpp b/firmware/baseband/audio_compressor.cpp new file mode 100644 index 00000000..f04810a1 --- /dev/null +++ b/firmware/baseband/audio_compressor.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "audio_compressor.hpp" + +float GainComputer::operator()(const float x) const { + const auto abs_x = std::abs(x); + const auto db = (abs_x < lin_floor) ? db_floor : log2_db_k * fast_log2(abs_x); + const auto overshoot_db = db - threshold_db; + if( knee_width_db > 0.0f ) { + const auto w2 = knee_width_db / 2.0f; + const auto a = w2 / (knee_width_db * knee_width_db); + const auto in_transition = (overshoot_db > -w2) && (overshoot_db < w2); + const auto rectified_overshoot = in_transition ? (a * std::pow(overshoot_db + w2, 2.0f)) : std::max(overshoot_db, 0.0f); + return rectified_overshoot * slope; + } else { + const auto rectified_overshoot = std::max(overshoot_db, 0.0f); + return rectified_overshoot * slope; + } +} + +void FeedForwardCompressor::execute_in_place(const buffer_f32_t& buffer) { + constexpr float makeup_gain = std::pow(10.0f, (threshold - (threshold / ratio)) / 20.0f); + for(size_t i=0; i + +/* Code based on article in Journal of the Audio Engineering Society + * Vol. 60, No. 6, 2012 June, by Dimitrios Giannoulis, Michael Massberg, + * Joshua D. Reiss "Digital Dynamic Range Compressor Design – A Tutorial + * and Analysis" + */ + +class GainComputer { +public: + constexpr GainComputer( + float ratio, + float threshold + ) : ratio { ratio }, + slope { 1.0f / ratio - 1.0f }, + threshold_db { threshold } + { + } + + float operator()(const float x) const; + +private: + const float ratio; + const float slope; + const float threshold_db; + + static constexpr float knee_width_db = 0.0f; + + static constexpr float db_floor = -120.0f; + static constexpr float lin_floor = std::pow(10.0f, db_floor / 20.0f); + static constexpr float log2_db_k = 20.0f * std::log10(2.0f); +}; + +class PeakDetectorBranchingSmooth { +public: + constexpr PeakDetectorBranchingSmooth( + float att_a, + float rel_a + ) : att_a { att_a }, + rel_a { rel_a } + { + } + + float operator()(const float db) { + const auto a = (db > state) ? att_a : rel_a; + state = db + a * (state - db); + return state; + } + +private: + float state { 0.0f }; + const float att_a; + const float rel_a; +}; + +class FeedForwardCompressor { +public: + void execute_in_place(const buffer_f32_t& buffer); + +private: + static constexpr float fs = 12000.0f; + static constexpr float ratio = 10.0f; + static constexpr float threshold = -30.0f; + + GainComputer gain_computer { ratio, threshold }; + PeakDetectorBranchingSmooth peak_detector { tau_alpha(0.010f, fs), tau_alpha(0.300f, fs) }; + + float execute_once(const float x); + + static constexpr float tau_alpha(const float tau, const float fs) { + return std::exp(-1.0f / (tau * fs)); + } +}; + +#endif/*__AUDIO_COMPRESSOR_H__*/ From 1cdeb1ca4e1d594e01864f2045d263eeef041bbc Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sat, 13 Feb 2016 11:19:32 -0800 Subject: [PATCH 067/164] Use audio compressor in AM/SSB receiver mode. --- firmware/baseband/Makefile | 1 + firmware/baseband/proc_am_audio.cpp | 1 + firmware/baseband/proc_am_audio.hpp | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/firmware/baseband/Makefile b/firmware/baseband/Makefile index 5e971115..fedacf9c 100755 --- a/firmware/baseband/Makefile +++ b/firmware/baseband/Makefile @@ -155,6 +155,7 @@ CPPSRC = main.cpp \ rssi.cpp \ rssi_dma.cpp \ rssi_thread.cpp \ + audio_compressor.cpp \ audio_output.cpp \ audio_dma.cpp \ audio_stats_collector.cpp \ diff --git a/firmware/baseband/proc_am_audio.cpp b/firmware/baseband/proc_am_audio.cpp index bb207102..0a4b5faf 100644 --- a/firmware/baseband/proc_am_audio.cpp +++ b/firmware/baseband/proc_am_audio.cpp @@ -40,6 +40,7 @@ void NarrowbandAMAudio::execute(const buffer_c8_t& buffer) { channel_spectrum.feed(channel_out, channel_filter_pass_f, channel_filter_stop_f); auto audio = demodulate(channel_out); + audio_compressor.execute_in_place(audio); audio_output.write(audio); } diff --git a/firmware/baseband/proc_am_audio.hpp b/firmware/baseband/proc_am_audio.hpp index 226720e2..af94c416 100644 --- a/firmware/baseband/proc_am_audio.hpp +++ b/firmware/baseband/proc_am_audio.hpp @@ -26,6 +26,7 @@ #include "dsp_decimate.hpp" #include "dsp_demodulate.hpp" +#include "audio_compressor.hpp" #include "audio_output.hpp" #include "spectrum_collector.hpp" @@ -64,7 +65,7 @@ private: bool modulation_ssb = false; dsp::demodulate::AM demod_am; dsp::demodulate::SSB demod_ssb; - + FeedForwardCompressor audio_compressor; AudioOutput audio_output; SpectrumCollector channel_spectrum; From a5ed3b20b46702e47ba02f6dbb58580c55110f37 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 14 Feb 2016 12:17:04 -0800 Subject: [PATCH 068/164] Audio compressor makeup gain value was inverted. Oops. --- firmware/baseband/audio_compressor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/baseband/audio_compressor.cpp b/firmware/baseband/audio_compressor.cpp index f04810a1..b4138408 100644 --- a/firmware/baseband/audio_compressor.cpp +++ b/firmware/baseband/audio_compressor.cpp @@ -38,7 +38,7 @@ float GainComputer::operator()(const float x) const { } void FeedForwardCompressor::execute_in_place(const buffer_f32_t& buffer) { - constexpr float makeup_gain = std::pow(10.0f, (threshold - (threshold / ratio)) / 20.0f); + constexpr float makeup_gain = std::pow(10.0f, (threshold - (threshold / ratio)) / -20.0f); for(size_t i=0; i Date: Sun, 14 Feb 2016 12:38:50 -0800 Subject: [PATCH 069/164] Change baseband floats to normalize at +/-1.0. --- firmware/baseband/audio_compressor.cpp | 3 +-- firmware/baseband/audio_output.cpp | 4 ++-- firmware/baseband/audio_output.hpp | 3 +++ firmware/baseband/audio_stats_collector.cpp | 4 ++-- firmware/baseband/channel_stats_collector.hpp | 2 +- firmware/baseband/dsp_demodulate.cpp | 23 ++++++++++--------- firmware/baseband/dsp_demodulate.hpp | 9 +++++++- firmware/baseband/spectrum_collector.cpp | 4 ++-- firmware/common/utility.cpp | 7 +++--- firmware/common/utility.hpp | 2 +- 10 files changed, 35 insertions(+), 26 deletions(-) diff --git a/firmware/baseband/audio_compressor.cpp b/firmware/baseband/audio_compressor.cpp index b4138408..95bbaee3 100644 --- a/firmware/baseband/audio_compressor.cpp +++ b/firmware/baseband/audio_compressor.cpp @@ -40,8 +40,7 @@ float GainComputer::operator()(const float x) const { void FeedForwardCompressor::execute_in_place(const buffer_f32_t& buffer) { constexpr float makeup_gain = std::pow(10.0f, (threshold - (threshold / ratio)) / -20.0f); for(size_t i=0; i audio_f; for(size_t i=0; i block_buffer { 1 }; IIRBiquadFilter hpf; diff --git a/firmware/baseband/audio_stats_collector.cpp b/firmware/baseband/audio_stats_collector.cpp index 227d5887..53fceea8 100644 --- a/firmware/baseband/audio_stats_collector.cpp +++ b/firmware/baseband/audio_stats_collector.cpp @@ -42,8 +42,8 @@ bool AudioStatsCollector::update_stats(const size_t sample_count, const size_t s const size_t samples_per_update = sampling_rate * update_interval; if( count >= samples_per_update ) { - statistics.rms_db = complex16_mag_squared_to_dbv_norm(squared_sum / count); - statistics.max_db = complex16_mag_squared_to_dbv_norm(max_squared); + statistics.rms_db = mag2_to_dbv_norm(squared_sum / count); + statistics.max_db = mag2_to_dbv_norm(max_squared); statistics.count = count; squared_sum = 0; diff --git a/firmware/baseband/channel_stats_collector.hpp b/firmware/baseband/channel_stats_collector.hpp index d03f03a1..ca7d0eed 100644 --- a/firmware/baseband/channel_stats_collector.hpp +++ b/firmware/baseband/channel_stats_collector.hpp @@ -49,7 +49,7 @@ public: if( count >= samples_per_update ) { const float max_squared_f = max_squared; - const int32_t max_db = complex16_mag_squared_to_dbv_norm(max_squared_f); + const int32_t max_db = mag2_to_dbv_norm(max_squared_f * (1.0f / (32768.0f * 32768.0f))); callback({ max_db, count }); max_squared = 0; diff --git a/firmware/baseband/dsp_demodulate.cpp b/firmware/baseband/dsp_demodulate.cpp index 3a0b7f12..cf79d0d0 100644 --- a/firmware/baseband/dsp_demodulate.cpp +++ b/firmware/baseband/dsp_demodulate.cpp @@ -42,8 +42,8 @@ buffer_f32_t AM::execute( const uint32_t sample1 = *__SIMD32(src_p)++; const uint32_t mag_sq0 = __SMUAD(sample0, sample0); const uint32_t mag_sq1 = __SMUAD(sample1, sample1); - *(dst_p++) = __builtin_sqrtf(mag_sq0); - *(dst_p++) = __builtin_sqrtf(mag_sq1); + *(dst_p++) = __builtin_sqrtf(mag_sq0) * k; + *(dst_p++) = __builtin_sqrtf(mag_sq1) * k; } return { dst.p, src.count, src.sampling_rate }; @@ -57,10 +57,10 @@ buffer_f32_t SSB::execute( const auto src_end = &src.p[src.count]; auto dst_p = dst.p; while(src_p < src_end) { - *(dst_p++) = (src_p++)->real(); - *(dst_p++) = (src_p++)->real(); - *(dst_p++) = (src_p++)->real(); - *(dst_p++) = (src_p++)->real(); + *(dst_p++) = (src_p++)->real() * k; + *(dst_p++) = (src_p++)->real() * k; + *(dst_p++) = (src_p++)->real() * k; + *(dst_p++) = (src_p++)->real() * k; } return { dst.p, src.count, src.sampling_rate }; @@ -99,8 +99,8 @@ buffer_f32_t FM::execute( const auto t0 = multiply_conjugate_s16_s32(s0, z); const auto t1 = multiply_conjugate_s16_s32(s1, s0); z = s1; - *(dst_p++) = angle_precise(t0) * k; - *(dst_p++) = angle_precise(t1) * k; + *(dst_p++) = angle_precise(t0) * kf; + *(dst_p++) = angle_precise(t1) * kf; } z_ = z; @@ -122,9 +122,9 @@ buffer_s16_t FM::execute( const auto t0 = multiply_conjugate_s16_s32(s0, z); const auto t1 = multiply_conjugate_s16_s32(s1, s0); z = s1; - const int32_t theta0_int = angle_approx_0deg27(t0) * k; + const int32_t theta0_int = angle_approx_0deg27(t0) * ks16; const int32_t theta0_sat = __SSAT(theta0_int, 16); - const int32_t theta1_int = angle_approx_0deg27(t1) * k; + const int32_t theta1_int = angle_approx_0deg27(t1) * ks16; const int32_t theta1_sat = __SSAT(theta1_int, 16); *__SIMD32(dst_p)++ = __PKHBT( theta0_sat, @@ -143,7 +143,8 @@ void FM::configure(const float sampling_rate, const float deviation_hz) { * Maximum delta-theta (output of atan2) at maximum deviation frequency: * delta_theta_max = 2 * pi * deviation / sampling_rate */ - k = static_cast(32767.0f / (2.0 * pi * deviation_hz / sampling_rate)); + kf = static_cast(1.0f / (2.0 * pi * deviation_hz / sampling_rate)); + ks16 = 32767.0f * kf; } } diff --git a/firmware/baseband/dsp_demodulate.hpp b/firmware/baseband/dsp_demodulate.hpp index 00f9236a..72706167 100644 --- a/firmware/baseband/dsp_demodulate.hpp +++ b/firmware/baseband/dsp_demodulate.hpp @@ -33,6 +33,9 @@ public: const buffer_c16_t& src, const buffer_f32_t& dst ); + +private: + static constexpr float k = 1.0f / 32768.0f; }; class SSB { @@ -41,6 +44,9 @@ public: const buffer_c16_t& src, const buffer_f32_t& dst ); + +private: + static constexpr float k = 1.0f / 32768.0f; }; class FM { @@ -59,7 +65,8 @@ public: private: complex16_t::rep_type z_ { 0 }; - float k { 0 }; + float kf { 0 }; + float ks16 { 0 }; }; } /* namespace demodulate */ diff --git a/firmware/baseband/spectrum_collector.cpp b/firmware/baseband/spectrum_collector.cpp index 2b661c9a..0d288bee 100644 --- a/firmware/baseband/spectrum_collector.cpp +++ b/firmware/baseband/spectrum_collector.cpp @@ -117,8 +117,8 @@ void SpectrumCollector::update() { // Three point Hamming window. const auto corrected_sample = channel_spectrum[i] * 0.54f + (channel_spectrum[(i-1) & 0xff] + channel_spectrum[(i+1) & 0xff]) * -0.23f; - const auto mag2 = magnitude_squared(corrected_sample); - const float db = complex16_mag_squared_to_dbv_norm(mag2); + const auto mag2 = magnitude_squared(corrected_sample * (1.0f / 32768.0f)); + const float db = mag2_to_dbv_norm(mag2); constexpr float mag_scale = 5.0f; const unsigned int v = (db * mag_scale) + 255.0f; spectrum.db[i] = std::max(0U, std::min(255U, v)); diff --git a/firmware/common/utility.cpp b/firmware/common/utility.cpp index 7959eba0..9e167101 100644 --- a/firmware/common/utility.cpp +++ b/firmware/common/utility.cpp @@ -82,15 +82,14 @@ float fast_pow2(const float val) { return u.f; } -float complex16_mag_squared_to_dbv_norm(const float c16_mag_squared) { - constexpr float input_component_max = 32768; - constexpr float mag2_max = (input_component_max * input_component_max) * 2; +float mag2_to_dbv_norm(const float mag2) { + constexpr float mag2_max = 1.0f; constexpr float mag2_log2_max = std::log2(mag2_max); constexpr float log_mag2_mag_factor = 0.5f; constexpr float log2_log10_factor = std::log10(2.0f); constexpr float log10_dbv_factor = 20.0f; constexpr float mag2_to_db_factor = log_mag2_mag_factor * log2_log10_factor * log10_dbv_factor; - return (fast_log2(c16_mag_squared) - mag2_log2_max) * mag2_to_db_factor; + return (fast_log2(mag2) - mag2_log2_max) * mag2_to_db_factor; } /* GCD implementation derived from recursive implementation at diff --git a/firmware/common/utility.hpp b/firmware/common/utility.hpp index a23ad3e2..c6cfab94 100644 --- a/firmware/common/utility.hpp +++ b/firmware/common/utility.hpp @@ -72,7 +72,7 @@ constexpr size_t log_2(const size_t n, const size_t p = 0) { float fast_log2(const float val); float fast_pow2(const float val); -float complex16_mag_squared_to_dbv_norm(const float c16_mag_squared); +float mag2_to_dbv_norm(const float mag2); inline float magnitude_squared(const std::complex c) { const auto r = c.real(); From 3e2b6087c2308a9dfa5b8a8a322ad3774ea619cb Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 16 Feb 2016 10:28:13 -0800 Subject: [PATCH 070/164] Tighten up radio API, stop leaking 1st/2nd IF instances. --- firmware/application/radio.cpp | 27 +++++++++++++++++++++ firmware/application/radio.hpp | 23 ++++++++++++++---- firmware/application/temperature_logger.cpp | 2 +- firmware/application/ui_debug.cpp | 4 +-- 4 files changed, 48 insertions(+), 8 deletions(-) diff --git a/firmware/application/radio.cpp b/firmware/application/radio.cpp index 55c67250..88ef4a21 100644 --- a/firmware/application/radio.cpp +++ b/firmware/application/radio.cpp @@ -22,6 +22,9 @@ #include "radio.hpp" #include "rf_path.hpp" + +#include "rffc507x.hpp" +#include "max2837.hpp" #include "max5864.hpp" #include "baseband_cpld.hpp" @@ -183,4 +186,28 @@ void configure(Configuration configuration) { set_direction(configuration.direction); } +namespace debug { + +namespace first_if { + +uint32_t register_read(const size_t register_number) { + return radio::first_if.read(register_number); +} + +} /* namespace first_if */ + +namespace second_if { + +uint32_t register_read(const size_t register_number) { + return radio::second_if.read(register_number); +} + +uint8_t temp_sense() { + return radio::second_if.temp_sense() & 0x1f; +} + +} /* namespace second_if */ + +} /* namespace debug */ + } /* namespace radio */ diff --git a/firmware/application/radio.hpp b/firmware/application/radio.hpp index acc16fe7..4c1faa78 100644 --- a/firmware/application/radio.hpp +++ b/firmware/application/radio.hpp @@ -27,9 +27,6 @@ #include #include -#include "rffc507x.hpp" -#include "max2837.hpp" - namespace radio { struct Configuration { @@ -59,8 +56,24 @@ void enable(Configuration configuration); void configure(Configuration configuration); void disable(); -extern rffc507x::RFFC507x first_if; -extern max2837::MAX2837 second_if; +namespace debug { + +namespace first_if { + +uint32_t register_read(const size_t register_number); + +} /* namespace first_if */ + +namespace second_if { + +uint32_t register_read(const size_t register_number); + +// TODO: This belongs somewhere else. +uint8_t temp_sense(); + +} /* namespace second_if */ + +} /* namespace debug */ } /* namespace radio */ diff --git a/firmware/application/temperature_logger.cpp b/firmware/application/temperature_logger.cpp index 474c3dd0..152c4d5b 100644 --- a/firmware/application/temperature_logger.cpp +++ b/firmware/application/temperature_logger.cpp @@ -54,7 +54,7 @@ std::vector TemperatureLogger::history() const { TemperatureLogger::sample_t TemperatureLogger::read_sample() { // MAX2837 does not return a valid temperature if in "shutdown" mode. - return radio::second_if.temp_sense() & 0x1f; + return radio::debug::second_if::temp_sense(); } void TemperatureLogger::push_sample(const TemperatureLogger::sample_t sample) { diff --git a/firmware/application/ui_debug.cpp b/firmware/application/ui_debug.cpp index f35faeee..1e005d7f 100644 --- a/firmware/application/ui_debug.cpp +++ b/firmware/application/ui_debug.cpp @@ -248,11 +248,11 @@ DebugPeripheralsMenuView::DebugPeripheralsMenuView(NavigationView& nav) { add_items<4>({ { { "RFFC5072", [&nav](){ nav.push( "RFFC5072", RegistersWidgetConfig { 31, 2, 4, 4 }, - [](const size_t register_number) { return radio::first_if.read(register_number); } + [](const size_t register_number) { return radio::debug::first_if::register_read(register_number); } ); } }, { "MAX2837", [&nav](){ nav.push( "MAX2837", RegistersWidgetConfig { 32, 2, 3, 4 }, - [](const size_t register_number) { return radio::second_if.read(register_number); } + [](const size_t register_number) { return radio::debug::second_if::register_read(register_number); } ); } }, { "Si5351C", [&nav](){ nav.push( "Si5351C", RegistersWidgetConfig { 96, 2, 2, 8 }, From 64da0823069676e70b1a5f67b7ca34ab62267b7d Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 16 Feb 2016 10:28:35 -0800 Subject: [PATCH 071/164] Remove dead test code. --- firmware/application/rffc507x.cpp | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/firmware/application/rffc507x.cpp b/firmware/application/rffc507x.cpp index e15265e4..fc5a585d 100644 --- a/firmware/application/rffc507x.cpp +++ b/firmware/application/rffc507x.cpp @@ -278,21 +278,4 @@ spi::reg_t RFFC507x::readback(const Readback readback) { return read(Register::READBACK); } -#if 0 -/* Test of RFFC507x reset over temperature */ -while(true) { - first_if.write(rffc507x::Register::P1_FREQ2, 0xAAAA); - first_if.reset(); - const auto after_reset = first_if.read(rffc507x::Register::P1_FREQ2); - if( after_reset != 0x6276 ) { - led_usb.off(); - led_tx.on(); - chThdSleepMilliseconds(100); - } else { - led_usb.on(); - led_tx.off(); - } -} -#endif - } /* namespace rffc507x */ From 7fbe57931e295d2b7e292e1054938a20d0cd0844 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 16 Feb 2016 11:04:35 -0800 Subject: [PATCH 072/164] Push M0 halt code into a function. --- firmware/application/m4_startup.cpp | 10 ++++++++++ firmware/application/m4_startup.hpp | 2 ++ firmware/application/main.cpp | 6 +----- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/firmware/application/m4_startup.cpp b/firmware/application/m4_startup.cpp index 2313b493..9b5f2b4f 100644 --- a/firmware/application/m4_startup.cpp +++ b/firmware/application/m4_startup.cpp @@ -23,6 +23,9 @@ #include "hal.h" +#include "lpc43xx_cpp.hpp" +using namespace lpc43xx; + #include "message.hpp" #include "baseband_api.hpp" @@ -51,3 +54,10 @@ void m4_init(const portapack::spi_flash::region_t from, const portapack::memory: void m4_request_shutdown() { baseband::shutdown(); } + +void m0_halt() { + rgu::reset(rgu::Reset::M0APP); + while(true) { + port_wait_for_interrupt(); + } +} diff --git a/firmware/application/m4_startup.hpp b/firmware/application/m4_startup.hpp index ce22770e..95042f75 100644 --- a/firmware/application/m4_startup.hpp +++ b/firmware/application/m4_startup.hpp @@ -30,4 +30,6 @@ void m4_init(const portapack::spi_flash::region_t from, const portapack::memory::region_t to); void m4_request_shutdown(); +void m0_halt(); + #endif/*__M4_STARTUP_H__*/ diff --git a/firmware/application/main.cpp b/firmware/application/main.cpp index a3674ab7..d98caa53 100755 --- a/firmware/application/main.cpp +++ b/firmware/application/main.cpp @@ -47,9 +47,6 @@ #include "gcc.hpp" -#include "lpc43xx_cpp.hpp" -using namespace lpc43xx; - #include "sd_card.hpp" #include @@ -100,8 +97,7 @@ int main(void) { portapack::shutdown(); m4_init(portapack::spi_flash::hackrf, portapack::memory::map::m4_code_hackrf); - - rgu::reset(rgu::Reset::M0APP); + m0_halt(); return 0; } From 7ec476cb79a49fe9691ab736362fb5f9a376a7d0 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 16 Feb 2016 11:09:00 -0800 Subject: [PATCH 073/164] Rename m4_startup.* to more appropriate core_control.* Now that there is M0- and M4-related code. --- firmware/application/Makefile | 2 +- firmware/application/{m4_startup.cpp => core_control.cpp} | 2 +- firmware/application/{m4_startup.hpp => core_control.hpp} | 6 +++--- firmware/application/main.cpp | 2 +- firmware/application/ui_navigation.cpp | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) rename firmware/application/{m4_startup.cpp => core_control.cpp} (98%) rename firmware/application/{m4_startup.hpp => core_control.hpp} (92%) diff --git a/firmware/application/Makefile b/firmware/application/Makefile index ca1be09a..37f1a4f0 100755 --- a/firmware/application/Makefile +++ b/firmware/application/Makefile @@ -187,7 +187,7 @@ CPPSRC = main.cpp \ ../common/chibios_cpp.cpp \ ../common/debug.cpp \ ../common/gcc.cpp \ - m4_startup.cpp \ + core_control.cpp \ cpld_max5.cpp \ jtag.cpp \ cpld_update.cpp \ diff --git a/firmware/application/m4_startup.cpp b/firmware/application/core_control.cpp similarity index 98% rename from firmware/application/m4_startup.cpp rename to firmware/application/core_control.cpp index 9b5f2b4f..ebaca90d 100644 --- a/firmware/application/m4_startup.cpp +++ b/firmware/application/core_control.cpp @@ -19,7 +19,7 @@ * Boston, MA 02110-1301, USA. */ -#include "m4_startup.hpp" +#include "core_control.hpp" #include "hal.h" diff --git a/firmware/application/m4_startup.hpp b/firmware/application/core_control.hpp similarity index 92% rename from firmware/application/m4_startup.hpp rename to firmware/application/core_control.hpp index 95042f75..3ec373fa 100644 --- a/firmware/application/m4_startup.hpp +++ b/firmware/application/core_control.hpp @@ -19,8 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#ifndef __M4_STARTUP_H__ -#define __M4_STARTUP_H__ +#ifndef __CORE_CONTROL_H__ +#define __CORE_CONTROL_H__ #include @@ -32,4 +32,4 @@ void m4_request_shutdown(); void m0_halt(); -#endif/*__M4_STARTUP_H__*/ +#endif/*__CORE_CONTROL_H__*/ diff --git a/firmware/application/main.cpp b/firmware/application/main.cpp index d98caa53..24040b92 100755 --- a/firmware/application/main.cpp +++ b/firmware/application/main.cpp @@ -39,7 +39,7 @@ #include "event_m0.hpp" -#include "m4_startup.hpp" +#include "core_control.hpp" #include "spi_image.hpp" #include "debug.hpp" diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index 248b84d5..7a2d4451 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -32,7 +32,7 @@ #include "ert_app.hpp" #include "tpms_app.hpp" -#include "m4_startup.hpp" +#include "core_control.hpp" namespace ui { From 0681f9c5df9c10e58b86099a91803258187116b9 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 16 Feb 2016 11:23:02 -0800 Subject: [PATCH 074/164] Init message queues in M0 event dispatcher. --- firmware/application/event_m0.cpp | 13 ++++++++++++- firmware/application/event_m0.hpp | 2 ++ firmware/application/main.cpp | 2 -- firmware/common/portapack_shared_memory.hpp | 11 ----------- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/firmware/application/event_m0.cpp b/firmware/application/event_m0.cpp index dc557397..c4ab32a7 100644 --- a/firmware/application/event_m0.cpp +++ b/firmware/application/event_m0.cpp @@ -65,6 +65,8 @@ EventDispatcher::EventDispatcher( painter(painter), context(context) { + init_message_queues(); + thread_event_loop = chThdSelf(); touch_manager.on_event = [this](const ui::TouchEvent event) { this->on_touch_event(event); @@ -241,4 +243,13 @@ void EventDispatcher::event_bubble_encoder(const ui::EncoderEvent event) { while( (target != nullptr) && !target->on_encoder(event) ) { target = target->parent(); } -} \ No newline at end of file +} + +void EventDispatcher::init_message_queues() { + new (&shared_memory.baseband_queue) MessageQueue( + shared_memory.baseband_queue_data, SharedMemory::baseband_queue_k + ); + new (&shared_memory.application_queue) MessageQueue( + shared_memory.application_queue_data, SharedMemory::application_queue_k + ); +} diff --git a/firmware/application/event_m0.hpp b/firmware/application/event_m0.hpp index d8b1b396..414a3a62 100644 --- a/firmware/application/event_m0.hpp +++ b/firmware/application/event_m0.hpp @@ -105,6 +105,8 @@ private: bool event_bubble_key(const ui::KeyEvent event); void event_bubble_encoder(const ui::EncoderEvent event); + + void init_message_queues(); }; #endif/*__EVENT_M0_H__*/ diff --git a/firmware/application/main.cpp b/firmware/application/main.cpp index 24040b92..bc37759f 100755 --- a/firmware/application/main.cpp +++ b/firmware/application/main.cpp @@ -63,8 +63,6 @@ int main(void) { sdcStart(&SDCD1, nullptr); - init_message_queues(); - ui::Context context; ui::SystemView system_view { context, diff --git a/firmware/common/portapack_shared_memory.hpp b/firmware/common/portapack_shared_memory.hpp index f7c11d0c..b7b97f39 100644 --- a/firmware/common/portapack_shared_memory.hpp +++ b/firmware/common/portapack_shared_memory.hpp @@ -48,15 +48,4 @@ struct SharedMemory { extern SharedMemory& shared_memory; -#if defined(LPC43XX_M0) -inline void init_message_queues() { - new (&shared_memory.baseband_queue) MessageQueue( - shared_memory.baseband_queue_data, SharedMemory::baseband_queue_k - ); - new (&shared_memory.application_queue) MessageQueue( - shared_memory.application_queue_data, SharedMemory::application_queue_k - ); -} -#endif - #endif/*__PORTAPACK_SHARED_MEMORY_H__*/ From 0c29308eb96fbcba55c656997c72eef16437d020 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 16 Feb 2016 11:32:38 -0800 Subject: [PATCH 075/164] Fix FM squelch. Forgot to recalibrate when adjusting normalization of float/audio signal path. --- firmware/baseband/proc_nfm_audio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/baseband/proc_nfm_audio.cpp b/firmware/baseband/proc_nfm_audio.cpp index ce9c6634..3fd546b9 100644 --- a/firmware/baseband/proc_nfm_audio.cpp +++ b/firmware/baseband/proc_nfm_audio.cpp @@ -77,7 +77,7 @@ void NarrowbandFMAudio::configure(const NBFMConfigureMessage& message) { channel_filter_pass_f = message.channel_filter.pass_frequency_normalized * channel_filter_input_fs; channel_filter_stop_f = message.channel_filter.stop_frequency_normalized * channel_filter_input_fs; channel_spectrum.set_decimation_factor(std::floor(channel_filter_output_fs / (channel_filter_pass_f + channel_filter_stop_f))); - audio_output.configure(message.audio_hpf_config, message.audio_deemph_config, 12288); + audio_output.configure(message.audio_hpf_config, message.audio_deemph_config, 0.5f); configured = true; } From c12833a28855098dc7158ebc03ae7945a7b16c23 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 16 Feb 2016 15:17:06 -0800 Subject: [PATCH 076/164] Factor out a common rectangle. --- firmware/application/analog_audio_app.cpp | 20 ++++---------------- firmware/application/analog_audio_app.hpp | 2 ++ 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/firmware/application/analog_audio_app.cpp b/firmware/application/analog_audio_app.cpp index 222610df..89bbbd61 100644 --- a/firmware/application/analog_audio_app.cpp +++ b/firmware/application/analog_audio_app.cpp @@ -216,10 +216,7 @@ void AnalogAudioView::on_show_options_frequency() { field_frequency.set_style(&style_options_group); - auto widget = std::make_unique( - Rect { 0 * 8, 1 * 16, 30 * 8, 1 * 16 }, - &style_options_group - ); + auto widget = std::make_unique(options_view_rect, &style_options_group); widget->set_step(receiver_model.frequency_step()); widget->on_change_step = [this](rf::Frequency f) { @@ -239,10 +236,7 @@ void AnalogAudioView::on_show_options_rf_gain() { field_lna.set_style(&style_options_group); - auto widget = std::make_unique( - Rect { 0 * 8, 1 * 16, 30 * 8, 1 * 16 }, - &style_options_group - ); + auto widget = std::make_unique(options_view_rect, &style_options_group); widget->set_rf_amp(receiver_model.rf_amp()); widget->on_change_rf_amp = [this](bool enable) { @@ -259,18 +253,12 @@ void AnalogAudioView::on_show_options_modulation() { const auto modulation = static_cast(receiver_model.modulation()); if( modulation == ReceiverModel::Mode::AMAudio ) { options_modulation.set_style(&style_options_group); - auto widget = std::make_unique( - Rect { 0 * 8, 1 * 16, 30 * 8, 1 * 16 }, - &style_options_group - ); + auto widget = std::make_unique(options_view_rect, &style_options_group); set_options_widget(std::move(widget)); } if( modulation == ReceiverModel::Mode::NarrowbandFMAudio ) { options_modulation.set_style(&style_options_group); - auto widget = std::make_unique( - Rect { 0 * 8, 1 * 16, 30 * 8, 1 * 16 }, - &style_options_group - ); + auto widget = std::make_unique(options_view_rect, &style_options_group); set_options_widget(std::move(widget)); } } diff --git a/firmware/application/analog_audio_app.hpp b/firmware/application/analog_audio_app.hpp index e3bd24a4..7fb93432 100644 --- a/firmware/application/analog_audio_app.hpp +++ b/firmware/application/analog_audio_app.hpp @@ -93,6 +93,8 @@ public: private: static constexpr ui::Dim header_height = 2 * 16; + const Rect options_view_rect { 0 * 8, 1 * 16, 30 * 8, 1 * 16 }; + RSSI rssi { { 21 * 8, 0, 6 * 8, 4 }, }; From 00fb25f14303a1ead3bb01f41959c92458fd4f9e Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 18 Feb 2016 20:36:32 -0800 Subject: [PATCH 077/164] CRC class now supports reverse of input/output. --- firmware/common/crc.hpp | 65 ++++++++++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/firmware/common/crc.hpp b/firmware/common/crc.hpp index ab10455d..dfe19872 100644 --- a/firmware/common/crc.hpp +++ b/firmware/common/crc.hpp @@ -24,15 +24,22 @@ #include #include +#include /* Inspired by * http://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code * - * ...then munged into a shape resembling boost::crc_basic. + * ...then munged into a simplified implementation of boost::crc_basic and + * boost::crc_optimal. * http://www.boost.org/doc/libs/release/libs/crc/ + * + * Copyright 2001, 2004 Daryle Walker. Use, modification, and distribution are + * subject to the Boost Software License, Version 1.0. (See accompanying file + * LICENSE_1_0.txt or a copy at .) + * */ -template +template class CRC { public: constexpr CRC( @@ -59,22 +66,32 @@ public: } void process_bit(bool bit) { - remainder ^= bit << (width() - 1); - if( remainder & top_bit() ) { - remainder = (remainder << 1) ^ truncated_polynomial; - } else { - remainder = (remainder << 1); + remainder ^= (bit ? top_bit() : 0U); + const auto do_poly_div = static_cast(remainder & top_bit()); + remainder <<= 1; + if( do_poly_div ) { + remainder ^= truncated_polynomial; } } - void process_byte(const uint8_t data) { - remainder ^= data << (width() - 8); - for(size_t bit=0; bit<8; bit++) { - if( remainder & top_bit() ) { - remainder = (remainder << 1) ^ truncated_polynomial; - } else { - remainder = (remainder << 1); - } + void process_bits(uint8_t bits, size_t bit_count) { + bits <<= (8 - bit_count); + for(size_t i=bit_count; i>0; --i, bits <<= 1) { + process_bit(static_cast(bits & 0x80)); + } + } + + void process_bits_lsb_first(uint8_t bits, size_t bit_count) { + for(size_t i=bit_count; i>0; --i, bits >>= 1) { + process_bit(static_cast(bits & 0x01)); + } + } + + void process_byte(const uint8_t byte) { + if( RevIn ) { + process_bits_lsb_first(byte, 8); + } else { + process_bits(byte, 8); } } @@ -84,8 +101,13 @@ public: } } + template + void process_bytes(const std::array& data) { + process_bytes(data.data(), data.size()); + } + T checksum() const { - return remainder ^ final_xor_value; + return (RevOut ? reflect(remainder) : remainder) ^ final_xor_value; } private: @@ -101,7 +123,16 @@ private: static constexpr T top_bit() { return 1U << (width() - 1); } + + static T reflect(T x) { + T reflection = 0; + for(size_t i=0; i>= 1; + } + return reflection; + } }; - #endif/*__CRC_H__*/ From 1e0d34c98be67ea47128e938d8500c40fe894f69 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 18 Feb 2016 21:31:51 -0800 Subject: [PATCH 078/164] CRC internal type more suitable for ARM. --- firmware/application/tpms_app.cpp | 4 +-- firmware/common/ais_packet.cpp | 2 +- firmware/common/crc.hpp | 50 ++++++++++++++++++------------- firmware/common/ert_packet.cpp | 4 +-- 4 files changed, 35 insertions(+), 25 deletions(-) diff --git a/firmware/application/tpms_app.cpp b/firmware/application/tpms_app.cpp index 2c436506..fb43e7d8 100644 --- a/firmware/application/tpms_app.cpp +++ b/firmware/application/tpms_app.cpp @@ -105,8 +105,8 @@ size_t Packet::crc_valid_length() const { } uint32_t checksum = 0; - CRC crc_72 { 0x01, 0x00 }; - CRC crc_80 { 0x01, 0x00 }; + CRC<8> crc_72 { 0x01, 0x00 }; + CRC<8> crc_80 { 0x01, 0x00 }; for(size_t i=0; i ais_fcs { 0x1021, 0xffff, 0xffff }; + CRC<16> ais_fcs { 0x1021, 0xffff, 0xffff }; for(size_t i=0; i #include +#include #include /* Inspired by @@ -39,13 +40,15 @@ * */ -template +template class CRC { public: + using value_type = uint32_t; + constexpr CRC( - const T truncated_polynomial, - const T initial_remainder = 0, - const T final_xor_value = 0 + const value_type truncated_polynomial, + const value_type initial_remainder = 0, + const value_type final_xor_value = 0 ) : truncated_polynomial { truncated_polynomial }, initial_remainder { initial_remainder }, final_xor_value { final_xor_value }, @@ -53,11 +56,11 @@ public: { } - T get_initial_remainder() const { + value_type get_initial_remainder() const { return initial_remainder; } - void reset(T new_initial_remainder) { + void reset(value_type new_initial_remainder) { remainder = new_initial_remainder; } @@ -74,14 +77,17 @@ public: } } - void process_bits(uint8_t bits, size_t bit_count) { - bits <<= (8 - bit_count); + void process_bits(value_type bits, size_t bit_count) { + constexpr auto digits = std::numeric_limits::digits; + constexpr auto mask = static_cast(1) << (digits - 1); + + bits <<= (std::numeric_limits::digits - bit_count); for(size_t i=bit_count; i>0; --i, bits <<= 1) { - process_bit(static_cast(bits & 0x80)); + process_bit(static_cast(bits & mask)); } } - void process_bits_lsb_first(uint8_t bits, size_t bit_count) { + void process_bits_lsb_first(value_type bits, size_t bit_count) { for(size_t i=bit_count; i>0; --i, bits >>= 1) { process_bit(static_cast(bits & 0x01)); } @@ -106,26 +112,30 @@ public: process_bytes(data.data(), data.size()); } - T checksum() const { - return (RevOut ? reflect(remainder) : remainder) ^ final_xor_value; + value_type checksum() const { + return ((RevOut ? reflect(remainder) : remainder) ^ final_xor_value) & mask(); } private: - const T truncated_polynomial; - const T initial_remainder; - const T final_xor_value; - T remainder; + const value_type truncated_polynomial; + const value_type initial_remainder; + const value_type final_xor_value; + value_type remainder; static constexpr size_t width() { - return 8 * sizeof(T); + return Width; } - static constexpr T top_bit() { + static constexpr value_type top_bit() { return 1U << (width() - 1); } - static T reflect(T x) { - T reflection = 0; + static constexpr value_type mask() { + return (~(~(0UL) << width())); + } + + static value_type reflect(value_type x) { + value_type reflection = 0; for(size_t i=0; i ert_bch { 0x6f63 }; + CRC<16> ert_bch { 0x6f63 }; size_t start_bit = 5; ert_bch.process_byte(reader_.read(0, start_bit)); for(size_t i=start_bit; i ert_crc_ccitt { 0x1021, 0xffff, 0x1d0f }; + CRC<16> ert_crc_ccitt { 0x1021, 0xffff, 0x1d0f }; for(size_t i=0; i Date: Thu, 18 Feb 2016 21:32:25 -0800 Subject: [PATCH 079/164] Fix SD error icon. Was missing the left half of the "X". --- firmware/application/ui_sd_card_status_view.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware/application/ui_sd_card_status_view.cpp b/firmware/application/ui_sd_card_status_view.cpp index 46a07720..567d9d99 100644 --- a/firmware/application/ui_sd_card_status_view.cpp +++ b/firmware/application/ui_sd_card_status_view.cpp @@ -54,8 +54,8 @@ static constexpr Bitmap bitmap_sd_card_unknown { static constexpr uint8_t bitmap_sd_card_error_data[] = { 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1f, 0xf0, 0x1f, - 0xf8, 0x1f, 0xf8, 0x1b, 0xf8, 0x19, 0xf8, 0x1c, - 0xf8, 0x1e, 0xf8, 0x1c, 0xf8, 0x19, 0xf8, 0x1b, + 0xf8, 0x1f, 0xd8, 0x1b, 0x98, 0x19, 0x38, 0x1c, + 0x78, 0x1e, 0x38, 0x1c, 0x98, 0x19, 0xd8, 0x1b, 0xf8, 0x1f, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0x00, }; From 083711ceb211a7f34003ef76d0e44ab0f73bb54c Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 18 Feb 2016 21:33:38 -0800 Subject: [PATCH 080/164] Add File::open(), use inside File::open_for_append(). --- firmware/application/file.cpp | 8 ++++++-- firmware/application/file.hpp | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/firmware/application/file.cpp b/firmware/application/file.cpp index 4898ee74..3695063d 100644 --- a/firmware/application/file.cpp +++ b/firmware/application/file.cpp @@ -25,9 +25,13 @@ File::~File() { close(); } -bool File::open_for_append(const std::string& file_path) { +bool File::open(const std::string& file_path) { const auto open_result = f_open(&f, file_path.c_str(), FA_WRITE | FA_OPEN_ALWAYS); - if( open_result == FR_OK ) { + return (open_result == FR_OK); +} + +bool File::open_for_append(const std::string& file_path) { + if( open(file_path) ) { const auto seek_result = f_lseek(&f, f_size(&f)); if( seek_result == FR_OK ) { return true; diff --git a/firmware/application/file.hpp b/firmware/application/file.hpp index 533bc456..17ac5a7c 100644 --- a/firmware/application/file.hpp +++ b/firmware/application/file.hpp @@ -31,6 +31,7 @@ class File { public: ~File(); + bool open(const std::string& file_path); bool open_for_append(const std::string& file_path); bool close(); From 7cf55cef523c3588ac4ffe5b9b6e1b784b8b03e6 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 18 Feb 2016 21:34:03 -0800 Subject: [PATCH 081/164] Add File::write() that takes std::array. --- firmware/application/file.hpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/firmware/application/file.hpp b/firmware/application/file.hpp index 17ac5a7c..29ffc57d 100644 --- a/firmware/application/file.hpp +++ b/firmware/application/file.hpp @@ -26,6 +26,7 @@ #include #include +#include class File { public: @@ -40,6 +41,11 @@ public: bool read(void* const data, const size_t bytes_to_read); bool write(const void* const data, const size_t bytes_to_write); + template + bool write(const std::array& data) { + return write(data.data(), N); + } + bool puts(const std::string& string); bool sync(); From 40d7f3a1346ba97905b33fa4363a0193c79a22ab Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 18 Feb 2016 21:35:46 -0800 Subject: [PATCH 082/164] Add screen capture button. --- firmware/application/ui_navigation.cpp | 8 +++++++ firmware/application/ui_navigation.hpp | 32 ++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index 7a2d4451..c298da18 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -42,6 +42,7 @@ SystemStatusView::SystemStatusView() { add_children({ { &button_back, &title, + &button_camera, &button_sleep, &sd_card_status_view, } }); @@ -52,6 +53,10 @@ SystemStatusView::SystemStatusView() { } }; + button_camera.on_select = [this](ImageButton&) { + this->on_camera(); + }; + button_sleep.on_select = [this](ImageButton&) { DisplaySleepMessage message; EventDispatcher::message_map().send(&message); @@ -71,6 +76,9 @@ void SystemStatusView::set_title(const std::string new_value) { } } +void SystemStatusView::on_camera() { +} + /* Navigation ************************************************************/ bool NavigationView::is_top() const { diff --git a/firmware/application/ui_navigation.hpp b/firmware/application/ui_navigation.hpp index 75b0aa2c..004ddc0d 100644 --- a/firmware/application/ui_navigation.hpp +++ b/firmware/application/ui_navigation.hpp @@ -60,6 +60,29 @@ static constexpr Bitmap bitmap_sleep { { 16, 16 }, bitmap_sleep_data }; +static constexpr uint8_t bitmap_camera_data[] = { + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xcc, 0x03, + 0xe8, 0x07, + 0xfc, 0x3f, + 0x3c, 0x3c, + 0x9c, 0x39, + 0xdc, 0x3b, + 0xdc, 0x3b, + 0x9c, 0x39, + 0x3c, 0x3c, + 0xfc, 0x3f, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, +}; + +static constexpr Bitmap bitmap_camera { + { 16, 16 }, bitmap_camera_data +}; + class SystemStatusView : public View { public: std::function on_back; @@ -84,6 +107,13 @@ private: default_title, }; + ImageButton button_camera { + { 22 * 8, 0, 2 * 8, 1 * 16 }, + &bitmap_camera, + Color::white(), + Color::black() + }; + ImageButton button_sleep { { 25 * 8, 0, 2 * 8, 1 * 16 }, &bitmap_sleep, @@ -94,6 +124,8 @@ private: SDCardStatusView sd_card_status_view { { 28 * 8, 0 * 16, 2 * 8, 1 * 16 } }; + + void on_camera(); }; class NavigationView : public View { From d6d1f6b8af38d99e0c448b4df75dbf670db77ba5 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 19 Feb 2016 08:57:07 -0800 Subject: [PATCH 083/164] Missing #include. --- firmware/common/utility.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/firmware/common/utility.cpp b/firmware/common/utility.cpp index 9e167101..14a9067e 100644 --- a/firmware/common/utility.cpp +++ b/firmware/common/utility.cpp @@ -22,6 +22,7 @@ #include "utility.hpp" #include +#include #if 0 uint32_t gcd(const uint32_t u, const uint32_t v) { From daeb542086533230f5afb37e806f086beed97127 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 19 Feb 2016 10:30:26 -0800 Subject: [PATCH 084/164] Remove constexpr use of std::log2, std::log10. GCC 4.9 doesn't care for it. --- firmware/common/utility.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/firmware/common/utility.cpp b/firmware/common/utility.cpp index 14a9067e..b29a9b74 100644 --- a/firmware/common/utility.cpp +++ b/firmware/common/utility.cpp @@ -22,7 +22,6 @@ #include "utility.hpp" #include -#include #if 0 uint32_t gcd(const uint32_t u, const uint32_t v) { @@ -84,10 +83,9 @@ float fast_pow2(const float val) { } float mag2_to_dbv_norm(const float mag2) { - constexpr float mag2_max = 1.0f; - constexpr float mag2_log2_max = std::log2(mag2_max); + constexpr float mag2_log2_max = 0.0f; //std::log2(1.0f); constexpr float log_mag2_mag_factor = 0.5f; - constexpr float log2_log10_factor = std::log10(2.0f); + constexpr float log2_log10_factor = 0.3010299956639812f; //std::log10(2.0f); constexpr float log10_dbv_factor = 20.0f; constexpr float mag2_to_db_factor = log_mag2_mag_factor * log2_log10_factor * log10_dbv_factor; return (fast_log2(mag2) - mag2_log2_max) * mag2_to_db_factor; From ac6af17b94a1fe113bf22f967a358e94a958e756 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 19 Feb 2016 11:22:22 -0800 Subject: [PATCH 085/164] Fix extra, empty menu items in DebugMenuView. Added TODO to prevent default construction of menu items, making this a compiler error in the future. --- firmware/application/ui_debug.cpp | 2 +- firmware/application/ui_menu.hpp | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/firmware/application/ui_debug.cpp b/firmware/application/ui_debug.cpp index 1e005d7f..fda852bc 100644 --- a/firmware/application/ui_debug.cpp +++ b/firmware/application/ui_debug.cpp @@ -269,7 +269,7 @@ DebugPeripheralsMenuView::DebugPeripheralsMenuView(NavigationView& nav) { /* DebugMenuView *********************************************************/ DebugMenuView::DebugMenuView(NavigationView& nav) { - add_items<8>({ { + add_items<5>({ { { "Memory", [&nav](){ nav.push(); } }, { "Radio State", [&nav](){ nav.push(); } }, { "SD Card", [&nav](){ nav.push(); } }, diff --git a/firmware/application/ui_menu.hpp b/firmware/application/ui_menu.hpp index e5533ce1..0bd19c11 100644 --- a/firmware/application/ui_menu.hpp +++ b/firmware/application/ui_menu.hpp @@ -35,6 +35,10 @@ namespace ui { struct MenuItem { std::string text; std::function on_select; + + // TODO: Prevent default-constructed MenuItems. + // I managed to construct a menu with three extra, unspecified menu items + // in the array that were default constructed... }; class MenuItemView : public Widget { From 5ed76d6985234b94af7f600c20531675e0e18bef Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 19 Feb 2016 14:13:15 -0800 Subject: [PATCH 086/164] Adler32 implementation (for PNG writer). --- firmware/common/crc.hpp | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/firmware/common/crc.hpp b/firmware/common/crc.hpp index f89df533..31c214e3 100644 --- a/firmware/common/crc.hpp +++ b/firmware/common/crc.hpp @@ -145,4 +145,42 @@ private: } }; +class Adler32 { +public: + void feed(const uint8_t v) { + feed_one(v); + } + + void feed(const uint8_t* const p, const size_t n) { + for(size_t i=0; i + void feed(const T& a) { + feed(a.data(), a.size()); + } + + std::array bytes() const { + return { + static_cast((b >> 8) & 0xff), + static_cast((b >> 0) & 0xff), + static_cast((a >> 8) & 0xff), + static_cast((a >> 0) & 0xff) + }; + } + +private: + static constexpr uint32_t mod = 65521; + + uint32_t a { 1 }; + uint32_t b { 0 }; + + void feed_one(const uint8_t c) { + a = (a + c) % mod; + b = (b + a) % mod; + } +}; + #endif/*__CRC_H__*/ From 322a15587ae15ab33bc0be331f3b0261f299ec2b Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 19 Feb 2016 15:27:50 -0800 Subject: [PATCH 087/164] Add ColorRGB888 type for data from LCD frame buffer. --- firmware/common/ui.hpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/firmware/common/ui.hpp b/firmware/common/ui.hpp index 9715e6c9..0a10a9f2 100644 --- a/firmware/common/ui.hpp +++ b/firmware/common/ui.hpp @@ -75,6 +75,12 @@ struct Color { } }; +struct ColorRGB888 { + uint8_t r; + uint8_t g; + uint8_t b; +}; + struct Point { Coord x; Coord y; From 1f79c72bf0e562efbd58955ed22a6134dddc813f Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 19 Feb 2016 15:28:15 -0800 Subject: [PATCH 088/164] Remove irrelevant comment from portapack::io. --- firmware/common/portapack_io.hpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/firmware/common/portapack_io.hpp b/firmware/common/portapack_io.hpp index 8f941cc6..ca660316 100644 --- a/firmware/common/portapack_io.hpp +++ b/firmware/common/portapack_io.hpp @@ -139,13 +139,7 @@ public: uint32_t lcd_read_word() { return lcd_read_data_frame_memory(); } -/* - // NOTE: Pixels read in RGB24 format, not the RGB565 format used - // to write pixels to frame memory. This makes reading very tricky! - ui::Color lcd_read_pixel() { - return ui::Color { lcd_read_data_frame_memory() }; - } -*/ + void lcd_write_pixels(const ui::Color pixel, size_t n) { while(n--) { lcd_write_data_fast(pixel.v); From 6d0995e165fe83617db6f2849036d00270548d37 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 19 Feb 2016 15:29:00 -0800 Subject: [PATCH 089/164] Function to read bytes from 16-bit LCD interface. ...begin careful not to overread from the LCD, or overwrite to the buffer. --- firmware/common/portapack_io.hpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/firmware/common/portapack_io.hpp b/firmware/common/portapack_io.hpp index ca660316..7ec86841 100644 --- a/firmware/common/portapack_io.hpp +++ b/firmware/common/portapack_io.hpp @@ -152,6 +152,20 @@ public: } } + void lcd_read_bytes(uint8_t* byte, size_t byte_count) { + size_t word_count = byte_count / 2; + while(word_count) { + const auto word = lcd_read_data_frame_memory(); + *(byte++) = word >> 8; + *(byte++) = word >> 0; + word_count--; + } + if( byte_count & 1 ) { + const auto word = lcd_read_data_frame_memory(); + *(byte++) = word >> 8; + } + } + uint32_t io_read() { io_stb_assert(); dir_read(); From bdaa13c103a9a71588bbb888ea13cf564592a9ea Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 19 Feb 2016 15:30:35 -0800 Subject: [PATCH 090/164] CRC, Adler32 interfaces accept void* blocks. ...despite my better judgement. --- firmware/common/crc.hpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/firmware/common/crc.hpp b/firmware/common/crc.hpp index 31c214e3..fdb43ba3 100644 --- a/firmware/common/crc.hpp +++ b/firmware/common/crc.hpp @@ -101,9 +101,10 @@ public: } } - void process_bytes(const uint8_t* const data, const size_t length) { + void process_bytes(const void* const data, const size_t length) { + const uint8_t* const p = reinterpret_cast(data); for(size_t i=0; i(data); for(size_t i=0; i void feed(const T& a) { - feed(a.data(), a.size()); + feed(a.data(), sizeof(T)); } std::array bytes() const { From 77eb0c5d248fd6b64eb7dd0afdc45f17147313fa Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 19 Feb 2016 15:31:56 -0800 Subject: [PATCH 091/164] ILI9341 read_pixels(). Improves on / abstracts prior interface, which just handed back uint16_ts from the LCD's parallel interface. --- firmware/common/lcd_ili9341.cpp | 33 +++++++++++++++++++++++++++++++++ firmware/common/lcd_ili9341.hpp | 9 +++++++++ 2 files changed, 42 insertions(+) diff --git a/firmware/common/lcd_ili9341.cpp b/firmware/common/lcd_ili9341.cpp index 0f0dd319..ddda0f8c 100644 --- a/firmware/common/lcd_ili9341.cpp +++ b/firmware/common/lcd_ili9341.cpp @@ -179,6 +179,11 @@ void lcd_ramwr_start() { io.lcd_data_write_command_and_data(0x2c, {}); } +void lcd_ramrd_start() { + io.lcd_data_write_command_and_data(0x2e, {}); + io.lcd_read_word(); +} + void lcd_caset(const uint_fast16_t start_column, uint_fast16_t end_column) { lcd_set(0x2a, start_column, end_column); } @@ -196,12 +201,27 @@ void lcd_start_ram_write( lcd_ramwr_start(); } +void lcd_start_ram_read( + const ui::Point p, + const ui::Size s +) { + lcd_caset(p.x, p.x + s.w - 1); + lcd_paset(p.y, p.y + s.h - 1); + lcd_ramrd_start(); +} + void lcd_start_ram_write( const ui::Rect& r ) { lcd_start_ram_write(r.pos, r.size); } +void lcd_start_ram_read( + const ui::Rect& r +) { + lcd_start_ram_read(r.pos, r.size); +} + void lcd_vertical_scrolling_definition( const uint_fast16_t top_fixed_area, const uint_fast16_t vertical_scrolling_area, @@ -299,6 +319,19 @@ void ILI9341::draw_pixels( io.lcd_write_pixels(colors, count); } +void ILI9341::read_pixels( + const ui::Rect r, + ui::ColorRGB888* const colors, + const size_t count +) { + /* TODO: Assert that rectangle width x height < count */ + lcd_start_ram_read(r); + io.lcd_read_bytes( + reinterpret_cast(colors), + count * sizeof(ui::ColorRGB888) + ); +} + void ILI9341::draw_bitmap( const ui::Point p, const ui::Size size, diff --git a/firmware/common/lcd_ili9341.hpp b/firmware/common/lcd_ili9341.hpp index 7c5cda38..c277f407 100644 --- a/firmware/common/lcd_ili9341.hpp +++ b/firmware/common/lcd_ili9341.hpp @@ -65,6 +65,14 @@ public: draw_pixels(r, colors.data(), colors.size()); } + template + void read_pixels( + const ui::Rect r, + std::array& colors + ) { + read_pixels(r, colors.data(), colors.size()); + } + void draw_bitmap( const ui::Point p, const ui::Size size, @@ -101,6 +109,7 @@ private: scroll_t scroll_state; void draw_pixels(const ui::Rect r, const ui::Color* const colors, const size_t count); + void read_pixels(const ui::Rect r, ui::ColorRGB888* const colors, const size_t count); }; } /* namespace lcd */ From 925394c54ba6f8c6545796b63182a321bc77389e Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 19 Feb 2016 15:33:27 -0800 Subject: [PATCH 092/164] Bodgy code to write PNG files the size of the LCD screen. --- firmware/common/png_writer.cpp | 127 +++++++++++++++++++++++++++++++++ firmware/common/png_writer.hpp | 63 ++++++++++++++++ 2 files changed, 190 insertions(+) create mode 100644 firmware/common/png_writer.cpp create mode 100644 firmware/common/png_writer.hpp diff --git a/firmware/common/png_writer.cpp b/firmware/common/png_writer.cpp new file mode 100644 index 00000000..937e9d23 --- /dev/null +++ b/firmware/common/png_writer.cpp @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "png_writer.hpp" + +static constexpr std::array png_file_header { { + 0x89, 0x50, 0x4e, 0x47, + 0x0d, 0x0a, 0x1a, 0x0a, +} }; + +static constexpr std::array png_ihdr_screen_capture { { + 0x00, 0x00, 0x00, 0x0d, // IHDR length + 0x49, 0x48, 0x44, 0x52, // IHDR type + 0x00, 0x00, 0x00, 0xf0, // width = 240 + 0x00, 0x00, 0x01, 0x40, // height = 320 + 0x08, // bit_depth = 8 + 0x02, // color_type = 2 + 0x00, // compression_method = 0 + 0x00, // filter_method = 0 + 0x00, // interlace_method = 0 + 0x0d, 0x8a, 0x66, 0x04, // CRC +} }; + +static constexpr std::array png_idat_chunk_type { { + 0x49, 0x44, 0x41, 0x54, // IDAT type +} }; + +static constexpr std::array png_iend { { + 0x00, 0x00, 0x00, 0x00, // IEND length + 0x49, 0x45, 0x4e, 0x44, // IEND type + 0xae, 0x42, 0x60, 0x82, // CRC +} }; + +PNGWriter::PNGWriter( + const std::string& filename +) +{ + file.open(filename); + file.write(png_file_header); + file.write(png_ihdr_screen_capture); + + write_chunk_header( + 2 + height * (5 + 1 + width * 3) + 4, + png_idat_chunk_type + ); + + constexpr std::array zlib_header { 0x78, 0x01 }; // Zlib CM, CINFO, FLG. + write_chunk_content(zlib_header); +} + +PNGWriter::~PNGWriter() { + write_chunk_content(adler_32.bytes()); + write_chunk_crc(); + + file.write(png_iend); +} + +void PNGWriter::write_scanline(const std::array& scanline) { + constexpr uint8_t scanline_filter_type = 0; + constexpr uint32_t deflate_block_length = 1 + sizeof(scanline); + + const std::array deflate_and_scanline_header { + (scanline_count == (height - 1)) ? 0x01 : 0x00, // DEFLATE header bits, bfinal=0, btype=00 + static_cast((deflate_block_length >> 0) & 0xff), // Length LSB + static_cast((deflate_block_length >> 8) & 0xff), // Length MSB + static_cast((deflate_block_length >> 0) & 0xff) ^ 0xff, // ~Length LSB + static_cast((deflate_block_length >> 8) & 0xff) ^ 0xff, // ~Length MSB + scanline_filter_type, + }; + write_chunk_content(deflate_and_scanline_header); + + adler_32.feed(scanline_filter_type); + adler_32.feed(scanline); + + // Small writes to avoid some sort of large-transfer plus block + // boundary FatFs or SDC driver bug? + write_chunk_content(&scanline[ 0], 80 * sizeof(ui::ColorRGB888)); + write_chunk_content(&scanline[ 80], 80 * sizeof(ui::ColorRGB888)); + write_chunk_content(&scanline[160], 80 * sizeof(ui::ColorRGB888)); + + scanline_count++; +} + +void PNGWriter::write_chunk_header( + const size_t length, + const std::array& type +) { + write_uint32_be(length); + crc.reset(); + write_chunk_content(type); +} + +void PNGWriter::write_chunk_content(const void* const p, const size_t count) { + file.write(p, count); + crc.process_bytes(p, count); +} + +void PNGWriter::write_chunk_crc() { + write_uint32_be(crc.checksum()); +} + +void PNGWriter::write_uint32_be(const uint32_t v) { + file.write(std::array { { + static_cast((v >> 24) & 0xff), + static_cast((v >> 16) & 0xff), + static_cast((v >> 8) & 0xff), + static_cast((v >> 0) & 0xff), + } }); +} diff --git a/firmware/common/png_writer.hpp b/firmware/common/png_writer.hpp new file mode 100644 index 00000000..90fc2086 --- /dev/null +++ b/firmware/common/png_writer.hpp @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __PNG_WRITER_H__ +#define __PNG_WRITER_H__ + +#include +#include +#include +#include + +#include "ui.hpp" +#include "file.hpp" +#include "crc.hpp" + +class PNGWriter { +public: + explicit PNGWriter(const std::string& filename); + ~PNGWriter(); + + void write_scanline(const std::array& scanline); + +private: + // TODO: These constants are baked in a few places, do not change blithely. + static constexpr int width { 240 }; + static constexpr int height { 320 }; + + File file; + int scanline_count { 0 }; + CRC<32, true, true> crc { 0x04c11db7, 0xffffffff, 0xffffffff }; + Adler32 adler_32; + + void write_chunk_header(const size_t length, const std::array& type); + void write_chunk_content(const void* const p, const size_t count); + + template + void write_chunk_content(const std::array& data) { + write_chunk_content(data.data(), sizeof(data)); + } + + void write_chunk_crc(); + void write_uint32_be(const uint32_t v); +}; + +#endif/*__PNG_WRITER_H__*/ From 52016defd5047e44584cc784e7d2f2fe6cbe296d Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 19 Feb 2016 15:34:02 -0800 Subject: [PATCH 093/164] Capture screen image, save to PNG file on SD card. --- firmware/application/Makefile | 1 + firmware/application/ui_navigation.cpp | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/firmware/application/Makefile b/firmware/application/Makefile index 37f1a4f0..6969eb19 100755 --- a/firmware/application/Makefile +++ b/firmware/application/Makefile @@ -180,6 +180,7 @@ CPPSRC = main.cpp \ sd_card.cpp \ file.cpp \ log_file.cpp \ + png_writer.cpp \ manchester.cpp \ string_format.cpp \ temperature_logger.cpp \ diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index c298da18..ee725801 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -34,6 +34,8 @@ #include "core_control.hpp" +#include "png_writer.hpp" + namespace ui { /* SystemStatusView ******************************************************/ @@ -77,6 +79,13 @@ void SystemStatusView::set_title(const std::string new_value) { } void SystemStatusView::on_camera() { + PNGWriter png { "capture.png" }; + + for(int i=0; i<320; i++) { + std::array row; + portapack::display.read_pixels({ 0, i, 240, 1 }, row); + png.write_scanline(row); + } } /* Navigation ************************************************************/ From db9e361faedd5b80bae83ce04fc08a489685cbdc Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 21 Feb 2016 09:34:36 -0800 Subject: [PATCH 094/164] Wiki documentation images for audio receiver mode. --- doc/images/wiki/ui/audio/am_dsb.png | Bin 0 -> 45520 bytes doc/images/wiki/ui/audio/am_lsb.png | Bin 0 -> 28731 bytes doc/images/wiki/ui/audio/nfm_11k_noaa.png | Bin 0 -> 49626 bytes doc/images/wiki/ui/audio/nfm_8k5_70cm.png | Bin 0 -> 41196 bytes doc/images/wiki/ui/audio/wfm.png | Bin 0 -> 71953 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/images/wiki/ui/audio/am_dsb.png create mode 100644 doc/images/wiki/ui/audio/am_lsb.png create mode 100644 doc/images/wiki/ui/audio/nfm_11k_noaa.png create mode 100644 doc/images/wiki/ui/audio/nfm_8k5_70cm.png create mode 100644 doc/images/wiki/ui/audio/wfm.png diff --git a/doc/images/wiki/ui/audio/am_dsb.png b/doc/images/wiki/ui/audio/am_dsb.png new file mode 100644 index 0000000000000000000000000000000000000000..f946e036c038cb4b429745284e40998fdd739ef1 GIT binary patch literal 45520 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 IM6N<$f;vmH8UO$Q literal 0 HcmV?d00001 diff --git a/doc/images/wiki/ui/audio/am_lsb.png b/doc/images/wiki/ui/audio/am_lsb.png new file mode 100644 index 0000000000000000000000000000000000000000..4ca9fd8491ce34e7b37a2ff2a1417822a7d27e28 GIT binary patch literal 28731 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%0A$@(7*8AEG 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 literal 0 HcmV?d00001 diff --git a/doc/images/wiki/ui/audio/nfm_8k5_70cm.png b/doc/images/wiki/ui/audio/nfm_8k5_70cm.png new file mode 100644 index 0000000000000000000000000000000000000000..c496945f00b2bc97b1f9b361bd809716711e0770 GIT binary patch literal 41196 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 literal 0 HcmV?d00001 diff --git a/doc/images/wiki/ui/audio/wfm.png b/doc/images/wiki/ui/audio/wfm.png new file mode 100644 index 0000000000000000000000000000000000000000..fb2efcf4ce98d0f72fbedd81dee63e9a9c31c074 GIT binary patch literal 71953 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 literal 0 HcmV?d00001 From 112d98ac952b0f22ad4220d8acb78bcb394b50f1 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 21 Feb 2016 10:39:07 -0800 Subject: [PATCH 095/164] Wiki documentation images for digital mode RX. --- doc/images/wiki/ui/digital/ais/ais_detail.png | Bin 0 -> 3420 bytes doc/images/wiki/ui/digital/ais/ais_recents.png | Bin 0 -> 3939 bytes doc/images/wiki/ui/digital/ert/ert_recents.png | Bin 0 -> 32135 bytes .../wiki/ui/digital/tpms/tpms_recents.png | Bin 0 -> 20308 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/images/wiki/ui/digital/ais/ais_detail.png create mode 100644 doc/images/wiki/ui/digital/ais/ais_recents.png create mode 100644 doc/images/wiki/ui/digital/ert/ert_recents.png create mode 100644 doc/images/wiki/ui/digital/tpms/tpms_recents.png diff --git a/doc/images/wiki/ui/digital/ais/ais_detail.png b/doc/images/wiki/ui/digital/ais/ais_detail.png new file mode 100644 index 0000000000000000000000000000000000000000..6d8dc061816d4ad622f85df483b9c18b3e2bfb2b GIT binary patch literal 3420 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 GzWO)FW{GnE literal 0 HcmV?d00001 diff --git a/doc/images/wiki/ui/digital/ais/ais_recents.png b/doc/images/wiki/ui/digital/ais/ais_recents.png new file mode 100644 index 0000000000000000000000000000000000000000..71b245bdb16ae4daaa5244de2f8751cb54fb020b GIT binary patch literal 3939 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 C&3V26 literal 0 HcmV?d00001 diff --git a/doc/images/wiki/ui/digital/ert/ert_recents.png b/doc/images/wiki/ui/digital/ert/ert_recents.png new file mode 100644 index 0000000000000000000000000000000000000000..4c6565d58811a088ad57b465f9a2407eb9a8af3b GIT binary patch literal 32135 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

70w}ItRs{Ag_pJGeW`jWJ-v#DlHQE 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 a;hh)>d|H2?`tHxEJ5wWb!`fR;QU3v3W*e*k literal 0 HcmV?d00001 From d14d24fcc80d1b51f19bb4f4319bc478c9d88cea Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 21 Feb 2016 17:27:21 -0800 Subject: [PATCH 096/164] Top menu and sub-menu/view screen grabs. --- doc/images/wiki/ui/audio/rx_controls.png | Bin 0 -> 18368 bytes doc/images/wiki/ui/audio/rx_levels.png | Bin 0 -> 9185 bytes doc/images/wiki/ui/audio/waterfall.png | Bin 0 -> 64116 bytes doc/images/wiki/ui/general/about/about.png | Bin 0 -> 2750 bytes doc/images/wiki/ui/general/hackrf_mode.png | Bin 0 -> 3183 bytes doc/images/wiki/ui/general/menu_top_about.png | Bin 0 -> 2440 bytes doc/images/wiki/ui/general/menu_top_debug.png | Bin 0 -> 2424 bytes doc/images/wiki/ui/general/menu_top_hackrf.png | Bin 0 -> 2419 bytes .../wiki/ui/general/menu_top_receiver.png | Bin 0 -> 2438 bytes doc/images/wiki/ui/general/menu_top_setup.png | Bin 0 -> 2425 bytes .../ui/general/setup/antenna_bias_voltage.png | Bin 0 -> 3270 bytes doc/images/wiki/ui/general/setup/date_time.png | Bin 0 -> 2608 bytes .../ui/general/setup/frequency_correction.png | Bin 0 -> 2332 bytes .../setup/menu_setup_antenna_bias_voltage.png | Bin 0 -> 2530 bytes .../ui/general/setup/menu_setup_date_time.png | Bin 0 -> 2512 bytes .../setup/menu_setup_frequency_correction.png | Bin 0 -> 2546 bytes .../wiki/ui/general/setup/menu_setup_touch.png | Bin 0 -> 2516 bytes doc/images/wiki/ui/general/status_bar.png | Bin 0 -> 16796 bytes 18 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/images/wiki/ui/audio/rx_controls.png create mode 100644 doc/images/wiki/ui/audio/rx_levels.png create mode 100644 doc/images/wiki/ui/audio/waterfall.png create mode 100644 doc/images/wiki/ui/general/about/about.png create mode 100644 doc/images/wiki/ui/general/hackrf_mode.png create mode 100644 doc/images/wiki/ui/general/menu_top_about.png create mode 100644 doc/images/wiki/ui/general/menu_top_debug.png create mode 100644 doc/images/wiki/ui/general/menu_top_hackrf.png create mode 100644 doc/images/wiki/ui/general/menu_top_receiver.png create mode 100644 doc/images/wiki/ui/general/menu_top_setup.png create mode 100644 doc/images/wiki/ui/general/setup/antenna_bias_voltage.png create mode 100644 doc/images/wiki/ui/general/setup/date_time.png create mode 100644 doc/images/wiki/ui/general/setup/frequency_correction.png create mode 100644 doc/images/wiki/ui/general/setup/menu_setup_antenna_bias_voltage.png create mode 100644 doc/images/wiki/ui/general/setup/menu_setup_date_time.png create mode 100644 doc/images/wiki/ui/general/setup/menu_setup_frequency_correction.png create mode 100644 doc/images/wiki/ui/general/setup/menu_setup_touch.png create mode 100644 doc/images/wiki/ui/general/status_bar.png diff --git a/doc/images/wiki/ui/audio/rx_controls.png b/doc/images/wiki/ui/audio/rx_controls.png new file mode 100644 index 0000000000000000000000000000000000000000..9e3b68d34a72b3a816df46a225dcbc2e16ed5fc8 GIT binary patch literal 18368 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 Q1xlgGNGOVDiR!=oKLW7YBme*a literal 0 HcmV?d00001 diff --git a/doc/images/wiki/ui/audio/rx_levels.png b/doc/images/wiki/ui/audio/rx_levels.png new file mode 100644 index 0000000000000000000000000000000000000000..70e73880c8b3df7b13671254602467d2d795dd2f GIT binary patch literal 9185 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 O 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 Te?YOtDz(!t7fP=EkrV#~RfJp~ literal 0 HcmV?d00001 diff --git a/doc/images/wiki/ui/general/hackrf_mode.png b/doc/images/wiki/ui/general/hackrf_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..6cb92d4895472f34b72a72ae8c3c3c36ac95f82a GIT binary patch literal 3183 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 Sv9azE$R1BuKbLh*2~7a$JA(57 literal 0 HcmV?d00001 diff --git a/doc/images/wiki/ui/general/menu_top_hackrf.png b/doc/images/wiki/ui/general/menu_top_hackrf.png new file mode 100644 index 0000000000000000000000000000000000000000..e14df632b695c639467cf2591d31dddd3aa9bbd2 GIT binary patch literal 2419 zcmb_ceN<9s7)K>Ynvv^xj;SRxb2}RHp;lgjQCeh_I`gZKA%rLta0#vgW;*hSE3LI^ zZkiu>I@C0$wKR*S&DG}V!*;jj+;VPn1;bL)vd zbHP+pdSfuyAW2dhl(uOjAOvNhf(&qnC{!a;Al4WRLjxdNnFtb)G%~4N1!$N7b_)R6 zqhd+`$!-GeVg{sbN+3mpN)ag{G(40Vz#@=HB!)606G)6%=YS(8W`G!i6aa;yR;xqR zVWFThi$aTxjHFQM6gr)ZSddj(IV8}K<*KDqPG0(n5vhbqi2{;8+O24xDR zNTotxtOy6hSvJ!?ZJLI)@+F6}a3&yLDM2z7pmDKi4gzP{O#3af5jYE-0BGrf1c^o@ zO^cBr1+`~E52rFHvub7{qd_UC+^i4?MQCJph?8ihwVh|nG*1})Up!74CuD{YP-XAf zDH1|X{X)8C|NGYnvM5es24z-j2J$Zeo4^c7rZz?ZiCA7i8?!n|b7!dUf&4go0WKl%@(bT>8;q6@gg*(MxR#7Y*4KOY9ya+O)t$NV z`IjY}Wi{Te9utJ|F`M-H-_=ELbEMB~J(3sr6X*9>Ch|tvFP=|KK7MfI4KI`Vhx{jV zCe=rq3R3r$RM|eg^PygvYDfZfpFNoRu}X+fK2YxQ|BIsd=}egQ0li%_R8un&w3vUB$9q58jI|<0SdQYHpu4 zVHFwv>$@h86nb)tjXR7<|5ekl`B}M* zkOgA>9ANYQG0D8#KknsXD;f*GI$IuxGiBB2Zd1GKV~-pmbJ}&DVwBtdyw_jKFsDd< zeQr`EQzN@lxA~Tq@~P55t#D`=?P|!|m+{Sb;FE7i-Y&eTJ-XiAVW-TWR<$opuN`YD z7LYs3bu8JMq-MXYRI&B?c&6gFU`R!*sw`ulTy%JVf8<~`T$oAHJ{&d&^O;BZRF*^-Gx5@f+`U^n00V4L{=U6cDb&Z5YI@tgdVfhAn1( zzTx9X3}3FTC#2=GqOw9_uZmqE$T?K}JK9B69@I`&Rax!;3ocTw5+Tf0})x&6HOYA~FaW;hLiI?DlkQF)!U z?CP=fTyc>4TiZe(FkTkAyR5M3sXNBi!_~vVHgfhC%+X6m8(h0AhlurAhc^}Q4t<>@ z+#U!UpX~v0t^FsTC_z^^dUeUd^|aSI4rkpOp|Rd#l&F==8hP z5eSvvAYLA0@DwkwzgVAPe{1JmPsYuVw$ag4iFPc<(|XRW&6cpwQ*50J!Ni7|+&w4Q zVPyDto78Wd-!H5ulb7<&m3=TITy9bA&Fel5CTEKwa7(Wxob#55^|Z486@DP6-!-I zU}albBT6{fYODuvw;XOENG)YKEEuGS1;bUBxC+RDB3{{<0Ge{>&(55jZ@%Yyp6_|z z_nUW;AGJG-VB=_m!C(kG!$V?_@d*aAhGlJmA}7A2@A$lb~!&pCTr#4@el^H z&K~`(!Kg|dFc|C>QEVI>7x5{b3ra~G9+=7}DW!6RjlnRKbmURWhdD&0R3d}u$^bVL zgN{6-FyKZsQDAX^TU4M`i(TLKv3Q0U#?Y zi-ItRJX2Jn( zZm7|lYcWn(l=jw11}&w9BnY4@fH#Q@tR~|tMZY6MSAJK<s;)7u}+5ddZ|16Y;KK;8v<1jrMmWruKJK9fTB_VFT9yeQtW-ZVOyLihG# z04q3V5uht<1)l?hidYboFimMl(J7INbR%+vD;Y~-27q>wS!XS_tqDc?mT7}1m%jl_ z8w_9d2>D_>+ZhrRtL&dJ6r>N3-?NIkIk-?jaFLL;aSghE-XAKx=^$3oU#eLvN5r7d8_e~6(E{A}Aola?QzH#n1i>&UU! zFaFlieEwppfT`Mj>Ej|#eTU5}UtOT5rKMpm_m<&U%Eo5u@y&W)jsE&LE+;In@|Dp} z23+)sX!~Wlt~K(A^B#5I=4_?fDP{cQ_Zu$9quD*~dN%apX!q%t z6YZX@^L`ec2h~AK_j=*G!n!Sb^iSZ%%w4CG`@X54pXy?_w2E{C-3NGB@gZ5{*M`F5 zFYtkc+=<2`Sq>YG2iP44zN>i|stQVuFnTWq&ygoVJ_&Z_-UoMzLi4izK0VL$Rl80RevW zp@pV9|J%*l+`p7-!ixIrdz5lz-e7c8qUFT-AF6}$JBNQd)w3Pf-{73|kx`@T`YCqd z*FTHJ#$@i*wr<7mpSH(f9kGr}Zo}6lpSKU(K5YDX!)3e$p~BM8Olsq4yk#4V{jUdG zhbQm;>{{65{CI683o2nv#r5w}N0*QMNUO4JXgtw%?R%^M-yr&md-YmJ^vi8adm_U= z(S?@(y(+sGppW3ZFLbpxewu<);qeVV=hC6#z0zdcamx~14x}3{tp74aUb%L5eeF8h zKC6bi9@aGQioVhFIZx-i4@akto_Sb){G{y(JpGEg=B#^4mAf!mJFGqU9uDg`Y3N;c zd~)lGuN}_bBK?!z9KoN8-hrptYeUuL?)sp>cOx$vt_%F$SqJw#p42e=s^{`@gt9)x zCc$w~<~leuaO3l{?)Jt6s2G@$$Evfc`p!Jwi&b@4G|4_28>`!T|BhGKVNIXoy@XoA gvfUpz-bj3DHRhk>po_|Xh1%@gu{)$P_(1Oe0b$seGXMYp literal 0 HcmV?d00001 diff --git a/doc/images/wiki/ui/general/menu_top_setup.png b/doc/images/wiki/ui/general/menu_top_setup.png new file mode 100644 index 0000000000000000000000000000000000000000..4709495bb19de1c6c8fb6bcbc464dda249d8e642 GIT binary patch literal 2425 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 literal 0 HcmV?d00001 diff --git a/doc/images/wiki/ui/general/setup/frequency_correction.png b/doc/images/wiki/ui/general/setup/frequency_correction.png new file mode 100644 index 0000000000000000000000000000000000000000..2a0cf50a91fe701fab63c4f1800949ee4172eef0 GIT binary patch literal 2332 zcmb_cYfuwc7>$pjU{R}#P(h4AQB<-?*O1u40BV3GriN_HE+G(9swiqj zic%0m1bi`wf;955LeT+4L;(jM1q8J!DOiMP0bhY`0%~Nizq&K~xaXd8&-Z zj%8X92$O9E+yE@V+Y1asBFVgPBorpgBE>kHK%mP&{4)~9ctlyGP=taq21(BV@oyar zkcfH;wv|B&@b)9J5D83lBs-8PB*=tFB+@0}5uiVN?Wi0dF-Ti5Obh}*baXU1dIcGg z@Byleiwi)Z0W_LD&ag*gL>NzIFG6ib7WuFa8%Dz<0x>2)L`2=XyigwD00KJiLK|~CjhrtkyLUppI(ClecF4Y;N&_D_v#~6-51iBfP z1mREo6c#Kb!%O$>lO=7(X$R zJ=tztS!>UO9?40f8KJ4VZ^%~|QKC{t1)EJiY1E&&$-a1B`m*^>{cqw^?myoU_5Ph! zbXKb*KV7$Lrnvm~URJ;_axIgT7#Z~Dp&fJOa!`>Oy*;(?sF<~|_Hp}CXjT8Y{nDMU z58E7M#|-d}SxYxw+i&?5+V;o2yWdHLrT4pBhNm*xo@iI8H?quqX6AL-aUg5X$sc)i z&G~{=jv<|V|N7(_*^U@$1(=f?xIw1LTdS_Tb*_k386fY7vx3n(Ijrfz;uCF1eD69@ zc8I*R{AFvzsYB_vo*(Wt+uGpwt0m)QN=-@hKu2x!oxb3UPc3Yfh3bDW?rbFmi0bp!JUKCQCPP@v%BdZQj^E zxSczTSr%8Fm@gU*-FYlF(Yl42gGALO1rM3Z-If%_RhU2D(?KvHULlXMrB*i* z_tTD1b07L_^-(%>zt#jgWn`bcVXn9cLd~)MIZKS0o)2C)hORj=9|obfU1f2aqg+O_ z)6>MF)_zv^(KuI5?nd*hv)_Q5>V!9uioJPB65DL|wE3A$iduehf{1TAn~ct|+SGWV zZ;M(GKd+;1R&0LxrEaj1Q}QCX!qIhNQvLeQzqpKIwf2Hmk$h&6hRSqSHdnr@A-jZ{Rn3n*@N$ZoWyulg{gkxx!HcWHRf}p*i!7VTpH(wgW47!1 zpY_CP^&H0;C!B2?()b&ljFVqxwsmWxGZG56YfcSQfZN7b|DI`4k(75f6QJ$c&Nq@R z?5KV3QGV~bsZEX|h{d0-TA9{V+O^;kIcLy=xI5o_LDRJ}J@K{D;%82K(yX@Lvs5X{ zTP2@ak3V?Sd0d{A-TRI+Wl2I4S6+?g3|V$ox2V+pu}X*Iy@T>z4rXgtz-HRyxG{Gp z?9E?{4S&z2F*-{abB8YVeTyc!gg6ZwiC&Y?n+#P2V5X*mFtn`@xw}^@hkKn=p)e(A;@=Plg;c&>vS~FH9qVD=H^}h0^6TtcK`qY literal 0 HcmV?d00001 diff --git a/doc/images/wiki/ui/general/setup/menu_setup_antenna_bias_voltage.png b/doc/images/wiki/ui/general/setup/menu_setup_antenna_bias_voltage.png new file mode 100644 index 0000000000000000000000000000000000000000..ed9fa5e8160999b8962840d9525c286c56f39c8b GIT binary patch literal 2530 zcmd5+eK?fq9v&aHMJ{PO5wWv~)5pwfhSZEPi9vKmJ{waQV`eZJ^Nx33jO1fk)aEEh z+QgErlU8xcM=3k(sjROIE>4LZDb)~-Z29Q;I`0hCtjqp?-s^flp8L7)=l=bE&+~gv zdV09(Xc=muP$(U@{SQGFU6vPZy$4+FvSe zHPnRy0~AWrg6r!K`&0i$WPy=bCL0XlU`3GvgpERxL`38>k^?i*qDUTJNEF$dDj7uN zTLA;6Xe9-Xus8LmdZL{`h=bmRwZU4MlC{uiGznsd61^!dOLAmnZyFB60wMs!#>Qe} zt+5~!2H*$;0$_y)@OTWuzzE~`FjIu#3(Xc6`M3^+BV<8b0n7#YXvMnB5HK3HH#Jol zeYzIogt?)go%q6~w2%Y=#SDPMS^+D`I3n(!$P_bwDr2)gWhID)c*>mEEP%t~L~{7B z5YgdQv_oq9N%)5#MNGk>nX-tBxseo+6TLY?kQc2efghg>lkp^FLd)UL6O|JjDT`=f^{xLj}$;v$(c6>*VqO9ragaz1?}165E(peQ}jlPluz z{3%?dpvo-pHdZ8H#hK+wCy)n1J_06-qlio?QGu4Tl|J;(KGyg@_^8aNDA_EcFgoNY zhXt$b7qV;0)9=U(15{uVup*m;oCP8kWOGB~C`_0`##`ZRF;;jC9_Nd*C0gN$_}wI6 z8Al}o#f%fgVZtEf3xYhdGL1;Z5N(ZgBeI3d8B1akpy(u(&RT3+C5rSdSqo8q{0ES= zn$;_Ip-`**+$j5eMZIsNeNevDdX#75vxWMey!XXEx~trRnm4?HBt9d1)E`vr)I9kw zqld?nl4uDFGFcdHBg@o$N8m`={wzBg!6mT_wMRdSH4pI}h9BXAxp{&o9o$Q!72?ynd0 z?cQ(J5O2R5wRYZwken`;iUzB%WzW=w^R?@ox(j?>9EDqtY)Uvi+W9n$Hcaq^NC$~u zogR)}+c`B;+uIZ9XWZuY<|THhzkRB=j5y>~SEIRe;ck4=$d0QM_QRqcUL1>Edic(6 z-SN_xN3nZ175zMV@!k}p+)V+=aQj2Hvqpozz^DIn{#XXv?addfFFy?Fj@ zm9g^wYnD6jy(h$q&ZMW6tZLD9ak6Rp$3oV^p}vZKZpNv;hOQVqR$O&@`rsptJ2#VW zw-g5e-`AR)D~RXC(lj>q9B7Ve)onPL2?Of}o43y2Tl+O#d#irb^=D2z8nhAHS-Sl@ zOwkVu-4G$Bd0aB(N^4K?cc3xuH#ELZ2!3}~;+|FNYnb^efN6g$MRW7v^u#FIv&o}8 z24r#h7BfxCI(%=nGEBt-3lM=u22C`J|L|axPy3I?O-$|Nh5Vm$+IG9_qZJ;FUj^q* z?yG3d-gbMIWYFF&t4z#gWl5!YSdenov3?ujN41UX{--u5A?aLt!(?pZ#@ zwjQ-e=35!{_4UWT>8cq~*R)v^zPe&&K@VW6^62s98D){&FCY&K>qzme!N7wZ|x@2D1#lLP%Wlm-`4COk`jL9Ce z2h%3CyBIe5=Hs!KEo;kT>~rj#9V|DrhcpG_Ew^R_OGC^mOzV#rIW(92Q}{;Lu+o5Q z`=ls)Vv87)v6E0}R8)|5HPY3h#MNEiG>|dY-I414T2`^z`Cw#z+I)RLdVgP)=A~Gd zin)P(HRC!3ffId9^}CP14NvuWBE4kpUy^8hML3dI`?e;K%X?|x69G!#J*Lw!x$0AA zN*Cl66VzW0P|c)Cb~$lBw$kG}A-1I-#^!P2{RyYvL*yJwbC7a%7NS`Hz y>9yZ&H7xVFMG0`=7p@lCzC;a$!T;UmAl}>Z;)~5$YF7b8Y;MjTlyb-5l>Y%Ajmf$I literal 0 HcmV?d00001 diff --git a/doc/images/wiki/ui/general/setup/menu_setup_date_time.png b/doc/images/wiki/ui/general/setup/menu_setup_date_time.png new file mode 100644 index 0000000000000000000000000000000000000000..aea569345456aec360c18702bd9973bc39b3c694 GIT binary patch literal 2512 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 O(A*ArQ>q=K(*F;TZOfDZ literal 0 HcmV?d00001 diff --git a/doc/images/wiki/ui/general/setup/menu_setup_touch.png b/doc/images/wiki/ui/general/setup/menu_setup_touch.png new file mode 100644 index 0000000000000000000000000000000000000000..6478fe990973c94c7e21fd8589e37c662b666b2d GIT binary patch literal 2516 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 qe Date: Sun, 21 Feb 2016 18:32:11 -0800 Subject: [PATCH 097/164] Receiver frequency keypad documentation image. --- doc/images/wiki/ui/audio/frequency_keypad.png | Bin 0 -> 2638 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/images/wiki/ui/audio/frequency_keypad.png diff --git a/doc/images/wiki/ui/audio/frequency_keypad.png b/doc/images/wiki/ui/audio/frequency_keypad.png new file mode 100644 index 0000000000000000000000000000000000000000..731a3eb9ea6f9a0c692b89a5be940adf0c7697e5 GIT binary patch literal 2638 zcma)72~<;O7JeuSrh^I$i-?kj>dfebEFh6g5`-YQfk@e;!xBOQfg~?Y9wwAU3N8f^ zq&lSs5M-<{6~$5@Sk^(Ng(+KD>VRP_SlI%UB`k$7F99?%c+TXUz7rS_;E(!qPJ$>a@ z14z#_1^~^&EO&3n+xZ-k4stALL0}-mLd4<0(Evaa5n+?VfM`e&hs_lbMP!sJf(YA6 zHwJ}Ng+O6sl((}hk_z$}$YT~(7FZMofkYxn{2(UL&B1XU4zI|l5D4NCF&LpxXd$$; z0QtcfoQ;hQ28+kw@n|>#Er{SkG!dFBFkd@l;~WQufX-*}AQs3)D$k__g5eMug;El| z{;cH*v6yd|xPo+!Fu0Ha z#^JW4gKPU5_*Rl48gGqERm3%IBxUAAH--RYhbv3q!DT@dJV_;Jv-?d&)=*TC!{ajq z0vJX)whmGEZI1VTLqj2KaHu;s1J3hVuu_^bFA8p*K;5@F{^C{y>P|I)vh+k(mWaXj zc3{B;RjI&RVM&-RcQzxbARFX=$fMC2%FI*{HP_~770<;tJeK&kc+_^(kU?~!AUrUX zL5I}t3%)f~_uJEgF=}oSX3J<2+zUi!Fo?yBaG*g93LcBIMq}}4JkA|=oQTB}aqu;4 zic!lzxkKeMXb{ME2SGMPC4-|}A}!%*T*sb>J4tDOM7qXrK{zKyLV=t6Mto|X_GVgxgxx~2GTPNf`)e|yS$v=a;+k6U) z>Z78g(M!vdlatiwRl@aKUwlv=J6%?AmgN!IlX0tE-1joO{M6T-y)p$PXRB`(ws_5yEx6zWxi(K6&t`qwDNn7Oe2m&j`-AOtlH58DlLyF)?~x{~8Y* z_o8RpR!yYU`1e+sbrdGIUve<9`Qh;OgoMD>->t|mH6HB9%pv?H?ycMo7;04pM)(!q zJMuS#d0m6z2TIk1L0;9LIOD~&om~lqMX0mj>d#492EoIRd%rEIGb3oI{tmYIaTy-{ zoMd&#UD9(`#t}vOj%DO(o7lzQvy&i0GQrVd7-hP?4)#P zdjA+A@1&gn)s6C>DxVLd`>orjQjbyT*Tkgk;9M(e(I9YOpe7TfFUl%Cx_v6Paf5~= zgqxZNWQ&CU>A%i@Gy3(grP~#)srw_JVG!|uZqdlT`fMd&2VAND&2=M-g+by%Ls-Do zYqi=X_Cle!bU;>OPgm)*lc-gB-86?Ko1PfSHy~GkihA}SZje3xKz_9;%uh6<*RK;0 zpYLjY`EhHR(NY14|MYYAV2h&5;CPcn=b-zZ{+&+Au?>Pgs5m{p@wQff}Avv?%o z`Q&&GPc+M|D=Ixhl1$g`X}yJ1WmoGaEnV4N^EhtBFHqiyJf5pCw)G$TNYJ!Xme|L( z`031|-iTg)tC-*^F=VDA%FGT?eV_S-qFW?>bM5^%o@qP3k{Sm;e<N6A`kZ&aJ7i&rx)IT60vtUQ{ol1E0^#hrK|qaeQN{u ju6(>Ez10Rdc1fWToJII`ap}~Ya-vV4ba5!K4~Y9O` Date: Sun, 21 Feb 2016 20:49:40 -0800 Subject: [PATCH 098/164] Moved Wiki images to wiki repo. I had no idea I could do that! --- doc/images/wiki/hackrf_one_decase_youtube.jpg | Bin 26646 -> 0 bytes doc/images/wiki/portapack_encase_youtube.jpg | Bin 32657 -> 0 bytes doc/images/wiki/portapack_stacking_youtube.jpg | Bin 32626 -> 0 bytes doc/images/wiki/ui/audio/am_dsb.png | Bin 45520 -> 0 bytes doc/images/wiki/ui/audio/am_lsb.png | Bin 28731 -> 0 bytes doc/images/wiki/ui/audio/frequency_keypad.png | Bin 2638 -> 0 bytes doc/images/wiki/ui/audio/nfm_11k_noaa.png | Bin 49626 -> 0 bytes doc/images/wiki/ui/audio/nfm_8k5_70cm.png | Bin 41196 -> 0 bytes doc/images/wiki/ui/audio/rx_controls.png | Bin 18368 -> 0 bytes doc/images/wiki/ui/audio/rx_levels.png | Bin 9185 -> 0 bytes doc/images/wiki/ui/audio/waterfall.png | Bin 64116 -> 0 bytes doc/images/wiki/ui/audio/wfm.png | Bin 71953 -> 0 bytes doc/images/wiki/ui/digital/ais/ais_detail.png | Bin 3420 -> 0 bytes doc/images/wiki/ui/digital/ais/ais_recents.png | Bin 3939 -> 0 bytes doc/images/wiki/ui/digital/ert/ert_recents.png | Bin 32135 -> 0 bytes .../wiki/ui/digital/tpms/tpms_recents.png | Bin 20308 -> 0 bytes doc/images/wiki/ui/general/about/about.png | Bin 2750 -> 0 bytes doc/images/wiki/ui/general/hackrf_mode.png | Bin 3183 -> 0 bytes doc/images/wiki/ui/general/menu_top_about.png | Bin 2440 -> 0 bytes doc/images/wiki/ui/general/menu_top_debug.png | Bin 2424 -> 0 bytes doc/images/wiki/ui/general/menu_top_hackrf.png | Bin 2419 -> 0 bytes .../wiki/ui/general/menu_top_receiver.png | Bin 2438 -> 0 bytes doc/images/wiki/ui/general/menu_top_setup.png | Bin 2425 -> 0 bytes .../ui/general/setup/antenna_bias_voltage.png | Bin 3270 -> 0 bytes doc/images/wiki/ui/general/setup/date_time.png | Bin 2608 -> 0 bytes .../ui/general/setup/frequency_correction.png | Bin 2332 -> 0 bytes .../setup/menu_setup_antenna_bias_voltage.png | Bin 2530 -> 0 bytes .../ui/general/setup/menu_setup_date_time.png | Bin 2512 -> 0 bytes .../setup/menu_setup_frequency_correction.png | Bin 2546 -> 0 bytes .../wiki/ui/general/setup/menu_setup_touch.png | Bin 2516 -> 0 bytes doc/images/wiki/ui/general/status_bar.png | Bin 16796 -> 0 bytes doc/images/wiki/windows/gpl_v2_accept_win81.png | Bin 24470 -> 0 bytes ...stall_device_firmware_sharebrained_win81.png | Bin 19689 -> 0 bytes .../wiki/windows/installer_finished_win81.png | Bin 11207 -> 0 bytes .../portapack_firmware_install_cmd_win81.png | Bin 12709 -> 0 bytes doc/images/wiki/windows/program_group_win81.png | Bin 9229 -> 0 bytes .../uac_installer_sharebrained_win81.png | Bin 24675 -> 0 bytes 37 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 doc/images/wiki/hackrf_one_decase_youtube.jpg delete mode 100644 doc/images/wiki/portapack_encase_youtube.jpg delete mode 100644 doc/images/wiki/portapack_stacking_youtube.jpg delete mode 100644 doc/images/wiki/ui/audio/am_dsb.png delete mode 100644 doc/images/wiki/ui/audio/am_lsb.png delete mode 100644 doc/images/wiki/ui/audio/frequency_keypad.png delete mode 100644 doc/images/wiki/ui/audio/nfm_11k_noaa.png delete mode 100644 doc/images/wiki/ui/audio/nfm_8k5_70cm.png delete mode 100644 doc/images/wiki/ui/audio/rx_controls.png delete mode 100644 doc/images/wiki/ui/audio/rx_levels.png delete mode 100644 doc/images/wiki/ui/audio/waterfall.png delete mode 100644 doc/images/wiki/ui/audio/wfm.png delete mode 100644 doc/images/wiki/ui/digital/ais/ais_detail.png delete mode 100644 doc/images/wiki/ui/digital/ais/ais_recents.png delete mode 100644 doc/images/wiki/ui/digital/ert/ert_recents.png delete mode 100644 doc/images/wiki/ui/digital/tpms/tpms_recents.png delete mode 100644 doc/images/wiki/ui/general/about/about.png delete mode 100644 doc/images/wiki/ui/general/hackrf_mode.png delete mode 100644 doc/images/wiki/ui/general/menu_top_about.png delete mode 100644 doc/images/wiki/ui/general/menu_top_debug.png delete mode 100644 doc/images/wiki/ui/general/menu_top_hackrf.png delete mode 100644 doc/images/wiki/ui/general/menu_top_receiver.png delete mode 100644 doc/images/wiki/ui/general/menu_top_setup.png delete mode 100644 doc/images/wiki/ui/general/setup/antenna_bias_voltage.png delete mode 100644 doc/images/wiki/ui/general/setup/date_time.png delete mode 100644 doc/images/wiki/ui/general/setup/frequency_correction.png delete mode 100644 doc/images/wiki/ui/general/setup/menu_setup_antenna_bias_voltage.png delete mode 100644 doc/images/wiki/ui/general/setup/menu_setup_date_time.png delete mode 100644 doc/images/wiki/ui/general/setup/menu_setup_frequency_correction.png delete mode 100644 doc/images/wiki/ui/general/setup/menu_setup_touch.png delete mode 100644 doc/images/wiki/ui/general/status_bar.png delete mode 100644 doc/images/wiki/windows/gpl_v2_accept_win81.png delete mode 100644 doc/images/wiki/windows/install_device_firmware_sharebrained_win81.png delete mode 100644 doc/images/wiki/windows/installer_finished_win81.png delete mode 100644 doc/images/wiki/windows/portapack_firmware_install_cmd_win81.png delete mode 100644 doc/images/wiki/windows/program_group_win81.png delete mode 100644 doc/images/wiki/windows/uac_installer_sharebrained_win81.png diff --git a/doc/images/wiki/hackrf_one_decase_youtube.jpg b/doc/images/wiki/hackrf_one_decase_youtube.jpg deleted file mode 100644 index 0889aa41fd63de95dfb541eefe1da3bde6a14900..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26646 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 DVGa8H diff --git a/doc/images/wiki/portapack_encase_youtube.jpg b/doc/images/wiki/portapack_encase_youtube.jpg deleted file mode 100644 index 8e06c2ecbea6309f7e61df941590669c3a1d379f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32657 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 aUV?@sm1I)<*r|RgfiLMWm^Q)n)c*o@n-!k` diff --git a/doc/images/wiki/portapack_stacking_youtube.jpg b/doc/images/wiki/portapack_stacking_youtube.jpg deleted file mode 100644 index 3f4209629dae736458b3ea2782e5c101d5697b1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32626 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 F{vR9|Qw0D3 diff --git a/doc/images/wiki/ui/audio/am_dsb.png b/doc/images/wiki/ui/audio/am_dsb.png deleted file mode 100644 index f946e036c038cb4b429745284e40998fdd739ef1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45520 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 IM6N<$f;vmH8UO$Q diff --git a/doc/images/wiki/ui/audio/am_lsb.png b/doc/images/wiki/ui/audio/am_lsb.png deleted file mode 100644 index 4ca9fd8491ce34e7b37a2ff2a1417822a7d27e28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28731 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%0A$@(7*8AEG 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 diff --git a/doc/images/wiki/ui/audio/nfm_8k5_70cm.png b/doc/images/wiki/ui/audio/nfm_8k5_70cm.png deleted file mode 100644 index c496945f00b2bc97b1f9b361bd809716711e0770..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41196 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 diff --git a/doc/images/wiki/ui/audio/rx_controls.png b/doc/images/wiki/ui/audio/rx_controls.png deleted file mode 100644 index 9e3b68d34a72b3a816df46a225dcbc2e16ed5fc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18368 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 Q1xlgGNGOVDiR!=oKLW7YBme*a diff --git a/doc/images/wiki/ui/audio/rx_levels.png b/doc/images/wiki/ui/audio/rx_levels.png deleted file mode 100644 index 70e73880c8b3df7b13671254602467d2d795dd2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9185 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 O 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 diff --git a/doc/images/wiki/ui/digital/ais/ais_detail.png b/doc/images/wiki/ui/digital/ais/ais_detail.png deleted file mode 100644 index 6d8dc061816d4ad622f85df483b9c18b3e2bfb2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3420 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 GzWO)FW{GnE diff --git a/doc/images/wiki/ui/digital/ais/ais_recents.png b/doc/images/wiki/ui/digital/ais/ais_recents.png deleted file mode 100644 index 71b245bdb16ae4daaa5244de2f8751cb54fb020b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3939 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 C&3V26 diff --git a/doc/images/wiki/ui/digital/ert/ert_recents.png b/doc/images/wiki/ui/digital/ert/ert_recents.png deleted file mode 100644 index 4c6565d58811a088ad57b465f9a2407eb9a8af3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32135 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

70w}ItRs{Ag_pJGeW`jWJ-v#DlHQE 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 a;hh)>d|H2?`tHxEJ5wWb!`fR;QU3v3W*e*k diff --git a/doc/images/wiki/ui/general/about/about.png b/doc/images/wiki/ui/general/about/about.png deleted file mode 100644 index f54930fd535f61269d5336b6ea7e882c4f4e93d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2750 zcmbtUX;f3!8V!~TB0O<;iV7N|NGoK5AS6wKLKIO#D2g&jFoZxN2{+^h2q47TRS`kq z)d8y_q6I2EKzuR?5?0HQBBCHhMMkk)o~Pz31$+_u1d~o%`K5 zR~JVEy>)sp7|g(F55*07zlFiHcIYlrA*Tbhp_dlu=4cPgePrAVO_uQYc!Dt4(v_-P z3wHUc5e%lim2<#D=s|TRFaaKl;Scz+P$C{5V#8oW5dj+VSV9I|#N!5o1Q7|LW)PsU z3PvN~YKkz3gz%uc!W{qs3vP|Vp)d%t9vluQ3j6~IZj{~c<1HBm_cb z^zoXHQ^*PUWGoTqZ)B>Kzm@qjKW4=b6>!x#`7_ZhE{n$s z7J`rt`$apbwjYI`1u0_i=grhboX?G@ik#ra0s(HQss!%A93k0~s7`1h{HY@IDhGha z7qCDOl98?7OEj^Ce2-5yWSb8jn&3hKO~8RNWvJpJW8WKSVhj16Uoy}HH3X{C6I?kW z7T1HqfeNb5!V-reqQAJZQ0V}00l|JggUM1wrj}?x3)yNP&rd#9mY?}(tY|3xnFKJ@ z?;dd{0>+Yn zht6#QMp{v7 z{{XVyyQ&Z=47M2SMA>;j^it8<{PRt?APwgJMn(6s`=mhd^ zM#YRiX80I6{@I*TNsx`O>$_yIRmWOWc-Xk9rtd3Kw8|A zX)3L2&Wg6zwa!rzh;rS{=WLseGGZ0UAssI3{=;j&$U_3HQhI6kG-WbNplZAuT`W3*YLOpBD5_3&JxiEuhK&e(h?KK&iF=qCHx z;d+|>-3LA6{T&QiL%tjHmpztTJh- z_P)>lZlq}AIn!)|^B&@{q;2gpwT62mV@a1Mq+c_+<(Ywlb`#9b&Dx+ub>)6{sjO!@WQjGsLUazgozCr5u+djO!|HtmRg5qy&QSwQPnk6m5 zYQ*`mdg(4umtl0$@Q*ET+G^L##aC!kJL0H2+DmI@$0`xt4;q{#`Io#BMqUpcEjdOS zb&nbdXKy_bgMCbQmP+Tcd0L;xTzoS1F)ePeF4+Z_-*bFW4iF#J&fv}vdko1J;l3NP>ECQnh5>D^chs_xw& zDW~iF6(iq?tGB?*3EVUk&8Xdfz2nr2N$X!ueN#B&E&avl#Ik+)17T5rW#H0Z|5=?z zBoXU$ZjBBXO7Z`)OL$b&$Xa~IHX@2pH1qHKmmAJJr`?Uci1Ma^b6)l0Ac`(e8*;3C~&F-_reEwEnxf zB|p6&K4=xnf+s!N590#EEdF8E?3CyG_MmD0l^e`6O61Qe!9xlVDeV%t-0v)Q=(}Kb zG~L%JJ+tvF&un=k{To&FS|`_z=Y4gytj$XlcPYPpDk!CL{7|CVob$-UdhfZ?z2?w!skN%X2o^hZ)EzY0(X9HoHiOPkm}j#-u*>G*k%P zrl!*V`?D9Cj)v#z5A>qS`i39oUCWc4esByZm)Go1!cNXiNCT>iK{Z6a}A-YbljMI=8(9?WPBh)7SrEm)0&g( zMG{`Y)cKD5Idy69;GvuiC4u4D*%Bs6*qdNGxc&5*YjHJ#?Wm1mxfK$3pU~v7`g;z2 zNfwGd0I$~dn$?@&wY2r9cDIuywu6FfL=t6+UDCVaLVBhTUF_J^UY9-*-I{7qEYumv z*;ZAxE>Y(A$_hRAXz7`}Jn_rhZRiY{!{DXt0w1w!Y;=bKe^~BVE`RZ4ESH?tZTE)_ z&E34qj-Imgo-AZ*7iacepz+0*IU|uh42NERCqm9mb2kZ_hQ|+7)XLnmV;5^S&5_C8 zvC8R7FOJxi#YErkM(-l0(tarInV2YgzCWtCM3-$?55K;1$L8xC1u3w_zvh^Uf$8m!53^L3f|>c&OWk=T@&*_Dl@#B}xvrC*8Pl1Rv6-X`tfV*pQ>4Ytw@@P8g-^ef)#5N+-$ Te?YOtDz(!t7fP=EkrV#~RfJp~ diff --git a/doc/images/wiki/ui/general/hackrf_mode.png b/doc/images/wiki/ui/general/hackrf_mode.png deleted file mode 100644 index 6cb92d4895472f34b72a72ae8c3c3c36ac95f82a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3183 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 Sv9azE$R1BuKbLh*2~7a$JA(57 diff --git a/doc/images/wiki/ui/general/menu_top_hackrf.png b/doc/images/wiki/ui/general/menu_top_hackrf.png deleted file mode 100644 index e14df632b695c639467cf2591d31dddd3aa9bbd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2419 zcmb_ceN<9s7)K>Ynvv^xj;SRxb2}RHp;lgjQCeh_I`gZKA%rLta0#vgW;*hSE3LI^ zZkiu>I@C0$wKR*S&DG}V!*;jj+;VPn1;bL)vd zbHP+pdSfuyAW2dhl(uOjAOvNhf(&qnC{!a;Al4WRLjxdNnFtb)G%~4N1!$N7b_)R6 zqhd+`$!-GeVg{sbN+3mpN)ag{G(40Vz#@=HB!)606G)6%=YS(8W`G!i6aa;yR;xqR zVWFThi$aTxjHFQM6gr)ZSddj(IV8}K<*KDqPG0(n5vhbqi2{;8+O24xDR zNTotxtOy6hSvJ!?ZJLI)@+F6}a3&yLDM2z7pmDKi4gzP{O#3af5jYE-0BGrf1c^o@ zO^cBr1+`~E52rFHvub7{qd_UC+^i4?MQCJph?8ihwVh|nG*1})Up!74CuD{YP-XAf zDH1|X{X)8C|NGYnvM5es24z-j2J$Zeo4^c7rZz?ZiCA7i8?!n|b7!dUf&4go0WKl%@(bT>8;q6@gg*(MxR#7Y*4KOY9ya+O)t$NV z`IjY}Wi{Te9utJ|F`M-H-_=ELbEMB~J(3sr6X*9>Ch|tvFP=|KK7MfI4KI`Vhx{jV zCe=rq3R3r$RM|eg^PygvYDfZfpFNoRu}X+fK2YxQ|BIsd=}egQ0li%_R8un&w3vUB$9q58jI|<0SdQYHpu4 zVHFwv>$@h86nb)tjXR7<|5ekl`B}M* zkOgA>9ANYQG0D8#KknsXD;f*GI$IuxGiBB2Zd1GKV~-pmbJ}&DVwBtdyw_jKFsDd< zeQr`EQzN@lxA~Tq@~P55t#D`=?P|!|m+{Sb;FE7i-Y&eTJ-XiAVW-TWR<$opuN`YD z7LYs3bu8JMq-MXYRI&B?c&6gFU`R!*sw`ulTy%JVf8<~`T$oAHJ{&d&^O;BZRF*^-Gx5@f+`U^n00V4L{=U6cDb&Z5YI@tgdVfhAn1( zzTx9X3}3FTC#2=GqOw9_uZmqE$T?K}JK9B69@I`&Rax!;3ocTw5+Tf0})x&6HOYA~FaW;hLiI?DlkQF)!U z?CP=fTyc>4TiZe(FkTkAyR5M3sXNBi!_~vVHgfhC%+X6m8(h0AhlurAhc^}Q4t<>@ z+#U!UpX~v0t^FsTC_z^^dUeUd^|aSI4rkpOp|Rd#l&F==8hP z5eSvvAYLA0@DwkwzgVAPe{1JmPsYuVw$ag4iFPc<(|XRW&6cpwQ*50J!Ni7|+&w4Q zVPyDto78Wd-!H5ulb7<&m3=TITy9bA&Fel5CTEKwa7(Wxob#55^|Z486@DP6-!-I zU}albBT6{fYODuvw;XOENG)YKEEuGS1;bUBxC+RDB3{{<0Ge{>&(55jZ@%Yyp6_|z z_nUW;AGJG-VB=_m!C(kG!$V?_@d*aAhGlJmA}7A2@A$lb~!&pCTr#4@el^H z&K~`(!Kg|dFc|C>QEVI>7x5{b3ra~G9+=7}DW!6RjlnRKbmURWhdD&0R3d}u$^bVL zgN{6-FyKZsQDAX^TU4M`i(TLKv3Q0U#?Y zi-ItRJX2Jn( zZm7|lYcWn(l=jw11}&w9BnY4@fH#Q@tR~|tMZY6MSAJK<s;)7u}+5ddZ|16Y;KK;8v<1jrMmWruKJK9fTB_VFT9yeQtW-ZVOyLihG# z04q3V5uht<1)l?hidYboFimMl(J7INbR%+vD;Y~-27q>wS!XS_tqDc?mT7}1m%jl_ z8w_9d2>D_>+ZhrRtL&dJ6r>N3-?NIkIk-?jaFLL;aSghE-XAKx=^$3oU#eLvN5r7d8_e~6(E{A}Aola?QzH#n1i>&UU! zFaFlieEwppfT`Mj>Ej|#eTU5}UtOT5rKMpm_m<&U%Eo5u@y&W)jsE&LE+;In@|Dp} z23+)sX!~Wlt~K(A^B#5I=4_?fDP{cQ_Zu$9quD*~dN%apX!q%t z6YZX@^L`ec2h~AK_j=*G!n!Sb^iSZ%%w4CG`@X54pXy?_w2E{C-3NGB@gZ5{*M`F5 zFYtkc+=<2`Sq>YG2iP44zN>i|stQVuFnTWq&ygoVJ_&Z_-UoMzLi4izK0VL$Rl80RevW zp@pV9|J%*l+`p7-!ixIrdz5lz-e7c8qUFT-AF6}$JBNQd)w3Pf-{73|kx`@T`YCqd z*FTHJ#$@i*wr<7mpSH(f9kGr}Zo}6lpSKU(K5YDX!)3e$p~BM8Olsq4yk#4V{jUdG zhbQm;>{{65{CI683o2nv#r5w}N0*QMNUO4JXgtw%?R%^M-yr&md-YmJ^vi8adm_U= z(S?@(y(+sGppW3ZFLbpxewu<);qeVV=hC6#z0zdcamx~14x}3{tp74aUb%L5eeF8h zKC6bi9@aGQioVhFIZx-i4@akto_Sb){G{y(JpGEg=B#^4mAf!mJFGqU9uDg`Y3N;c zd~)lGuN}_bBK?!z9KoN8-hrptYeUuL?)sp>cOx$vt_%F$SqJw#p42e=s^{`@gt9)x zCc$w~<~leuaO3l{?)Jt6s2G@$$Evfc`p!Jwi&b@4G|4_28>`!T|BhGKVNIXoy@XoA gvfUpz-bj3DHRhk>po_|Xh1%@gu{)$P_(1Oe0b$seGXMYp diff --git a/doc/images/wiki/ui/general/menu_top_setup.png b/doc/images/wiki/ui/general/menu_top_setup.png deleted file mode 100644 index 4709495bb19de1c6c8fb6bcbc464dda249d8e642..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2425 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 diff --git a/doc/images/wiki/ui/general/setup/frequency_correction.png b/doc/images/wiki/ui/general/setup/frequency_correction.png deleted file mode 100644 index 2a0cf50a91fe701fab63c4f1800949ee4172eef0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2332 zcmb_cYfuwc7>$pjU{R}#P(h4AQB<-?*O1u40BV3GriN_HE+G(9swiqj zic%0m1bi`wf;955LeT+4L;(jM1q8J!DOiMP0bhY`0%~Nizq&K~xaXd8&-Z zj%8X92$O9E+yE@V+Y1asBFVgPBorpgBE>kHK%mP&{4)~9ctlyGP=taq21(BV@oyar zkcfH;wv|B&@b)9J5D83lBs-8PB*=tFB+@0}5uiVN?Wi0dF-Ti5Obh}*baXU1dIcGg z@Byleiwi)Z0W_LD&ag*gL>NzIFG6ib7WuFa8%Dz<0x>2)L`2=XyigwD00KJiLK|~CjhrtkyLUppI(ClecF4Y;N&_D_v#~6-51iBfP z1mREo6c#Kb!%O$>lO=7(X$R zJ=tztS!>UO9?40f8KJ4VZ^%~|QKC{t1)EJiY1E&&$-a1B`m*^>{cqw^?myoU_5Ph! zbXKb*KV7$Lrnvm~URJ;_axIgT7#Z~Dp&fJOa!`>Oy*;(?sF<~|_Hp}CXjT8Y{nDMU z58E7M#|-d}SxYxw+i&?5+V;o2yWdHLrT4pBhNm*xo@iI8H?quqX6AL-aUg5X$sc)i z&G~{=jv<|V|N7(_*^U@$1(=f?xIw1LTdS_Tb*_k386fY7vx3n(Ijrfz;uCF1eD69@ zc8I*R{AFvzsYB_vo*(Wt+uGpwt0m)QN=-@hKu2x!oxb3UPc3Yfh3bDW?rbFmi0bp!JUKCQCPP@v%BdZQj^E zxSczTSr%8Fm@gU*-FYlF(Yl42gGALO1rM3Z-If%_RhU2D(?KvHULlXMrB*i* z_tTD1b07L_^-(%>zt#jgWn`bcVXn9cLd~)MIZKS0o)2C)hORj=9|obfU1f2aqg+O_ z)6>MF)_zv^(KuI5?nd*hv)_Q5>V!9uioJPB65DL|wE3A$iduehf{1TAn~ct|+SGWV zZ;M(GKd+;1R&0LxrEaj1Q}QCX!qIhNQvLeQzqpKIwf2Hmk$h&6hRSqSHdnr@A-jZ{Rn3n*@N$ZoWyulg{gkxx!HcWHRf}p*i!7VTpH(wgW47!1 zpY_CP^&H0;C!B2?()b&ljFVqxwsmWxGZG56YfcSQfZN7b|DI`4k(75f6QJ$c&Nq@R z?5KV3QGV~bsZEX|h{d0-TA9{V+O^;kIcLy=xI5o_LDRJ}J@K{D;%82K(yX@Lvs5X{ zTP2@ak3V?Sd0d{A-TRI+Wl2I4S6+?g3|V$ox2V+pu}X*Iy@T>z4rXgtz-HRyxG{Gp z?9E?{4S&z2F*-{abB8YVeTyc!gg6ZwiC&Y?n+#P2V5X*mFtn`@xw}^@hkKn=p)e(A;@=Plg;c&>vS~FH9qVD=H^}h0^6TtcK`qY diff --git a/doc/images/wiki/ui/general/setup/menu_setup_antenna_bias_voltage.png b/doc/images/wiki/ui/general/setup/menu_setup_antenna_bias_voltage.png deleted file mode 100644 index ed9fa5e8160999b8962840d9525c286c56f39c8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2530 zcmd5+eK?fq9v&aHMJ{PO5wWv~)5pwfhSZEPi9vKmJ{waQV`eZJ^Nx33jO1fk)aEEh z+QgErlU8xcM=3k(sjROIE>4LZDb)~-Z29Q;I`0hCtjqp?-s^flp8L7)=l=bE&+~gv zdV09(Xc=muP$(U@{SQGFU6vPZy$4+FvSe zHPnRy0~AWrg6r!K`&0i$WPy=bCL0XlU`3GvgpERxL`38>k^?i*qDUTJNEF$dDj7uN zTLA;6Xe9-Xus8LmdZL{`h=bmRwZU4MlC{uiGznsd61^!dOLAmnZyFB60wMs!#>Qe} zt+5~!2H*$;0$_y)@OTWuzzE~`FjIu#3(Xc6`M3^+BV<8b0n7#YXvMnB5HK3HH#Jol zeYzIogt?)go%q6~w2%Y=#SDPMS^+D`I3n(!$P_bwDr2)gWhID)c*>mEEP%t~L~{7B z5YgdQv_oq9N%)5#MNGk>nX-tBxseo+6TLY?kQc2efghg>lkp^FLd)UL6O|JjDT`=f^{xLj}$;v$(c6>*VqO9ragaz1?}165E(peQ}jlPluz z{3%?dpvo-pHdZ8H#hK+wCy)n1J_06-qlio?QGu4Tl|J;(KGyg@_^8aNDA_EcFgoNY zhXt$b7qV;0)9=U(15{uVup*m;oCP8kWOGB~C`_0`##`ZRF;;jC9_Nd*C0gN$_}wI6 z8Al}o#f%fgVZtEf3xYhdGL1;Z5N(ZgBeI3d8B1akpy(u(&RT3+C5rSdSqo8q{0ES= zn$;_Ip-`**+$j5eMZIsNeNevDdX#75vxWMey!XXEx~trRnm4?HBt9d1)E`vr)I9kw zqld?nl4uDFGFcdHBg@o$N8m`={wzBg!6mT_wMRdSH4pI}h9BXAxp{&o9o$Q!72?ynd0 z?cQ(J5O2R5wRYZwken`;iUzB%WzW=w^R?@ox(j?>9EDqtY)Uvi+W9n$Hcaq^NC$~u zogR)}+c`B;+uIZ9XWZuY<|THhzkRB=j5y>~SEIRe;ck4=$d0QM_QRqcUL1>Edic(6 z-SN_xN3nZ175zMV@!k}p+)V+=aQj2Hvqpozz^DIn{#XXv?addfFFy?Fj@ zm9g^wYnD6jy(h$q&ZMW6tZLD9ak6Rp$3oV^p}vZKZpNv;hOQVqR$O&@`rsptJ2#VW zw-g5e-`AR)D~RXC(lj>q9B7Ve)onPL2?Of}o43y2Tl+O#d#irb^=D2z8nhAHS-Sl@ zOwkVu-4G$Bd0aB(N^4K?cc3xuH#ELZ2!3}~;+|FNYnb^efN6g$MRW7v^u#FIv&o}8 z24r#h7BfxCI(%=nGEBt-3lM=u22C`J|L|axPy3I?O-$|Nh5Vm$+IG9_qZJ;FUj^q* z?yG3d-gbMIWYFF&t4z#gWl5!YSdenov3?ujN41UX{--u5A?aLt!(?pZ#@ zwjQ-e=35!{_4UWT>8cq~*R)v^zPe&&K@VW6^62s98D){&FCY&K>qzme!N7wZ|x@2D1#lLP%Wlm-`4COk`jL9Ce z2h%3CyBIe5=Hs!KEo;kT>~rj#9V|DrhcpG_Ew^R_OGC^mOzV#rIW(92Q}{;Lu+o5Q z`=ls)Vv87)v6E0}R8)|5HPY3h#MNEiG>|dY-I414T2`^z`Cw#z+I)RLdVgP)=A~Gd zin)P(HRC!3ffId9^}CP14NvuWBE4kpUy^8hML3dI`?e;K%X?|x69G!#J*Lw!x$0AA zN*Cl66VzW0P|c)Cb~$lBw$kG}A-1I-#^!P2{RyYvL*yJwbC7a%7NS`Hz y>9yZ&H7xVFMG0`=7p@lCzC;a$!T;UmAl}>Z;)~5$YF7b8Y;MjTlyb-5l>Y%Ajmf$I diff --git a/doc/images/wiki/ui/general/setup/menu_setup_date_time.png b/doc/images/wiki/ui/general/setup/menu_setup_date_time.png deleted file mode 100644 index aea569345456aec360c18702bd9973bc39b3c694..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2512 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 O(A*ArQ>q=K(*F;TZOfDZ diff --git a/doc/images/wiki/ui/general/setup/menu_setup_touch.png b/doc/images/wiki/ui/general/setup/menu_setup_touch.png deleted file mode 100644 index 6478fe990973c94c7e21fd8589e37c662b666b2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2516 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 qe@?(S~E-6gm~2rj{bYjF97{PwwL-+j-m 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 From 7f663f7e0c4fa3c621035ebc14383bf7810fa3d6 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Mon, 22 Feb 2016 14:18:20 -0800 Subject: [PATCH 099/164] Remove unused code. --- firmware/application/ais_app.cpp | 31 ------------------------------- firmware/application/sd_card.cpp | 4 ---- 2 files changed, 35 deletions(-) diff --git a/firmware/application/ais_app.cpp b/firmware/application/ais_app.cpp index 95c7bd7d..7fde92a4 100644 --- a/firmware/application/ais_app.cpp +++ b/firmware/application/ais_app.cpp @@ -41,26 +41,6 @@ static std::string latlon_abs_normalized(const int32_t normalized, const char su return to_string_dec_uint(degrees) + "." + to_string_dec_uint(fraction, 6, '0') + suffix; } -static std::string latitude(const Latitude value) { - if( value.is_not_available() ) { - return "not available"; - } else if( value.is_valid() ) { - return latlon_abs_normalized(value.normalized(), "SN"); - } else { - return "invalid"; - } -} - -static std::string longitude(const Longitude value) { - if( value.is_not_available() ) { - return "not available"; - } else if( value.is_valid() ) { - return latlon_abs_normalized(value.normalized(), "WE"); - } else { - return "invalid"; - } -} - static std::string latlon(const Latitude latitude, const Longitude longitude) { if( latitude.is_valid() && longitude.is_valid() ) { return latlon_abs_normalized(latitude.normalized(), "SN") + " " + latlon_abs_normalized(longitude.normalized(), "WE"); @@ -77,17 +57,6 @@ static std::string mmsi( return to_string_dec_uint(mmsi, 9); } -static std::string datetime( - const ais::DateTime& datetime -) { - return to_string_dec_uint(datetime.year, 4, '0') + "/" + - to_string_dec_uint(datetime.month, 2, '0') + "/" + - to_string_dec_uint(datetime.day, 2, '0') + " " + - to_string_dec_uint(datetime.hour, 2, '0') + ":" + - to_string_dec_uint(datetime.minute, 2, '0') + ":" + - to_string_dec_uint(datetime.second, 2, '0'); -} - static std::string navigational_status(const unsigned int value) { switch(value) { case 0: return "under way w/engine"; diff --git a/firmware/application/sd_card.cpp b/firmware/application/sd_card.cpp index 78f8e287..cef4be93 100644 --- a/firmware/application/sd_card.cpp +++ b/firmware/application/sd_card.cpp @@ -39,10 +39,6 @@ FRESULT mount() { return f_mount(&fs, "", 0); } -FRESULT unmount() { - return f_mount(NULL, "", 0); -} - } /* namespace */ Signal status_signal; From 19609469a50ec25ca3c9c821eed5322e6e652227 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Mon, 22 Feb 2016 14:18:53 -0800 Subject: [PATCH 100/164] Quiet shift-overflow compiler warning. --- firmware/common/crc.hpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/firmware/common/crc.hpp b/firmware/common/crc.hpp index fdb43ba3..cc56597c 100644 --- a/firmware/common/crc.hpp +++ b/firmware/common/crc.hpp @@ -132,7 +132,10 @@ private: } static constexpr value_type mask() { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wshift-count-overflow" return (~(~(0UL) << width())); +#pragma GCC diagnostic pop } static value_type reflect(value_type x) { From 36c38e4a24d2742be37575d537df4c4e724515d0 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Mon, 22 Feb 2016 14:19:26 -0800 Subject: [PATCH 101/164] Quiet narrowing conversion warning. --- firmware/common/png_writer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/common/png_writer.cpp b/firmware/common/png_writer.cpp index 937e9d23..8a07326c 100644 --- a/firmware/common/png_writer.cpp +++ b/firmware/common/png_writer.cpp @@ -78,7 +78,7 @@ void PNGWriter::write_scanline(const std::array& scanline) constexpr uint32_t deflate_block_length = 1 + sizeof(scanline); const std::array deflate_and_scanline_header { - (scanline_count == (height - 1)) ? 0x01 : 0x00, // DEFLATE header bits, bfinal=0, btype=00 + static_cast((scanline_count == (height - 1)) ? 0x01 : 0x00), // DEFLATE header bits, bfinal=0, btype=00 static_cast((deflate_block_length >> 0) & 0xff), // Length LSB static_cast((deflate_block_length >> 8) & 0xff), // Length MSB static_cast((deflate_block_length >> 0) & 0xff) ^ 0xff, // ~Length LSB From 9c11fdf80c838c60ec7616aa40c5e44ebc80f0f7 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 23 Feb 2016 13:30:41 -0800 Subject: [PATCH 102/164] Explicit std::function nullptr checks. Eliminates std::function check which tries to "_ZSt25__throw_bad_function_callv", along with 816 bytes of extra code, including some locale/wlocale/moneypunct nonsense. --- firmware/baseband/clock_recovery.hpp | 7 ++++++- firmware/baseband/packet_builder.hpp | 9 +++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/firmware/baseband/clock_recovery.hpp b/firmware/baseband/clock_recovery.hpp index 91f4cf8f..9a6904a3 100644 --- a/firmware/baseband/clock_recovery.hpp +++ b/firmware/baseband/clock_recovery.hpp @@ -168,7 +168,12 @@ private: } void symbol_callback(const float symbol, const float lateness) { - symbol_handler(symbol); + // NOTE: This check is to avoid std::function nullptr check, which + // brings in "_ZSt25__throw_bad_function_callv" and a lot of extra code. + // TODO: Make symbol_handler known at compile time. + if( symbol_handler) { + symbol_handler(symbol); + } const float adjustment = error_filter(lateness); resampler.advance(adjustment); diff --git a/firmware/baseband/packet_builder.hpp b/firmware/baseband/packet_builder.hpp index e3293529..c8a9ea5b 100644 --- a/firmware/baseband/packet_builder.hpp +++ b/firmware/baseband/packet_builder.hpp @@ -89,8 +89,13 @@ public: } if( end(bit_history, packet.size()) ) { - packet.set_timestamp(Timestamp::now()); - payload_handler(packet); + // NOTE: This check is to avoid std::function nullptr check, which + // brings in "_ZSt25__throw_bad_function_callv" and a lot of extra code. + // TODO: Make payload_handler known at compile time. + if( payload_handler ) { + packet.set_timestamp(Timestamp::now()); + payload_handler(packet); + } reset_state(); } else { if( packet_truncated() ) { From a1b9f4aa1b202effcc3d200aaeea1c1882913954 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 23 Feb 2016 15:04:20 -0800 Subject: [PATCH 103/164] Simplify, generalize, share int16_t taps copy function. Also prevents compiler loop unrolling in non-critical code, for code size improvement. --- firmware/baseband/dsp_decimate.cpp | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/firmware/baseband/dsp_decimate.cpp b/firmware/baseband/dsp_decimate.cpp index 64243749..93dbc602 100644 --- a/firmware/baseband/dsp_decimate.cpp +++ b/firmware/baseband/dsp_decimate.cpp @@ -177,6 +177,20 @@ static inline uint32_t scale_round_and_pack( return __PKHBT(saturated_real, saturated_imag, 16); } +template +static void taps_copy( + const Tap* const source, + Tap* const target, + const size_t count, + const bool shift_up +) { + const uint32_t negate_pattern = shift_up ? 0b1110 : 0b0100; + for(size_t i=0; i> (i & 3)) & 1; + target[i] = negate ? -source[i] : source[i]; + } +} + // FIRC8xR16x24FS4Decim4 ////////////////////////////////////////////////// void FIRC8xR16x24FS4Decim4::configure( @@ -184,13 +198,7 @@ void FIRC8xR16x24FS4Decim4::configure( const int32_t scale, const Shift shift ) { - const int negate_factor = (shift == Shift::Up) ? -1 : 1; - for(size_t i=0; i Date: Tue, 23 Feb 2016 19:56:55 -0800 Subject: [PATCH 104/164] Hide BasebandThread::baseband_processor. --- firmware/baseband/baseband_thread.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/firmware/baseband/baseband_thread.hpp b/firmware/baseband/baseband_thread.hpp index 6da3c493..ab9f7bb8 100644 --- a/firmware/baseband/baseband_thread.hpp +++ b/firmware/baseband/baseband_thread.hpp @@ -42,9 +42,10 @@ public: Thread* thread_main { nullptr }; Thread* thread_rssi { nullptr }; - BasebandProcessor* baseband_processor { nullptr }; private: + BasebandProcessor* baseband_processor { nullptr }; + BasebandConfiguration baseband_configuration; void run() override; From 6101ca36cd4d935feb6f3f12b92fc857325917ba Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 23 Feb 2016 20:21:32 -0800 Subject: [PATCH 105/164] Use unique_ptr for baseband_buffer. --- firmware/baseband/baseband_thread.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/firmware/baseband/baseband_thread.cpp b/firmware/baseband/baseband_thread.cpp index 92b968f5..2065979d 100644 --- a/firmware/baseband/baseband_thread.cpp +++ b/firmware/baseband/baseband_thread.cpp @@ -85,7 +85,7 @@ void BasebandThread::run() { baseband_sgpio.init(); baseband::dma::init(); - const auto baseband_buffer = new std::array(); + const auto baseband_buffer = std::make_unique>(); baseband::dma::configure( baseband_buffer->data(), direction() @@ -119,8 +119,6 @@ void BasebandThread::run() { ); } } - - delete baseband_buffer; } BasebandProcessor* BasebandThread::create_processor(const int32_t mode) { From eb294c8e1c5a36db62b0e55b4908e84e189cfaa2 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sat, 27 Feb 2016 12:05:29 -0800 Subject: [PATCH 106/164] Add chDbgPanic for unhandled exceptions. --- .../os/ports/GCC/ARMCMx/LPC43xx_M4/vectors.c | 5 ++++- firmware/common/debug.cpp | 15 ++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M4/vectors.c b/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M4/vectors.c index 15881fec..7561b377 100755 --- a/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M4/vectors.c +++ b/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M4/vectors.c @@ -178,9 +178,12 @@ vectors_t _vectors = { __attribute__ ((naked)) #endif void _unhandled_exception(void) { - +#if CH_DBG_ENABLED + chDbgPanic("Unhandled"); +#else while (TRUE) ; +#endif } void NMIVector(void) __attribute__((weak, alias("_unhandled_exception"))); diff --git a/firmware/common/debug.cpp b/firmware/common/debug.cpp index 5ae27f7a..886abeaf 100644 --- a/firmware/common/debug.cpp +++ b/firmware/common/debug.cpp @@ -81,18 +81,27 @@ void port_halt(void) { #if defined(LPC43XX_M4) CH_IRQ_HANDLER(MemManageVector) { - CH_IRQ_PROLOGUE(); +#if CH_DBG_ENABLED + chDbgPanic("MemManage"); +#else chSysHalt(); +#endif } CH_IRQ_HANDLER(BusFaultVector) { - CH_IRQ_PROLOGUE(); +#if CH_DBG_ENABLED + chDbgPanic("BusFault"); +#else chSysHalt(); +#endif } CH_IRQ_HANDLER(UsageFaultVector) { - CH_IRQ_PROLOGUE(); +#if CH_DBG_ENABLED + chDbgPanic("UsageFault"); +#else chSysHalt(); +#endif } #endif From bf348cf30af24e9afc4e21ab3eece4cadaf37645 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sat, 27 Feb 2016 21:07:11 -0800 Subject: [PATCH 107/164] Move message handling loops to MessageQueue. --- firmware/application/event_m0.cpp | 5 ++--- firmware/baseband/event_m4.cpp | 8 +++----- firmware/common/message_queue.hpp | 9 +++++++++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/firmware/application/event_m0.cpp b/firmware/application/event_m0.cpp index c4ab32a7..023f06f4 100644 --- a/firmware/application/event_m0.cpp +++ b/firmware/application/event_m0.cpp @@ -134,10 +134,9 @@ void EventDispatcher::dispatch(const eventmask_t events) { } void EventDispatcher::handle_application_queue() { - std::array message_buffer; - while(Message* const message = shared_memory.application_queue.pop(message_buffer)) { + shared_memory.application_queue.handle([](Message* const message) { message_map().send(message); - } + }); } void EventDispatcher::handle_rtc_tick() { diff --git a/firmware/baseband/event_m4.cpp b/firmware/baseband/event_m4.cpp index 0e90cd15..797ef5cb 100644 --- a/firmware/baseband/event_m4.cpp +++ b/firmware/baseband/event_m4.cpp @@ -86,11 +86,9 @@ void EventDispatcher::dispatch(const eventmask_t events) { } void EventDispatcher::handle_baseband_queue() { - std::array message_buffer; - while(Message* const message = shared_memory.baseband_queue.peek(message_buffer)) { - on_message(message); - shared_memory.baseband_queue.skip(); - } + shared_memory.baseband_queue.handle([this](Message* const message) { + this->on_message(message); + }); } void EventDispatcher::on_message(const Message* const message) { diff --git a/firmware/common/message_queue.hpp b/firmware/common/message_queue.hpp index baba13ef..f8920e1b 100644 --- a/firmware/common/message_queue.hpp +++ b/firmware/common/message_queue.hpp @@ -82,6 +82,15 @@ public: return fifo.is_empty(); } + template + void handle(HandlerFn handler) { + std::array message_buffer; + while(Message* const message = peek(message_buffer)) { + handler(message); + skip(); + } + } + private: FIFO fifo; Mutex mutex_write; From 0fae1488c4c29be34f0dada1f1130c1837011a09 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sat, 27 Feb 2016 21:19:51 -0800 Subject: [PATCH 108/164] Hide most of MessageQueue functions. --- firmware/common/message_queue.hpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/firmware/common/message_queue.hpp b/firmware/common/message_queue.hpp index f8920e1b..2fe12f0a 100644 --- a/firmware/common/message_queue.hpp +++ b/firmware/common/message_queue.hpp @@ -60,6 +60,19 @@ public: return result; } + template + void handle(HandlerFn handler) { + std::array message_buffer; + while(Message* const message = peek(message_buffer)) { + handler(message); + skip(); + } + } + +private: + FIFO fifo; + Mutex mutex_write; + Message* peek(std::array& buf) { Message* const p = reinterpret_cast(buf.data()); return fifo.peek_r(buf.data(), buf.size()) ? p : nullptr; @@ -82,19 +95,6 @@ public: return fifo.is_empty(); } - template - void handle(HandlerFn handler) { - std::array message_buffer; - while(Message* const message = peek(message_buffer)) { - handler(message); - skip(); - } - } - -private: - FIFO fifo; - Mutex mutex_write; - bool push(const void* const buf, const size_t len) { chMtxLock(&mutex_write); const auto result = fifo.in_r(buf, len); From 6571ef0c11c4f55a1a279a7810fba2ffe79d9f8b Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sat, 27 Feb 2016 21:20:16 -0800 Subject: [PATCH 109/164] Prevent alternate MessageQueue constructors. --- firmware/common/message_queue.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/firmware/common/message_queue.hpp b/firmware/common/message_queue.hpp index 2fe12f0a..76404be0 100644 --- a/firmware/common/message_queue.hpp +++ b/firmware/common/message_queue.hpp @@ -34,6 +34,10 @@ using namespace lpc43xx; class MessageQueue { public: + MessageQueue() = delete; + MessageQueue(const MessageQueue&) = delete; + MessageQueue(MessageQueue&&) = delete; + MessageQueue( uint8_t* const data, size_t k From b7c0efbb64dce5dc5502a5cb51c1c4bd07a82f77 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 6 Apr 2016 16:16:10 -0700 Subject: [PATCH 110/164] Add ERT commodity type. --- firmware/application/ert_app.cpp | 13 +++++++++--- firmware/application/ert_app.hpp | 35 +++++++++++++++++++++++++++----- firmware/common/ert_packet.cpp | 10 +++++++++ firmware/common/ert_packet.hpp | 9 +++++--- 4 files changed, 56 insertions(+), 11 deletions(-) diff --git a/firmware/application/ert_app.cpp b/firmware/application/ert_app.cpp index 74080b5f..938aef9d 100644 --- a/firmware/application/ert_app.cpp +++ b/firmware/application/ert_app.cpp @@ -51,6 +51,10 @@ std::string consumption(Consumption value) { return to_string_dec_uint(value, 10); } +std::string commodity_type(CommodityType value) { + return to_string_dec_uint(value, 2); +} + } /* namespace format */ } /* namespace ert */ @@ -68,6 +72,8 @@ void ERTLogger::on_packet(const ert::Packet& packet) { } } +const ERTRecentEntry::Key ERTRecentEntry::invalid_key { }; + void ERTRecentEntry::update(const ert::Packet& packet) { received_count++; @@ -76,8 +82,9 @@ void ERTRecentEntry::update(const ert::Packet& packet) { namespace ui { -static const std::array, 3> ert_columns { { +static const std::array, 4> ert_columns { { { "ID", 10 }, + { "Tp", 2 }, { "Consumpt", 10 }, { "Cnt", 3 }, } }; @@ -111,7 +118,7 @@ void RecentEntriesView::draw( ) { const auto& draw_style = is_selected ? style.invert() : style; - std::string line = ert::format::id(entry.id) + " " + ert::format::consumption(entry.last_consumption); + std::string line = ert::format::id(entry.id) + " " + ert::format::commodity_type(entry.commodity_type) + " " + ert::format::consumption(entry.last_consumption); if( entry.received_count > 999 ) { line += " +++"; @@ -176,7 +183,7 @@ void ERTAppView::on_packet(const ert::Packet& packet) { } if( packet.crc_ok() ) { - recent.on_packet(packet.id(), packet); + recent.on_packet({ packet.id(), packet.commodity_type() }, packet); recent_entries_view.set_dirty(); } } diff --git a/firmware/application/ert_app.hpp b/firmware/application/ert_app.hpp index 560e0228..e280f379 100644 --- a/firmware/application/ert_app.hpp +++ b/firmware/application/ert_app.hpp @@ -33,13 +33,37 @@ #include #include +struct ERTKey { + ert::ID id; + ert::CommodityType commodity_type; + + constexpr ERTKey( + ert::ID id = ert::invalid_id, + ert::CommodityType commodity_type = ert::invalid_commodity_type + ) : id { id }, + commodity_type { commodity_type } + { + } + + ERTKey& operator=(const ERTKey& other) { + id = other.id; + commodity_type = other.commodity_type; + return *this; + } + + bool operator==(const ERTKey& other) const { + return (id == other.id) && (commodity_type == other.commodity_type); + } +}; + struct ERTRecentEntry { - using Key = ert::ID; + using Key = ERTKey; // TODO: Is this the right choice of invalid key value? - static constexpr Key invalid_key = 0; + static const Key invalid_key; - ert::ID id { invalid_key }; + ert::ID id { ert::invalid_id }; + ert::CommodityType commodity_type { ert::invalid_commodity_type }; size_t received_count { 0 }; @@ -47,12 +71,13 @@ struct ERTRecentEntry { ERTRecentEntry( const Key& key - ) : id { key } + ) : id { key.id }, + commodity_type { key.commodity_type } { } Key key() const { - return id; + return { id, commodity_type }; } void update(const ert::Packet& packet); diff --git a/firmware/common/ert_packet.cpp b/firmware/common/ert_packet.cpp index 06e010dd..3fcf0ede 100644 --- a/firmware/common/ert_packet.cpp +++ b/firmware/common/ert_packet.cpp @@ -63,6 +63,16 @@ Consumption Packet::consumption() const { return invalid_consumption; } +CommodityType Packet::commodity_type() const { + if( type() == Type::SCM ) { + return reader_.read(5, 4); + } + if( type() == Type::IDM ) { + return reader_.read(4 * 8 + 4, 4); + } + return invalid_commodity_type; +} + ManchesterFormatted Packet::symbols_formatted() const { return format_manchester(decoder_); } diff --git a/firmware/common/ert_packet.hpp b/firmware/common/ert_packet.hpp index f0bb3a13..0a053536 100644 --- a/firmware/common/ert_packet.hpp +++ b/firmware/common/ert_packet.hpp @@ -33,6 +33,11 @@ namespace ert { using ID = uint32_t; using Consumption = uint32_t; +using CommodityType = uint32_t; + +constexpr ID invalid_id = 0; +constexpr CommodityType invalid_commodity_type = -1; +constexpr Consumption invalid_consumption = 0; class Packet { public: @@ -60,6 +65,7 @@ public: Type type() const; ID id() const; + CommodityType commodity_type() const; Consumption consumption() const; ManchesterFormatted symbols_formatted() const; @@ -74,9 +80,6 @@ private: const Reader reader_; const Type type_; - const ID invalid_id = 0; - const Consumption invalid_consumption = 0; - bool crc_ok_idm() const; bool crc_ok_scm() const; }; From 635b1fd4c3f6a18fcb86f6603db90240aab8f49f Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 6 Apr 2016 17:01:54 -0700 Subject: [PATCH 111/164] Extract TPMS packet stuff to separate files. --- firmware/application/Makefile | 1 + firmware/application/tpms_app.cpp | 83 ---------------- firmware/application/tpms_app.hpp | 118 +---------------------- firmware/common/tpms_packet.cpp | 129 +++++++++++++++++++++++++ firmware/common/tpms_packet.hpp | 155 ++++++++++++++++++++++++++++++ 5 files changed, 286 insertions(+), 200 deletions(-) create mode 100644 firmware/common/tpms_packet.cpp create mode 100644 firmware/common/tpms_packet.hpp diff --git a/firmware/application/Makefile b/firmware/application/Makefile index 6969eb19..a6bb3cb9 100755 --- a/firmware/application/Makefile +++ b/firmware/application/Makefile @@ -175,6 +175,7 @@ CPPSRC = main.cpp \ ../commom/ais_packet.cpp \ ais_app.cpp \ tpms_app.cpp \ + ../common/tpms_packet.cpp \ ert_app.cpp \ ../common/ert_packet.cpp \ sd_card.cpp \ diff --git a/firmware/application/tpms_app.cpp b/firmware/application/tpms_app.cpp index fb43e7d8..d83372f1 100644 --- a/firmware/application/tpms_app.cpp +++ b/firmware/application/tpms_app.cpp @@ -27,8 +27,6 @@ #include "string_format.hpp" -#include "crc.hpp" - #include "utility.hpp" namespace tpms { @@ -53,87 +51,6 @@ std::string temperature(Temperature temperature) { } /* namespace format */ -Timestamp Packet::received_at() const { - return packet_.timestamp(); -} - -ManchesterFormatted Packet::symbols_formatted() const { - return format_manchester(decoder_); -} - -Optional Packet::reading() const { - const auto length = crc_valid_length(); - - switch(length) { - case 64: - return Reading { - Reading::Type::FLM_64, - reader_.read(0, 32), - Pressure { static_cast(reader_.read(32, 8)) * 4 / 3 }, - Temperature { static_cast(reader_.read(40, 8) & 0x7f) - 50 } - }; - - case 72: - return Reading { - Reading::Type::FLM_72, - reader_.read(0, 32), - Pressure { static_cast(reader_.read(40, 8)) * 4 / 3 }, - Temperature { static_cast(reader_.read(48, 8)) - 50 } - }; - - case 80: - return Reading { - Reading::Type::FLM_80, - reader_.read(8, 32), - Pressure { static_cast(reader_.read(48, 8)) * 4 / 3 }, - Temperature { static_cast(reader_.read(56, 8)) - 50 } - }; - - default: - return { }; - } -} - -size_t Packet::crc_valid_length() const { - constexpr uint32_t checksum_bytes = 0b1111111; - constexpr uint32_t crc_72_bytes = 0b111111111; - constexpr uint32_t crc_80_bytes = 0b1111111110; - - std::array bytes; - for(size_t i=0; i crc_72 { 0x01, 0x00 }; - CRC<8> crc_80 { 0x01, 0x00 }; - - for(size_t i=0; i pressure = { }, - Optional temperature = { } - ) : type_ { type }, - id_ { id }, - pressure_ { pressure }, - temperature_ { temperature } - { - } - - Type type() const { - return type_; - } - - TransponderID id() const { - return id_; - } - - Optional pressure() const { - return pressure_; - } - - Optional temperature() const { - return temperature_; - } - -private: - Type type_ { Type::None }; - TransponderID id_ { 0 }; - Optional pressure_ { }; - Optional temperature_ { }; -}; - -class Packet { -public: - constexpr Packet( - const baseband::Packet& packet - ) : packet_ { packet }, - decoder_ { packet_, 0 }, - reader_ { decoder_ } - { - } - - Timestamp received_at() const; - - ManchesterFormatted symbols_formatted() const; - - Optional reading() const; - -private: - using Reader = FieldReader; - - const baseband::Packet packet_; - const ManchesterDecoder decoder_; - - const Reader reader_; - - size_t crc_valid_length() const; -}; - -} /* namespace tpms */ +#include "tpms_packet.hpp" namespace std { diff --git a/firmware/common/tpms_packet.cpp b/firmware/common/tpms_packet.cpp new file mode 100644 index 00000000..7b18622b --- /dev/null +++ b/firmware/common/tpms_packet.cpp @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "tpms_packet.hpp" + +#include "crc.hpp" + +namespace tpms { + +Timestamp Packet::received_at() const { + return packet_.timestamp(); +} + +ManchesterFormatted Packet::symbols_formatted() const { + return format_manchester(decoder_); +} + +Optional Packet::reading(const SignalType signal_type) const { + if( signal_type == SignalType::FLM ) { + const auto length = crc_valid_length(); + + switch(length) { + case 64: + return Reading { + Reading::Type::FLM_64, + reader_.read(0, 32), + Pressure { static_cast(reader_.read(32, 8)) * 4 / 3 }, + Temperature { static_cast(reader_.read(40, 8) & 0x7f) - 50 } + }; + + case 72: + return Reading { + Reading::Type::FLM_72, + reader_.read(0, 32), + Pressure { static_cast(reader_.read(40, 8)) * 4 / 3 }, + Temperature { static_cast(reader_.read(48, 8)) - 50 } + }; + + case 80: + return Reading { + Reading::Type::FLM_80, + reader_.read(8, 32), + Pressure { static_cast(reader_.read(48, 8)) * 4 / 3 }, + Temperature { static_cast(reader_.read(56, 8)) - 50 } + }; + + default: + return { }; + } + } + + if( signal_type == SignalType::Subaru ) { + return Reading { + Reading::Type::SUB_35, + reader_.read(3, 25), + Pressure { static_cast(reader_.read(28, 8)) } + }; + } + + if( signal_type == SignalType::GMC ) { + return Reading { + Reading::Type::GMC_96, + reader_.read(20, 32), + Pressure { static_cast(reader_.read(52, 8)) } + }; + } + + return { }; +} + +size_t Packet::crc_valid_length() const { + constexpr uint32_t checksum_bytes = 0b1111111; + constexpr uint32_t crc_72_bytes = 0b111111111; + constexpr uint32_t crc_80_bytes = 0b1111111110; + + std::array bytes; + for(size_t i=0; i crc_72 { 0x01, 0x00 }; + CRC<8> crc_80 { 0x01, 0x00 }; + + for(size_t i=0; i +#include + +#include "optional.hpp" + +#include "units.hpp" +using units::Temperature; +using units::Pressure; + +#include "baseband_packet.hpp" +#include "manchester.hpp" +#include "field_reader.hpp" + +namespace tpms { + +enum SignalType : uint32_t { + FLM = 1, + Subaru = 2, + GMC = 3, +}; + +class TransponderID { +public: + constexpr TransponderID( + ) : id_ { 0 } + { + } + + constexpr TransponderID( + const uint32_t id + ) : id_ { id } + { + } + + constexpr uint32_t value() const { + return id_; + } + +private: + uint32_t id_; +}; + +class Reading { +public: + enum Type { + None = 0, + FLM_64 = 1, + FLM_72 = 2, + FLM_80 = 3, + SUB_35 = 4, + GMC_96 = 5, + }; + + constexpr Reading( + ) : type_ { Type::None } + { + } + + constexpr Reading( + Type type, + TransponderID id + ) : type_ { type }, + id_ { id } + { + } + + constexpr Reading( + Type type, + TransponderID id, + Optional pressure = { }, + Optional temperature = { } + ) : type_ { type }, + id_ { id }, + pressure_ { pressure }, + temperature_ { temperature } + { + } + + Type type() const { + return type_; + } + + TransponderID id() const { + return id_; + } + + Optional pressure() const { + return pressure_; + } + + Optional temperature() const { + return temperature_; + } + +private: + Type type_ { Type::None }; + TransponderID id_ { 0 }; + Optional pressure_ { }; + Optional temperature_ { }; +}; + +class Packet { +public: + constexpr Packet( + const baseband::Packet& packet + ) : packet_ { packet }, + decoder_ { packet_, 0 }, + reader_ { decoder_ } + { + } + + Timestamp received_at() const; + + ManchesterFormatted symbols_formatted() const; + + Optional reading(const SignalType signal_type) const; + +private: + using Reader = FieldReader; + + const baseband::Packet packet_; + const ManchesterDecoder decoder_; + + const Reader reader_; + + size_t crc_valid_length() const; +}; + +} /* namespace tpms */ + +#endif/*__TPMS_PACKET_H__*/ From b35a8c4501129e488aa4456d7a1260196ee3dae0 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 6 Apr 2016 17:04:40 -0700 Subject: [PATCH 112/164] Add TPMS signal_type. --- firmware/application/tpms_app.cpp | 6 +++--- firmware/application/tpms_app.hpp | 2 +- firmware/baseband/proc_tpms.cpp | 2 +- firmware/common/message.hpp | 4 ++++ 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/firmware/application/tpms_app.cpp b/firmware/application/tpms_app.cpp index d83372f1..c80bfb9d 100644 --- a/firmware/application/tpms_app.cpp +++ b/firmware/application/tpms_app.cpp @@ -156,7 +156,7 @@ TPMSAppView::TPMSAppView(NavigationView&) { [this](Message* const p) { const auto message = static_cast(p); const tpms::Packet packet { message->packet }; - this->on_packet(packet); + this->on_packet(message->signal_type, packet); } ); @@ -194,12 +194,12 @@ void TPMSAppView::set_parent_rect(const Rect new_parent_rect) { recent_entries_view.set_parent_rect({ 0, 0, new_parent_rect.width(), new_parent_rect.height() }); } -void TPMSAppView::on_packet(const tpms::Packet& packet) { +void TPMSAppView::on_packet(const tpms::SignalType signal_type, const tpms::Packet& packet) { if( logger ) { logger->on_packet(packet, target_frequency()); } - const auto reading_opt = packet.reading(); + const auto reading_opt = packet.reading(signal_type); if( reading_opt.is_valid() ) { const auto reading = reading_opt.value(); recent.on_packet({ reading.type(), reading.id() }, reading); diff --git a/firmware/application/tpms_app.hpp b/firmware/application/tpms_app.hpp index ba4c154e..24516908 100644 --- a/firmware/application/tpms_app.hpp +++ b/firmware/application/tpms_app.hpp @@ -107,7 +107,7 @@ private: TPMSRecentEntriesView recent_entries_view { recent }; - void on_packet(const tpms::Packet& packet); + void on_packet(const tpms::SignalType signal_type, const tpms::Packet& packet); void on_show_list(); uint32_t target_frequency() const; diff --git a/firmware/baseband/proc_tpms.cpp b/firmware/baseband/proc_tpms.cpp index d9b2375a..2ce115a3 100644 --- a/firmware/baseband/proc_tpms.cpp +++ b/firmware/baseband/proc_tpms.cpp @@ -78,6 +78,6 @@ void TPMSProcessor::consume_symbol( void TPMSProcessor::payload_handler( const baseband::Packet& packet ) { - const TPMSPacketMessage message { packet }; + const TPMSPacketMessage message { tpms::SignalType::FLM, packet }; shared_memory.application_queue.push(message); } diff --git a/firmware/common/message.hpp b/firmware/common/message.hpp index cbce464e..effb1126 100644 --- a/firmware/common/message.hpp +++ b/firmware/common/message.hpp @@ -29,6 +29,7 @@ #include "baseband_packet.hpp" #include "ert_packet.hpp" +#include "tpms_packet.hpp" #include "dsp_fir_taps.hpp" #include "dsp_iir.hpp" #include "fifo.hpp" @@ -275,12 +276,15 @@ public: class TPMSPacketMessage : public Message { public: constexpr TPMSPacketMessage( + const tpms::SignalType signal_type, const baseband::Packet& packet ) : Message { ID::TPMSPacket }, + signal_type { signal_type }, packet { packet } { } + tpms::SignalType signal_type; baseband::Packet packet; }; From f8d496d9d1a6e8d6e2b82fdfd899afa4a71a827a Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sat, 9 Apr 2016 21:33:12 -0700 Subject: [PATCH 113/164] Remove cpu_clock.* -- unused. ClockManager does all that stuff. --- firmware/common/cpu_clock.cpp | 133 ---------------------------------- firmware/common/cpu_clock.hpp | 35 --------- 2 files changed, 168 deletions(-) delete mode 100644 firmware/common/cpu_clock.cpp delete mode 100644 firmware/common/cpu_clock.hpp diff --git a/firmware/common/cpu_clock.cpp b/firmware/common/cpu_clock.cpp deleted file mode 100644 index 78ccadd7..00000000 --- a/firmware/common/cpu_clock.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "cpu_clock.hpp" - -#include -#include - -#include "lpc43xx_cpp.hpp" -using namespace lpc43xx; - -constexpr uint32_t systick_count(const uint32_t clock_source_f) { - return clock_source_f / CH_FREQUENCY; -} - -constexpr uint32_t systick_load(const uint32_t clock_source_f) { - return systick_count(clock_source_f) - 1; -} - -constexpr auto systick_count_irc = systick_load(clock_source_irc_f); -constexpr auto systick_count_pll1 = systick_load(clock_source_pll1_f); -constexpr auto systick_count_pll1_step = systick_load(clock_source_pll1_step_f); - -static void set_clock(LPC_CGU_BASE_CLK_Type& clk, const cgu::CLK_SEL clock_source) { - clk.AUTOBLOCK = 1; - clk.CLK_SEL = toUType(clock_source); -} - -void cpu_clock_irc() { - /* Set M4 clock to safe default speed (~12MHz IRC) */ - set_clock(LPC_CGU->BASE_M4_CLK, cgu::CLK_SEL::IRC); - systick_adjust_period(systick_count_irc); - halLPCSetSystemClock(clock_source_irc_f); -} - -void cpu_xtal_start() { - LPC_CGU->XTAL_OSC_CTRL.BYPASS = 0; - LPC_CGU->XTAL_OSC_CTRL.HF = 0; - LPC_CGU->XTAL_OSC_CTRL.ENABLE = 0; - halPolledDelay(US2RTT(250)); -} - -void cpu_clock_max_speed() { - /* Incantation from LPC43xx UM10503 section 12.2.1.1, to bring the M4 - * core clock speed to the 110 - 204MHz range. - */ - cpu_clock_irc(); - - cpu_xtal_start(); - - /* Step into the 90-110MHz M4 clock range */ - cgu::pll1::ctrl({ - .pd = 0, - .bypass = 0, - .fbsel = 0, - .direct = 0, - .psel = 0, - .autoblock = 1, - .nsel = 0, - .msel = 16, - .clk_sel = cgu::CLK_SEL::XTAL, - }); - while( !cgu::pll1::is_locked() ); - - /* Switch M4 clock to PLL1 running at intermediate rate */ - set_clock(LPC_CGU->BASE_M4_CLK, cgu::CLK_SEL::PLL1); - systick_adjust_period(systick_count_pll1_step); - halLPCSetSystemClock(clock_source_pll1_step_f); - - /* Delay >50us at 90-110MHz clock speed */ - halPolledDelay(US2RTT(50)); - - /* Remove /2P divider from PLL1 output to achieve full speed */ - cgu::pll1::direct(); - systick_adjust_period(systick_count_pll1); - halLPCSetSystemClock(clock_source_pll1_f); -} - -void cpu_start_audio_pll() { - cgu::pll0audio::ctrl({ - .pd = 1, - .bypass = 0, - .directi = 0, - .directo = 0, - .clken = 0, - .frm = 0, - .autoblock = 1, - .pllfract_req = 1, - .sel_ext = 0, - .mod_pd = 0, - .clk_sel = cgu::CLK_SEL::XTAL, - }); - - /* For 12MHz clock source, 48kHz audio rate, 256Fs MCLK: - * Fout=12.288MHz, Fcco=417.792MHz - * PDEC=3, NDEC=1, PLLFRACT=0x1a1cac - */ - cgu::pll0audio::mdiv({ - .mdec = 0x5B6A, - }); - cgu::pll0audio::np_div({ - .pdec = 3, - .ndec = 1, - }); - - cgu::pll0audio::frac({ - .pllfract_ctrl = 0x1a1cac, - }); - - cgu::pll0audio::power_up(); - while( !cgu::pll0audio::is_locked() ); - cgu::pll0audio::clock_enable(); - - set_clock(LPC_CGU->BASE_AUDIO_CLK, cgu::CLK_SEL::PLL0AUDIO); -} diff --git a/firmware/common/cpu_clock.hpp b/firmware/common/cpu_clock.hpp deleted file mode 100644 index 28909159..00000000 --- a/firmware/common/cpu_clock.hpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __CPU_CLOCK_H__ -#define __CPU_CLOCK_H__ - -#include - -constexpr uint32_t clock_source_irc_f = 12000000; -constexpr uint32_t clock_source_gp_clkin = 20000000; -constexpr uint32_t clock_source_pll1_step_f = 100000000; -constexpr uint32_t clock_source_pll1_f = 200000000; - -void cpu_clock_max_speed(); -void cpu_start_audio_pll(); - -#endif/*__CPU_CLOCK_H__*/ From 34963c7f374dfc9a9b3bf7a4a5d667b87f8bebe0 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sat, 9 Apr 2016 21:33:46 -0700 Subject: [PATCH 114/164] SDC: Auto-off clock when no transfer. --- firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c b/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c index 835abd80..de3877c3 100644 --- a/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c +++ b/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c @@ -537,6 +537,8 @@ void sdc_lld_init(void) { void sdc_lld_start(SDCDriver *sdcp) { if (sdcp->state == BLK_STOP) { + LPC_SDMMC->CLKENA = (1U << 16); /* CCLK_LOW_POWER */ + LPC_CCU1->CLK_M4_SDIO_CFG.RUN = 1; LPC_CGU->BASE_SDIO_CLK.PD = 0; From df6593ac91427aa9ce13e0753ef3949d2f26ca2e Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sat, 9 Apr 2016 21:34:28 -0700 Subject: [PATCH 115/164] SDC: Remove commented code --- .../os/hal/platforms/LPC43xx/sdc_lld.c | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c b/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c index de3877c3..212af995 100644 --- a/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c +++ b/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c @@ -564,18 +564,6 @@ void sdc_lld_start(SDCDriver *sdcp) { ; sdio_cclk_set_400khz(); - // sdio_clkdiv_set(255, 5, 0, 0); - // LPC_SDMMC->CLKDIV = - // (255U << 0) - // | ( 5U << 8) - // | ( 0U << 16) - // | ( 0U << 24) - // ; - // sdio_update_clock_registers_only(); - // LPC_SDMMC->CLKSRC = 0; - // LPC_SDMMC->CLKENA = (1U << 16); /* CCLK_LOW_POWER */ - - // LPC_SDMMC->TMOUT = 0xffffff40U; /* TODO: Choose which interrupts to enable! */ sdio_interrupts_set_mask(0); From 38ba02a68f872e494c7b8fe43a3ffda93bc43d31 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 10 Apr 2016 15:55:01 -0700 Subject: [PATCH 116/164] Change File::open to File::open_for_writing. Not thrilled about the File API right now... --- firmware/application/file.cpp | 4 ++-- firmware/application/file.hpp | 2 +- firmware/common/png_writer.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/firmware/application/file.cpp b/firmware/application/file.cpp index 3695063d..0ea0f57e 100644 --- a/firmware/application/file.cpp +++ b/firmware/application/file.cpp @@ -25,13 +25,13 @@ File::~File() { close(); } -bool File::open(const std::string& file_path) { +bool File::open_for_writing(const std::string& file_path) { const auto open_result = f_open(&f, file_path.c_str(), FA_WRITE | FA_OPEN_ALWAYS); return (open_result == FR_OK); } bool File::open_for_append(const std::string& file_path) { - if( open(file_path) ) { + if( open_for_writing(file_path) ) { const auto seek_result = f_lseek(&f, f_size(&f)); if( seek_result == FR_OK ) { return true; diff --git a/firmware/application/file.hpp b/firmware/application/file.hpp index 29ffc57d..df391db7 100644 --- a/firmware/application/file.hpp +++ b/firmware/application/file.hpp @@ -32,7 +32,7 @@ class File { public: ~File(); - bool open(const std::string& file_path); + bool open_for_writing(const std::string& file_path); bool open_for_append(const std::string& file_path); bool close(); diff --git a/firmware/common/png_writer.cpp b/firmware/common/png_writer.cpp index 8a07326c..15e1b8aa 100644 --- a/firmware/common/png_writer.cpp +++ b/firmware/common/png_writer.cpp @@ -53,7 +53,7 @@ PNGWriter::PNGWriter( const std::string& filename ) { - file.open(filename); + file.open_for_writing(filename); file.write(png_file_header); file.write(png_ihdr_screen_capture); From 0a9d7ec8d8b234fc405438b233d1c8a8951c80ac Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 10 Apr 2016 15:56:34 -0700 Subject: [PATCH 117/164] Add File::open_for_reading(). Barf. --- firmware/application/file.cpp | 5 +++++ firmware/application/file.hpp | 1 + 2 files changed, 6 insertions(+) diff --git a/firmware/application/file.cpp b/firmware/application/file.cpp index 0ea0f57e..a14325e0 100644 --- a/firmware/application/file.cpp +++ b/firmware/application/file.cpp @@ -30,6 +30,11 @@ bool File::open_for_writing(const std::string& file_path) { return (open_result == FR_OK); } +bool File::open_for_reading(const std::string& file_path) { + const auto open_result = f_open(&f, file_path.c_str(), FA_READ | FA_OPEN_EXISTING); + return (open_result == FR_OK); +} + bool File::open_for_append(const std::string& file_path) { if( open_for_writing(file_path) ) { const auto seek_result = f_lseek(&f, f_size(&f)); diff --git a/firmware/application/file.hpp b/firmware/application/file.hpp index df391db7..5a4524cf 100644 --- a/firmware/application/file.hpp +++ b/firmware/application/file.hpp @@ -33,6 +33,7 @@ public: ~File(); bool open_for_writing(const std::string& file_path); + bool open_for_reading(const std::string& file_path); bool open_for_append(const std::string& file_path); bool close(); From f76750e55b48340321c0305aaef68acf18c45e29 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 10 Apr 2016 16:30:28 -0700 Subject: [PATCH 118/164] Add LFSR random number generator. Used for SD card write/read testing, maybe other stuff eventually? --- firmware/common/lfsr_random.cpp | 106 ++++++++++++++++++++++++++++++++ firmware/common/lfsr_random.hpp | 34 ++++++++++ 2 files changed, 140 insertions(+) create mode 100644 firmware/common/lfsr_random.cpp create mode 100644 firmware/common/lfsr_random.hpp diff --git a/firmware/common/lfsr_random.cpp b/firmware/common/lfsr_random.cpp new file mode 100644 index 00000000..ddeb044a --- /dev/null +++ b/firmware/common/lfsr_random.cpp @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "lfsr_random.hpp" + +static void lfsr_iterate_internal(lfsr_word_t& v) +{ + /* + Generated with lfsr-generator: + http://lfsr-generator.sourceforge.net + ============================================= + config : fibonacci + length : 31 + taps : (31, 18) + shift-amounts : (12, 12, 8) + shift-direction : left + */ + enum { + length = 31, + tap_0 = 31, + tap_1 = 18, + shift_amount_0 = 12, + shift_amount_1 = 12, + shift_amount_2 = 8 + }; + + const lfsr_word_t zero = 0; + v = ( + ( + v << shift_amount_0 + ) | ( + ( + (v >> (tap_0 - shift_amount_0)) ^ + (v >> (tap_1 - shift_amount_0)) + ) & ( + ~(~zero << shift_amount_0) + ) + ) + ); + v = ( + ( + v << shift_amount_1 + ) | ( + ( + (v >> (tap_0 - shift_amount_1)) ^ + (v >> (tap_1 - shift_amount_1)) + ) & ( + ~(~zero << shift_amount_1) + ) + ) + ); + v = ( + ( + v << shift_amount_2 + ) | ( + ( + (v >> (tap_0 - shift_amount_2)) ^ + (v >> (tap_1 - shift_amount_2)) + ) & ( + ~(~zero << shift_amount_2) + ) + ) + ); +} + +lfsr_word_t lfsr_iterate(lfsr_word_t v) { + lfsr_iterate_internal(v); + return v; +} + +void lfsr_fill(lfsr_word_t& v, lfsr_word_t* buffer, size_t word_count) { + while( word_count != 0 ) { + lfsr_iterate_internal(v); + *(buffer++) = v; + word_count--; + } +} + +bool lfsr_compare(lfsr_word_t& v, const lfsr_word_t* buffer, size_t word_count) { + while( word_count != 0 ) { + lfsr_iterate_internal(v); + if( *(buffer++) != v ) { + return false; + } + word_count--; + } + return true; +} diff --git a/firmware/common/lfsr_random.hpp b/firmware/common/lfsr_random.hpp new file mode 100644 index 00000000..0eaadc19 --- /dev/null +++ b/firmware/common/lfsr_random.hpp @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __LFSR_RANDOM_HPP__ +#define __LFSR_RANDOM_HPP__ + +#include +#include + +using lfsr_word_t = uint32_t; + +lfsr_word_t lfsr_iterate(lfsr_word_t v); +void lfsr_fill(lfsr_word_t& v, lfsr_word_t* buffer, size_t word_count); +bool lfsr_compare(lfsr_word_t& v, const lfsr_word_t* buffer, size_t word_count); + +#endif/*__LFSR_RANDOM_HPP__*/ From 12939a0f8236dc88f200eeecb87d70fd95f6aa69 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 10 Apr 2016 17:15:59 -0700 Subject: [PATCH 119/164] Support larger SDC LLD transactions Use chained DMA buffers -- limit is now 16Kbytes, adjustable by LPC_SDC_SDIO_DESCRIPTOR_COUNT. More descriptors require more stack. --- .../os/hal/platforms/LPC43xx/sdc_lld.c | 75 +++++++++++-------- .../os/hal/platforms/LPC43xx/sdc_lld.h | 9 +++ 2 files changed, 54 insertions(+), 30 deletions(-) diff --git a/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c b/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c index 212af995..be0e2599 100644 --- a/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c +++ b/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c @@ -241,6 +241,41 @@ static void sdio_dma_interrupts_clear(void) { ; } +static bool_t sdc_llc_prepare_descriptors_chained(LPC_SDMMC_DESC_Type desc[], + const uint32_t desc_count, + const uint8_t* const buffer, + uint32_t byte_count) { + const uint32_t buffer_size = LPC_SDC_SDIO_MAX_DESCRIPTOR_BYTES; + uint32_t p = (uint32_t)buffer; + + for(uint32_t i=0; i buffer_size) ? buffer_size : byte_count; + desc[i].DESC2 = p; //(buffer_1_size == 0) ? 0 : p; + p += buffer_1_size; + byte_count -= buffer_1_size; + + uint32_t buffer_2_size = 0; + desc[i].DESC1 = + (buffer_1_size << 0) + | (buffer_2_size << 13) + ; + + desc[i].DESC3 = (uint32_t)&desc[i+1]; + + const bool_t first_descriptor = (i == 0); + const bool_t last_descriptor = (byte_count == 0); + desc[i].DESC0 = + (last_descriptor ? 0 : (1U << 1)) /* Disable interrupt on completion */ + | (last_descriptor ? (1U << 2) : 0) /* Last descriptor */ + | (first_descriptor ? (1U << 3) : 0) /* First descriptor */ + | (1U << 4) /* ! Second address chained */ + | (1U << 31) /* Descriptor is owned by DMA controller */ + ; + } + + return (byte_count == 0) ? CH_SUCCESS : CH_FAILED; +} + /** * @brief Wait end of data transaction and performs finalizations. * @@ -798,8 +833,7 @@ bool_t sdc_lld_send_cmd_long_crc(SDCDriver *sdcp, uint8_t cmd, uint32_t arg, bool_t sdc_lld_read_aligned(SDCDriver *sdcp, uint32_t startblk, uint8_t *buf, uint32_t n) { - /* TODO: Documentation suggests max transfer size is 8192, but... */ - chDbgCheck((n <= (4096 / MMCSD_BLOCK_SIZE)), "max transaction size"); + chDbgCheck((n <= (LPC_SDC_SDIO_DESCRIPTOR_COUNT * LPC_SDC_SDIO_MAX_DESCRIPTOR_BYTES / MMCSD_BLOCK_SIZE)), "max transaction size"); /* TODO: Handle SDHC block indexing? */ @@ -810,19 +844,10 @@ bool_t sdc_lld_read_aligned(SDCDriver *sdcp, uint32_t startblk, sdio_reset_dma_and_fifo(); /* Prepares the DMA channel for writing.*/ - LPC_SDMMC_DESC_Type desc; - desc.DESC0 = - (1U << 2) /* Last descriptor */ - | (1U << 3) /* First descriptor */ - | (1U << 4) /* Second address chained */ - | (1U << 31) /* Descriptor is owned by DMA controller */ - ; - desc.DESC1 = - ((n * MMCSD_BLOCK_SIZE) << 0) - | (0U << 13) - ; - desc.DESC2 = (uint32_t)buf; - desc.DESC3 = 0; + LPC_SDMMC_DESC_Type desc[LPC_SDC_SDIO_DESCRIPTOR_COUNT]; + if (sdc_llc_prepare_descriptors_chained(desc, sizeof(desc) / sizeof(desc[0]), buf, n * MMCSD_BLOCK_SIZE) == TRUE) + goto error; + LPC_SDMMC->DBADDR = (uint32_t)&desc; /* DMA is now armed? */ /* Setting up data transfer.*/ @@ -873,8 +898,7 @@ error: bool_t sdc_lld_write_aligned(SDCDriver *sdcp, uint32_t startblk, const uint8_t *buf, uint32_t n) { - /* TODO: Documentation suggests max transfer size is 8192, but... */ - chDbgCheck((n <= (4096 / MMCSD_BLOCK_SIZE)), "max transaction size"); + chDbgCheck((n <= (LPC_SDC_SDIO_DESCRIPTOR_COUNT * LPC_SDC_SDIO_MAX_DESCRIPTOR_BYTES / MMCSD_BLOCK_SIZE)), "max transaction size"); /* Checks for errors and waits for the card to be ready for writing.*/ if (_sdc_wait_for_transfer_state(sdcp)) @@ -883,19 +907,10 @@ bool_t sdc_lld_write_aligned(SDCDriver *sdcp, uint32_t startblk, sdio_reset_dma_and_fifo(); /* Prepares the DMA channel for writing.*/ - LPC_SDMMC_DESC_Type desc; - desc.DESC0 = - (1U << 2) /* Last descriptor */ - | (1U << 3) /* First descriptor */ - | (1U << 4) /* Second address chained */ - | (1U << 31) /* Descriptor is owned by DMA controller */ - ; - desc.DESC1 = - ((n * MMCSD_BLOCK_SIZE) << 0) - | (0U << 13) - ; - desc.DESC2 = (uint32_t)buf; - desc.DESC3 = 0; + LPC_SDMMC_DESC_Type desc[LPC_SDC_SDIO_DESCRIPTOR_COUNT]; + if (sdc_llc_prepare_descriptors_chained(desc, sizeof(desc) / sizeof(desc[0]), buf, n * MMCSD_BLOCK_SIZE) == TRUE) + goto error; + LPC_SDMMC->DBADDR = (uint32_t)&desc; /* DMA is now armed? */ /* Setting up data transfer.*/ diff --git a/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.h b/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.h index 58d3fe93..eae0fc67 100644 --- a/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.h +++ b/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.h @@ -55,6 +55,13 @@ #define LPC_SDC_SDIO_IRQ_PRIORITY 7 #endif +/** + * @brief SDIO read/write descriptor count. + */ +#if !defined(LPC_SDC_SDIO_DESCRIPTOR_COUNT) || defined(__DOXYGEN__) +#define LPC_SDC_SDIO_DESCRIPTOR_COUNT 4 +#endif + /** @} */ /*===========================================================================*/ @@ -178,6 +185,8 @@ struct SDCDriver { #define MMCSD_R1_IS_CARD_LOCKED(r1) (((r1) >> 21) & 1) /** @} */ +#define LPC_SDC_SDIO_MAX_DESCRIPTOR_BYTES 0x1000 + /*===========================================================================*/ /* External declarations. */ /*===========================================================================*/ From 0cb923be6d8ee7891b82bc74cb07b3011deddf22 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 10 Apr 2016 17:16:39 -0700 Subject: [PATCH 120/164] Add SD card debug view. Bus and card configuration data, write and read testing. --- firmware/application/Makefile | 2 + firmware/application/ui_debug.cpp | 4 +- firmware/application/ui_sd_card_debug.cpp | 409 ++++++++++++++++++++++ firmware/application/ui_sd_card_debug.hpp | 203 +++++++++++ 4 files changed, 617 insertions(+), 1 deletion(-) create mode 100644 firmware/application/ui_sd_card_debug.cpp create mode 100644 firmware/application/ui_sd_card_debug.hpp diff --git a/firmware/application/Makefile b/firmware/application/Makefile index a6bb3cb9..31201908 100755 --- a/firmware/application/Makefile +++ b/firmware/application/Makefile @@ -164,6 +164,7 @@ CPPSRC = main.cpp \ ui_debug.cpp \ ui_baseband_stats_view.cpp \ ui_sd_card_status_view.cpp \ + ui_sd_card_debug.cpp \ ui_console.cpp \ ui_receiver.cpp \ ui_spectrum.cpp \ @@ -189,6 +190,7 @@ CPPSRC = main.cpp \ ../common/chibios_cpp.cpp \ ../common/debug.cpp \ ../common/gcc.cpp \ + ../common/lfsr_random.cpp \ core_control.cpp \ cpld_max5.cpp \ jtag.cpp \ diff --git a/firmware/application/ui_debug.cpp b/firmware/application/ui_debug.cpp index fda852bc..e3d673a0 100644 --- a/firmware/application/ui_debug.cpp +++ b/firmware/application/ui_debug.cpp @@ -28,6 +28,8 @@ #include "audio.hpp" +#include "ui_sd_card_debug.hpp" + namespace ui { /* DebugMemoryView *******************************************************/ @@ -272,7 +274,7 @@ DebugMenuView::DebugMenuView(NavigationView& nav) { add_items<5>({ { { "Memory", [&nav](){ nav.push(); } }, { "Radio State", [&nav](){ nav.push(); } }, - { "SD Card", [&nav](){ nav.push(); } }, + { "SD Card", [&nav](){ nav.push(); } }, { "Peripherals", [&nav](){ nav.push(); } }, { "Temperature", [&nav](){ nav.push(); } }, } }); diff --git a/firmware/application/ui_sd_card_debug.cpp b/firmware/application/ui_sd_card_debug.cpp new file mode 100644 index 00000000..25d9ba5d --- /dev/null +++ b/firmware/application/ui_sd_card_debug.cpp @@ -0,0 +1,409 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "ui_sd_card_debug.hpp" + +#include "string_format.hpp" + +#include "file.hpp" +#include "lfsr_random.hpp" + +#include "ff.h" + +#include "ch.h" +#include "hal.h" + +class SDCardTestThread { +public: + enum Result { + FailCompare = -8, + FailReadIncomplete = -7, + FailWriteIncomplete = -6, + FailAbort = -5, + FailFileOpenRead = -4, + FailFileOpenWrite = -3, + FailHeap = -2, + FailThread = -1, + Incomplete = 0, + OK = 1, + }; + + struct Stats { + halrtcnt_t write_duration_min { 0 }; + halrtcnt_t write_duration_max { 0 }; + halrtcnt_t write_test_duration { 0 }; + size_t write_bytes { 0 }; + size_t write_count { 0 }; + + halrtcnt_t read_duration_min { 0 }; + halrtcnt_t read_duration_max { 0 }; + halrtcnt_t read_test_duration { 0 }; + size_t read_bytes { 0 }; + size_t read_count { 0 }; + }; + + SDCardTestThread( + ) { + thread = chThdCreateFromHeap(NULL, 2048, NORMALPRIO + 10, SDCardTestThread::static_fn, this); + } + + Result result() const { + return _result; + } + + const Stats& stats() const { + return _stats; + } + + ~SDCardTestThread() { + chThdTerminate(thread); + chThdWait(thread); + } + +private: + static constexpr size_t write_size = 16384; + static constexpr size_t bytes_to_write = 16 * 1024 * 1024; + static constexpr size_t bytes_to_read = bytes_to_write; + + static Thread* thread; + volatile Result _result { Result::Incomplete }; + Stats _stats; + + static msg_t static_fn(void* arg) { + auto obj = static_cast(arg); + obj->_result = obj->run(); + return 0; + } + + Result run() { + const std::string filename { "_PPTEST_.DAT" }; + + const auto write_result = write(filename); + if( write_result != Result::OK ) { + return write_result; + } + + if( _stats.write_bytes < bytes_to_write ) { + return Result::FailWriteIncomplete; + } + + if( chThdShouldTerminate() ) { + return Result::FailAbort; + } + + const auto read_result = read(filename); + if( read_result != Result::OK ) { + return read_result; + } + + f_unlink(filename.c_str()); + + if( _stats.read_bytes < bytes_to_read ) { + return Result::FailReadIncomplete; + } + + if( chThdShouldTerminate() ) { + return Result::FailAbort; + } + + return Result::OK; + } + + Result write(const std::string& filename) { + const auto buffer = std::make_unique>(); + if( !buffer ) { + return Result::FailHeap; + } + + File file; + if( !file.open_for_writing(filename) ) { + return Result::FailFileOpenWrite; + } + + lfsr_word_t v = 1; + + const halrtcnt_t test_start = halGetCounterValue(); + while( !chThdShouldTerminate() && file.is_ready() && (_stats.write_bytes < bytes_to_write) ) { + lfsr_fill(v, + reinterpret_cast(buffer->data()), + sizeof(*buffer.get()) / sizeof(lfsr_word_t) + ); + + const halrtcnt_t write_start = halGetCounterValue(); + if( !file.write(buffer->data(), buffer->size()) ) { + break; + } + const halrtcnt_t write_end = halGetCounterValue(); + _stats.write_bytes += buffer->size(); + _stats.write_count++; + + const halrtcnt_t write_duration = write_end - write_start; + if( (_stats.write_duration_min == 0) || (write_duration < _stats.write_duration_min) ) { + _stats.write_duration_min = write_duration; + } + if( write_duration > _stats.write_duration_max ) { + _stats.write_duration_max = write_duration; + } + } + + file.close(); + + const halrtcnt_t test_end = halGetCounterValue(); + _stats.write_test_duration = test_end - test_start; + + return Result::OK; + } + + Result read(const std::string& filename) { + const auto buffer = std::make_unique>(); + if( !buffer ) { + return Result::FailHeap; + } + + File file; + if( !file.open_for_reading(filename) ) { + return Result::FailFileOpenRead; + } + + lfsr_word_t v = 1; + + const halrtcnt_t test_start = halGetCounterValue(); + while( !chThdShouldTerminate() && file.is_ready() && (_stats.read_bytes < bytes_to_read) ) { + const halrtcnt_t read_start = halGetCounterValue(); + if( !file.read(buffer->data(), buffer->size()) ) { + break; + } + const halrtcnt_t read_end = halGetCounterValue(); + _stats.read_bytes += buffer->size(); + _stats.read_count++; + + const halrtcnt_t read_duration = read_end - read_start; + if( (_stats.read_duration_min == 0) || (read_duration < _stats.read_duration_min) ) { + _stats.read_duration_min = read_duration; + } + if( read_duration > _stats.read_duration_max ) { + _stats.read_duration_max = read_duration; + } + + if( !lfsr_compare(v, + reinterpret_cast(buffer->data()), + sizeof(*buffer.get()) / sizeof(lfsr_word_t)) + ) { + return Result::FailCompare; + } + } + + file.close(); + + const halrtcnt_t test_end = halGetCounterValue(); + _stats.read_test_duration = test_end - test_start; + + return Result::OK; + } +}; + +Thread* SDCardTestThread::thread { nullptr }; + +namespace ui { + +SDCardDebugView::SDCardDebugView(NavigationView& nav) { + add_children({ { + &text_title, + &text_detected_title, + &text_detected_value, + &text_bus_width_title, + &text_bus_width_value, + &text_card_mode_title, + &text_card_mode_value, + // &text_csd_title, + // &text_csd_value, + &text_block_size_title, + &text_block_size_value, + &text_block_count_title, + &text_block_count_value, + &text_capacity_title, + &text_capacity_value, + &text_test_write_time_title, + &text_test_write_time_value, + &text_test_write_rate_title, + &text_test_write_rate_value, + &text_test_read_time_title, + &text_test_read_time_value, + &text_test_read_rate_title, + &text_test_read_rate_value, + &button_test, + &button_ok, + } }); + + button_test.on_select = [this](Button&){ this->on_test(); }; + button_ok.on_select = [&nav](Button&){ nav.pop(); }; +} + +void SDCardDebugView::on_show() { + sd_card_status_signal_token = sd_card::status_signal += [this](const sd_card::Status status) { + this->on_status(status); + }; + on_status(sd_card::status()); +} + +void SDCardDebugView::on_hide() { + sd_card::status_signal -= sd_card_status_signal_token; +} + +void SDCardDebugView::focus() { + button_ok.focus(); +} + +void SDCardDebugView::on_status(const sd_card::Status) { + text_bus_width_value.set(""); + text_card_mode_value.set(""); + // text_csd_value.set(""); + text_block_size_value.set(""); + text_block_count_value.set(""); + text_capacity_value.set(""); + text_test_write_time_value.set(""); + text_test_write_rate_value.set(""); + text_test_read_time_value.set(""); + text_test_read_rate_value.set(""); + + const bool is_inserted = sdcIsCardInserted(&SDCD1); + text_detected_value.set(is_inserted ? "Yes" : " No"); + + if( is_inserted ) { + const auto card_width_flags = LPC_SDMMC->CTYPE & 0x10001; + size_t card_width = 0; + switch(card_width_flags) { + case 0x00000: card_width = 1; break; + case 0x00001: card_width = 4; break; + case 0x10001: card_width = 8; break; + default: break; + } + + text_bus_width_value.set(card_width ? to_string_dec_uint(card_width, 1) : "X"); + text_card_mode_value.set("0x" + to_string_hex(SDCD1.cardmode, 8)); + // text_csd_value.set("0x" + to_string_hex(SDCD1.csd, 8)); + + BlockDeviceInfo block_device_info; + if( sdcGetInfo(&SDCD1, &block_device_info) == CH_SUCCESS ) { + text_block_size_value.set(to_string_dec_uint(block_device_info.blk_size, 5)); + text_block_count_value.set(to_string_dec_uint(block_device_info.blk_num, 9)); + const uint64_t capacity = block_device_info.blk_size * uint64_t(block_device_info.blk_num); + if( capacity >= 1000000000 ) { + const uint32_t capacity_mb = capacity / 1000000U; + const uint32_t fraction_gb = capacity_mb % 1000; + const uint32_t capacity_gb = capacity_mb / 1000U; + text_capacity_value.set( + to_string_dec_uint(capacity_gb, 3) + "." + + to_string_dec_uint(fraction_gb, 3, '0') + " GB" + ); + } else { + const uint32_t capacity_kb = capacity / 1000U; + const uint32_t fraction_mb = capacity_kb % 1000; + const uint32_t capacity_mb = capacity_kb / 1000U; + text_capacity_value.set( + to_string_dec_uint(capacity_mb, 3) + "." + + to_string_dec_uint(fraction_mb, 3, '0') + " MB" + ); + } + } + } +} + +static std::string format_ticks_as_ms(const halrtcnt_t value) { + const uint32_t us = uint64_t(value) * 1000000U / halGetCounterFrequency(); + const uint32_t ms_frac = us % 1000U; + const uint32_t ms_int = us / 1000U; + if( ms_int < 1000 ) { + return to_string_dec_uint(ms_int, 3) + "." + to_string_dec_uint(ms_frac, 3, '0'); + } else { + return "HHH.HHH"; + } +} + +static std::string format_bytes_per_ticks_as_mib(const size_t bytes, const halrtcnt_t ticks) { + const uint32_t bps = uint64_t(bytes) * halGetCounterFrequency() / ticks; + const uint32_t kbps = bps / 1000U; + const uint32_t mbps_frac = kbps % 1000U; + const uint32_t mbps_int = kbps / 1000U; + if( mbps_int < 1000 ) { + return to_string_dec_uint(mbps_int, 3) + "." + to_string_dec_uint(mbps_frac, 3, '0'); + } else { + return "HHH.HHH"; + } +} + +void SDCardDebugView::on_test() { + text_test_write_time_value.set(""); + text_test_write_rate_value.set(""); + text_test_read_time_value.set(""); + text_test_read_rate_value.set(""); + + SDCardTestThread thread; + + // uint32_t spinner_phase = 0; + while( thread.result() == SDCardTestThread::Result::Incomplete ) { + chThdSleepMilliseconds(100); + + // spinner_phase += 1; + // char c = '*'; + // switch(spinner_phase % 4) { + // case 0: c = '-'; break; + // case 1: c = '\\'; break; + // case 2: c = '|'; break; + // case 3: c = '/'; break; + // default: c = '*'; break; + // } + // text_test_write_value.set({ c }); + } + + if( thread.result() == SDCardTestThread::Result::OK ) { + const auto stats = thread.stats(); + const auto write_duration_avg = stats.write_test_duration / stats.write_count; + + text_test_write_time_value.set( + format_ticks_as_ms(stats.write_duration_min) + "/" + + format_ticks_as_ms(write_duration_avg) + "/" + + format_ticks_as_ms(stats.write_duration_max) + ); + + text_test_write_rate_value.set( + format_bytes_per_ticks_as_mib(stats.write_bytes, stats.write_duration_min * stats.write_count) + " " + + format_bytes_per_ticks_as_mib(stats.write_bytes, stats.write_test_duration) + ); + + const auto read_duration_avg = stats.read_test_duration / stats.read_count; + + text_test_read_time_value.set( + format_ticks_as_ms(stats.read_duration_min) + "/" + + format_ticks_as_ms(read_duration_avg) + "/" + + format_ticks_as_ms(stats.read_duration_max) + ); + + text_test_read_rate_value.set( + format_bytes_per_ticks_as_mib(stats.read_bytes, stats.read_duration_min * stats.read_count) + " " + + format_bytes_per_ticks_as_mib(stats.read_bytes, stats.read_test_duration) + ); + } else { + text_test_write_time_value.set("Fail: " + to_string_dec_int(toUType(thread.result()), 4)); + } +} + +} /* namespace ui */ diff --git a/firmware/application/ui_sd_card_debug.hpp b/firmware/application/ui_sd_card_debug.hpp new file mode 100644 index 00000000..a573f3a1 --- /dev/null +++ b/firmware/application/ui_sd_card_debug.hpp @@ -0,0 +1,203 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __UI_SD_CARD_DEBUG_H__ +#define __UI_SD_CARD_DEBUG_H__ + +#include "ui_widget.hpp" +#include "ui_navigation.hpp" + +#include "sd_card.hpp" + +namespace ui { + +class SDCardDebugView : public View { +public: + SDCardDebugView(NavigationView& nav); + + void on_show() override; + void on_hide() override; + + void focus() override; + +private: + SignalToken sd_card_status_signal_token; + + void on_status(const sd_card::Status status); + void on_test(); + + Text text_title { + { (240 - (7 * 8)) / 2, 1 * 16, (7 * 8), 16 }, + "SD Card", + }; + + static constexpr size_t detected_characters = 3; + + Text text_detected_title { + { 0, 3 * 16, (8 * 8), 16 }, + "Detected", + }; + + Text text_detected_value { + { 240 - (detected_characters * 8), 3 * 16, (detected_characters * 8), 16 }, + "", + }; + + static constexpr size_t bus_width_characters = 1; + + Text text_bus_width_title { + { 0, 5 * 16, (9 * 8), 16 }, + "Bus width", + }; + + Text text_bus_width_value { + { 240 - (bus_width_characters * 8), 5 * 16, (bus_width_characters * 8), 16 }, + "", + }; + + static constexpr size_t card_mode_characters = 10; + + Text text_card_mode_title { + { 0, 6 * 16, (9 * 8), 16 }, + "Card mode", + }; + + Text text_card_mode_value { + { 240 - (card_mode_characters * 8), 6 * 16, (card_mode_characters * 8), 16 }, + "", + }; + + // static constexpr size_t csd_characters = 10; + + // Text text_csd_title { + // { 0, 7 * 16, (3 * 8), 16 }, + // "CSD", + // }; + + // Text text_csd_value { + // { 240 - (csd_characters * 8), 7 * 16, (csd_characters * 8), 16 }, + // "", + // }; + + static constexpr size_t block_size_characters = 5; + + Text text_block_size_title { + { 0, 8 * 16, (10 * 8), 16 }, + "Block size", + }; + + Text text_block_size_value { + { 240 - (block_size_characters * 8), 8 * 16, (block_size_characters * 8), 16 }, + "", + }; + + static constexpr size_t block_count_characters = 9; + + Text text_block_count_title { + { 0, 9 * 16, (11 * 8), 16 }, + "Block count", + }; + + Text text_block_count_value { + { 240 - (block_count_characters * 8), 9 * 16, (block_count_characters * 8), 16 }, + "", + }; + + static constexpr size_t capacity_characters = 10; + + Text text_capacity_title { + { 0, 10 * 16, (8 * 8), 16 }, + "Capacity", + }; + + Text text_capacity_value { + { 240 - (capacity_characters * 8), 10 * 16, (capacity_characters * 8), 16 }, + "", + }; + + /////////////////////////////////////////////////////////////////////// + + static constexpr size_t test_write_time_characters = 23; + + Text text_test_write_time_title { + { 0, 12 * 16, (4 * 8), 16 }, + "W ms", + }; + + Text text_test_write_time_value { + { 240 - (test_write_time_characters * 8), 12 * 16, (test_write_time_characters * 8), 16 }, + "", + }; + + static constexpr size_t test_write_rate_characters = 23; + + Text text_test_write_rate_title { + { 0, 13 * 16, (6 * 8), 16 }, + "W MB/s", + }; + + Text text_test_write_rate_value { + { 240 - (test_write_rate_characters * 8), 13 * 16, (test_write_rate_characters * 8), 16 }, + "", + }; + + /////////////////////////////////////////////////////////////////////// + + static constexpr size_t test_read_time_characters = 23; + + Text text_test_read_time_title { + { 0, 14 * 16, (4 * 8), 16 }, + "R ms", + }; + + Text text_test_read_time_value { + { 240 - (test_read_time_characters * 8), 14 * 16, (test_read_time_characters * 8), 16 }, + "", + }; + + static constexpr size_t test_read_rate_characters = 23; + + Text text_test_read_rate_title { + { 0, 15 * 16, (6 * 8), 16 }, + "R MB/s", + }; + + Text text_test_read_rate_value { + { 240 - (test_read_rate_characters * 8), 15 * 16, (test_read_rate_characters * 8), 16 }, + "", + }; + + /////////////////////////////////////////////////////////////////////// + + Button button_test { + { 16, 17 * 16, 96, 24 }, + "Test" + }; + + Button button_ok { + { 240 - 96 - 16, 17 * 16, 96, 24 }, + "OK" + }; +}; + +} /* namespace ui */ + +#endif/*__UI_SD_CARD_DEBUG_H__*/ From 4ac2c540c97a337a10eef36a3a3f9ba4b5987941 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 10 Apr 2016 17:24:28 -0700 Subject: [PATCH 121/164] Disable SDC "nice waiting" for performance. Quick test indicates 4.5% better average write performance. No change in reads. --- firmware/application/halconf.h | 2 +- firmware/baseband/halconf.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware/application/halconf.h b/firmware/application/halconf.h index b99a040d..ea3e9866 100755 --- a/firmware/application/halconf.h +++ b/firmware/application/halconf.h @@ -261,7 +261,7 @@ * lower priority, this may slow down the driver a bit however. */ #if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE +#define SDC_NICE_WAITING FALSE #endif /*===========================================================================*/ diff --git a/firmware/baseband/halconf.h b/firmware/baseband/halconf.h index 658d5869..c157afbd 100755 --- a/firmware/baseband/halconf.h +++ b/firmware/baseband/halconf.h @@ -261,7 +261,7 @@ * lower priority, this may slow down the driver a bit however. */ #if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE +#define SDC_NICE_WAITING FALSE #endif /*===========================================================================*/ From 9e1b88d85fcbdb9ff30e39e30b63a883735df86f Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 10 Apr 2016 17:27:36 -0700 Subject: [PATCH 122/164] Enable FATFS fast seek feature. Handy when appending to large baseband files. --- firmware/application/ffconf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/application/ffconf.h b/firmware/application/ffconf.h index b838f9f2..e2bb33b3 100644 --- a/firmware/application/ffconf.h +++ b/firmware/application/ffconf.h @@ -50,7 +50,7 @@ / To enable it, also _FS_READONLY need to be set to 0. */ -#define _USE_FASTSEEK 0 +#define _USE_FASTSEEK 1 /* This option switches fast seek feature. (0:Disable or 1:Enable) */ From f09d803e61170570776eb2186c499dd7ad789ab9 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 10 Apr 2016 17:29:14 -0700 Subject: [PATCH 123/164] Use correct SDC card present function. Was using the LLD function directly -- no! --- firmware/application/sd_card.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/application/sd_card.cpp b/firmware/application/sd_card.cpp index cef4be93..ed2a90b2 100644 --- a/firmware/application/sd_card.cpp +++ b/firmware/application/sd_card.cpp @@ -44,7 +44,7 @@ FRESULT mount() { Signal status_signal; void poll_inserted() { - const auto card_present_now = sdc_lld_is_card_inserted(&SDCD1); + const auto card_present_now = sdcIsCardInserted(&SDCD1); if( card_present_now != card_present ) { card_present = card_present_now; From 1682f4700d9e943844e695005036f2953d42b256 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 10 Apr 2016 17:30:12 -0700 Subject: [PATCH 124/164] Move SDC CCLK to 25MHz If your card can't hack it, get a new card. --- firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c b/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c index be0e2599..2f09f974 100644 --- a/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c +++ b/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c @@ -200,8 +200,8 @@ static void sdio_cclk_set_400khz(void) { } static void sdio_cclk_set_fast(void) { - /* 200MHz / (2 * 5) = 20MHz */ - sdio_cclk_set(5); + /* 200MHz / (2 * 4) = 25MHz */ + sdio_cclk_set(4); } static void sdio_width_set_1bit(void) { From c01f2d82e16dbdbc945d5413f8c7e81d9dd3147d Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Mon, 11 Apr 2016 10:18:31 -0700 Subject: [PATCH 125/164] Move TPMS taps to dsp_fir_taps.hpp. Will soon use in proc_record.cpp. --- firmware/baseband/proc_tpms.cpp | 21 --------------------- firmware/common/dsp_fir_taps.hpp | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/firmware/baseband/proc_tpms.cpp b/firmware/baseband/proc_tpms.cpp index 2ce115a3..1ea152f6 100644 --- a/firmware/baseband/proc_tpms.cpp +++ b/firmware/baseband/proc_tpms.cpp @@ -25,27 +25,6 @@ #include "dsp_fir_taps.hpp" -// IFIR image-reject filter: fs=2457600, pass=100000, stop=407200, decim=4, fout=614400 -static constexpr fir_taps_real<24> taps_200k_decim_0 = { - .pass_frequency_normalized = 100000.0f / 2457600.0f, - .stop_frequency_normalized = 407200.0f / 2457600.0f, - .taps = { { - 90, 94, 4, -240, -570, -776, -563, 309, - 1861, 3808, 5618, 6710, 6710, 5618, 3808, 1861, - 309, -563, -776, -570, -240, 4, 94, 90, - } }, -}; - -// IFIR prototype filter: fs=614400, pass=100000, stop=207200, decim=2, fout=307200 -static constexpr fir_taps_real<16> taps_200k_decim_1 = { - .pass_frequency_normalized = 100000.0f / 614400.0f, - .stop_frequency_normalized = 207200.0f / 614400.0f, - .taps = { { - -132, -256, 545, 834, -1507, -2401, 4666, 14583, - 14583, 4666, -2401, -1507, 834, 545, -256, -132, - } }, -}; - TPMSProcessor::TPMSProcessor() { decim_0.configure(taps_200k_decim_0.taps, 33554432); decim_1.configure(taps_200k_decim_1.taps, 131072); diff --git a/firmware/common/dsp_fir_taps.hpp b/firmware/common/dsp_fir_taps.hpp index 535809b8..2eb13b69 100644 --- a/firmware/common/dsp_fir_taps.hpp +++ b/firmware/common/dsp_fir_taps.hpp @@ -313,4 +313,27 @@ constexpr fir_taps_real<64> taps_64_lp_156_198 { } }, }; +// TPMS decimation filters //////////////////////////////////////////////// + +// IFIR image-reject filter: fs=2457600, pass=100000, stop=407200, decim=4, fout=614400 +static constexpr fir_taps_real<24> taps_200k_decim_0 = { + .pass_frequency_normalized = 100000.0f / 2457600.0f, + .stop_frequency_normalized = 407200.0f / 2457600.0f, + .taps = { { + 90, 94, 4, -240, -570, -776, -563, 309, + 1861, 3808, 5618, 6710, 6710, 5618, 3808, 1861, + 309, -563, -776, -570, -240, 4, 94, 90, + } }, +}; + +// IFIR prototype filter: fs=614400, pass=100000, stop=207200, decim=2, fout=307200 +static constexpr fir_taps_real<16> taps_200k_decim_1 = { + .pass_frequency_normalized = 100000.0f / 614400.0f, + .stop_frequency_normalized = 207200.0f / 614400.0f, + .taps = { { + -132, -256, 545, 834, -1507, -2401, 4666, 14583, + 14583, 4666, -2401, -1507, 834, 545, -256, -132, + } }, +}; + #endif/*__DSP_FIR_TAPS_H__*/ From 59f1a32566fc0927dc4138121c73e5d11ae7cd77 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 9 Feb 2016 17:49:17 -0800 Subject: [PATCH 126/164] Semi-naive audio recording to SD card. --- firmware/application/Makefile | 1 + firmware/application/analog_audio_app.cpp | 2 + firmware/application/analog_audio_app.hpp | 4 + firmware/application/audio_thread.cpp | 24 ++++ firmware/application/audio_thread.hpp | 127 ++++++++++++++++++++ firmware/application/event_m0.cpp | 2 + firmware/baseband/audio_output.cpp | 10 +- firmware/baseband/audio_output.hpp | 5 +- firmware/baseband/stream_input.hpp | 54 +++++++++ firmware/common/portapack_shared_memory.hpp | 1 + 10 files changed, 227 insertions(+), 3 deletions(-) create mode 100644 firmware/application/audio_thread.cpp create mode 100644 firmware/application/audio_thread.hpp create mode 100644 firmware/baseband/stream_input.hpp diff --git a/firmware/application/Makefile b/firmware/application/Makefile index 31201908..697660c8 100755 --- a/firmware/application/Makefile +++ b/firmware/application/Makefile @@ -183,6 +183,7 @@ CPPSRC = main.cpp \ file.cpp \ log_file.cpp \ png_writer.cpp \ + audio_thread.cpp \ manchester.cpp \ string_format.cpp \ temperature_logger.cpp \ diff --git a/firmware/application/analog_audio_app.cpp b/firmware/application/analog_audio_app.cpp index 89bbbd61..f929ebfb 100644 --- a/firmware/application/analog_audio_app.cpp +++ b/firmware/application/analog_audio_app.cpp @@ -135,6 +135,8 @@ AnalogAudioView::AnalogAudioView( audio::output::start(); update_modulation(static_cast(modulation)); + + audio_thread = std::make_unique("audio.s16"); } AnalogAudioView::~AnalogAudioView() { diff --git a/firmware/application/analog_audio_app.hpp b/firmware/application/analog_audio_app.hpp index 7fb93432..67b66cf6 100644 --- a/firmware/application/analog_audio_app.hpp +++ b/firmware/application/analog_audio_app.hpp @@ -27,6 +27,8 @@ #include "ui_receiver.hpp" #include "ui_spectrum.hpp" +#include "audio_thread.hpp" + #include "ui_font_fixed_8x16.hpp" namespace ui { @@ -146,6 +148,8 @@ private: spectrum::WaterfallWidget waterfall; + std::unique_ptr audio_thread; + void on_tuning_frequency_changed(rf::Frequency f); void on_baseband_bandwidth_changed(uint32_t bandwidth_hz); void on_rf_amp_changed(bool v); diff --git a/firmware/application/audio_thread.cpp b/firmware/application/audio_thread.cpp new file mode 100644 index 00000000..eed06109 --- /dev/null +++ b/firmware/application/audio_thread.cpp @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "audio_thread.hpp" + +Thread* AudioThread::thread = nullptr; diff --git a/firmware/application/audio_thread.hpp b/firmware/application/audio_thread.hpp new file mode 100644 index 00000000..1d7374d1 --- /dev/null +++ b/firmware/application/audio_thread.hpp @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __AUDIO_THREAD_H__ +#define __AUDIO_THREAD_H__ + +#include "ch.h" + +#include "file.hpp" + +#include "event_m0.hpp" + +#include "portapack_shared_memory.hpp" + +#include "hackrf_gpio.hpp" +using namespace hackrf::one; + +#include + +class StreamOutput { +public: + StreamOutput( + FIFO* const fifo + ) : fifo { fifo } + { + } + + size_t available() { + return fifo->len(); + } + + size_t read(void* const data, const size_t length) { + return fifo->out(reinterpret_cast(data), length); + } + +private: + FIFO* const fifo; +}; + +class AudioThread { +public: + AudioThread( + std::string file_path + ) : file_path { std::move(file_path) } + { + // Need significant stack for FATFS + thread = chThdCreateFromHeap(NULL, 1024, NORMALPRIO + 10, AudioThread::static_fn, this); + } + + ~AudioThread() { + chThdTerminate(thread); + chThdWait(thread); + } + +private: + const std::string file_path; + + File file; + static Thread* thread; + + static msg_t static_fn(void* arg) { + auto obj = static_cast(arg); + obj->run(); + + return 0; + } + + void run() { + auto write_buffer = std::make_unique>(); + if( !write_buffer ) { + return; + } + + if( !file.open_for_append(file_path) ) { + return; + } + + while( !chThdShouldTerminate() ) { + // SUCH A HACK!!! + + auto fifo = reinterpret_cast*>(shared_memory.FIFO_HACK); + if( !fifo ) { + break; + } + + StreamOutput stream { fifo }; + + if( stream.available() >= write_buffer->size() ) { + led_usb.on(); + + const auto bytes_to_write = stream.read(write_buffer->data(), write_buffer->size()); + + if( bytes_to_write ) { + if( !file.write(write_buffer->data(), bytes_to_write) ) { + led_tx.on(); + break; + } + } + led_usb.off(); + } + + chThdSleepMilliseconds(25); + } + + file.close(); + } +}; + +#endif/*__AUDIO_THREAD_H__*/ diff --git a/firmware/application/event_m0.cpp b/firmware/application/event_m0.cpp index 023f06f4..06890318 100644 --- a/firmware/application/event_m0.cpp +++ b/firmware/application/event_m0.cpp @@ -251,4 +251,6 @@ void EventDispatcher::init_message_queues() { new (&shared_memory.application_queue) MessageQueue( shared_memory.application_queue_data, SharedMemory::application_queue_k ); + + shared_memory.FIFO_HACK = nullptr; } diff --git a/firmware/baseband/audio_output.cpp b/firmware/baseband/audio_output.cpp index 6f95cf55..a7047319 100644 --- a/firmware/baseband/audio_output.cpp +++ b/firmware/baseband/audio_output.cpp @@ -83,15 +83,21 @@ void AudioOutput::on_block( } } - fill_audio_buffer(audio); + fill_audio_buffer(audio, audio_present); } -void AudioOutput::fill_audio_buffer(const buffer_f32_t& audio) { +void AudioOutput::fill_audio_buffer(const buffer_f32_t& audio, const bool send_to_fifo) { + std::array audio_int; + auto audio_buffer = audio::dma::tx_empty_buffer(); for(size_t i=0; i +#include +#include + +class StreamInput { +public: + StreamInput() : fifo { std::make_unique>() } + { + // TODO: Send stream creation message. + shared_memory.FIFO_HACK = fifo.get(); + } + + ~StreamInput() { + // TODO: Send stream distruction message. + shared_memory.FIFO_HACK = nullptr; + } + + size_t write(const void* const data, const size_t length) { + return fifo->in(reinterpret_cast(data), length); + } + +private: + std::unique_ptr> fifo; +}; + +#endif/*__STREAM_INPUT_H__*/ diff --git a/firmware/common/portapack_shared_memory.hpp b/firmware/common/portapack_shared_memory.hpp index b7b97f39..612a3b27 100644 --- a/firmware/common/portapack_shared_memory.hpp +++ b/firmware/common/portapack_shared_memory.hpp @@ -40,6 +40,7 @@ struct SharedMemory { uint8_t baseband_queue_data[1 << baseband_queue_k]; MessageQueue application_queue; uint8_t application_queue_data[1 << application_queue_k]; + void* FIFO_HACK; // TODO: M0 should directly configure and control DMA channel that is // acquiring ADC samples. From f94938db8ef0629058b995b24f117fd187df8f07 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 27 Mar 2016 22:39:42 -0700 Subject: [PATCH 127/164] De-template FIFO. --- firmware/application/audio_thread.hpp | 6 +++--- firmware/baseband/audio_output.hpp | 2 +- firmware/baseband/stream_input.hpp | 13 +++++++++---- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/firmware/application/audio_thread.hpp b/firmware/application/audio_thread.hpp index 1d7374d1..2893ca8e 100644 --- a/firmware/application/audio_thread.hpp +++ b/firmware/application/audio_thread.hpp @@ -38,7 +38,7 @@ using namespace hackrf::one; class StreamOutput { public: StreamOutput( - FIFO* const fifo + FIFO* const fifo ) : fifo { fifo } { } @@ -52,7 +52,7 @@ public: } private: - FIFO* const fifo; + FIFO* const fifo; }; class AudioThread { @@ -96,7 +96,7 @@ private: while( !chThdShouldTerminate() ) { // SUCH A HACK!!! - auto fifo = reinterpret_cast*>(shared_memory.FIFO_HACK); + auto fifo = reinterpret_cast*>(shared_memory.FIFO_HACK); if( !fifo ) { break; } diff --git a/firmware/baseband/audio_output.hpp b/firmware/baseband/audio_output.hpp index 47f01a92..c935ed86 100644 --- a/firmware/baseband/audio_output.hpp +++ b/firmware/baseband/audio_output.hpp @@ -54,7 +54,7 @@ private: IIRBiquadFilter deemph; FMSquelch squelch; - StreamInput stream; + StreamInput stream { 13 }; AudioStatsCollector audio_stats; diff --git a/firmware/baseband/stream_input.hpp b/firmware/baseband/stream_input.hpp index 76f94252..ed508aaa 100644 --- a/firmware/baseband/stream_input.hpp +++ b/firmware/baseband/stream_input.hpp @@ -32,10 +32,13 @@ class StreamInput { public: - StreamInput() : fifo { std::make_unique>() } + StreamInput(const size_t K) : + K { K }, + data { std::make_unique(1UL << K) }, + fifo { data.get(), K } { // TODO: Send stream creation message. - shared_memory.FIFO_HACK = fifo.get(); + shared_memory.FIFO_HACK = &fifo; } ~StreamInput() { @@ -44,11 +47,13 @@ public: } size_t write(const void* const data, const size_t length) { - return fifo->in(reinterpret_cast(data), length); + return fifo.in(reinterpret_cast(data), length); } private: - std::unique_ptr> fifo; + const size_t K; + std::unique_ptr data; + FIFO fifo; }; #endif/*__STREAM_INPUT_H__*/ From aca19ae9979e68055c9f2cc61085772a508d78c9 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 27 Mar 2016 22:47:48 -0700 Subject: [PATCH 128/164] Factor out SD card write size. --- firmware/application/audio_thread.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/firmware/application/audio_thread.hpp b/firmware/application/audio_thread.hpp index 2893ca8e..0d00b043 100644 --- a/firmware/application/audio_thread.hpp +++ b/firmware/application/audio_thread.hpp @@ -71,6 +71,7 @@ public: } private: + static constexpr size_t write_size = 4096; const std::string file_path; File file; @@ -84,7 +85,7 @@ private: } void run() { - auto write_buffer = std::make_unique>(); + auto write_buffer = std::make_unique>(); if( !write_buffer ) { return; } From daa2f7aed0ca4c5402d4d5f135da2ecd5193db7b Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 27 Mar 2016 22:48:13 -0700 Subject: [PATCH 129/164] Drain write FIFO, don't read just one block. --- firmware/application/audio_thread.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/application/audio_thread.hpp b/firmware/application/audio_thread.hpp index 0d00b043..5155fc4f 100644 --- a/firmware/application/audio_thread.hpp +++ b/firmware/application/audio_thread.hpp @@ -104,7 +104,7 @@ private: StreamOutput stream { fifo }; - if( stream.available() >= write_buffer->size() ) { + while( stream.available() >= write_buffer->size() ) { led_usb.on(); const auto bytes_to_write = stream.read(write_buffer->data(), write_buffer->size()); From 8e14d2f4e8224c21fde4c9f1c2a20297cdead87c Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 27 Mar 2016 22:49:30 -0700 Subject: [PATCH 130/164] Signal SD card write thread from M4 event. --- firmware/application/audio_thread.hpp | 16 +++++++++++++--- firmware/application/event_m0.cpp | 4 ++++ firmware/application/event_m0.hpp | 2 ++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/firmware/application/audio_thread.hpp b/firmware/application/audio_thread.hpp index 5155fc4f..9752d018 100644 --- a/firmware/application/audio_thread.hpp +++ b/firmware/application/audio_thread.hpp @@ -67,11 +67,23 @@ public: ~AudioThread() { chThdTerminate(thread); + chEvtSignal(thread, EVT_FIFO_HIGHWATER); chThdWait(thread); } + static void check_fifo_isr() { + if( (shared_memory.FIFO_HACK != nullptr) && (thread != nullptr) ) { + auto fifo = reinterpret_cast*>(shared_memory.FIFO_HACK); + if( fifo->len() >= write_size ) { + chEvtSignalI(thread, EVT_FIFO_HIGHWATER); + } + } + } + private: static constexpr size_t write_size = 4096; + static constexpr eventmask_t EVT_FIFO_HIGHWATER = 1; + const std::string file_path; File file; @@ -95,7 +107,7 @@ private: } while( !chThdShouldTerminate() ) { - // SUCH A HACK!!! + chEvtWaitAny(EVT_FIFO_HIGHWATER); auto fifo = reinterpret_cast*>(shared_memory.FIFO_HACK); if( !fifo ) { @@ -117,8 +129,6 @@ private: } led_usb.off(); } - - chThdSleepMilliseconds(25); } file.close(); diff --git a/firmware/application/event_m0.cpp b/firmware/application/event_m0.cpp index 06890318..af12bee1 100644 --- a/firmware/application/event_m0.cpp +++ b/firmware/application/event_m0.cpp @@ -31,6 +31,8 @@ #include "irq_controls.hpp" +#include "audio_thread.hpp" + #include "ch.h" #include "lpc43xx_cpp.hpp" @@ -44,6 +46,7 @@ CH_IRQ_HANDLER(M4Core_IRQHandler) { CH_IRQ_PROLOGUE(); chSysLockFromIsr(); + AudioThread::check_fifo_isr(); EventDispatcher::events_flag_isr(EVT_MASK_APPLICATION); chSysUnlockFromIsr(); @@ -56,6 +59,7 @@ CH_IRQ_HANDLER(M4Core_IRQHandler) { MessageHandlerMap EventDispatcher::message_map_; Thread* EventDispatcher::thread_event_loop = nullptr; +Thread* EventDispatcher::thread_record = nullptr; EventDispatcher::EventDispatcher( ui::Widget* const top_widget, diff --git a/firmware/application/event_m0.hpp b/firmware/application/event_m0.hpp index 414a3a62..69dcede2 100644 --- a/firmware/application/event_m0.hpp +++ b/firmware/application/event_m0.hpp @@ -73,6 +73,8 @@ public: return message_map_; } + static Thread* thread_record; + private: static MessageHandlerMap message_map_; static Thread* thread_event_loop; From 56e448d355b73ea92b125801f126c3d34dac7269 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 6 Apr 2016 10:29:16 -0700 Subject: [PATCH 131/164] Track StreamInput bytes written --- firmware/baseband/stream_input.hpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/firmware/baseband/stream_input.hpp b/firmware/baseband/stream_input.hpp index ed508aaa..6e03c500 100644 --- a/firmware/baseband/stream_input.hpp +++ b/firmware/baseband/stream_input.hpp @@ -47,11 +47,18 @@ public: } size_t write(const void* const data, const size_t length) { - return fifo.in(reinterpret_cast(data), length); + const auto written = fifo.in(reinterpret_cast(data), length); + bytes_written += written; + return written; + } + + uint64_t written() const { + return bytes_written; } private: const size_t K; + uint64_t bytes_written = 0; std::unique_ptr data; FIFO fifo; }; From b3e2e89e518b8e79ce880979b25f7654c4d34017 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 6 Apr 2016 11:15:45 -0700 Subject: [PATCH 132/164] Create audio recording thread in the right place. Was always creating, finding a timing issue when switching baseband modes, would freeze, probably due to a dangling pointer. TODO: Make stream recording setup synchronous. --- firmware/application/analog_audio_app.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware/application/analog_audio_app.cpp b/firmware/application/analog_audio_app.cpp index f929ebfb..1a3da0c1 100644 --- a/firmware/application/analog_audio_app.cpp +++ b/firmware/application/analog_audio_app.cpp @@ -135,8 +135,6 @@ AnalogAudioView::AnalogAudioView( audio::output::start(); update_modulation(static_cast(modulation)); - - audio_thread = std::make_unique("audio.s16"); } AnalogAudioView::~AnalogAudioView() { @@ -281,6 +279,7 @@ void AnalogAudioView::on_headphone_volume_changed(int32_t v) { void AnalogAudioView::update_modulation(const ReceiverModel::Mode modulation) { audio::output::mute(); + audio_thread.reset(); const auto is_wideband_spectrum_mode = (modulation == ReceiverModel::Mode::SpectrumAnalysis); receiver_model.set_baseband_configuration({ @@ -292,6 +291,7 @@ void AnalogAudioView::update_modulation(const ReceiverModel::Mode modulation) { receiver_model.enable(); if( !is_wideband_spectrum_mode ) { + audio_thread = std::make_unique("audio.s16"); audio::output::unmute(); } } From 0d8971cd7d43fc8bfc8d854940a340c5c034343f Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 6 Apr 2016 11:16:48 -0700 Subject: [PATCH 133/164] Use size of provided buffer for stream write. --- firmware/baseband/audio_output.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/baseband/audio_output.cpp b/firmware/baseband/audio_output.cpp index a7047319..05d56d20 100644 --- a/firmware/baseband/audio_output.cpp +++ b/firmware/baseband/audio_output.cpp @@ -97,7 +97,7 @@ void AudioOutput::fill_audio_buffer(const buffer_f32_t& audio, const bool send_t audio_int[i] = sample_saturated; } if( send_to_fifo ) { - stream.write(audio_int.data(), audio_int.size() * sizeof(int16_t)); + stream.write(audio_int.data(), audio_buffer.count * sizeof(audio_int[0])); } feed_audio_stats(audio); From ba3c9dd8d11ba4766c5481e47883278de74ef403 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 6 Apr 2016 11:26:32 -0700 Subject: [PATCH 134/164] Insist on writing stream data in buffer-sized blocks. Maintaining alignment improves SD card write performance significantly. --- firmware/application/audio_thread.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware/application/audio_thread.hpp b/firmware/application/audio_thread.hpp index 9752d018..f87b1219 100644 --- a/firmware/application/audio_thread.hpp +++ b/firmware/application/audio_thread.hpp @@ -121,8 +121,8 @@ private: const auto bytes_to_write = stream.read(write_buffer->data(), write_buffer->size()); - if( bytes_to_write ) { - if( !file.write(write_buffer->data(), bytes_to_write) ) { + if( bytes_to_write == write_buffer->size() ) { + if( !file.write(write_buffer->data(), write_buffer->size()) ) { led_tx.on(); break; } From fc8bb635a66e70d293d838e8e7b433804db13b3b Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 6 Apr 2016 11:26:56 -0700 Subject: [PATCH 135/164] Consider an incomplete write as an error. --- firmware/application/audio_thread.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/firmware/application/audio_thread.hpp b/firmware/application/audio_thread.hpp index f87b1219..6e4a0a3b 100644 --- a/firmware/application/audio_thread.hpp +++ b/firmware/application/audio_thread.hpp @@ -126,6 +126,8 @@ private: led_tx.on(); break; } + } else { + break; } led_usb.off(); } From 08f4542954d538b35ddf5683ea02000173dc1cc1 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 6 Apr 2016 11:35:00 -0700 Subject: [PATCH 136/164] Marginal attempt to simplify stream write loop. --- firmware/application/audio_thread.hpp | 40 +++++++++++++++++---------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/firmware/application/audio_thread.hpp b/firmware/application/audio_thread.hpp index 6e4a0a3b..2a8cac18 100644 --- a/firmware/application/audio_thread.hpp +++ b/firmware/application/audio_thread.hpp @@ -106,7 +106,8 @@ private: return; } - while( !chThdShouldTerminate() ) { + bool success = true; + while( success && !chThdShouldTerminate() ) { chEvtWaitAny(EVT_FIFO_HIGHWATER); auto fifo = reinterpret_cast*>(shared_memory.FIFO_HACK); @@ -116,25 +117,34 @@ private: StreamOutput stream { fifo }; - while( stream.available() >= write_buffer->size() ) { - led_usb.on(); - - const auto bytes_to_write = stream.read(write_buffer->data(), write_buffer->size()); - - if( bytes_to_write == write_buffer->size() ) { - if( !file.write(write_buffer->data(), write_buffer->size()) ) { - led_tx.on(); - break; - } - } else { - break; - } - led_usb.off(); + while( success && (stream.available() >= write_buffer->size()) ) { + success = transfer(stream, write_buffer.get()); } } + if( !success ) { + led_tx.on(); + } + file.close(); } + + bool transfer(StreamOutput& stream, std::array* const write_buffer) { + bool success = false; + + led_usb.on(); + + const auto bytes_to_write = stream.read(write_buffer->data(), write_buffer->size()); + if( bytes_to_write == write_buffer->size() ) { + if( file.write(write_buffer->data(), write_buffer->size()) ) { + success = true; + } + } + + led_usb.off(); + + return success; + } }; #endif/*__AUDIO_THREAD_H__*/ From feeb5bff6fb4e9bb46ffa74672d6c5a78c87cbb0 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 6 Apr 2016 11:43:47 -0700 Subject: [PATCH 137/164] Move AudioThread con/destruction to proper places. --- firmware/application/audio_thread.hpp | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/firmware/application/audio_thread.hpp b/firmware/application/audio_thread.hpp index 2a8cac18..6f87c1df 100644 --- a/firmware/application/audio_thread.hpp +++ b/firmware/application/audio_thread.hpp @@ -59,8 +59,12 @@ class AudioThread { public: AudioThread( std::string file_path - ) : file_path { std::move(file_path) } + ) : write_buffer { std::make_unique>() } { + if( !file.open_for_append(file_path) ) { + return; + } + // Need significant stack for FATFS thread = chThdCreateFromHeap(NULL, 1024, NORMALPRIO + 10, AudioThread::static_fn, this); } @@ -84,8 +88,7 @@ private: static constexpr size_t write_size = 4096; static constexpr eventmask_t EVT_FIFO_HIGHWATER = 1; - const std::string file_path; - + std::unique_ptr> write_buffer; File file; static Thread* thread; @@ -97,15 +100,6 @@ private: } void run() { - auto write_buffer = std::make_unique>(); - if( !write_buffer ) { - return; - } - - if( !file.open_for_append(file_path) ) { - return; - } - bool success = true; while( success && !chThdShouldTerminate() ) { chEvtWaitAny(EVT_FIFO_HIGHWATER); @@ -125,8 +119,6 @@ private: if( !success ) { led_tx.on(); } - - file.close(); } bool transfer(StreamOutput& stream, std::array* const write_buffer) { From 14d1b5fd727309e8389fab127a7b6e7b05743e12 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 6 Apr 2016 11:47:25 -0700 Subject: [PATCH 138/164] Further AudioThread cleanup. --- firmware/application/audio_thread.hpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/firmware/application/audio_thread.hpp b/firmware/application/audio_thread.hpp index 6f87c1df..7290a3de 100644 --- a/firmware/application/audio_thread.hpp +++ b/firmware/application/audio_thread.hpp @@ -72,7 +72,11 @@ public: ~AudioThread() { chThdTerminate(thread); chEvtSignal(thread, EVT_FIFO_HIGHWATER); - chThdWait(thread); + const auto success = chThdWait(thread); + + if( !success ) { + led_tx.on(); + } } static void check_fifo_isr() { @@ -94,12 +98,10 @@ private: static msg_t static_fn(void* arg) { auto obj = static_cast(arg); - obj->run(); - - return 0; + return obj->run(); } - void run() { + msg_t run() { bool success = true; while( success && !chThdShouldTerminate() ) { chEvtWaitAny(EVT_FIFO_HIGHWATER); @@ -115,10 +117,8 @@ private: success = transfer(stream, write_buffer.get()); } } - - if( !success ) { - led_tx.on(); - } + + return success; } bool transfer(StreamOutput& stream, std::array* const write_buffer) { From 03dfd2b48e036f242acd9bb5d97fb7a5f1adc079 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 6 Apr 2016 11:52:05 -0700 Subject: [PATCH 139/164] ...and more AudioThread cleanup. --- firmware/application/audio_thread.hpp | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/firmware/application/audio_thread.hpp b/firmware/application/audio_thread.hpp index 7290a3de..7474c43d 100644 --- a/firmware/application/audio_thread.hpp +++ b/firmware/application/audio_thread.hpp @@ -102,23 +102,24 @@ private: } msg_t run() { - bool success = true; - while( success && !chThdShouldTerminate() ) { + auto fifo = reinterpret_cast*>(shared_memory.FIFO_HACK); + if( !fifo ) { + return false; + } + + StreamOutput stream { fifo }; + + while( !chThdShouldTerminate() ) { chEvtWaitAny(EVT_FIFO_HIGHWATER); - auto fifo = reinterpret_cast*>(shared_memory.FIFO_HACK); - if( !fifo ) { - break; - } - - StreamOutput stream { fifo }; - - while( success && (stream.available() >= write_buffer->size()) ) { - success = transfer(stream, write_buffer.get()); + while( stream.available() >= write_buffer->size() ) { + if( !transfer(stream, write_buffer.get()) ) { + return false; + } } } - - return success; + + return true; } bool transfer(StreamOutput& stream, std::array* const write_buffer) { From 4a1d3b14a195b8009430fd37711a545ceace6d7c Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 6 Apr 2016 15:00:22 -0700 Subject: [PATCH 140/164] Open AudioThread file on new thread. Opening it in constructor was causing UI pauses. --- firmware/application/audio_thread.hpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/firmware/application/audio_thread.hpp b/firmware/application/audio_thread.hpp index 7474c43d..2c5dcad8 100644 --- a/firmware/application/audio_thread.hpp +++ b/firmware/application/audio_thread.hpp @@ -59,12 +59,9 @@ class AudioThread { public: AudioThread( std::string file_path - ) : write_buffer { std::make_unique>() } + ) : file_path { std::move(file_path) }, + write_buffer { std::make_unique>() } { - if( !file.open_for_append(file_path) ) { - return; - } - // Need significant stack for FATFS thread = chThdCreateFromHeap(NULL, 1024, NORMALPRIO + 10, AudioThread::static_fn, this); } @@ -92,6 +89,7 @@ private: static constexpr size_t write_size = 4096; static constexpr eventmask_t EVT_FIFO_HIGHWATER = 1; + const std::string file_path; std::unique_ptr> write_buffer; File file; static Thread* thread; @@ -102,6 +100,10 @@ private: } msg_t run() { + if( !file.open_for_append(file_path) ) { + return false; + } + auto fifo = reinterpret_cast*>(shared_memory.FIFO_HACK); if( !fifo ) { return false; From a5c2143ca892d2e4b56b7561255ffb151a741f77 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 6 Apr 2016 16:22:06 -0700 Subject: [PATCH 141/164] Signal M0 when stream FIFO has another "chunk". --- firmware/baseband/stream_input.hpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/firmware/baseband/stream_input.hpp b/firmware/baseband/stream_input.hpp index 6e03c500..cfb2a00a 100644 --- a/firmware/baseband/stream_input.hpp +++ b/firmware/baseband/stream_input.hpp @@ -48,7 +48,13 @@ public: size_t write(const void* const data, const size_t length) { const auto written = fifo.in(reinterpret_cast(data), length); + + const auto last_bytes_written = bytes_written; bytes_written += written; + if( (bytes_written & event_bytes_mask) < (last_bytes_written & event_bytes_mask) ) { + creg::m4txevent::assert(); + } + return written; } @@ -58,6 +64,7 @@ public: private: const size_t K; + const uint64_t event_bytes_mask = (1ULL << 12) - 1; uint64_t bytes_written = 0; std::unique_ptr data; FIFO fifo; From 9eefd56410cf2ca2b9c31bbf3cc3f5901609b71c Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Mon, 11 Apr 2016 09:54:42 -0700 Subject: [PATCH 142/164] StreamInput: notify other core every fourth of FIFO written. --- firmware/baseband/stream_input.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/baseband/stream_input.hpp b/firmware/baseband/stream_input.hpp index cfb2a00a..1b1ec552 100644 --- a/firmware/baseband/stream_input.hpp +++ b/firmware/baseband/stream_input.hpp @@ -64,7 +64,7 @@ public: private: const size_t K; - const uint64_t event_bytes_mask = (1ULL << 12) - 1; + const uint64_t event_bytes_mask = (1ULL << (K - 2)) - 1; uint64_t bytes_written = 0; std::unique_ptr data; FIFO fifo; From 743dc9f542837256f67192914d89e8423356dd3d Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Mon, 11 Apr 2016 10:59:55 -0700 Subject: [PATCH 143/164] Rough implementation of capture mode --- firmware/application/Makefile | 1 + firmware/application/capture_app.cpp | 62 ++++++++++++++++++++++++++ firmware/application/capture_app.hpp | 55 +++++++++++++++++++++++ firmware/application/ui_navigation.cpp | 3 +- firmware/baseband/Makefile | 1 + firmware/baseband/baseband_thread.cpp | 2 + firmware/baseband/proc_capture.cpp | 45 +++++++++++++++++++ firmware/baseband/proc_capture.hpp | 52 +++++++++++++++++++++ 8 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 firmware/application/capture_app.cpp create mode 100644 firmware/application/capture_app.hpp create mode 100644 firmware/baseband/proc_capture.cpp create mode 100644 firmware/baseband/proc_capture.hpp diff --git a/firmware/application/Makefile b/firmware/application/Makefile index 697660c8..05a2fd5e 100755 --- a/firmware/application/Makefile +++ b/firmware/application/Makefile @@ -179,6 +179,7 @@ CPPSRC = main.cpp \ ../common/tpms_packet.cpp \ ert_app.cpp \ ../common/ert_packet.cpp \ + capture_app.cpp \ sd_card.cpp \ file.cpp \ log_file.cpp \ diff --git a/firmware/application/capture_app.cpp b/firmware/application/capture_app.cpp new file mode 100644 index 00000000..d08a277e --- /dev/null +++ b/firmware/application/capture_app.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "capture_app.hpp" + +#include "baseband_api.hpp" + +#include "utility.hpp" + +namespace ui { + +CaptureAppView::CaptureAppView(NavigationView&) { + capture_thread = std::make_unique("baseband.c16"); + + radio::enable({ + tuning_frequency(), + sampling_rate, + baseband_bandwidth, + rf::Direction::Receive, + false, 16, 16, + 1, + }); + + baseband::start({ + .mode = 7, + .sampling_rate = sampling_rate, + .decimation_factor = 1, + }); +} + +CaptureAppView::~CaptureAppView() { + baseband::stop(); + radio::disable(); +} + +uint32_t CaptureAppView::target_frequency() const { + return initial_target_frequency; +} + +uint32_t CaptureAppView::tuning_frequency() const { + return target_frequency() - (sampling_rate / 4); +} + +} /* namespace ui */ diff --git a/firmware/application/capture_app.hpp b/firmware/application/capture_app.hpp new file mode 100644 index 00000000..fe043ff9 --- /dev/null +++ b/firmware/application/capture_app.hpp @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __CAPTURE_APP_HPP__ +#define __CAPTURE_APP_HPP__ + +#include "ui_widget.hpp" +#include "ui_navigation.hpp" + +#include "audio_thread.hpp" + +#include +#include + +namespace ui { + +class CaptureAppView : public View { +public: + CaptureAppView(NavigationView& nav); + ~CaptureAppView(); + + std::string title() const override { return "Capture"; }; + +private: + static constexpr uint32_t initial_target_frequency = 91500000; + static constexpr uint32_t sampling_rate = 2457600; + static constexpr uint32_t baseband_bandwidth = 1750000; + + std::unique_ptr capture_thread; + + uint32_t target_frequency() const; + uint32_t tuning_frequency() const; +}; + +} /* namespace ui */ + +#endif/*__CAPTURE_APP_HPP__*/ diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index ee725801..2b245dd6 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -31,6 +31,7 @@ #include "ais_app.hpp" #include "ert_app.hpp" #include "tpms_app.hpp" +#include "capture_app.hpp" #include "core_control.hpp" @@ -168,7 +169,7 @@ ReceiverMenuView::ReceiverMenuView(NavigationView& nav) { SystemMenuView::SystemMenuView(NavigationView& nav) { add_items<7>({ { { "Receiver", [&nav](){ nav.push(); } }, - { "Capture", [&nav](){ nav.push(); } }, + { "Capture", [&nav](){ nav.push(); } }, { "Analyze", [&nav](){ nav.push(); } }, { "Setup", [&nav](){ nav.push(); } }, { "About", [&nav](){ nav.push(); } }, diff --git a/firmware/baseband/Makefile b/firmware/baseband/Makefile index fedacf9c..5881ff66 100755 --- a/firmware/baseband/Makefile +++ b/firmware/baseband/Makefile @@ -145,6 +145,7 @@ CPPSRC = main.cpp \ proc_wideband_spectrum.cpp \ proc_tpms.cpp \ proc_ert.cpp \ + proc_capture.cpp \ dsp_squelch.cpp \ clock_recovery.cpp \ packet_builder.cpp \ diff --git a/firmware/baseband/baseband_thread.cpp b/firmware/baseband/baseband_thread.cpp index 2065979d..88d77ef0 100644 --- a/firmware/baseband/baseband_thread.cpp +++ b/firmware/baseband/baseband_thread.cpp @@ -38,6 +38,7 @@ #include "proc_wideband_spectrum.hpp" #include "proc_tpms.hpp" #include "proc_ert.hpp" +#include "proc_capture.hpp" #include "portapack_shared_memory.hpp" @@ -130,6 +131,7 @@ BasebandProcessor* BasebandThread::create_processor(const int32_t mode) { case 4: return new WidebandSpectrum(); case 5: return new TPMSProcessor(); case 6: return new ERTProcessor(); + case 7: return new CaptureProcessor(); default: return nullptr; } } diff --git a/firmware/baseband/proc_capture.cpp b/firmware/baseband/proc_capture.cpp new file mode 100644 index 00000000..fcbbd647 --- /dev/null +++ b/firmware/baseband/proc_capture.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "proc_capture.hpp" + +#include "dsp_fir_taps.hpp" + +#include "utility.hpp" + +CaptureProcessor::CaptureProcessor() { + decim_0.configure(taps_200k_decim_0.taps, 33554432); + decim_1.configure(taps_200k_decim_1.taps, 131072); + + stream = std::make_unique(15); +} + +void CaptureProcessor::execute(const buffer_c8_t& buffer) { + /* 2.4576MHz, 2048 samples */ + const auto decim_0_out = decim_0.execute(buffer, dst_buffer); + const auto decim_1_out = decim_1.execute(decim_0_out, dst_buffer); + const auto decimator_out = decim_1_out; + + if( stream ) { + const size_t bytes_to_write = sizeof(*decimator_out.p) * decimator_out.count; + const auto result = stream->write(decimator_out.p, bytes_to_write); + } +} diff --git a/firmware/baseband/proc_capture.hpp b/firmware/baseband/proc_capture.hpp new file mode 100644 index 00000000..9e77a8ce --- /dev/null +++ b/firmware/baseband/proc_capture.hpp @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __PROC_CAPTURE_HPP__ +#define __PROC_CAPTURE_HPP__ + +#include "baseband_processor.hpp" +#include "dsp_decimate.hpp" + +#include "stream_input.hpp" + +#include +#include + +class CaptureProcessor : public BasebandProcessor { +public: + CaptureProcessor(); + + void execute(const buffer_c8_t& buffer) override; + +private: + std::array dst; + const buffer_c16_t dst_buffer { + dst.data(), + dst.size() + }; + + dsp::decimate::FIRC8xR16x24FS4Decim4 decim_0; + dsp::decimate::FIRC16xR16x16Decim2 decim_1; + + std::unique_ptr stream; +}; + +#endif/*__PROC_CAPTURE_HPP__*/ From 5558ca60d7056930b9d9dbcc80ecc252e98c2ba1 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Mon, 11 Apr 2016 11:00:47 -0700 Subject: [PATCH 144/164] Enlarge capture buffers -- inter-core FIFO, SDC --- firmware/application/audio_thread.hpp | 2 +- firmware/baseband/audio_output.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware/application/audio_thread.hpp b/firmware/application/audio_thread.hpp index 2c5dcad8..99d82c18 100644 --- a/firmware/application/audio_thread.hpp +++ b/firmware/application/audio_thread.hpp @@ -86,7 +86,7 @@ public: } private: - static constexpr size_t write_size = 4096; + static constexpr size_t write_size = 16384; static constexpr eventmask_t EVT_FIFO_HIGHWATER = 1; const std::string file_path; diff --git a/firmware/baseband/audio_output.hpp b/firmware/baseband/audio_output.hpp index c935ed86..3837684a 100644 --- a/firmware/baseband/audio_output.hpp +++ b/firmware/baseband/audio_output.hpp @@ -54,7 +54,7 @@ private: IIRBiquadFilter deemph; FMSquelch squelch; - StreamInput stream { 13 }; + StreamInput stream { 14 }; AudioStatsCollector audio_stats; From 40df73b92330d5b8a0e739b00f46f104a68c7d72 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Mon, 11 Apr 2016 11:22:35 -0700 Subject: [PATCH 145/164] Start/stop control of baseband capture. --- firmware/application/capture_app.cpp | 22 +++++++++++++++++++++- firmware/application/capture_app.hpp | 15 +++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/firmware/application/capture_app.cpp b/firmware/application/capture_app.cpp index d08a277e..02058e9f 100644 --- a/firmware/application/capture_app.cpp +++ b/firmware/application/capture_app.cpp @@ -28,7 +28,13 @@ namespace ui { CaptureAppView::CaptureAppView(NavigationView&) { - capture_thread = std::make_unique("baseband.c16"); + add_children({ { + &button_start, + &button_stop, + } }); + + button_start.on_select = [this](Button&){ this->on_start(); }; + button_stop.on_select = [this](Button&){ this->on_stop(); }; radio::enable({ tuning_frequency(), @@ -51,6 +57,20 @@ CaptureAppView::~CaptureAppView() { radio::disable(); } +void CaptureAppView::focus() { + button_start.focus(); +} + +void CaptureAppView::on_start() { + if( !capture_thread ) { + capture_thread = std::make_unique("baseband.c16"); + } +} + +void CaptureAppView::on_stop() { + capture_thread.reset(); +} + uint32_t CaptureAppView::target_frequency() const { return initial_target_frequency; } diff --git a/firmware/application/capture_app.hpp b/firmware/application/capture_app.hpp index fe043ff9..0e38f960 100644 --- a/firmware/application/capture_app.hpp +++ b/firmware/application/capture_app.hpp @@ -37,6 +37,8 @@ public: CaptureAppView(NavigationView& nav); ~CaptureAppView(); + void focus() override; + std::string title() const override { return "Capture"; }; private: @@ -48,6 +50,19 @@ private: uint32_t target_frequency() const; uint32_t tuning_frequency() const; + + void on_start(); + void on_stop(); + + Button button_start { + { 16, 17 * 16, 96, 24 }, + "Start" + }; + + Button button_stop { + { 240 - 96 - 16, 17 * 16, 96, 24 }, + "Stop" + }; }; } /* namespace ui */ From dc16aa478ff213f45fb601653c97cbe2d230cae9 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Mon, 11 Apr 2016 11:50:03 -0700 Subject: [PATCH 146/164] OOK slicer, clock recovery classes. --- firmware/baseband/ook.hpp | 93 +++++++++++++++++++++++++ firmware/baseband/phase_accumulator.hpp | 50 +++++++++++++ firmware/baseband/phase_detector.hpp | 68 ++++++++++++++++++ 3 files changed, 211 insertions(+) create mode 100644 firmware/baseband/ook.hpp create mode 100644 firmware/baseband/phase_accumulator.hpp create mode 100644 firmware/baseband/phase_detector.hpp diff --git a/firmware/baseband/ook.hpp b/firmware/baseband/ook.hpp new file mode 100644 index 00000000..27333922 --- /dev/null +++ b/firmware/baseband/ook.hpp @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __OOK_HPP__ +#define __OOK_HPP__ + +#include "phase_detector.hpp" +#include "phase_accumulator.hpp" + +#include +#include +#include +#include + +class OOKSlicerMagSquaredInt { +public: + using symbol_t = bool; + + constexpr OOKSlicerMagSquaredInt( + const float samples_per_symbol + ) : mag2_threshold_leak_factor { + static_cast( + factor_sq(-1.0f / (8.0f * samples_per_symbol)) * float(1ULL << 32) + ) + } + { + } + + symbol_t operator()(const std::complex in) { + const uint32_t real2 = in.real() * in.real(); + const uint32_t imag2 = in.imag() * in.imag(); + const uint32_t mag2 = real2 + imag2; + + const uint32_t mag2_attenuated = mag2 >> 3; // Approximation of (-4.5dB)^2 + mag2_threshold = (uint64_t(mag2_threshold) * uint64_t(mag2_threshold_leak_factor)) >> 32; + mag2_threshold = std::max(mag2_threshold, mag2_attenuated); + const bool symbol = (mag2 > mag2_threshold); + return symbol; + } + +private: + const uint32_t mag2_threshold_leak_factor; + uint32_t mag2_threshold = 0; + + constexpr float factor_sq(float db) { + return std::pow(10.0f, db / (10.0f / 2)); + } +}; + +class OOKClockRecovery { +public: + constexpr OOKClockRecovery( + const float samples_per_symbol + ) : symbol_phase_inc_nominal { static_cast(std::round((1ULL << 32) / samples_per_symbol)) }, + phase_detector { samples_per_symbol }, + phase_accumulator { symbol_phase_inc_nominal } + { + } + + template + void operator()(const uint32_t slicer_history, SymbolHandler symbol_handler) { + if( phase_accumulator() ) { + const auto detector_result = phase_detector(slicer_history); + phase_accumulator.set_inc(symbol_phase_inc_nominal + detector_result.error * (symbol_phase_inc_nominal >> 3)); + symbol_handler(detector_result.symbol); + } + } + +private: + const uint32_t symbol_phase_inc_nominal; + PhaseDetectorEarlyLateGate phase_detector; + PhaseAccumulator phase_accumulator; +}; + +#endif/*__OOK_HPP__*/ diff --git a/firmware/baseband/phase_accumulator.hpp b/firmware/baseband/phase_accumulator.hpp new file mode 100644 index 00000000..bf3b331a --- /dev/null +++ b/firmware/baseband/phase_accumulator.hpp @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __PHASE_ACCUMULATOR_HPP__ +#define __PHASE_ACCUMULATOR_HPP__ + +#include + +class PhaseAccumulator { +public: + constexpr PhaseAccumulator( + const uint32_t phase_inc + ) : phase_inc { phase_inc } + { + } + + bool operator()() { + const auto last_phase = phase; + phase += phase_inc; + return (phase < last_phase); + } + + void set_inc(const uint32_t new_phase_inc) { + phase_inc = new_phase_inc; + } + +private: + uint32_t phase { 0 }; + uint32_t phase_inc; +}; + +#endif/*__PHASE_ACCUMULATOR_HPP__*/ diff --git a/firmware/baseband/phase_detector.hpp b/firmware/baseband/phase_detector.hpp new file mode 100644 index 00000000..89cf4b5c --- /dev/null +++ b/firmware/baseband/phase_detector.hpp @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __PHASE_DETECTOR_HPP__ +#define __PHASE_DETECTOR_HPP__ + +#include +#include +#include + +class PhaseDetectorEarlyLateGate { +public: + using history_t = uint32_t; + + using symbol_t = bool; + using error_t = int; + + struct result_t { + symbol_t symbol; + error_t error; + }; + + constexpr PhaseDetectorEarlyLateGate( + const float samples_per_symbol + ) : late_mask { (1U << static_cast(std::ceil(samples_per_symbol / 2))) - 1 }, + early_mask { late_mask << static_cast(std::floor(samples_per_symbol / 2)) }, + sample_bit { static_cast(std::floor(samples_per_symbol / 2)) } + { + } + + result_t operator()(const history_t symbol_history) const { + // history = ...0111, early + // history = ...1110, late + + const symbol_t symbol = (symbol_history >> sample_bit) & 1; + const int late_side = __builtin_popcount(symbol_history & late_mask); + const int early_side = __builtin_popcount(symbol_history & early_mask); + const int lateness = late_side - early_side; + const int direction = lateness; //std::min(std::max(lateness, -1), 1); + const error_t error = direction; + return { symbol, error }; + } + +private: + const history_t late_mask; + const history_t early_mask; + const size_t sample_bit; +}; + +#endif/*__PHASE_DETECTOR_HPP__*/ From e85503cd81f0e08dd08b20fb17074393476c0ae5 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Mon, 11 Apr 2016 11:53:17 -0700 Subject: [PATCH 147/164] Nascent support for OOK TPMS transponders. Apparently, Subaru and GMC. No CRC or other validation, no attempt to interpret packet contents yet. --- firmware/baseband/proc_tpms.cpp | 14 +++++++++++-- firmware/baseband/proc_tpms.hpp | 35 +++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/firmware/baseband/proc_tpms.cpp b/firmware/baseband/proc_tpms.cpp index 1ea152f6..9d401a1c 100644 --- a/firmware/baseband/proc_tpms.cpp +++ b/firmware/baseband/proc_tpms.cpp @@ -21,8 +21,6 @@ #include "proc_tpms.hpp" -#include "portapack_shared_memory.hpp" - #include "dsp_fir_taps.hpp" TPMSProcessor::TPMSProcessor() { @@ -45,6 +43,18 @@ void TPMSProcessor::execute(const buffer_c8_t& buffer) { clock_recovery(mf.get_output()); } } + + for(size_t i=0; ipacket_builder_ook_subaru.execute(symbol); + }); + ook_clock_recovery_gmc(slicer_history, [this](const bool symbol) { + this->packet_builder_ook_gmc.execute(symbol); + }); + } } void TPMSProcessor::consume_symbol( diff --git a/firmware/baseband/proc_tpms.hpp b/firmware/baseband/proc_tpms.hpp index 0c42beb7..759f7383 100644 --- a/firmware/baseband/proc_tpms.hpp +++ b/firmware/baseband/proc_tpms.hpp @@ -32,7 +32,10 @@ #include "packet_builder.hpp" #include "baseband_packet.hpp" +#include "ook.hpp" + #include "message.hpp" +#include "portapack_shared_memory.hpp" #include #include @@ -83,6 +86,38 @@ private: } }; + static constexpr float channel_rate_in = 307200.0f; + static constexpr size_t channel_decimation = 8; + static constexpr float channel_sample_rate = channel_rate_in / channel_decimation; + OOKSlicerMagSquaredInt ook_slicer_5sps { 5 }; + uint32_t slicer_history { 0 }; + + OOKClockRecovery ook_clock_recovery_subaru { + channel_sample_rate / 8192.0f + }; + + PacketBuilder packet_builder_ook_subaru { + { 0b010101010101010101011110, 24, 0 }, + { }, + { 80 }, + [](const baseband::Packet& packet) { + const TPMSPacketMessage message { tpms::SignalType::Subaru, packet }; + shared_memory.application_queue.push(message); + } + }; + OOKClockRecovery ook_clock_recovery_gmc { + channel_sample_rate / 8400.0f + }; + + PacketBuilder packet_builder_ook_gmc { + { 0b01010101010101010101010101100101, 32, 0 }, + { }, + { 192 }, + [](const baseband::Packet& packet) { + const TPMSPacketMessage message { tpms::SignalType::GMC, packet }; + shared_memory.application_queue.push(message); + } + }; void consume_symbol(const float symbol); void payload_handler(const baseband::Packet& packet); }; From 3e8b0975882e6f4cdb057d6374fd903ce9481692 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 12 Apr 2016 10:48:24 -0700 Subject: [PATCH 148/164] Extract VGAGainField. --- firmware/application/analog_audio_app.hpp | 8 ++------ firmware/application/ui_receiver.cpp | 20 ++++++++++++++++++++ firmware/application/ui_receiver.hpp | 9 +++++++++ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/firmware/application/analog_audio_app.hpp b/firmware/application/analog_audio_app.hpp index 67b66cf6..dace3245 100644 --- a/firmware/application/analog_audio_app.hpp +++ b/firmware/application/analog_audio_app.hpp @@ -117,12 +117,8 @@ private: { 15 * 8, 0 * 16 } }; - NumberField field_vga { - { 18 * 8, 0 * 16}, - 2, - { max2837::vga::gain_db_range.minimum, max2837::vga::gain_db_range.maximum }, - max2837::vga::gain_db_step, - ' ', + VGAGainField field_vga { + { 18 * 8, 0 * 16 } }; OptionsField options_modulation { diff --git a/firmware/application/ui_receiver.cpp b/firmware/application/ui_receiver.cpp index cf8e8ef3..0494d47c 100644 --- a/firmware/application/ui_receiver.cpp +++ b/firmware/application/ui_receiver.cpp @@ -318,4 +318,24 @@ void LNAGainField::on_focus() { } } +/* VGAGainField **********************************************************/ + +VGAGainField::VGAGainField( + Point parent_pos +) : NumberField { + parent_pos, 2, + { max2837::vga::gain_db_range.minimum, max2837::vga::gain_db_range.maximum }, + max2837::vga::gain_db_step, + ' ', + } +{ +} + +void VGAGainField::on_focus() { + //Widget::on_focus(); + if( on_show_options ) { + on_show_options(); + } +} + } /* namespace ui */ diff --git a/firmware/application/ui_receiver.hpp b/firmware/application/ui_receiver.hpp index fa74f970..6aff9dda 100644 --- a/firmware/application/ui_receiver.hpp +++ b/firmware/application/ui_receiver.hpp @@ -315,6 +315,15 @@ public: void on_focus() override; }; +class VGAGainField : public NumberField { +public: + std::function on_show_options; + + VGAGainField(Point parent_pos); + + void on_focus() override; +}; + } /* namespace ui */ #endif/*__UI_RECEIVER_H__*/ From 10b28429e49a749aa36330a0a91d73eca1c958a7 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 12 Apr 2016 10:49:07 -0700 Subject: [PATCH 149/164] Add show-options event for VGAGainField. --- firmware/application/analog_audio_app.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/firmware/application/analog_audio_app.cpp b/firmware/application/analog_audio_app.cpp index 1a3da0c1..7d5cae40 100644 --- a/firmware/application/analog_audio_app.cpp +++ b/firmware/application/analog_audio_app.cpp @@ -117,6 +117,9 @@ AnalogAudioView::AnalogAudioView( field_vga.on_change = [this](int32_t v_db) { this->on_vga_changed(v_db); }; + field_vga.on_show_options = [this]() { + this->on_show_options_rf_gain(); + }; const auto modulation = receiver_model.modulation(); options_modulation.set_by_value(modulation); From 60a0d5c4693690c86b1368cdba9165c906f65aaf Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 12 Apr 2016 10:51:20 -0700 Subject: [PATCH 150/164] Capture mode channel stats --- firmware/baseband/proc_capture.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/firmware/baseband/proc_capture.cpp b/firmware/baseband/proc_capture.cpp index fcbbd647..6e24c5fe 100644 --- a/firmware/baseband/proc_capture.cpp +++ b/firmware/baseband/proc_capture.cpp @@ -42,4 +42,6 @@ void CaptureProcessor::execute(const buffer_c8_t& buffer) { const size_t bytes_to_write = sizeof(*decimator_out.p) * decimator_out.count; const auto result = stream->write(decimator_out.p, bytes_to_write); } + + feed_channel_stats(decimator_out); } From cee5417a4aa8f1c1c9828ec119ee029ac36f466d Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 12 Apr 2016 10:56:00 -0700 Subject: [PATCH 151/164] Capture UI basic controls. Tuning, LNA/VGA gain, second IF and "channel" RSSI. Use ReceiverModel, so that audio receiver parameters come across for quicker capture configuration. --- firmware/application/capture_app.cpp | 66 +++++++++++++++++-------- firmware/application/capture_app.hpp | 29 +++++++++-- firmware/application/receiver_model.hpp | 1 + 3 files changed, 72 insertions(+), 24 deletions(-) diff --git a/firmware/application/capture_app.cpp b/firmware/application/capture_app.cpp index 02058e9f..e51c5049 100644 --- a/firmware/application/capture_app.cpp +++ b/firmware/application/capture_app.cpp @@ -21,40 +21,62 @@ #include "capture_app.hpp" -#include "baseband_api.hpp" +#include "portapack.hpp" +using namespace portapack; #include "utility.hpp" namespace ui { -CaptureAppView::CaptureAppView(NavigationView&) { +CaptureAppView::CaptureAppView(NavigationView& nav) { add_children({ { + &rssi, + &channel, + &field_frequency, + &field_lna, + &field_vga, &button_start, &button_stop, } }); + field_frequency.set_value(receiver_model.tuning_frequency()); + field_frequency.set_step(receiver_model.frequency_step()); + field_frequency.on_change = [this](rf::Frequency f) { + this->on_tuning_frequency_changed(f); + }; + field_frequency.on_edit = [this, &nav]() { + // TODO: Provide separate modal method/scheme? + auto new_view = nav.push(receiver_model.tuning_frequency()); + new_view->on_changed = [this](rf::Frequency f) { + this->on_tuning_frequency_changed(f); + this->field_frequency.set_value(f); + }; + }; + + field_lna.set_value(receiver_model.lna()); + field_lna.on_change = [this](int32_t v) { + this->on_lna_changed(v); + }; + + field_vga.set_value(receiver_model.vga()); + field_vga.on_change = [this](int32_t v_db) { + this->on_vga_changed(v_db); + }; + button_start.on_select = [this](Button&){ this->on_start(); }; button_stop.on_select = [this](Button&){ this->on_stop(); }; - - radio::enable({ - tuning_frequency(), - sampling_rate, - baseband_bandwidth, - rf::Direction::Receive, - false, 16, 16, - 1, - }); - - baseband::start({ - .mode = 7, + + receiver_model.set_baseband_configuration({ + .mode = toUType(ReceiverModel::Mode::Capture), .sampling_rate = sampling_rate, .decimation_factor = 1, }); + receiver_model.set_baseband_bandwidth(baseband_bandwidth); + receiver_model.enable(); } CaptureAppView::~CaptureAppView() { - baseband::stop(); - radio::disable(); + receiver_model.disable(); } void CaptureAppView::focus() { @@ -71,12 +93,16 @@ void CaptureAppView::on_stop() { capture_thread.reset(); } -uint32_t CaptureAppView::target_frequency() const { - return initial_target_frequency; +void CaptureAppView::on_tuning_frequency_changed(rf::Frequency f) { + receiver_model.set_tuning_frequency(f); } -uint32_t CaptureAppView::tuning_frequency() const { - return target_frequency() - (sampling_rate / 4); +void CaptureAppView::on_lna_changed(int32_t v_db) { + receiver_model.set_lna(v_db); +} + +void CaptureAppView::on_vga_changed(int32_t v_db) { + receiver_model.set_vga(v_db); } } /* namespace ui */ diff --git a/firmware/application/capture_app.hpp b/firmware/application/capture_app.hpp index 0e38f960..64bd07eb 100644 --- a/firmware/application/capture_app.hpp +++ b/firmware/application/capture_app.hpp @@ -24,6 +24,7 @@ #include "ui_widget.hpp" #include "ui_navigation.hpp" +#include "ui_receiver.hpp" #include "audio_thread.hpp" @@ -42,18 +43,38 @@ public: std::string title() const override { return "Capture"; }; private: - static constexpr uint32_t initial_target_frequency = 91500000; static constexpr uint32_t sampling_rate = 2457600; static constexpr uint32_t baseband_bandwidth = 1750000; std::unique_ptr capture_thread; - uint32_t target_frequency() const; - uint32_t tuning_frequency() const; - void on_start(); void on_stop(); + void on_tuning_frequency_changed(rf::Frequency f); + void on_lna_changed(int32_t v_db); + void on_vga_changed(int32_t v_db); + + RSSI rssi { + { 21 * 8, 0, 6 * 8, 4 }, + }; + + Channel channel { + { 21 * 8, 5, 6 * 8, 4 }, + }; + + FrequencyField field_frequency { + { 5 * 8, 0 * 16 }, + }; + + LNAGainField field_lna { + { 15 * 8, 0 * 16 } + }; + + VGAGainField field_vga { + { 18 * 8, 0 * 16 } + }; + Button button_start { { 16, 17 * 16, 96, 24 }, "Start" diff --git a/firmware/application/receiver_model.hpp b/firmware/application/receiver_model.hpp index 48839f32..ad664700 100644 --- a/firmware/application/receiver_model.hpp +++ b/firmware/application/receiver_model.hpp @@ -37,6 +37,7 @@ public: NarrowbandFMAudio = 1, WidebandFMAudio = 2, SpectrumAnalysis = 4, + Capture = 7, }; rf::Frequency tuning_frequency() const; From 2201a9e95f6b134c4d80266b7126b8ddaab9bba0 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 12 Apr 2016 11:37:58 -0700 Subject: [PATCH 152/164] Change capture start/stop to toggle image button. --- firmware/application/capture_app.cpp | 22 +++++----- firmware/application/capture_app.hpp | 66 +++++++++++++++++++++++----- 2 files changed, 65 insertions(+), 23 deletions(-) diff --git a/firmware/application/capture_app.cpp b/firmware/application/capture_app.cpp index e51c5049..173eefd6 100644 --- a/firmware/application/capture_app.cpp +++ b/firmware/application/capture_app.cpp @@ -30,13 +30,12 @@ namespace ui { CaptureAppView::CaptureAppView(NavigationView& nav) { add_children({ { + &button_start_stop, &rssi, &channel, &field_frequency, &field_lna, &field_vga, - &button_start, - &button_stop, } }); field_frequency.set_value(receiver_model.tuning_frequency()); @@ -63,8 +62,9 @@ CaptureAppView::CaptureAppView(NavigationView& nav) { this->on_vga_changed(v_db); }; - button_start.on_select = [this](Button&){ this->on_start(); }; - button_stop.on_select = [this](Button&){ this->on_stop(); }; + button_start_stop.on_select = [this](ImageButton&) { + this->on_start_stop(); + }; receiver_model.set_baseband_configuration({ .mode = toUType(ReceiverModel::Mode::Capture), @@ -80,19 +80,19 @@ CaptureAppView::~CaptureAppView() { } void CaptureAppView::focus() { - button_start.focus(); + button_start_stop.focus(); } -void CaptureAppView::on_start() { - if( !capture_thread ) { +void CaptureAppView::on_start_stop() { + if( capture_thread ) { + capture_thread.reset(); + button_start_stop.set_bitmap(&bitmap_record); + } else { capture_thread = std::make_unique("baseband.c16"); + button_start_stop.set_bitmap(&bitmap_stop); } } -void CaptureAppView::on_stop() { - capture_thread.reset(); -} - void CaptureAppView::on_tuning_frequency_changed(rf::Frequency f) { receiver_model.set_tuning_frequency(f); } diff --git a/firmware/application/capture_app.hpp b/firmware/application/capture_app.hpp index 64bd07eb..b62ab8c5 100644 --- a/firmware/application/capture_app.hpp +++ b/firmware/application/capture_app.hpp @@ -33,6 +33,52 @@ namespace ui { +static constexpr uint8_t bitmap_record_data[] = { + 0x00, 0x00, + 0x00, 0x00, + 0xc0, 0x03, + 0xf0, 0x0f, + 0xf8, 0x1f, + 0xf8, 0x1f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xf8, 0x1f, + 0xf8, 0x1f, + 0xf0, 0x0f, + 0xc0, 0x03, + 0x00, 0x00, + 0x00, 0x00, +}; + +static constexpr Bitmap bitmap_record { + { 16, 16 }, bitmap_record_data +}; + +static constexpr uint8_t bitmap_stop_data[] = { + 0x00, 0x00, + 0x00, 0x00, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0x00, 0x00, + 0x00, 0x00, +}; + +static constexpr Bitmap bitmap_stop { + { 16, 16 }, bitmap_stop_data +}; + class CaptureAppView : public View { public: CaptureAppView(NavigationView& nav); @@ -48,13 +94,19 @@ private: std::unique_ptr capture_thread; - void on_start(); - void on_stop(); + void on_start_stop(); void on_tuning_frequency_changed(rf::Frequency f); void on_lna_changed(int32_t v_db); void on_vga_changed(int32_t v_db); + ImageButton button_start_stop { + { 0 * 8, 0, 2 * 8, 1 * 16 }, + &bitmap_record, + Color::red(), + Color::black() + }; + RSSI rssi { { 21 * 8, 0, 6 * 8, 4 }, }; @@ -74,16 +126,6 @@ private: VGAGainField field_vga { { 18 * 8, 0 * 16 } }; - - Button button_start { - { 16, 17 * 16, 96, 24 }, - "Start" - }; - - Button button_stop { - { 240 - 96 - 16, 17 * 16, 96, 24 }, - "Stop" - }; }; } /* namespace ui */ From ec75c00da22c4be17d7fc6285b57298be4585612 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 13 Apr 2016 11:09:18 -0700 Subject: [PATCH 153/164] Add capture mode waterfall. --- firmware/application/capture_app.cpp | 15 +++++++++ firmware/application/capture_app.hpp | 9 ++++++ firmware/baseband/proc_capture.cpp | 48 +++++++++++++++++++++++++--- firmware/baseband/proc_capture.hpp | 13 ++++++++ 4 files changed, 81 insertions(+), 4 deletions(-) diff --git a/firmware/application/capture_app.cpp b/firmware/application/capture_app.cpp index 173eefd6..97ca6ec7 100644 --- a/firmware/application/capture_app.cpp +++ b/firmware/application/capture_app.cpp @@ -36,6 +36,7 @@ CaptureAppView::CaptureAppView(NavigationView& nav) { &field_frequency, &field_lna, &field_vga, + &waterfall, } }); field_frequency.set_value(receiver_model.tuning_frequency()); @@ -79,6 +80,20 @@ CaptureAppView::~CaptureAppView() { receiver_model.disable(); } +void CaptureAppView::on_hide() { + // TODO: Terrible kludge because widget system doesn't notify Waterfall that + // it's being shown or hidden. + waterfall.on_hide(); + View::on_hide(); +} + +void CaptureAppView::set_parent_rect(const Rect new_parent_rect) { + View::set_parent_rect(new_parent_rect); + + const ui::Rect waterfall_rect { 0, header_height, new_parent_rect.width(), static_cast(new_parent_rect.height() - header_height) }; + waterfall.set_parent_rect(waterfall_rect); +} + void CaptureAppView::focus() { button_start_stop.focus(); } diff --git a/firmware/application/capture_app.hpp b/firmware/application/capture_app.hpp index b62ab8c5..ac09816f 100644 --- a/firmware/application/capture_app.hpp +++ b/firmware/application/capture_app.hpp @@ -25,6 +25,7 @@ #include "ui_widget.hpp" #include "ui_navigation.hpp" #include "ui_receiver.hpp" +#include "ui_spectrum.hpp" #include "audio_thread.hpp" @@ -84,11 +85,17 @@ public: CaptureAppView(NavigationView& nav); ~CaptureAppView(); + void on_hide() override; + + void set_parent_rect(const Rect new_parent_rect) override; + void focus() override; std::string title() const override { return "Capture"; }; private: + static constexpr ui::Dim header_height = 2 * 16; + static constexpr uint32_t sampling_rate = 2457600; static constexpr uint32_t baseband_bandwidth = 1750000; @@ -126,6 +133,8 @@ private: VGAGainField field_vga { { 18 * 8, 0 * 16 } }; + + spectrum::WaterfallWidget waterfall; }; } /* namespace ui */ diff --git a/firmware/baseband/proc_capture.cpp b/firmware/baseband/proc_capture.cpp index 6e24c5fe..f069c206 100644 --- a/firmware/baseband/proc_capture.cpp +++ b/firmware/baseband/proc_capture.cpp @@ -26,8 +26,29 @@ #include "utility.hpp" CaptureProcessor::CaptureProcessor() { - decim_0.configure(taps_200k_decim_0.taps, 33554432); - decim_1.configure(taps_200k_decim_1.taps, 131072); + const auto& decim_0_filter = taps_200k_decim_0; + constexpr size_t decim_0_input_fs = baseband_fs; + constexpr size_t decim_0_output_fs = decim_0_input_fs / decim_0.decimation_factor; + + const auto& decim_1_filter = taps_200k_decim_1; + constexpr size_t decim_1_input_fs = decim_0_output_fs; + constexpr size_t decim_1_output_fs = decim_1_input_fs / decim_1.decimation_factor; + + const auto& channel_filter = decim_1_filter; + constexpr size_t channel_filter_input_fs = decim_1_output_fs; + constexpr size_t channel_decimation = 1; + const size_t channel_filter_output_fs = channel_filter_input_fs / channel_decimation; + + decim_0.configure(decim_0_filter.taps, 33554432); + decim_1.configure(decim_1_filter.taps, 131072); + + channel_filter_pass_f = channel_filter.pass_frequency_normalized * channel_filter_input_fs; + channel_filter_stop_f = channel_filter.stop_frequency_normalized * channel_filter_input_fs; + + spectrum_interval_samples = channel_filter_output_fs / spectrum_rate_hz; + spectrum_samples = 0; + + channel_spectrum.set_decimation_factor(1); stream = std::make_unique(15); } @@ -36,12 +57,31 @@ void CaptureProcessor::execute(const buffer_c8_t& buffer) { /* 2.4576MHz, 2048 samples */ const auto decim_0_out = decim_0.execute(buffer, dst_buffer); const auto decim_1_out = decim_1.execute(decim_0_out, dst_buffer); - const auto decimator_out = decim_1_out; + const auto& decimator_out = decim_1_out; + const auto& channel = decimator_out; if( stream ) { const size_t bytes_to_write = sizeof(*decimator_out.p) * decimator_out.count; const auto result = stream->write(decimator_out.p, bytes_to_write); } - feed_channel_stats(decimator_out); + feed_channel_stats(channel); + + spectrum_samples += channel.count; + if( spectrum_samples >= spectrum_interval_samples ) { + spectrum_samples -= spectrum_interval_samples; + channel_spectrum.feed(channel, channel_filter_pass_f, channel_filter_stop_f); + } +} + +void CaptureProcessor::on_message(const Message* const message) { + switch(message->id) { + case Message::ID::UpdateSpectrum: + case Message::ID::SpectrumStreamingConfig: + channel_spectrum.on_message(message); + break; + + default: + break; + } } diff --git a/firmware/baseband/proc_capture.hpp b/firmware/baseband/proc_capture.hpp index 9e77a8ce..008c10d2 100644 --- a/firmware/baseband/proc_capture.hpp +++ b/firmware/baseband/proc_capture.hpp @@ -25,6 +25,8 @@ #include "baseband_processor.hpp" #include "dsp_decimate.hpp" +#include "spectrum_collector.hpp" + #include "stream_input.hpp" #include @@ -36,7 +38,12 @@ public: void execute(const buffer_c8_t& buffer) override; + void on_message(const Message* const message) override; + private: + static constexpr size_t baseband_fs = 2457600; + static constexpr auto spectrum_rate_hz = 50.0f; + std::array dst; const buffer_c16_t dst_buffer { dst.data(), @@ -45,8 +52,14 @@ private: dsp::decimate::FIRC8xR16x24FS4Decim4 decim_0; dsp::decimate::FIRC16xR16x16Decim2 decim_1; + uint32_t channel_filter_pass_f = 0; + uint32_t channel_filter_stop_f = 0; std::unique_ptr stream; + + SpectrumCollector channel_spectrum; + size_t spectrum_interval_samples = 0; + size_t spectrum_samples = 0; }; #endif/*__PROC_CAPTURE_HPP__*/ From 94c81528c116297ac14762169bbb46ccf78cef36 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 19 Apr 2016 09:51:31 -0700 Subject: [PATCH 154/164] FatFs update to R0.11a. --- .../ext/fatfs/doc/00index_e.html | 108 +- .../ext/fatfs/doc/00index_j.html | 107 +- .../chibios-portapack/ext/fatfs/doc/css_e.css | 12 +- .../chibios-portapack/ext/fatfs/doc/css_j.css | 14 +- .../chibios-portapack/ext/fatfs/doc/css_p.css | 1 - .../ext/fatfs/doc/en/appnote.html | 226 +- .../ext/fatfs/doc/en/chdir.html | 2 +- .../ext/fatfs/doc/en/chdrive.html | 2 +- .../ext/fatfs/doc/en/chmod.html | 4 +- .../ext/fatfs/doc/en/close.html | 3 +- .../ext/fatfs/doc/en/closedir.html | 2 +- .../ext/fatfs/doc/en/config.html | 220 + .../ext/fatfs/doc/en/dinit.html | 4 +- .../ext/fatfs/doc/en/dioctl.html | 10 +- .../ext/fatfs/doc/en/dread.html | 8 +- .../ext/fatfs/doc/en/dstat.html | 2 +- .../ext/fatfs/doc/en/dwrite.html | 6 +- .../ext/fatfs/doc/en/eof.html | 4 +- .../ext/fatfs/doc/en/error.html | 2 +- .../ext/fatfs/doc/en/fattime.html | 6 +- .../ext/fatfs/doc/en/fdisk.html | 2 +- .../ext/fatfs/doc/en/filename.html | 34 +- .../ext/fatfs/doc/en/findfirst.html | 119 + .../ext/fatfs/doc/en/findnext.html | 69 + .../ext/fatfs/doc/en/forward.html | 5 +- .../ext/fatfs/doc/en/getcwd.html | 4 +- .../ext/fatfs/doc/en/getfree.html | 4 +- .../ext/fatfs/doc/en/gets.html | 6 +- .../ext/fatfs/doc/en/lseek.html | 13 +- .../ext/fatfs/doc/en/mkdir.html | 2 +- .../ext/fatfs/doc/en/mkfs.html | 19 +- .../ext/fatfs/doc/en/mount.html | 18 +- .../ext/fatfs/doc/en/open.html | 20 +- .../ext/fatfs/doc/en/opendir.html | 4 +- .../ext/fatfs/doc/en/printf.html | 6 +- .../ext/fatfs/doc/en/putc.html | 10 +- .../ext/fatfs/doc/en/puts.html | 10 +- .../ext/fatfs/doc/en/rc.html | 29 +- .../ext/fatfs/doc/en/read.html | 1 - .../ext/fatfs/doc/en/readdir.html | 14 +- .../ext/fatfs/doc/en/rename.html | 15 +- .../ext/fatfs/doc/en/sdir.html | 5 +- .../ext/fatfs/doc/en/setlabel.html | 7 +- .../ext/fatfs/doc/en/sfatfs.html | 22 +- .../ext/fatfs/doc/en/sfile.html | 12 +- .../ext/fatfs/doc/en/sfileinfo.html | 6 +- .../ext/fatfs/doc/en/size.html | 2 +- .../ext/fatfs/doc/en/stat.html | 2 +- .../ext/fatfs/doc/en/sync.html | 5 +- .../ext/fatfs/doc/en/tell.html | 2 +- .../ext/fatfs/doc/en/truncate.html | 3 +- .../ext/fatfs/doc/en/unlink.html | 4 +- .../ext/fatfs/doc/en/utime.html | 2 +- .../ext/fatfs/doc/en/write.html | 1 - .../ext/fatfs/doc/img/app3.c | 34 +- .../ext/fatfs/doc/img/app4.c | 9 +- .../ext/fatfs/doc/img/f6.png | Bin 1436 -> 1464 bytes .../ext/fatfs/doc/img/funcs.png | Bin 14357 -> 19491 bytes .../ext/fatfs/doc/img/layers.png | Bin 2401 -> 5521 bytes .../ext/fatfs/doc/img/layers1.png | Bin 0 -> 3843 bytes .../ext/fatfs/doc/img/layers2.png | Bin 0 -> 3741 bytes .../ext/fatfs/doc/ja/appnote.html | 175 +- .../ext/fatfs/doc/ja/close.html | 1 - .../ext/fatfs/doc/ja/config.html | 225 + .../ext/fatfs/doc/ja/dinit.html | 4 +- .../ext/fatfs/doc/ja/dioctl.html | 12 +- .../ext/fatfs/doc/ja/dread.html | 12 +- .../ext/fatfs/doc/ja/dstat.html | 2 +- .../ext/fatfs/doc/ja/dwrite.html | 10 +- .../ext/fatfs/doc/ja/eof.html | 2 +- .../ext/fatfs/doc/ja/error.html | 2 +- .../ext/fatfs/doc/ja/fattime.html | 2 +- .../ext/fatfs/doc/ja/filename.html | 32 +- .../ext/fatfs/doc/ja/findfirst.html | 119 + .../ext/fatfs/doc/ja/findnext.html | 68 + .../ext/fatfs/doc/ja/forward.html | 3 +- .../ext/fatfs/doc/ja/getfree.html | 2 +- .../ext/fatfs/doc/ja/gets.html | 4 +- .../ext/fatfs/doc/ja/lseek.html | 11 +- .../ext/fatfs/doc/ja/mkdir.html | 4 +- .../ext/fatfs/doc/ja/mkfs.html | 19 +- .../ext/fatfs/doc/ja/mount.html | 12 +- .../ext/fatfs/doc/ja/open.html | 6 +- .../ext/fatfs/doc/ja/opendir.html | 5 +- .../ext/fatfs/doc/ja/printf.html | 4 +- .../ext/fatfs/doc/ja/putc.html | 4 +- .../ext/fatfs/doc/ja/puts.html | 4 +- .../ext/fatfs/doc/ja/rc.html | 27 +- .../ext/fatfs/doc/ja/read.html | 1 - .../ext/fatfs/doc/ja/readdir.html | 14 +- .../ext/fatfs/doc/ja/rename.html | 11 +- .../ext/fatfs/doc/ja/sdir.html | 9 +- .../ext/fatfs/doc/ja/setlabel.html | 3 +- .../ext/fatfs/doc/ja/sfatfs.html | 12 +- .../ext/fatfs/doc/ja/sfile.html | 6 +- .../ext/fatfs/doc/ja/sfileinfo.html | 8 +- .../ext/fatfs/doc/ja/size.html | 2 +- .../ext/fatfs/doc/ja/stat.html | 1 + .../ext/fatfs/doc/ja/sync.html | 5 +- .../ext/fatfs/doc/ja/tell.html | 2 +- .../ext/fatfs/doc/ja/truncate.html | 1 - .../ext/fatfs/doc/ja/unlink.html | 9 +- .../ext/fatfs/doc/ja/write.html | 1 - .../ext/fatfs/doc/updates.txt | 152 - .../ext/fatfs/src/00history.txt | 245 + .../ext/fatfs/src/00readme.txt | 166 +- .../chibios-portapack/ext/fatfs/src/diskio.c | 12 +- firmware/chibios-portapack/ext/fatfs/src/ff.c | 1160 +-- firmware/chibios-portapack/ext/fatfs/src/ff.h | 37 +- .../fatfs/src/{ffconf_template.h => ffconf.h} | 126 +- .../chibios-portapack/ext/fatfs/src/integer.h | 10 +- .../ext/fatfs/src/option/cc932.c | 7043 +++++++++-------- .../ext/fatfs/src/option/cc936.c | 55 +- .../ext/fatfs/src/option/cc949.c | 55 +- .../ext/fatfs/src/option/cc950.c | 55 +- .../ext/fatfs/src/option/ccsbcs.c | 662 +- .../ext/fatfs/src/option/unicode.c | 2 +- .../ext/fatfs/src/patch1.patch | 14 - 118 files changed, 6365 insertions(+), 5548 deletions(-) delete mode 100644 firmware/chibios-portapack/ext/fatfs/doc/css_p.css create mode 100644 firmware/chibios-portapack/ext/fatfs/doc/en/config.html create mode 100644 firmware/chibios-portapack/ext/fatfs/doc/en/findfirst.html create mode 100644 firmware/chibios-portapack/ext/fatfs/doc/en/findnext.html create mode 100644 firmware/chibios-portapack/ext/fatfs/doc/img/layers1.png create mode 100644 firmware/chibios-portapack/ext/fatfs/doc/img/layers2.png create mode 100644 firmware/chibios-portapack/ext/fatfs/doc/ja/config.html create mode 100644 firmware/chibios-portapack/ext/fatfs/doc/ja/findfirst.html create mode 100644 firmware/chibios-portapack/ext/fatfs/doc/ja/findnext.html delete mode 100644 firmware/chibios-portapack/ext/fatfs/doc/updates.txt create mode 100644 firmware/chibios-portapack/ext/fatfs/src/00history.txt rename firmware/chibios-portapack/ext/fatfs/src/{ffconf_template.h => ffconf.h} (77%) delete mode 100644 firmware/chibios-portapack/ext/fatfs/src/patch1.patch diff --git a/firmware/chibios-portapack/ext/fatfs/doc/00index_e.html b/firmware/chibios-portapack/ext/fatfs/doc/00index_e.html index 9dc9d8e8..2eef02ee 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/00index_e.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/00index_e.html @@ -19,14 +19,14 @@

layer -

FatFs is a generic FAT file system module for small embedded systems. The FatFs module is written in compliance with ANSI C (C89) and completely separated from the disk I/O layer. Therefore it is independent of the platform. It can be incorporated into small microcontrollers with limited resource, such as 8051, PIC, AVR, ARM, Z80, 78K and etc. Also Petit FatFs module for tiny microcontrollers is available here↗.

+

FatFs is a generic FAT file system module for small embedded systems. The FatFs module is written in compliance with ANSI C (C89) and completely separated from the disk I/O layer. Therefore it is independent of the platform. It can be incorporated into small microcontrollers with limited resource, such as 8051, PIC, AVR, ARM, Z80, 78K and etc. Also Petit FatFs module for tiny microcontrollers is available here.

Features

  • Windows compatible FAT file system.
  • Platform independent. Easy to port.
  • Very small footprint for code and work area.
  • -
  • Various configuration options: +
  • Various configuration options:
    • Multiple volumes (physical drives and partitions).
    • Multiple ANSI/OEM code pages including DBCS.
    • @@ -42,49 +42,68 @@

      Application Interface

      -

      FatFs module provides following functions to the applications. In other words, this list describes what FatFs can do to access the FAT volumes.

      +layer
        -
      • f_mount - Register/Unregister a work area
      • -
      • f_open - Open/Create a file
      • -
      • f_close - Close an open file
      • -
      • f_read - Read file
      • -
      • f_write - Write file
      • -
      • f_lseek - Move read/write pointer, Expand file size
      • -
      • f_truncate - Truncate file size
      • -
      • f_sync - Flush cached data
      • -
      • f_forward - Forward file data to the stream
      • -
      • f_stat - Check existance of a file or sub-directory
      • -
      • f_opendir - Open a directory
      • -
      • f_closedir - Close an open directory
      • -
      • f_readdir - Read a directory item
      • -
      • f_mkdir - Create a sub-directory
      • -
      • f_unlink - Remove a file or sub-directory
      • -
      • f_chmod - Change attribute
      • -
      • f_utime - Change timestamp
      • -
      • f_rename - Rename/Move a file or sub-directory
      • -
      • f_chdir - Change current directory
      • -
      • f_chdrive - Change current drive
      • -
      • f_getcwd - Retrieve the current directory
      • -
      • f_getfree - Get free space on the volume
      • -
      • f_getlabel - Get volume label
      • -
      • f_setlabel - Set volume label
      • -
      • f_mkfs - Create a file system on the drive
      • -
      • f_fdisk - Divide a physical drive
      • -
      • f_gets - Read a string
      • -
      • f_putc - Write a character
      • -
      • f_puts - Write a string
      • -
      • f_printf - Write a formatted string
      • -
      • f_tell - Get current read/write pointer
      • -
      • f_eof - Test for end-of-file on a file
      • -
      • f_size - Get size of a file
      • -
      • f_error - Test for an error on a file
      • +
      • File Access + +
      • +
      • Directory Access + +
      • +
      • File/Directory Management +
          +
        • f_stat - Check existance of a file or sub-directory
        • +
        • f_unlink - Remove a file or sub-directory
        • +
        • f_rename - Rename or move a file or sub-directory
        • +
        • f_chmod - Change attribute of a file or sub-directory
        • +
        • f_utime - Change timestamp of a file or sub-directory
        • +
        • f_mkdir - Create a sub-directory
        • +
        • f_chdir - Change current directory
        • +
        • f_chdrive - Change current drive
        • +
        • f_getcwd - Retrieve the current directory and drive
        • +
        +
      • +
      • Volume Management +
          +
        • f_mount - Register/Unregister a work area of a volume
        • +
        • f_mkfs - Create an FAT volume on the logical drive
        • +
        • f_fdisk - Create logical drives on the physical drive
        • +
        • f_getfree - Get total size and free size on the volume
        • +
        • f_getlabel - Get volume label
        • +
        • f_setlabel - Set volume label
        • +
        +

      Device Control Interface

      -

      Since the FatFs module is a file system layer, it is completely separated from physical devices, such as memory card, harddisk and any type of storage devices. FatFs accesses the storage device via a simple interface described below. The low level device control module is not a part of FatFs module. It is provided by implementer. Also sample implementations for some platforms are available in the downloads.

      +layer +

      Since the FatFs module is a file system layer, it is completely separated from the physical devices, such as memory card, harddisk and any type of storage devices. FatFs accesses the storage devices via a simple interface shown below. The low level device control module is not a part of FatFs module. It is provided by implementer. Also sample implementations for some platforms are available in the downloads.

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/00index_j.html b/firmware/chibios-portapack/ext/fatfs/doc/00index_j.html index b13297dc..fc8444e1 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/00index_j.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/00index_j.html @@ -19,13 +19,13 @@
      layer -

      FatFsã¯å°è¦æ¨¡ãªçµ„ã¿è¾¼ã¿ã‚·ã‚¹ãƒ†ãƒ å‘ã‘ã®æ±Žç”¨FATファイルシステム モジュールã§ã™ã€‚ANSI C(C89)準拠ã§ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ アーキテクãƒãƒ£ã«ã¯ä¾å­˜ã—ãªã„ã®ã§ã€å¿…è¦ãªãƒ¯ãƒ¼ã‚¯ エリアãŒç¢ºä¿ã§ãã‚Œã°ã€8051, PIC, AVR, SH, Z80, 68k, H8, ARMãªã©å®‰ä¾¡ãªãƒžã‚¤ã‚³ãƒ³ã§ã‚‚使用å¯èƒ½ã§ã™ã€‚ã“ã®ã»ã‹ã€FatFsを極å°ãƒžã‚¤ã‚³ãƒ³å‘ã‘ã«ã‚·ãƒ¥ãƒªãƒ³ã‚¯ã—ãŸã·ã¡FatFs↗ ã‚‚ã‚ã‚Šã¾ã™ã€‚

      +

      FatFsã¯å°è¦æ¨¡ãªçµ„ã¿è¾¼ã¿ã‚·ã‚¹ãƒ†ãƒ å‘ã‘ã®æ±Žç”¨FATファイルシステム モジュールã§ã™ã€‚ANSI C(C89)準拠ã§ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ アーキテクãƒãƒ£ã«ã¯ä¾å­˜ã—ãªã„ã®ã§ã€å¿…è¦ãªãƒ¯ãƒ¼ã‚¯ エリアãŒç¢ºä¿ã§ãã‚Œã°ã€8051, PIC, AVR, SH, Z80, 68k, H8, ARMãªã©å®‰ä¾¡ãªãƒžã‚¤ã‚³ãƒ³ã§ã‚‚使用å¯èƒ½ã§ã™ã€‚ã“ã®ã»ã‹ã€FatFsを極å°ãƒžã‚¤ã‚³ãƒ³å‘ã‘ã«ã‚·ãƒ¥ãƒªãƒ³ã‚¯ã—ãŸã·ã¡FatFsã‚‚ã‚ã‚Šã¾ã™ã€‚

      FatFsモジュールã®ç‰¹å¾´

      • Windowsäº’æ› FATファイル システム
      • プラットフォームéžä¾å­˜
      • コンパクトãªã‚³ãƒ¼ãƒ‰ã¨RAM使用é‡
      • -
      • 多ãã®æ§‹æˆã‚ªãƒ—ション: +
      • 多ãã®æ§‹æˆã‚ªãƒ—ション:
        • 複数ã®ãƒœãƒªãƒ¥ãƒ¼ãƒ (物ç†ãƒ‰ãƒ©ã‚¤ãƒ–・区画)
        • DBCSã‚’å«ã‚€è¤‡æ•°ã®ANSI/OEMコード ページã®é¸æŠž
        • @@ -41,49 +41,68 @@

          上ä½ãƒ¬ã‚¤ãƒ¤ インターフェース

          -

          FatFsモジュールã¯ã€ã‚¢ãƒ—リケーション レイヤã«å¯¾ã—ã€æ¬¡ã®ãƒ•ã‚¡ã‚¤ãƒ«æ“作関数(API)ã‚’æä¾›ã—ã¾ã™ã€‚ã¤ã¾ã‚Šã€ã“ã®ãƒªã‚¹ãƒˆã¯FatFsã«ã§ãã‚‹ã“ã¨ã‚’シンプルã«ç¤ºã—ã¦ã„ã¾ã™ã€‚

          +layer
            -
          • f_mount - ワークエリアã®ç™»éŒ²ãƒ»æŠ¹æ¶ˆ
          • -
          • f_open - ファイルã®ã‚ªãƒ¼ãƒ—ン・作æˆ
          • -
          • f_close - ファイルã®ã‚¯ãƒ­ãƒ¼ã‚º
          • -
          • f_read - ファイルã®èª­ã¿å‡ºã—
          • -
          • f_write - ファイルã®æ›¸ãè¾¼ã¿
          • -
          • f_lseek - リード/ライト ãƒã‚¤ãƒ³ã‚¿ã®ç§»å‹•, ファイルã®æ‹¡å¼µ
          • -
          • f_truncate - ファイル サイズã®åˆ‡ã‚Šè©°ã‚
          • -
          • f_sync - キャッシュã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã®ãƒ•ãƒ©ãƒƒã‚·ãƒ¥
          • -
          • f_forward - ファイル データをストリーム関数ã«è»¢é€
          • -
          • f_stat - ファイル/サブ ディレクトリã®å­˜åœ¨ãƒã‚§ãƒƒã‚¯ã¨æƒ…å ±ã®å–å¾—
          • -
          • f_opendir - ディレクトリã®ã‚ªãƒ¼ãƒ—ン
          • -
          • f_closedir - ディレクトリã®ã‚¯ãƒ­ãƒ¼ã‚º
          • -
          • f_readdir - ディレクトリã®èª­ã¿å‡ºã—
          • -
          • f_mkdir - サブ ディレクトリã®ä½œæˆ
          • -
          • f_unlink - ファイル/サブ ディレクトリã®å‰Šé™¤
          • -
          • f_chmod - ファイル/サブ ディレクトリã®å±žæ€§ã®å¤‰æ›´
          • -
          • f_utime - ファイル/サブ ディレクトリã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã®å¤‰æ›´
          • -
          • f_rename - ファイル/サブ ディレクトリã®åå‰ã®å¤‰æ›´ãƒ»ç§»å‹•
          • -
          • f_chdir - カレント ディレクトリã®å¤‰æ›´
          • -
          • f_chdrive - カレント ドライブã®å¤‰æ›´
          • -
          • f_getcwd - カレント ディレクトリã®å–å¾—
          • -
          • f_getfree - ボリューム空ã領域ã®å–å¾—
          • -
          • f_getlabel - ボリューム ラベルã®å–å¾—
          • -
          • f_setlabel - ボリューム ラベルã®è¨­å®š
          • -
          • f_mkfs - è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆ
          • -
          • f_fdisk - 物ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®åˆ†å‰²
          • -
          • f_gets - 文字列ã®èª­ã¿å‡ºã—
          • -
          • f_putc - 文字ã®æ›¸ãè¾¼ã¿
          • -
          • f_puts - 文字列ã®æ›¸ãè¾¼ã¿
          • -
          • f_printf - 書å¼åŒ–文字列ã®æ›¸ãè¾¼ã¿
          • -
          • f_tell - ç¾åœ¨ã®ãƒªãƒ¼ãƒ‰/ライト ãƒã‚¤ãƒ³ã‚¿ã®å–å¾—
          • -
          • f_eof - ファイル終端ã®æœ‰ç„¡ã®å–å¾—
          • -
          • f_size - ファイル サイズã®å–å¾—
          • -
          • f_error - ファイルã®ã‚¨ãƒ©ãƒ¼ã®æœ‰ç„¡ã®å–å¾—
          • +
          • ファイル アクセス +
              +
            • f_open - ファイルã®ã‚ªãƒ¼ãƒ—ン・作æˆ
            • +
            • f_close - ファイルã®ã‚¯ãƒ­ãƒ¼ã‚º
            • +
            • f_read - データã®èª­ã¿å‡ºã—
            • +
            • f_write - データã®æ›¸ãè¾¼ã¿
            • +
            • f_lseek - リード/ライト ãƒã‚¤ãƒ³ã‚¿ã®ç§»å‹•, サイズã®æ‹¡å¼µ
            • +
            • f_truncate - サイズã®åˆ‡ã‚Šè©°ã‚
            • +
            • f_sync - キャッシュã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã®ãƒ•ãƒ©ãƒƒã‚·ãƒ¥
            • +
            • f_forward - データをストリーム関数ã«è»¢é€
            • +
            • f_gets - 文字列ã®èª­ã¿å‡ºã—
            • +
            • f_putc - 文字ã®æ›¸ãè¾¼ã¿
            • +
            • f_puts - 文字列ã®æ›¸ãè¾¼ã¿
            • +
            • f_printf - 書å¼åŒ–文字列ã®æ›¸ãè¾¼ã¿
            • +
            • f_tell - リード/ライト ãƒã‚¤ãƒ³ã‚¿ã®å–å¾—
            • +
            • f_eof - 終端ã®æœ‰ç„¡ã®å–å¾—
            • +
            • f_size - サイズã®å–å¾—
            • +
            • f_error - エラーã®æœ‰ç„¡ã®å–å¾—
            • +
            +
          • +
          • ディレクトリ アクセス +
              +
            • f_opendir - ディレクトリã®ã‚ªãƒ¼ãƒ—ン
            • +
            • f_closedir - ディレクトリã®ã‚¯ãƒ­ãƒ¼ã‚º
            • +
            • f_readdir - é …ç›®ã®èª­ã¿å‡ºã—
            • +
            • f_findfirst - ディレクトリã®ã‚ªãƒ¼ãƒ—ンã¨æœ€åˆã®æ¤œç´¢é …ç›®ã®èª­ã¿å‡ºã—
            • +
            • f_findnext - 次ã®æ¤œç´¢é …ç›®ã®èª­ã¿å‡ºã—
            • +
            +
          • +
          • ファイル/ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªç®¡ç† +
              +
            • f_stat - ファイル/サブ ディレクトリã®å­˜åœ¨ãƒã‚§ãƒƒã‚¯ã¨æƒ…å ±ã®å–å¾—
            • +
            • f_unlink - ファイル/サブ ディレクトリã®å‰Šé™¤
            • +
            • f_rename - ファイル/サブ ディレクトリã®åå‰ã®å¤‰æ›´ãƒ»ç§»å‹•
            • +
            • f_chmod - ファイル/サブ ディレクトリã®å±žæ€§ã®å¤‰æ›´
            • +
            • f_utime - ファイル/サブ ディレクトリã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã®å¤‰æ›´
            • +
            • f_mkdir - サブ ディレクトリã®ä½œæˆ
            • +
            • f_chdir - カレント ディレクトリã®å¤‰æ›´
            • +
            • f_chdrive - カレント ドライブã®å¤‰æ›´
            • +
            • f_getcwd - カレント ディレクトリã®å–å¾—
            • +
            +
          • +
          • ãƒœãƒªãƒ¥ãƒ¼ãƒ ç®¡ç† +
              +
            • f_mount - ボリューム ワーク エリアã®ç™»éŒ²ãƒ»æŠ¹æ¶ˆ
            • +
            • f_mkfs - è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã«FATボリュームを作æˆ
            • +
            • f_fdisk - 物ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã«è¤‡æ•°ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–を作æˆ
            • +
            • f_getfree - ボリュームã®ã‚µã‚¤ã‚ºã¨ç©ºãサイズã®å–å¾—
            • +
            • f_getlabel - ボリューム ラベルã®å–å¾—
            • +
            • f_setlabel - ボリューム ラベルã®è¨­å®š
            • +
            +

          下ä½ãƒ¬ã‚¤ãƒ¤ インターフェース

          -

          FatFsモジュールã¯ã€å˜ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ« システム レイヤãªã®ã§ã€ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ デãƒã‚¤ã‚¹åˆ¶å¾¡ãƒ¬ã‚¤ãƒ¤ã¯å«ã¾ã‚Œã¾ã›ã‚“。使用ã™ã‚‹ãƒ—ラットフォームやストレージ デãƒã‚¤ã‚¹ã«å¯¾å¿œã—ãŸåˆ¶å¾¡é–¢æ•°ã¯ã€ãƒ¦ãƒ¼ã‚¶ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚FatFsモジュールã¯ã€ä¸‹ä½ãƒ¬ã‚¤ãƒ¤ã«å¯¾ã—標準的ã«ã¯æ¬¡ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’è¦æ±‚ã—ã¾ã™ã€‚拡張機能ã€ãŸã¨ãˆã°OS関連機能を有効ã«ã—ãŸã¨ãã¯ã€åŠ ãˆã¦ãƒ—ロセス/メモリæ“作関数ãªã©ã‚‚å¿…è¦ã«ãªã‚Šã¾ã™ã€‚サンプル プロジェクトã«ä¸‹ä½ãƒ¬ã‚¤ãƒ¤ã®å®Ÿè£…例を示ã—ã¾ã™ã€‚

          +layer +

          FatFsモジュールã¯ã€å˜ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ« システム レイヤãªã®ã§ã€ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ デãƒã‚¤ã‚¹åˆ¶å¾¡ãƒ¬ã‚¤ãƒ¤ã¯å«ã¾ã‚Œã¾ã›ã‚“。使用ã™ã‚‹ãƒ—ラットフォームやストレージ デãƒã‚¤ã‚¹ã«å¯¾å¿œã—ãŸåˆ¶å¾¡é–¢æ•°ã¯ã€ã‚¤ãƒ³ãƒ—リメンタã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚FatFsモジュールã¯ã€ä¸‹ä½ãƒ¬ã‚¤ãƒ¤ã«å¯¾ã—標準的ã«ã¯æ¬¡ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’è¦æ±‚ã—ã¾ã™ã€‚一部ã®æ‹¡å¼µæ©Ÿèƒ½ã€ãŸã¨ãˆã°OS関連機能を有効ã«ã—ãŸã¨ãã¯ã€åŠ ãˆã¦ãƒ—ロセス/メモリæ“作関数ãªã©ã‚‚å¿…è¦ã«ãªã‚Šã¾ã™ã€‚サンプル プロジェクトã«ä¸‹ä½ãƒ¬ã‚¤ãƒ¤ã®å®Ÿè£…例を示ã—ã¾ã™ã€‚

          • disk_status - デãƒã‚¤ã‚¹ã®çŠ¶æ…‹å–å¾—
          • disk_initialize - デãƒã‚¤ã‚¹ã®åˆæœŸåŒ–
          • @@ -99,15 +118,17 @@

            資料

            FatFsモジュールã¯ãƒ•ãƒªãƒ¼ ソフトウェアã¨ã—ã¦æ•™è‚²ãƒ»ç ”究・開発用ã«å…¬é–‹ã—ã¦ã„ã¾ã™ã€‚ã©ã®ã‚ˆã†ãªåˆ©ç”¨ç›®çš„(個人利用ã‹ã‚‰å•†ç”¨ã¾ã§ï¼‰ã§ã‚‚使用・改変・é…布ã«ã¤ã„ã¦ä¸€åˆ‡ã®åˆ¶é™ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€å…¨ã¦åˆ©ç”¨è€…ã®è²¬ä»»ã®ä¸‹ã§ã®åˆ©ç”¨ã¨ã—ã¾ã™ã€‚詳ã—ãã¯ã‚¢ãƒ—リケーション ノートをå‚ç…§ã—ã¦ãã ã•ã„。

            diff --git a/firmware/chibios-portapack/ext/fatfs/doc/css_e.css b/firmware/chibios-portapack/ext/fatfs/doc/css_e.css index 2fa0cc1c..99c6714a 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/css_e.css +++ b/firmware/chibios-portapack/ext/fatfs/doc/css_e.css @@ -19,6 +19,7 @@ tt {margin: 0 0.2em; font-size: 0.85em; font-family: "Consolas", "Courier New", tt.arg {font-style: italic;} ol {margin: 0.5em 2.5em;} ul {margin: 0.5em 2em;} +ul ul {margin: 0 2em 0.5em 1em;} dl {margin: 0.5em 1em;} dd {margin: 0 2em;} dt {font-size: 0.85em; font-family: "Consolas", "Courier New", monospace;} @@ -43,13 +44,14 @@ a.imglnk img {border: 1px solid;} .cal {text-align: center; } h1 {line-height: 1em; font-size: 2em; font-family: sans-serif; padding: 0.3em 0 0.3em;} -p.hdd {float: right; text-align: right; margin-top: 0.5em;} -hr.hds {clear: both; margin-bottom: 1em;} - h2 {font-size: 2em; font-family: sans-serif; background-color: #d8d8FF; padding: 0.5em 0.5em; margin: 0 0 0.5em;} h3 {font-size: 1.5em; font-family: sans-serif; margin: 1.5em 0 0.5em;} -h4 {font-size: 1.2em; font-family: sans-serif; margin: 1em 0 0.2em;} -h5 {font-size: 1em; font-family: sans-serif; margin: 0.5em 0 0em;} +div.doc h3 {border-color: #b0d8d8; border-style: solid; border-width: 0px 0px 4px 12px; padding: 4px; margin-top: 3em;} +h4 {font-size: 1.2em; font-family: sans-serif; margin: 2em 0 0.2em;} +h5 {font-size: 1em; font-family: sans-serif; margin: 1em 0 0em;} +p.hdd {float: right; text-align: right; margin-top: 0.5em;} +hr.hds {clear: both; margin-bottom: 1em;} +kbd {letter-spacing: 0;} small {font-size: 80%;} .indent {margin-left: 2em;} diff --git a/firmware/chibios-portapack/ext/fatfs/doc/css_j.css b/firmware/chibios-portapack/ext/fatfs/doc/css_j.css index b226a8b7..3b1a9646 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/css_j.css +++ b/firmware/chibios-portapack/ext/fatfs/doc/css_j.css @@ -9,7 +9,7 @@ a:hover {background-color: #a0ffff;} a:active {color: darkmagenta; overflow: hidden; outline:none; position: relative; top: 1px; left: 1px;} abbr {border-width: 1px;} -p {text-indent: 1em; margin: 0 0 0.3em 0.5em;} +p {text-indent: 0.8em; margin: 0 0 0.3em 0.5em;} i {margin: 0 0.3em 0 0;} b {margin: 0 0.1em;} em {font-style: normal; font-weight: bold; margin: 0 0.1em;} @@ -22,6 +22,7 @@ tt {margin: 0 0.2em; letter-spacing: 0; font-size: 0.85em; font-family: "Consola tt.arg {font-style: italic;} ol {margin: 0.5em 2.5em;} ul {margin: 0.5em 2em;} +ul ul {margin: 0 2em 0.5em 1em;} dl {margin: 0.5em 1em;} dd {margin: 0em 2em;} dt {font-size: 0.85em; font-family: "Consolas", "Courier New", "‚l‚r ƒSƒVƒbƒN", monospace;} @@ -46,13 +47,14 @@ a.imglnk img {border: 1px solid;} .cal {text-align: center; } h1 {line-height: 1em; font-size: 2em; font-family: sans-serif; padding: 0.3em 0 0.3em;} -p.hdd {float: right; text-align: right; margin-top: 0.5em;} -hr.hds {clear: both; margin-bottom: 1em;} - h2 {font-size: 2em; font-family: "‚l‚r ‚oƒSƒVƒbƒN",sans-serif; background-color: #d8d8FF; padding: 0.5em 0.5em; margin: 0 0 0.5em;} h3 {font-size: 1.5em; font-family: "‚l‚r ‚oƒSƒVƒbƒN",sans-serif; margin: 1.5em 0 0.5em;} -h4 {font-size: 1.2em; font-family: "‚l‚r ‚oƒSƒVƒbƒN",sans-serif; margin: 1em 0 0.2em;} -h5 {font-size: 1em; font-family: "‚l‚r ‚oƒSƒVƒbƒN",sans-serif; margin: 0.5em 0 0em;} +div.doc h3 {border-color: #b0d8d8; border-style: solid; border-width: 0px 0px 4px 12px; padding: 4px; margin-top: 3em;} +h4 {font-size: 1.2em; font-family: "‚l‚r ‚oƒSƒVƒbƒN",sans-serif; margin: 2em 0 0.2em;} +h5 {font-size: 1em; font-family: "‚l‚r ‚oƒSƒVƒbƒN",sans-serif; margin: 1em 0 0em;} +p.hdd {float: right; text-align: right; margin-top: 0.5em;} +hr.hds {clear: both; margin-bottom: 1em;} +kbd {letter-spacing: 0;} small {font-size: 80%;} .indent {margin-left: 2em;} diff --git a/firmware/chibios-portapack/ext/fatfs/doc/css_p.css b/firmware/chibios-portapack/ext/fatfs/doc/css_p.css deleted file mode 100644 index f8589aa6..00000000 --- a/firmware/chibios-portapack/ext/fatfs/doc/css_p.css +++ /dev/null @@ -1 +0,0 @@ -body {margin: 8px; background-color: #ffecf0; font-color: black; font-family: serif; line-height: 133%; max-width: 1024px;} diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/appnote.html b/firmware/chibios-portapack/ext/fatfs/doc/en/appnote.html index fee2af9d..aa989320 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/appnote.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/appnote.html @@ -26,9 +26,8 @@
          • Extended Use of FatFs API
          • About FatFs License
          • -
            -
            +

            How to Port

            Basic considerations

            @@ -44,149 +43,142 @@ The FatFs module assumes that size of char/short/long are 8/16/32 bit and int is

            The dependency diagram shown below is a typical configuration of the embedded system with FatFs module.

            dependency diagram

            (a) If a working disk module with FatFs API is provided, no additional function is needed. (b) To attach existing disk drivers with different API, glue functions are needed to translate the APIs between FatFs and the drivers.

            -

            functional diagram

            +

            functional diagram

            Which function is required?

            -

            You need to provide only low level disk I/O functions that required by FatFs module and nothing else. If a working disk module for the target is already existing, you need to write only glue functions to attach it to the FatFs module. If not, you need to port any other disk module or write it from scratch. Most of defined functions are not that always required. For example, disk write function is not required in read-only configuration. Following table shows which function is required depends on configuration options.

            +

            You need to provide only low level disk I/O functions that required by FatFs module and nothing else. If a working disk module for the target system is already existing, you need to write only glue functions to attach it to the FatFs module. If not, you need to port any other disk module or write it from scratch. Most of defined functions are not that always required. For example, disk write function is not required at read-only configuration. Following table shows which function is required depends on the configuration options.

            - + - +
            FunctionRequired when:Note
            FunctionRequired whenNote
            disk_status
            disk_initialize
            disk_read
            AlwaysDisk I/O functions.
            Samples available in ffsample.zip.
            There are many implementations on the web.
            disk_write
            get_fattime
            disk_ioctl (CTRL_SYNC)
            _FS_READONLY == 0
            disk_ioctl (GET_SECTOR_COUNT)
            disk_ioctl (GET_BLOCK_SIZE)
            _USE_MKFS == 1
            disk_ioctl (GET_SECTOR_SIZE)_MAX_SS != _MIN_SS
            disk_ioctl (CTRL_TRIM)_USE_TRIM == 1
            ff_convert
            ff_wtoupper
            _USE_LFN >= 1Unicode support functions.
            Available in option/unicode.c.
            ff_convert
            ff_wtoupper
            _USE_LFN != 0Unicode support functions.
            Just add option/unicode.c to the project.
            ff_cre_syncobj
            ff_del_syncobj
            ff_req_grant
            ff_rel_grant
            _FS_REENTRANT == 1O/S dependent functions.
            Samples available in option/syscall.c.
            ff_mem_alloc
            ff_mem_free
            _USE_LFN == 3
            -
            +

            Limits

            • FAT sub-types: FAT12, FAT16 and FAT32.
            • -
            • Number of open files: Unlimited, depends on available memory.
            • +
            • Number of open files: Unlimited. (depends on available memory)
            • Number of volumes: Upto 10.
            • -
            • File size: Depends on the FAT specs. (upto 4G-1 bytes)
            • -
            • Volume size: Depends on the FAT specs. (upto 2T bytes at 512 bytes/sector)
            • -
            • Cluster size: Depends on the FAT specs. (upto 64K bytes at 512 bytes/sector)
            • -
            • Sector size: Depends on the FAT specs. (512, 1024, 2048 and 4096 bytes)
            • +
            • File size: Upto 4G-1 bytes. (by FAT specs.)
            • +
            • Volume size: Upto 2T bytes at 512 bytes/sector. (by FAT specs.)
            • +
            • Cluster size: Upto 64K bytes at 512 bytes/sector. (by FAT specs.)
            • +
            • Sector size: 512, 1024, 2048 and 4096 bytes. (by FAT specs.)
            -
            +

            Memory Usage

            +

            The memory usage varies depends on the configuration options.

            - - - - - - + + + + +
            ARM7
            32bit
            ARM7
            Thumb
            CM3
            Thumb-2
            AVRH8/300HPIC24RL78V850ESSH-2ARX600IA-32
            CompilerGCCGCCGCCGCCCH38C30CC78K0RCA850SHCRXCVC6
            _WORD_ACCESS00010001011
            text (Full, R/W)1067571716617133551094011722132628113904860327952
            text (Min, R/W) 672746314331 8569 7262 7720 90885287580039485183
            text (Full, R/O) 473131472889 6235 5170 5497 64823833397228623719
            text (Min, R/O) 355924852295 4575 4064 4240 50192993310422142889
            text (Full, R/W)10.6k7.1k6.5k13.3k10.9k11.7k13.3k8.1k9.0k6.0k7.9k
            text (Min, R/W) 6.7k4.6k4.2k 8.6k 7.3k 7.7k 9.1k5.3k5.8k3.9k5.2k
            text (Full, R/O) 4.8k3.2k2.9k 6.2k 5.2k 5.5k 6.5k3.8k4.0k2.9k3.7k
            text (Min, R/O) 3.6k2.5k2.3k 4.6k 4.1k 4.3k 5.0k3.0k3.1k2.2k2.9k
            bssV*4 + 2V*4 + 2V*4 + 2V*2 + 2V*4 + 2V*2 + 2V*2 + 2V*4 + 2V*4 + 2V*4 + 2V*4 + 2
            Work area
            (_FS_TINY == 0)
            V*560
            + F*550
            V*560
            + F*550
            V*560
            + F*550
            V*560
            + F*544
            V*560
            + F*550
            V*560
            + F*544
            V*560
            + F*544
            V*560
            + F*544
            V*560
            + F*550
            V*560
            + F*550
            V*560
            + F*550
            Work area
            (_FS_TINY == 1)
            V*560
            + F*36
            V*560
            + F*36
            V*560
            + F*36
            V*560
            + F*32
            V*560
            + F*36
            V*560
            + F*32
            V*560
            + F*32
            V*560
            + F*36
            V*560
            + F*36
            V*560
            + F*36
            V*560
            + F*36

            These are the memory usage on some target systems with following condition. The memory sizes are in unit of byte, V denotes number of volumes and F denotes number of open files. All samples are optimezed in code size.

            -FatFs R0.10a options:
            -_FS_READONLY     0 (R/W) or 1 (R/O)
            -_FS_MINIMIZE     0 (Full function) or 3 (Minimized function)
            -_USE_STRFUNC     0 (Disable string functions)
            -_USE_MKFS        0 (Disable f_mkfs function)
            -_USE_FORWARD     0 (Disable f_forward function)
            -_USE_FASTSEEK    0 (Disable fast seek feature)
            -_CODE_PAGE       932 (Japanese Shift_JIS)
            -_USE_LFN         0 (Disable LFN feature)
            -_MAX_SS          512 (Fixed sector size)
            -_FS_RPATH        0 (Disable relative path feature)
            -_FS_LABEL        0 (Disable volume label functions)
            -_VOLUMES         V (Number of logical drives to be used)
            -_MULTI_PARTITION 0 (Single partition per drive)
            -_FS_REENTRANT    0 (Disable thread safe)
            -_FS_LOCK         0 (Disable file lock control)
            +FatFs R0.11 options:
            +_FS_READONLY   0 (R/W) or 1 (R/O)
            +_FS_MINIMIZE   0 (Full basic function) or 3 (Minimized function)
            +_VOLUMES       V (Number of logical drives to be used)
            +_WORD_ACCESS   0 or 1 (Set for 1 if possible)
            +(Any other options are left not changed from default setting)
             
            -
            +

            Module Size Reduction

            -

            Follwing table shows which API function is removed by configuration options for the module size reduction.

            +

            Follwing table shows which API function is removed by configuration options for the module size reduction. To use any API function, the row of the function must be clear.

            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            Function_FS_MINIMIZE_FS_READONLY_USE_STRFUNC_FS_RPATH_FS_LABEL_USE_MKFS_USE_FORWARD_MULTI_PARTITION
            0123010  1/201201010101
            f_mount
            f_open
            f_close
            f_read
            f_writex
            f_syncx
            f_lseekx
            f_opendirxx
            f_closedirxx
            f_readdirxx
            f_statxxx
            f_getfreexxxx
            f_truncatexxxx
            f_unlinkxxxx
            f_mkdirxxxx
            f_chmodxxxx
            f_utimexxxx
            f_renamexxxx
            f_chdirx
            f_chdrivex
            f_getcwdxx
            f_getlabelx
            f_setlabelxx
            f_forwardx
            f_mkfsxx
            f_fdiskxxx
            f_putcxx
            f_putsxx
            f_printfxx
            f_getsx
            Function_FS_MINIMIZE_FS_READONLY_USE_STRFUNC_FS_RPATH_USE_FIND_USE_LABEL_USE_MKFS_USE_FORWARD_MULTI_PARTITION
            0123010  1/20120101010101
            f_mount
            f_open
            f_close
            f_read
            f_writex
            f_syncx
            f_lseekx
            f_opendirxx
            f_closedirxx
            f_readdirxx
            f_findfirstxxx
            f_findnextxxx
            f_statxxx
            f_getfreexxxx
            f_truncatexxxx
            f_unlinkxxxx
            f_mkdirxxxx
            f_chmodxxxx
            f_utimexxxx
            f_renamexxxx
            f_chdirx
            f_chdrivex
            f_getcwdxx
            f_getlabelx
            f_setlabelxx
            f_forwardx
            f_mkfsxx
            f_fdiskxxx
            f_putcxx
            f_putsxx
            f_printfxx
            f_getsx
            -
            +

            Long File Name

            -

            FatFs module supports LFN (long file name). The two different file names, SFN (short file name) and LFN, of a file is transparent on the API except for f_readdir() function. The LFN feature is disabled by default. To enable it, set _USE_LFN to 1, 2 or 3, and add option/unicode.c to the project. The LFN feature requiers a certain working buffer in addition. The buffer size can be configured by _MAX_LFN according to the available memory. The length of an LFN will reach up to 255 characters, so that the _MAX_LFN should be set to 255 for full featured LFN operation. If the size of working buffer is insufficient for the input file name, the file function fails with FR_INVALID_NAME. When enable the LFN feature under re-entrant configuration, _USE_LFN must be set to 2 or 3. In this case, the file function allocates the working buffer on the stack or heap. The working buffer occupies (_MAX_LFN + 1) * 2 bytes.

            +

            FatFs module supports LFN (long file name). The two different file names, SFN (short file name) and LFN, of a file is transparent on the API except for f_readdir function. The LFN feature is disabled by default. To enable it, set _USE_LFN to 1, 2 or 3, and add option/unicode.c to the project. The LFN feature requiers a certain working buffer in addition. The buffer size can be configured by _MAX_LFN according to the available memory. The length of an LFN will reach up to 255 characters, so that the _MAX_LFN should be set to 255 for full featured LFN operation. If the size of working buffer is insufficient for the input file name, the file function fails with FR_INVALID_NAME. When use any re-entry to the API with the LFN feature, _USE_LFN must be set to 2 or 3. In this case, the file function allocates the working buffer on the stack or heap. The working buffer occupies (_MAX_LFN + 1) * 2 bytes.

            - - - - - - - + + + + + + +
            LFN cfg on ARM7TDMI
            Code pageProgram size
            SBCS+3.7K
            932(Shift_JIS)+62K
            936(GBK)+177K
            949(Korean)+139K
            950(Big5)+111K
            LFN cfg. at CM3/gcc
            _CODE_PAGECode size
            SBCS+2.8K
            932(Japanese)+62.6k
            936(Simplified Chinese)+177k
            949(Korean)+139k
            950(Traditional Chinese)+111k
            -

            When the LFN feature is enabled, the module size will be increased depends on the selected code page. Right table shows how many bytes increased when LFN feature is enabled with some code pages. Especially, in the CJK region, tens of thousands of characters are being used. Unfortunately, it requires a huge OEM-Unicode bidirectional conversion table and the module size will be drastically increased as shown in the table. As the result, the FatFs with LFN feature with those code pages will not able to be implemented to most 8-bit microcontrollers.

            -

            Note that the LFN feature on the FAT file system is a patent of Microsoft Corporation. This is not the case on FAT32 but most FAT32 drivers come with the LFN feature. FatFs can swich the LFN feature off by configuration option. When enable LFN feature on the commercial products, a license from Microsoft may be required depends on the final destination.

            +

            When the LFN feature is enabled, the module size will be increased depends on the configured code page. Right table shows how much code size increased when LFN feature is enabled with some code pages. Especially, in the CJK region, tens of thousands of characters are being used. Unfortunately, it requires a huge OEM-Unicode bidirectional conversion table and the module size will be drastically increased as shown in the table. As the result, the FatFs with LFN feature with those code pages will not able to be implemented to most 8-bit microcontrollers.

            +

            Note that the LFN feature on the FAT file system is a patent of Microsoft Corporation. This is not the case on FAT32 but most FAT32 drivers come with the LFN feature. FatFs can swich the LFN feature on/off by configuration option. When enable LFN feature on the commercial products, a license from Microsoft may be required depends on the final destination.

            -
            +

            Unicode API

            -

            By default, FatFs uses ANSI/OEM code set on the API under LFN configuration. FatFs can also switch the character encoding to Unicode on the API by _LFN_UNICODE option. This means that the FatFs supports the True-LFN feature. For more information, refer to the description in the file name.

            +

            By default, FatFs uses ANSI/OEM code set on the API even at LFN configuration. FatFs can also switch the character encoding on the API to Unicode by _LFN_UNICODE option. This means that the FatFs supports the True-LFN feature. For more information, refer to the description in the file name.

            -
            +

            Re-entrancy

            -

            The file operations to the different volume is always re-entrant and can work simultaneously. The file operations to the same volume is not re-entrant but it can also be configured to thread-safe by _FS_REENTRANT option. In this case, also the OS dependent synchronization object control functions, ff_cre_syncobj(), ff_del_syncobj(), ff_req_grant() and ff_rel_grant() must be added to the project. There are some examples in the option/syscall.c.

            -

            When a file function is called while the volume is in use by any other task, the file function is suspended until that task leaves the file function. If wait time exceeded a period defined by _TIMEOUT, the file function will abort with FR_TIMEOUT. The timeout feature might not be supported by some RTOS.

            -

            There is an exception for f_mount(), f_mkfs(), f_fdisk() function. These functions are not re-entrant to the same volume or corresponding physical drive. When use these functions, all other tasks must unmount the volume and avoid to access the volume.

            -

            Note that this section describes on the re-entrancy of the FatFs module itself but also the low level disk I/O layer will need to be re-entrant.

            +

            The file operations to the different volume is always re-entrant regardless of configurations and it can work simultaneously without any mutual exclusion.

            +

            The file operations to the same volume is not re-entrant but it can also be configured to thread-safe by _FS_REENTRANT option. It enables to control exclusive use of each file system object. In this case, also the OS dependent synchronization object control functions, ff_cre_syncobj/ff_del_syncobj/ff_req_grant/ff_rel_grant, needed to be added to the project. There are some examples in the option/syscall.c.

            +

            When a file function is called while the volume is being accessed by any other task, the file function to the volume will be suspended until that task leaves the file function. If the wait time exceeded a period defined by _TIMEOUT, the file function will abort with FR_TIMEOUT. The timeout feature might not be supported on the some RTOSs.

            +

            There is an exception on the re-entrancy for f_mount/f_mkfs/f_fdisk function. These volume management functions are not re-entrant to the same volume and corresponding physical drive. When use these functions, any other tasks need to avoid to access the volume.

            +

            Note that this section describes on the re-entrancy of the FatFs module itself. The _FS_REENTRANT controls only exclusive use of each file system object and it does not that prevent to re-enter the low level disk functions. For example, only disk_status function can be re-entered at single volume system and any disk function can be re-entered at multiple volume system. Thus the low level disk I/O layer must be always thread-safe when any FatFs API is re-entered by two or more tasks.

            -
            +

            Duplicated File Access

            -

            FatFs module does not support the read/write collision control of duplicated open to a file. The duplicated open is permitted only when each of open method to a file is read mode. The duplicated open with one or more write mode to a file is always prohibited, and also open file must not be renamed and deleted. A violation of these rules can cause data colluption.

            -

            The file lock control can be enabled by _FS_LOCK option. The value of option defines the number of open objects to manage simultaneously. In this case, if any open, rename or remove that violating the file shareing rule that described above is attempted, the file function will fail with FR_LOCKED. If number of open objects, files and sub-directories, is equal to _FS_LOCK, an extra f_open(), f_optndir() function will fail with FR_TOO_MANY_OPEN_FILES.

            +

            FatFs module does not support the read/write collision control of duplicated open to a file. The duplicated open is permitted only when each of open method to a file is read mode. The duplicated open with one or more write mode to a file is always prohibited, and also open file must not be renamed or deleted. A violation of these rules can cause data colluption.

            +

            The file lock control can be enabled by _FS_LOCK option. The value of option defines the number of open objects to manage simultaneously. In this case, if any open, rename or remove that violating the file shareing rule that described above is attempted, the file function will rejected with FR_LOCKED. If number of open objects, files and sub-directories, is equal to _FS_LOCK, an extra f_open/f_opendir function will fail with FR_TOO_MANY_OPEN_FILES.

            -
            +

            Performance Effective File Access

            -

            For good read/write throughput on the small embedded systems with limited size of memory, application programmer should consider what process is done in the FatFs module. The file data on the volume is transferred in following sequence by f_read() function.

            +

            For good read/write throughput on the small embedded systems with limited size of memory, application programmer should consider what process is done in the FatFs module. The file data on the volume is transferred in following sequence by f_read function.

            Figure 1. Sector misaligned read (short)

            @@ -196,12 +188,12 @@ _FS_LOCK 0 (Disable file lock control)

            Figure 3. Fully sector aligned read

            -

            The file I/O buffer is a sector buffer to read/write a partial data on the sector. The sector buffer is either file private sector buffer on each file object or shared sector buffer in the file system object. The buffer configuration option _FS_TINY determins which sector buffer is used for the file data transfer. When tiny buffer configuration (1) is selected, data memory consumption is reduced _MAX_SS bytes each file object. In this case, FatFs module uses only a sector buffer in the file system object for file data transfer and FAT/directory access. The disadvantage of the tiny buffer configuration is: the FAT data cached in the sector buffer will be lost by file data transfer and it must be reloaded at every cluster boundary. However it will be suitable for most application from view point of the decent performance and low memory comsumption.

            -

            Figure 1 shows that a partial sector, sector misaligned part of the file, is transferred via the file I/O buffer. At long data transfer shown in Figure 2, middle of transfer data that covers one or more sector is transferred to the application buffer directly. Figure 3 shows that the case of entier transfer data is aligned to the sector boundary. In this case, file I/O buffer is not used. On the direct transfer, the maximum extent of sectors are read with disk_read() function at a time but the multiple sector transfer is divided at cluster boundary even if it is contiguous.

            +

            The file I/O buffer is a sector buffer to read/write a partial data on the sector. The sector buffer is either file private sector buffer on each file object or shared sector buffer in the file system object. The buffer configuration option _FS_TINY determins which sector buffer is used for the file data transfer. When tiny buffer configuration (1) is selected, data memory consumption is reduced _MAX_SS bytes each file object. In this case, FatFs module uses only a sector buffer in the file system object for file data transfer and FAT/directory access. The disadvantage of the tiny buffer configuration is: the FAT data cached in the sector buffer will be lost by file data transfer and it must be reloaded at every cluster boundary. However it will be suitable for most application from view point of the decent performance and low memory comsumption.

            +

            Figure 1 shows that a partial sector, sector misaligned part of the file, is transferred via the file I/O buffer. At long data transfer shown in Figure 2, middle of transfer data that covers one or more sector is transferred to the application buffer directly. Figure 3 shows that the case of entier transfer data is aligned to the sector boundary. In this case, file I/O buffer is not used. On the direct transfer, the maximum extent of sectors are read with disk_read function at a time but the multiple sector transfer is divided at cluster boundary even if it is contiguous.

            Therefore taking effort to sector aligned read/write accesss eliminates buffered data transfer and the read/write performance will be improved. Besides the effect, cached FAT data will not be flushed by file data transfer at the tiny configuration, so that it can achieve same performance as non-tiny configuration with small memory footprint.

            -
            +

            Considerations on Flash Memory Media

            To maximize the write performance of flash memory media, such as SDC, CFC and U Disk, it must be controlled in consideration of its characteristitcs.

            Using Mutiple-Sector Write

            @@ -209,14 +201,15 @@ _FS_LOCK 0 (Disable file lock control) Figure 6. Comparison between Multiple/Single Sector Write
            fig.6
            -

            The write throughput of the flash memory media becomes the worst at single sector write transaction. The write throughput increases as the number of sectors per a write transaction. This effect more appers at faster interface speed and the performance ratio often becomes grater than ten. This graph is clearly explaining how fast is multiple block write (W:16K, 32 sectors) than single block write (W:100, 1 sector), and also larger card tends to be slow at single block write. The number of write transactions also affects the life time of the flash memory media. Therefore the application program should write the data in large block as possible. The ideal write chunk size and alighment is size of sector, and size of cluster is the best. Of course all layers between the application and the storage device must have consideration on multiple sector write, however most of open-source disk drivers lack it. Do not split a multiple sector write request into single sector write transactions or the write throughput gets poor. Note that FatFs module and its sample disk drivers supprt multiple sector read/write feature.

            +

            The write throughput of the flash memory media becomes the worst at single sector write transaction. The write throughput increases as the number of sectors per a write transaction as shown in Figure 6. This effect more appers at faster interface speed and the performance ratio often becomes grater than ten. This graph is clearly explaining how fast is multiple block write (W:16K, 32 sectors) than single block write (W:100, 1 sector), and also larger card tends to be slow at single block write. Number of write transactions also affects life time of the flash memory media. When compared at same amount of write data, the single sector write in Figure 6 above wears flash memory media 16 times more than multiple sector write in Figure 6 below. Single sector write is pretty pain for the flash memory media.

            +

            Therefore the application program should write the data in large block as possible. The ideal write chunk size and alighment is size of sector, and size of cluster is the best. Of course all layers between the application and the storage device must have consideration on multiple sector write, however most of open-source memory card drivers lack it. Do not split a multiple sector write request into single sector write transactions or the write throughput gets poor. Note that FatFs module and its sample disk drivers supprt multiple sector read/write feature.

            Forcing Memory Erase

            -

            When remove a file with f_remove() function, the data clusters occupied by the file are marked 'free' on the FAT. But the data sectors containing the file data are not that applied any process, so that the file data left occupies a part of the flash memory array as 'live block'. If the file data is forced erased on removing the file, those data blocks will be turned in to the free block pool. This may skip internal block erase operation to the data block on next write operation. As the result the write performance might be improved. FatFs can manage this feature by setting _USE_TRIM to 1. Note that this is an expectation of internal process of the flash memory storage and not that always effective. Also f_remove() function will take a time when remove a large file. Most applications will not need this feature.

            +

            When remove a file with f_remove function, the data clusters occupied by the file are marked 'free' on the FAT. But the data sectors containing the file data are not that applied any process, so that the file data left occupies a part of the flash memory array as 'live block'. If the file data is forced erased on removing the file, those data blocks will be turned in to the free block pool. This may skip internal block erase operation to the data block on next write operation. As the result the write performance might be improved. FatFs can manage this feature by setting _USE_TRIM to 1. Note that this is an expectation of internal process of the flash memory storage and not that always effective. Also f_remove function will take a time when remove a large file. Most applications will not need this feature.

            -
            +

            Critical Section

            -

            If a write operation to the FAT volume is interrupted due to any accidental failure, such as sudden blackout, incorrect disk removal and unrecoverable disk error, the FAT structure on the volume can be broken. Following images shows the critical section of the FatFs module.

            +

            If a write operation to the FAT volume is interrupted due to any accidental failure, such as sudden blackout, incorrect media removal and unrecoverable disk error, the FAT structure on the volume can be broken. Following images shows the critical section of the FatFs module.

            Figure 4. Long critical section
            fig.4 @@ -234,10 +227,10 @@ Figure 5. Minimized critical section
          • The file created as new or overwritten remains but no content.
          • Efficiency of disk use gets worse due to lost clusters.
          -

          Each case does not affect the files that not opened in write mode. To minimize risk of data loss, the critical section can be minimized by minimizing the time that file is opened in write mode or using f_sync() function as shown in Figure 5.

          +

          Each case does not affect the files that not opened in write mode. To minimize risk of data loss, the critical section can be minimized by minimizing the time that file is opened in write mode or using f_sync function as shown in Figure 5.

          -
          +

          Extended Use of FatFs API

          These are examples of extended use of FatFs APIs. New item will be added whenever a useful code is found.

            @@ -249,27 +242,30 @@ Figure 5. Minimized critical section
          -
          +

          About FatFs License

          FatFs has being developped as a personal project of author, ChaN. It is free from the code anyone else wrote. Following code block shows a copy of the FatFs license document that included in the source files.

          -
          /*----------------------------------------------------------------------------/
          -/  FatFs - FAT file system module  R0.10b                    (C)ChaN, 2014
          +
          +/*----------------------------------------------------------------------------/
          +/  FatFs - FAT file system module  R0.11                 (C)ChaN, 2015
           /-----------------------------------------------------------------------------/
          -/ FatFs module is a generic FAT file system module for small embedded systems.
          -/ This is a free software that opened for education, research and commercial
          -/ developments under license policy of following trems.
          +/ FatFs module is a free software that opened under license policy of
          +/ following conditions.
           /
          -/  Copyright (C) 2014, ChaN, all right reserved.
          +/ Copyright (C) 2015, ChaN, all right reserved.
           /
          -/ * The FatFs module is a free software and there is NO WARRANTY.
          -/ * No restriction on use. You can use, modify and redistribute it for
          -/   personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY.
          -/ * Redistributions of source code must retain the above copyright notice.
          +/ 1. Redistributions of source code must retain the above copyright notice,
          +/    this condition and the following disclaimer.
           /
          -/-----------------------------------------------------------------------------/
          -

          Therefore FatFs license is one of the BSD-style licenses but there is a significant feature. Because FatFs is mainly intended for embedded projects, the redistributions in binary form, such as embedded code or any forms without source code, need not to explain about FatFs in order to extend usability for commercial products. The documentation of the distributions need not include about FatFs and its license documents, and it may also. This is equivalent to the BSD 1-Clause License. Of course FatFs is compatible with the projects under GNU GPL. When redistribute the FatFs with any modification or branch it as a fork, the license can also be changed to GNU GPL, BSD-style license or any free software licenses that not conflict with FatFs license.

          +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/----------------------------------------------------------------------------*/ +
          +

          Therefore FatFs license is one of the BSD-style licenses but there is a significant feature. FatFs is mainly intended for embedded systems. In order to extend the usability for commercial products, the redistributions of FatFs in binary form, such as embedded code or any forms without source code, does not need to explain about use of FatFs in the documentations. This is equivalent to the 1-clause BSD license. Of course FatFs is compatible with the most open source software licenses including GNU GPL. When you redistribute the FatFs source code with any modification or create a fork, the license can also be changed to GNU GPL, BSD-style license or any open source software licenses that not conflict with FatFs license.

          -

          Return

          +

          Return Home

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/chdir.html b/firmware/chibios-portapack/ext/fatfs/doc/en/chdir.html index 063b8f56..b9009fc5 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/chdir.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/chdir.html @@ -50,7 +50,7 @@ FRESULT f_chdir (

          Description

          -

          The f_chdir() function changes the current directory of the logical drive. The current directory of a drive is initialized to the root directory when the drive is auto-mounted. Note that the current directory is retained in the each file system object so that it also affects other tasks that using the volume.

          +

          The f_chdir function changes the current directory of the logical drive. The current directory of a drive is initialized to the root directory when the drive is auto-mounted. Note that the current directory is retained in the each file system object so that it also affects other tasks that using the volume.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/chdrive.html b/firmware/chibios-portapack/ext/fatfs/doc/en/chdrive.html index 665e5430..79509944 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/chdrive.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/chdrive.html @@ -41,7 +41,7 @@ FRESULT f_chdrive (

          Description

          -

          The f_chdrive() function changes the current drive. The initial value of the current drive number is 0. Note that the current drive is retained in a static variable so that it also affects other tasks that using the file functions.

          +

          The f_chdrive function changes the current drive. The initial value of the current drive number is 0. Note that the current drive is retained in a static variable so that it also affects other tasks that using the file functions.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/chmod.html b/firmware/chibios-portapack/ext/fatfs/doc/en/chmod.html index 6d539746..8604873c 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/chmod.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/chmod.html @@ -66,7 +66,7 @@ FRESULT f_chmod (

          Description

          -

          The f_chmod() function changes the attribute of a file or sub-directory.

          +

          The f_chmod function changes the attribute of a file or sub-directory.

          @@ -80,7 +80,7 @@ FRESULT f_chmod (

          Example

               /* Set read-only flag, clear archive flag and others are left unchanged. */
          -    f_chmod("file.txt", AR_RDO, AR_RDO | AR_ARC);
          +    f_chmod("file.txt", AM_RDO, AM_RDO | AM_ARC);
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/close.html b/firmware/chibios-portapack/ext/fatfs/doc/en/close.html index f3423fa1..e7ac2fd1 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/close.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/close.html @@ -36,7 +36,6 @@ FRESULT f_close ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT

          @@ -45,7 +44,7 @@ FRESULT f_close (

          Description

          -

          The f_close() function closes an open file object. If any data has been written to the file, the cached information of the file is written back to the volume. After the function succeeded, the file object is no longer valid and it can be discarded.

          +

          The f_close function closes an open file object. If any data has been written to the file, the cached information of the file is written back to the volume. After the function succeeded, the file object is no longer valid and it can be discarded.

          Note that if the file object is in read-only mode and _FS_LOCK option is not enabled, the file object can also be discarded without this process. However this is not recommended for future compatibility.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/closedir.html b/firmware/chibios-portapack/ext/fatfs/doc/en/closedir.html index 4f97b6be..1494d7e4 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/closedir.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/closedir.html @@ -43,7 +43,7 @@ FRESULT f_closedir (

          Description

          -

          The f_closedir() function closes an open directory object. After the function succeeded, the directory object is no longer valid and it can be discarded.

          +

          The f_closedir function closes an open directory object. After the function succeeded, the directory object is no longer valid and it can be discarded.

          Note that the directory object can also be discarded without this process if _FS_LOCK option is not enabled. However this is not recommended for future compatibility.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/config.html b/firmware/chibios-portapack/ext/fatfs/doc/en/config.html new file mode 100644 index 00000000..82e25c6c --- /dev/null +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/config.html @@ -0,0 +1,220 @@ + + + + + + + + +FatFs - Configuration Options + + + +

          Configuration Options

          +

          There are many options to configure the functions of FatFs for each project. The configuration options are defined in the ffconf.h.

          + +
          +

          Function Configurations

          + +

          _FS_READONLY

          +

          Read/Write(0) or Read-only(1). Read-only configuration removes writing API functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, f_truncate, f_getfree and optional writing functions as well.

          + +

          _FS_MINIMIZE

          +

          This option defines minimization level to remove some basic API functions as follows:

          + + + + + + +
          ValueDescription
          0All basic API functions are available.
          1f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_utime, f_truncate and f_rename function are removed.
          2f_opendir, f_readdir and f_closedir function are removed in addition to 1.
          3f_lseek function is removed in addition to 2.
          + +

          _USE_STRFUNC

          +

          This option switches string functions, f_gets, f_putc, f_puts and f_printf.

          + + + + + +
          ValueDescription
          0Disable string functions.
          1Enable string functions without LF-CRLF conversion.
          2Enable string functions with LF-CRLF conversion.
          + +

          _USE_FIND

          +

          Disable(0) or Enable(1). This option switches filtered directory read feature and related functions, f_findfirst and f_findnext.

          + +

          _USE_MKFS

          +

          Disable(0) or Enable(1). This option switches f_mkfs function.

          + +

          _USE_FASTSEEK

          +

          Disable(0) or Enable(1). This option switches fast seek feature to enable accelerated mode of f_lseek, f_read and f_write function. For more information, read here.

          + +

          _USE_LABEL

          +

          Disable(0) or Enable(1). This option switches volume label functions, f_getlabel and f_setlabel.

          + +

          _USE_FORWARD

          +

          Disable(0) or Enable(1). This option switches f_forward function. also _FS_TINY needs to be set to 1.

          + +
          + + +
          +

          Namespace and Locale Configurations

          + +

          _CODE_PAGE

          +

          This option specifies the OEM code page to be used on the target system. Incorrect setting of the code page can cause a file open failure. If any extended character is not used at all, there is no difference between any code pages.

          + + + + + + + + + + + + + + + + + + + + + + + + +
          ValueDescription
          1ASCII (valid at non-LFN cfg.)
          437U.S.
          720Arabic
          737Greek
          771KBL
          775Baltic
          850Latin 1
          852Latin 2
          855Cyrillic
          857Turkish
          860Portuguese
          861Icelandic
          862Hebrew
          863Canadian French
          864Arabic
          865Nordic
          866Russian
          869Greek 2
          932Japanese (DBCS)
          936Simplified Chinese (DBCS)
          949Korean (DBCS)
          950Traditional Chinese (DBCS)
          + +

          _USE_LFN

          +

          This option switches the LFN feature. When enable the LFN feature, Unicode handling functions option/unicode.c must be added to the project. The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. When use stack for the working buffer, take care on stack overflow. When use heap memory for the working buffer, memory management functions, ff_memalloc and ff_memfree, must be added to the project.

          + + + + + + +
          ValueDescription
          0Disable LFN feature. Only 8.3 format can be used.
          1Enable LFN with static working buffer on the BSS. Always NOT thread-safe.
          2Enable LFN with dynamic working buffer on the STACK.
          3Enable LFN with dynamic working buffer on the HEAP.
          + +

          _MAX_LFN

          +

          This option defines the size of LFN working buffer from 12 to 255 in unit of character. This option has no effect when LFN feature is disabled.

          + +

          _LFN_UNICODE

          +

          ANSI/OEM(0) or Unicode(1). This option switches character encoding on the API. To use Unicode (UTF16) string for the path name, enable LFN feature and set this option to 1. This option also affects behavior of string I/O functions. When LFN feature is disabled, this option must be 0. For more information, read here.

          + +

          _STRF_ENCODE

          +

          When Unicode API is selected by _LFN_UNICODE, this option defines the assumption of character encoding on the file to be read/written via string I/O functions, f_gets, f_putc, f_puts and f_printf. This option has no effect when _LFN_UNICODE == 0.

          + + + + + + +
          ValueDescription
          0ANSI/OEM
          1UTF-16LE
          2UTF-16BE
          3UTF-8
          + +

          _FS_RPATH

          +

          This option configures relative path feature. Note that directory items read via directory functions are affected by this option. For more information, read here.

          + + + + + +
          ValueDescription
          0Disable relative path feature and remove related functions.
          1Enable relative path feature. f_chdir and f_chdrive function is available.
          2f_getcwd function is available in addition to 1
          + +
          + + +
          +

          Volume/Drive Configurations

          + +

          _VOLUMES

          +

          This option configures number of volumes (logical drives, from 1 to 9) to be used.

          + +

          _STR_VOLUME_ID

          +

          Disable(0) or Enable(1). This option switches string volume ID feature. When enabled, also pre-defined strings in _VOLUME_STRS can be used as drive identifier in the path name.

          + +

          _VOLUME_STRS

          +

          This option defines the drive ID strings for each logical drives. Number of items must be equal to _VOLUMES. Valid characters for the drive ID strings are: A-Z and 0-9.

          + +

          _MULTI_PARTITION

          +

          Disable(0) or Enable(1). This option switches multi-partition feature. By default (0), each logical drive number is bound to the same physical drive number and only an FAT volume each physical drive are mounted. When enabled, each logical drive is bound to the partition on the physical drive listed in the user defined partition resolution table VolToPart[]. Also f_fdisk funciton will be enabled. For more information, read here.

          + +

          _MIN_SS, _MAX_SS

          +

          This set of options defines size of sector on the low level disk I/O interface, disk_read and disk_write function. Valid numbers are 512, 1024, 2048 and 4096. _MIN_SS defines minimum size of sector and _MAX_SS defines the maximum size of sector. Always set both 512 for all type of memory cards and harddisk. But a larger value may be required for on-board flash memory and some type of optical media. When _MAX_SS > _MIN_SS, FatFs is configured to variable sector size and GET_SECTOR_SIZE command must be implemented to the disk_ioctl function.

          + +

          _USE_TRIM

          +

          Disable(0) or Enable(1). This option switches ATA-TRIM feature. To enable Trim feature, also CTRL_TRIM command should be implemented to the disk_ioctl function.

          + +

          _FS_NOFSINFO

          +

          0 to 3. If you need to know correct free space on the FAT32 volume, set bit 0 of this option, and f_getfree function at first time after volume mount will force a full FAT scan. Bit 1 controls the use of last allocated cluster number.

          + + + + + + +
          ValueDescription
          bit0=0Use free cluster count in the FSINFO if available.
          bit0=1Do not trust free cluster count in the FSINFO.
          bit1=0Use last allocated cluster number in the FSINFO to find a free cluster if available.
          bit1=1Do not trust last allocated cluster number in the FSINFO.
          + +
          + + +
          +

          System Configurations

          + +

          _FS_TINY

          +

          Normal(0) or Tiny(1). At the tiny configuration, size of the file object FIL is reduced _MAX_SS bytes. Instead of private data buffer eliminated from the file object, common sector buffer in the file system object FATFS is used for the file data transfer.

          + +

          _FS_NORTC

          +

          Use RTC(0) or Do not use RTC(1). This option controls timestamp feature. If the system does not have an RTC function or valid timestamp is not needed, set _FS_NORTC to 1 to disable the timestamp feature. Any object modified by FatFs will have a fixed timestamp value defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR. To use the timestamp feature, set _FS_NORTC to 0 and add get_fattime function to the project to get the current time form RTC. This option has no effect at read-only configuration.

          + +

          _NORTC_MON, _NORTC_MDAY, _NORTC_YEAR

          +

          This set of options defines default timestamp to be used at no RTC systems. This option has no effect at read-only configuration or _FS_NORTC == 0.

          + +

          _FS_LOCK

          +

          This option switches file lock feature to control duplicated file open and illegal operations to open objects. Note that the file lock feature is independent of re-entrancy. This option must be 0 at read-only configuration.

          + + + + +
          ValueDescription
          0Disable file lock feature. To avoid volume corruption, application program should avoid illegal open, remove and rename to the open objects.
          >0Enable file lock feature. The value defines how many files/sub-directories can be opened simultaneously under file lock control. Illigal operations to the open object will be rejected with FR_LOCKED.
          + +

          _FS_REENTRANT

          +

          Disable(0) or Enable(1). This option switches the re-entrancy (thread safe) of the FatFs module itself. Note that file/directory access to the different volume is always re-entrant and it can work simultaneously regardless of this option but volume control functions, f_mount, f_mkfs and f_fdisk, are always not re-entrant. Only file/directory access to the same volume, in other words, exclusive use of each file system object, is under control of this feature. To enable this feature, also user provided synchronization handlers, ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj, must be added to the project. Samples are available in option/syscall.c.

          + +

          _FS_TIMEOUT

          +

          Number of time ticks to abort the file function with FR_TIMEOUT when wait time is too long. This option has no effect when _FS_REENTRANT == 0.

          + +

          _SYNC_t

          +

          This option defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, SemaphoreHandle_t and etc. A header file for O/S definitions needs to be included somewhere in the scope of ff.c. This option has no effect when _FS_REENTRANT == 0.

          + +

          _WORD_ACCESS

          +

          This is an only platform dependent option. It defines which access method is used to the word data on the FAT volume.

          + + + + +
          ValueDescription
          0Byte-by-byte access. Always compatible with all platforms.
          1Word access. Code size will be slightly reduced but do not choose this unless under both the following conditions.
          +* Unaligned memory access is always allowed to ALL instructions.
          +* Byte order on the memory is little-endian.
          +

          Following table shows an example of allowable settings of some type of processors.

          +
          +   ARM7TDMI   0   *2         ColdFire   0   *1         V850E      0   *2
          +   Cortex-M3  0   *3         Z80        0/1            V850ES     0/1
          +   Cortex-M0  0   *2         x86        0/1            TLCS-870   0/1
          +   AVR        0/1            RX600(LE)  0/1            TLCS-900   0/1
          +   AVR32      0   *1         RL78       0   *2         R32C       0   *2
          +   PIC18      0/1            SH-2       0   *1         M16C       0/1
          +   PIC24      0   *2         H8S        0   *1         MSP430     0   *2
          +   PIC32      0   *1         H8/300H    0   *1         8051       0/1
          +
          +   *1:Big-endian.
          +   *2:Unaligned memory access is not supported.
          +   *3:Some compilers generate LDM/STM for mem_cpy function.
          +
          + +
          + +

          Return

          + + diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/dinit.html b/firmware/chibios-portapack/ext/fatfs/doc/en/dinit.html index a85eecd3..d66a0a19 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/dinit.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/dinit.html @@ -32,13 +32,13 @@ DSTATUS disk_initialize (

          Return Values

          -

          This function returns the current drive status flags as the result. For details of the drive status, refer to the disk_status() function.

          +

          This function returns the current drive status flags as the result. For details of the drive status, refer to the disk_status function.

          Description

          This function initializes the storage device and put it ready to generic read/write. When the function succeeded, STA_NOINIT flag in the return value is cleared.

          -

          Application program MUST NOT call this function, or FAT structure on the volume can be broken. To re-initialize the file system, use f_mount() function instead. This function is called at volume mount process by FatFs module to manage the media change.

          +

          This function is under control of FatFs module. Application program MUST NOT call this function, or FAT structure on the volume can be broken. To re-initialize the file system, use f_mount function instead.

          Return

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/dioctl.html b/firmware/chibios-portapack/ext/fatfs/doc/en/dioctl.html index 8fe62eca..e05b80af 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/dioctl.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/dioctl.html @@ -57,11 +57,11 @@ DRESULT disk_ioctl ( - - + + - - + +
          Standard ioctl command used by FatFs
          CommandDescription
          CTRL_SYNCMake sure that the device has finished pending write process. If the disk I/O module has a write back cache, the dirty buffers must be written back to the media immediately. Nothing to do for this command if each write operation to the media is completed within the disk_write() function.
          GET_SECTOR_COUNTReturns number of available sectors on the drive into the DWORD variable pointed by buff. This command is used by only f_mkfs() and f_fdisk() function to determine the volume/partition size to be created. Required at _USE_MKFS == 1 or _MULTI_PARTITION == 1.
          CTRL_SYNCMake sure that the device has finished pending write process. If the disk I/O module has a write back cache, the dirty buffers must be written back to the media immediately. Nothing to do for this command if each write operation to the media is completed within the disk_write function.
          GET_SECTOR_COUNTReturns number of available sectors on the drive into the DWORD variable pointed by buff. This command is used by only f_mkfs and f_fdisk function to determine the volume/partition size to be created. Required at _USE_MKFS == 1 or _MULTI_PARTITION == 1.
          GET_SECTOR_SIZEReturns sector size of the media into the WORD variable pointed by buff. Valid return values of this command are 512, 1024, 2048 and 4096. This command is required only at variable sector size configuration, _MAX_SS > _MIN_SS. At fixed sector size configuration, _MAX_SS == _MIN_SS, this command is not used and the device must work at that sector size.
          GET_BLOCK_SIZEReturns erase block size of the flash memory media in unit of sector into the DWORD variable pointed by buff. The allowable value is from 1 to 32768 in power of 2. Return 1 if the erase block size is unknown or non flash memory media. This command is used by only f_mkfs() function and it attempts to align data area to the erase block boundary. Required at _USE_MKFS == 1.
          CTRL_TRIMInforms the device the data on the block of sectors that specified by DWORD array {<start sector>, <end sector>} pointed by buff is no longer needed and it may be erased. This is an identical command to Trim of ATA device. When this feature is not supported or not a flash memory device, nothing to do for this command. The FatFs does not check the result code and the file function is not affected even if the sector block was not erased well. This command is called on removing a cluster chain and f_mkfs() function. Required at _USE_TRIM == 1.
          GET_BLOCK_SIZEReturns erase block size of the flash memory media in unit of sector into the DWORD variable pointed by buff. The allowable value is from 1 to 32768 in power of 2. Return 1 if the erase block size is unknown or non flash memory media. This command is used by only f_mkfs function and it attempts to align data area to the erase block boundary. Required at _USE_MKFS == 1.
          CTRL_TRIMInforms the device the data on the block of sectors that specified by DWORD array {<start sector>, <end sector>} pointed by buff is no longer needed and it may be erased. This is an identical command to Trim of ATA device. When this feature is not supported or not a flash memory device, nothing to do for this command. The FatFs does not check the result code and the file function is not affected even if the sector block was not erased well. This command is called on removing a cluster chain and f_mkfs function. Required at _USE_TRIM == 1.

          FatFs never uses any device dependent command nor user defined command. Following table shows an example of non-standard commands usable for some applications.

          @@ -70,7 +70,7 @@ DRESULT disk_ioctl ( CommandDescription CTRL_FORMATCreate a physical format on the media. If buff is not null, it is pointer to the call-back function for progress notification. CTRL_POWER_IDLEPut the device idle state. STA_NOINIT in status flag may not be set if the device goes active state by generic read/write function. -CTRL_POWER_OFFPut the device off state. Shut-down the power to the device and deinitialize the device interface if needed. STA_NOINIT in status flag must be set. The device goes active state by disk_initialize() function. +CTRL_POWER_OFFPut the device off state. Shut-down the power to the device and deinitialize the device interface if needed. STA_NOINIT in status flag must be set. The device goes active state by disk_initialize function. CTRL_LOCKLock media eject mechanism. CTRL_UNLOCKUnlock media eject mechanism. CTRL_EJECTEject media cartridge. STA_NOINIT and STA_NODISK in status flag are set after the function succeeded. diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/dread.html b/firmware/chibios-portapack/ext/fatfs/doc/en/dread.html index 2e7c279c..ba31d034 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/dread.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/dread.html @@ -34,7 +34,7 @@ DRESULT disk_read (
          sector
          Start sector number in 32-bit LBA.
          count
          -
          Number of sectors to read in range of from 1 to 128..
          +
          Number of sectors to read. FatFs specifies the value in range of from 1 to 128.
          @@ -56,12 +56,12 @@ DRESULT disk_read (

          Description

          -

          The data read/write operation to the storage devices is done in unit of sector. FatFs supports the sector size in range of from 512 to 4096 bytes. When FatFs is configured to fixed sector size (_MIN_SS == MAX_SS, this will be the most case), the read/write function must work at that sector size. If variable sector size is selected (_MIN_SS < MAX_SS), FatFs inquires the sector size with disk_ioctl() after initialization. +

          The data read/write operation to the storage devices is done in unit of sector. FatFs supports the sector size in range of from 512 to 4096 bytes. When FatFs is configured to fixed sector size (_MIN_SS == MAX_SS, this will be the most case), the read/write function must work at that sector size. When FatFs is configured to variable sector size (_MIN_SS < MAX_SS), sector size is inquired with disk_ioctl function following disk_initialize function.

          The memory address specified by buff is not that always aligned to word boundary because the argument is defined as BYTE*. The misaligned read/write request can occure at direct transfer. If the bus architecture, especially DMA controller, does not allow misaligned memory access, it should be solved in this function. There are some workarounds described below to avoid this issue.

          • Convert word transfer to byte transfer in this function if needed. - Recommended.
          • -
          • For f_read(), avoid long read request that includes a whole of sector. - Direct transfer will never occure.
          • -
          • For f_read(fp, buff, btr, &br), make sure that (((UINT)buff & 3) == (f_tell(fp) & 3)) is true. - Word aligned direct transfer is guaranteed.
          • +
          • At the any f_read calls, avoid long read request that includes a whole of sector. - Direct transfer will never occure.
          • +
          • At the f_read(fp, data, btr, &br) call, make sure that (((UINT)data & 3) == (f_tell(fp) & 3)) is true. - Word alignment of buff is guaranteed.

          Generally, a multiple sector transfer request must not be split into single sector transactions to the storage device, or you will not get good read throughput.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/dstat.html b/firmware/chibios-portapack/ext/fatfs/doc/en/dstat.html index c8204cc3..cadcd41d 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/dstat.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/dstat.html @@ -35,7 +35,7 @@ DSTATUS disk_status (

          The current drive status is returned in combination of status flags described below. FatFs refers only STA_NOINIT and STA_PROTECT.

          STA_NOINIT
          -
          Indicates that the device is not initialized. This flag is set on system reset, media removal or failure of disk_initialize() function. It is cleared on disk_initialize() function succeeded. Media change that occurs asynchronously must be captured and reflect it to the status flags, or auto-mount feature will not work correctly. If the system does not support media change detect feature, application program needs to force de-initialize the file system object with f_mount() function after the media change.
          +
          Indicates that the device is not initialized. This flag is set on system reset, media removal or failure of disk_initialize function. It is cleared on disk_initialize function succeeded. Media change that occurs asynchronously must be captured and reflect it to the status flags, or auto-mount feature will not work correctly. If the system does not support media change detect feature, application program needs to force de-initialize the file system object with f_mount function after the media change.
          STA_NODISK
          Indicates that no medium in the drive. This is always cleared on fixed disk drive. Note that FatFs does not refer this flag.
          STA_PROTECT
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/dwrite.html b/firmware/chibios-portapack/ext/fatfs/doc/en/dwrite.html index fd4bf488..b29b6f34 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/dwrite.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/dwrite.html @@ -34,7 +34,7 @@ DRESULT disk_write (
          sector
          Start sector number in 32-bit LBA.
          count
          -
          Number of sectors to write in range of from 1 to 128.
          +
          Number of sectors to write. FatFs specifies the value in range of from 1 to 128.
          @@ -58,9 +58,9 @@ DRESULT disk_write (

          Description

          -

          The specified memory address is not that always aligned to word boundary because the type of pointer is defined as BYTE*. For more information, refer to the description of disk_read() function.

          +

          The specified memory address is not that always aligned to word boundary because the type of pointer is defined as BYTE*. For more information, refer to the description of disk_read function.

          Generally, a multiple sector transfer request must not be split into single sector transactions to the storage device, or you will never get good write throughput.

          -

          FatFs expects delayed write feature of the disk functions. The write operation to the media need not to be completed due to write operation is in progress or only stored it into the cache buffer when return from this function. But data on the buff is invalid after return from this function. The write completion request is done by CTRL_SYNC command of disk_ioctl() function. Therefore, if delayed write feature is implemented, the write throughput may be improved.

          +

          FatFs expects delayed write feature of the disk control layer. The write operation to the media need not to be completed due to write operation is in progress or data is stored into the write-back cache when return from this function. But write data on the buff is invalid after return from this function. The write completion request is done by CTRL_SYNC command of disk_ioctl function. Therefore, if a delayed write feature is implemented, the write throughput will be improved.

          Application program MUST NOT call this function, or FAT structure on the volume can be collapsed.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/eof.html b/firmware/chibios-portapack/ext/fatfs/doc/en/eof.html index 337697b7..40944c3c 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/eof.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/eof.html @@ -33,13 +33,13 @@ int f_eof (

          Return Values

          -

          The f_eof() function returns a non-zero value if the read/write pointer has reached end of the file; otherwise it returns a zero.

          +

          The f_eof function returns a non-zero value if the read/write pointer has reached end of the file; otherwise it returns a zero.

          Description

          -

          In this revision, this function is implemented as a macro.

          +

          In this revision, this function is implemented as a macro. It has not any validation and mutual exclusion.

           #define f_eof(fp) ((int)((fp)->fptr == (fp)->fsize))
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/error.html b/firmware/chibios-portapack/ext/fatfs/doc/en/error.html index a14deb1a..b8ceef5e 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/error.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/error.html @@ -39,7 +39,7 @@ int f_error (

          Description

          -

          In this revision, this function is implemented as a macro.

          +

          In this revision, this function is implemented as a macro. It has not any validation and mutual exclusion.

           #define f_error(fp) ((fp)->flag)
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/fattime.html b/firmware/chibios-portapack/ext/fatfs/doc/en/fattime.html index d8c245ec..e4ff768b 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/fattime.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/fattime.html @@ -22,7 +22,7 @@ DWORD get_fattime (void);

          Return Value

          -

          Currnet time is returned with packed into a DWORD value. The bit field is as follows:

          +

          Currnet local time is returned with packed into a DWORD value. The bit field is as follows:

          bit31:25
          Year origin from the 1980 (0..127)
          @@ -42,13 +42,13 @@ DWORD get_fattime (void);

          Description

          -

          The get_fattime() function shall return any valid time even if the system does not support a real time clock. If a zero is returned, the file will not have a valid timestamp.

          +

          The get_fattime function shall return any valid time even if the system does not support a real time clock. If a zero is returned, the file will not have a valid timestamp.

          QuickInfo

          -

          This function is not needed when _FS_READONLY == 1.

          +

          This function is not needed when _FS_READONLY == 1 or _FS_NORTC == 1.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/fdisk.html b/firmware/chibios-portapack/ext/fatfs/doc/en/fdisk.html index ad4e4fd6..828bbe55 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/fdisk.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/fdisk.html @@ -48,7 +48,7 @@ FRESULT f_fdisk (

          Description

          -

          The f_fdisk() function creates a partition table into the MBR of the physical drive. The partitioning rule is in generic FDISK format, so that it can create upto four primary partitions. Logical volumes in the extended partition is not supported. The part[] with four items specifies how to divide the physical drive. The first item specifies the size of first primary partition and fourth item specifies the fourth primary partition. If the value is less than or equal to 100, it specifies percentage of the partition in the entire disk space. If it is larger than 100, it specifies the partition size in unit of sector.

          +

          The f_fdisk function creates a partition table into the MBR of the physical drive. The partitioning rule is in generic FDISK format, so that it can create upto four primary partitions. Logical volumes in the extended partition is not supported. The part[] with four items specifies how to divide the physical drive. The first item specifies the size of first primary partition and fourth item specifies the fourth primary partition. If the value is less than or equal to 100, it specifies percentage of the partition in the entire disk space. If it is larger than 100, it specifies the partition size in unit of sector.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/filename.html b/firmware/chibios-portapack/ext/fatfs/doc/en/filename.html index 49dcc2d4..1faafdf9 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/filename.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/filename.html @@ -12,16 +12,16 @@

          Path Names

          -
          +

          Format of the path names

          The format of path name on the FatFs module is similer to the filename specs of DOS/Windos as follows:

          "[drive:][/]directory/file"
          -

          The FatFs module supports long file name (LFN) and 8.3 format file name (SFN). The LFN can be used when LFN feature is enabled (_USE_LFN > 0). The sub directories are separated with a \ or / in the same way as DOS/Windows API. Duplicated separators are skipped and ignored. Only a difference is that the logical drive is specified in a numeral with a colon. When drive number is omitted, the drive number is assumed as default drive (drive 0 or current drive).

          +

          The FatFs module supports long file name (LFN) and 8.3 format file name (SFN). The LFN can be used when LFN feature is enabled (_USE_LFN > 0). The sub directories are separated with a \ or / in the same way as DOS/Windows API. Duplicated separators are skipped and ignored. Only a difference is that the logical drive is specified in a numeral with a colon. When drive number is omitted, the drive number is assumed as default drive (drive 0 or current drive).

          Control characters ('\0' to '\x1F') are recognized as end of the path name. Leading/embedded spaces in the path name are valid as a part of the name at LFN configuration but the space is recognized as end of the path name at non-LFN configuration. Trailing spaces and dots are ignored at both configurations.

          -

          In default configuration (_FS_RPATH == 0), it does not have a concept of current directory like OS oriented file system. All objects on the volume are always specified in full path name that follows from the root directory. Dot directory names are not allowed. Heading separator is ignored and it can be exist or omitted. The default drive is fixed to drive 0.

          -

          When relative path feature is enabled (_FS_RPATH == 1), specified path is followed from the root directory if a heading separator is exist. If not, it is followed from the current directory of the drive set by f_chdir function. Dot names are also allowed for the path name. The default drive is the current drive set by f_chdrive function.

          +

          In default configuration (_FS_RPATH >= 0), it does not have a concept of current directory like OS oriented file system. All objects on the volume are always specified in full path name that follows from the root directory. Dot directory names (".", "..") are not allowed. Heading separator is ignored and it can be exist or omitted. The default drive is fixed to drive 0.

          +

          When relative path feature is enabled (_FS_RPATH >= 1), specified path is followed from the root directory if a heading separator is exist. If not, it is followed from the current directory of the drive set by f_chdir function. Dot names are also allowed for the path names. The default drive is the current drive set by f_chdrive function.

          - + @@ -35,13 +35,19 @@
          Path name_FS_RPATH == 0_FS_RPATH == 1
          Path name_FS_RPATH == 0_FS_RPATH >= 1
          file.txtA file in the root directory of the drive 0A file in the current directory of the current drive
          /file.txtA file in the root directory of the drive 0A file in the root directory of the current drive
          The root directory of the drive 0The current directory of the current drive
          dir1/..Invalid nameThe current directory
          /..Invalid nameThe root directory (sticks the top level)
          -

          When option _STR_VOLUME_ID is specified, also pre-defined strings can be used as drive identifier in the path name instead of a numeral. e.g. "sd:file1.txt" or "ram:swapfile.dat".

          +

          When option _STR_VOLUME_ID is specified, also pre-defined strings can be used as drive identifier in the path name instead of a numeral. e.g. "sd:file1.txt" or "ram:swapfile.dat".

          -


          -
          +
          +

          Legal Characters and Case Sensitivity

          +

          On the FAT file system, legal characters for file name are, 0-9 A-Z ! # $ % & ' ( ) - @ ^ _ ` { } ~ and extended characters (\x80-\xFF). Under LFN supported system, also white space and + , ; = [ ] are legal for the file name and the white spaces and periods can be placed anywhere in the name except for end of the name string.

          +

          FAT file system is case-insensitive to the object names on the volume. All object names are compared in case-insensitive. For example, these three names, file.txt, File.Txt and FILE.TXT, are identical. This is applied to also extended charactres. When an object is created on the FAT volume, upper converted name is recorded to the SFN entry, and the raw name is recorded to the LFN entry.

          +

          As for the DBCS language MS-DOS, it was case-sensitive to the extended characters. To follow this specification, FatFs works with case-sensitive to the extended characters at only non-LFN with DBCS configuration (DOS/DBCS specs). But at LFN configuration, FatFs works with case-insensitive to all characters (WindowsNT specs). This can cause a problem on compatibility with Windows system when an object with extended characters is created on the volume at non-LFN and DBCS configuration; therfore the object names with DBCS extended characters should not be used on the FAT volume shared by those systems.

          +
          + +

          Unicode API

          -

          The path names are input/output in either ANSI/OEM code or Unicode depends on the configuration options. The type of arguments which specify the path names are defined as TCHAR. It is an alias of char by default. The code set used to the path name string is ANSI/OEM specifid by _CODE_PAGE. When _LFN_UNICODE is set to 1, the type of the TCHAR is switched to WCHAR to support Unicode (UTF-16 encoding). In this case, the LFN feature is fully supported and the Unicode specific characters, such as âœâ˜ªâœ¡â˜¸â˜­, can also be used for the path name. It also affects data types and encoding of the string I/O functions. To define literal strings, _T(s) and _TEXT(s) macro are available to select either ANSI/OEM or Unicode automatically. The code shown below is an example to define the literal strings.

          +

          The path names are input/output in either ANSI/OEM code or Unicode depends on the configuration options. The type of arguments which specify the path names are defined as TCHAR. It is an alias of char by default. The code set used to the path name string is ANSI/OEM specifid by _CODE_PAGE. When _LFN_UNICODE is set to 1, the type of the TCHAR is switched to WCHAR to support Unicode (UTF-16 encoding). In this case, the LFN feature is fully supported and the Unicode specific characters, such as âœâ˜ªâœ¡â˜¸â˜­, can also be used for the path name. It also affects data types and encoding of the string I/O functions. To define literal strings, _T(s) and _TEXT(s) macro are available to select either ANSI/OEM or Unicode automatically. The code shown below is an example to define the literal strings.

            f_open(fp, "filename.txt", FA_READ);      /* ANSI/OEM string */
            f_open(fp, L"filename.txt", FA_READ);     /* Unicode string */
          @@ -49,11 +55,10 @@
           
          -


          -
          +

          Volume Management

          -

          The FatFs module needs dynamic work area called file system object for each volume (logical drive). It is registered to the FatFs module by f_mount() function. By default, each logical drive is bound to the physical drive with the same drive number and an FAT volume on the drive is serched by auto detect feature. It loads boot sectors and checks it if it is an FAT boot sector in order of sector 0 as SFD format, 1st partition, 2nd partition, 3rd partition and 4th partition as FDISK format.

          -

          When _MULTI_PARTITION == 1 is specified by configuration option, each individual logical drive is bound to the partition on the physical drive specified by volume management table. The volume management table must be defined by user to resolve relationship between logical drives and partitions. Following code is an example of a volume management table.

          +

          The FatFs module needs dynamic work area called file system object for each volume (logical drive). It is registered to the FatFs module by f_mount function. By default, each logical drive is bound to the physical drive with the same drive number and an FAT volume on the drive is serched by auto detect feature. It loads boot sectors and checks it if it is an FAT boot sector in order of sector 0 as SFD format, 1st partition, 2nd partition, 3rd partition and 4th partition as FDISK format.

          +

          When _MULTI_PARTITION == 1 is specified by configuration option, each individual logical drive is bound to the partition on the physical drive specified by volume management table. The volume management table must be defined by user to resolve the relationship between logical drives and partitions. Following code is an example of a volume management table.

           Example: Logical drive 0-2 are tied to three pri-partitions on the physical drive 0 (fixed disk)
                    Logical drive 3 is tied to an FAT volume on the physical drive 1 (removable disk)
          @@ -66,7 +71,7 @@ PARTITION VolToPart[] = {
           };
           
          relationship between logical drive and physical drive
          -

          There are some considerations on using _MULTI_PARTITION configuration.

          +

          There are some considerations on using multi-partition configuration.

          • The physical drive that has two or more mounted partitions must be non-removable. Media change while a system operation is prohibited.
          • Only four primary partitions can be specified. Extended partition is not supported.
          • @@ -74,5 +79,6 @@ PARTITION VolToPart[] = {
          +

          Return

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/findfirst.html b/firmware/chibios-portapack/ext/fatfs/doc/en/findfirst.html new file mode 100644 index 00000000..66130386 --- /dev/null +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/findfirst.html @@ -0,0 +1,119 @@ + + + + + + + + +FatFs - f_findfirst + + + + +
          +

          f_findfirst

          +

          The f_findfirst function searches a directroy for an item.

          +
          +FRESULT f_findfirst (
          +  DIR* dp,              /* [OUT] Poninter to the directory object */
          +  FILINFO* fno,         /* [OUT] Pointer to the file information structure */
          +  const TCHAR* path,    /* [IN] Pointer to the directory name to be opened */
          +  const TCHAR* pattern  /* [IN] Pointer to the matching pattern string */
          +);
          +
          +
          + +
          +

          Parameters

          +
          +
          dp
          +
          Pointer to the blank directory object.
          +
          fno
          +
          Pointer to the file information structure to store the information about the found item.
          +
          path
          +
          Pointer to the null-terminated string that specifies the directory name to be opened.
          +
          pattern
          +
          Pointer to the null-terminated string that specifies the name matching pattern to be searched for. It is referred by also subsequent f_findnext function, so that the string must be valid while the successive function calls.
          +
          +
          + + + + + +
          +

          Description

          +

          After the directory specified by path could be opened, it starts to search the directory for the item with a name specified by pattern. If found, the information about the object is stored into the file information structure. For more information about file information structure, refer to f_readdir function.

          +

          The matching pattern can contain wildcard characters (? and *). A ? matches an any character and an * matches an any string in length of zero or longer. At LFN configuration, both names of the item, SFN and LFN (if exist), are tested. In this revision, there are some differences listed below between FatFs and standard systems in matching condition.

          +
            +
          • "*.*" never matches any name without extension. (It matches all names at the standard systems)
          • +
          • Any pattern terminated with a period never matches any name. (It matches the names without extensiton at the standard systems)
          • +
          • DBCS extended characters are compared in case-sensitive at LFN with non-Unicode configuration.
          • +
          +
          + + +
          +

          QuickInfo

          +

          This is a wrapper function of f_opendir and f_readdir function. Available when _USE_FIND == 1 and _FS_MINIMIZE <= 1.

          +
          + + +
          +

          Examples

          +
          +/* Search a directory for objects and display it */
          +
          +void find_image (void)
          +{
          +    FRESULT fr;     /* Return value */
          +    DIR dj;         /* Directory search object */
          +    FILINFO fno;    /* File information */
          +#if _USE_LFN
          +    char lfn[_MAX_LFN + 1];
          +    fno.lfname = lfn;
          +    fno.lfsize = _MAX_LFN + 1;
          +#endif
          +
          +    fr = f_findfirst(&dj, &fno, "", "dsc*.jpg");  /* Start to search for JPEG files with the name started by "dsc" */
          +
          +    while (fr == FR_OK && fno.fname[0]) {         /* Repeat while an item is found */
          +#if _USE_LFN
          +        printf("%-12s  %s\n", fno.fname, fno.lfname);/* Display the item name */
          +#else
          +        printf("%s\n", fno.fname);
          +#endif
          +        fr = f_findnext(&dj, &fno);               /* Search for next item */
          +    }
          +    f_closedir(&dj);
          +}
          +
          +
          + + +
          +

          See Also

          +

          f_findnext, f_closedir, DIR, FILINFO

          +
          + +

          Return

          + + diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/findnext.html b/firmware/chibios-portapack/ext/fatfs/doc/en/findnext.html new file mode 100644 index 00000000..c8dd3f5d --- /dev/null +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/findnext.html @@ -0,0 +1,69 @@ + + + + + + + + +FatFs - f_findnext + + + + +
          +

          f_findnext

          +

          The f_findnext function searches for a next matched object

          +
          +FRESULT f_findnext (
          +  DIR* dp,              /* [IN] Poninter to the directory object */
          +  FILINFO* fno          /* [OUT] Pointer to the file information structure */
          +);
          +
          +
          + +
          +

          Parameters

          +
          +
          dp
          +
          Pointer to the valid directory object created by f_findfirst function.
          +
          fno
          +
          Pointer to the file information structure to store the information about the found directory item.
          +
          +
          + + + + + +
          +

          Description

          +

          It continues the search from a previous call to the f_findfirst or f_findnext function. If found, the information about the object is stored into the file information structure. If no item to be read, a null string will be returned into fno->fname[].

          +
          + + +
          +

          QuickInfo

          +

          This is a wrapper function of f_readdir function. Available when _USE_FIND == 1 and _FS_MINIMIZE <= 1.

          +
          + + + + +

          Return

          + + diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/forward.html b/firmware/chibios-portapack/ext/fatfs/doc/en/forward.html index 714c48d1..7581140c 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/forward.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/forward.html @@ -45,7 +45,6 @@ FRESULT f_forward ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT

          @@ -54,7 +53,7 @@ FRESULT f_forward (

          Description

          -

          The f_forward() function reads the data from the file and forward it to the outgoing stream without data buffer. This is suitable for small memory system because it does not require any data buffer at application module. The file pointer of the file object increases in number of bytes forwarded. In case of *bf is less than btf without error, it means the requested bytes could not be transferred due to end of file or stream goes busy during data transfer.

          +

          The f_forward function reads the data from the file and forward it to the outgoing stream without data buffer. This is suitable for small memory system because it does not require any data buffer at application module. The file pointer of the file object increases in number of bytes forwarded. In case of *bf is less than btf without error, it means the requested bytes could not be transferred due to end of file or stream goes busy during data transfer.

          @@ -113,7 +112,7 @@ FRESULT play_file ( if (rc) return rc; /* Repeat until the file pointer reaches end of the file */ - while (rc == FR_OK && fil.fptr < fil.fsize) { + while (rc == FR_OK && !f_eof(&fil)) { /* any other processes... */ diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/getcwd.html b/firmware/chibios-portapack/ext/fatfs/doc/en/getcwd.html index 045cce47..cee958a6 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/getcwd.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/getcwd.html @@ -13,7 +13,7 @@

          f_getcwd

          -

          The f_getcwd function retrieves the current directory.

          +

          The f_getcwd function retrieves the current directory and current drive.

           FRESULT f_getcwd (
             TCHAR* buff, /* [OUT] Buffer to return path name */
          @@ -50,7 +50,7 @@ FRESULT f_getcwd (
           
           

          Description

          -

          The f_getcwd() function retrieves full path name of the current directory of the current drive. When _VOLUMES is larger than 1, a logical drive number is added to top of the path name.

          +

          The f_getcwd function retrieves full path name of the current directory of the current drive. When _VOLUMES is larger than 1, a logical drive number is added to top of the path name.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/getfree.html b/firmware/chibios-portapack/ext/fatfs/doc/en/getfree.html index 5a689751..1cfc09a1 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/getfree.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/getfree.html @@ -27,7 +27,7 @@ FRESULT f_getfree (

          Parameters

          path
          -
          Pinter to the null-terminated string that specifies the logical drive. A null-string means the default drive.
          +
          Pointer to the null-terminated string that specifies the logical drive. A null-string means the default drive.
          nclst
          Pointer to the DWORD variable to store number of free clusters.
          fatfs
          @@ -53,7 +53,7 @@ FRESULT f_getfree (

          Descriptions

          -

          The f_getfree() function gets number of free clusters on the volume. The member csize in the file system object indicates number of sectors per cluster, so that the free space in unit of sector can be calcurated with this information. When FSINFO structure on the FAT32 volume is not in sync, this function can return an incorrect free cluster count. To avoid this problem, FatFs can be forced full FAT scan by _FS_NOFSINFO option.

          +

          The f_getfree function gets number of free clusters on the volume. The member csize in the file system object indicates number of sectors per cluster, so that the free space in unit of sector can be calcurated with this information. When FSINFO structure on the FAT32 volume is not in sync, this function can return an incorrect free cluster count. To avoid this problem, FatFs can be forced full FAT scan by _FS_NOFSINFO option.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/gets.html b/firmware/chibios-portapack/ext/fatfs/doc/en/gets.html index c8439523..8059d351 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/gets.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/gets.html @@ -44,14 +44,14 @@ TCHAR* f_gets (

          Description

          -

          The f_gets() function is a wrapper function of f_read() function. The read operation continues until a '\n' is stored, reached end of the file or the buffer is filled with len - 1 characters. The read string is terminated with a '\0'. When no character to read or any error occured during read operation, it returns a null pointer. The status of EOF and error can be examined with f_eof() and f_error() macros.

          -

          When FatFs is configured to Unicode API (_LFN_UNICODE == 1), data types on the srting fuctions, f_putc(), f_puts(), f_printf() and f_gets(), is also switched to Unicode. The character encoding on the file to be read/written via those functions is selected by _STRF_ENCODE option.

          +

          The read operation continues until a '\n' is stored, reached end of the file or the buffer is filled with len - 1 characters. The read string is terminated with a '\0'. When no character to read or any error occured during read operation, it returns a null pointer. The status of EOF and error can be examined with f_eof and f_error function.

          +

          When FatFs is configured to Unicode API (_LFN_UNICODE == 1), data types on the srting fuctions, f_putc, f_puts, f_printf and f_gets, is also switched to Unicode. The character encoding on the file to be read/written via those functions is selected by _STRF_ENCODE option.

          QuickInfo

          -

          Available when _USE_STRFUNC is 1 or 2. When it is set to 2, '\r's contained in the file are stripped out.

          +

          This is a wrapper function of f_read function. Available when _USE_STRFUNC is 1 or 2. When it is set to 2, '\r's contained in the file are stripped out.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/lseek.html b/firmware/chibios-portapack/ext/fatfs/doc/en/lseek.html index 0f22cf91..e684a380 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/lseek.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/lseek.html @@ -40,7 +40,6 @@ FRESULT f_lseek ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT

          @@ -49,19 +48,19 @@ FRESULT f_lseek (

          Description

          -

          The f_lseek() function moves the file read/write pointer of an open file. The offset can be specified in only origin from top of the file. When an offset beyond the file size is specified at write mode, the file size is expanded to the specified offset. The file data in the expanded area is undefined because no data is written to the file. This is suitable to pre-allocate a cluster chain quickly, for fast write operation. After the f_lseek() function succeeded, the current read/write pointer should be checked in order to make sure the read/write pointer has been moved correctry. In case of the current read/write pointer is not the expected value, either of followings has been occured.

          +

          The f_lseek function moves the file read/write pointer of an open file. The offset can be specified in only origin from top of the file. When an offset beyond the file size is specified at write mode, the file size is expanded to the specified offset. The file data in the expanded area is undefined because no data is written to the file. This is suitable to pre-allocate a cluster chain quickly, for fast write operation. After the f_lseek function succeeded, the current read/write pointer should be checked in order to make sure the read/write pointer has been moved correctry. In case of the current read/write pointer is not the expected value, either of followings has been occured.

          • End of file. The specified ofs was clipped at end of the file because the file has been opened in read-only mode.
          • Disk full. There is insufficient free space on the volume to expand the file.
          -

          Fast seek feature is enabled when _USE_FASTSEEK is set to 1 and the member cltbl in the file object is not NULL. This feature enables fast backward/long seek operations without FAT access by using CLMT (cluster link map table). The fast seek feature is also applied to f_read()/f_write() function, however, the file size cannot be expanded by f_write()/f_lseek() function.

          -

          The CLMT must be created in the user defined DWORD array prior to use the fast seek feature. To create the CLMT, set address of the DWORD array to the member cltbl in the file object, set the array size in unit of items into the first item and call the f_lseek() function with ofs = CREATE_LINKMAP. After the function succeeded and CLMT is created, no FAT access is occured at subsequent f_read()/f_write()/f_lseek() function to the file. If the function failed with FR_NOT_ENOUGH_CORE, the given array size is insufficient for the file and number of items required is returned into the first item of the array. The required array size is (number of fragments + 1) * 2 items. For example, when the file is fragmented in 5, 12 items will be required for the CLMT.

          +

          The fast seek feature enables fast backward/long seek operations without FAT access by using an on-memory CLMT (cluster link map table). It is applied to f_read and f_write function as well, however, the file size cannot be expanded by f_write, f_lseek function while the file is in fast seek mode.

          +

          The fast seek feature is enabled when the member cltbl in the file object is not NULL. The CLMT must be created into the DWORD array prior to use the fast seek feature. To create the CLMT, set address of the DWORD array to the member cltbl in the open file object, set the size of array in unit of items to the first item and call the f_lseek function with ofs = CREATE_LINKMAP. After the function succeeded and CLMT is created, no FAT access is occured in subsequent f_read, f_write, f_lseek function to the file. The number of items used or required is returned into the first item of the array. The number of items to be used is (number of the file fragments + 1) * 2. For example, when the file is fragmented in 5, 12 items in the array will be used. If the function failed with FR_NOT_ENOUGH_CORE, the given array size is insufficient for the file.

          QuickInfo

          -

          Available when _FS_MINIMIZE <= 2.

          +

          Available when _FS_MINIMIZE <= 2. To use fast seek feature, _USE_FASTSEEK needs to be set 1.

          @@ -94,7 +93,7 @@ FRESULT f_lseek ( if (res || f_tell(fp) != PRE_SIZE) ... /* Check if the file has been expanded */ res = f_lseek(fp, DATA_START); /* Record data stream WITHOUT cluster allocation delay */ - ... /* DATA_START and write block size should be aligned to sector boundary */ + ... /* Write operation should be aligned to sector boundary to optimize the write throughput */ res = f_truncate(fp); /* Truncate unused area */ res = f_lseek(fp, 0); /* Put file header */ @@ -107,6 +106,8 @@ FRESULT f_lseek ( DWORD clmt[SZ_TBL]; /* Cluster link map table buffer */ + res = f_open(fp, fname, FA_READ | FA_WRITE); /* Open a file */ + res = f_lseek(fp, ofs1); /* This is normal seek (cltbl is nulled on file open) */ fp->cltbl = clmt; /* Enable fast seek feature (cltbl != NULL) */ diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/mkdir.html b/firmware/chibios-portapack/ext/fatfs/doc/en/mkdir.html index c2c1f4db..970627c9 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/mkdir.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/mkdir.html @@ -53,7 +53,7 @@ FRESULT f_mkdir (

          Description

          -

          This function creates a new directory.

          +

          This function creates a new directory. To remove a directory, use f_unlink function.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/mkfs.html b/firmware/chibios-portapack/ext/fatfs/doc/en/mkfs.html index 5f733fa2..1637a0e2 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/mkfs.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/mkfs.html @@ -13,7 +13,7 @@

          f_mkfs

          -

          The f_mkfs fucntion creates an FAT file system on the logical drive.

          +

          The f_mkfs fucntion creates an FAT volume on the logical drive.

           FRESULT f_mkfs (
             const TCHAR* path,  /* [IN] Logical drive number */
          @@ -27,7 +27,7 @@ FRESULT f_mkfs (
           

          Parameters

          path
          -
          Pinter to the null-terminated string that specifies the logical drive to be formatted. If there is no drive number, it means the default drive.
          +
          Pointer to the null-terminated string that specifies the logical drive to be formatted. If there is no drive number, it means the default drive.
          sfd
          Specifies partitioning rule (FDISK(0) or SFD(1)). This argument will be ignored on some case.
          au
          @@ -51,8 +51,8 @@ FRESULT f_mkfs (

          Description

          -

          The f_mkfs() function creates an FAT volume on the specified logical drive. When FDISK format is specified, a primary partition occupies entire space of the physical drive is created and then an FAT volume is created on the partition. When SFD format is specified, the FAT volume starts from the first sector of the physical drive.

          -

          If the logical drive is bound to the specific partition (1-4) by multiple partition feature (_MULTI_PARTITION), the FAT volume is created into the partition. In this case, the second argument sfd is ignored. The physical drive must have been partitioned with f_fdisk() function or any other partitioning tools prior to create the FAT volume with this function.

          +

          The f_mkfs function creates an FAT volume on the specified logical drive. When FDISK format is specified, a primary partition occupies entire space of the physical drive is created and then an FAT volume is created on the partition. When SFD format is specified, the FAT volume starts from the first sector of the physical drive.

          +

          If the logical drive is bound to the specific partition (1-4) by multiple partition feature (_MULTI_PARTITION), the FAT volume is created into the partition. In this case, the second argument sfd is ignored. The physical drive must have been partitioned with f_fdisk function or any other partitioning tools prior to create the FAT volume with this function.

          Note that there are two partitioning rules, FDISK and SFD. The FDISK partitioning is usually used for harddisk, MMC, SDC, CFC and U Disk. It can divide a physical drive into one or more partitions with a partition table on the MBR. However Windows does not support multiple partition on the removable disk. The SFD is non-partitioned method. The FAT volume starts from the first sector on the physical drive without partition table. It is usually used for floppy disk, Microdrive, optical disk and any type of super-floppy media.

          The FAT sub-type, FAT12/FAT16/FAT32, is determined by number of clusters on the volume and nothing else, according to the FAT specification issued by Microsoft. Thus which FAT sub-type is selected, is depends on the volume size and the specified cluster size. The cluster size affects read/write throughput and space usage efficiency. Larger cluster size increases the read/write throughput and decreases the space usage efficiency of the volume.

          In case of the number of clusters gets near the FAT sub-type boundaries, the function can fail with FR_MKFS_ABORTED.

          @@ -66,7 +66,7 @@ FRESULT f_mkfs (

          Example

          -/* Format the default drive */
          +/* Format default drive and create a file */
           int main (void)
           {
               FATFS fs;      /* File system object (volume work area) */
          @@ -75,7 +75,7 @@ int main (void)
               UINT bw;       /* Bytes written */
           
           
          -    /* Register work area */
          +    /* Register work area (do not care about error) */
               f_mount(&fs, "", 0);
           
               /* Create FAT volume with default cluster size */
          @@ -83,19 +83,18 @@ int main (void)
               if (res) ...
           
               /* Create a file as new */
          -    res = f_open(&fil, "hello.txt", FA_CREATE_NEW | FA_WRITE);
          +    res = f_open(&fil, "hello.txt", FA_CREATE_NEW | FA_WRITE);
               if (res) ...
           
               /* Write a message */
          -    f_write(&fil, "Hello, World!\r\n", 15, &bw);
          +    f_write(&fil, "Hello, World!\r\n", 15, &bw);
               if (bw != 15) ...
           
               /* Close the file */
          -    f_close(&fil);
          +    f_close(&fil);
           
               /* Unregister work area */
               f_mount(0, "", 0);
          -
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/mount.html b/firmware/chibios-portapack/ext/fatfs/doc/en/mount.html index 0edb73aa..5ab9a1f2 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/mount.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/mount.html @@ -27,11 +27,11 @@ FRESULT f_mount (

          Parameters

          fs
          -
          Pointer to the new file system object to be registered. Null pointer unregisters the registered file system object.
          +
          Pointer to the file system object to be registered and cleared. Null pointer unregisters the registered file system object.
          path
          -
          Pointer to the null-terminated string that specifies the logical drive. The string with no drive number means the default drive.
          +
          Pointer to the null-terminated string that specifies the logical drive. The string without drive number means the default drive.
          opt
          -
          Initialization option. 0: Do not mount now (to be mounted later), 1: Force mounted the volume to check if the FAT volume is available.
          +
          Initialization option. 0: Do not mount now (to be mounted later), 1: Force mounted the volume to check if the FAT volume is ready to work.
          @@ -49,21 +49,21 @@ FRESULT f_mount (

          Description

          -

          The f_mount() function registers/unregisters a file system object used for the logical drive to the FatFs module as follows:

          +

          The f_mount function registers/unregisters a file system object used for the logical drive to the FatFs module as follows:

          1. Determines the logical drive which specified by path.
          2. Clears and unregisters the regsitered work area of the drive.
          3. Clears and registers the new work area to the drive if fs is not NULL.
          4. Performs volume mount process to the drive if forced mount is specified.
          -

          The file system object is the work area needed for each logical drive. It must be given to the logical drive with this function prior to use any other file functions except for f_fdisk() function. To unregister a work area, specify a NULL to the fs, and then the work area can be discarded.

          -

          If forced mount is not specified, this function always succeeds regardless of the physical drive status due to delayed mount feature. It only clears (de-initializes) the given work area and registers its address to the internal table. No activity of the physical drive in this function. It can also be used to force de-initialized the registered work area of a logical drive. The volume mount processes, initialize the corresponding physical drive, find the FAT volume in it and initialize the work area, is performed in the subsequent file access functions when either or both of following condition is true.

          +

          The file system object is the work area needed for each logical drive. It must be given to the logical drive with this function prior to use any other file functions except for f_fdisk function to the logical drive. To unregister the work area, specify a NULL to the fs, and then the work area can be discarded.

          +

          If forced mounting is not specified, this function always succeeds regardless of the physical drive status due to delayed mount feature. It only clears (de-initializes) the given work area and registers its address to the internal table. No activity of the physical drive in this function. It can also be used to force de-initialized the registered work area of a logical drive. The volume mount processes, initialize the corresponding physical drive, find the FAT volume in it and initialize the work area, is performed in the subsequent file access functions when either or both of following condition is true.

            -
          • File system object is not initialized. It is cleared by f_mount().
          • +
          • File system object is not initialized. It is de-initialized by f_mount function.
          • Physical drive is not initialized. It is de-initialized by system reset or media removal.
          -

          If the function with forced mount failed, it means that the file system object has been registered successfully but the volume is currently not ready to use. Mount process will also be attempted in subsequent file access functions.

          -

          If implementation of the disk I/O layer lacks media change detection, application program needs to perform a f_mount() after each media change to force cleared the file system object.

          +

          If the function with forced mounting failed, it means that the file system object has been registered successfully but the volume is currently not ready to work. The volume mount process will also be attempted at subsequent file access functions.

          +

          If implementation of the disk I/O layer lacks media change detection, application program needs to perform a f_mount function after each media change to force cleared the file system object.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/open.html b/firmware/chibios-portapack/ext/fatfs/doc/en/open.html index d61a7a45..eaaa3235 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/open.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/open.html @@ -27,18 +27,18 @@ FRESULT f_open (

          Parameters

          fp
          -
          Pointer to the blank file object structure to be created.
          +
          Pointer to the blank file object structure.
          path
          -
          Pointer to a null-terminated string that specifies the file name to open or create.
          +
          Pointer to the null-terminated string that specifies the file name to open or create.
          mode
          Mode flags that specifies the type of access and open method for the file. It is specified by a combination of following flags.
          - + - +
          ValueDescription
          FA_READSpecifies read access to the object. Data can be read from the file. Combine with FA_WRITE for read-write access.
          FA_READSpecifies read access to the object. Data can be read from the file.
          FA_WRITESpecifies write access to the object. Data can be written to the file. Combine with FA_READ for read-write access.
          FA_OPEN_EXISTINGOpens the file. The function fails if the file is not existing. (Default)
          FA_OPEN_ALWAYSOpens the file if it is existing. If not, a new file is created.
          -To append data to the file, use f_lseek() function after file open in this method.
          FA_OPEN_ALWAYSOpens the file if it is existing. If not, a new file will be created.
          +To append data to the file, use f_lseek function after the file open in this method.
          FA_CREATE_NEWCreates a new file. The function fails with FR_EXIST if the file is existing.
          FA_CREATE_ALWAYSCreates a new file. If the file is existing, it will be truncated and overwritten.
          @@ -74,9 +74,9 @@ To append data to the file, use f_lseek() func

          Description

          -

          After f_open() function succeeded, the file object is valid. The file object is used for subsequent read/write functions to identify the file. To close an open file, use f_close() function. If the file is modified and not closed properly, the file data will be collapsed.

          -

          If duplicated file open is needed, read here carefully. However duplicated open of a file with write mode flag is always prohibited.

          -

          Before using any file function, a work area (file system object) must be registered to the logical drive with f_mount() function. All API functions except for f_fdisk() function can work after this procedure.

          +

          Before using any file function, a work area (file system object) must be registered to the logical drive with f_mount function. All API functions except for f_fdisk function can work after this procedure.

          +

          After f_open function succeeded, the file object is valid. The file object is used for subsequent operations to the file to identify the file. Open file must be closed prior to power down, media removal or re-mount, or the file can be collapsed. To close an open file, use f_close function.

          +

          If duplicated file open is needed, read here carefully. However duplicated open of a file with any write mode flag is always prohibited.

          @@ -134,11 +134,11 @@ int main (void) f_mount(&fs[1], "1:", 0); /* Open source file on the drive 1 */ - fr = f_open(&fsrc, "1:file.bin", FA_OPEN_EXISTING | FA_READ); + fr = f_open(&fsrc, "1:file.bin", FA_READ); if (fr) return (int)fr; /* Create destination file on the drive 0 */ - fr = f_open(&fdst, "0:file.bin", FA_CREATE_ALWAYS | FA_WRITE); + fr = f_open(&fdst, "0:file.bin", FA_WRITE | FA_CREATE_ALWAYS); if (fr) return (int)fr; /* Copy source to destination */ diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/opendir.html b/firmware/chibios-portapack/ext/fatfs/doc/en/opendir.html index 2fd4e457..56e66b2e 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/opendir.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/opendir.html @@ -28,7 +28,7 @@ FRESULT f_opendir (
          dp
          Pointer to the blank directory object to create a new one.
          path
          -
          Pinter to the null-terminated string that specifies the directory name to be opened.
          +
          Pointer to the null-terminated string that specifies the directory name to be opened.
          @@ -55,7 +55,7 @@ FRESULT f_opendir (

          Description

          -

          The f_opendir() function opens an exsisting directory and creates a directory object for subsequent f_readdir() function.

          +

          The f_opendir function opens an exsisting directory and creates a directory object for subsequent f_readdir function.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/printf.html b/firmware/chibios-portapack/ext/fatfs/doc/en/printf.html index 96a84b81..7d917510 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/printf.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/printf.html @@ -45,7 +45,7 @@ int f_printf (

          Description

          -

          The f_printf() is a wrapper function of f_write(). The format control directive is a sub-set of standard library shown as follos:

          +

          The format control directive is a sub-set of standard library shown as follos:

          • Type: c C s S d D u U x X b B
          • Size: l L
          • @@ -56,8 +56,8 @@ int f_printf (

            QuickInfo

            -

            Available when _FS_READONLY == 0 and _USE_STRFUNC is 1 or 2. When it is set to 2, '\n's contained in the output are converted to '\r'+'\n'.

            -

            When FatFs is configured to Unicode API (_LFN_UNICODE == 1), data types on the srting fuctions, f_putc(), f_puts(), f_printf() and f_gets(), is also switched to Unicode. The character encoding on the file to be read/written via those functions is selected by _STRF_ENCODE option.

            +

            This is a wrapper function of f_write function. Available when _FS_READONLY == 0 and _USE_STRFUNC is 1 or 2. When it is set to 2, '\n's contained in the output are converted to '\r'+'\n'.

            +

            When FatFs is configured to Unicode API (_LFN_UNICODE == 1), data types on the srting fuctions, f_putc, f_puts, f_printf and f_gets function, is also switched to Unicode. The character encoding on the file to be read/written via those functions is selected by _STRF_ENCODE option.

            diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/putc.html b/firmware/chibios-portapack/ext/fatfs/doc/en/putc.html index 52db016b..9a97baba 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/putc.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/putc.html @@ -36,19 +36,13 @@ int f_putc (

            Return Values

            When the character was written successfuly, it returns number of characters written. When the function failed due to disk full or any error, an EOF (-1) will be returned.

            -

            When FatFs is configured to Unicode API (_LFN_UNICODE == 1), character encoding on the string fuctions, f_putc(), f_puts(), f_printf() and f_gets(), is also switched to Unicode. The character encoding on the file to be read/written via those functions is selected by _STRF_ENCODE option.

            -
            - - -
            -

            Description

            -

            The f_putc() function is a wrapper function of f_write() function.

            +

            When FatFs is configured to Unicode API (_LFN_UNICODE == 1), character encoding on the string fuctions, f_putc, f_puts, f_printf and f_gets function, is also switched to Unicode. The character encoding on the file to be read/written via those functions is selected by _STRF_ENCODE option.

            QuickInfo

            -

            Available when _FS_READONLY == 0 and _USE_STRFUNC is 1 or 2. When it is set to 2, a '\n' is converted to '\r'+'\n'.

            +

            This is a wrapper function of f_write function. Available when _FS_READONLY == 0 and _USE_STRFUNC is 1 or 2. When it is set to 2, a '\n' is converted to '\r'+'\n'.

            diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/puts.html b/firmware/chibios-portapack/ext/fatfs/doc/en/puts.html index 30b1dd35..b213e44c 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/puts.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/puts.html @@ -36,19 +36,13 @@ int f_puts (

            Return Value

            When the function succeeded, it returns number of characters written. When the write operation is aborted due to disk full or any error, an EOF (-1) will be returned.

            -

            When FatFs is configured to Unicode API (_LFN_UNICODE == 1), character encoding on the srting fuctions, f_putc(), f_puts(), f_printf() and f_gets(), is also switched to Unicode. The character encoding on the file to be read/written via those functions is selected by _STRF_ENCODE option.

            -
            - - -
            -

            Description

            -

            The f_puts() function is a wrapper function of f_write() function.

            +

            When FatFs is configured to Unicode API (_LFN_UNICODE == 1), character encoding on the srting fuctions, f_putc, f_puts, f_printf and f_gets function, is also switched to Unicode. The character encoding on the file to be read/written via those functions is selected by _STRF_ENCODE option.

            QuickInfo

            -

            Available when _FS_READONLY == 0 and _USE_STRFUNC is 1 or 2. When it is set to 2, '\n's contained in the string are converted to '\r'+'\n'.

            +

            This is a wrapper function of f_write function. Available when _FS_READONLY == 0 and _USE_STRFUNC is 1 or 2. When it is set to 2, '\n's contained in the string are converted to '\r'+'\n'.

            diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/rc.html b/firmware/chibios-portapack/ext/fatfs/doc/en/rc.html index 306671af..872083f7 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/rc.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/rc.html @@ -17,7 +17,7 @@
            FR_OK (0)
            The function succeeded.
            FR_DISK_ERR
            -
            An unrecoverable hard error occured in the lower layer, disk_read(), disk_write() or disk_ioctl() function.
            Note that if once this error occured at any operation to an open file, the file object is aborted and all operations to the file except for close will be rejected.
            +
            An unrecoverable hard error occured in the lower layer, disk_read, disk_write or disk_ioctl function.
            Note that if once this error occured at any operation to an open file, the file object is aborted and all operations to the file except for close will be rejected.
            FR_INT_ERR
            Assertion failed. An insanity is detected in the internal process. One of the following possibilities is suspected.
              @@ -27,7 +27,7 @@ Note that if once this error occured at any operation to an open file, the file object is aborted and all operations to the file except for close will be rejected.
            FR_NOT_READY
            -
            The disk drive cannot work due to incorrect medium removal or disk_initialize() function failed.
            +
            The storage device cannot work due to a failure of disk_initialize function due to no medium or any other reason.
            FR_NO_FILE
            Could not find the file.
            FR_NO_PATH
            @@ -49,39 +49,46 @@ Note that if once this error occured at any operation to an open file, the file
            FR_EXIST
            Name collision. Any object that has the same name is already existing.
            FR_INVALID_OBJECT
            -
            The file/directory object structure is invalid or a null pointer is given. All open objects of the logical drive are invalidated by the voulme mount process.
            +
            The file/directory object is invalid or a null pointer is given. There are some reasons as follows: +
              +
            • It has been closed, it is not opened or it can be collapsed.
            • +
            • It has been invalidated by a voulme mount process. All open objects of the volume are invalidated as well.
            • +
            • The corresponding physical drive is not ready due to a media removal.
            • +
            +
            FR_WRITE_PROTECTED
            Any write mode operation against the write-protected media.
            FR_INVALID_DRIVE
            -
            Invalid drive number is specified in the path name. A null pointer is given as the path name. (Related option: _VOLUMES)
            +
            Invalid drive number is specified in the path name. A null pointer is given as the path name. (Related option: _VOLUMES)
            FR_NOT_ENABLED
            -
            Work area for the logical drive has not been registered by f_mount() function.
            +
            Work area for the logical drive has not been registered by f_mount function.
            FR_NO_FILESYSTEM
            There is no valid FAT volume on the drive.
            FR_MKFS_ABORTED
            -
            The f_mkfs() function aborted before start in format due to a reason as follows: +
            The f_mkfs function aborted before start in format due to a reason as follows:
            • The disk/partition size is too small.
            • Not allowable cluster size for this disk. This can occure when number of clusters gets near the boundaries of FAT sub-types.
            • -
            • There is no partition related to the logical drive. (Related option: _MULTI_PARTITION)
            • +
            • There is no partition related to the logical drive. (Related option: _MULTI_PARTITION)
            FR_TIMEOUT
            -
            The function was canceled due to a timeout of thread-safe control. (Related option: _TIMEOUT)
            +
            The function was canceled due to a timeout of thread-safe control. (Related option: _TIMEOUT)
            FR_LOCKED
            -
            The operation to the object was rejected by file sharing control. (Related option: _FS_LOCK)
            +
            The operation to the object was rejected by file sharing control. (Related option: _FS_LOCK)
            FR_NOT_ENOUGH_CORE
            Not enough memory for the operation. There is one of the following reasons:
              -
            • Could not allocate a memory for LFN working buffer. (Related option: _USE_LFN)
            • +
            • Could not allocate a memory for LFN working buffer. (Related option: _USE_LFN)
            • Size of the given buffer is insufficient for the size required.
            FR_TOO_MANY_OPEN_FILES
            -
            Number of open objects has been reached maximum value and no more object can be opened. (Related option: _FS_LOCK)
            +
            Number of open objects has been reached maximum value and no more object can be opened. (Related option: _FS_LOCK)
            FR_INVALID_PARAMETER
            The given parameter is invalid or there is any inconsistent.
          +

          Return

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/read.html b/firmware/chibios-portapack/ext/fatfs/doc/en/read.html index de593f0e..8ddc0296 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/read.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/read.html @@ -45,7 +45,6 @@ FRESULT f_read ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/readdir.html b/firmware/chibios-portapack/ext/fatfs/doc/en/readdir.html index bf83ebe6..2cb12107 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/readdir.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/readdir.html @@ -26,9 +26,9 @@ FRESULT f_readdir (

          Parameters

          dp
          -
          Pointer to the open directory object.
          +
          Pointer to the directory object created by f_opendir function.
          fno
          -
          Pointer to the file information structure to store the read item.
          +
          Pointer to the file information structure to store the information about read item.
          @@ -39,7 +39,6 @@ FRESULT f_readdir ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT, FR_NOT_ENOUGH_CORE @@ -49,14 +48,13 @@ FRESULT f_readdir (

          Description

          -

          The f_readdir() function reads directory items, file and directory, in sequence. All items in the directory can be read by calling f_readdir() function repeatedly. When relative path feature is enabled (_FS_RPATH >= 1), dot entries ("." and "..") are not filtered out and they will appear in the read items. When all directory items have been read and no item to read, a null string is returned into the fname[] without any error. When a null pointer is given to the fno, the read index of the directory object is rewinded.

          -

          When LFN feature is enabled, lfname and lfsize in the file information structure must be initialized with valid value prior to use it. The lfname is a pointer to the LFN read buffer. The lfsize is size of the LFN read buffer in unit of TCHAR. If the LFN is not needed, set a null pointer to the lfname and the LFN is not returned. A null string will be returned into the LFN read buffer in case of following conditions.

          +

          The f_readdir function reads directory items, informations about file and directory, in sequence. All items in the directory can be read by calling f_readdir function repeatedly. When relative path feature is enabled (_FS_RPATH >= 1), dot entries ("." and "..") are not filtered out and they will appear in the read items. When all directory items have been read and no item to read, a null string is stored into the fno->fname[] without any error. When a null pointer is given to the fno, the read index of the directory object is rewinded.

          +

          When LFN feature is enabled, fno->lfname and fno->lfsize in the file information structure must be initialized with valid value prior to use it. The lfname points the LFN read buffer. The lfsize is size of the LFN read buffer in unit of TCHAR. If the LFN is not needed, set a null pointer to the lfname and the LFN is not returned. A null string will be returned into the LFN read buffer in case of following conditions.

            -
          • The directory item has no LFN information.
          • +
          • The directory item has no LFN information. In this case, lower case characters can be contained in the fname[].
          • Either the size of read buffer or LFN working buffer is insufficient for the LFN.
          • -
          • The LFN contains any Unicode character that cannot be converted to OEM code. (not the case at Unicode API cfg.)
          • +
          • The LFN contains any Unicode character that cannot be converted to OEM code. (Not the case at Unicode API configuration)
          -

          When the directory item has no LFN information, lower case characters can be contained in the fname[].

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/rename.html b/firmware/chibios-portapack/ext/fatfs/doc/en/rename.html index 2593e890..47cca44f 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/rename.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/rename.html @@ -26,9 +26,9 @@ FRESULT f_rename (

          Parameters

          old_name
          -
          Pointer to a null-terminated string that specifies an existing file or sub-directory to be renamed.
          +
          Pointer to a null-terminated string that specifies the existing file or sub-directory to be renamed.
          new_name
          -
          Pointer to a null-terminated string that specifies the new object name. The drive number specified in this string is ignored and one determined by old_name is used instead.
          +
          Pointer to a null-terminated string that specifies the new object name. Any drive number may be specified in this string but it is ignored and assumed as the same drive of the old_name.
          @@ -58,7 +58,7 @@ FRESULT f_rename (

          Description

          -

          Renames a file or sub-directory and can also move it to other directory within the same logical drive. Do not rename open objects or directry table can be broken.

          +

          Renames a file or sub-directory and can also move it to other directory in the same logical drive. The object to be renamed must not be an open object, or the FAT volume can be collapsed. Such the wrong operation can be rejected safely when file lock feature is enabled.

          @@ -71,11 +71,14 @@ FRESULT f_rename (

          Example

          -    /* Rename an object */
          +    /* Rename an object in the default drive */
               f_rename("oldname.txt", "newname.txt");
           
          -    /* Rename and move an object to other directory */
          -    f_rename("oldname.txt", "dir1/newname.txt");
          +    /* Rename an object in the drive 2 */
          +    f_rename("2:oldname.txt", "newname.txt");
          +
          +    /* Rename an object and move it to other directory */
          +    f_rename("log.txt", "old/log0001.txt");
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/sdir.html b/firmware/chibios-portapack/ext/fatfs/doc/en/sdir.html index 7eba5551..27b205f5 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/sdir.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/sdir.html @@ -13,7 +13,7 @@

          DIR

          -

          The DIR structure is used for the work area to read a directory by f_oepndir()/f_readdir() function. Application program must not modify any member in this structure.

          +

          The DIR structure is used for the work area to read a directory by f_oepndir, f_readdir, f_findfirst and f_findnext function. Application program must not modify any member in this structure, or any data on the FAT volume can be collapsed.

           typedef struct {
               FATFS*  fs;         /* Pointer to the owner file system object */
          @@ -31,6 +31,9 @@
               WCHAR*  lfn;        /* Pointer to the LFN buffer (in/out) */
               WORD    lfn_idx;    /* Index of the LFN entris (0xFFFF:No LFN) */
           #endif
          +#if _USE_FIND
          +    const TCHAR*  pat;  /* Ponter to the matching pattern */
          +#endif
           } DIR;
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/setlabel.html b/firmware/chibios-portapack/ext/fatfs/doc/en/setlabel.html index 91179fc2..e76a285d 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/setlabel.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/setlabel.html @@ -49,12 +49,13 @@ FRESULT f_setlabel (

          Description

          -

          When the string has a drive number, the volume label will be set to the volume specified by the drive number. If not, the label will be set to the default drive. If the given string is a null-string, the volume label on the volume will be removed. The format of the volume label is similar to the short file name but there are some differences shown below:

          +

          When the string has a drive number, the volume label will be set to the volume specified by the drive number. If not, the volume label will be set to the default drive. If length of the given volume label is zero, the volume label on the volume will be removed. The format of the volume label is similar to the short file name but there are some differences shown below:

            -
          • 11 bytes or less in length as local character code. LFN extention is not applied to the volume label.
          • +
          • 11 bytes or less in length as conversion into OEM code page. LFN feature is not applied to the volume label.
          • Cannot contain period.
          • -
          • Can contain spaces anywhere in the volume label. Trailing spaces are truncated off.
          • +
          • Can contain spaces anywhere in it. Trailing spaces are truncated off.
          +

          Remark: The standard system (Windows) has a problem on handling of the volume label with a heading \xE5. To avoid this problem, this function rejects such volume labels as invalid name.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/sfatfs.html b/firmware/chibios-portapack/ext/fatfs/doc/en/sfatfs.html index b420850e..b4c9b71f 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/sfatfs.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/sfatfs.html @@ -13,10 +13,10 @@

          FATFS

          -

          The FATFS structure (file system object) holds dynamic work area of individual logical drives. It is given by application program and registerd/unregisterd to the FatFs module with f_mount() function. Initialization is done on first API call after f_mount() function or media change. Application program must not modify any member in this structure.

          +

          The FATFS structure (file system object) holds dynamic work area of individual logical drives. It is given by application program and registerd/unregisterd to the FatFs module with f_mount function. Initialization is done on first API call after f_mount function or media change. Application program must not modify any member in this structure, or any data on the FAT volume can be collapsed.

           typedef struct {
          -    BYTE    fs_type;      /* FAT sub-type (0:Not mounted) */
          +    BYTE    fs_type;      /* FAT sub-type (0:Not mounted, FS_FAT12/FS_FAT16/FS_FAT32) */
               BYTE    drv;          /* Physical drive number */
               BYTE    csize;        /* Sectors per cluster (1,2,4,...,128) */
               BYTE    n_fats;       /* Number of FAT copies (1,2) */
          @@ -31,19 +31,19 @@
               _SYNC_t sobj;         /* Identifier of sync object */
           #endif
           #if !_FS_READONLY
          -    DWORD   last_clust;   /* FSINFO: Last allocated cluster */
          -    DWORD   free_clust;   /* FSINFO: Number of free clusters */
          +    DWORD   last_clust;   /* FSINFO: Last allocated cluster (0xFFFFFFFF if invalid) */
          +    DWORD   free_clust;   /* FSINFO: Number of free clusters (0xFFFFFFFF if invalid) */
           #endif
           #if _FS_RPATH
          -    DWORD   cdir;         /* Current directory start cluster (0:root) */
          +    DWORD   cdir;         /* Cluster number of current directory (0:root) */
           #endif
          -    DWORD   n_fatent;     /* Number of FAT entries (== Number of clusters + 2) */
          +    DWORD   n_fatent;     /* Number of FAT entries (Number of clusters + 2) */
               DWORD   fsize;        /* Sectors per FAT */
          -    DWORD   volbase;      /* Volume start sector */
          -    DWORD   fatbase;      /* FAT area start sector */
          -    DWORD   dirbase;      /* Root directory area start sector (FAT32: Cluster#) */
          -    DWORD   database;     /* Data area start sector */
          -    DWORD   winsect;      /* Current sector appearing in the win[] */
          +    DWORD   volbase;      /* Volume base LBA */
          +    DWORD   fatbase;      /* FAT base LBA */
          +    DWORD   dirbase;      /* Root directory base (LBA|Cluster) */
          +    DWORD   database;     /* Data base LBA */
          +    DWORD   winsect;      /* Sector LBA appearing in the win[] */
               BYTE    win[_MAX_SS]; /* Disk access window for directory, FAT (and file data at tiny cfg) */
           } FATFS;
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/sfile.html b/firmware/chibios-portapack/ext/fatfs/doc/en/sfile.html index 1ed98990..ee62071f 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/sfile.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/sfile.html @@ -13,7 +13,7 @@

          FIL

          -

          The FIL structure (file object) holds the state of an open file. It is created by f_open() function and discarded by f_close() function. Application program must not modify any member in this structure except for cltbl. Note that a sector buffer is defined in this structure at non-tiny configuration (_FS_TINY == 0), so that the FIL structures at that configuration should not be defined as auto variable.

          +

          The FIL structure (file object) holds the state of an open file. It is created by f_open function and discarded by f_close function. Application program must not modify any member in this structure except for cltbl, or any data on the FAT volume can be collapsed. Note that a sector buffer is defined in this structure at non-tiny configuration (_FS_TINY == 0), so that the FIL structures at that configuration should not be defined as auto variable.

           typedef struct {
          @@ -24,20 +24,20 @@
               DWORD   fptr;         /* File read/write pointer (Byte offset origin from top of the file) */
               DWORD   fsize;        /* File size in unit of byte */
               DWORD   sclust;       /* File start cluster */
          -    DWORD   clust;        /* Current cluster */
          -    DWORD   dsect;        /* Current data sector */
          +    DWORD   clust;        /* Current cluster of fptr (One cluster behind if fptr is on the cluster boundary. Invalid if fptr == 0.) */
          +    DWORD   dsect;        /* Current data sector (Can be invalid if fptr is on the cluster boundary.)*/
           #if !_FS_READONLY
          -    DWORD   dir_sect;     /* Sector containing the directory entry */
          +    DWORD   dir_sect;     /* Sector number containing the directory entry */
               BYTE*   dir_ptr;      /* Ponter to the directory entry in the window */
           #endif
           #if _USE_FASTSEEK
          -    DWORD*  cltbl;        /* Pointer to the cluster link map table (Nulled on file open) */
          +    DWORD*  cltbl;        /* Pointer to the cluster link map table (Nulled on file open. Set by application.) */
           #endif
           #if _FS_LOCK
               UINT    lockid;       /* Fle lock ID */
           #endif
           #if !_FS_TINY
          -    BYTE    buf[_MAX_SS]; /* File private data transfer buffer */
          +    BYTE    buf[_MAX_SS]; /* File private data transfer buffer (Always valid if fptr is not on the sector boundary but can be invalid if fptr is on the sector boundary.) */
           #endif
           } FIL;
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/sfileinfo.html b/firmware/chibios-portapack/ext/fatfs/doc/en/sfileinfo.html index ac254a12..70e20e4e 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/sfileinfo.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/sfileinfo.html @@ -13,7 +13,7 @@

          FILINFO

          -

          The FILINFO structure holds a file information returned by f_readdir() and f_stat() function.

          +

          The FILINFO structure holds information about the object returned by f_readdir, f_findfirst, f_findnext and f_stat function.

           typedef struct {
               DWORD fsize;      /* File size */
          @@ -58,9 +58,9 @@
           
          fattrib
          Indicates the file/directory attribute in combination of AM_DIR, AM_RDO, AM_HID, AM_SYS and AM_ARC.
          fname[]
          -
          Indicates the file/directory name in 8.3 format null-terminated string. It is always returnd with upper case in non-LFN configuration but it can be returned with lower case in LFN configuration.
          +
          The object name in 8.3 format (SFN) null-terminated string is stored. It is always upper case at non-LFN configuration but it can be returned with lower case at LFN configuration. A null string is stored when no item to read and this structure is invalid.
          lfname
          -
          Pointer to the LFN buffer to store the read LFN. This member must be initialized by application program prior to use this structure. Set a null pointer if LFN is not needed. Not available at non-LFN configuration.
          +
          Pointer to the string buffer to store the long file name (LFN). This member must be initialized by application program prior to use this structure. Set a null pointer if LFN is not needed. Not available at non-LFN configuration.
          lfsize
          Size of the LFN buffer in unit of TCHAR. This member must be initialized by application program prior to use this structure. Not available at non-LFN configuration.
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/size.html b/firmware/chibios-portapack/ext/fatfs/doc/en/size.html index bb786c61..a25a32cc 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/size.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/size.html @@ -39,7 +39,7 @@ DWORD f_size (

          Description

          -

          In this revision, the f_size() function is implemented as a macro.

          +

          In this revision, the f_size function is implemented as a macro. It has not any validation and mutual exclusion.

           #define f_size(fp) ((fp)->fsize)
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/stat.html b/firmware/chibios-portapack/ext/fatfs/doc/en/stat.html index db53c5d5..5651c956 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/stat.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/stat.html @@ -54,7 +54,7 @@ FRESULT f_stat (

          Description

          -

          The f_stat() function checks the existence of a file or sub-directory. If not exist, the function returns with FR_NO_FILE. If exist, the function returns with FR_OK and the informations of the object, file size, timestamp, attribute and SFN, are stored to the file information structure. For details of the file information, refer to the FILINFO structure and f_readdir() function.

          +

          The f_stat function checks the existence of a file or sub-directory. If not exist, the function returns with FR_NO_FILE. If exist, the function returns with FR_OK and the informations of the object, file size, timestamp, attribute and SFN, are stored to the file information structure. For details of the file information, refer to the FILINFO structure and f_readdir function.

          When LFN feature is enabled, lfname in the file information structure must be NULLed prior to use it.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/sync.html b/firmware/chibios-portapack/ext/fatfs/doc/en/sync.html index 3e86b7ff..3c16ac47 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/sync.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/sync.html @@ -36,7 +36,6 @@ FRESULT f_sync ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT

          @@ -45,8 +44,8 @@ FRESULT f_sync (

          Description

          -

          The f_sync() function performs the same process as f_close() function but the file is left opened and can continue read/write/seek operations to the file. This is suitable for the applications that open files for a long time in write mode, such as data logger. Performing f_sync() function of periodic or immediataly after f_write() function can minimize the risk of data loss due to a sudden blackout or an unintentional media removal. For more information, refer to application note.

          -

          However there is no sense in f_sync() function immediataly before f_close() function because it performs f_sync() function in it. In other words, the differnce between those functions is that the file object is invalidated or not.

          +

          The f_sync function performs the same process as f_close function but the file is left opened and can continue read/write/seek operations to the file. This is suitable for the applications that open files for a long time in write mode, such as data logger. Performing f_sync function of periodic or immediataly after f_write function can minimize the risk of data loss due to a sudden blackout or an unintentional media removal. For more information, refer to application note.

          +

          However there is no sense in f_sync function immediataly before f_close function because it performs f_sync function in it. In other words, the differnce between those functions is that the file object is invalidated or not.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/tell.html b/firmware/chibios-portapack/ext/fatfs/doc/en/tell.html index 93d03c91..49a2c578 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/tell.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/tell.html @@ -39,7 +39,7 @@ DWORD f_tell (

          Description

          -

          In this revision, the f_tell() function is implemented as a macro.

          +

          In this revision, the f_tell function is implemented as a macro. It has not any validation and mutual exclusion.

           #define f_tell(fp) ((fp)->fptr)
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/truncate.html b/firmware/chibios-portapack/ext/fatfs/doc/en/truncate.html index 7dc980d4..9be17b12 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/truncate.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/truncate.html @@ -36,7 +36,6 @@ FRESULT f_truncate ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT

          @@ -45,7 +44,7 @@ FRESULT f_truncate (

          Description

          -

          The f_truncate() function truncates the file size to the current file read/write pointer. This function has no effect if the file read/write pointer is already pointing end of the file.

          +

          The f_truncate function truncates the file size to the current file read/write pointer. This function has no effect if the file read/write pointer is already pointing end of the file.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/unlink.html b/firmware/chibios-portapack/ext/fatfs/doc/en/unlink.html index fc884c3c..34db349a 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/unlink.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/unlink.html @@ -25,7 +25,7 @@ FRESULT f_unlink (

          Parameter

          path
          -
          Pointer to the null-terminated string that specifies an object to be removed.
          +
          Pointer to a null-terminated string that specifies the file or sub-directory to be removed.
          @@ -59,7 +59,7 @@ FRESULT f_unlink ( If condition of the object to be removed is applicable to the following terms, the function will be rejected.
          • The file/sub-directory must not have read-only attribute (AM_RDO), or the function will be rejected with FR_DENIED.
          • The sub-directory must be empty and must not be current directory, or the function will be rejected with FR_DENIED.
          • -
          • The file/sub-directory must not be opened, or the FAT volume can be collapsed. It can be rejected with FR_LOCKED when file lock feature is enabled.
          • +
          • The file/sub-directory must not be opened, or the FAT volume can be collapsed. It will be rejected safely when file lock feature is enabled.
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/utime.html b/firmware/chibios-portapack/ext/fatfs/doc/en/utime.html index 7466c19f..ac646e38 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/utime.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/utime.html @@ -55,7 +55,7 @@ FRESULT f_utime (

          Description

          -

          The f_utime() function changes the timestamp of a file or sub-directory

          +

          The f_utime function changes the timestamp of a file or sub-directory

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/write.html b/firmware/chibios-portapack/ext/fatfs/doc/en/write.html index 925fd564..5bcd5a79 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/write.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/write.html @@ -45,7 +45,6 @@ FRESULT f_write ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/img/app3.c b/firmware/chibios-portapack/ext/fatfs/doc/img/app3.c index 662c403f..6733ee61 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/img/app3.c +++ b/firmware/chibios-portapack/ext/fatfs/doc/img/app3.c @@ -4,11 +4,10 @@ / This function checks if the file is contiguous with desired size. / If not, a block of contiguous sectors is allocated to the file. / If the file has been opened without FA_WRITE flag, it only checks if -/ the file is contiguous and returns the resulut. */ - -#if _FATFS != 80367 /* Check if R0.10c */ -#error This function may not be compatible with this revision of FatFs module. -#endif +/ the file is contiguous and returns the resulut. +/-----------------------------------------------------------------------/ +/ This function can work with FatFs R0.09 to R0.11a. +/----------------------------------------------------------------------*/ /* Declarations of FatFs internal functions accessible from applications. / This is intended to be used for disk checking/fixing or dirty hacks :-) */ @@ -37,16 +36,20 @@ DWORD allocate_contiguous_clusters ( /* Returns the first sector in LBA (0:er do { cl = get_fat(fp->fs, ccl); /* Get the cluster status */ if (cl + 1 < 3) return 0; /* Hard error? */ - if (cl != ccl + 1 &&; cl < fp->fs->n_fatent) break; /* Not contiguous? */ + if (cl != ccl + 1 && cl < fp->fs->n_fatent) break; /* Not contiguous? */ ccl = cl; } while (++ncl < tcl); if (ncl == tcl) /* Is the file contiguous? */ - return clust2sect(fp->fs, fp->sclust); /* Return file start sector */ + return clust2sect(fp->fs, fp->sclust); /* File is contiguous. Return the start sector */ } + + /* File is not contiguous */ #if _FS_READONLY - return 0; + return 0; /* Exit if in read-only cfg. */ #else - if (f_truncate(fp)) return 0; /* Remove the existing chain */ + if (!(fp->flag & FA_WRITE)) return 0; /* Exit if the file object is for read-only */ + + if (f_truncate(fp)) return 0; /* Remove the non-contiguous chain */ /* Find a free contiguous area */ ccl = cl = 2; ncl = 0; @@ -80,24 +83,23 @@ int main (void) DWORD org; - /* Open or create a file */ + /* Open or create a file to write */ f_mount(&fs, "", 0); - fr = f_open(&fil, "swapfile.sys", FA_READ | FA_WRITE | FA_OPEN_ALWAYS); + fr = f_open(&fil, "fastrec.log", FA_READ | FA_WRITE | FA_OPEN_ALWAYS); if (fr) return 1; - /* Check if the file is 64MB in size and occupies a contiguous area. + /* Check if the file is 256MB in size and occupies a contiguous area. / If not, a contiguous area will be re-allocated to the file. */ - org = allocate_contiguous_clusters(&fil, 0x4000000); + org = allocate_contiguous_clusters(&fil, 0x10000000); if (!org) { printf("Function failed due to any error or insufficient contiguous area.\n"); f_close(&fil); return 1; } - /* Now you can read/write the file with disk functions bypassing the file system layer. */ - + /* Now you can read/write the file without file system layer. */ + ... dr = disk_write(fil.fs->drv, Buff, org, 1024); /* Write 512KiB from top of the file */ - ... f_close(&fil); diff --git a/firmware/chibios-portapack/ext/fatfs/doc/img/app4.c b/firmware/chibios-portapack/ext/fatfs/doc/img/app4.c index 993eb4f4..03d124de 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/img/app4.c +++ b/firmware/chibios-portapack/ext/fatfs/doc/img/app4.c @@ -48,7 +48,6 @@ int test_diskio ( DRESULT dr; - printf("test_diskio(%u, %u, 0x%08X, 0x%08X)\n", pdrv, ncyc, (UINT)buff, sz_buff); if (sz_buff < _MAX_SS + 4) { @@ -306,11 +305,11 @@ int main (int argc, char* argv[]) DWORD buff[512]; /* 2048 byte working buffer */ /* Check function/compatibility of the physical drive #0 */ - rc = test_diskio(0, 1, buff, sizeof buff); - if (res) { - printf("Sorry the function/compatibility test failed.\nFatFs will not work on this disk driver.\n"); + rc = test_diskio(0, 3, buff, sizeof buff); + if (rc) { + printf("Sorry the function/compatibility test failed. (rc=%d)\nFatFs will not work on this disk driver.\n", rc); } else { - printf("Congratulations! The disk I/O layer works well.\n"); + printf("Congratulations! The disk driver works well.\n"); } return rc; diff --git a/firmware/chibios-portapack/ext/fatfs/doc/img/f6.png b/firmware/chibios-portapack/ext/fatfs/doc/img/f6.png index a7b0d71ed4709b57a7b633694eeb3e4d7080e92f..ec6eb2150367c800a507cde4152f656b017888a4 100644 GIT binary patch delta 1387 zcmaJ>dof78&grqj#_Oi22*6#qfs+0gONd6i_R*>Fn)Q=8F}aZ$g7#5 zI>}<2a%N>7C|Zq*Q7DZu!WfLB7_0}fDIuII0pcz%hmdH9;U)ZfhXN@01$fs01}b`U`a(KOaK7&I{=sr007%k z05Bjk`EJMZjqT_gmavWv9+&&4nYb{C^Vg{ly}kS-1$G}dV!ClXDb&P%6glq}X?e4a z183SCV}8TPAU!v#Vo{0Wc@hLCs5Mlp(nVQoq?PtAxIo5EyQe$Lm zELH>QLDl?a%fQnsXdAMrCN%nph2R!yfRrJ84v13D;ON_h%7X6DCE2QePdT)wiv%BB zS=BXdc}fF0{%5%u$lvd0U6s-}Jn!b?A6;3D$JeH>r@mco zx%WC}@_2K1*J1JH*oc7Fc+xhDjtN$?qGFq(LDQ$c>wV*joIDfRwH>P`nY=S1g++x) zsZWF)y66R$K}}rnN$V}27(SP_)G2&0A`zu6)P$mVW4q?Y*y3VeDq$8HtBMMWDiu;2 zj~%I9yUB)>#W8RWfg|c1=ouP0YHi`96nUYFCekhUAmYH6N$oz}^qC8LYflO-gXQEu zp-zt5=(^x?S0HMZd#a|hlmrLW{9yF=$em!Pi7n9=wr|GVZZP{y2k(|4q#PC&+YC-S z3(?B3(>^cvQ$lJP8Q{X66-4&26;eRS50S+$<_ysLj$2ga8`|oE^OCAnS9vV)3>FQx zl-&(8TgdgwBvOqsgTTIuCx>exf}eM^fzH%Ln9~Jl$CJl@+d*IVgENXZxhM7tzV4~r ztUcu2Pm31CBV*bWjG7`#?emH-!E)sNxEgM$`hYY>?wSAnTz)<1a&fHgA)_Ig8sdDX zdMw!Wbc9Pr*~4sfP^MWBA+9m7N*9Vc8gf)Ms$)@RH?KXH1mne&frwXe zZra*wKJ!LHc>Hy=&ydjmdBTOv{`exfXja4C*4B1}vh;_f_rO5Qu7OvzIBpV}TT5h+ zH9<1*p4G4pG{pA5)Vgb+#jmNqL)Ad|+L0oRO*bXukWPJe=X|&lBUnf%K@yCurB@#OcX1k(VkK&uqE}f~UaJo|AXhmNz&CZkE zg3Mphyt)}T=ax(dbnt{#Ry5q9eGrcEfn^g6*c#H=g&$y=slk#L+Kn_h-S%R4R zkn~x;-0z04s}nYo`^we(;l@Ik^xG@xGR)@->uJx-EJ*nG%@t0XFDhK|)}*Tqz&DmT zR1Q}6od*_4FP!=$s~>`=PE_(_jxKD$Zz}j^FX$sS>T0wpW6>M+-3}eR+paG?>BSFp z=Lzyvl)pXGa*bGD*h<5Dj?B4h@kr~s2*my8D|a{PQcLoO1^RA;j8I54?RW(AtwFo< zoe9zMd6q>1Y6oX7w@;b2(x4-^=b2xm4=!wG^EFb$*5LfkXvR3(`4NlR7%$t3G;JM4 zQ^T^Mre~D#^mm@FzVW#qOU(ExGrttXCP7Np+pPw=X$NO^kMlKn|2&&7dI(>i(Ky{L WC3@<1XyvNvRRUNiydxVEkoXq?k--W8 literal 1436 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 a-WJ7rO^FjEQ%jKgC3MW@B%;FVbo@V^{mfnf literal 14357 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 AMgRZ+ diff --git a/firmware/chibios-portapack/ext/fatfs/doc/img/layers.png b/firmware/chibios-portapack/ext/fatfs/doc/img/layers.png index d485d6b6065cee4db0bfff0dfcf17fbe45d2d758..f9880927e29a859fc3f83bc2d98495210d0ebf60 100644 GIT binary patch literal 5521 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 ACIA2c diff --git a/firmware/chibios-portapack/ext/fatfs/doc/img/layers1.png b/firmware/chibios-portapack/ext/fatfs/doc/img/layers1.png new file mode 100644 index 0000000000000000000000000000000000000000..1b54f860e3c4f2d778460ea2f404ccfee55097dd GIT binary patch literal 3843 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メモリ使用é‡
        • モジュール サイズã®ç¸®å°
        • é•·ã„ファイルå
        • -
        • 日本語ファイルåã®å¤§æ–‡å­—変æ›
        • Unicode入出力ã¸ã®å¯¾å¿œ
        • リエントランシー
        • 多é‡ãƒ•ã‚¡ã‚¤ãƒ« アクセス
        • @@ -27,13 +26,12 @@
        • APIã®æ‹¡å¼µçš„使用例
        • FatFsã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã«ã¤ã„ã¦
        • -
          -
          +

          ãƒãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã®éš›ã«é…æ…®ã™ã¹ãã“ã¨

          -

          移æ¤ã®éš›ã®å‰ææ¡ä»¶

          -

          FatFsモジュールã¯ç§»æ¤æ€§ã«é–¢ã—ã¦æ¬¡ã®ç‚¹ã‚’å‰æã¨ã—ã¦ã„ã¾ã™ã€‚

          +

          ãƒãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã®éš›ã®å‰ææ¡ä»¶

          +

          FatFsモジュールã¯ãƒãƒ¼ã‚¿ãƒ“リティã«é–¢ã—ã¦æ¬¡ã®ç‚¹ã‚’å‰æã¨ã—ã¦ã„ã¾ã™ã€‚

          • 処ç†ç³»ã¯ANSI C準拠ã§ã‚ã‚‹ã“ã¨ã€‚
            FatFsモジュールã¯ANSI C(C89)準拠ã§è¨˜è¿°ã•ã‚Œã¦ã„ã‚‹ã®ã§ã€æ™®é€šã®Cコンパイラãªã‚‰ç‰¹ã«å‡¦ç†ç³»ä¾å­˜ã«ãªã‚‹ç‚¹ã¯ã‚ã‚Šã¾ã›ã‚“。
          • @@ -45,10 +43,10 @@ FatFsモジュールã¯ANSI C(C89)準拠ã§è¨˜è¿°ã•ã‚Œã¦ã„ã‚‹ã®ã§ã€æ™®é€š

            下ã«ç¤ºã™ä¾å­˜é–¢ä¿‚図ã¯ã€FatFsモジュール利用ã®çµ„ã¿è¾¼ã¿ã‚·ã‚¹ãƒ†ãƒ ã«ãŠã‘る代表的ãªæ§‹æˆã‚’示ã—ã¾ã™ã€‚

            システム構æˆå›³

            (a) FatFs用ã«æ›¸ã‹ã‚ŒãŸãƒ‡ã‚£ã‚¹ã‚¯ モジュールãŒã‚ã‚‹å ´åˆã¯ã€ãã®ã¾ã¾è¿½åŠ ã™ã‚‹ã ã‘ã§ã™ã€‚ (b) ã—ã‹ã—ã€å¤šãã®æ—¢å­˜ã®ãƒ‡ã‚£ã‚¹ã‚¯ モジュールã¯ãã®APIã‚’FatFsã«åˆã‚ã›ã‚‹ãŸã‚ã€ã‚°ãƒ«ãƒ¼é–¢æ•°ãŒå¿…è¦ã«ãªã‚‹ã§ã—ょã†ã€‚

            -

            functional diagram

            +

            functional diagram

            ユーザã®ä½œæˆã™ã‚‹é–¢æ•°

            -

            å¿…è¦ãªã®ã¯FatFsモジュールã®è¦æ±‚ã™ã‚‹ãƒ‡ã‚£ã‚¹ã‚¯é–¢æ•°ã‚’用æ„ã™ã‚‹ã“ã¨ã ã‘ã§ã€ãれ以外ã«ã™ã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。既ã«å‹•ä½œã—ã¦ã„るディスク モジュールãŒã‚ã‚‹ãªã‚‰ã€ãã®APIã‚’FatFsã«åˆã‚ã›ã‚‹ã‹ã‚°ãƒ«ãƒ¼é–¢æ•°ã‚’介ã—ã¦ã¤ãªãã ã‘ã§æ¸ˆã¿ã¾ã™ãŒã€ç„¡ã„å ´åˆã¯ã»ã‹ã‹ã‚‰ç§»æ¤ã™ã‚‹ã‹æœ€åˆã‹ã‚‰æ›¸ãã‹ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚定義ã•ã‚Œã¦ã„ã‚‹å…¨ã¦ã®é–¢æ•°ãŒå¸¸ã«å¿…è¦ãªã‚ã‘ã§ã¯ã‚ã‚Šã¾ã›ã‚“。例ãˆã°ã€ãƒªãƒ¼ãƒ‰ オンリー構æˆã§ã¯æ›¸ãè¾¼ã¿ç³»é–¢æ•°ã¯å¿…è¦ã‚ã‚Šã¾ã›ã‚“。次ã®è¡¨ã«æ§‹æˆã‚ªãƒ—ションã¨è¦æ±‚ã•ã‚Œã‚‹é–¢æ•°ã®å¯¾å¿œã‚’示ã—ã¾ã™ã€‚

            +

            ãƒãƒ¼ãƒ†ã‚£ãƒ³ã‚°ä½œæ¥­ã¯ã€è¦æ±‚ã•ã‚Œã‚‹ãƒ‡ãƒã‚¤ã‚¹åˆ¶å¾¡é–¢æ•°ã‚’用æ„ã™ã‚‹ã“ã¨ãŒå…¨ã¦ã§ã€ãれ以外ã«ã™ã‚‹ã“ã¨ã¯ä½•ã‚‚ã‚ã‚Šã¾ã›ã‚“。既ã«å‹•ä½œã—ã¦ã„るデãƒã‚¤ã‚¹åˆ¶å¾¡ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ãŒã‚ã‚‹ãªã‚‰ã€ãã®APIã‚’FatFsã«åˆã‚ã›ã‚‹ã‹ã‚°ãƒ«ãƒ¼é–¢æ•°ã‚’介ã—ã¦ã¤ãªãã ã‘ã§æ¸ˆã¿ã¾ã™ãŒã€ç„¡ã„å ´åˆã¯ã»ã‹ã‹ã‚‰ç§»æ¤ã™ã‚‹ã‹æœ€åˆã‹ã‚‰æ›¸ãã‹ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚定義ã•ã‚Œã¦ã„ã‚‹å…¨ã¦ã®é–¢æ•°ãŒå¸¸ã«å¿…è¦ãªã‚ã‘ã§ã¯ã‚ã‚Šã¾ã›ã‚“。例ãˆã°ã€ãƒªãƒ¼ãƒ‰ オンリ構æˆã§ã¯æ›¸ãè¾¼ã¿ç³»é–¢æ•°ã¯å¿…è¦ã‚ã‚Šã¾ã›ã‚“。次ã®è¡¨ã«æ§‹æˆã‚ªãƒ—ションã¨è¦æ±‚ã•ã‚Œã‚‹é–¢æ•°ã®å¯¾å¿œã‚’示ã—ã¾ã™ã€‚

            @@ -56,66 +54,56 @@ FatFsモジュールã¯ANSI C(C89)準拠ã§è¨˜è¿°ã•ã‚Œã¦ã„ã‚‹ã®ã§ã€æ™®é€š - +
            å¿…è¦ãªé–¢æ•°å¿…è¦ã¨ãªã‚‹æ¡ä»¶å‚™è€ƒ
            disk_status
            disk_initialize
            disk_read
            常時ffsample.zip (サンプル)
            ãã®ä»–web上ã«å¤šæ•°
            disk_ioctl (GET_SECTOR_COUNT)
            disk_ioctl (GET_BLOCK_SIZE)
            _USE_MKFS == 1
            disk_ioctl (GET_SECTOR_SIZE)_MAX_SS != _MIN_SS
            disk_ioctl (CTRL_TRIM)_USE_TRIM == 1
            ff_convert
            ff_wtoupper
            _USE_LFN >= 1option/unicode.c
            ff_convert
            ff_wtoupper
            _USE_LFN != 0option/unicode.cをプロジェクトã«
            加ãˆã‚Œã°ã‚ˆã„
            ff_cre_syncobj
            ff_rel_grant
            ff_req_grant
            ff_del_syncobj
            _FS_REENTRANT == 1option/syscall.c (サンプル)
            ff_mem_alloc
            ff_mem_free
            _USE_LFN == 3
          -
          +

          é™ç•Œå€¤

          • FATタイプ: FAT12, FAT16, FAT32。
          • åŒæ™‚オープン ファイル数: 無制é™ã€‚(利用å¯èƒ½ãƒ¡ãƒ¢ãƒªã«ã‚ˆã‚‹)
          • -
          • ボリューム数: 最大 10。
          • -
          • ファイル サイズ: FATè¦æ ¼ã«ä¾å­˜ã€‚(最大 4G-1ãƒã‚¤ãƒˆ)
          • -
          • ボリューム サイズ: FATè¦æ ¼ã«ä¾å­˜ã€‚(最大 2Tãƒã‚¤ãƒˆ(512ãƒã‚¤ãƒˆ/セクタ時))
          • -
          • クラスタ サイズ: FATè¦æ ¼ã«ä¾å­˜ã€‚(最大 64Kãƒã‚¤ãƒˆ(512ãƒã‚¤ãƒˆ/セクタ時))
          • -
          • セクタ サイズ: FATè¦æ ¼ã«ä¾å­˜ã€‚(512~4096ãƒã‚¤ãƒˆ)
          • +
          • åŒæ™‚マウント ボリューム数: 最大 10。
          • +
          • ファイル サイズ: 最大 4G-1ãƒã‚¤ãƒˆã€‚
          • +
          • ボリューム サイズ: 最大 2Tãƒã‚¤ãƒˆ(512ãƒã‚¤ãƒˆ/セクタ時)。
          • +
          • クラスタ サイズ: 最大 64Kãƒã‚¤ãƒˆ(512ãƒã‚¤ãƒˆ/セクタ時)。
          • +
          • セクタ サイズ: 512, 1024, 2048, 4096ãƒã‚¤ãƒˆã€‚
          -
          +

          メモリ使用é‡

          次ã®è¡¨ã«ã„ãã¤ã‹ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã«ãŠã‘るメモリ使用é‡ã®ä¾‹ã‚’示ã—ã¾ã™ã€‚テスト時ã®æ§‹æˆã‚ªãƒ—ションã¯ãã®ä¸‹ã®é€šã‚Šã§ã™ã€‚数値ã®å˜ä½ã¯ãƒã‚¤ãƒˆã§ã€Vã¯ãƒœãƒªãƒ¥ãƒ¼ãƒ æ•°ã€Fã¯åŒæ™‚オープン ファイル数を示ã—ã¾ã™ã€‚コンパイラã®æœ€é©åŒ–オプションã¯ã‚³ãƒ¼ãƒ‰ サイズã¨ã—ã¦ã„ã¾ã™ã€‚

          - - - - - + + + + +
          ARM7
          32bit
          ARM7
          Thumb
          CM3
          Thumb-2
          AVRH8/300HPIC24RL78V850ESSH-2ARX600IA-32
          CompilerGCCGCCGCCGCCCH38C30CC78K0RCA850SHCRXCVC6
          _WORD_ACCESS00010001011
          text (Full, R/W)1067571716617133551094011722132628113904860327952
          text (Min, R/W) 672746314331 8569 7262 7720 90885287580039485183
          text (Full, R/O) 473131472889 6235 5170 5497 64823833397228623719
          text (Min, R/O) 355924852295 4575 4064 4240 50192993310422142889
          text (Full, R/W)10.6k7.1k6.5k13.3k10.9k11.7k13.3k8.1k9.0k6.0k7.9k
          text (Min, R/W) 6.7k4.6k4.2k 8.6k 7.3k 7.7k 9.1k5.3k5.8k3.9k5.2k
          text (Full, R/O) 4.8k3.2k2.9k 6.2k 5.2k 5.5k 6.5k3.8k4.0k2.9k3.7k
          text (Min, R/O) 3.6k2.5k2.3k 4.6k 4.1k 4.3k 5.0k3.0k3.1k2.2k2.9k
          bssV*4 + 2V*4 + 2V*4 + 2V*2 + 2V*4 + 2V*2 + 2V*2 + 2V*4 + 2V*4 + 2V*4 + 2V*4 + 2
          Work area
          (_FS_TINY == 0)
          V*560
          + F*550
          V*560
          + F*550
          V*560
          + F*550
          V*560
          + F*544
          V*560
          + F*550
          V*560
          + F*544
          V*560
          + F*544
          V*560
          + F*544
          V*560
          + F*550
          V*560
          + F*550
          V*560
          + F*550
          Work area
          (_FS_TINY == 1)
          V*560
          + F*36
          V*560
          + F*36
          V*560
          + F*36
          V*560
          + F*32
          V*560
          + F*36
          V*560
          + F*32
          V*560
          + F*32
          V*560
          + F*36
          V*560
          + F*36
          V*560
          + F*36
          V*560
          + F*36
          -FatFs R0.10a options:
          -_FS_READONLY     0 (R/W) or 1 (R/O)
          -_FS_MINIMIZE     0 (Full function) or 3 (Minimized function)
          -_USE_STRFUNC     0 (Disable string functions)
          -_USE_MKFS        0 (Disable f_mkfs function)
          -_USE_FORWARD     0 (Disable f_forward function)
          -_USE_FASTSEEK    0 (Disable fast seek feature)
          -_CODE_PAGE       932 (Japanese Shift_JIS)
          -_USE_LFN         0 (Disable LFN feature)
          -_MAX_SS          512 (Fixed sector size)
          -_FS_RPATH        0 (Disable relative path feature)
          -_FS_LABEL        0 (Disable volume label functions)
          -_VOLUMES         V (Number of logical drives to be used)
          -_MULTI_PARTITION 0 (Single partition per drive)
          -_FS_REENTRANT    0 (Disable thread safe)
          -_FS_LOCK         0 (Disable file lock control)
          +FatFs R0.11 options:
          +_FS_READONLY   0 (R/W) or 1 (R/O)
          +_FS_MINIMIZE   0 (Full basic function) or 3 (Minimized function)
          +_VOLUMES       V (Number of logical drives to be used)
          +_WORD_ACCESS   0 or 1 (Set by processor architecture)
          +(Any other options are left not changed from default setting)
           
          -
          +

          モジュール サイズã®ç¸®å°

          -

          次ã®è¡¨ã¯æ§‹æˆã‚ªãƒ—ションã®è¨­å®šå€¤ã«ã‚ˆã‚Šã©ã®æ©Ÿèƒ½ãŒå‰Šé™¤ã•ã‚Œã‚‹ã‹ã‚’示ã—ã¾ã™ã€‚

          +

          次ã®è¡¨ã¯æ§‹æˆã‚ªãƒ—ションã®è¨­å®šå€¤ã«ã‚ˆã‚Šã©ã®æ©Ÿèƒ½ãŒå‰Šé™¤ã•ã‚Œã‚‹ã‹ã‚’示ã—ã¾ã™ã€‚使用ã™ã‚‹API関数ã®è¡Œã«xãŒç„¡ã‘ã‚Œã°ãã®é–¢æ•°ã¯ä½¿ç”¨å¯èƒ½ã§ã™ã€‚

          - + @@ -150,50 +138,46 @@ _FS_LOCK 0 (Disable file lock control)
          Function_FS_MINIMIZE_FS_READONLY_USE_STRFUNC_FS_RPATH_FS_LABEL_USE_MKFS_USE_FORWARD_MULTI_PARTITION
          Function_FS_MINIMIZE_FS_READONLY_USE_STRFUNC_FS_RPATH_USE_LABEL_USE_MKFS_USE_FORWARD_MULTI_PARTITION
          0123010  1/20120101010/12
          f_mount
          f_open
          -
          +

          é•·ã„ファイルå

          -

          FatFsモジュールã¯ã€é•·ã„ファイルå(LFN)をサãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ファイルã«ä»˜ã‘られãŸ2ã¤ã®ç•°ãªã‚‹åå‰(短ã„ファルåã¨é•·ã„ファイルå)ã¯ã€f_readdir()を除ãファイルæ“作関数ã«ãŠã„ã¦é€éŽã§ã™ã€‚デフォルト構æˆã§ã¯ã€LFN機能ã¯OFFã«ãªã£ã¦ã„ã¾ã™ã€‚LFN機能を有効ã«ã™ã‚‹ã«ã¯ã€_USE_LFNã‚’1,2ã¾ãŸã¯3ã«è¨­å®šã—ã€option/unicode.cをプロジェクトã«è¿½åŠ ã—ã¾ã™ã€‚LFN機能ã¯ã€åŠ ãˆã¦ã‚る程度ã®ãƒ¯ãƒ¼ã‚¯ エリア(LFNæ“作ãƒãƒƒãƒ•ã‚¡)ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡é•·ã¯ä½¿ç”¨ã§ãるメモリã«å¿œã˜ã¦_MAX_LFNオプションã§æ§‹æˆã•ã‚Œã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚LFNã®é•·ã•ã¯æœ€å¤§255文字ã«é”ã™ã‚‹ã®ã§ã€LFN完全対応ã®ãŸã‚ã«ã¯_MAX_LFNã¯255ã«è¨­å®šã•ã‚Œã‚‹ã¹ãã§ã™ã€‚与ãˆã‚‰ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«åã«å¯¾ã—ã¦ãƒãƒƒãƒ•ã‚¡é•·ãŒä¸è¶³ã—ãŸå ´åˆã€ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ã¯FR_INVALID_NAMEã§å¤±æ•—ã—ã¾ã™ã€‚

          -

          ファイル関数ã«å†å…¥ã‚’è¡Œã†æ¡ä»¶ã®ä¸‹ã§LFN機能を使用ã™ã‚‹å ´åˆã¯ã€_USE_LFNã¯2ã¾ãŸã¯3ã«è¨­å®šã•ã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。ã“ã®å ´åˆã€ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ã¯ãƒ¯ãƒ¼ã‚¯ エリアを動的ã«ç¢ºä¿(スタックã¾ãŸã¯ãƒ’ープ)ã—ã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡ サイズã¯ã€(_MAX_LFN + 1) * 2ãƒã‚¤ãƒˆã«ãªã‚‹ã®ã§ã€ã‚¹ã‚¿ãƒƒã‚¯ç­‰ã®ã‚µã‚¤ã‚ºã¯ãれを考慮ã—ãŸå分ãªã‚µã‚¤ã‚ºã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。

          +

          FatFsモジュールã¯ã€é•·ã„ファイルå(LFN)をサãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ファイルã«ä»˜ã‘られãŸ2ã¤ã®ç•°ãªã‚‹åå‰(短ã„ファルåã¨é•·ã„ファイルå)ã¯ã€f_readdir関数を除ãファイルæ“作関数ã«ãŠã„ã¦é€éŽã§ã™ã€‚デフォルト構æˆã§ã¯ã€LFN機能ã¯OFFã«ãªã£ã¦ã„ã¾ã™ã€‚LFN機能を有効ã«ã™ã‚‹ã«ã¯ã€_USE_LFNã‚’1,2ã¾ãŸã¯3ã«è¨­å®šã—ã€option/unicode.cをプロジェクトã«è¿½åŠ ã—ã¾ã™ã€‚LFN機能ã¯ã€åŠ ãˆã¦ã‚る程度ã®ãƒ¯ãƒ¼ã‚¯ エリア(LFNæ“作ãƒãƒƒãƒ•ã‚¡)ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡é•·ã¯ä½¿ç”¨ã§ãるメモリã«å¿œã˜ã¦_MAX_LFNオプションã§æ§‹æˆã•ã‚Œã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚LFNã®é•·ã•ã¯æœ€å¤§255文字ã«é”ã™ã‚‹ã®ã§ã€LFN完全対応ã®ãŸã‚ã«ã¯_MAX_LFNã¯255ã«è¨­å®šã•ã‚Œã‚‹ã¹ãã§ã™ã€‚与ãˆã‚‰ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«åã«å¯¾ã—ã¦ãƒãƒƒãƒ•ã‚¡é•·ãŒä¸è¶³ã—ãŸå ´åˆã€ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ã¯FR_INVALID_NAMEã§å¤±æ•—ã—ã¾ã™ã€‚

          +

          ファイル関数ã«å†å…¥ã‚’è¡Œã†æ¡ä»¶ã®ä¸‹ã§LFN機能を使用ã™ã‚‹å ´åˆã¯ã€_USE_LFNã¯2ã¾ãŸã¯3ã«è¨­å®šã•ã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。ã“ã®å ´åˆã€ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ã¯ãƒ¯ãƒ¼ã‚¯ エリアを動的ã«ç¢ºä¿(スタックã¾ãŸã¯ãƒ’ープ)ã—ã¾ã™ã€‚ワーク エリアã®ã‚µã‚¤ã‚ºã¯ã€(_MAX_LFN + 1) * 2ãƒã‚¤ãƒˆã«ãªã‚‹ã®ã§ã€ã‚¹ã‚¿ãƒƒã‚¯ç­‰ã®ã‚µã‚¤ã‚ºã¯ãれを考慮ã—ãŸå分ãªä½™è£•ãŒãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。

          - - - - - - - + + + + + + +
          LFN cfg on ARM7
          コードページコードサイズ[bytes]
          SBCS+3721
          932(Shift_JIS)+62609
          936(GBK)+177797
          949(Korean)+139857
          950(Big5)+111497
          LFNæ§‹æˆ at CM3
          _CODE_PAGE追加コード
          SBCS+2.8K
          932(Shift_JIS)+62.6k
          936(GBK)+177k
          949(Korean)+139k
          950(Big5)+111k

          LFN機能ã®ä¸Šæ‰‹ãªä½¿ã„æ–¹ã¯ã€ãれを使ã‚ãªã„ã¨ã„ã†ã“ã¨ã§ã™ã€‚実際ã€çµ„ã¿è¾¼ã¿ç”¨é€”ã§ã¯LFN機能ãŒã©ã†ã—ã¦ã‚‚å¿…è¦ã«ãªã‚‹ã¨ã„ã†ã“ã¨ã¯ã»ã¨ã‚“ã©ç„¡ã„ã¯ãšã§ã™ã€‚LFNを有効ã«ã™ã‚‹ã¨ã€é¸æŠžã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ ページã«å¿œã˜ã¦ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ« サイズãŒå¢—大ã—ã¾ã™ã€‚å³ã®è¡¨ã«å„コード ページã«ãŠã‘ã‚‹LFNを有効ã«ã—ãŸã¨ãã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ« サイズã®é•ã„を示ã—ã¾ã™ã€‚特ã«ã€CJK地域ã§ã¯æ•°ä¸‡ã®æ–‡å­—ãŒä½¿ã‚ã‚Œã¦ã„ã¾ã™ãŒã€ä¸å¹¸ãªã“ã¨ã«ãã‚Œã¯å·¨å¤§ãªOEMï¼Unicode相互変æ›ãƒ†ãƒ¼ãƒ–ルをè¦æ±‚ã—ã€ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ« サイズã¯åŠ‡çš„ã«å¢—大ã—ã¾ã™ã€‚ãã®çµæžœã€ãれらã®ã‚³ãƒ¼ãƒ‰ ページã«ãŠã„ã¦LFNを有効ã«ã—ãŸFatFsモジュールã¯ã€å¤šãã®8ビット マイコンã«ã‚¤ãƒ³ãƒ—リメントã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。

          LFN機能ã®ãƒãƒ¼ãƒ‰ãƒ«ã¯ãã‚Œã ã‘ã§ã¯ã‚ã‚Šã¾ã›ã‚“。マイクロソフト社ã¯FATファイル システムã«ã¤ã„ã¦ã„ãã¤ã‹ã®ç‰¹è¨±ã‚’ä¿æœ‰ã—ã¦ã„ã¾ã™ã€‚ã„ãšã‚Œã‚‚LFN機能ã®å®Ÿè£…ã«é–¢ã™ã‚‹ã‚‚ã®ã§ã€ãã®åˆ©ç”¨ã«å¯¾ã—ã¦$0.25/unitã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ–™ã‚’è¦æ±‚ã—ã¦ã„ã¾ã™ã€‚ã“ã®ãŸã‚ã€å•†ç”¨è£½å“ã§LFN機能を利用ã™ã‚‹ã¨ãã¯ã€æœ€çµ‚仕å‘地ã«ã‚ˆã£ã¦ã¯ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ãŒå¿…è¦ã«ãªã‚Šã¾ã™ã€‚最近ã®FAT32ドライãƒã®å¤šãã¯LFN機能をå«ã‚“ã§ã„ã‚‹ãŸã‚ã€ãれらã®ä½¿ç”¨ã«å½“ãŸã£ã¦ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ãŒå¿…è¦ã«ãªã‚Šã¾ã™ãŒã€FatFsã§ã¯LFN機能を構æˆã‚ªãƒ—ションã§ä»»æ„ã«ON/OFFã§ãã‚‹ãŸã‚ã€ç„¡åŠ¹ã«ã—ã¦ãƒ©ã‚¤ã‚»ãƒ³ã‚¹å•é¡Œã‚’回é¿ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚

          -
          -

          日本語ファイルåã®å¤§æ–‡å­—変æ›

          -

          CP932(Shift_JIS)ã§ã‹ã¤éžLFN構æˆã®ã¨ãã¯ã€æ‹¡å¼µæ–‡å­—ã®å°æ–‡å­—(2ãƒã‚¤ãƒˆè‹±å­—・キリル文字・ギリシャ文字)ã«å¯¾ã—ã¦å¤§æ–‡å­—変æ›ã‚’è¡Œã‚ãšã€å°æ–‡å­—ã®ã¾ã¾SFNエントリã«è¨˜éŒ²ãƒ»æ¤œç´¢ã•ã‚Œã¾ã™(日本語MSDOS仕様)。ã“ã®ãŸã‚ã€éžLFN構æˆã§å…¨è§’å°æ–‡å­—ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã™ã‚‹ã¨ã€NTç³»Windowsã§ãã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ã‘ãªããªã‚Šã¾ã™ã€‚LFN構æˆã§ã¯å¤§æ–‡å­—変æ›ã‚’è¡Œã„ã¾ã™(NTç³»Windows仕様)。

          -
          - -
          +

          Unicode入出力ã¸ã®å¯¾å¿œ

          -

          FatFs API上ã«ãŠã‘るファイルåç­‰ã®æ–‡å­—列データã®å…¥å‡ºåŠ›ã¯ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã¯ANSI/OEMコードã§è¡Œã‚ã‚Œã¾ã™ãŒã€ã“れをUnicode(UTF-16)ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã“ã¨ã‚‚ã§ãã¾ã™(_LFN_UNICODEオプションã§è¨­å®š)。ã¤ã¾ã‚Šã€ã“ã‚Œã¯FatFsãŒLFN機能ã«å®Œå…¨å¯¾å¿œã—ã¦ã„ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚Unicodeã®ãƒ•ã‚¡ã‚¤ãƒ«åã«é–¢ã™ã‚‹è©³ç´°ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«åã‚’å‚ç…§ã—ã¦ãã ã•ã„。

          +

          FatFs API上ã«ãŠã‘るファイルåç­‰ã®æ–‡å­—列データã®å…¥å‡ºåŠ›ã¯ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã¯ANSI/OEMコードã§è¡Œã‚ã‚Œã¾ã™ãŒã€ã“れをUnicode(UTF-16)ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã“ã¨ã‚‚ã§ãã¾ã™(_LFN_UNICODEオプションã§è¨­å®š)。ã¤ã¾ã‚Šã€ã“ã‚Œã¯FatFsãŒLFN機能ã«å®Œå…¨å¯¾å¿œã—ã¦ã„ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚Unicodeã®ãƒ•ã‚¡ã‚¤ãƒ«åã«é–¢ã™ã‚‹è©³ç´°ã¯ã€ãƒ‘スåã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚’å‚ç…§ã—ã¦ãã ã•ã„。

          -
          +

          リエントランシー

          -

          互ã„ã«ç•°ãªã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ ã«å¯¾ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«æ“作ã¯ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆã§ã€å¸¸ã«åŒæ™‚平行ã«å‹•ä½œã§ãã¾ã™ã€‚åŒã˜ãƒœãƒªãƒ¥ãƒ¼ãƒ ã«å¯¾ã—ã¦ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã¯ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆã§ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€_FS_REENTRANTオプションã§ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆ(スレッド セーフ)ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã™ã€‚ã“ã®å ´åˆã€OSä¾å­˜ã®åŒæœŸã‚ªãƒ–ジェクトæ“作関数ff_cre_syncobj(), ff_del_syncobj(), ff_req_grant(), ff_rel_grant()ã‚‚ã¾ãŸãƒ—ロジェクトã«è¿½åŠ ã•ã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。サンプル コードã¨è§£èª¬ã¯option/syncobj.cã«ã‚ã‚Šã¾ã™ã€‚

          -

          ã“ã®å ´åˆã€ã‚るタスクãŒãƒœãƒªãƒ¥ãƒ¼ãƒ ã‚’使用中ã«ä»–ã®ã‚¿ã‚¹ã‚¯ã‹ã‚‰ãã®ãƒœãƒªãƒ¥ãƒ¼ãƒ ã«å¯¾ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹ã¨ã€ãã®ã‚¢ã‚¯ã‚»ã‚¹ã¯å…ˆã®ã‚¿ã‚¹ã‚¯ãŒãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ã‚’抜ã‘ã‚‹ã¾ã§ãƒ–ロックã•ã‚Œã¾ã™ã€‚ã‚‚ã—ã€å¾…ã¡æ™‚é–“ãŒ_TIMEOUTã§æŒ‡å®šã•ã‚ŒãŸæœŸé–“を越ã™ã¨ã€ãã®é–¢æ•°ã¯FR_TIMEOUTã§ã‚¢ãƒœãƒ¼ãƒˆã—ã¾ã™ã€‚ã„ãã¤ã‹ã®RTOSã§ã¯ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆæ©Ÿèƒ½ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œãªã„ã‹ã‚‚知れã¾ã›ã‚“。

          -

          ã²ã¨ã¤ã®ä¾‹å¤–ãŒf_mount(), f_mkfs(), f_fdisk()ã«ã‚ã‚Šã¾ã™ã€‚ã“れらã®é–¢æ•°ã¯åŒã˜ãƒœãƒªãƒ¥ãƒ¼ãƒ (ã¾ãŸã¯é–¢é€£ã™ã‚‹ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–)ã«å¯¾ã—ã¦ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆã§ã¯ã‚ã‚Šã¾ã›ã‚“。ã“れらã®é–¢æ•°ã‚’使用ã™ã‚‹ã¨ãã¯ã€ã‚¢ãƒ—リケーション レベルã§æŽ’他制御ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。

          -

          注: ã“ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã¯FatFsモジュールãれ自体ã®ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ã‚·ãƒ¼ã«ã¤ã„ã¦èª¬æ˜Žã—ã¦ã„ã¾ã™ã€‚ãã®ä¸‹ä½ã®ãƒ‡ã‚£ã‚¹ã‚¯I/Oモジュールã®ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ã‚·ãƒ¼ã«é–¢ã—ã¦ã¯ä½•ã®å‰æã‚‚ã‚ã‚Šã¾ã›ã‚“。

          +

          互ã„ã«ç•°ãªã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ ã«å¯¾ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«æ“作ã¯æ§‹æˆã«ã‹ã‹ã‚らãšãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆã§ã€å¸¸ã«åŒæ™‚平行ã«å‹•ä½œã§ãã¾ã™ã€‚

          +

          åŒã˜ãƒœãƒªãƒ¥ãƒ¼ãƒ ã«å¯¾ã—ã¦ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã¯ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆã§ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€_FS_REENTRANTオプションã§ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆ(スレッド セーフ)ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã™ã€‚ã“ã®å ´åˆã€OSä¾å­˜ã®åŒæœŸã‚ªãƒ–ジェクトæ“作関数ff_cre_syncobj, ff_del_syncobj, ff_req_grant, ff_rel_grant関数もã¾ãŸãƒ—ロジェクトã«è¿½åŠ ã•ã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。サンプル コードã¨è§£èª¬ã¯option/syncobj.cã«ã‚ã‚Šã¾ã™ã€‚

          +

          ã“ã®å ´åˆã€ã‚るタスクãŒãƒœãƒªãƒ¥ãƒ¼ãƒ ã‚’使用中ã«ä»–ã®ã‚¿ã‚¹ã‚¯ã‹ã‚‰ãã®ãƒœãƒªãƒ¥ãƒ¼ãƒ ã«å¯¾ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹ã¨ã€ãã®ã‚¢ã‚¯ã‚»ã‚¹ã¯å…ˆã®ã‚¿ã‚¹ã‚¯ãŒãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ã‚’抜ã‘ã‚‹ã¾ã§ã‚µã‚¹ãƒšãƒ³ãƒ‰ã•ã‚Œã¾ã™ã€‚å¾…ã¡æ™‚é–“ãŒ_TIMEOUTã§æŒ‡å®šã•ã‚ŒãŸæœŸé–“を越ãˆãŸå ´åˆã€ãã®é–¢æ•°ã¯FR_TIMEOUTã§ã‚¢ãƒœãƒ¼ãƒˆã—ã¾ã™ã€‚ã„ãã¤ã‹ã®RTOSã§ã¯ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆæ©Ÿèƒ½ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œãªã„ã‹ã‚‚知れã¾ã›ã‚“。

          +

          ã²ã¨ã¤ã®ä¾‹å¤–ãŒf_mount, f_mkfs, f_fdisk関数ã«ã‚ã‚Šã¾ã™ã€‚ã“れらã®ãƒœãƒªãƒ¥ãƒ¼ãƒ åˆ¶å¾¡é–¢æ•°ã¯åŒã˜ãƒœãƒªãƒ¥ãƒ¼ãƒ (ã¾ãŸã¯é–¢é€£ã™ã‚‹ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–)ã«å¯¾ã—ã¦ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆã§ã¯ã‚ã‚Šã¾ã›ã‚“。ã“れらã®é–¢æ•°ã‚’使用ã™ã‚‹ã¨ãã¯ã€ã‚¢ãƒ—リケーション レベルã§æŽ’他制御ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。

          +

          注: ã“ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã¯FatFsモジュールãれ自体ã®ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ã‚·ãƒ¼ã«ã¤ã„ã¦èª¬æ˜Žã—ã¦ã„ã¾ã™ã€‚_FS_REENTRANTã¯ã€å„ファイル システム オブジェクトã®æŽ’他制御を行ã†ã®ã¿ã§ã€ä¸‹ä½ã®ãƒ‡ã‚£ã‚¹ã‚¯é–¢æ•°ã¸ã®å†å…¥ã‚’防止ã™ã‚‹ã‚‚ã®ã§ã¯ã‚ã‚Šã¾ã›ã‚“。ãŸã¨ãˆã°ã€ã‚·ãƒ³ã‚°ãƒ« ボリューム構æˆã§ã¯disk_status関数ã®ã¿å†å…¥ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã€ãƒžãƒ«ãƒ ボリューム構æˆã§ã¯ã©ã®ãƒ‡ã‚£ã‚¹ã‚¯é–¢æ•°ã‚‚å†å…¥ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ã‚ˆã†ã«ã€è¤‡æ•°ã®ã‚¿ã‚¹ã‚¯ã‹ã‚‰åŒæ™‚ã«FatFs APIを使ã†æ¡ä»¶ã§ã¯ã€ãƒ‡ã‚£ã‚¹ã‚¯I/Oモジュールã¯ã‚¹ãƒ¬ãƒƒãƒ‰ セーフã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

          -
          +

          多é‡ãƒ•ã‚¡ã‚¤ãƒ« アクセス

          FatFsモジュールã§ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã¯å¤šé‡ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡æ©Ÿèƒ½ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。ファイルã«å¯¾ã™ã‚‹å¤šé‡ã‚¢ã‚¯ã‚»ã‚¹ã¯ã€ãã®ã‚¢ã‚¯ã‚»ã‚¹ モードã«ã‚ˆã£ã¦åˆ¶é™ã•ã‚Œã¾ã™ã€‚一ã¤ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã™ã‚‹å¤šé‡ã‚ªãƒ¼ãƒ—ンã¯ã€ãれらãŒå…¨ã¦ãƒªãƒ¼ãƒ‰ モードã®ã¨ãã«é™ã£ã¦è¨±å¯ã•ã‚Œã¾ã™ã€‚書ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã‚’å«ã‚€å¤šé‡ã‚ªãƒ¼ãƒ—ンã€ã¾ãŸé–‹ã‹ã‚Œã¦ã„るファイルã«å¯¾ã™ã‚‹ãƒªãƒãƒ¼ãƒ ã‚„削除を行ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“。ã•ã‚‚ãªã„ã¨ã€ãã®ãƒœãƒªãƒ¥ãƒ¼ãƒ ã®FAT構造ãŒç ´å£Šã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚

          -

          _FS_LOCKã«1以上ã®å€¤(値ã¯åŒæ™‚ã«ç®¡ç†ã§ãるファイル数)をセットã™ã‚‹ã“ã¨ã§å¤šé‡ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡æ©Ÿèƒ½ãŒæœ‰åŠ¹ã«ãªã‚Šã€ãƒ•ã‚¡ã‚¤ãƒ«å˜ä½ã®ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ã‚’自動ã§è¡Œã†ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã“ã®å ´åˆã€ä¸Šè¨˜ã®ãƒ«ãƒ¼ãƒ«ã‚’ç ´ã£ãŸã‚ªãƒ¼ãƒ—ン・リãƒãƒ¼ãƒ ãƒ»å‰Šé™¤ã‚’試ã¿ã‚‹ã¨ã€ãã®é–¢æ•°ã¯FR_LOCKEDã§å¤±æ•—ã—ã¾ã™ã€‚ã¾ãŸã€_FS_LOCKを越ãˆã‚‹æ•°ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚„サブ ディレクトリをåŒæ™‚ã«ã‚ªãƒ¼ãƒ—ンã—よã†ã¨ã™ã‚‹ã¨ã€FR_TOO_MANY_OPEN_FILESã§å¤±æ•—ã—ã¾ã™ã€‚

          +

          _FS_LOCKã«1以上ã®å€¤(値ã¯åŒæ™‚ã«ç®¡ç†ã§ãるファイル数)をセットã™ã‚‹ã“ã¨ã§å¤šé‡ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡æ©Ÿèƒ½ãŒæœ‰åŠ¹ã«ãªã‚Šã€ãƒ•ã‚¡ã‚¤ãƒ«å˜ä½ã®ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ã‚’自動ã§è¡Œã†ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã“ã®å ´åˆã€ä¸Šè¨˜ã®ãƒ«ãƒ¼ãƒ«ã‚’ç ´ã£ãŸã‚ªãƒ¼ãƒ—ン・リãƒãƒ¼ãƒ ãƒ»å‰Šé™¤ã‚’試ã¿ã‚‹ã¨ã€ãã®é–¢æ•°ã¯FR_LOCKEDã§å¤±æ•—ã—ã¾ã™ã€‚ã¾ãŸã€_FS_LOCKを越ãˆã‚‹æ•°ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚„サブ ディレクトリをåŒæ™‚ã«ã‚ªãƒ¼ãƒ—ンã—よã†ã¨ã™ã‚‹ã¨ã€FR_TOO_MANY_OPEN_FILESã§å¤±æ•—ã—ã¾ã™ã€‚

          -
          +

          効率的ãªãƒ•ã‚¡ã‚¤ãƒ« アクセス

          -

          å°è¦æ¨¡ãªçµ„込システムã§ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®èª­ã¿æ›¸ãã«ãŠã‘る効率ã®è‰¯ã„アクセスã®ãŸã‚ã€ã‚¢ãƒ—リケーション プログラマã¯FatFsモジュールã®ä¸­ã§ã©ã®ã‚ˆã†ãªå‡¦ç†ãŒè¡Œã‚ã‚Œã¦ã„ã‚‹ã‹è€ƒæ…®ã™ã¹ãã§ã™ã€‚ストレージ上ã®ãƒ‡ãƒ¼ã‚¿ã¯f_read()ã«ã‚ˆã‚Šæ¬¡ã®ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã§è»¢é€ã•ã‚Œã¾ã™ã€‚

          +

          å°è¦æ¨¡ãªçµ„込システムã§ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®èª­ã¿æ›¸ãã«ãŠã‘る効率ã®è‰¯ã„アクセスã®ãŸã‚ã€ã‚¢ãƒ—リケーション プログラマã¯FatFsモジュールã®ä¸­ã§ã©ã®ã‚ˆã†ãªå‡¦ç†ãŒè¡Œã‚ã‚Œã¦ã„ã‚‹ã‹è€ƒæ…®ã™ã¹ãã§ã™ã€‚ストレージ上ã®ãƒ‡ãƒ¼ã‚¿ã¯f_read関数ã«ã‚ˆã‚Šæ¬¡ã®ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã§è»¢é€ã•ã‚Œã¾ã™ã€‚

          図1. セクタ ミスアラインド リード (ショート)
          fig.1

          @@ -203,12 +187,12 @@ _FS_LOCK 0 (Disable file lock control)

          図3. セクタ アラインド リード
          fig.3

          -

          ファイルI/Oãƒãƒƒãƒ•ã‚¡ã¯ã‚»ã‚¯ã‚¿ã®ä¸€éƒ¨ã®ãƒ‡ãƒ¼ã‚¿ã‚’読ã¿æ›¸ãã™ã‚‹ãŸã‚ã®ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ã‚’æ„味ã—ã¾ã™ã€‚セクタ ãƒãƒƒãƒ•ã‚¡ã¯ã€ãã‚Œãžã‚Œã®ãƒ•ã‚¡ã‚¤ãƒ« オブジェクト内ã®ãƒ—ライベート セクタ ãƒãƒƒãƒ•ã‚¡ã¾ãŸã¯ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクト内ã®å…±æœ‰ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ã®ã©ã¡ã‚‰ã‹ã§ã™ã€‚ãƒãƒƒãƒ•ã‚¡æ§‹æˆã‚ªãƒ—ションã®_FS_TINYã¯ã€ãƒ‡ãƒ¼ã‚¿è»¢é€ã«ã©ã¡ã‚‰ã‚’使ã†ã‹ã‚’決定ã—ã¾ã™ã€‚タイニー ãƒãƒƒãƒ•ã‚¡(1)ãŒé¸æŠžã•ã‚Œã‚‹ã¨ãƒ‡ãƒ¼ã‚¿ メモリã®æ¶ˆè²»ã¯ãã‚Œãžã‚Œã®ãƒ•ã‚¡ã‚¤ãƒ« オブジェクトã§_MAX_SSãƒã‚¤ãƒˆæ¸›å°‘ã•ã‚Œã¾ã™ã€‚ã“ã®å ´åˆã€FatFsモジュールã¯ãƒ•ã‚¡ã‚¤ãƒ« データã®è»¢é€ã¨FAT/ディレクトリ アクセスã«ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクト内ã®ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ã ã‘を使用ã—ã¾ã™ã€‚タイニー ãƒãƒƒãƒ•ã‚¡ã®æ¬ ç‚¹ã¯ã€ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•ã‚ŒãŸFATデータãŒãƒ•ã‚¡ã‚¤ãƒ« データã®è»¢é€ã«ã‚ˆã‚Šå¤±ã‚ã‚Œã€ã‚¯ãƒ©ã‚¹ã‚¿å¢ƒç•Œã®æ¯Žã«ãƒªãƒ­ãƒ¼ãƒ‰ã•ã‚Œãªã‘ã‚Œã°ãªã‚‰ãªã„ã“ã¨ã§ã™ã€‚ã§ã‚‚ã€æ‚ªããªã„性能ã¨å°‘ãªã„メモリ消費ã®è¦–点ã‹ã‚‰å¤šãã®ã‚¢ãƒ—リケーションã«é©ã™ã‚‹ã§ã—ょã†ã€‚

          -

          図1ã¯ã‚»ã‚¯ã‚¿ã®ä¸€éƒ¨ã®ãƒ‡ãƒ¼ã‚¿ãŒãƒ•ã‚¡ã‚¤ãƒ«I/Oãƒãƒƒãƒ•ã‚¡ã‚’経由ã§è»¢é€ã•ã‚Œã‚‹ã“ã¨ã‚’示ã—ã¾ã™ã€‚図2ã«ç¤ºã•ã‚Œã‚‹é•·ã„データã®è»¢é€ã§ã¯ã€è»¢é€ãƒ‡ãƒ¼ã‚¿ã®ä¸­é–“ã®1セクタã¾ãŸã¯ãれ以上ã®ã‚»ã‚¯ã‚¿ã«ã¾ãŸãŒã‚‹è»¢é€ãƒ‡ãƒ¼ã‚¿ãŒã‚¢ãƒ—リケーション ãƒãƒƒãƒ•ã‚¡ã«ç›´æŽ¥è»¢é€ã•ã‚Œã¦ã„ã¾ã™ã€‚図3ã¯è»¢é€ãƒ‡ãƒ¼ã‚¿å…¨ä½“ãŒã‚»ã‚¯ã‚¿å¢ƒç•Œã«ã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆã•ã‚Œã¦ã„ã‚‹å ´åˆã‚’示ã—ã¦ã„ã¾ã™ã€‚ã“ã®å ´åˆã€ãƒ•ã‚¡ã‚¤ãƒ«I/Oãƒãƒƒãƒ•ã‚¡ã¯ä½¿ç”¨ã•ã‚Œã¾ã›ã‚“。直接転é€ã«ãŠã„ã¦ã¯æœ€å¤§ã®ç¯„囲ã®ã‚»ã‚¯ã‚¿ãŒdisk_read()ã§ä¸€åº¦ã«èª­ã¿è¾¼ã¾ã‚Œã¾ã™ãŒã€ã‚¯ãƒ©ã‚¹ã‚¿å¢ƒç•Œã‚’越ãˆã‚‹ãƒžãƒ«ãƒ セクタ転é€ã¯ãã‚ŒãŒéš£æŽ¥ã§ã‚ã£ã¦ã‚‚è¡Œã‚ã‚Œã¾ã›ã‚“。

          +

          ファイルI/Oãƒãƒƒãƒ•ã‚¡ã¯ã‚»ã‚¯ã‚¿ã®ä¸€éƒ¨ã®ãƒ‡ãƒ¼ã‚¿ã‚’読ã¿æ›¸ãã™ã‚‹ãŸã‚ã®ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ã‚’æ„味ã—ã¾ã™ã€‚セクタ ãƒãƒƒãƒ•ã‚¡ã¯ã€ãã‚Œãžã‚Œã®ãƒ•ã‚¡ã‚¤ãƒ« オブジェクト内ã®ãƒ—ライベート セクタ ãƒãƒƒãƒ•ã‚¡ã¾ãŸã¯ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクト内ã®å…±æœ‰ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ã®ã©ã¡ã‚‰ã‹ã§ã™ã€‚ãƒãƒƒãƒ•ã‚¡æ§‹æˆã‚ªãƒ—ションã®_FS_TINYã¯ã€ãƒ‡ãƒ¼ã‚¿è»¢é€ã«ã©ã¡ã‚‰ã‚’使ã†ã‹ã‚’決定ã—ã¾ã™ã€‚タイニー ãƒãƒƒãƒ•ã‚¡(1)ãŒé¸æŠžã•ã‚Œã‚‹ã¨ãƒ‡ãƒ¼ã‚¿ メモリã®æ¶ˆè²»ã¯ãã‚Œãžã‚Œã®ãƒ•ã‚¡ã‚¤ãƒ« オブジェクトã§_MAX_SSãƒã‚¤ãƒˆæ¸›å°‘ã•ã‚Œã¾ã™ã€‚ã“ã®å ´åˆã€FatFsモジュールã¯ãƒ•ã‚¡ã‚¤ãƒ« データã®è»¢é€ã¨FAT/ディレクトリ アクセスã«ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクト内ã®ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ã ã‘を使用ã—ã¾ã™ã€‚タイニー ãƒãƒƒãƒ•ã‚¡ã®æ¬ ç‚¹ã¯ã€ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•ã‚ŒãŸFATデータãŒãƒ•ã‚¡ã‚¤ãƒ« データã®è»¢é€ã«ã‚ˆã‚Šå¤±ã‚ã‚Œã€ã‚¯ãƒ©ã‚¹ã‚¿å¢ƒç•Œã®æ¯Žã«ãƒªãƒ­ãƒ¼ãƒ‰ã•ã‚Œãªã‘ã‚Œã°ãªã‚‰ãªã„ã“ã¨ã§ã™ã€‚ã§ã‚‚ã€æ‚ªããªã„性能ã¨å°‘ãªã„メモリ消費ã®è¦–点ã‹ã‚‰å¤šãã®ã‚¢ãƒ—リケーションã«é©ã™ã‚‹ã§ã—ょã†ã€‚

          +

          図1ã¯ã‚»ã‚¯ã‚¿ã®ä¸€éƒ¨ã®ãƒ‡ãƒ¼ã‚¿ãŒãƒ•ã‚¡ã‚¤ãƒ«I/Oãƒãƒƒãƒ•ã‚¡ã‚’経由ã§è»¢é€ã•ã‚Œã‚‹ã“ã¨ã‚’示ã—ã¾ã™ã€‚図2ã«ç¤ºã•ã‚Œã‚‹é•·ã„データã®è»¢é€ã§ã¯ã€è»¢é€ãƒ‡ãƒ¼ã‚¿ã®ä¸­é–“ã®1セクタã¾ãŸã¯ãれ以上ã®ã‚»ã‚¯ã‚¿ã«ã¾ãŸãŒã‚‹è»¢é€ãƒ‡ãƒ¼ã‚¿ãŒã‚¢ãƒ—リケーション ãƒãƒƒãƒ•ã‚¡ã«ç›´æŽ¥è»¢é€ã•ã‚Œã¦ã„ã¾ã™ã€‚図3ã¯è»¢é€ãƒ‡ãƒ¼ã‚¿å…¨ä½“ãŒã‚»ã‚¯ã‚¿å¢ƒç•Œã«ã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆã•ã‚Œã¦ã„ã‚‹å ´åˆã‚’示ã—ã¦ã„ã¾ã™ã€‚ã“ã®å ´åˆã€ãƒ•ã‚¡ã‚¤ãƒ«I/Oãƒãƒƒãƒ•ã‚¡ã¯ä½¿ç”¨ã•ã‚Œã¾ã›ã‚“。直接転é€ã«ãŠã„ã¦ã¯æœ€å¤§ã®ç¯„囲ã®ã‚»ã‚¯ã‚¿ãŒdisk_read関数ã§ä¸€åº¦ã«èª­ã¿è¾¼ã¾ã‚Œã¾ã™ãŒã€ã‚¯ãƒ©ã‚¹ã‚¿å¢ƒç•Œã‚’越ãˆã‚‹ãƒžãƒ«ãƒ セクタ転é€ã¯ãã‚ŒãŒéš£æŽ¥ã§ã‚ã£ã¦ã‚‚è¡Œã‚ã‚Œã¾ã›ã‚“。

          ã“ã®ã‚ˆã†ã«ã€ã‚»ã‚¯ã‚¿ã«ã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã®èª­ã¿æ›¸ãã¸ã®é…æ…®ã¯ãƒãƒƒãƒ•ã‚¡çµŒç”±ã®ãƒ‡ãƒ¼ã‚¿è»¢é€ã‚’é¿ã‘ã€èª­ã¿æ›¸ã性能ã¯æ”¹å–„ã•ã‚Œã‚‹ã§ã—ょã†ã€‚ãã®åŠ¹æžœã«åŠ ãˆã€ã‚¿ã‚¤ãƒ‹ãƒ¼æ§‹æˆã§ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•ã‚ŒãŸFATデータãŒãƒ•ã‚¡ã‚¤ãƒ« データã®è»¢é€ã«ã‚ˆã‚Šãƒ•ãƒ©ãƒƒã‚·ãƒ¥ã•ã‚Œãšã€éžã‚¿ã‚¤ãƒ‹ãƒ¼æ§‹æˆã¨åŒã˜æ€§èƒ½ã‚’å°ã•ãªãƒ¡ãƒ¢ãƒª フットプリントã§é”æˆã§ãã¾ã™ã€‚

          -
          +

          フラッシュ メモリã®ç‰¹æ€§ã¸ã®é…æ…®

          HDDãªã©ã®ãƒ‡ã‚£ã‚¹ã‚¯ メディアã¨ã¯ç•°ãªã‚Šã€SDCã‚„CFCãªã©ã®ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ メモリ メディアã®æ€§èƒ½ã‚’引ã出ã™ã«ã¯ã€ãã®ç‰¹æ€§ã‚’æ„è­˜ã—ãŸåˆ¶å¾¡ãŒå¿…è¦ã«ãªã‚Šã¾ã™ã€‚

          マルムセクタ書ãè¾¼ã¿

          @@ -216,12 +200,13 @@ _FS_LOCK 0 (Disable file lock control) 図6. マルãƒ/シングル セクタ ライトã®æ¯”較
          fig.6
          -

          フラッシュ メモリ メディアã®æ›¸ãè¾¼ã¿é€Ÿåº¦ã¯ã‚·ãƒ³ã‚°ãƒ« セクタ書ãè¾¼ã¿ã®æ™‚ã«æœ€ã‚‚低ã„ã‚‚ã®ã«ãªã‚Šã€ä¸€å›žã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã§è»¢é€ã•ã‚Œã‚‹ã‚»ã‚¯ã‚¿æ•°ãŒå¤§ãããªã‚‹ã»ã©æ›¸ãè¾¼ã¿é€Ÿåº¦ã¯å‘上ã—ã¾ã™ã€‚ã“ã®åŠ¹æžœã¯ãƒã‚¹é€Ÿåº¦ãŒé«˜é€Ÿã«ãªã‚‹ã»ã©é¡•è‘—ã§ã€10å€ä»¥ä¸Šã®å·®ãŒç¾ã‚Œã‚‹ã“ã¨ã‚‚çã—ãã‚ã‚Šã¾ã›ã‚“。テストçµæžœã¯ã€ãƒžãƒ«ãƒ セクタ書ãè¾¼ã¿(W:16K, 32 sectors)ãŒã‚·ãƒ³ã‚°ãƒ« セクタ書ãè¾¼ã¿(W:100, 1 sector)よりã©ã®ç¨‹åº¦é€Ÿã„ã‹ã‚’明確ã«ç¤ºã—ã¦ã„ã¾ã™ã€‚大容é‡ãƒ¡ãƒ‡ã‚£ã‚¢ã»ã©ã‚·ãƒ³ã‚°ãƒ« セクタ書ãè¾¼ã¿ãŒé…ããªã‚‹ç‚¹ã‚‚ã¾ãŸé‡è¦ã§ã™ã€‚書ãè¾¼ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®å›žæ•°ã¯ã¾ãŸã€ãƒ¡ãƒ‡ã‚£ã‚¢ã®å¯¿å‘½ã«ã‚‚影響ã—ã¦ãã¾ã™ã€‚ã“ã®ãŸã‚ã€ã‚¢ãƒ—リケーションã¯ãªã‚‹ã¹ã大ããªãƒ–ロック(クラスタ サイズã¾ãŸã¯2ã®ç´¯ä¹—セクタ境界ã«ã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆã—ãŸ)ã§èª­ã¿æ›¸ãã‚’è¡Œã†å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã‚‚ã¡ã‚ã‚“ã€ã‚¢ãƒ—リケーションã‹ã‚‰ãƒ¡ãƒ‡ã‚£ã‚¢ã«è‡³ã‚‹å…¨ã¦ã®ãƒ¬ã‚¤ãƒ¤ãŒãƒžãƒ«ãƒ セクタ転é€ã«å¯¾å¿œã—ã¦ã„ãªã„ã¨æ„味ãŒã‚ã‚Šã¾ã›ã‚“。残念ãªãŒã‚‰ã€æ—¢å­˜ã®ã‚ªãƒ¼ãƒ—ン ソースã®ãƒ‰ãƒ©ã‚¤ãƒã®å¤šãã¯ãƒžãƒ«ãƒ セクタ転é€ã«æœªå¯¾å¿œã§ã™ã€‚ãªãŠã€FatFsモジュールãŠã‚ˆã³ã‚µãƒ³ãƒ—ル ドライãƒã¯ãƒžãƒ«ãƒ セクタ転é€ã«å¯¾å¿œã—ã¦ã„ã¾ã™ã€‚

          +

          フラッシュ メモリ メディアã®æ›¸ãè¾¼ã¿é€Ÿåº¦ã¯ã‚·ãƒ³ã‚°ãƒ« セクタ書ãè¾¼ã¿ã®æ™‚ã«æœ€ã‚‚低ã„ã‚‚ã®ã«ãªã‚Šã€ä¸€å›žã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã§è»¢é€ã•ã‚Œã‚‹ã‚»ã‚¯ã‚¿æ•°ãŒå¤§ãããªã‚‹ã»ã©æ›¸ãè¾¼ã¿é€Ÿåº¦ã¯å‘上ã—ã¾ã™(図6)。ã“ã®åŠ¹æžœã¯ãƒã‚¹é€Ÿåº¦ãŒé«˜é€Ÿã«ãªã‚‹ã»ã©å¤§ããã€10å€ä»¥ä¸Šã®å·®ãŒç¾ã‚Œã‚‹ã“ã¨ã‚‚çã—ãã‚ã‚Šã¾ã›ã‚“。テストçµæžœã¯ã€ãƒžãƒ«ãƒ セクタ書ãè¾¼ã¿(W:16K, 32 sectors)ãŒã‚·ãƒ³ã‚°ãƒ« セクタ書ãè¾¼ã¿(W:100, 1 sector)よりã©ã®ç¨‹åº¦é€Ÿã„ã‹ã‚’明確ã«ç¤ºã—ã¦ã„ã¾ã™ã€‚大容é‡ãƒ¡ãƒ‡ã‚£ã‚¢ã»ã©ã‚·ãƒ³ã‚°ãƒ« セクタ書ãè¾¼ã¿ãŒé…ããªã‚‹ç‚¹ã‚‚ã¾ãŸé‡è¦ã§ã™ã€‚書ãè¾¼ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®å›žæ•°ã¯ã¾ãŸã€ãƒ¡ãƒ‡ã‚£ã‚¢ã®å¯¿å‘½ã«ã‚‚影響ã—ã¦ãã¾ã™ã€‚ã¤ã¾ã‚Šã€åŒã˜é‡ã®ãƒ‡ãƒ¼ã‚¿ã‚’書ã込む場åˆã€å›³6上ã®ã‚·ãƒ³ã‚°ãƒ« セクタ書ãè¾¼ã¿ã¯ã€å›³6下ã®ãƒžãƒ«ãƒ セクタ書ãè¾¼ã¿ã«æ¯”ã¹ã¦16å€æ—©ãフラッシュ メモリ メディアを消耗ã•ã›ã¦ã—ã¾ã†ã¨ã„ã†ã“ã¨ã§ã™ã€‚

          +

          ã“ã®ã‚ˆã†ã«ã€ã‚¢ãƒ—リケーションã¯ãªã‚‹ã¹ã大ããªãƒ–ロック(クラスタ サイズã¾ãŸã¯2ã®ç´¯ä¹—セクタ境界ã«ã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆã—ãŸ)ã§èª­ã¿æ›¸ãã‚’è¡Œã†å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã‚‚ã¡ã‚ã‚“ã€ã‚¢ãƒ—リケーションã‹ã‚‰ãƒ¡ãƒ‡ã‚£ã‚¢ã«è‡³ã‚‹å…¨ã¦ã®ãƒ¬ã‚¤ãƒ¤ãŒãƒžãƒ«ãƒ セクタ転é€ã«å¯¾å¿œã—ã¦ã„ãªã„ã¨æ„味ãŒã‚ã‚Šã¾ã›ã‚“。残念ãªãŒã‚‰ã€æ—¢å­˜ã®ã‚ªãƒ¼ãƒ—ン ソースã®ãƒ‰ãƒ©ã‚¤ãƒã®å¤šãã¯ãƒžãƒ«ãƒ セクタ転é€ã«æœªå¯¾å¿œã§ã™ã€‚ãªãŠã€FatFsモジュールãŠã‚ˆã³ã‚µãƒ³ãƒ—ル ドライãƒã¯ãƒžãƒ«ãƒ セクタ転é€ã«å¯¾å¿œã—ã¦ã„ã¾ã™ã€‚

          明示的ãªãƒ¡ãƒ¢ãƒªæ¶ˆåŽ»

          -

          通常ã®ãƒ•ã‚¡ã‚¤ãƒ«æ¶ˆåŽ»ã§ã¯ã€è¨˜éŒ²ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã«å¯¾ã—ã¦ä½•ã‚‰ã‹ã®åˆ¶å¾¡ãŒè¡Œã‚れるã‚ã‘ã§ã¯ãªãã€å˜ã«FAT上ã«æœªä½¿ç”¨ã‚¯ãƒ©ã‚¹ã‚¿ã¨ã—ã¦è¨˜éŒ²ã•ã‚Œã¦ã„ã‚‹ã ã‘ã§ã™ã€‚ã“ã®ãŸã‚ã€ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ¶ˆåŽ»ã•ã‚ŒãŸã‚ã¨ã‚‚ãれらã¯æœ‰åŠ¹ãªãƒ¡ãƒ¢ãƒª ブロックã¨ã—ã¦ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ メモリ上ã«æ®‹ã‚Šã¾ã™ã€‚ãã“ã§ã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’消去ã™ã‚‹ã¨ãã€å æœ‰ã—ã¦ã„ãŸãƒ‡ãƒ¼ã‚¿ セクタを明示的ã«æ¶ˆåŽ»(ã¤ã¾ã‚Šæœªä½¿ç”¨ãƒ–ロックã«ã™ã‚‹)ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ãƒ¡ãƒ‡ã‚£ã‚¢å†…ã®ç©ºãブロックを増やã™ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€æ¬¡ã«ãã®ãƒ–ロックã«æ›¸ã込むã¨ãã®æ¶ˆåŽ»å‹•ä½œãŒç„¡ããªã‚Šã€æ›¸ãè¾¼ã¿æ€§èƒ½ãŒå‘上ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã¾ãŸã€ã‚¦ã‚§ã‚¢ãƒ¬ãƒ™ãƒªãƒ³ã‚°ã«ä½¿ãˆã‚‹ãƒ–ロックãŒå¢—ãˆã€ãƒ¡ãƒ‡ã‚£ã‚¢ã®è€ä¹…性もå‘上ã™ã‚‹ã‹ã‚‚知れã¾ã›ã‚“。ã“ã®æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹ã«ã¯ã€æ§‹æˆã‚ªãƒ—ションã®_USE_TRIMã«1を設定ã—ã¾ã™ã€‚ã“ã‚Œã¯ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ メモリ メディアã®å†…部動作ã«æœŸå¾…ã—ãŸåˆ¶å¾¡ãªã®ã§ã€åŠ¹æžœãŒã‚ã‚‹ã¨ã¯é™ã‚Šã¾ã›ã‚“。ã¾ãŸã€ãƒ•ã‚¡ã‚¤ãƒ«æ¶ˆåŽ»ã®æ™‚é–“ãŒå»¶ã³ã‚‹ã“ã¨ã‚‚考慮ã«å…¥ã‚Œã‚‹ã¹ãã§ã™ã€‚

          +

          通常ã®ãƒ•ã‚¡ã‚¤ãƒ«æ¶ˆåŽ»ã§ã¯ã€è¨˜éŒ²ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã«å¯¾ã—ã¦ä½•ã‚‰ã‹ã®åˆ¶å¾¡ãŒè¡Œã‚れるã‚ã‘ã§ã¯ãªãã€å˜ã«FAT上ã«æœªä½¿ç”¨ã‚¯ãƒ©ã‚¹ã‚¿ã¨ã—ã¦è¨˜éŒ²ã•ã‚Œã¦ã„ã‚‹ã ã‘ã§ã™ã€‚ã“ã®ãŸã‚ã€ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ¶ˆåŽ»ã•ã‚ŒãŸã‚ã¨ã‚‚ãれらã¯æœ‰åŠ¹ãªãƒ¡ãƒ¢ãƒª ブロックã¨ã—ã¦ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ メモリ上ã«æ®‹ã‚Šã¾ã™ã€‚ãã“ã§ã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’消去ã™ã‚‹ã¨ãã€å æœ‰ã—ã¦ã„ãŸãƒ‡ãƒ¼ã‚¿ セクタを明示的ã«æ¶ˆåŽ»(ã¤ã¾ã‚Šæœªä½¿ç”¨ãƒ–ロックã«ã™ã‚‹)ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ãƒ¡ãƒ‡ã‚£ã‚¢å†…ã®ç©ºãブロックを増やã™ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€æ¬¡ã«ãã®ãƒ–ロックã«æ›¸ã込むã¨ãã®æ¶ˆåŽ»å‹•ä½œãŒç„¡ããªã‚Šã€æ›¸ãè¾¼ã¿æ€§èƒ½ãŒå‘上ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã¾ãŸã€ã‚¦ã‚§ã‚¢ãƒ¬ãƒ™ãƒªãƒ³ã‚°ã«ä½¿ãˆã‚‹ãƒ–ロックãŒå¢—ãˆã€ãƒ¡ãƒ‡ã‚£ã‚¢ã®è€ä¹…性もå‘上ã™ã‚‹ã‹ã‚‚知れã¾ã›ã‚“。ã“ã®æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹ã«ã¯ã€æ§‹æˆã‚ªãƒ—ションã®_USE_TRIMã«1を設定ã—ã¾ã™ã€‚ã“ã‚Œã¯ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ メモリ メディアã®å†…部動作ã«æœŸå¾…ã—ãŸåˆ¶å¾¡ãªã®ã§ã€åŠ¹æžœãŒã‚ã‚‹ã¨ã¯é™ã‚Šã¾ã›ã‚“。ã¾ãŸã€ãƒ•ã‚¡ã‚¤ãƒ«æ¶ˆåŽ»ã®æ™‚é–“ãŒå»¶ã³ã‚‹ã“ã¨ã‚‚考慮ã«å…¥ã‚Œã‚‹ã¹ãã§ã™ã€‚

          -
          +

          クリãƒã‚«ãƒ« セクション

          ストレージ上ã®FAT構造をæ“作ã—ã¦ã„る途中ã§ã€åœé›»ã€ä¸æ­£ãªãƒ¡ãƒ‡ã‚£ã‚¢ã®å–り外ã—ã€å›žå¾©ä¸èƒ½ãªãƒ‡ãƒ¼ã‚¿ エラー等ã®éšœå®³ãŒç™ºç”Ÿã™ã‚‹ã¨ã€å‡¦ç†ãŒä¸­é€”åŠç«¯ãªçŠ¶æ…‹ã§ä¸­æ–­ã•ã‚Œã€ãã®çµæžœã¨ã—ã¦FATボリュームã®æ§‹é€ ãŒç ´å£Šã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚次ã«FatFsモジュールã«ãŠã‘るクリãƒã‚«ãƒ« セクションã¨ã€ãã®é–“ã®éšœå®³ã«ã‚ˆã‚Šèµ·ãã†ã‚‹ã‚¨ãƒ©ãƒ¼ã®çŠ¶æ…‹ã‚’示ã—ã¾ã™ã€‚

          @@ -233,18 +218,18 @@ _FS_LOCK 0 (Disable file lock control) fig.5

          -

          赤ã§ç¤ºã—ãŸã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行中ã«éšœå®³ãŒç™ºç”Ÿã—ãŸå ´åˆã€ã‚¯ãƒ­ã‚¹ リンクãŒç™ºç”Ÿã—ã¦æ“作対象ã®ãƒ•ã‚¡ã‚¤ãƒ« ディレクトリãŒå¤±ã‚れるå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚黄色ã§ç¤ºã—ãŸã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行中ã«éšœå®³ãŒç™ºç”Ÿã—ãŸå ´åˆã€ã¤ãŽã®ã†ã¡ã„ãšã‚Œã‹ã¾ãŸã¯è¤‡æ•°ã®çµæžœãŒç”Ÿã˜ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚

          +

          赤ã§ç¤ºã—ãŸã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行中ã«ä¸­æ–­ãŒç™ºç”Ÿã—ãŸå ´åˆã€ã‚¯ãƒ­ã‚¹ リンクãŒç™ºç”Ÿã—ã¦æ“作中ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚„ディレクトリãŒå¤±ã‚れるå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚黄色ã§ç¤ºã—ãŸã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行中ã«ä¸­æ–­ãŒç™ºç”Ÿã—ãŸå ´åˆã€æ¬¡ã®ã†ã¡ã„ãšã‚Œã‹ã¾ãŸã¯è¤‡æ•°ã®çµæžœãŒç”Ÿã˜ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚

            -
          • 書ãæ›ãˆä¸­ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‡ãƒ¼ã‚¿ãŒç ´å£Šã•ã‚Œã‚‹ã€‚
          • -
          • 追記中ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚ªãƒ¼ãƒ—ンå‰ã®çŠ¶æ…‹ã«æˆ»ã‚‹ã€‚
          • -
          • æ–°è¦ã«ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ãŒæ¶ˆãˆã‚‹ã€‚
          • -
          • æ–°è¦ã¾ãŸã¯ä¸Šæ›¸ãã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã®é•·ã•ãŒã‚¼ãƒ­ã«ãªã£ã¦æ®‹ã‚‹ã€‚
          • -
          • ロストãƒã‚§ãƒ¼ãƒ³ã®ç™ºç”Ÿã«ã‚ˆã‚Šãƒœãƒªãƒ¥ãƒ¼ãƒ ã®åˆ©ç”¨åŠ¹çŽ‡ãŒæ‚ªåŒ–ã™ã‚‹ã€‚
          • +
          • ファイルã®ä¸€éƒ¨ã‚’書ãæ›ãˆä¸­: 書ãæ›ãˆãŒä¸­é€”åŠç«¯ãªçŠ¶æ…‹ã¨ãªã‚Šã€çµæžœãƒ‡ãƒ¼ã‚¿ãŒç ´å£Šã•ã‚Œã‚‹ã€‚
          • +
          • 追記モードã§ãƒ‡ãƒ¼ã‚¿è¨˜éŒ²ä¸­: ファイルãŒè¨˜éŒ²é–‹å§‹ã®å‰ã®çŠ¶æ…‹ã«æˆ»ã‚‹ã€‚
          • +
          • æ–°è¦ä½œæˆã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã«è¨˜éŒ²ä¸­: ãã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ¶ˆãˆã‚‹ã€‚
          • +
          • æ–°è¦ã¾ãŸã¯ä¸Šæ›¸ãã§ä½œæˆã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã«è¨˜éŒ²ä¸­: ファイルã®é•·ã•ãŒã‚¼ãƒ­ã«ãªã£ã¦æ®‹ã‚‹ã€‚
          • +
          • ã“れらã®éšœå®³ã®çµæžœã€ãƒ­ã‚¹ãƒˆ クラスタãŒç™ºç”Ÿã—ã¦ãƒœãƒªãƒ¥ãƒ¼ãƒ ã®åˆ©ç”¨åŠ¹çŽ‡ãŒæ‚ªåŒ–ã™ã‚‹ã€‚
          -

          ã„ãšã‚Œã‚‚書ãè¾¼ã¿ä¸­ã‚„æ“作ã®å¯¾è±¡ã§ãªã„ファイルã«ã¯å½±éŸ¿ã¯ã‚ã‚Šã¾ã›ã‚“。ã“れらã®ã‚¯ãƒªãƒã‚«ãƒ« セクションã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’書ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã§é–‹ã„ã¦ã„る時間を最å°é™ã«ã™ã‚‹ã‹ã€f_sync()ã‚’é©å®œä½¿ç”¨ã™ã‚‹ã“ã¨ã§å›³5ã®ã‚ˆã†ã«ãƒªã‚¹ã‚¯ã‚’最å°åŒ–ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

          +

          ã„ãšã‚Œã®å ´åˆã‚‚æ“作ã®å¯¾è±¡ã§ãªã„ファイルã«ã¯å½±éŸ¿ã¯ã‚ã‚Šã¾ã›ã‚“。ã“れらã®ã‚¯ãƒªãƒã‚«ãƒ« セクションã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’書ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã§é–‹ã„ã¦ã„る時間を最å°é™ã«ã™ã‚‹ã‹ã€f_sync関数をé©å®œä½¿ç”¨ã™ã‚‹ã“ã¨ã§å›³5ã®ã‚ˆã†ã«ãƒªã‚¹ã‚¯ã‚’最å°åŒ–ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

          -
          +

          APIã®æ‹¡å¼µçš„使用例

          FatFs APIã®æ‹¡å¼µçš„使用例ã§ã™ã€‚有用ãªã‚³ãƒ¼ãƒ‰ãŒã‚ã£ãŸå ´åˆã¯ã€éšæ™‚追加ã—ã¦ã„ãã¾ã™ã€‚。

            @@ -256,25 +241,27 @@ _FS_LOCK 0 (Disable file lock control)
          -
          +

          FatFsã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã«ã¤ã„ã¦

          -

          ソース ファイルã®ãƒ˜ãƒƒãƒ€ã«ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ¡ä»¶ãŒè¨˜è¿°ã•ã‚Œã¦ã„ã‚‹ã®ã§ã€åˆ©ç”¨ã®éš›ã¯ãã‚Œã«å¾“ã†ã“ã¨ã€‚英語を読ã‚ãªã„æ–¹ã®ãŸã‚ã«ä»¥ä¸‹ã«æ—¥æœ¬èªžè¨³ã‚’示ã—ã¦ãŠãã¾ã™ã€‚

          -
          /*----------------------------------------------------------------------------/
          -/  FatFs - FAT file system module  R0.10b                   (C)ChaN, 2014
          +

          ソース ファイルã«ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ¡ä»¶ãŒè¨˜è¿°ã•ã‚Œã¦ã„ã‚‹ã®ã§ã€åˆ©ç”¨ã®éš›ã¯ãã‚Œã«å¾“ã†ã“ã¨ã€‚原文ã¯è‹±èªžã§ã™ãŒã€å‚考ã¾ã§ã«ä»¥ä¸‹ã«æ—¥æœ¬èªžè¨³ã‚’示ã—ã¦ãŠãã¾ã™ã€‚

          +
          +/*----------------------------------------------------------------------------/
          +/  FatFs - FAT file system module  R0.11                 (C)ChaN, 2015
           /-----------------------------------------------------------------------------/
          -/ FatFsモジュールã¯ã€å°è¦æ¨¡ãªçµ„ã¿è¾¼ã¿ã‚·ã‚¹ãƒ†ãƒ å‘ã‘ã®æ±Žç”¨FATファイルシステム 
          -/ モジュールã§ã™ã€‚ã“ã‚Œã¯ãƒ•ãƒªãƒ¼ ソフトウェアã¨ã—ã¦ã€æ•™è‚²ãƒ»ç ”究・開発ã®ãŸã‚ã«
          -/ 以下ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ ãƒãƒªã‚·ãƒ¼ã®ä¸‹ã§å…¬é–‹ã•ã‚Œã¦ã„ã¾ã™ã€‚
          +/ FatFsモジュールã¯ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã€æ¬¡ã«ç¤ºã™æ¡ä»¶ã®ä¸‹ã«å…¬é–‹ã•ã‚Œã¦ã„ã¾ã™ã€‚
           /
          -/  Copyright (C) 2014, ChaN, all right reserved.
          +/ Copyright (C) 2015, ChaN, all right reserved.
           /
          -/ * FatFsモジュールã¯ãƒ•ãƒªãƒ¼ ソフトウェアã§ã‚ã‚Šã€ã¾ãŸç„¡ä¿è¨¼ã§ã™ã€‚
          -/ * 用途ã«åˆ¶é™ã¯ã‚ã‚Šã¾ã›ã‚“。ã‚ãªãŸã®è²¬ä»»ã®ä¸‹ã«ãŠã„ã¦ã€å€‹äººçš„・éžå–¶åˆ©çš„ãª
          -/   ã‚‚ã®ã‹ã‚‰å•†ç”¨è£½å“ã®é–‹ç™ºã«åŠã¶ç›®çš„ã«ä½¿ç”¨ãƒ»æ”¹å¤‰ãƒ»å†é…布ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
          -/ * ソース コードをå†é…布ã™ã‚‹ã¨ãã¯ã€ä¸Šè¨˜ã®è‘—作権表示をä¿æŒã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。
          -/
          -/-----------------------------------------------------------------------------/
          -

          è¦ã™ã‚‹ã«FatFsã¯ã‚¿ãƒ€ã§è‡ªç”±ã«ä½¿ãˆã‚‹ã¨ã„ã†ã“ã¨ã§ã™ã€‚ソース コードをå†é…布ã™ã‚‹ã¨ãã¯ã€ã“ã®ãƒ–ロックをãã®ã¾ã¾ä¿æŒã—ã¦ãŠãã“ã¨ã€‚ã“ã®ã‚ˆã†ã«FatFsã¯BSDライクãªãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã¨ã—ã¦ã„ã¾ã™ãŒã€ä¸€ã¤å¤§ããªé•ã„ãŒã‚ã‚Šã¾ã™ã€‚特ã«çµ„ã¿è¾¼ã¿ç”¨é€”ã§ã®åˆ©ç”¨ä¾¡å€¤ã‚’高ã‚ã‚‹ãŸã‚ã€ãƒã‚¤ãƒŠãƒªå½¢å¼(ソース コードをå«ã¾ãªã„å½¢å¼å…¨ã¦)ã§ã®å†é…布ã«ã¤ã„ã¦ã¯ã€æ¡ä»¶ã¯è¨­ã‘ã¦ã„ã¾ã›ã‚“。ãã®å ´åˆã¯ã€FatFsãŠã‚ˆã³ãã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ–‡æ›¸ã«ã¤ã„ã¦ã¯ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«æ˜Žè¨˜ã—ã¦ã‚‚ã—ãªãã¦ã‚‚ã‹ã¾ã„ã¾ã›ã‚“。ã“ã‚Œã¯ã€ä¸€æ¡é …BSDライセンスã¨ç­‰ä¾¡ã¨ã„ã†ã“ã¨ã§ã™ã€‚ã‚‚ã¡ã‚ã‚“GNU GPLプロジェクトã¨ã‚‚共存å¯èƒ½ã§ã™ã€‚何らã‹ã®å¤‰æ›´ã‚’加ãˆã¦å†é…布ã™ã‚‹éš›ã¯ã€çŸ›ç›¾ã—ãªã„ä»–ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹(GNU GPLや修正BSDライセンスãªã©)ã«å¤‰æ›´ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚

          +/ 1. ソースコードã§å†é…布ã™ã‚‹ã¨ãã¯ã€ãã®ä¸­ã«ä¸Šè¨˜ã®è‘—作権表示ã€ã“ã®æ¡æ–‡ã€ãŠã‚ˆã³ +/ 次ã®å…責事項をä¿æŒã™ã‚‹ã“㨠+/ +/ ã“ã®ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ã€è‘—作権者らãŠã‚ˆã³ã‚³ãƒ³ãƒˆãƒªãƒ“ューターらã«ã‚ˆã£ã¦ç¾çŠ¶ã®ã¾ã¾ +/ æä¾›ã•ã‚Œã¦ãŠã‚Šã€ã„ã‹ãªã‚‹ä¿è¨¼ã‚‚ã‚ã‚Šã¾ã›ã‚“。 +/ 著作権者もコントリビューターもã€ã“ã®ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ä½¿ç”¨ã«ã‚ˆã‚Šç™ºç”Ÿã™ã‚‹ã„ã‹ãªã‚‹ +/ æ害ã«ã¤ã„ã¦ã‚‚ã€è²¬ä»»ã‚’è² ã„ã¾ã›ã‚“。 +/----------------------------------------------------------------------------*/ +
          +

          ã“ã®ã‚ˆã†ã«FatFsã¯BSDライクãªãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã¨ã—ã¦ã„ã¾ã™ãŒã€ä¸€ã¤å¤§ããªé•ã„ãŒã‚ã‚Šã¾ã™ã€‚FatFsã¯ä¸»ã«çµ„ã¿è¾¼ã¿å‘ã‘ã¨ã—ã¦é–‹ç™ºã•ã‚ŒãŸãŸã‚ã€ãƒã‚¤ãƒŠãƒªå½¢å¼(ソース コードをå«ã¾ãªã„å½¢å¼å…¨ã¦)ã§ã®å†é…布ã«ã¤ã„ã¦ã¯ã€å•†ç”¨ã§ã®ä½¿ã„ã‚„ã™ã•ã‚’考慮ã—ã¦é…布時ã®æ¡ä»¶ã‚’設ã‘ã¦ã„ã¾ã›ã‚“。ã¤ã¾ã‚Šã€ãƒã‚¤ãƒŠãƒªé…布ã®å ´åˆã¯ã€FatFsãŠã‚ˆã³ãã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ–‡æ›¸ã«ã¤ã„ã¦ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«æ˜Žè¨˜ã—ã¦ã‚‚ã—ãªãã¦ã‚‚ã‹ã¾ã„ã¾ã›ã‚“。ã“ã‚Œã¯ã€ä¸€æ¡é …BSDライセンスã¨ç­‰ä¾¡ã¨ã„ã†ã“ã¨ã§ã™ã€‚ã‚‚ã¡ã‚ã‚“ã€GNU GPLãªã©ã»ã¨ã‚“ã©å…¨ã¦ã®ã‚ªãƒ¼ãƒ—ン ソース ライセンスã®ä¸‹ã®ãƒ—ロジェクトã«ãŠã„ã¦å…±å­˜å¯èƒ½ã§ã™ã€‚FatFsã«ä½•ã‚‰ã‹ã®ä¿®æ­£ã‚„拡張を加ãˆã¦ã‚½ãƒ¼ã‚¹ コードã§å†é…布ã™ã‚‹å ´åˆã¯ã€çŸ›ç›¾ã—ãªã„ä»–ã®ã‚ªãƒ¼ãƒ—ン ソース ライセンス(GNU GPLや修正BSDライセンスãªã©)ã«å¤‰æ›´ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚

          戻る

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/close.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/close.html index 71d3c01b..f9c4c276 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/close.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/close.html @@ -36,7 +36,6 @@ FRESULT f_close ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/config.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/config.html new file mode 100644 index 00000000..2b059d29 --- /dev/null +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/config.html @@ -0,0 +1,225 @@ + + + + + + + + + +FatFs - 構æˆã‚ªãƒ—ション + + + +

          構æˆã‚ªãƒ—ション

          +

          FatFsã«ã¯å¤šãã®æ§‹æˆã‚ªãƒ—ションãŒã‚ã‚Šã€ãã‚Œãžã‚Œã®ãƒ—ロジェクトã®è¦æ±‚ã«å¿œã˜ã¦æŸ”軟ã«æ©Ÿèƒ½ã‚’構æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚構æˆã‚ªãƒ—ションã¯ã€ffconf.hã«è¨˜è¿°ã•ã‚Œã¾ã™ã€‚

          + +
          +

          基本機能ã®è¨­å®š

          + +

          _FS_READONLY

          +

          0:リード/ライト or 1:リード オンリ。リード オンリ構æˆã§ã¯ã€f_writeã€f_syncã€f_unlinkã€f_mkdirã€f_chmodã€f_renameã€f_truncateã€f_getfreeã®åŸºæœ¬API関数ãŠã‚ˆã³ã‚ªãƒ—ションã®æ›¸ãè¾¼ã¿ç³»API関数ãŒå‰Šé™¤ã•ã‚Œã¾ã™ã€‚

          + +

          _FS_MINIMIZE

          +

          基本API関数を段階的ã«å‰Šé™¤ã—ã¾ã™ã€‚

          + + + + + + +
          値解説
          0å…¨ã¦ã®åŸºæœ¬API関数ãŒåˆ©ç”¨å¯èƒ½ã€‚
          1f_statã€f_getfreeã€f_unlinkã€f_mkdirã€f_chmodã€f_utimeã€f_truncateã€f_rename関数ãŒå‰Šé™¤ã•ã‚Œã‚‹ã€‚
          21ã«åŠ ãˆã€f_opendirã€f_readdirã€f_closedir関数ãŒå‰Šé™¤ã•ã‚Œã‚‹ã€‚
          32ã«åŠ ãˆã€f_lseek関数ãŒå‰Šé™¤ã•ã‚Œã‚‹ã€‚
          + +

          _USE_STRFUNC

          +

          文字列入出力API関数f_gets, f_putc, f_puts and f_printfã®æ§‹æˆã€‚

          + + + + + +
          値解説
          0文字列入出力API関数を使用ã—ãªã„。
          1文字列入出力API関数を使用ã™ã‚‹ã€‚データã®LF-CRLF変æ›ã¯ã—ãªã„。
          2文字列入出力API関数を使用ã™ã‚‹ã€‚データã®LF-CRLF変æ›ã‚’ã™ã‚‹ã€‚
          + +

          _USE_FIND

          +

          フィルタ付ãディレクトリ読ã¿å‡ºã—機能ã®æ§‹æˆ(0:無効 ã¾ãŸã¯ 1:有効)。有効ã«ã™ã‚‹ã¨ã€f_findfirstã€f_findnext関数ãŒåˆ©ç”¨å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚

          + +

          _USE_MKFS

          +

          ボリューム作æˆæ©Ÿèƒ½ã®æ§‹æˆ(0:無効 ã¾ãŸã¯ 1:有効)。有効ã«ã™ã‚‹ã¨f_mkfs関数ãŒåˆ©ç”¨å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚

          + +

          _USE_FASTSEEK

          +

          高速シーク機能ã®æ§‹æˆ(0:無効 ã¾ãŸã¯ 1:有効)。有効ã«ã™ã‚‹ã¨ã€f_lseekã€f_readã€f_write関数ã®é«˜é€ŸåŒ–モードãŒåˆ©ç”¨å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚詳ã—ãã¯ã€ã“ã¡ã‚‰ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

          + +

          _USE_LABEL

          +

          ボリューム ラベルæ“作機能ã®æ§‹æˆ(0:無効 ã¾ãŸã¯ 1:有効)。有効ã«ã™ã‚‹ã¨ã€f_getlabelã€f_setlabel関数ãŒåˆ©ç”¨å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚

          + +

          _USE_FORWARD

          +

          ストリーミング読ã¿å‡ºã—機能ã®æ§‹æˆ(0:無効 ã¾ãŸã¯ 1:有効)。ã“ã‚Œã¨_FS_TINYを有効ã«ã™ã‚‹ã¨ã€f_forward関数ãŒåˆ©ç”¨å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚

          + +
          + + +
          +

          åå‰ç©ºé–“ã¨ãƒ­ã‚±ãƒ¼ãƒ«ã®è¨­å®š

          + +

          _CODE_PAGE

          +

          パスåç­‰ã®æ–‡å­—列データã®ã‚³ãƒ¼ãƒ‰ ページを指定ã—ã¾ã™ã€‚ä¸é©åˆ‡ãªè¨­å®šã¯ã€ãƒ•ã‚¡ã‚¤ãƒ« オープン エラーã®åŽŸå› ã«ãªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚拡張文字ãŒå…¨ã使ã‚ã‚Œãªã„å ´åˆã¯ã€ã©ã‚Œã‚’é¸ã‚“ã§ã‚‚åŒã˜ã§ã™ã€‚

          + + + + + + + + + + + + + + + + + + + + + + + + +
          値解説
          1ASCII (éžLFN構æˆã§ã®ã¿æœ‰åŠ¹)
          437U.S.
          720Arabic
          737Greek
          771KBL
          775Baltic
          850Latin 1
          852Latin 2
          855Cyrillic
          857Turkish
          860Portuguese
          861Icelandic
          862Hebrew
          863Canadian French
          864Arabic
          865Nordic
          866Russian
          869Greek 2
          932日本語 (DBCS)
          936簡体字中国語 (DBCS)
          949韓国語 (DBCS)
          950ç¹ä½“字中国語 (DBCS)
          + +

          _USE_LFN

          +

          LFN(é•·ã„ファイルå)対応を設定ã—ã¾ã™ã€‚LFN機能を有効ã«ã™ã‚‹ã¨ãã¯ã€Unicodeæ“作関数option/unicode.cをプロジェクトã«åŠ ãˆã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã¾ãŸã€LFNæ“作ãƒãƒƒãƒ•ã‚¡((_MAX_LFN + 1) * 2ãƒã‚¤ãƒˆã‚’å æœ‰)を使用ã—ã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡ã‚’スタックã«ç¢ºä¿ã™ã‚‹ã¨ãã¯ã€ã‚¹ã‚¿ãƒƒã‚¯ オームフローã«æ³¨æ„ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ヒープã«ç¢ºä¿ã™ã‚‹ã¨ãã¯ã€ãƒ¡ãƒ¢ãƒªæ“作関数ã€ff_memallocã¨ff_memfree(option/syscall.cã«ã‚µãƒ³ãƒ—ルã‚ã‚Š)ã€ã‚’プロジェクトã«åŠ ãˆã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

          + + + + + + +
          値解説
          0LFN機能を使ã‚ãªã„。8.3å½¢å¼ã®åå‰ã®ã¿ä½¿ç”¨å¯èƒ½ã€‚
          1LFN機能を使ã†ã€‚LFNæ“作ãƒãƒƒãƒ•ã‚¡ã¯é™çš„ã«ç¢ºä¿ã€‚常ã«ã‚¹ãƒ¬ãƒƒãƒ‰ セーフã§ã¯ãªã„。
          2LFN機能を使ã†ã€‚LFNæ“作ãƒãƒƒãƒ•ã‚¡ã¯ã‚¹ã‚¿ãƒƒã‚¯ã‹ã‚‰ç¢ºä¿ã€‚
          3LFN機能を使ã†ã€‚LFNæ“作ãƒãƒƒãƒ•ã‚¡ã¯ãƒ’ープã‹ã‚‰ç¢ºä¿ã€‚
          + +

          _MAX_LFN

          +

          LFNæ“作ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’文字å˜ä½ã§æŒ‡å®š(12~255)ã—ã¾ã™ã€‚LFN機能ãŒç„¡åŠ¹ã®ã¨ãã¯æ„味をæŒã¡ã¾ã›ã‚“。

          + +

          _LFN_UNICODE

          +

          ファイルAPI上ã«ãŠã‘ã‚‹Unicode対応機能を設定ã—ã¾ã™ã€‚éžLFN構æˆã®ã¨ãã¯ã€0ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。LFN構æˆã®ã¨ãã«1ã‚’é¸æŠžã™ã‚‹ã¨ã€ãƒ•ã‚¡ã‚¤ãƒ«API上ã®æ–‡å­—列データTCHARåž‹ã®å®šç¾©ãŒåˆ‡ã‚Šæ›¿ã‚ã‚Šã€ãƒ‘スåç­‰ã«Unicodeを使用ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯ã€æ–‡å­—列入出力関数ã«ã‚‚影響ã—ã¾ã™ã€‚詳ã—ãã¯ã€ã“ã¡ã‚‰ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

          + +

          _STRF_ENCODE

          +

          Unicode API構æˆã®ã¨ãã€æ–‡å­—列入出力関数ã€f_getsã€f_putcã€f_putsã€f_printfã€ã«ãŠã‘るファイル上ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã‚’指定ã—ã¾ã™ã€‚éžUnicode API構æˆã®ã¨ãã¯æ„味をæŒã¡ã¾ã›ã‚“。

          + + + + + + +
          値解説
          0ANSI/OEM
          1UTF-16LE
          2UTF-16BE
          3UTF-8
          + +

          _FS_RPATH

          +

          相対パス機能を設定ã—ã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªèª­ã¿å‡ºã—関数ã®å‡ºåŠ›ã«ã‚‚影響ã—ã¾ã™ã€‚詳ã—ãã¯ã€ã“ã¡ã‚‰ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

          + + + + + +
          値解説
          0相対パス機能を使ã‚ãªã„。パスåã¯å¸¸ã«ãƒ«ãƒ¼ãƒˆ ディレクトリã‹ã‚‰è¾¿ã‚‹ã€‚
          1相対パス機能を使ã†ã€‚f_chdirã€f_chdrive関数ãŒåˆ©ç”¨å¯èƒ½ã«ãªã‚‹ã€‚
          21ã«åŠ ãˆã€f_getcwd関数ãŒåˆ©ç”¨å¯èƒ½ã«ãªã‚‹ã€‚
          + +
          + + +
          +

          ボリューム/物ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®è¨­å®š

          + +

          _VOLUMES

          +

          利用ã™ã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ (è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–)ã®æ•°ã‚’1~9ã®ç¯„囲ã§è¨­å®šã—ã¾ã™ã€‚

          + +

          _STR_VOLUME_ID

          +

          文字列ボリュームIDã®è¨­å®š(0:無効 ã¾ãŸã¯ 1:有効)。パスå中ã®ãƒœãƒªãƒ¥ãƒ¼ãƒ IDã«æ•°å­—ã«åŠ ãˆä»»æ„ã®æ–‡å­—列も使用ã§ãるよã†ã«ã™ã‚‹ã‚ªãƒ—ションã§ã™ã€‚ボリュームID文字列ã¯_VOLUME_STRSã§å®šç¾©ã—ã¾ã™ã€‚

          + +

          _VOLUME_STRS

          +

          ボリュームID文字列を定義ã—ã¾ã™ã€‚_VOLUMESã§è¨­å®šã•ã‚ŒãŸå€‹æ•°ã®æ–‡å­—列を"RAM","SD","CF",... ã®ã‚ˆã†ã«æŒ™åˆ—ã—ã¾ã™ã€‚使用å¯èƒ½ãªæ–‡å­—ã¯A~ZãŠã‚ˆã³0~9ã§ã€å…ˆé ­ã®é …ç›®ãŒè«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–0ã«å¯¾å¿œã—ã¾ã™ã€‚

          + +

          _MULTI_PARTITION

          +

          マルãƒåŒºç”»æ©Ÿèƒ½ã®è¨­å®š(0:無効 ã¾ãŸã¯ 1:有効)。無効ã®ã¨ãã¯ã€å€‹ã€…ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã¯åŒã˜ç•ªå·ã®ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«1:1ã§å¯¾å¿œã—ã€ãã‚Œãžã‚Œã®ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–中ã®æœ€åˆã®åŒºç”»ã«çµã³ã¤ã‘られã¾ã™ã€‚マルãƒåŒºç”»æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹ã¨ã€è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã¯ãã‚Œãžã‚Œä»»æ„ã®ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®ä»»æ„ã®åŒºç”»ã«çµã³ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚マッピングã¯ã€ãƒ¦ãƒ¼ã‚¶å®šç¾©ã®å¤‰æ›ãƒ†ãƒ¼ãƒ–ルVolToPart[]ã«ã‚ˆã£ã¦è¡Œã„ã¾ã™ã€‚ã¾ãŸã€f_fdisk関数ãŒåˆ©ç”¨å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚詳ã—ãã¯ã€ã“ã¡ã‚‰ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

          + +

          _MIN_SSã€_MAX_SS

          +

          使用ã™ã‚‹ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®ã‚»ã‚¯ã‚¿ サイズ(データã®èª­ã¿æ›¸ãã®æœ€å°å˜ä½)を設定ã—ã¾ã™ã€‚有効ãªå€¤ã¯ã€512ã€1024ã€2048ã€4096ã§ã™ã€‚_MIN_SSã¯æœ€å°ã‚µã‚¤ã‚ºã€_MAX_SSã¯æœ€å¤§ã‚µã‚¤ã‚ºã‚’設定ã—ã¾ã™ã€‚メモリ カードやãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã§ã¯ã€å¸¸ã«ä¸¡æ–¹ã«512を設定ã—ã¾ã™ãŒã€ã‚ªãƒ³ãƒœãƒ¼ãƒ‰ メモリや一部ã®å…‰å­¦ãƒ¡ãƒ‡ã‚£ã‚¢ã§ã¯å¤§ããªå€¤ã‚’設定ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚知れã¾ã›ã‚“。_MAX_SS > _MIN_SSã«è¨­å®šã—ãŸã¨ãã¯å¯å¤‰ã‚»ã‚¯ã‚¿ サイズ構æˆã¨ãªã‚Šã€disk_ioctl関数ã«ã¯GET_SECTOR_SIZEコマンドを実装ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

          + +

          _USE_TRIM

          +

          ATA-TRIM機能ã®ä½¿ç”¨ã®è¨­å®š(0:無効 ã¾ãŸã¯ 1:有効)。ã“ã®æ©Ÿèƒ½ã‚’有効ã«ã—ãŸã¨ãã¯ã€disk_ioctl関数ã«CTRL_TRIMコマンドを実装ã™ã‚‹ã¹ãã§ã™ã€‚

          + +

          _FS_NOFSINFO

          +

          FAT32ボリュームã®FSINFOã®ä½¿ç”¨ã®è¨­å®š(0~3)。FAT32ボリュームã§å¿…ãšæ­£ç¢ºãªç©ºã容é‡ã‚’å–å¾—ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã¨ãã€è¨­å®šå€¤ã®ãƒ“ット0をセットã™ã‚‹ã¨f_getfree関数ã¯FSINFOã®æƒ…報を使ã‚ãšã«å…¨FATスキャンを行ã£ã¦ç©ºã容é‡ã‚’å¾—ã¾ã™ã€‚ビット1ã¯æœ€çµ‚割り当ã¦ã‚¯ãƒ©ã‚¹ã‚¿ç•ªå·ã®åˆ©ç”¨ã®åˆ¶å¾¡ã§ã™ã€‚

          + + + + + + +
          値解説
          bit0=0FSINFOã®ç©ºãクラスタ情報ãŒæœ‰åŠ¹ãªã¨ãã¯ãれを利用ã™ã‚‹ã€‚
          bit0=1FSINFOã®ç©ºãクラスタ情報を利用ã—ãªã„。
          bit1=0FSINFOã®æœ€çµ‚割り当ã¦ã‚¯ãƒ©ã‚¹ã‚¿ç•ªå·ãŒæœ‰åŠ¹ãªã¨ãã¯ãれを利用ã™ã‚‹ã€‚
          bit1=1FSINFOã®æœ€çµ‚割り当ã¦ã‚¯ãƒ©ã‚¹ã‚¿ç•ªå·ã‚’利用ã—ãªã„。
          + +
          + + +
          +

          システムã®è¨­å®š

          + +

          _FS_TINY

          +

          ファイル データ転é€ãƒãƒƒãƒ•ã‚¡ã®æ§‹æˆ(0:ノーマル ã¾ãŸã¯ 1:タイニ)。タイニ構æˆã§ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ« オブジェクトFIL内ã®ãƒ—ライベート セクタ ãƒãƒƒãƒ•ã‚¡ãŒå‰Šé™¤ã•ã‚Œã€_MAX_SSãƒã‚¤ãƒˆå°ã•ããªã‚Šã¾ã™ã€‚ファイル データã®è»¢é€ã«ã¯ã€ä»£ã‚ã‚Šã«ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトFATFS内ã®ãƒœãƒªãƒ¥ãƒ¼ãƒ å…±æœ‰ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ãŒä½¿ã‚ã‚Œã¾ã™ã€‚

          + +

          _FS_NORTC

          +

          RTC機能ã®ä½¿ç”¨ã®è¨­å®š(0:使用ã™ã‚‹ ã¾ãŸã¯ 1:使用ã—ãªã„)。システムãŒRTC(カレンダ時計)をサãƒãƒ¼ãƒˆã—ãªã„å ´åˆã¯ã€1をセットã—ã¾ã™ã€‚ã“ã®å ´åˆã€FatFsãŒå¤‰æ›´ã‚’加ãˆãŸã‚ªãƒ–ジェクトã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æ—¥æ™‚ã‚’æŒã¡ã¾ã™ã€‚RTCãŒä½¿ç”¨å¯èƒ½ãªã¨ãã¯ã€0を設定ã—ã€get_fattime関数をプロジェクトã«åŠ ãˆã¾ã™ã€‚リード オンリ構æˆã§ã¯ã“ã®ã‚ªãƒ—ションã¯æ„味をæŒã¡ã¾ã›ã‚“。

          + +

          _NORTC_MONã€_NORTC_MDAYã€_NORTC_YEAR

          +

          デフォルト日時ã®è¨­å®šã€‚_FS_NORTCãŒ1ã®ã¨ãã€å›ºå®šã—ã¦ä¸Žãˆã‚‰ã‚Œã‚‹æ—¥ä»˜ã‚’指定ã—ã¾ã™ã€‚_FS_NORTCãŒ0ã®ã¨ãã€ãŠã‚ˆã³ãƒªãƒ¼ãƒ‰ オンリ構æˆã§ã¯ã“れらã®ã‚ªãƒ—ションã¯æ„味をæŒã¡ã¾ã›ã‚“。

          + +

          _FS_LOCK

          +

          ファイル ロック機能ã®è¨­å®šã€‚ã“ã®ã‚ªãƒ—ションã¯ã€é–‹ã‹ã‚ŒãŸã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹ä¸æ­£ãªæ“作ã®åˆ¶å¾¡æ©Ÿèƒ½ã‚’設定ã—ã¾ã™ã€‚リード オンリ構æˆã§ã¯0ã«è¨­å®šã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。ãªãŠã€ãƒ•ã‚¡ã‚¤ãƒ« ロック機能ã¯ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ã‚·ãƒ¼ã¨ã¯é–¢ä¿‚ã‚ã‚Šã¾ã›ã‚“。

          + + + + + +
          値解説
          0ファイル ロック機能を使ã‚ãªã„。ボリュームã®ç ´æを防ããŸã‚ã€ã‚¢ãƒ—リケーションã¯ä¸æ­£ãªãƒ•ã‚¡ã‚¤ãƒ«æ“作をé¿ã‘ãªã‘ã‚Œã°ãªã‚‰ãªã„。
          >0ファイル ロック機能を使ã†ã€‚数値ã¯åŒæ™‚ã«ã‚ªãƒ¼ãƒ—ンã§ãるファイルやサブ ディレクトリã®æ•°ã‚’設定ã—ã¾ã™ã€‚
          + +

          _FS_REENTRANT

          +

          リエントランシーã®è¨­å®š(0:無効 ã¾ãŸã¯ 1:有効)。ã“ã®ã‚ªãƒ—ションã¯ã€FatFsモジュール自体ã®ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ã‚·ãƒ¼(スレッド セーフ)ã®è¨­å®šã‚’ã—ã¾ã™ã€‚ç•°ãªã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ ã«å¯¾ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ« アクセスã¯ã“ã®ã‚ªãƒ—ションã«é–¢ä¿‚ãªã常ã«ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆã§ã€f_mountã€f_mkfsã€f_fdiskãªã©ã®ãƒœãƒªãƒ¥ãƒ¼ãƒ æ“作関数ã¯ã“ã®ã‚ªãƒ—ションã«é–¢ä¿‚ãªã常ã«ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆã§ã¯ã‚ã‚Šã¾ã›ã‚“。åŒã˜ãƒœãƒªãƒ¥ãƒ¼ãƒ ã«å¯¾ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ« アクセス(ã¤ã¾ã‚Šã€ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã®æŽ’他使用)ã®ã¿ãŒã“ã®ã‚ªãƒ—ションã®åˆ¶å¾¡ä¸‹ã«ã‚ã‚Šã¾ã™ã€‚ã“ã®ã‚ªãƒ—ションを有効ã«ã—ãŸã¨ãã¯ã€åŒæœŸé–¢æ•°ã§ã‚ã‚‹ff_req_grantã€ff_rel_grantã€ff_del_syncobjã€ff_cre_syncobjをプロジェクトã«è¿½åŠ ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚サンプルãŒoption/syscall.cã«ã‚ã‚Šã¾ã™ã€‚

          + +

          _FS_TIMEOUT

          +

          タイムアウト時間ã®è¨­å®šã€‚å¾…ã¡åˆã‚ã›æ™‚é–“ãŒé•·ã„ã¨ãã«FR_TIMEOUTã§ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ã‚’アボートã™ã‚‹æ™‚間を設定ã—ã¾ã™ã€‚_FS_REENTRANTãŒ0ã®ã¨ãã¯æ„味をæŒã¡ã¾ã›ã‚“。

          + +

          _SYNC_t

          +

          O/S定義ã®åŒæœŸã‚ªãƒ–ジェクトã®åž‹ã‚’設定ã—ã¾ã™ã€‚例: HANDLEã€IDã€OS_EVENT*ã€SemaphoreHandle_tãªã©ã€‚ã¾ãŸã€O/S機能ã®ãƒ˜ãƒƒãƒ€ ファイルをff.cã®ã‚¹ã‚³ãƒ¼ãƒ—内ã«ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚_FS_REENTRANTãŒ0ã®ã¨ãã¯æ„味をæŒã¡ã¾ã›ã‚“。

          + +

          _WORD_ACCESS

          +

          ボリューム上ã®ãƒ¯ãƒ¼ãƒ‰ データã¸ã®ã‚¢ã‚¯ã‚»ã‚¹æ–¹æ³•ã‚’設定ã—ã¾ã™ã€‚唯一ã®ãƒ—ラットフォームä¾å­˜ã‚ªãƒ—ションã§ã™ã€‚

          + + + + +
          値解説
          0Byte-by-byteアクセス。全ã¦ã®ãƒ—ラットフォームã§ã‚³ãƒ³ãƒ‘ãƒãƒ–ル。
          1ワード アクセス。コード サイズãŒå°‘ã—減るãŒã€æ¬¡ã®æ¡ä»¶ã‚’å…±ã«æº€ãŸã—ã¦ã„ãªã„é™ã‚Šé¸æŠžã§ããªã„。
          +・éžã‚¢ãƒ©ã‚¤ãƒ³ メモリ アクセスãŒå¸¸ã«å…¨ã¦ã®å‘½ä»¤ã§ä½¿ç”¨å¯èƒ½ã€‚
          +・メモリ上ã®ãƒã‚¤ãƒˆé †ãŒãƒªãƒˆãƒ« エンディアン。
          +

          次ã«ã„ãã¤ã‹ã®ãƒ—ロセッサã«ãŠã‘る許å¯ã•ã‚ŒãŸè¨­å®šã‚’示ã—ã¾ã™ã€‚

          +
          +   ARM7TDMI   0   *2          ColdFire   0    *1         V850E      0    *2
          +   Cortex-M3  0   *3          Z80        0/1             V850ES     0/1
          +   Cortex-M0  0   *2          x86        0/1             TLCS-870   0/1
          +   AVR        0/1             RX600(LE)  0/1             TLCS-900   0/1
          +   AVR32      0   *1          RL78       0    *2         R32C       0    *2
          +   PIC18      0/1             SH-2       0    *1         M16C       0/1
          +   PIC24      0   *2          H8S        0    *1         MSP430     0    *2
          +   PIC32      0   *1          H8/300H    0    *1         8051       0/1
          +
          +   *1:ビッグ エンディアン
          +   *2:éžã‚¢ãƒ©ã‚¤ãƒ³ メモリ アクセスä¸å¯
          +   *3:ã„ãã¤ã‹ã®ã‚³ãƒ³ãƒ‘イラãŒmem_cpy関数ã«LDM/STM命令を生æˆã™ã‚‹
          +
          + +
          + +

          戻る

          + + diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/dinit.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/dinit.html index 63291503..68f4cc3f 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/dinit.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/dinit.html @@ -32,13 +32,13 @@ DSTATUS disk_initialize (

          戻り値

          -

          ã“ã®é–¢æ•°ã¯æˆ»ã‚Šå€¤ã¨ã—ã¦ãƒ‡ã‚£ã‚¹ã‚¯ ステータスを返ã—ã¾ã™ã€‚ディスク ステータスã®è©³ç´°ã«é–¢ã—ã¦ã¯disk_status()ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

          +

          ã“ã®é–¢æ•°ã¯æˆ»ã‚Šå€¤ã¨ã—ã¦ãƒ‡ã‚£ã‚¹ã‚¯ ステータスを返ã—ã¾ã™ã€‚ディスク ステータスã®è©³ç´°ã«é–¢ã—ã¦ã¯disk_status関数をå‚ç…§ã—ã¦ãã ã•ã„。

          解説

          ストレージ デãƒã‚¤ã‚¹ã‚’åˆæœŸåŒ–ã—ã€ãƒ‡ãƒ¼ã‚¿ã®èª­ã¿æ›¸ããªã©å…¨ã¦ã®å‹•ä½œãŒå¯èƒ½ãªçŠ¶æ…‹ã«ã—ã¾ã™ã€‚関数ãŒæˆåŠŸã™ã‚‹ã¨ã€æˆ»ã‚Šå€¤ã®STA_NOINITフラグãŒã‚¯ãƒªã‚¢ã•ã‚Œã¾ã™ã€‚

          -

          アプリケーションã‹ã‚‰ã¯ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¦ã¯ãªã‚Šã¾ã›ã‚“。ã•ã‚‚ãªã„ã¨ã€FATボリュームãŒç ´å£Šã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚エラー等ã«ã‚ˆã‚Šå†åˆæœŸåŒ–ãŒå¿…è¦ãªã¨ãã¯ã€f_mount()を使用ã—ã¦ãã ã•ã„。FatFsモジュールã¯ã€è‡ªå‹•ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œã«ã‚ˆã‚Šã€å¿…è¦ã«å¿œã˜ã¦ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¾ã™ã€‚

          +

          ã“ã®é–¢æ•°ã¯FatFsã®ç®¡ç†ä¸‹ã«ã‚ã‚Šã€è‡ªå‹•ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œã«ã‚ˆã‚Šå¿…è¦ã«å¿œã˜ã¦å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚アプリケーションã‹ã‚‰ã¯ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¦ã¯ãªã‚Šã¾ã›ã‚“。ã•ã‚‚ãªã„ã¨ã€FATボリュームãŒç ´å£Šã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚å†åˆæœŸåŒ–ãŒå¿…è¦ãªã¨ãã¯ã€f_mount関数を使用ã—ã¦ãã ã•ã„。

          戻る

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/dioctl.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/dioctl.html index 120d7984..f5715a7b 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/dioctl.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/dioctl.html @@ -27,7 +27,7 @@ DRESULT disk_ioctl (

          引数

          pdrv
          -
          対象ã®ãƒ‡ãƒã‚¤ã‚¹ã‚’示ã™ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·(0-9)ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚
          +
          対象ã®ãƒ‡ãƒã‚¤ã‚¹ã‚’識別ã™ã‚‹ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·(0-9)ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚
          cmd
          制御コマンド コードãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚
          buff
          @@ -55,10 +55,10 @@ DRESULT disk_ioctl ( - - - - + + + +
          標準ioctlコマンド
          コマンド解説
          CTRL_SYNCデãƒã‚¤ã‚¹ã®ãƒ‡ãƒ¼ã‚¿æ›¸ãè¾¼ã¿å‡¦ç†ã‚’完了ã•ã›ã¾ã™ã€‚ドライãƒãŒãƒ©ã‚¤ãƒˆ ãƒãƒƒã‚¯ キャッシュãªã©ã‚’æŒã£ã¦ã„ã‚‹å ´åˆã¯ã€æ›¸ãè¾¼ã¾ã‚Œã¦ã„ãªã„データをå³æ™‚書ãè¾¼ã¿ã¾ã™ã€‚メディア上ã¸ã®æ›¸ãè¾¼ã¿ãŒãã‚Œãžã‚Œdisk_write()ã®ä¸­ã§å®Œäº†ã™ã‚‹å ´åˆã¯ã€ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«å¯¾ã—ã¦ã™ã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。
          GET_SECTOR_COUNTç·ã‚»ã‚¯ã‚¿æ•°ã®å–得。buffã®æŒ‡ã™DWORD型変数ã«ãƒ‰ãƒ©ã‚¤ãƒ–上ã®ç·ã‚»ã‚¯ã‚¿æ•°ã‚’è¿”ã—ã¾ã™ã€‚f_mkfs()ãŠã‚ˆã³f_fdisk()内ã‹ã‚‰å‘¼ã³å‡ºã•ã‚Œã€ä½œæˆã™ã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ ã®ã‚µã‚¤ã‚ºã‚’決定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚
          GET_SECTOR_SIZEセクタ サイズã®å–得。buffã®æŒ‡ã™WORD型変数ã«ãƒ‰ãƒ©ã‚¤ãƒ–ã®ã‚»ã‚¯ã‚¿ サイズを返ã—ã¾ã™ã€‚有効値ã¯512ã€1024ã€2048ã¾ãŸã¯4096ã§ã™ã€‚セクタ サイズãŒå›ºå®š(_MAX_SS ==_MIN_SS)ã®ã¨ãã¯ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ä½¿ã‚れるã“ã¨ã¯ãªãã€ãƒ‡ãƒã‚¤ã‚¹ã¯å¸¸ã«ãã®ã‚»ã‚¯ã‚¿ サイズã§å‹•ä½œã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。
          GET_BLOCK_SIZE消去ブロック サイズã®å–得。buffã®æŒ‡ã™DWORD型変数ã«ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ メモリã®æ¶ˆåŽ»ãƒ–ロック サイズ(セクタå˜ä½)ã‚’è¿”ã—ã¾ã™ã€‚1ã‹ã‚‰32768ã®ç¯„囲ã§2ã®ç´¯ä¹—ã®å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。ブロック サイズä¸æ˜Žã¾ãŸã¯ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ メモリ以外ã®ãƒ‡ãƒã‚¤ã‚¹ã§ã¯1ã‚’è¿”ã—ã¾ã™ã€‚f_mkfs()内ã§ã®ã¿ä½¿ç”¨ã•ã‚Œã€ä½œæˆã•ã‚Œã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ ã®ãƒ‡ãƒ¼ã‚¿é ˜åŸŸã¯ã“ã®å¢ƒç•Œã«ã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆã•ã‚Œã¾ã™ã€‚
          CTRL_SYNCデãƒã‚¤ã‚¹ã®ãƒ‡ãƒ¼ã‚¿æ›¸ãè¾¼ã¿å‡¦ç†ã‚’完了ã•ã›ã¾ã™ã€‚ドライãƒãŒãƒ©ã‚¤ãƒˆ ãƒãƒƒã‚¯ キャッシュãªã©ã‚’æŒã£ã¦ã„ã‚‹å ´åˆã¯ã€æ›¸ãè¾¼ã¾ã‚Œã¦ã„ãªã„データをå³æ™‚書ãè¾¼ã¿ã¾ã™ã€‚メディア上ã¸ã®æ›¸ãè¾¼ã¿ãŒãã‚Œãžã‚Œdisk_write関数ã®ä¸­ã§å®Œäº†ã™ã‚‹å ´åˆã¯ã€ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«å¯¾ã—ã¦ã™ã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。
          GET_SECTOR_COUNTç·ã‚»ã‚¯ã‚¿æ•°ã®å–得。buffã®æŒ‡ã™DWORD型変数ã«ãƒ‰ãƒ©ã‚¤ãƒ–上ã®ç·ã‚»ã‚¯ã‚¿æ•°ã‚’è¿”ã—ã¾ã™ã€‚f_mkfs, f_fdisk関数内ã‹ã‚‰å‘¼ã³å‡ºã•ã‚Œã€ä½œæˆã™ã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ ã®ã‚µã‚¤ã‚ºã‚’決定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚
          GET_SECTOR_SIZEセクタ サイズã®å–得。セクタ サイズå¯å¤‰(_MAX_SS > _MIN_SS)ã®ã¨ãã€disk_initailize関数ã®æˆåŠŸã«ç¶šã呼ã³å‡ºã•ã‚Œã‚‹ã®ã§ã€buffã®æŒ‡ã™WORD型変数ã«ç¾åœ¨ã®ã‚»ã‚¯ã‚¿ サイズを返ã—ã¾ã™ã€‚有効値ã¯512ã€1024ã€2048ã¾ãŸã¯4096ã§ã™ã€‚セクタ サイズ固定(_MAX_SS == _MIN_SS)ã®ã¨ãã¯ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ä½¿ã‚れるã“ã¨ã¯ãªãã€ãƒ‡ãƒã‚¤ã‚¹ã¯å¸¸ã«ãã®ã‚»ã‚¯ã‚¿ サイズã§å‹•ä½œã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。
          GET_BLOCK_SIZE消去ブロック サイズã®å–得。buffã®æŒ‡ã™DWORD型変数ã«ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ メモリã®æ¶ˆåŽ»ãƒ–ロック サイズ(セクタå˜ä½)ã‚’è¿”ã—ã¾ã™ã€‚1ã‹ã‚‰32768ã®ç¯„囲ã§2ã®ç´¯ä¹—ã®å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。ブロック サイズä¸æ˜Žã¾ãŸã¯ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ メモリ以外ã®ãƒ‡ãƒã‚¤ã‚¹ã§ã¯1ã‚’è¿”ã—ã¾ã™ã€‚f_mkfs関数内ã§ã®ã¿ä½¿ç”¨ã•ã‚Œã€ä½œæˆã•ã‚Œã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ ã®ãƒ‡ãƒ¼ã‚¿é ˜åŸŸã¯ã“ã®å¢ƒç•Œã«ã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆã•ã‚Œã¾ã™ã€‚
          CTRL_TRIMä¸å¿…è¦ã‚»ã‚¯ã‚¿ã®é€šçŸ¥ã€‚buffã®æŒ‡ã™DWORDåž‹é…列ã«ã¯ä¸å¿…è¦ã«ãªã£ãŸé ˜åŸŸ {開始セクタ,終了セクタ} を指定ã—ã¦å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚TRIM機能ãŒæœ‰åŠ¹(_USE_TRIM == 1)ã§ã€ã‚¯ãƒ©ã‚¹ã‚¿ãŒè§£æ”¾ã•ã‚Œã‚‹ã¨ãã€ãŠã‚ˆã³ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆæ™‚ã«å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã€ATAコマンド セットã®Trimコマンドã¨ç­‰ä¾¡ã§ã€ã“ã®æ©Ÿèƒ½ã‚’サãƒãƒ¼ãƒˆã—ãªã„デãƒã‚¤ã‚¹ã¯ä½•ã‚‚ã™ã‚‹å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“。ã¾ãŸã€æˆ»ã‚Šå€¤ã¯ãƒã‚§ãƒƒã‚¯ã•ã‚Œãšã€çµæžœã«ã‚ˆã£ã¦FatFsã®å‹•ä½œãŒå½±éŸ¿ã‚’å—ã‘ã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。
          @@ -68,7 +68,7 @@ DRESULT disk_ioctl ( コマンド解説 CTRL_FORMATメディアã®ç‰©ç†ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚’è¡Œã„ã¾ã™ã€‚buffã¯NULLã§ãªã„ã¨ãã€é€²è¡Œè¡¨ç¤ºã®ãŸã‚ã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’示ã—ã¾ã™ã€‚ CTRL_POWER_IDLEデãƒã‚¤ã‚¹ã‚’アイドル状態ã«ã—ã¾ã™ã€‚通常ã®èª­ã¿æ›¸ãè¦æ±‚ã§ã‚¢ã‚¯ãƒ†ã‚£ãƒ–状態ã«æˆ»ã‚‹ãªã‚‰ã€STA_NOINITフラグをセットã™ã‚‹å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“。 -CTRL_POWER_OFFデãƒã‚¤ã‚¹ã‚’シャットダウン状態ã«ã—ã¾ã™ã€‚STA_NOINITã¯ã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ã€‚デãƒã‚¤ã‚¹ã¯disk_initialize()ã§ã‚¢ã‚¯ãƒ†ã‚£ãƒ–状態ã«æˆ»ã‚Šã¾ã™ã€‚ +CTRL_POWER_OFFデãƒã‚¤ã‚¹ã‚’シャットダウン状態ã«ã—ã¾ã™ã€‚STA_NOINITã¯ã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ã€‚デãƒã‚¤ã‚¹ã¯disk_initialize関数ã§ã‚¢ã‚¯ãƒ†ã‚£ãƒ–状態ã«æˆ»ã‚Šã¾ã™ã€‚ CTRL_LOCKユーザã«ã‚ˆã‚‹ãƒ¡ãƒ‡ã‚£ã‚¢ã®å–り出ã—ã‚’ç¦æ­¢ã—ã¾ã™ã€‚ CTRL_UNLOCKユーザã«ã‚ˆã‚‹ãƒ¡ãƒ‡ã‚£ã‚¢ã®å–り出ã—を許å¯ã—ã¾ã™ã€‚ CTRL_EJECTメディアを排出ã—ã¾ã™ã€‚完了後ã€STA_NOINITã¨STA_NODISKフラグã¯ã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ã€‚ diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/dread.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/dread.html index 2dac64e2..24991dbf 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/dread.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/dread.html @@ -28,13 +28,13 @@ DRESULT disk_read (

          引数

          pdrv
          -
          対象ã®ãƒ‡ãƒã‚¤ã‚¹ã‚’示ã™ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·(0-9)ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚シングル ドライブ システムã§ã¯ã€å¸¸ã«0ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚
          +
          対象ã®ãƒ‡ãƒã‚¤ã‚¹ã‚’識別ã™ã‚‹ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·(0-9)ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚シングル ドライブ システムã§ã¯ã€å¸¸ã«0ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚
          buff
          ストレージ デãƒã‚¤ã‚¹ã‹ã‚‰èª­ã¿å‡ºã—ãŸãƒ‡ãƒ¼ã‚¿ã‚’æ ¼ç´ã™ã‚‹ãƒã‚¤ãƒˆé…列ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚
          sector
          読ã¿å‡ºã—を開始ã™ã‚‹ã‚»ã‚¯ã‚¿ç•ªå·ã€‚32ビットLBAã§æŒ‡å®šã•ã‚Œã¾ã™ã€‚
          count
          -
          読ã¿å‡ºã™ã‚»ã‚¯ã‚¿æ•°(1~128)。
          +
          読ã¿å‡ºã™ã‚»ã‚¯ã‚¿æ•°ãŒ1~128ã®ç¯„囲ã§æŒ‡å®šã•ã‚Œã¾ã™ã€‚
          @@ -49,19 +49,19 @@ DRESULT disk_read (
          RES_PARERR
          パラメータãŒä¸æ­£ã€‚
          RES_NOTRDY
          -
          ドライブãŒå‹•ä½œå¯èƒ½çŠ¶æ…‹ã§ã¯ãªã„(åˆæœŸåŒ–ã•ã‚Œã¦ã„ãªã„)。
          +
          ストレージ デãƒã‚¤ã‚¹ãŒå‹•ä½œå¯èƒ½çŠ¶æ…‹ã§ã¯ãªã„(åˆæœŸåŒ–ã•ã‚Œã¦ã„ãªã„)。

          解説

          -

          ストレージ デãƒã‚¤ã‚¹ã«å¯¾ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã®èª­ã¿æ›¸ãã¯ã€ã‚»ã‚¯ã‚¿å˜ä½ã§è¡Œã‚ã‚Œã¾ã™ã€‚FatFsã§ã¯512~4096ãƒã‚¤ãƒˆã®ã‚»ã‚¯ã‚¿ サイズをサãƒãƒ¼ãƒˆã—ã¾ã™ã€‚固定セクタ サイズ構æˆ(_MIN_SS == MAX_SS)ã®ã¨ãã¯ã€æš—黙的ã«ãã®ã‚»ã‚¯ã‚¿ サイズã§å‹•ä½œã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。å¯å¤‰ã‚»ã‚¯ã‚¿ サイズ構æˆ(_MIN_SS < MAX_SS)

          ã®ã¨ãã¯ã€åˆæœŸåŒ–後disk_ioctl()ã§ã‚»ã‚¯ã‚¿ サイズをå•ã„åˆã‚ã›ã¦ãã‚‹ã®ã§ã€ãã‚Œã«å¯¾ã—ã¦æ­£ã—ã„値を返ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ +

          ストレージ デãƒã‚¤ã‚¹ã«å¯¾ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã®èª­ã¿æ›¸ãã¯ã€ã‚»ã‚¯ã‚¿å˜ä½ã§è¡Œã‚ã‚Œã¾ã™ã€‚FatFsã§ã¯512~4096ãƒã‚¤ãƒˆã®ã‚»ã‚¯ã‚¿ サイズをサãƒãƒ¼ãƒˆã—ã¾ã™ã€‚固定セクタ サイズ構æˆ(_MIN_SS == MAX_SS)ã®ã¨ãã¯ã€æš—黙的ã«ãã®ã‚»ã‚¯ã‚¿ サイズã§å‹•ä½œã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。å¯å¤‰ã‚»ã‚¯ã‚¿ サイズ構æˆ(_MIN_SS < MAX_SS)ã®ã¨ãã¯ã€disk_initialize関数ã«ç¶šã„ã¦disk_ioctl関数ã§ã‚»ã‚¯ã‚¿ サイズをå•ã„åˆã‚ã›ã¦ãã‚‹ã®ã§ã€ãã‚Œã«å¯¾ã—ã¦æ­£ã—ã„値を返ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

          buffã¯BYTEåž‹ãªã®ã§ã€æŒ‡å®šã•ã‚Œã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯å¸¸ã«ãƒ¯ãƒ¼ãƒ‰ アライメントã•ã‚Œã¦ã„ã‚‹ã¨ã¯é™ã‚Šã¾ã›ã‚“。éžã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆ アドレスã¸ã®è»¢é€ã¯ã€ç›´æŽ¥è»¢é€ã«ãŠã„ã¦ç™ºç”Ÿã™ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ã‚‚ã—ã‚‚ã€ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ä¸Šã®åˆ¶ç´„ã§ãã®ã‚ˆã†ãªè»¢é€ãŒä¸å¯èƒ½ãªã¨ãã¯ã€ã“ã®é–¢æ•°å†…ã§äºŒæ®µè»¢é€ã™ã‚‹ãªã©ã—ã¦è§£æ±ºã™ã‚‹ã‹ã€ã¾ãŸã¯åˆ¥ã®æ–¹æ³•ã§å¯¾å¿œã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。次ã«ã„ãã¤ã‹ã®å¯¾å¿œæ–¹æ³•ã‚’示ã—ã¾ã™(ã„ãšã‚Œã‹ä¸€ã¤ã§OK)。

          • ã“ã®é–¢æ•°å†…ã§è§£æ±ºã™ã‚‹ - 推奨
          • -
          • f_read()ã«ãŠã„ã¦ã€ã‚»ã‚¯ã‚¿å…¨ä½“ã‚’å«ã‚€è»¢é€ã‚’é¿ã‘ã‚‹ - 直接転é€ãŒç™ºç”Ÿã—ãªã„
          • -
          • f_read(fp, buff, btr, &br)ã«ãŠã„ã¦ã€(((UINT)buff & 3) == (f_tell(fp) & 3))を満足ã•ã›ã‚‹ - buffã®ãƒ¯ãƒ¼ãƒ‰ アライメントãŒä¿è¨¼ã•ã‚Œã‚‹
          • +
          • å…¨ã¦ã®f_read()ã«ãŠã„ã¦ã€ã‚»ã‚¯ã‚¿å…¨ä½“ã‚’å«ã‚€è»¢é€ã‚’é¿ã‘ã‚‹ - 直接転é€ãŒç™ºç”Ÿã—ãªã„
          • +
          • f_read(fp, data, btr, &br)ã«ãŠã„ã¦ã€(((UINT)data & 3) == (f_tell(fp) & 3))を満足ã•ã›ã‚‹ - 直接転é€ã§ã®buffã®ãƒ¯ãƒ¼ãƒ‰ アライメントãŒä¿è¨¼ã•ã‚Œã‚‹

          一般的ã«ã€è¤‡æ•°ã‚»ã‚¯ã‚¿ã®è»¢é€è¦æ±‚ã¯ã€ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ デãƒã‚¤ã‚¹ã«å¯¾ã—ã¦å¯èƒ½ãªé™ã‚Šãƒžãƒ«ãƒ セクタ転é€ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。複数ã®ã‚·ãƒ³ã‚°ãƒ« セクタ読ã¿å‡ºã—ã«åˆ†è§£ã•ã‚ŒãŸå ´åˆã€ã‚¹ãƒ«ãƒ¼ãƒ—ットãŒä½Žä¸‹ã™ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/dstat.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/dstat.html index 6a309446..f965649f 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/dstat.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/dstat.html @@ -35,7 +35,7 @@ DSTATUS disk_status (

          ç¾åœ¨ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ デãƒã‚¤ã‚¹ã®çŠ¶æ…‹ã‚’次ã®ãƒ•ãƒ©ã‚°ã®çµ„ã¿åˆã‚ã›å€¤ã§è¿”ã—ã¾ã™ã€‚

          STA_NOINIT
          -
          デãƒã‚¤ã‚¹ãŒåˆæœŸåŒ–ã•ã‚Œã¦ã„ãªã„ã“ã¨ã‚’示ã™ãƒ•ãƒ©ã‚°ã€‚システム リセットやメディアã®å–り外ã—ç­‰ã§ã‚»ãƒƒãƒˆã•ã‚Œã€disk_initialize()ã®æ­£å¸¸çµ‚了ã§ã‚¯ãƒªã‚¢ã€å¤±æ•—ã§ã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ã€‚メディア交æ›ã¯éžåŒæœŸã«ç™ºç”Ÿã™ã‚‹ã‚¤ãƒ™ãƒ³ãƒˆãªã®ã§ã€éŽåŽ»ã«ãƒ¡ãƒ‡ã‚£ã‚¢äº¤æ›ãŒã‚ã£ãŸå ´åˆã‚‚ã“ã®ãƒ•ãƒ©ã‚°ã«å映ã•ã›ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚FatFsモジュールã¯ã€ã“ã®ãƒ•ãƒ©ã‚°ã‚’å‚ç…§ã—ã¦ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œãŒå¿…è¦ã‹ã©ã†ã‹ã‚’判断ã—ã¾ã™ã€‚
          +
          デãƒã‚¤ã‚¹ãŒåˆæœŸåŒ–ã•ã‚Œã¦ã„ãªã„ã“ã¨ã‚’示ã™ãƒ•ãƒ©ã‚°ã€‚システム リセットやメディアã®å–り外ã—ç­‰ã§ã‚»ãƒƒãƒˆã•ã‚Œã€disk_initialize関数ã®æ­£å¸¸çµ‚了ã§ã‚¯ãƒªã‚¢ã€å¤±æ•—ã§ã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ã€‚メディア交æ›ã¯éžåŒæœŸã«ç™ºç”Ÿã™ã‚‹ã‚¤ãƒ™ãƒ³ãƒˆãªã®ã§ã€éŽåŽ»ã«ãƒ¡ãƒ‡ã‚£ã‚¢äº¤æ›ãŒã‚ã£ãŸå ´åˆã‚‚ã“ã®ãƒ•ãƒ©ã‚°ã«å映ã•ã›ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚FatFsモジュールã¯ã€ã“ã®ãƒ•ãƒ©ã‚°ã‚’å‚ç…§ã—ã¦ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œãŒå¿…è¦ã‹ã©ã†ã‹ã‚’判断ã—ã¾ã™ã€‚
          STA_NODISK
          メディアãŒå­˜åœ¨ã—ãªã„ã“ã¨ã‚’示ã™ãƒ•ãƒ©ã‚°ã€‚メディアãŒå–り外ã•ã‚Œã¦ã„ã‚‹é–“ã¯ã‚»ãƒƒãƒˆã•ã‚Œã€ã‚»ãƒƒãƒˆã•ã‚Œã¦ã„ã‚‹é–“ã¯ã‚¯ãƒªã‚¢ã•ã‚Œã¾ã™ã€‚固定ディスクã§ã¯å¸¸ã«ã‚¯ãƒªã‚¢ã—ã¾ã™ã€‚ãªãŠã€ã“ã®ãƒ•ãƒ©ã‚°ã¯FatFsモジュールã§ã¯å‚ç…§ã•ã‚Œã¾ã›ã‚“。
          STA_PROTECT
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/dwrite.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/dwrite.html index 15d4ead4..020d5f1c 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/dwrite.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/dwrite.html @@ -28,13 +28,13 @@ DRESULT disk_write (

          引数

          pdrv
          -
          対象ã®ãƒ‡ãƒã‚¤ã‚¹ã‚’示ã™ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·(0-9)ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚
          +
          対象ã®ãƒ‡ãƒã‚¤ã‚¹ã‚’識別ã™ã‚‹ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·(0-9)ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚
          buff
          ストレージ デãƒã‚¤ã‚¹ã«æ›¸ã込むセクタ データãŒæ ¼ç´ã•ã‚ŒãŸãƒã‚¤ãƒˆé…列ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚ãƒã‚¤ãƒˆæ•°ã¯ã€ã‚»ã‚¯ã‚¿ サイズ*countã¨ãªã‚Šã¾ã™ã€‚
          sector
          書ãè¾¼ã¿ã‚’開始ã™ã‚‹ã‚»ã‚¯ã‚¿ç•ªå·ã€‚32ビットLBAã§æŒ‡å®šã•ã‚Œã¾ã™ã€‚
          count
          -
          書ã込むセクタ数(1~128)。
          +
          書ã込むセクタ数ãŒ1~128ã®ç¯„囲ã§æŒ‡å®šã•ã‚Œã¾ã™ã€‚
          @@ -51,16 +51,16 @@ DRESULT disk_write (
          RES_PARERR
          パラメータãŒä¸æ­£ã€‚
          RES_NOTRDY
          -
          デãƒã‚¤ã‚¹ãŒå‹•ä½œå¯èƒ½çŠ¶æ…‹ã§ã¯ãªã„(åˆæœŸåŒ–ã•ã‚Œã¦ã„ãªã„)。
          +
          ストレージ デãƒã‚¤ã‚¹ãŒå‹•ä½œå¯èƒ½çŠ¶æ…‹ã§ã¯ãªã„(åˆæœŸåŒ–ã•ã‚Œã¦ã„ãªã„)。

          解説

          -

          buffã«æŒ‡å®šã•ã‚Œã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯å¸¸ã«ãƒ¯ãƒ¼ãƒ‰ アライメントã•ã‚Œã¦ã„ã‚‹ã¨ã¯é™ã‚Šã¾ã›ã‚“。詳細ã¯ã€disk_read()ã®è§£èª¬ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

          +

          buffã«æŒ‡å®šã•ã‚Œã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯å¸¸ã«ãƒ¯ãƒ¼ãƒ‰ アライメントã•ã‚Œã¦ã„ã‚‹ã¨ã¯é™ã‚Šã¾ã›ã‚“。ã“ã‚Œã«ã¤ã„ã¦ã¯ã€disk_read関数ã®è§£èª¬ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

          一般的ã«ã€è¤‡æ•°ã‚»ã‚¯ã‚¿ã®è»¢é€è¦æ±‚ã¯ã€ãƒ‡ãƒã‚¤ã‚¹ã«å¯¾ã—ã¦å¯èƒ½ãªé™ã‚Šãƒžãƒ«ãƒ セクタ転é€ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。複数ã®ã‚·ãƒ³ã‚°ãƒ« セクタ書ãè¾¼ã¿ã«åˆ†è§£ã•ã‚ŒãŸå ´åˆã€ã‚¹ãƒ«ãƒ¼ãƒ—ットãŒè‘—ã—ã低下ã™ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚

          -

          FatFsã¯ãƒ‡ã‚£ã‚¹ã‚¯é–¢æ•°ãŒé…延書ãè¾¼ã¿æ©Ÿèƒ½ã‚’æŒã¤ã“ã¨ã‚‚想定ã—ã¦ã„ã¾ã™ã€‚ã“ã®é–¢æ•°ã‹ã‚‰æˆ»ã‚‹ã¨ãã€ãƒ‡ãƒã‚¤ã‚¹ãŒæ›¸ãè¾¼ã¿ä¸­ã¨ã‹ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã«æ›¸ãè¾¼ã¾ã‚ŒãŸã ã‘ãªã©ã€å¿…ãšã—もメディアã¸ã®æ›¸ãè¾¼ã¿ãŒå®Œäº†ã—ã¦ã„ã‚‹å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“。ãŸã ã—ã€buffã®ãƒ‡ãƒ¼ã‚¿ã¯ã€ã“ã®é–¢æ•°ã‹ã‚‰æˆ»ã‚‹ã¨ç„¡åŠ¹ã¨ãªã‚Šã¾ã™ã€‚書ãè¾¼ã¿å®Œäº†ã®è¦æ±‚ã¯ã€disk_ioctl()ã®CTRL_SYNCコマンドã«ã‚ˆã£ã¦è¡Œã‚ã‚Œã¾ã™ã€‚ã“ã®ã‚ˆã†ãªé…延書ãè¾¼ã¿æ©Ÿèƒ½ãŒå®Ÿè£…ã•ã‚ŒãŸå ´åˆã€ã‚¹ãƒ«ãƒ¼ãƒ—ットをã•ã‚‰ã«å‘上ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

          +

          FatFsã¯ãƒ‡ã‚£ã‚¹ã‚¯åˆ¶å¾¡ãƒ¬ã‚¤ãƒ¤ãŒé…延書ãè¾¼ã¿æ©Ÿèƒ½ã‚’æŒã¤ã“ã¨ã‚‚想定ã—ã¦ã„ã¾ã™ã€‚ã“ã®é–¢æ•°ã‹ã‚‰æˆ»ã‚‹ã¨ãã€ãƒ‡ãƒã‚¤ã‚¹ãŒæ›¸ãè¾¼ã¿ã‚’実行中ã ã£ãŸã‚Šå˜ã«ãƒ©ã‚¤ãƒˆãƒãƒƒã‚¯ キャッシュã«æ›¸ãè¾¼ã¾ã‚ŒãŸã ã‘ãªã©ã€å¿…ãšã—もメディアã¸ã®æ›¸ãè¾¼ã¿ãŒå®Œäº†ã—ã¦ã„ã‚‹å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“。ãŸã ã—ã€buffã®ãƒ‡ãƒ¼ã‚¿ã¯ã€ã“ã®é–¢æ•°ã‹ã‚‰æˆ»ã‚‹ã¨ç„¡åŠ¹ã¨ãªã‚Šã¾ã™ã€‚書ãè¾¼ã¿å®Œäº†ã®è¦æ±‚ã¯ã€disk_ioctl関数ã®CTRL_SYNCコマンドã«ã‚ˆã£ã¦è¡Œã‚ã‚Œã¾ã™ã€‚ã“ã®ã‚ˆã†ãªé…延書ãè¾¼ã¿æ©Ÿèƒ½ãŒå®Ÿè£…ã•ã‚ŒãŸå ´åˆã€æ›¸ãè¾¼ã¿ã‚¹ãƒ«ãƒ¼ãƒ—ットをå‘上ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

          アプリケーションã‹ã‚‰ã¯ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¦ã¯ãªã‚Šã¾ã›ã‚“。ã•ã‚‚ãªã„ã¨ã€FATボリュームãŒç ´å£Šã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/eof.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/eof.html index b9098b35..7b38141a 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/eof.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/eof.html @@ -39,7 +39,7 @@ int f_eof (

          解説

          -

          f_eof関数ã¯ã€ç¾ãƒªãƒ“ジョンã§ã¯ãƒžã‚¯ãƒ­ã¨ã—ã¦å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã™ã€‚

          +

          ã“ã®é–¢æ•°ã¯ã€ç¾ãƒªãƒ“ジョンã§ã¯ãƒžã‚¯ãƒ­ã¨ã—ã¦å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã™ã€‚ファイル オブジェクトã®æ­£å½“性ãƒã‚§ãƒƒã‚¯ã‚„排他制御ã¯è¡Œã„ã¾ã›ã‚“。

           #define f_eof(fp) ((int)((fp)->fptr == (fp)->fsize))
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/error.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/error.html index bb01d800..19796862 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/error.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/error.html @@ -39,7 +39,7 @@ int f_error (

          解説

          -

          f_error関数ã¯ã€ç¾ãƒªãƒ“ジョンã§ã¯ãƒžã‚¯ãƒ­ã¨ã—ã¦å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã™ã€‚

          +

          ã“ã®é–¢æ•°ã¯ã€ç¾ãƒªãƒ“ジョンã§ã¯ãƒžã‚¯ãƒ­ã¨ã—ã¦å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã™ã€‚ファイル オブジェクトã®æ­£å½“性ãƒã‚§ãƒƒã‚¯ã‚„排他制御ã¯è¡Œã„ã¾ã›ã‚“。

           #define f_error(fp) ((fp)->err)
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/fattime.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/fattime.html index c8bbed7d..ef694ca4 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/fattime.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/fattime.html @@ -48,7 +48,7 @@ DWORD get_fattime (void);

          対応情報

          -

          リード オンリー構æˆ(_FS_READONLY == 1)ã§ã¯ã“ã®é–¢æ•°ã¯å¿…è¦ã¨ã•ã‚Œã¾ã›ã‚“。

          +

          リード オンリー構æˆ(_FS_READONLY == 1)ã¾ãŸã¯ã€éžRTCサãƒãƒ¼ãƒˆæ§‹æˆ(_RTC_NOUSE == 1)ã§ã¯ã“ã®é–¢æ•°ã¯å¿…è¦ã¨ã•ã‚Œã¾ã›ã‚“。

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/filename.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/filename.html index 524566cc..72c98487 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/filename.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/filename.html @@ -11,16 +11,16 @@

          パスåã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆ

          -
          +

          ファイル ディレクトリå

          -

          FatFsモジュールã§ã®ãƒ•ã‚¡ã‚¤ãƒ«ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€ãƒ‰ãƒ©ã‚¤ãƒ–ã®æŒ‡å®šæ–¹æ³•ã¯DOS/Windows APIã¨ã»ã¼åŒã˜ã§ã™ã€‚パスåã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã¯æ¬¡ã®é€šã‚Šã§ã™ã€‚

          +

          FatFsモジュールã§ã¯ã€ãƒ‘スåã«ã‚ˆã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€ãƒ‰ãƒ©ã‚¤ãƒ–ã®æŒ‡å®šæ–¹æ³•ã¯DOS/Windows APIã¨ã»ã¼åŒã˜ã§ã™ã€‚パスåã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã¯æ¬¡ã®é€šã‚Šã§ã™ã€‚

          "[è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·:][/]ディレクトリå/ファイルå"
          -

          FatFsモジュールã¯é•·ã„ファイルå(LFN)ãŠã‚ˆã³8.3å½¢å¼ãƒ•ã‚¡ã‚¤ãƒ«å(SFN)ã«å¯¾å¿œã—ã¦ã„ã¾ã™ã€‚LFNã¯ã€(_USE_LFN > 0)ã®ã¨ã使用å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ディレクトリ セパレータã«ã¯DOS/Windows APIã¨åŒã˜ã'/'ã¨'\'を使用ã—ã¾ã™ã€‚連続ã—ãŸã‚»ãƒ‘レータã¯ç„¡è¦–ã•ã‚Œ1個ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚唯一ã®é•ã„ã¯ã€è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®æŒ‡å®šã ã‘ã§ã™ã€‚è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·ã¯ã€'0'~'9'ã®ä¸€æ–‡å­—ã®æ•°å­—ã¨ã‚³ãƒ­ãƒ³ã§æŒ‡å®šã—ã€çœç•¥ã—ãŸå ´åˆã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆ ドライブ(0ã¾ãŸã¯ã‚«ãƒ¬ãƒ³ãƒˆ ドライブ)ãŒé¸æŠžã•ã‚Œã¾ã™ã€‚

          +

          FatFsモジュールã¯é•·ã„ファイルå(LFN)ãŠã‚ˆã³8.3å½¢å¼ãƒ•ã‚¡ã‚¤ãƒ«å(SFN)ã«å¯¾å¿œã—ã¦ã„ã¾ã™ã€‚LFNã¯ã€(_USE_LFN > 0)ã®ã¨ã使用å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ディレクトリ セパレータã«ã¯DOS/Windows APIã¨åŒã˜ã'/'ã¨'\'を使用ã—ã¾ã™ã€‚連続ã—ãŸã‚»ãƒ‘レータã¯ç„¡è¦–ã•ã‚Œ1個ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚唯一ã®é•ã„ã¯ã€è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®æŒ‡å®šã ã‘ã§ã™ã€‚è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·ã¯ã€'0'~'9'ã®ä¸€æ–‡å­—ã®æ•°å­—ã¨ã‚³ãƒ­ãƒ³ã§æŒ‡å®šã—ã€çœç•¥ã—ãŸå ´åˆã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆ ドライブ(0ã¾ãŸã¯ã‚«ãƒ¬ãƒ³ãƒˆ ドライブ)ãŒé¸æŠžã•ã‚Œã¾ã™ã€‚

          ヌル文字や制御文字('\0'~'\x1F')ã¯ã€ãƒ‘スåã®çµ‚端ã¨ã—ã¦èªè­˜ã•ã‚Œã¾ã™ã€‚パスåã«å…ˆè¡Œã‚ã‚‹ã„ã¯ä¸­ã«å«ã¾ã‚Œã‚‹ã‚¹ãƒšãƒ¼ã‚¹ã¯ã€LFN構æˆã§ã¯åå‰ã®ä¸€éƒ¨ã¨ã—ã¦æœ‰åŠ¹ã§ã™ãŒã€éžLFN構æˆã§ã¯ã‚¹ãƒšãƒ¼ã‚¹ã¯ãƒ‘スåã®çµ‚端ã¨ã—ã¦èªè­˜ã•ã‚Œã¾ã™ã€‚

          -

          標準構æˆ(_FS_RPATH == 0)ã®ã¨ãã¯ã€å…¨ã¦ã®ã‚ªãƒ–ジェクトãŒãƒ«ãƒ¼ãƒˆ ディレクトリã‹ã‚‰è¾¿ã‚‹çµ¶å¯¾ãƒ‘スã§æŒ‡å®šã•ã‚Œã¾ã™ã€‚OS指å‘ãªã‚«ãƒ¬ãƒ³ãƒˆ ディレクトリã¨ã„ã†æ¦‚念ã¯ç„¡ãã€ã¾ãŸãƒ‰ãƒƒãƒˆ ディレクトリ("."ã‚„"..")ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。パスå先頭ã®ã‚»ãƒ‘レータã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚デフォルト ドライブ番å·ã¯å¸¸ã«0ã«ãªã‚Šã¾ã™ã€‚

          -

          相対パスを有効(_FS_RPATH == 1)ã«ã—ãŸã¨ãã¯ã€å…ˆè¡Œã™ã‚‹ã‚»ãƒ‘レータã®æœ‰ç„¡ã«ã‚ˆã£ã¦æ¤œç´¢é–‹å§‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒå¤‰ã‚ã‚Šã€ã‚»ãƒ‘レータãŒã‚ã‚‹å ´åˆã¯ãƒ«ãƒ¼ãƒˆ ディレクトリã‹ã‚‰ã€ç„¡ã„å ´åˆã¯f_chdir()ã§è¨­å®šã•ã‚Œã‚‹ã‚«ãƒ¬ãƒ³ãƒˆ ディレクトリã‹ã‚‰ã«ãªã‚Šã¾ã™ã€‚ã¾ãŸãƒ‘スåã«ãƒ‰ãƒƒãƒˆ ディレクトリãŒä½¿ç”¨ã§ãã¾ã™ã€‚デフォルト ドライブ番å·ã¯f_chdrive()ã§è¨­å®šã•ã‚ŒãŸå€¤ã¨ãªã‚Šã¾ã™ã€‚

          +

          標準構æˆ(_FS_RPATH == 0)ã®ã¨ãã¯ã€å…¨ã¦ã®ã‚ªãƒ–ジェクトãŒãƒ«ãƒ¼ãƒˆ ディレクトリã‹ã‚‰è¾¿ã‚‹çµ¶å¯¾ãƒ‘スã§æŒ‡å®šã•ã‚Œã¾ã™ã€‚OS指å‘ãªã‚«ãƒ¬ãƒ³ãƒˆ ディレクトリã¨ã„ã†æ¦‚念ã¯ç„¡ãã€ã¾ãŸãƒ‰ãƒƒãƒˆ ディレクトリ("."ã‚„"..")ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。パスå先頭ã®ã‚»ãƒ‘レータã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚デフォルト ドライブ番å·ã¯å¸¸ã«0ã«ãªã‚Šã¾ã™ã€‚

          +

          相対パスを有効(_FS_RPATH >= 1)ã«ã—ãŸã¨ãã¯ã€å…ˆè¡Œã™ã‚‹ã‚»ãƒ‘レータã®æœ‰ç„¡ã«ã‚ˆã£ã¦æ¤œç´¢é–‹å§‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒå¤‰ã‚ã‚Šã€ã‚»ãƒ‘レータãŒã‚ã‚‹å ´åˆã¯ãƒ«ãƒ¼ãƒˆ ディレクトリã‹ã‚‰ã€ç„¡ã„å ´åˆã¯f_chdir関数ã§è¨­å®šã•ã‚Œã‚‹ã‚«ãƒ¬ãƒ³ãƒˆ ディレクトリã‹ã‚‰ã«ãªã‚Šã¾ã™ã€‚ã¾ãŸãƒ‘スåã«ãƒ‰ãƒƒãƒˆ ディレクトリãŒä½¿ç”¨ã§ãã¾ã™ã€‚デフォルト ドライブ番å·ã¯f_chdrive関数ã§è¨­å®šã•ã‚ŒãŸå€¤ã¨ãªã‚Šã¾ã™ã€‚

          - + @@ -33,13 +33,19 @@
          パスåã®ä¾‹_FS_RPATH == 0_FS_RPATH == 1
          パスåã®ä¾‹_FS_RPATH == 0_FS_RPATH >= 1
          file.txtドライブ0ã®ãƒ«ãƒ¼ãƒˆ ディレクトリ下ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚«ãƒ¬ãƒ³ãƒˆ ドライブã®ã‚«ãƒ¬ãƒ³ãƒˆ ディレクトリ下ã®ãƒ•ã‚¡ã‚¤ãƒ«
          /file.txtドライブ0ã®ãƒ«ãƒ¼ãƒˆ ディレクトリ下ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚«ãƒ¬ãƒ³ãƒˆ ドライブã®ãƒ«ãƒ¼ãƒˆ ディレクトリ下ã®ãƒ•ã‚¡ã‚¤ãƒ«
          ドライブ0ã®ãƒ«ãƒ¼ãƒˆ ディレクトリカレント ドライブã®ã‚«ãƒ¬ãƒ³ãƒˆ ディレクトリ
          dir1/..無効カレント ディレクトリ
          /..無効ルート ディレクトリ(ãã®ä¸Šã¯è¾¿ã‚Œãªã„)
          -

          ã¾ãŸã€_STR_VOLUME_IDオプションを有効ã«ã™ã‚‹ã“ã¨ã§ãƒ‰ãƒ©ã‚¤ãƒ–番å·ã®è­˜åˆ¥ã«ã¯æ•°å­—ã®ã»ã‹ã€"sd:file1.txt"ã‚„"ram:swapfile.dat"ã®ã‚ˆã†ã«ã€ä»»æ„ã®æ–‡å­—列を使用ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚

          +

          ã¾ãŸã€_STR_VOLUME_IDオプションを有効ã«ã™ã‚‹ã“ã¨ã§ãƒ‰ãƒ©ã‚¤ãƒ–番å·ã®è­˜åˆ¥ã«ã¯æ•°å­—ã®ã»ã‹ã€"sd:file1.txt"ã‚„"ram:swapfile.dat"ã®ã‚ˆã†ã«ã€ä»»æ„ã®æ–‡å­—列を使用ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚

          -


          -
          +
          +

          使用å¯èƒ½ãªæ–‡å­—ã¨å¤§æ–‡å­—å°æ–‡å­—ã®è­˜åˆ¥

          +

          FATファイル システムã§ãƒ•ã‚¡ã‚¤ãƒ«åã«ä½¿ç”¨å¯èƒ½ãªæ–‡å­—ã¯ã€0~9 A~Z ! # $ % & ' ( ) - @ ^ _ ` { } ~ãŠã‚ˆã³æ‹¡å¼µæ–‡å­—(\x80~\xFF)ã¨ãªã£ã¦ã„ã¾ã™ã€‚LFNæ‹¡å¼µã§ã¯ã“れらã«åŠ ãˆã€+ , ; = [ ]ãŠã‚ˆã³ã‚¹ãƒšãƒ¼ã‚¹ãŒä½¿ç”¨å¯èƒ½ã«ãªã‚Šã€ã‚¹ãƒšãƒ¼ã‚¹ã¨ãƒ”リオドã¯ãƒ•ã‚¡ã‚¤ãƒ«åã®æœ«å°¾ã‚’除ãä»»æ„ã®ä½ç½®ã«æŒ¿å…¥ã§ãã¾ã™ã€‚

          +

          FATファイル システムã§ã¯ã€ãƒ‘スåã«ã¤ã„ã¦ã‚±ãƒ¼ã‚¹ インセンシティブã§ã™ã€‚ãŸã¨ãˆã°ã€file.txt, File.Txt, FILE.TXTã®3ã¤ã®åå‰ã¯åŒã˜ç‰©ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã€ASCII文字ã ã‘ã§ãªã拡張文字ã«ã¤ã„ã¦ã‚‚é©ç”¨ã•ã‚Œã¾ã™ã€‚ファイルãŒä½œæˆã•ã‚Œã‚‹éš›ã€SFNエントリã«ã¯å…¨ã¦å¤§æ–‡å­—ã«å¤‰æ›ã•ã‚ŒãŸåå‰ãŒè¨˜éŒ²ã•ã‚Œã¾ã™ã€‚LFN対応システムã§ã¯ã€LFNエントリã«ã¯å¤§æ–‡å­—変æ›ã•ã‚Œãªã„åå‰ãŒè¨˜éŒ²ã•ã‚Œã¾ã™ã€‚

          +

          å¤ã„日本語MS-DOSã§ã¯æ‹¡å¼µæ–‡å­—(ã„ã‚ゆる全角文字)ã«ã¤ã„ã¦ã¯ã‚±ãƒ¼ã‚¹ センシティブã§ã—ãŸã€‚FatFsモジュールã§ã¯ã“ã‚Œã«ã—ãŸãŒã„ã€éžLFN構æˆã§æ–‡å­—コードã«DBCSãŒé¸æŠžã•ã‚ŒãŸã¨ãã«é™ã‚Šã€æ‹¡å¼µæ–‡å­—ã«å¯¾ã—ã¦å¤§æ–‡å­—変æ›ã‚’è¡Œã‚ãšã«SFNエントリã«è¨˜éŒ²ãŠã‚ˆã³æ¤œç´¢ã•ã‚Œã¾ã™(日本語MSDOS仕様)。LFN構æˆã§ã¯æ‹¡å¼µæ–‡å­—ã«ã¤ã„ã¦ã‚‚大文字変æ›ã‚’è¡Œã„ã¾ã™(WindowsNT仕様)。ã“ã®ãŸã‚ã€éžLFN構æˆã§å…¨è§’å°æ–‡å­—ã‚’å«ã‚€åå‰ã§ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã™ã‚‹ã¨ã€Windowsã§ãã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ã‘ãªããªã‚‹ãªã©ã®äº’æ›æ€§å•é¡Œã‚’èµ·ã“ã™ã®ã§ã€ãれらã®ã‚·ã‚¹ãƒ†ãƒ ã§ç›¸äº’利用ã™ã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ ä¸Šã§ã¯DBCS拡張文字ã®ä½¿ç”¨ã¯é¿ã‘ã‚‹ã¹ãã§ã™ã€‚

          +
          + +

          Unicode API

          -

          ファイル関数ã®å…¥å‡ºåŠ›ã®ã†ã¡ãƒ•ã‚¡ã‚¤ãƒ«åやパスåを指定ã™ã‚‹å¼•æ•°ã®åž‹ã¯ã€TCHARã§å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ãŒã€ã“ã‚Œã¯é€šå¸¸ã¯charã®ã‚¨ãƒªã‚¢ã‚¹ã«ãªã£ã¦ã„ã¾ã™ã€‚ãã—ã¦ã€_CODE_PAGEã§æŒ‡å®šã•ã‚Œã‚‹ANSI/OEMコード(SBCSã¾ãŸã¯DBCS)ã®æ–‡å­—列ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚ファイルå入出力をUnicodeã¨ã™ã‚‹æ§‹æˆ(_LFN_UNICODE == 1)ã«ã—ãŸã¨ãã¯ã€TCHARã¯ãƒ¯ã‚¤ãƒ‰æ–‡å­—(WCHAR, unsigned short)ã«åˆ‡ã‚Šæ›¿ã‚ã‚Šã€ãƒ‘スåã®å…¥å‡ºåŠ›ã«Unicodeを使用ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚ŠLFNè¦æ ¼ã«å®Œå…¨å¯¾å¿œã¨ãªã‚Šã€ANSI/OEMコードã«ãªã„文字(ãŸã¨ãˆã° âœâ˜ªâœ¡â˜¸â˜­ãªã©)も使用ã§ãã¾ã™ã€‚ã“ã®è¨­å®šã¯æ–‡å­—列入出力関数ã®ãƒ‡ãƒ¼ã‚¿åž‹ã¨ãƒ•ã‚¡ã‚¤ãƒ«ä¸Šã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã«ã‚‚影響を与ãˆã¾ã™ã€‚リテラル文字列を定義ã™ã‚‹ã¨ãã€æ¬¡ã«ç¤ºã™ã‚ˆã†ã«_T(s)ãŠã‚ˆã³_TEXT(s)マクロを使ã£ã¦ANSI/OEMã¨Unicodeを自動切り替ãˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

          +

          ファイル関数ã®å…¥å‡ºåŠ›ã®ã†ã¡ãƒ•ã‚¡ã‚¤ãƒ«åやパスåを指定ã™ã‚‹å¼•æ•°ã®åž‹ã¯ã€TCHARã§å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ãŒã€ã“ã‚Œã¯é€šå¸¸ã¯charã®ã‚¨ãƒªã‚¢ã‚¹ã«ãªã£ã¦ã„ã¾ã™ã€‚ãã—ã¦ã€_CODE_PAGEã§æŒ‡å®šã•ã‚Œã‚‹ANSI/OEMコード(SBCSã¾ãŸã¯DBCS)ã®æ–‡å­—列ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚ファイルå入出力をUnicodeã¨ã™ã‚‹æ§‹æˆ(_LFN_UNICODE == 1)ã«ã—ãŸã¨ãã¯ã€TCHARã¯ãƒ¯ã‚¤ãƒ‰æ–‡å­—(WCHAR, unsigned short)ã«åˆ‡ã‚Šæ›¿ã‚ã‚Šã€ãƒ‘スåã®å…¥å‡ºåŠ›ã«Unicodeを使用ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚ŠLFNè¦æ ¼ã«å®Œå…¨å¯¾å¿œã¨ãªã‚Šã€ãƒ•ã‚¡ã‚¤ãƒ«åã¨ã—ã¦ANSI/OEMコードã«ãªã„文字(ãŸã¨ãˆã° âœâ˜ªâœ¡â˜¸â˜­ãªã©)も使用ã§ãã¾ã™ã€‚ã“ã®è¨­å®šã¯æ–‡å­—列入出力関数ã«ãŠã„ã¦ã¯ã€ãƒ‡ãƒ¼ã‚¿åž‹ã¨ãƒ•ã‚¡ã‚¤ãƒ«ä¸Šã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã«å½±éŸ¿ã‚’与ãˆã¾ã™ã€‚リテラル文字列を定義ã™ã‚‹ã¨ãã€æ¬¡ã«ç¤ºã™ã‚ˆã†ã«_T(s)ãŠã‚ˆã³_TEXT(s)マクロを使ã£ã¦ANSI/OEMã¨Unicodeを自動切り替ãˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

            f_open(fp, "filename.txt", FA_READ);      /* ANSI/OEM専用コード */
            f_open(fp, L"filename.txt", FA_READ);     /* Unicode専用コード */
          @@ -47,11 +53,10 @@
           
          -


          -
          +

          ボリューム管ç†

          デフォルトã®æ§‹æˆã§ã¯ã€ãã‚Œãžã‚Œã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã¯åŒã˜ç•ªå·ã®ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«1:1ã§çµã³ã¤ã‘られã¦ã„ã¦ã€è‡ªå‹•æ¤œå‡ºæ©Ÿèƒ½ã«ã‚ˆã‚Šãã®ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã®ä¸€ã¤ã®FATボリュームãŒãƒžã‚¦ãƒ³ãƒˆã•ã‚Œã¾ã™ã€‚FATボリュームã®æ¤œå‡ºã¯ã€ã‚»ã‚¯ã‚¿0ã€ç¬¬ä¸€åŒºç”»ï½žç¬¬å››åŒºç”»ã®é †ã«è¡Œã‚ã‚Œã¾ã™ã€‚

          -

          _MULTI_PARTITIONã«1を指定ã™ã‚‹ã¨ã€ãã‚Œãžã‚Œã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«å¯¾ã—ã¦å€‹åˆ¥ã«ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·ã¨åŒºç”»ã‚’指定ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ã“ã®æ§‹æˆã§ã¯ã€è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã¨åŒºç”»ã®å¯¾å¿œã‚’解決ã™ã‚‹ãŸã‚ã®ãƒ†ãƒ¼ãƒ–ルを次ã«ç¤ºã™ã‚ˆã†ã«å®šç¾©ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

          +

          _MULTI_PARTITIONã«1を指定ã™ã‚‹ã¨ã€ãã‚Œãžã‚Œã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«å¯¾ã—ã¦å€‹åˆ¥ã«ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·ã¨åŒºç”»ã‚’指定ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ã“ã®æ§‹æˆã§ã¯ã€è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã¨åŒºç”»ã®å¯¾å¿œã‚’解決ã™ã‚‹ãŸã‚ã®ãƒ†ãƒ¼ãƒ–ルを次ã«ç¤ºã™ã‚ˆã†ã«å®šç¾©ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

           例:è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–0~2を物ç†ãƒ‰ãƒ©ã‚¤ãƒ–0(éžãƒªãƒ ãƒ¼ãƒãƒ–ル)ã®3ã¤ã®åŸºæœ¬åŒºç”»ã«å‰²ã‚Šå½“ã¦ã€
              è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–3を物ç†ãƒ‰ãƒ©ã‚¤ãƒ–1(リムーãƒãƒ–ル)ã«å‰²ã‚Šå½“ã¦ã‚‹å ´åˆã€‚
          @@ -72,5 +77,6 @@ PARTITION VolToPart[] = {
           
      +

      戻る

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/findfirst.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/findfirst.html new file mode 100644 index 00000000..b809908c --- /dev/null +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/findfirst.html @@ -0,0 +1,119 @@ + + + + + + + + +FatFs - f_findfirst + + + + +
      +

      f_findfirst

      +

      ディレクトリ内ã®ã‚ªãƒ–ジェクトã®æ¤œç´¢ã‚’開始ã—ã¾ã™ã€‚

      +
      +FRESULT f_findfirst (
      +  DIR* dp,              /* [OUT] ディレクトリ オブジェクト構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
      +  FILINFO* fno,         /* [OUT] ファイル情報構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
      +  const TCHAR* path,    /* [IN] ディレクトリåã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
      +  const TCHAR* pattern  /* [IN] マッムパターン文字列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
      +);
      +
      +
      + +
      +

      引数

      +
      +
      dp
      +
      空ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª オブジェクト構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
      +
      fno
      +
      最åˆã«ãƒžãƒƒãƒã—ãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªé …目を格ç´ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«æƒ…報構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
      +
      path
      +
      オープンã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒ‘スåを示ã™ãƒŒãƒ«æ–‡å­—'\0'終端ã®æ–‡å­—列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
      +
      pattern
      +
      検索ã™ã‚‹åå‰ã‚’示ã™ãƒŒãƒ«æ–‡å­—'\0'終端ã®æ–‡å­—列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚ã“ã®æ–‡å­—列ã¯ã€ç¶šãf_findnext関数ã§ã‚‚å‚ç…§ã•ã‚Œã‚‹ãŸã‚ã€ä¸€é€£ã®å‡¦ç†ãŒçµ‚了ã™ã‚‹ã¾ã§æœ‰åŠ¹ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。
      +
      +
      + + + + + +
      +

      解説

      +

      pathã§æŒ‡å®šã•ã‚Œã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é–‹ãã€ãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªå†…ã®é …ç›®ã®æ¤œç´¢ã‚’開始ã—ã¾ã™ã€‚正常終了ã™ã‚‹ã¨ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª オブジェクト構造体ãŒä½œæˆã•ã‚Œã€æœ€åˆã«æ¤œç´¢å文字列ã«åå‰ãŒãƒžãƒƒãƒã—ãŸé …ç›®ã®æƒ…å ±ãŒfnoã®æŒ‡å®šã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«æƒ…報構造体ã«ã‚¹ãƒˆã‚¢ã•ã‚Œã¾ã™ã€‚åå‰ã®ãƒžãƒƒãƒã™ã‚‹é …ç›®ãŒè¦‹ã¤ã‹ã‚‰ãªã‹ã£ãŸå ´åˆã¯ã€fno->fname[]ã«ãƒŒãƒ«æ–‡å­—列ãŒè¿”ã•ã‚Œã¾ã™ã€‚ファイル情報構造体ã®ä½¿ã„æ–¹ã«ã¤ã„ã¦ã¯ã€f_readdir関数をå‚ç…§ã—ã¦ãã ã•ã„。

      +

      マッムパターン文字列ã¯ã€ãƒ¯ã‚¤ãƒ«ãƒ‰ã‚«ãƒ¼ãƒ‰æ–‡å­—(?ã¨*)ã‚’å«ã‚€ã“ã¨ãŒã§ãã¾ã™ã€‚?ã¯ä»»æ„ã®1文字ã«ã€*ã¯0文字以上ã®ä»»æ„ã®æ–‡å­—列ã«ãƒžãƒƒãƒã—ã¾ã™ã€‚LFN構æˆã§ã¯ã€SFNã¨LFN(ã‚ã‚Œã°)ã®ä¸¡æ–¹ã«å¯¾ã—ã¦ãƒ†ã‚¹ãƒˆã‚’è¡Œã„ã¾ã™ã€‚ç¾ãƒªãƒ“ジョンã§ã¯ãƒ‘ターン マッãƒãƒ³ã‚°ã«ãŠã„ã¦æ¬¡ã®ç‚¹ã§æ¨™æº–システムã¨ã¯ç•°ãªã‚‹å‹•ä½œã¨ãªã‚Šã¾ã™ã€‚

      +
        +
      • "*.*"ã¯æ‹¡å¼µå­ãªã—ã®åå‰ã«ãƒžãƒƒãƒã—ãªã„。(標準システムã§ã¯å…¨ã¦ã®åå‰ã«ãƒžãƒƒãƒ)
      • +
      • ピリオドã§çµ‚ã‚るパターンã¯ã€ã©ã®åå‰ã«ã‚‚マッãƒã—ãªã„。(標準システムã§ã¯æ‹¡å¼µå­ç„¡ã—ã®åå‰ã«ãƒžãƒƒãƒ)
      • +
      • DBCS拡張文字ã«ã¤ã„ã¦ã¯ã€LFN構æˆã§ã‚‚éžUnicode API構æˆã§ã¯ã‚±ãƒ¼ã‚¹ センシティブã¨ãªã‚‹ã€‚
      • +
      +
      + + +
      +

      対応情報

      +

      ã“ã®é–¢æ•°ã¯ã€f_opendir関数ãŠã‚ˆã³f_readdir関数ã®ãƒ©ãƒƒãƒ‘ー関数ã§ã™ã€‚_USE_FIND == 1ã§ã€ã‹ã¤_FS_MINIMIZE <= 1ã®ã¨ã使用å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚

      +
      + + +
      +

      使用例

      +
      +/* ディレクトリ内ã®ã‚ªãƒ–ジェクトã®æ¤œç´¢ã¨è¡¨ç¤º */
      +
      +void find_image (void)
      +{
      +    FRESULT fr;     /* 戻り値 */
      +    DIR dj;         /* ディレクトリ オブジェクト */
      +    FILINFO fno;    /* ファイル情報構造体 */
      +#if _USE_LFN
      +    char lfn[_MAX_LFN + 1];
      +    fno.lfname = lfn;
      +    fno.lfsize = _MAX_LFN + 1;
      +#endif
      +
      +    fr = f_findfirst(&dj, &fno, "", "dsc*.jpg");  /* "dsc"ã§å§‹ã¾ã‚‹JPEGファイルを検索 */
      +
      +    while (fr == FR_OK && fno.fname[0]) {         /* 見ã¤ã‹ã‚‹é–“繰り返㗠*/
      +#if _USE_LFN
      +        printf("%s  %s\n", fno.fname, fno.lfname);/* 見ã¤ã‘ãŸé …ç›®ã®åå‰ã‚’表示 */
      +#else
      +        printf("%s\n", fno.fname);
      +#endif
      +        fr = f_findnext(&dj, &fno);               /* 次を検索 */
      +    }
      +    f_closedir(&dj);
      +}
      +
      +
      + + +
      +

      å‚ç…§

      +

      f_findnext, f_closedir, DIR, FILINFO

      +
      + +

      戻る

      + + diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/findnext.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/findnext.html new file mode 100644 index 00000000..40191a02 --- /dev/null +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/findnext.html @@ -0,0 +1,68 @@ + + + + + + + + +FatFs - f_findnext + + + + +
      +

      f_findnext

      +

      次ã«ãƒžãƒƒãƒã™ã‚‹ã‚ªãƒ–ジェクトを検索ã—ã¾ã™ã€‚

      +
      +FRESULT f_findnext (
      +  DIR* dp,              /* [IN] ディレクトリ構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
      +  FILINFO* fno          /* [OUT] ファイル情報構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
      +);
      +
      +
      + +
      +

      引数

      +
      +
      dp
      +
      f_findfirst関数ã§ä½œæˆã•ã‚ŒãŸæœ‰åŠ¹ãªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ§‹é€ ä½“ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
      +
      fno
      +
      マッãƒã—ãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªé …目を格ç´ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«æƒ…報構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
      +
      +
      + + + + + +
      +

      解説

      +

      次ã«åå‰ã®ãƒžãƒƒãƒã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªé …目を検索ã—ã€è¦‹ã¤ã‹ã£ãŸé …目をファイル情報構造体ã«ã‚¹ãƒˆã‚¢ã—ã¾ã™ã€‚åå‰ã®ãƒžãƒƒãƒã™ã‚‹é …ç›®ãŒè¦‹ã¤ã‹ã‚‰ãšãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®æœ€å¾Œã¾ã§é”ã—ãŸå ´åˆã¯ã€fno->fname[]ã«ãƒŒãƒ«æ–‡å­—列ãŒè¿”ã•ã‚Œã¾ã™ã€‚

      +
      + + +
      +

      対応情報

      +

      ã“ã®é–¢æ•°ã¯ã€f_readdir関数ã®ãƒ©ãƒƒãƒ‘ー関数ã§ã™ã€‚_USE_FIND == 1ã§ã€ã‹ã¤_FS_MINIMIZE <= 1ã®ã¨ã使用å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚

      +
      + + +
      +

      å‚ç…§

      +

      f_findfirst, f_closedir, DIR, FILINFO

      +
      + +

      戻る

      + + diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/forward.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/forward.html index e9212ce1..acbb4677 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/forward.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/forward.html @@ -45,7 +45,6 @@ FRESULT f_forward ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_DENIED, FR_INVALID_OBJECT, FR_TIMEOUT @@ -114,7 +113,7 @@ FRESULT play_file ( if (rc) return rc; /* å…¨ã¦ã®ãƒ‡ãƒ¼ã‚¿ãŒè»¢é€ã•ã‚Œã‚‹ã‹ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã™ã‚‹ã¾ã§ç¶šã‘ã‚‹ */ - while (rc == FR_OK && fil.fptr < fil.fsize) { + while (rc == FR_OK && !f_eof(&fil)) { /* ã»ã‹ã®å‡¦ç†... */ diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/getfree.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/getfree.html index 8b99c764..91a14090 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/getfree.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/getfree.html @@ -53,7 +53,7 @@ FRESULT f_getfree (

      解説

      -

      è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã®ç©ºã領域ã®ã‚µã‚¤ã‚ºã‚’クラスタå˜ä½ã§å–å¾—ã—ã¾ã™ã€‚è¿”ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã®csizeメンãƒãŒã‚¯ãƒ©ã‚¹ã‚¿ã‚ãŸã‚Šã®ã‚»ã‚¯ã‚¿æ•°ã‚’示ã—ã¦ã„ã‚‹ã®ã§ã€ã“れを元ã«ã‚»ã‚¯ã‚¿å˜ä½ã®ç©ºãサイズãŒè¨ˆç®—ã§ãã¾ã™ã€‚FAT32ボリュームã«ãŠã„ã¦ã¯ã€FSINFOã®æƒ…å ±ãŒå®Ÿéš›ã®ç©ºãクラスタ数ã¨åŒæœŸã—ã¦ã„ãªã„å ´åˆã€ä¸æ­£ç¢ºãªå€¤ã‚’è¿”ã™å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®å•é¡Œã‚’é¿ã‘ã‚‹ãŸã‚ã€_FS_NOFSINFOオプションã§ãƒžã‚¦ãƒ³ãƒˆå¾Œã®åˆå›žã¯å¿…ãšãƒ•ãƒ«FATスキャンをã™ã‚‹ã‚ˆã†ã«æ§‹æˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚

      +

      è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã®ç©ºã領域ã®ã‚µã‚¤ã‚ºã‚’クラスタå˜ä½ã§å–å¾—ã—ã¾ã™ã€‚è¿”ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã®csizeメンãƒãŒã‚¯ãƒ©ã‚¹ã‚¿ã‚ãŸã‚Šã®ã‚»ã‚¯ã‚¿æ•°ã‚’示ã—ã¦ã„ã‚‹ã®ã§ã€ã“れを元ã«ã‚»ã‚¯ã‚¿å˜ä½ã®ç©ºãサイズãŒè¨ˆç®—ã§ãã¾ã™ã€‚FAT32ボリュームã«ãŠã„ã¦ã¯ã€FSINFOã®æƒ…å ±ãŒå®Ÿéš›ã®ç©ºãクラスタ数ã¨åŒæœŸã—ã¦ã„ãªã„å ´åˆã€ä¸æ­£ç¢ºãªå€¤ã‚’è¿”ã™å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®å•é¡Œã‚’é¿ã‘ã‚‹ãŸã‚ã€_FS_NOFSINFOオプションã§ãƒžã‚¦ãƒ³ãƒˆå¾Œã®åˆå›žã¯å¿…ãšãƒ•ãƒ«FATスキャンをã™ã‚‹ã‚ˆã†ã«æ§‹æˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/gets.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/gets.html index 74e0b22e..a979068d 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/gets.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/gets.html @@ -44,14 +44,14 @@ TCHAR* f_gets (

      解説

      -

      ã“ã®é–¢æ•°ã¯f_read()ã®ãƒ©ãƒƒãƒ‘ー関数ã§ã™ã€‚読ã¿å‡ºã—動作ã¯ã€æœ€åˆã®'\n'を読ã¿è¾¼ã‚€ã‹ã€ãƒ•ã‚¡ã‚¤ãƒ«çµ‚端ã«é”ã™ã‚‹ã‹ã€len - 1文字を読ã¿å‡ºã™ã¾ã§ç¶šãã¾ã™ã€‚読ã¿è¾¼ã¾ã‚ŒãŸæ–‡å­—列ã®çµ‚端ã«ã¯'\0'ãŒä»˜åŠ ã•ã‚Œã¾ã™ã€‚æ—¢ã«ãƒ•ã‚¡ã‚¤ãƒ«çµ‚端ã§1文字も読ã¿è¾¼ã¾ã‚Œãªã‹ã£ãŸã¨ãã€ã¾ãŸã¯ä½•ã‚‰ã‹ã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã¨ãã¯é–¢æ•°ã¯å¤±æ•—ã—ヌル ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ファイル終端ã‹ã‚¨ãƒ©ãƒ¼ã‹ã¯f_eof(),f_error()マクロã§èª¿ã¹ã‚‰ã‚Œã¾ã™ã€‚

      +

      読ã¿å‡ºã—動作ã¯ã€æœ€åˆã®'\n'を読ã¿è¾¼ã‚€ã‹ã€ãƒ•ã‚¡ã‚¤ãƒ«çµ‚端ã«é”ã™ã‚‹ã‹ã€len - 1文字を読ã¿å‡ºã™ã¾ã§ç¶šãã¾ã™ã€‚読ã¿è¾¼ã¾ã‚ŒãŸæ–‡å­—列ã®çµ‚端ã«ã¯'\0'ãŒä»˜åŠ ã•ã‚Œã¾ã™ã€‚æ—¢ã«ãƒ•ã‚¡ã‚¤ãƒ«çµ‚端ã§1文字も読ã¿è¾¼ã¾ã‚Œãªã‹ã£ãŸã¨ãã€ã¾ãŸã¯ä½•ã‚‰ã‹ã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã¨ãã¯é–¢æ•°ã¯å¤±æ•—ã—ヌル ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ファイル終端ã‹ã‚¨ãƒ©ãƒ¼ã‹ã¯f_eof/f_error関数ã§èª¿ã¹ã‚‰ã‚Œã¾ã™ã€‚

      Unicode API構æˆ(_LFN_UNICODE == 1)ãŒé¸æŠžã•ã‚Œã¦ã„ã‚‹ã¨ãã¯ã€buffã¯UTF-16文字列ã«ãªã‚Šã¾ã™ãŒã€ãƒ•ã‚¡ã‚¤ãƒ«ä¸Šã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã¯ã€_STRF_ENCODEオプションã§é¸æŠžã§ãã¾ã™ã€‚ãれ以外ã®æ™‚ã¯ç„¡å¤‰æ›(1ãƒã‚¤ãƒˆ/1文字)ã§èª­ã¿å‡ºã—ã¾ã™ã€‚

      対応情報

      -

      _USE_STRFUNCãŒ1ã¾ãŸã¯2ã®ã¨ã使用å¯èƒ½ã§ã™ã€‚2ã®ã¨ãã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã«å«ã¾ã‚Œã‚‹'\r'ãŒå–り除ã‹ã‚Œã¦ãƒãƒƒãƒ•ã‚¡ã«èª­ã¿è¾¼ã¾ã‚Œã¾ã™ã€‚

      +

      ã“ã®é–¢æ•°ã¯f_read関数ã®ãƒ©ãƒƒãƒ‘ー関数ã§ã™ã€‚_USE_STRFUNCãŒ1ã¾ãŸã¯2ã®ã¨ã使用å¯èƒ½ã§ã™ã€‚2ã®ã¨ãã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã«å«ã¾ã‚Œã‚‹'\r'ãŒå–り除ã‹ã‚Œã¦ãƒãƒƒãƒ•ã‚¡ã«èª­ã¿è¾¼ã¾ã‚Œã¾ã™ã€‚

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/lseek.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/lseek.html index 88e1ab2a..88bb5ec0 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/lseek.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/lseek.html @@ -39,7 +39,6 @@ FRESULT f_lseek ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT, FR_NOT_ENOUGH_CORE @@ -49,19 +48,19 @@ FRESULT f_lseek (

      解説

      -

      ファイルã®ãƒªãƒ¼ãƒ‰/ライト ãƒã‚¤ãƒ³ã‚¿(次ã«èª­ã¿å‡ºã—・書ãè¾¼ã¿ã•ã‚Œã‚‹ãƒã‚¤ãƒˆã®ã‚ªãƒ•ã‚»ãƒƒãƒˆ)を移動ã—ã¾ã™ã€‚オフセットã®åŽŸç‚¹ã¯ãƒ•ã‚¡ã‚¤ãƒ«å…ˆé ­ã§ã™ã€‚書ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã§ãƒ•ã‚¡ã‚¤ãƒ« サイズより大ããªå€¤ã‚’指定ã™ã‚‹ã¨ã€ãã“ã¾ã§ãƒ•ã‚¡ã‚¤ãƒ« サイズãŒæ‹¡å¼µã•ã‚Œã€æ‹¡å¼µã•ã‚ŒãŸéƒ¨åˆ†ã®ãƒ‡ãƒ¼ã‚¿ã¯æœªå®šç¾©ã¨ãªã‚Šã¾ã™ã€‚データをé…延無ã高速ã«æ›¸ãè¾¼ã¿ãŸã„ã¨ãã¯ã€äºˆã‚ã“ã®é–¢æ•°ã§å¿…è¦ãªã‚µã‚¤ã‚ºã¾ã§ãƒ•ã‚¡ã‚¤ãƒ« サイズを拡張ã—ã¦ãŠãã¨è‰¯ã„ã§ã—ょã†ã€‚f_lseek()ãŒæ­£å¸¸çµ‚了ã—ãŸã‚ã¨ã¯ã€ãƒªãƒ¼ãƒ‰/ライト ãƒã‚¤ãƒ³ã‚¿ãŒæ­£ã—ã移動ã—ãŸã‹ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¹ãã§ã™ã€‚リード/ライト ãƒã‚¤ãƒ³ã‚¿ãŒæŒ‡å®šã‚ˆã‚Šå°ã•ã„ã¨ãã¯ã€æ¬¡ã®åŽŸå› ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚

      +

      ファイルã®ãƒªãƒ¼ãƒ‰/ライト ãƒã‚¤ãƒ³ã‚¿(次ã«èª­ã¿å‡ºã—・書ãè¾¼ã¿ã•ã‚Œã‚‹ãƒã‚¤ãƒˆã®ã‚ªãƒ•ã‚»ãƒƒãƒˆ)を移動ã—ã¾ã™ã€‚オフセットã®åŽŸç‚¹ã¯ãƒ•ã‚¡ã‚¤ãƒ«å…ˆé ­ã§ã™ã€‚書ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã§ãƒ•ã‚¡ã‚¤ãƒ« サイズより大ããªå€¤ã‚’指定ã™ã‚‹ã¨ã€ãã“ã¾ã§ãƒ•ã‚¡ã‚¤ãƒ« サイズãŒæ‹¡å¼µã•ã‚Œã€æ‹¡å¼µã•ã‚ŒãŸéƒ¨åˆ†ã®ãƒ‡ãƒ¼ã‚¿ã¯æœªå®šç¾©ã¨ãªã‚Šã¾ã™ã€‚データをé…延無ã高速ã«æ›¸ãè¾¼ã¿ãŸã„ã¨ãã¯ã€äºˆã‚ã“ã®é–¢æ•°ã§å¿…è¦ãªã‚µã‚¤ã‚ºã¾ã§ãƒ•ã‚¡ã‚¤ãƒ« サイズを拡張ã—ã¦ãŠãã¨è‰¯ã„ã§ã—ょã†ã€‚f_lseek関数ãŒæ­£å¸¸çµ‚了ã—ãŸã‚ã¨ã¯ã€ãƒªãƒ¼ãƒ‰/ライト ãƒã‚¤ãƒ³ã‚¿ãŒæ­£ã—ã移動ã—ãŸã‹ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¹ãã§ã™ã€‚リード/ライト ãƒã‚¤ãƒ³ã‚¿ãŒæŒ‡å®šã‚ˆã‚Šå°ã•ã„ã¨ãã¯ã€æ¬¡ã®åŽŸå› ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚

      • éžæ›¸ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã¾ãŸã¯é«˜é€Ÿã‚·ãƒ¼ã‚¯ モードã®ãŸã‚ã€ãƒ•ã‚¡ã‚¤ãƒ« サイズã§ã‚¯ãƒªãƒƒãƒ—ã•ã‚ŒãŸã€‚
      • ファイル拡張中ã«ãƒ‡ã‚£ã‚¹ã‚¯ãŒæº€æ¯ã«ãªã£ãŸã€‚
      -

      _USE_FASTSEEKãŒ1ã§ã€ä¸”ã¤ãƒ•ã‚¡ã‚¤ãƒ« オブジェクトã®cltblメンãƒãŒNULL以外(f_open()ã§NULLã«è¨­å®šã•ã‚Œã‚‹)ã®ã¨ãã€é«˜é€Ÿã‚·ãƒ¼ã‚¯ モードã«ãªã‚Šã¾ã™ã€‚ã“ã‚Œã¯ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¯ãƒ©ã‚¹ã‚¿é…置情報(CLMT)をメモリ上ã«ä¿æŒã—ã¦ãŠãã“ã¨ã«ã‚ˆã‚Šã€FATã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ãªã後方シークやロング シークを高速ã«è¡Œã†æ©Ÿèƒ½ã§ã™ã€‚高速シーク モードã¯ã€f_read()/f_wtite()ã®å‹•ä½œã«ã‚‚é©ç”¨ã•ã‚Œã¾ã™ã€‚高速シーク モードã§ã¯f_wtite()/f_lseek()ã«ã‚ˆã‚‹ãƒ•ã‚¡ã‚¤ãƒ« サイズã®æ‹¡å¼µã¯ã§ãã¾ã›ã‚“。

      -

      高速シーク動作を行ã†å‰ã«ã€CLMTを作æˆã—ã¦ãŠãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“れを作æˆã™ã‚‹ã«ã¯ã€ã¾ãšCLMTæ ¼ç´ãƒãƒƒãƒ•ã‚¡(DWORDåž‹é…列)を準備ã—ã€cltblメンãƒã«ãã®ãƒã‚¤ãƒ³ã‚¿ã‚’セットã—ã¾ã™ã€‚ãã—ã¦ã€é…列ã®å…ˆé ­è¦ç´ ã«ãã®é…列ã®ã‚µã‚¤ã‚º(è¦ç´ æ•°)を入れã€f_lseek()ã‚’ofsã«CREATE_LINKMAPを指定ã—ã¦å‘¼ã³å‡ºã—ã¾ã™ã€‚関数ãŒæˆåŠŸã™ã‚‹ã¨CLMTãŒä½œæˆã•ã‚Œã€ä»¥é™ã®f_read()/f_write()/f_lseek()ã§ã¯FATã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯ç™ºç”Ÿã—ã¾ã›ã‚“。FR_NOT_ENOUGH_COREã§å¤±æ•—ã—ãŸã¨ãã¯é…列サイズãŒä¸è¶³ã§ã€å…ˆé ­è¦ç´ ã«ã¯å®Ÿéš›ã«å¿…è¦ã¨ãªã‚‹è¦ç´ æ•°ãŒè¿”ã•ã‚Œã¾ã™ã€‚å¿…è¦ãªè¦ç´ æ•°ã¯ã€(ファイルã®åˆ†å‰²æ•° + 1) * 2 ã§ã™ã€‚ãŸã¨ãˆã°ã€ãƒ•ã‚¡ã‚¤ãƒ«ãŒ5ã¤ã®ãƒ•ãƒ©ã‚°ãƒ¡ãƒ³ãƒˆã«åˆ†æ–­ã•ã‚Œã¦ã„ã‚‹ã¨ãã«å¿…è¦ãªè¦ç´ æ•°ã¯ã€12ã¨ãªã‚Šã¾ã™ã€‚

      +

      高速シーク モードã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¯ãƒ©ã‚¹ã‚¿é…置情報(CLMT)をメモリ上ã«ä¿æŒã—ã¦ãŠãã“ã¨ã«ã‚ˆã‚Šã€FATã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ãªã後方シークやロング シークを高速ã«è¡Œã†æ©Ÿèƒ½ã§ã€ã‚·ãƒ¼ã‚¯å‹•ä½œã®ã»ã‹f_read/f_wtite関数ã®å‹•ä½œã«ã‚‚é©ç”¨ã•ã‚Œã¾ã™ã€‚ファイルãŒé«˜é€Ÿã‚·ãƒ¼ã‚¯ モードã®é–“ã¯f_wtite/f_lseek関数ã«ã‚ˆã‚‹ãƒ•ã‚¡ã‚¤ãƒ« サイズã®æ‹¡å¼µã¯ã§ãã¾ã›ã‚“。

      +

      高速シーク モードã¯ã€ãƒ•ã‚¡ã‚¤ãƒ« オブジェクトã®ãƒ¡ãƒ³ãƒcltbl(f_open関数ã§NULLã«ãªã‚‹)ã«NULL以外を設定ã—ãŸã¨ã有効ã«ãªã‚‹ã®ã§ã€ã¾ãšCLMTを作æˆã—ã¦ãŠãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“れを作æˆã™ã‚‹ã«ã¯ã€ã¾ãšCLMTæ ¼ç´ãƒãƒƒãƒ•ã‚¡(DWORDåž‹é…列)を準備ã—ã€cltblã«ãã®ãƒã‚¤ãƒ³ã‚¿ã‚’セットã—ã¾ã™ã€‚ãã—ã¦ã€é…列ã®å…ˆé ­è¦ç´ ã«ãã®é…列ã®ã‚µã‚¤ã‚º(è¦ç´ æ•°)を入れã€f_lseek関数をofsã«CREATE_LINKMAPを指定ã—ã¦å‘¼ã³å‡ºã—ã¾ã™ã€‚関数ãŒæˆåŠŸã™ã‚‹ã¨CLMTãŒä½œæˆã•ã‚Œã€ä»¥é™ã®f_read/f_write/f_lseek関数ã§ã¯FATã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯ç™ºç”Ÿã—ã¾ã›ã‚“。CLMTã®å…ˆé ­è¦ç´ ã«ã¯å®Ÿéš›ã«ä½¿ç”¨ã—ãŸ(ã¾ãŸã¯å¿…è¦ã¨ãªã‚‹)è¦ç´ æ•°ãŒè¿”ã•ã‚Œã¾ã™ã€‚使用ã•ã‚Œã‚‹è¦ç´ æ•°ã¯ã€(ファイルã®åˆ†å‰²æ•° + 1) * 2 ã§ã™ã€‚ãŸã¨ãˆã°ã€ãƒ•ã‚¡ã‚¤ãƒ«ãŒ5ã¤ã®ãƒ•ãƒ©ã‚°ãƒ¡ãƒ³ãƒˆã«åˆ†æ–­ã•ã‚Œã¦ã„ã‚‹ã¨ãã¯ã€12è¦ç´ ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚FR_NOT_ENOUGH_COREã§å¤±æ•—ã—ãŸã¨ãã¯ã€é…列サイズãŒä¸è¶³ã§ã™ã€‚

      対応情報

      -

      _FS_MINIMIZE < 3ã®ã¨ã使用å¯èƒ½ã§ã™ã€‚

      +

      _FS_MINIMIZE < 3ã®ã¨ã使用å¯èƒ½ã§ã™ã€‚高速シーク モードを利用ã™ã‚‹ã¨ãã¯ã€_USE_FASTSEEK == 1ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

      @@ -107,6 +106,8 @@ FRESULT f_lseek ( DWORD clmt[SZ_TBL]; /* リンク マップ テーブル格ç´ãƒãƒƒãƒ•ã‚¡ */ + res = f_open(fp, fname, FA_READ | FA_WRITE); /* ファイルを開ã */ + res = f_lseek(fp, ofs1); /* 通常シーク (オープン時ã€cltblã¯NULLã«åˆæœŸåŒ–ã•ã‚Œã‚‹) */ fp->cltbl = clmt; /* 高速シーク機能ã®æœ‰åŠ¹åŒ– */ diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/mkdir.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/mkdir.html index 63da7078..5e92469a 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/mkdir.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/mkdir.html @@ -13,7 +13,7 @@

      f_mkdir

      -

      ディレクトリを作æˆã—ã¾ã™ã€‚

      +

      サブ ディレクトリを作æˆã—ã¾ã™ã€‚

       FRESULT f_mkdir (
         const TCHAR* path /* [IN] 作æˆã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªåã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
      @@ -53,7 +53,7 @@ FRESULT f_mkdir (
       
       

      解説

      -

      空ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’作æˆã—ã¾ã™ã€‚

      +

      空ã®ã‚µãƒ– ディレクトリを作æˆã—ã¾ã™ã€‚ディレクトリを削除ã™ã‚‹ã¨ãã¯f_unlink関数を使用ã—ã¦ãã ã•ã„。

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/mkfs.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/mkfs.html index 19b4341e..20bee57a 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/mkfs.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/mkfs.html @@ -13,7 +13,7 @@

      f_mkfs

      -

      è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã«FATボリュームを作æˆ(フォーマット)ã—ã¾ã™ã€‚

      +

      è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã«FATボリュームを作æˆã—ã¾ã™ã€‚

       FRESULT f_mkfs (
         const TCHAR* path, /* [IN] è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ç•ªå· */
      @@ -27,7 +27,7 @@ FRESULT f_mkfs (
       

      引数

      path
      -
      フォーマット対象ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–を示ã™ãƒ‘スåを示ã™ãƒŒãƒ«æ–‡å­—'\0'終端ã®æ–‡å­—列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚ドライブ番å·ã‚’å«ã¾ãªã„å ´åˆã¯ã€ã‚«ãƒ¬ãƒ³ãƒˆ ドライブをæ„味ã—ã¾ã™ã€‚
      +
      対象ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–を示ã™ãƒ‘スåを示ã™ãƒŒãƒ«æ–‡å­—'\0'終端ã®æ–‡å­—列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚ドライブ番å·ã‚’å«ã¾ãªã„å ´åˆã¯ã€ã‚«ãƒ¬ãƒ³ãƒˆ ドライブをæ„味ã—ã¾ã™ã€‚
      sfd
      パーテーション形å¼ã€‚(0(FDISK) ã¾ãŸã¯ 1(SFD))
      au
      @@ -49,8 +49,8 @@ FRESULT f_mkfs (

      説明

      -

      物ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã«FATボリュームを作æˆã—ã¾ã™ã€‚FDISKå½¢å¼ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã¯ã€ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–全体をå ã‚る基本区画(パーテーション)ãŒä½œæˆã•ã‚Œã€ãã®ä¸­ã«FATボリュームãŒä½œæˆã•ã‚Œã¾ã™ã€‚SFDå½¢å¼ã§ã¯ã€FATボリュームãŒç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®å…ˆé ­ã‚»ã‚¯ã‚¿ã‹ã‚‰ãƒ™ã‚¿ã§ä½œæˆã•ã‚Œã¾ã™ã€‚

      -

      フォーマットã™ã‚‹è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ãŒãƒžãƒ«ãƒ パーテーション機能(_MULTI_PARTITION)ã«ã‚ˆã£ã¦ç‰¹å®šã®åŒºç”»(1~4)ã«çµã³ä»˜ã‘られã¦ã„ã‚‹å ´åˆã¯ã€ãã®åŒºç”»ã®ä¸­ã«FATボリュームãŒä½œæˆã•ã‚Œã¾ã™ã€‚sfdã¯ç„¡è¦–ã•ã‚Œã€ã¾ãŸå¯¾å¿œã™ã‚‹ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã¯ã“ã‚Œã«å…ˆç«‹ã¡ã€f_fdisk()ã¾ãŸã¯ä»–ã®ãƒ„ールã§é©åˆ‡ã«åŒºç”»è¨­å®šã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

      +

      物ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã«FATボリュームを作æˆ(フォーマット)ã—ã¾ã™ã€‚FDISKå½¢å¼ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã¯ã€ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–全体をå ã‚る基本区画(パーテーション)ãŒä½œæˆã•ã‚Œã€ãã®ä¸­ã«FATボリュームãŒä½œæˆã•ã‚Œã¾ã™ã€‚SFDå½¢å¼ã§ã¯ã€FATボリュームãŒç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®å…ˆé ­ã‚»ã‚¯ã‚¿ã‹ã‚‰ãƒ™ã‚¿ã§ä½œæˆã•ã‚Œã¾ã™ã€‚

      +

      マルムパーテーション機能(_MULTI_PARTITION)ãŒæœ‰åŠ¹ã§ã€ã‹ã¤ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆå¯¾è±¡ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ãŒç‰¹å®šã®åŒºç”»(1~4)ã«çµã³ä»˜ã‘られã¦ã„ã‚‹å ´åˆã¯ã€ãã®åŒºç”»ã®ä¸­ã«FATボリュームãŒä½œæˆã•ã‚Œã¾ã™ã€‚sfdã¯ç„¡è¦–ã•ã‚Œã€ãã®ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã¯ã“ã‚Œã«å…ˆç«‹ã¡ã€f_fdisk関数ã¾ãŸã¯ä»–ã®ãƒ„ールã§é©åˆ‡ã«åŒºç”»è¨­å®šã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

      パーテーション形å¼ã«ã¯ã€FDISKå½¢å¼ã¨SFDå½¢å¼ã®äºŒé€šã‚Šã‚ã‚Šã¾ã™ã€‚FDISKå½¢å¼ã¯ã€ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã€MMCã€SDCã€CFCã€U Diskãªã©ã§æ¨™æº–çš„ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚FDISKå½¢å¼ã§ã¯ä¸€å°ã®ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã«ä¸€ã¤ã¾ãŸã¯è¤‡æ•°ã®åŒºç”»ã‚’作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚区画管ç†æƒ…å ±ã¯MBR(物ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®å…ˆé ­ã‚»ã‚¯ã‚¿)ã«è¨˜éŒ²ã•ã‚Œã¾ã™ã€‚SFDå½¢å¼ã¯å˜ã«ä½•ã®åˆ†å‰²ã‚‚è¡Œã‚ãªã„å½¢å¼ã§ã€ãƒœãƒªãƒ¥ãƒ¼ãƒ ã¯ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®å…ˆé ­ã‚»ã‚¯ã‚¿ã‹ã‚‰é–‹å§‹ã—ã¾ã™ã€‚SFDå½¢å¼ã¯ã€ãƒ•ãƒ­ãƒƒãƒ”ー ディスクã€ãƒžã‚¤ã‚¯ãƒ­ãƒ‰ãƒ©ã‚¤ãƒ–ã€å…‰å­¦ãƒ‡ã‚£ã‚¹ã‚¯ã€ãŠã‚ˆã³ãã®ä»–スーパー フロッピー メディアã§æ¨™æº–çš„ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™ã€‚

      FATタイプ(FAT12/FAT16/FAT32)ã¯ã€ãã®ãƒœãƒªãƒ¥ãƒ¼ãƒ ä¸Šã®ã‚¯ãƒ©ã‚¹ã‚¿æ•°ã«ã‚ˆã£ã¦ã®ã¿æ±ºå®šã•ã‚Œã‚‹æ±ºã¾ã‚Š[FAT仕様書より]ã«ãªã£ã¦ã„ã¦ã€ãれ以外ã®è¦å› ã¯ã‚ã‚Šã¾ã›ã‚“。ã—ãŸãŒã£ã¦ã€ã©ã®FATタイプã«ãªã‚‹ã‹ã¯ãƒœãƒªãƒ¥ãƒ¼ãƒ  サイズã¨ã‚¯ãƒ©ã‚¹ã‚¿ サイズã«ä¾å­˜ã—ã¾ã™ã€‚クラスタ サイズã¯å¤§ããã™ã‚‹ã»ã©æ€§èƒ½ãŒä¸ŠãŒã‚Šã¾ã™ã€‚

      クラスタ数ãŒFATタイプã®å¢ƒç•Œã«è¿‘ããªã‚‹ã¨ãã¯ã€FR_MKFS_ABORTEDã§é–¢æ•°ãŒå¤±æ•—ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚

      @@ -66,7 +66,7 @@ FRESULT f_mkfs (

      使用例

      -/* Format the default drive */
      +/* Format default drive and create a file */
       int main (void)
       {
           FATFS fs;      /* File system object (volume work area) */
      @@ -75,7 +75,7 @@ int main (void)
           UINT bw;       /* Bytes written */
       
       
      -    /* Register work area */
      +    /* Register work area (do not care about error) */
           f_mount(&fs, "", 0);
       
           /* Create FAT volume with default cluster size */
      @@ -83,19 +83,18 @@ int main (void)
           if (res) ...
       
           /* Create a file as new */
      -    res = f_open(&fil, "hello.txt", FA_CREATE_NEW | FA_WRITE);
      +    res = f_open(&fil, "hello.txt", FA_CREATE_NEW | FA_WRITE);
           if (res) ...
       
           /* Write a message */
      -    f_write(&fil, "Hello, World!\r\n", 15, &bw);
      +    f_write(&fil, "Hello, World!\r\n", 15, &bw);
           if (bw != 15) ...
       
           /* Close the file */
      -    f_close(&fil);
      +    f_close(&fil);
       
           /* Unregister work area */
           f_mount(0, "", 0);
      -
       
      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/mount.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/mount.html index d465edb2..239ae20c 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/mount.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/mount.html @@ -27,7 +27,7 @@ FRESULT f_mount (

      引数

      fs
      -
      登録ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚
      +
      登録ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€ã¾ãŸã¯ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿
      path
      対象ã¨ãªã‚‹è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®ãƒ‘スåを示ã™ãƒŒãƒ«æ–‡å­—'\0'終端ã®æ–‡å­—列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚パスåã«ãƒ‰ãƒ©ã‚¤ãƒ–番å·ãŒå«ã¾ã‚Œãªã„å ´åˆã¯ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆ ドライブを指定ã—ãŸã“ã¨ã«ãªã‚Šã¾ã™ã€‚
      opt
      @@ -49,20 +49,20 @@ FRESULT f_mount (

      解説

      -

      FatFsモジュールã§ã¯ã€ãã‚Œãžã‚Œã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã¨ã„ã†ãƒ¯ãƒ¼ã‚¯ エリアãŒå¿…è¦ã§ã™ã€‚ã“ã®é–¢æ•°ã¯è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトを登録ã—ãŸã‚ŠæŠ¹æ¶ˆã—ãŸã‚Šã—ã¾ã™ã€‚何らã‹ã®ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ã‚’使用ã™ã‚‹å‰ã«ã€ã“ã®é–¢æ•°ã§ãã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトを与ãˆã¦ãŠã‹ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。fsã«ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã™ã‚‹ã¨ã€ãã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã®ç™»éŒ²ã¯æŠ¹æ¶ˆã•ã‚Œã‚‹ã ã‘ã§ã™ã€‚登録抹消ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã®ãƒ¡ãƒ¢ãƒªã¯è§£æ”¾ã§ãã¾ã™ã€‚æ“作対象ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã«é–‹ã‹ã‚ŒãŸã¾ã¾ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚„ディレクトリãŒã‚ã£ãŸå ´åˆã€ãれらã«å¯¾ã—ã¦ä½œæˆã•ã‚ŒãŸæ§‹é€ ä½“ã¯å…¨ã¦ç„¡åŠ¹ã«ãªã‚Šã¾ã™ã€‚ã“ã®é–¢æ•°ã®å†…部処ç†ã¯æ¬¡ã®ã‚ˆã†ãªé †ã«è¡Œã‚ã‚Œã¾ã™ã€‚

      +

      FatFsモジュールã§ã¯ã€ãã‚Œãžã‚Œã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã¨ã„ã†ãƒ¯ãƒ¼ã‚¯ エリアãŒå¿…è¦ã§ã™ã€‚ã“ã®é–¢æ•°ã¯è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトを登録ã—ãŸã‚ŠæŠ¹æ¶ˆã—ãŸã‚Šã—ã¾ã™ã€‚何らã‹ã®ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ã‚’使用ã™ã‚‹å‰ã«ã€ã“ã®é–¢æ•°ã§ãã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトを与ãˆã¦ãŠã‹ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。fsã«ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã™ã‚‹ã¨ã€ãã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã®ç™»éŒ²ã¯æŠ¹æ¶ˆã•ã‚Œã‚‹ã ã‘ã§ã™ã€‚登録抹消ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã®ãƒ¡ãƒ¢ãƒªã¯è§£æ”¾ã§ãã¾ã™ã€‚æ“作ã®å¯¾è±¡ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã«é–‹ã‹ã‚ŒãŸã¾ã¾ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚„ディレクトリãŒã‚ã£ãŸå ´åˆã€ãれらã«å¯¾ã—ã¦ä½œæˆã•ã‚ŒãŸæ§‹é€ ä½“ã¯å…¨ã¦ç„¡åŠ¹ã«ãªã‚Šã¾ã™ã€‚ã“ã®é–¢æ•°ã®å†…部処ç†ã¯æ¬¡ã®ã‚ˆã†ãªé †ã«è¡Œã‚ã‚Œã¾ã™ã€‚

      1. 対象ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã‚’pathã‹ã‚‰å¾—る。
      2. -
      3. æ—¢ã«ç™»éŒ²ã•ã‚Œã¦ã„るファイル システム オブジェクトã¯ã‚¯ãƒªã‚¢ã—ã€ç™»éŒ²ã‚’解除ã™ã‚‹ã€‚
      4. +
      5. æ—¢ã«ç™»éŒ²ã•ã‚Œã¦ã„るファイル システム オブジェクトã¯ã‚¯ãƒªã‚¢(無効化)ã—ã€ç™»éŒ²ã‚’解除ã™ã‚‹ã€‚
      6. fsãŒæœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã®ã¨ãã¯ã€ãã®ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトをクリアã—登録ã™ã‚‹ã€‚
      7. マウント動作ãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹ã¨ãã¯ã€ãれを実行ã™ã‚‹ã€‚

      optã«0を指定ã™ã‚‹ã¨ã€ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œ(物ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®åˆæœŸåŒ–ã€FATボリュームã®æ¤œç´¢ã€BPBを解æžã—ファイル システム オブジェクトをåˆæœŸåŒ–)ã¯è¡Œã‚ã‚Œãšã€é–¢æ•°ã¯ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®çŠ¶æ…‹ã«é–¢ã‚らãšå¸¸ã«æˆåŠŸã—ã¾ã™ã€‚関数内ã§ã¯ä¸‹ä½ãƒ¬ã‚¤ãƒ¤ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯ç™ºç”Ÿã›ãšã€æŒ‡å®šã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトをクリア(無効化)ã—ã€ãã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’内部é…列ã«ç™»éŒ²ã™ã‚‹ã ã‘ã§ã™ã€‚å˜ã«ç™»éŒ²æ¸ˆã¿ã®ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトをクリアã™ã‚‹ç›®çš„ã«ã‚‚使ãˆã¾ã™ã€‚実際ã®ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œã¯ã€ãƒœãƒªãƒ¥ãƒ¼ãƒ ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹(パスåを渡ã™ã‚‚ã®å…¨ã¦)ãŒè¡Œã‚ã‚ŒãŸã¨ãã«ã€æ¬¡ã®ã†ã¡ã„ãšã‚Œã‹ã®æ¡ä»¶ãŒçœŸã®å ´åˆã«è¡Œã‚ã‚Œã¾ã™ã€‚

        -
      • ファイル システム オブジェクトãŒã‚¯ãƒªã‚¢(無効)状態(f_mount()ã®å®Ÿè¡Œã«ã‚ˆã‚‹)
      • +
      • ファイル システム オブジェクトãŒã‚¯ãƒªã‚¢(無効)状態(f_mount関数ã®å®Ÿè¡Œã«ã‚ˆã‚‹)
      • 物ç†ãƒ‰ãƒ©ã‚¤ãƒ–ãŒæœªåˆæœŸåŒ–状態(システム リセットやメディアã®äº¤æ›ã«ã‚ˆã‚‹)
      -

      optã«1を指定ã™ã‚‹ã¨ã€ãƒ•ã‚¡ã‚¤ãƒ« システムオブジェクトã®ç™»éŒ²ã«ç¶šãマウント動作ãŒè¡Œã‚ã‚Œã¾ã™ã€‚メディアãŒç„¡ã„ãªã©ã®ç†ç”±ã§ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œã«å¤±æ•—ã™ã‚‹ã¨å¯¾å¿œã™ã‚‹ã‚¨ãƒ©ãƒ¼ã‚’è¿”ã—ファイル システム オブジェクト無効状態ã®ã¾ã¾ã«ãªã‚Šã¾ã™ãŒã€ç™»éŒ²è‡ªä½“ã¯æœ‰åŠ¹ãªã®ã§ç¶šã„ã¦ãƒœãƒªãƒ¥ãƒ¼ãƒ ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒã‚ã‚Œã°å†ã³ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œãŒå®Ÿè¡Œã•ã‚Œã¾ã™ã€‚

      -

      下ä½ãƒ¬ã‚¤ãƒ¤ã®å®Ÿè£…上メディア交æ›ã®æ¤œå‡ºãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œãªã„(disk_status()ã«å映ã•ã‚Œãªã„)ã¨ãã¯ã€ã‚¢ãƒ—リケーションã¯ãƒ¡ãƒ‡ã‚£ã‚¢äº¤æ›ã®å¾Œã“ã®é–¢æ•°ã§ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトを明示的ã«ã‚¯ãƒªã‚¢ã—ã€ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œãŒæ­£å¸¸ã«è¡Œãˆã‚‹ã‚ˆã†ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

      +

      optã«1を指定ã™ã‚‹ã¨ã€ãƒ•ã‚¡ã‚¤ãƒ« システムオブジェクトã®ç™»éŒ²ã«ç¶šãマウント動作ãŒè¡Œã‚ã‚Œã¾ã™ã€‚メディアãŒç„¡ã„ãªã©ã®ç†ç”±ã§ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œã«å¤±æ•—ã™ã‚‹ã¨å¯¾å¿œã™ã‚‹ã‚¨ãƒ©ãƒ¼ã‚’è¿”ã—ファイル システム オブジェクトã¯ã‚¯ãƒªã‚¢çŠ¶æ…‹ã®ã¾ã¾ã«ãªã‚Šã¾ã™ãŒã€ç™»éŒ²è‡ªä½“ã¯æœ‰åŠ¹ãªã®ã§ç¶šã„ã¦ãƒœãƒªãƒ¥ãƒ¼ãƒ ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒã‚ã‚Œã°å†ã³ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œãŒå®Ÿè¡Œã•ã‚Œã¾ã™ã€‚

      +

      下ä½ãƒ¬ã‚¤ãƒ¤ã®å®Ÿè£…上メディア交æ›ã®æ¤œå‡ºãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œãªã„(disk_status関数ã«å映ã•ã‚Œãªã„)ã¨ãã¯ã€ã‚¢ãƒ—リケーションã¯ãƒ¡ãƒ‡ã‚£ã‚¢äº¤æ›ã®å¾Œã“ã®é–¢æ•°ã§ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトを明示的ã«ã‚¯ãƒªã‚¢ã—ã€ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œãŒæ­£å¸¸ã«è¡Œãˆã‚‹ã‚ˆã†ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/open.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/open.html index c3083983..016341de 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/open.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/open.html @@ -37,7 +37,7 @@ FRESULT f_open ( FA_READ読ã¿å‡ºã—モードã§é–‹ãã¾ã™ã€‚読ã¿æ›¸ãã™ã‚‹å ´åˆã¯FA_WRITEã¨å…±ã«æŒ‡å®šã—ã¾ã™ã€‚ FA_WRITE書ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã§é–‹ãã¾ã™ã€‚読ã¿æ›¸ãã™ã‚‹å ´åˆã¯FA_READã¨å…±ã«æŒ‡å®šã—ã¾ã™ã€‚ FA_OPEN_EXISTING既存ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ãã¾ã™ã€‚ファイルãŒç„¡ã„ã¨ãã¯ã‚¨ãƒ©ãƒ¼ã«ãªã‚Šã¾ã™ã€‚(デフォルト) -FA_OPEN_ALWAYS既存ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ãã¾ã™ã€‚ファイルãŒç„¡ã„ã¨ãã¯ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã—ã¾ã™ã€‚追記ã®å ´åˆã¯ã€ã“ã®æ–¹æ³•ã§ã‚ªãƒ¼ãƒ—ンã—ãŸå¾Œã€f_lseek()ã§ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ€å¾Œå°¾ã«ç§»å‹•ã—ã¦ãã ã•ã„。 +FA_OPEN_ALWAYS既存ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ãã¾ã™ã€‚ファイルãŒç„¡ã„ã¨ãã¯ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã—ã¾ã™ã€‚追記ã®å ´åˆã¯ã€ã“ã®æ–¹æ³•ã§ã‚ªãƒ¼ãƒ—ンã—ãŸå¾Œã€f_lseek関数ã§ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ€å¾Œå°¾ã«ç§»å‹•ã—ã¦ãã ã•ã„。 FA_CREATE_NEWファイルを作æˆã—ã¾ã™ã€‚åŒåã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚ã‚‹å ´åˆã¯ã€FR_EXISTã§å¤±æ•—ã—ã¾ã™ã€‚ FA_CREATE_ALWAYSファイルを作æˆã—ã¾ã™ã€‚åŒåã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚ã‚‹å ´åˆã¯ã€ã‚µã‚¤ã‚ºã‚’0ã«ã—ã¦ã‹ã‚‰é–‹ãã¾ã™ã€‚ @@ -73,9 +73,9 @@ FRESULT f_open (

      解説

      -

      既存ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ã„ãŸã‚Šã€æ–°ã—ã„ファイルを作æˆã—ã¾ã™ã€‚関数ãŒæˆåŠŸã™ã‚‹ã¨ãƒ•ã‚¡ã‚¤ãƒ« オブジェクトãŒä½œæˆã•ã‚Œã€ä»¥é™ãã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚»ã‚¹ã«ä½¿ç”¨ã—ã¾ã™ã€‚ファイルを閉ã˜ã‚‹ã¨ãã¯ã€f_close()を使用ã—ã¾ã™ã€‚何らã‹ã®å¤‰æ›´ãŒè¡Œã‚ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ãŒãã®å¾Œæ­£ã—ãé–‰ã˜ã‚‰ã‚Œãªã‹ã£ãŸå ´åˆã€ãã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒç ´æã™ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚

      +

      既存ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ã„ãŸã‚Šã€æ–°ã—ã„ファイルを作æˆã—ã¾ã™ã€‚関数ãŒæˆåŠŸã™ã‚‹ã¨ãƒ•ã‚¡ã‚¤ãƒ« オブジェクトãŒä½œæˆã•ã‚Œã€ä»¥é™ãã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚»ã‚¹ã«ä½¿ç”¨ã—ã¾ã™ã€‚ファイルを閉ã˜ã‚‹ã¨ãã¯ã€f_close関数を使用ã—ã¾ã™ã€‚何らã‹ã®å¤‰æ›´ãŒè¡Œã‚ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ãŒãã®å¾Œæ­£ã—ãé–‰ã˜ã‚‰ã‚Œãªã‹ã£ãŸå ´åˆã€ãã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒç ´æã™ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚

      æ—¢ã«é–‹ã‹ã‚Œã¦ã„るファイルを開ãå¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€å¤šé‡ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ã‚’å‚ç…§ã—ã¦ãã ã•ã„。ã—ã‹ã—ã€ä¸€ã¤ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã™ã‚‹æ›¸ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã‚’å«ã‚€é‡è¤‡ã‚ªãƒ¼ãƒ—ンã¯å¸¸ã«ç¦æ­¢ã§ã™ã€‚

      -

      ファイル アクセスを開始ã™ã‚‹å‰ã«ã€f_mount()を使ã£ã¦ãã‚Œãžã‚Œã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«ãƒ¯ãƒ¼ã‚¯ エリア(ファイル システム オブジェクト)を与ãˆã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®åˆæœŸåŒ–ã®å¾Œã€ãã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«å¯¾ã—ã¦å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ãŒä½¿ãˆã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚

      +

      ファイル アクセスを開始ã™ã‚‹å‰ã«ã€f_mount関数を使ã£ã¦ãã‚Œãžã‚Œã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«ãƒ¯ãƒ¼ã‚¯ エリア(ファイル システム オブジェクト)を与ãˆã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®åˆæœŸåŒ–ã®å¾Œã€ãã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«å¯¾ã—ã¦å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ãŒä½¿ãˆã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/opendir.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/opendir.html index ae409849..15009b94 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/opendir.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/opendir.html @@ -28,7 +28,7 @@ FRESULT f_opendir (
      dp
      空ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª オブジェクト構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
      path
      -
      オープンã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒ‘スåを示ã™ãƒŒãƒ«æ–‡å­—'\0'終端ã®æ–‡å­—列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
      +
      é–‹ãディレクトリã®ãƒ‘スåを示ã™ãƒŒãƒ«æ–‡å­—'\0'終端ã®æ–‡å­—列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
      @@ -50,13 +50,12 @@ FRESULT f_opendir ( FR_NOT_ENOUGH_CORE, FR_TOO_MANY_OPEN_FILES

      -

      解説

      -

      ディレクトリを開ãã¾ã™ã€‚正常終了ã—ãŸã‚‰ã€ä½œæˆã•ã‚ŒãŸDIR構造体を使ã£ã¦ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®é …目を順次読ã¿å‡ºã›ã¾ã™ã€‚

      +

      ディレクトリを開ãã¾ã™ã€‚正常終了ã—ãŸã‚‰ã€ä½œæˆã•ã‚ŒãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª オブジェクト構造体を使ã£ã¦ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®é …目を順次読ã¿å‡ºã›ã¾ã™ã€‚

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/printf.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/printf.html index 4de1da2f..6e3a3f8f 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/printf.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/printf.html @@ -45,7 +45,7 @@ int f_printf (

      解説

      -

      ã“ã®é–¢æ•°ã¯ã€f_putc()ãŠã‚ˆã³f_puts()ã®ãƒ©ãƒƒãƒ‘ー関数ã§ã™ã€‚書å¼åˆ¶å¾¡æ©Ÿèƒ½ã¯C標準ライブラリã®ã‚µãƒ–セットã¨ãªã£ã¦ã„ã¦ã€æ›¸å¼åˆ¶å¾¡æ–‡å­—ã¯æ¬¡ã«ç¤ºã™ã‚‚ã®ãŒä½¿ç”¨å¯èƒ½ã§ã™ã€‚

      +

      書å¼åˆ¶å¾¡æ©Ÿèƒ½ã¯C標準ライブラリã®ã‚µãƒ–セットã¨ãªã£ã¦ã„ã¦ã€æ›¸å¼åˆ¶å¾¡æ–‡å­—ã¯æ¬¡ã«ç¤ºã™ã‚‚ã®ãŒä½¿ç”¨å¯èƒ½ã§ã™ã€‚

      • タイプ: c C s S d D u U x X b B
      • 精度指定: l L
      • @@ -56,7 +56,7 @@ int f_printf (

        対応情報

        -

        _FS_READONLY == 0ã§ã€ä¸”ã¤_USE_STRFUNCãŒ1ã¾ãŸã¯2ã®ã¨ã使用å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚2ã®æ™‚ã¯ã€å‡ºåŠ›ã«å«ã¾ã‚Œã‚‹'\n'ãŒ'\r'+'\n'ã«å±•é–‹ã•ã‚Œã¦ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¾ã‚Œã¾ã™ã€‚

        +

        ã“ã®é–¢æ•°ã¯ã€f_putc関数ãŠã‚ˆã³f_puts関数ã®ãƒ©ãƒƒãƒ‘ー関数ã§ã™ã€‚_FS_READONLY == 0ã§ã€ä¸”ã¤_USE_STRFUNCãŒ1ã¾ãŸã¯2ã®ã¨ã使用å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚2ã®æ™‚ã¯ã€å‡ºåŠ›ã«å«ã¾ã‚Œã‚‹'\n'ãŒ'\r'+'\n'ã«å±•é–‹ã•ã‚Œã¦ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¾ã‚Œã¾ã™ã€‚

        APIã«UnicodeãŒé¸æŠž(_LFN_UNICODEãŒ1)ã•ã‚Œã¦ã„ã‚‹ã¨ãã¯ã€fmtã¯Unicode文字列ã«ãªã‚Šã¾ã™ãŒã€ãƒ•ã‚¡ã‚¤ãƒ«ä¸Šã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã¯ã€_STRF_ENCODEオプションã§é¸æŠžã§ãã¾ã™ã€‚ãれ以外ã®æ™‚ã¯ç„¡å¤‰æ›(1ãƒã‚¤ãƒˆ/1文字)ã§æ›¸ãè¾¼ã¿ã¾ã™ã€‚

        diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/putc.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/putc.html index 6b80b1a7..2e0f4948 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/putc.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/putc.html @@ -42,13 +42,13 @@ int f_putc (

        解説

        -

        1文字をファイルã«æ›¸ãè¾¼ã¿ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯f_write()ã®ãƒ©ãƒƒãƒ‘ー関数ã§ã™ã€‚

        +

        1文字をファイルã«æ›¸ãè¾¼ã¿ã¾ã™ã€‚

        対応情報

        -

        _FS_READONLY == 0ã§ã€ä¸”ã¤_USE_STRFUNC㌠1ã¾ãŸã¯ 2ã®ã¨ã使用å¯èƒ½ã§ã™ã€‚2を指定ã™ã‚‹ã¨ã€'\n'ã¯'\r'+'\n'ã«å±•é–‹ã•ã‚Œã¦ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¾ã‚Œã¾ã™ã€‚

        +

        ã“ã®é–¢æ•°ã¯f_write関数ã®ãƒ©ãƒƒãƒ‘ー関数ã§ã™ã€‚_FS_READONLY == 0ã§ã€ä¸”ã¤_USE_STRFUNC㌠1ã¾ãŸã¯ 2ã®ã¨ã使用å¯èƒ½ã§ã™ã€‚2を指定ã™ã‚‹ã¨ã€'\n'ã¯'\r'+'\n'ã«å±•é–‹ã•ã‚Œã¦ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¾ã‚Œã¾ã™ã€‚

        diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/puts.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/puts.html index 4f3167cb..a772e5e5 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/puts.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/puts.html @@ -42,13 +42,13 @@ int f_puts (

        解説

        -

        文字列をファイルã«æ›¸ãè¾¼ã¿ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯f_write()ã®ãƒ©ãƒƒãƒ‘ー関数ã§ã™ã€‚

        +

        文字列をファイルã«æ›¸ãè¾¼ã¿ã¾ã™ã€‚

        対応情報

        -

        _FS_READONLY == 0ã§ã€ä¸”ã¤_USE_STRFUNCãŒ1ã¾ãŸã¯2ã®ã¨ã使用å¯èƒ½ã§ã™ã€‚2を指定ã™ã‚‹ã¨ã€æ–‡å­—列ã«å«ã¾ã‚Œã‚‹'\n'ã¯'\r'+'\n'ã«å±•é–‹ã•ã‚Œã¦ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¾ã‚Œã¾ã™ã€‚

        +

        ã“ã®é–¢æ•°ã¯f_write関数ã®ãƒ©ãƒƒãƒ‘ー関数ã§ã™ã€‚_FS_READONLY == 0ã§ã€ä¸”ã¤_USE_STRFUNCãŒ1ã¾ãŸã¯2ã®ã¨ã使用å¯èƒ½ã§ã™ã€‚2を指定ã™ã‚‹ã¨ã€æ–‡å­—列ã«å«ã¾ã‚Œã‚‹'\n'ã¯'\r'+'\n'ã«å±•é–‹ã•ã‚Œã¦ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¾ã‚Œã¾ã™ã€‚

        diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/rc.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/rc.html index 45a47388..37bd11f4 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/rc.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/rc.html @@ -17,7 +17,7 @@
        FR_OK (0)
        関数ã¯æˆåŠŸã—ãŸã€‚
        FR_DISK_ERR
        -
        下ä½ãƒ¬ã‚¤ãƒ¤(disk_read(), disk_write(), disk_ioctl()関数)ã§å›žå¾©ä¸èƒ½ãªã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã€‚
        ※開ã‹ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã®æ“作ã«ãŠã„ã¦ã“ã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã™ã‚‹ã¨ã€ãã®ãƒ•ã‚¡ã‚¤ãƒ« オブジェクトã¯ã‚¢ãƒœãƒ¼ãƒˆçŠ¶æ…‹ã¨ãªã‚Šã€ã‚¯ãƒ­ãƒ¼ã‚ºä»¥å¤–ã®ã®æ“作ãŒã§ããªããªã‚Šã¾ã™ã€‚
        +
        下ä½ãƒ¬ã‚¤ãƒ¤(disk_read/disk_write/disk_ioctl関数)ã§å›žå¾©ä¸èƒ½ãªã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã€‚
        ※開ã‹ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã®æ“作ã«ãŠã„ã¦ã“ã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã™ã‚‹ã¨ã€ãã®ãƒ•ã‚¡ã‚¤ãƒ« オブジェクトã¯ã‚¢ãƒœãƒ¼ãƒˆçŠ¶æ…‹ã¨ãªã‚Šã€ã‚¯ãƒ­ãƒ¼ã‚ºä»¥å¤–ã®ã®æ“作ãŒã§ããªããªã‚Šã¾ã™ã€‚
        FR_INT_ERR
        内部処ç†ã®å¥å…¨æ€§ã«ç•°å¸¸ãŒæ¤œå‡ºã•ã‚ŒãŸã€‚原因ã¨ã—ã¦ã¯æ¬¡ã®ã‚ˆã†ãªã“ã¨ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚
          @@ -26,7 +26,7 @@
        ※開ã‹ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã®æ“作ã«ãŠã„ã¦ã“ã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã™ã‚‹ã¨ã€ãã®ãƒ•ã‚¡ã‚¤ãƒ« オブジェクトã¯ã‚¢ãƒœãƒ¼ãƒˆçŠ¶æ…‹ã¨ãªã‚Šã€ã‚¯ãƒ­ãƒ¼ã‚ºä»¥å¤–ã®æ“作ãŒã§ããªããªã‚Šã¾ã™ã€‚
        FR_NOT_READY
        -
        物ç†ãƒ‰ãƒ©ã‚¤ãƒ–ãŒå‹•ä½œå¯èƒ½ãªçŠ¶æ…‹ã«ãªã„。ã¾ãŸã¯ã€ãƒ‰ãƒ©ã‚¤ãƒ–ã®åˆæœŸåŒ–ã«å¤±æ•—ã—ãŸã€‚
        +
        disk_initialize関数ã®å¤±æ•—。物ç†ãƒ‰ãƒ©ã‚¤ãƒ–ãŒå‹•ä½œå¯èƒ½ãªçŠ¶æ…‹ã«ãªã„。
        FR_NO_FILE
        指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ãŒè¦‹ã¤ã‹ã‚‰ãªã‹ã£ãŸã€‚
        FR_NO_PATH
        @@ -47,39 +47,46 @@
        FR_EXIST
        æ–°ã—ã作æˆã—よã†ã¨ã—ãŸã‚ªãƒ–ジェクトã¨åŒã˜åå‰ã®ã‚ªãƒ–ジェクトãŒæ—¢ã«å­˜åœ¨ã™ã‚‹ã€‚
        FR_INVALID_OBJECT
        -
        指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« オブジェクトやディレクトリ オブジェクトãŒç„¡åŠ¹(オープンã•ã‚Œã¦ã„ãªã„ã€æ—¢ã«é–‰ã˜ã‚‰ã‚ŒãŸã€ç ´æã—ã¦ã„ã‚‹ãªã©)ã€ã¾ãŸã¯ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿ãŒæ¸¡ã•ã‚ŒãŸã€‚ã¾ãŸã€é–‹ã‹ã‚ŒãŸã¾ã¾ã®ã‚ªãƒ–ジェクトã¯ã€ãã‚Œã®å±žã™ã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ ã®ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œã«ã‚ˆã‚Šç„¡åŠ¹ã¨ãªã‚Šã¾ã™ã€‚
        +
        指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« オブジェクトやディレクトリ オブジェクトãŒç„¡åŠ¹ã€ã¾ãŸã¯ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿ãŒæ¸¡ã•ã‚ŒãŸã€‚無効ã«ãªã‚‹ç†ç”±ã¯æ¬¡ã®ã“ã¨ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ +
          +
        • オープンã•ã‚Œã¦ã„ãªã„ã€æ—¢ã«é–‰ã˜ã‚‰ã‚ŒãŸã€ç ´æã—ã¦ã„ã‚‹ãªã©ã€‚
        • +
        • ãã‚Œã®å±žã™ã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ ã®ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œãŒã‚ã£ãŸã€‚ボリューム上ã§é–‹ã‹ã‚ŒãŸã‚ªãƒ–ジェクトã¯å…¨ã¦ç„¡åŠ¹åŒ–ã•ã‚Œã‚‹ã€‚
        • +
        • 関連ã™ã‚‹ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ãŒãƒ¡ãƒ‡ã‚£ã‚¢ã®å–り外ã—ã§å‹•ä½œä¸å¯èƒ½ã«ãªã£ã¦ã„る。
        • +
        +
        FR_WRITE_PROTECTED
        物ç†ãƒ‰ãƒ©ã‚¤ãƒ–ãŒæ›¸ãè¾¼ã¿ç¦æ­¢çŠ¶æ…‹ã®ã¨ãã€æ›¸ãè¾¼ã¿ã‚’ä¼´ã†æ“作を行ãŠã†ã¨ã—ãŸã€‚
        FR_INVALID_DRIVE
        -
        パスå中ã«æŒ‡å®šã•ã‚ŒãŸãƒ‰ãƒ©ã‚¤ãƒ–番å·ãŒç„¡åŠ¹ã€ã¾ãŸã¯ãƒ‘スåã«ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿ãŒæ¸¡ã•ã‚ŒãŸã€‚(関連オプション: _VOLUMES)
        +
        パスå中ã«æŒ‡å®šã•ã‚ŒãŸãƒ‰ãƒ©ã‚¤ãƒ–番å·ãŒç„¡åŠ¹ã€ã¾ãŸã¯ãƒ‘スåã«ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿ãŒæ¸¡ã•ã‚ŒãŸã€‚(関連オプション: _VOLUMES)
        FR_NOT_ENABLED
        ãã®ãƒœãƒªãƒ¥ãƒ¼ãƒ ã®æ“作ã«å¿…è¦ãªãƒ¯ãƒ¼ã‚¯ エリア(ファイル システム オブジェクト構造体)ãŒä¸Žãˆã‚‰ã‚Œã¦ã„ãªã„。
        FR_NO_FILESYSTEM
        物ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã«æœ‰åŠ¹ãªFATボリュームãŒè¦‹ã¤ã‹ã‚‰ãªã‹ã£ãŸã€‚
        FR_MKFS_ABORTED
        -
        f_mkfs()ã®å‡¦ç†ãŒé–‹å§‹å‰ã«ä¸­æ–­ã•ã‚ŒãŸã€‚原因ã¨ã—ã¦ã¯æ¬¡ã®ã‚ˆã†ãªã“ã¨ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ +
        f_mkfs関数ã®å‡¦ç†ãŒé–‹å§‹å‰ã«ä¸­æ–­ã•ã‚ŒãŸã€‚原因ã¨ã—ã¦ã¯æ¬¡ã®ã‚ˆã†ãªã“ã¨ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚
        • ボリュームãŒå°ã•ã™ãŽã‚‹ã€‚
        • FATタイプã®è¨ˆç®—ã«çŸ›ç›¾ãŒè¦‹ã¤ã‹ã£ãŸã€‚クラスタ数ãŒFATタイプã®å¢ƒç•Œä»˜è¿‘ã«ãªã‚‹ã¨ãã«ç™ºç”Ÿã™ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚
        • -
        • ãã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«å¯¾å¿œã™ã‚‹åŒºç”»ãŒè¦‹ã¤ã‹ã‚‰ãªã‹ã£ãŸã€‚(関連オプション: _MULTI_PARTITION)
        • +
        • ãã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«å¯¾å¿œã™ã‚‹åŒºç”»ãŒè¦‹ã¤ã‹ã‚‰ãªã‹ã£ãŸã€‚(関連オプション: _MULTI_PARTITION)
        FR_TIMEOUT
        -
        å†å…¥åˆ¶å¾¡ã«ã‚ˆã‚‹å¾…ã¡æ™‚é–“ãŒå®šç¾©ã•ã‚ŒãŸæ™‚間を越ãˆãŸãŸã‚ã€é–¢æ•°ã¯å®Ÿè¡Œã•ã‚Œãªã‹ã£ãŸã€‚(関連オプション: _TIMEOUT)
        +
        å†å…¥åˆ¶å¾¡ã«ã‚ˆã‚‹å¾…ã¡æ™‚é–“ãŒå®šç¾©ã•ã‚ŒãŸæ™‚間を越ãˆãŸãŸã‚ã€é–¢æ•°ã¯å®Ÿè¡Œã•ã‚Œãªã‹ã£ãŸã€‚(関連オプション: _TIMEOUT)
        FR_LOCKED
        -
        多é‡ã‚¢ã‚¯ã‚»ã‚¹æŽ’他機能ã«ã‚ˆã‚Šã€ãã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚„ディレクトリã«å¯¾ã—ã¦è¡ŒãŠã†ã¨ã—ãŸã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•ã‚ŒãŸã€‚(関連オプション: _FS_LOCK)
        +
        多é‡ã‚¢ã‚¯ã‚»ã‚¹æŽ’他機能ã«ã‚ˆã‚Šã€ãã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚„ディレクトリã«å¯¾ã—ã¦è¡ŒãŠã†ã¨ã—ãŸã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•ã‚ŒãŸã€‚(関連オプション: _FS_LOCK)
        FR_NOT_ENOUGH_CORE
        メモリä¸è¶³ã«ã‚ˆã‚‹å¤±æ•—。原因ã¨ã—ã¦ã¯æ¬¡ã®ã‚ˆã†ãªã“ã¨ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚
          -
        • LFNæ“作ãƒãƒƒãƒ•ã‚¡ã®å‹•çš„確ä¿ã«å¤±æ•—ã—ãŸã€‚(関連オプション: _USE_LFN)
        • +
        • LFNæ“作ãƒãƒƒãƒ•ã‚¡ã®å‹•çš„確ä¿ã«å¤±æ•—ã—ãŸã€‚(関連オプション: _USE_LFN)
        • 与ãˆã‚‰ã‚ŒãŸé…列ã®ã‚µã‚¤ã‚ºãŒå®Ÿéš›ã«å¿…è¦ãªã‚µã‚¤ã‚ºã«å¯¾ã—ã¦ä¸è¶³ã—ã¦ã„る。
        FR_TOO_MANY_OPEN_FILES
        -
        åŒæ™‚オープンå¯èƒ½ãªãƒ•ã‚¡ã‚¤ãƒ«æ•°ã‚’越ãˆã¦ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ã“ã†ã¨ã—ãŸã€‚(関連オプション: _FS_LOCK)
        +
        åŒæ™‚オープンå¯èƒ½ãªãƒ•ã‚¡ã‚¤ãƒ«æ•°ã‚’越ãˆã¦ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ã“ã†ã¨ã—ãŸã€‚(関連オプション: _FS_LOCK)
        FR_INVALID_PARAMETER
        与ãˆã‚‰ã‚ŒãŸãƒ‘ラメータãŒç„¡åŠ¹ã¾ãŸã¯çŸ›ç›¾ã—ã¦ã„る。
        +

        戻る

        diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/read.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/read.html index c7f2d25d..e33e564e 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/read.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/read.html @@ -45,7 +45,6 @@ FRESULT f_read ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_DENIED, FR_INVALID_OBJECT, FR_TIMEOUT diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/readdir.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/readdir.html index fc8fc5c6..2480a6b5 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/readdir.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/readdir.html @@ -26,7 +26,7 @@ FRESULT f_readdir (

        引数

        dp
        -
        有効ãªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª オブジェクト構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
        +
        f_opendir関数ã§ä½œæˆã•ã‚ŒãŸæœ‰åŠ¹ãªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª オブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
        fno
        読ã¿å‡ºã—ãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªé …目を格ç´ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«æƒ…報構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
        @@ -39,7 +39,6 @@ FRESULT f_readdir ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT, FR_NOT_ENOUGH_CORE @@ -49,15 +48,14 @@ FRESULT f_readdir (

        解説

        -

        ディレクトリã®é …ç›®(ファイルã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª)を順次読ã¿å‡ºã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã‚’ç¹°ã‚Šè¿”ã—実行ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®å…¨ã¦ã®é …目を読ã¿å‡ºã™ã“ã¨ãŒã§ãã¾ã™ã€‚得られるファイル情報ã®è©³ç´°ã«ã¤ã„ã¦ã¯ FILINFO構造体をå‚ç…§ã—ã¦ãã ã•ã„。全ã¦ã®é …ç›®ãŒèª­ã¿å‡ºã•ã‚Œã€èª­ã¿å‡ºã™é …ç›®ãŒã‚‚ã†ç„¡ã„ã¨ãã¯ã€fname[]メンãƒã«ãƒŒãƒ«æ–‡å­—列ãŒè¿”ã•ã‚Œã¾ã™ã€‚fnoã«ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã™ã‚‹ã¨ã€ãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒªãƒ¼ãƒ‰ インデックスを先頭ã«å·»ã戻ã—ã¾ã™ã€‚ã¾ãŸã€ã“ã®é–¢æ•°ã¯æ¬¡ã«ç¤ºã™ã‚ˆã†ã«é–¢é€£ã™ã‚‹æ§‹æˆã‚ªãƒ—ションã«ã‚ˆã‚Šå‹•ä½œãŒå¤‰ã‚ã‚Šã¾ã™ã€‚

        -

        ドット エントリ("."ã€"..")ã¯ã€ç›¸å¯¾ãƒ‘スãŒæœ‰åŠ¹ãªã¨ã(_FS_RPATH >= 1)ã«ã®ã¿å‡ºåŠ›ã«ç¾ã‚Œã¾ã™ã€‚

        -

        LFN機能ãŒæœ‰åŠ¹ãªæ™‚ã¯ã€ã“ã®é–¢æ•°ã®å‘¼ã³å‡ºã—ã«å…ˆç«‹ã£ã¦FILINFO構造体ã®lfnameã¨lfsizeãŒæœ‰åŠ¹ãªå€¤ã§åˆæœŸåŒ–ã•ã‚Œã¦ã„ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。lfnameã¯LFNã‚’æ ¼ç´ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã§ã€lfsizeã¯ãã®ãƒãƒƒãƒ•ã‚¡ã®è¦ç´ æ•°ã§ã™ã€‚LFNを読ã¿å‡ºã™å¿…è¦ãŒãªã„ã¨ãã¯ã€lfnameã«ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿ã‚’セットã—ã¦ãã ã•ã„。次ã®æ¡ä»¶ã«ä¸€ã¤ã§ã‚‚該当ã™ã‚‹å ´åˆã¯ã€LFNæ ¼ç´ãƒãƒƒãƒ•ã‚¡ã«ãƒŒãƒ«æ–‡å­—列ãŒè¿”ã•ã‚Œã¾ã™ã€‚

        +

        ディレクトリã®é …ç›®(ファイルãŠã‚ˆã³ã‚µãƒ– ディレクトリ)を順次読ã¿å‡ºã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã‚’ç¹°ã‚Šè¿”ã—実行ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®å…¨ã¦ã®é …目を読ã¿å‡ºã™ã“ã¨ãŒã§ãã¾ã™ã€‚得られるファイル情報ã®è©³ç´°ã«ã¤ã„ã¦ã¯ FILINFO構造体をå‚ç…§ã—ã¦ãã ã•ã„。全ã¦ã®é …ç›®ãŒèª­ã¿å‡ºã•ã‚Œã€èª­ã¿å‡ºã™é …ç›®ãŒã‚‚ã†ç„¡ã„ã¨ãã¯ã€fno->fname[]ã«ãƒŒãƒ«æ–‡å­—列ãŒè¿”ã•ã‚Œã¾ã™ã€‚fnoã«ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã™ã‚‹ã¨ã€ãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒªãƒ¼ãƒ‰ インデックスを先頭ã«å·»ã戻ã—ã¾ã™ã€‚ã¾ãŸã€ã“ã®é–¢æ•°ã¯æ¬¡ã«ç¤ºã™ã‚ˆã†ã«é–¢é€£ã™ã‚‹æ§‹æˆã‚ªãƒ—ションã«ã‚ˆã‚Šå‹•ä½œãŒå¤‰ã‚ã‚Šã¾ã™ã€‚

        +

        ドット エントリ("."ã¨"..")ã¯ã€ç›¸å¯¾ãƒ‘スãŒæœ‰åŠ¹ãªã¨ã(_FS_RPATH >= 1)ã«ã®ã¿å‡ºåŠ›ã«ç¾ã‚Œã¾ã™ã€‚

        +

        LFN機能ãŒæœ‰åŠ¹ãªæ™‚ã¯ã€ã“ã®é–¢æ•°ã®å‘¼ã³å‡ºã—ã«å…ˆç«‹ã£ã¦fno->lfnameã¨fno->lfsizeãŒæœ‰åŠ¹ãªå€¤ã§åˆæœŸåŒ–ã•ã‚Œã¦ã„ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。lfnameã¯LFNã‚’æ ¼ç´ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã‚’示ã—ã€lfsizeã¯ãã®ãƒãƒƒãƒ•ã‚¡ã®è¦ç´ æ•°ã‚’示ã—ã¾ã™ã€‚LFNを読ã¿å‡ºã™å¿…è¦ãŒãªã„ã¨ãã¯ã€lfnameã«ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿ã‚’セットã—ã¦ãã ã•ã„。次ã®æ¡ä»¶ã«ä¸€ã¤ã§ã‚‚該当ã™ã‚‹å ´åˆã¯ã€LFNæ ¼ç´ãƒãƒƒãƒ•ã‚¡ã«ãƒŒãƒ«æ–‡å­—列ãŒè¿”ã•ã‚Œã¾ã™ã€‚

          -
        • ディレクトリ項目ã«LFN情報ãŒå­˜åœ¨ã—ãªã„。
        • +
        • ãã®é …ç›®ã«LFNãŒå­˜åœ¨ã—ãªã„。ã“ã®ã¨ãã€fname[]ã«è‹±å°æ–‡å­—ãŒå«ã¾ã‚Œã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚
        • LFNã®é•·ã•ã«å¯¾ã—ã¦LFNæ ¼ç´ãƒãƒƒãƒ•ã‚¡ã¾ãŸã¯LFNæ“作ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºãŒä¸å分。
        • -
        • LFNã«ç¾åœ¨ã®OEMコードã«å­˜åœ¨ã—ãªã„文字ãŒå«ã¾ã‚Œã¦ã„る。(éžUnicode構æˆã®ã¨ã)
        • +
        • LFNã«ç¾åœ¨ã®OEMコードã§è¡¨ç¾ã§ããªã„文字ãŒå«ã¾ã‚Œã¦ã„る。(éžUnicode構æˆã®ã¨ã)
        -

        ã¾ãŸã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªé …ç›®ã«LFN情報ãŒå­˜åœ¨ã—ãªã„å ´åˆã¯ã€fname[]ã«è‹±å°æ–‡å­—ãŒå«ã¾ã‚Œã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚

        diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/rename.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/rename.html index 52598467..a768b9aa 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/rename.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/rename.html @@ -56,7 +56,7 @@ FRESULT f_rename (

        解説

        -

        ファイルã¾ãŸã¯ã‚µãƒ– ディレクトリã®åå‰ã‚’変更ã—ã¾ã™ã€‚ã¾ãŸã€åŒæ™‚ã«åˆ¥ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¸ã®ç§»å‹•ã‚‚å¯èƒ½ã§ã™ãŒã€ç•°ãªã‚‹ãƒ‰ãƒ©ã‚¤ãƒ–ã¸ã®ç§»å‹•ã¯ã§ãã¾ã›ã‚“。開ã‹ã‚Œã¦ã„るオブジェクトã«å¯¾ã—ã¦ä½¿ç”¨ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“。

        +

        ファイルã¾ãŸã¯ã‚µãƒ– ディレクトリã®åå‰ã‚’変更ã—ã¾ã™ã€‚ã¾ãŸã€åŒæ™‚ã«åˆ¥ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¸ã®ç§»å‹•ã‚‚å¯èƒ½ã§ã™ãŒã€ç•°ãªã‚‹ãƒ‰ãƒ©ã‚¤ãƒ–é–“ã®ç§»å‹•ã¯ã§ãã¾ã›ã‚“。開ã‹ã‚Œã¦ã„るオブジェクトã«å¯¾ã™ã‚‹ä½¿ç”¨ã¯ä¸æ­£ãªæ“作ã¨ãªã‚Šã€FAT構造ãŒç ´å£Šã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚多é‡ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ãŒæœ‰åŠ¹ã®ã¨ãã¯å®‰å…¨ã«æ‹’å¦ã•ã‚Œã¾ã™ã€‚

        @@ -69,11 +69,14 @@ FRESULT f_rename (

        使用例

        -    /* ファイルã¾ãŸã¯ã‚µãƒ–ディレクトリã®åå‰ã‚’変更ã™ã‚‹ */
        +    /* デフォルト ドライブã«ã‚るオブジェクトã®åå‰ã‚’変更 */
             f_rename("oldname.txt", "newname.txt");
         
        -    /* ファイルã¾ãŸã¯ã‚µãƒ–ディレクトリã®åå‰ã®å¤‰æ›´ã¨åˆ¥ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¸ã®ç§»å‹• */
        -    f_rename("oldname.txt", "dir1/newname.txt");
        +    /* ドライブ2ã«ã‚るオブジェクトã®åå‰ã‚’変更 */
        +    f_rename("2:oldname.txt", "newname.txt");
        +
        +    /* åå‰ã®å¤‰æ›´ã¨åŒæ™‚ã«åˆ¥ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ç§»å‹• */
        +    f_rename("log.txt", "old/log0001.txt");
         
        diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/sdir.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/sdir.html index 33905493..4ee3e53a 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/sdir.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/sdir.html @@ -13,7 +13,7 @@

        DIR

        -

        DIR構造体ã¯ã€f_opendir(), f_readdir()ã®ãƒ¯ãƒ¼ã‚¯ エリアã¨ã—ã¦ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚アプリケーションã¯ã€ã“ã®æ§‹é€ ä½“ã®ãƒ¡ãƒ³ãƒã‚’書ãæ›ãˆã¦ã¯ãªã‚Šã¾ã›ã‚“。

        +

        DIR構造体ã¯ã€f_opendir/f_readdir/f_findfirst/f_findnext関数ã®ãƒ¯ãƒ¼ã‚¯ エリアã¨ã—ã¦ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚アプリケーションã¯ã€ã“ã®æ§‹é€ ä½“ã®ãƒ¡ãƒ³ãƒã‚’書ãæ›ãˆã¦ã¯ãªã‚Šã¾ã›ã‚“。

         typedef struct {
             FATFS*  fs;        /* 親ファイル システム オブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
        @@ -22,15 +22,18 @@
             DWORD   sclust;    /* テーブル開始クラスタ (0:ルート) */
             DWORD   clust;     /* ç¾åœ¨ã®ã‚¯ãƒ©ã‚¹ã‚¿ç•ªå· */
             DWORD   sect;      /* ç¾åœ¨ã®ã‚»ã‚¯ã‚¿ç•ªå· */
        -    BYTE*   dir;       /* ç¾åœ¨ã®SFNエントリã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
        +    BYTE*   dir;       /* ç¾åœ¨ã®SFNエントリ(Win[]内)ã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
             BYTE*   fn;        /* SFNãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ (in/out) {file[8],ext[3],status[1]} */
         #if _FS_LOCK
        -    UINT    lockid;    /* ロックID */
        +    UINT    lockid;    /* サブ ディレクトリ ロックID (0:ルート) */
         #endif
         #if _USE_LFN
             WCHAR*  lfn;       /* LFNãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ (in/out) */
             WORD    lfn_idx;   /* LFNエントリã®å…ˆé ­ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ (0xFFFF:無効) */
         #endif
        +#if _USE_FIND
        +    const TCHAR*  pat; /* マッãƒãƒ³ã‚° パターンã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
        +#endif
         } DIR;
         
        diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/setlabel.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/setlabel.html index dc71ac3e..26dce4b6 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/setlabel.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/setlabel.html @@ -51,10 +51,11 @@ FRESULT f_setlabel (

        解説

        文字列ã®å…ˆé ­ã«ãƒ‰ãƒ©ã‚¤ãƒ–番å·ã‚’å«ã‚€å ´åˆã¯ã€ãã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«å¯¾ã—ã¦è¨­å®šã•ã‚Œã¾ã™ã€‚å«ã¾ãªã„å ´åˆã¯ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆ ドライブã«è¨­å®šã•ã‚Œã¾ã™ã€‚ボリューム ラベルを削除ã™ã‚‹ã¨ãã¯ã€ãƒŒãƒ«æ–‡å­—列を指定ã—ã¾ã™ã€‚ボリューム ラベルã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«å(SFN)ã¨ã»ã¼åŒã˜ã§ã™ãŒã€æ¬¡ã®ç‚¹ãŒç•°ãªã‚Šã¾ã™ã€‚

          -
        • ローカル文字コードæ›ç®—ã§11ãƒã‚¤ãƒˆä»¥ä¸‹ã€‚LFNæ‹¡å¼µã¯é©ç”¨ã•ã‚Œã¾ã›ã‚“。
        • +
        • OEMコードæ›ç®—ã§11ãƒã‚¤ãƒˆä»¥ä¸‹ã€‚ボリューム ラベルã«ã¯LFNæ‹¡å¼µã¯é©ç”¨ã•ã‚Œã¾ã›ã‚“。
        • ピリオドをå«ã‚€ã“ã¨ã¯ã§ããªã„。
        • ä»»æ„ã®ä½ç½®ã«ã‚¹ãƒšãƒ¼ã‚¹ã‚’ç½®ãã“ã¨ãŒã§ãる。ãŸã ã—ã€æœ€å¾Œå°¾ã¨ãªã‚‹ã‚¹ãƒšãƒ¼ã‚¹ã¯é™¤åŽ»ã•ã‚Œã‚‹ã€‚
        +

        ã€è£œè¶³ã€‘ 標準システム(Windows)ã§ã¯\xE5ã§å§‹ã¾ã‚‹ãƒœãƒ¼ãƒªãƒ¥ãƒ¼ãƒ  ラベル(CP932ãªã‚‰ã€Œè–”è–‡ã€ãªã©)ã®æ‰±ã„ã«å•é¡ŒãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ãŸã‚ã€ã“ã®é–¢æ•°ã§ã¯ãã®ã‚ˆã†ãªåå‰ã¯ç„¡åŠ¹ã¨ã—ã¦å‡¦ç†ã—ã¦ã„ã¾ã™ã€‚

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/sfatfs.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/sfatfs.html index 93b9e7c8..fd7405dd 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/sfatfs.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/sfatfs.html @@ -13,16 +13,16 @@

      FATFS

      -

      FATFS構造体(ファイル システム オブジェクト)ã¯ã€å€‹ã€…ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®ãƒ€ã‚¤ãƒŠãƒŸãƒƒã‚¯ ワーク エリアをä¿æŒã—ã€f_mount()ã§FatFsモジュールã«ç™»éŒ²ã•ã‚Œã¾ã™ã€‚åˆæœŸåŒ–ãŒè¡Œã‚れるタイミングã¯ã€f_mount()(強制マウント指定)ã®å®Ÿè¡Œã¾ãŸã¯ãƒ¡ãƒ‡ã‚£ã‚¢äº¤æ›ã®å¾Œã®æœ€åˆã®ãƒ•ã‚¡ã‚¤ãƒ« アクセスã®æ™‚ã§ã™ã€‚アプリケーションã¯ã€ã“ã®æ§‹é€ ä½“ã®ãƒ¡ãƒ³ãƒã‚’書ãæ›ãˆã¦ã¯ãªã‚Šã¾ã›ã‚“。

      +

      FATFS構造体(ファイル システム オブジェクト)ã¯ã€å€‹ã€…ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®ãƒ€ã‚¤ãƒŠãƒŸãƒƒã‚¯ ワーク エリアをä¿æŒã—ã€f_mount関数ã§FatFsモジュールã«ç™»éŒ²ã•ã‚Œã¾ã™ã€‚åˆæœŸåŒ–ãŒè¡Œã‚れるタイミングã¯ã€f_mount関数(強制マウント指定)ã®å®Ÿè¡Œã¾ãŸã¯ãƒ¡ãƒ‡ã‚£ã‚¢äº¤æ›ã®å¾Œã®æœ€åˆã®ãƒ•ã‚¡ã‚¤ãƒ« アクセスã®æ™‚ã§ã™ã€‚アプリケーションã¯ã€ã“ã®æ§‹é€ ä½“ã®ãƒ¡ãƒ³ãƒã‚’書ãæ›ãˆã¦ã¯ãªã‚Šã¾ã›ã‚“。

       typedef struct {
      -    BYTE    fs_type;      /* FATタイプ */
      +    BYTE    fs_type;      /* FATタイプ (0:無効, FS_FAT12, FS_FAT16 or FS_FAT32) */
           BYTE    drv;          /* 物ç†ãƒ‰ãƒ©ã‚¤ãƒ–ç•ªå· */
      -    BYTE    csize;        /* クラスタ当ãŸã‚Šã®ã‚»ã‚¯ã‚¿æ•° (1,2,4,8,...,128)*/
      +    BYTE    csize;        /* クラスタ当ãŸã‚Šã®ã‚»ã‚¯ã‚¿æ•° (1,2,4,8,...,128) */
           BYTE    n_fats;       /* FATã®å¤šé‡åŒ–æ•° (1,2) */
           BYTE    wflag;        /* win[]ダーティ フラグ */
      -    BYTE    fsi_flag;     /* FSINFOフラグ (b7:Disabled, b0:Dirty)*/
      +    BYTE    fsi_flag;     /* FSINFOフラグ (b7:Disabled, b0:Dirty) */
           WORD    id;           /* ファイル システム マウントID */
           WORD    n_rootdir;    /* ルート ディレクトリã®ã‚¨ãƒ³ãƒˆãƒªæ•° (FAT12/16) */
       #if _MAX_SS != _MIN_SS
      @@ -36,13 +36,13 @@
           DWORD   free_clust;   /* FSINFO: 空ãクラスタ数 */
       #endif
       #if _FS_RPATH
      -    DWORD   cdir;         /* カレント ディレクトリã®ã‚¯ãƒ©ã‚¹ã‚¿ (0:ルート) */
      +    DWORD   cdir;         /* カレント ディレクトリã®ã‚¯ãƒ©ã‚¹ã‚¿ç•ªå· (0:ルート) */
       #endif
           DWORD   n_fatent;     /* FATエントリ数 (ç·ã‚¯ãƒ©ã‚¹ã‚¿æ•° + 2) */
           DWORD   fsize;        /* FAT 1個ã®ã‚»ã‚¯ã‚¿æ•° */
           DWORD   volbase;      /* ボリューム開始セクタ */
           DWORD   fatbase;      /* FAT領域開始セクタ */
      -    DWORD   dirbase;      /* ルート ディレクトリ領域開始セクタ(クラスタ) */
      +    DWORD   dirbase;      /* ルート ディレクトリ領域開始(セクタ|クラスタ) */
           DWORD   database;     /* データ領域開始セクタ */
           DWORD   winsect;      /* win[]ã«ç¾ã‚Œã¦ã„ã‚‹ã‚»ã‚¯ã‚¿ç•ªå· */
           BYTE    win[_MAX_SS]; /* ディスク アクセス ウィンドウ */
      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/sfile.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/sfile.html
      index 5da60f96..f5f70256 100644
      --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/sfile.html
      +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/sfile.html
      @@ -13,7 +13,7 @@
       
       

      FIL

      -

      FIL構造体(ファイル オブジェクト)ã¯ã€f_open()ã§åˆæœŸåŒ–ã•ã‚Œã€ä»¥å¾Œãã®ãƒ•ã‚¡ã‚¤ãƒ«ã®çŠ¶æ…‹ã‚’ä¿æŒã—ã¾ã™ã€‚ã¾ãŸã€f_close()ã§ãƒ•ã‚¡ã‚¤ãƒ«ãŒé–‰ã˜ã‚‰ã‚Œã‚‹ã¨ç„¡åŠ¹åŒ–ã•ã‚Œã¾ã™ã€‚アプリケーションã¯ã€ã“ã®æ§‹é€ ä½“ã®ãƒ¡ãƒ³ãƒã‚’書ãæ›ãˆã¦ã¯ãªã‚Šã¾ã›ã‚“(cltblã¯ä¾‹å¤–)。éžã‚¿ã‚¤ãƒ‹ãƒ¼æ§‹æˆ(_FS_TINY == 0)ã§ã¯ã€å†…部ã«_MAX_SSãƒã‚¤ãƒˆã®ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ãŒç¢ºä¿ã•ã‚Œã‚‹ã®ã§ã€ãã®ã‚µã‚¤ã‚ºã«ã¯æ³¨æ„ãŒå¿…è¦ã§ã™ã€‚

      +

      FIL構造体(ファイル オブジェクト)ã¯ã€f_open関数ã§åˆæœŸåŒ–ã•ã‚Œã€ä»¥å¾Œãã®ãƒ•ã‚¡ã‚¤ãƒ«ã®çŠ¶æ…‹ã‚’ä¿æŒã—ã¾ã™ã€‚ã¾ãŸã€f_close関数ã§ãƒ•ã‚¡ã‚¤ãƒ«ãŒé–‰ã˜ã‚‰ã‚Œã‚‹ã¨ç„¡åŠ¹åŒ–ã•ã‚Œã¾ã™ã€‚アプリケーションã¯ã€ã“ã®æ§‹é€ ä½“ã®ãƒ¡ãƒ³ãƒã‚’書ãæ›ãˆã¦ã¯ãªã‚Šã¾ã›ã‚“(cltblã¯ä¾‹å¤–)。éžã‚¿ã‚¤ãƒ‹ãƒ¼æ§‹æˆ(_FS_TINY == 0)ã§ã¯ã€å†…部ã«_MAX_SSãƒã‚¤ãƒˆã®ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ãŒç¢ºä¿ã•ã‚Œã‚‹ã®ã§ã€ãã®ã‚µã‚¤ã‚ºã«ã¯æ³¨æ„ãŒå¿…è¦ã§ã™ã€‚

       typedef struct {
      @@ -24,7 +24,7 @@
           DWORD   fptr;         /* ファイル読ã¿æ›¸ããƒã‚¤ãƒ³ã‚¿ (ファイル先頭ã‹ã‚‰ã®ãƒã‚¤ãƒˆ オフセット) */
           DWORD   fsize;        /* ファイル サイズ(ãƒã‚¤ãƒˆå˜ä½) */
           DWORD   sclust;       /* ãƒ•ã‚¡ã‚¤ãƒ«é–‹å§‹ã‚¯ãƒ©ã‚¹ã‚¿ç•ªå· (0:割り当ã¦ç„¡ã—) */
      -    DWORD   clust;        /* ç¾åœ¨ã®ã‚¯ãƒ©ã‚¹ã‚¿ */
      +    DWORD   clust;        /* ç¾åœ¨ã®ã‚¯ãƒ©ã‚¹ã‚¿ (fptrãŒ0ã®ã¨ãã¯ç„¡åŠ¹ã€fptrãŒã‚¯ãƒ©ã‚¹ã‚¿å¢ƒç•Œä¸Šã®ã¨ãã¯å‰ã®ã‚¯ãƒ©ã‚¹ã‚¿) */
           DWORD   dsect;        /* ç¾åœ¨ã®ãƒ‡ãƒ¼ã‚¿ セクタ */
       #if !_FS_READONLY
           DWORD   dir_sect;     /* ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª エントリã®ã‚るセクタ */
      @@ -37,7 +37,7 @@
           UINT    lockid;       /* ファイル ロックID */
       #endif
       #if !_FS_TINY
      -    BYTE    buf[_MAX_SS]; /* ファイル プライベート データ転é€ãƒãƒƒãƒ•ã‚¡ */
      +    BYTE    buf[_MAX_SS]; /* ファイル プライベート データ転é€ãƒãƒƒãƒ•ã‚¡ (fptrãŒã‚»ã‚¯ã‚¿å¢ƒç•Œä¸Šã«ãªã„時ã¯å¸¸ã«æœ‰åŠ¹ã ãŒã€fptrãŒã‚»ã‚¯ã‚¿å¢ƒç•Œä¸Šã®ã¨ãã¯ç„¡åŠ¹ãªå ´åˆãŒã‚ã‚‹) */
       #endif
       } FIL;
       
      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/sfileinfo.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/sfileinfo.html index a9167f1e..108e332e 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/sfileinfo.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/sfileinfo.html @@ -13,7 +13,7 @@

      FILINFO

      -

      FILINFO構造体ã¯ã€f_stat(), f_readdir()ã§è¿”ã•ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«æƒ…報をä¿æŒã—ã¾ã™ã€‚

      +

      FILINFO構造体ã¯ã€f_stat/f_readdir/f_findfirst/f_findnext関数ã§è¿”ã•ã‚Œã‚‹ã‚ªãƒ–ジェクトã«é–¢ã™ã‚‹æƒ…報をä¿æŒã—ã¾ã™ã€‚

       typedef struct {
           DWORD fsize;     /* ファイル サイズ */
      @@ -58,11 +58,11 @@
       
      fattrib
      属性フラグãŒæ ¼ç´ã•ã‚Œã¾ã™ã€‚フラグã¯AM_DIR, AM_RDO, AM_HID, AM_SYS, AM_ARCã®çµ„ã¿åˆã‚ã›ã¨ãªã‚Šã¾ã™ã€‚
      fname[]
      -
      8.3å½¢å¼ã®åå‰ãŒ'\0'ã§çµ‚ã‚る文字列ã¨ã—ã¦æ ¼ç´ã•ã‚Œã¾ã™ã€‚éžLFN構æˆã®ã¨ãã¯ã€å¸¸ã«å¤§æ–‡å­—ã§è¿”ã•ã‚Œã¾ã™ã€‚LFN構æˆã®ã¨ãã¯çŸ­ã„åå‰ãŒè¿”ã•ã‚Œã¾ã™ãŒã€ASCII英字ãŒå°æ–‡å­—ã«ãªã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚
      +
      8.3å½¢å¼ã®åå‰(SFN)ãŒ'\0'ã§çµ‚ã‚る文字列ã¨ã—ã¦æ ¼ç´ã•ã‚Œã¾ã™ã€‚éžLFN構æˆã®ã¨ãã¯ã€å¸¸ã«å¤§æ–‡å­—ã§è¿”ã•ã‚Œã¾ã™ã€‚LFN構æˆã®ã¨ãã¯ã€æ–‡å­—列ã«å«ã¾ã‚Œã‚‹ASCII英字ãŒå°æ–‡å­—ã«ãªã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚
      lfname
      -
      è¿”ã•ã‚Œã‚‹é•·ã„ファイルåã‚’æ ¼ç´ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ã“ã®æ§‹é€ ä½“を使用ã™ã‚‹å‰ã«ã‚¢ãƒ—リケーションã«ã‚ˆã‚ŠåˆæœŸåŒ–ã•ã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。ã“ã®ãƒ¡ãƒ³ãƒã«NULLãŒè¨­å®šã•ã‚Œã‚‹ã¨LFNã¯è¿”ã•ã‚Œã¾ã›ã‚“。éžLFN構æˆã®ã¨ãã¯ã“ã®ãƒ¡ãƒ³ãƒã¯å­˜åœ¨ã—ã¾ã›ã‚“。
      +
      é•·ã„ファイルå(LFN)ã‚’æ ¼ç´ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ã“ã®ãƒ¡ãƒ³ãƒã¯ã€ã“ã®æ§‹é€ ä½“を使用ã™ã‚‹å‰ã«ã‚¢ãƒ—リケーションã«ã‚ˆã‚ŠåˆæœŸåŒ–ã•ã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。NULLãŒè¨­å®šã•ã‚Œã‚‹ã¨LFNã¯è¿”ã•ã‚Œã¾ã›ã‚“。éžLFN構æˆã®ã¨ãã¯ã“ã®ãƒ¡ãƒ³ãƒã¯å­˜åœ¨ã—ã¾ã›ã‚“。
      lfsize
      -
      é•·ã„ファイルåã‚’æ ¼ç´ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º(è¦ç´ æ•°)。ã“ã®æ§‹é€ ä½“を使用ã™ã‚‹å‰ã«ã‚¢ãƒ—リケーションã«ã‚ˆã‚ŠåˆæœŸåŒ–ã•ã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。éžLFN構æˆã®ã¨ãã¯ã“ã®ãƒ¡ãƒ³ãƒã¯å­˜åœ¨ã—ã¾ã›ã‚“。
      +
      é•·ã„ファイルåã‚’æ ¼ç´ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º(è¦ç´ æ•°)。ã“ã®ãƒ¡ãƒ³ãƒã¯ã€ã“ã®æ§‹é€ ä½“を使用ã™ã‚‹å‰ã«ã‚¢ãƒ—リケーションã«ã‚ˆã‚ŠåˆæœŸåŒ–ã•ã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。éžLFN構æˆã®ã¨ãã¯ã“ã®ãƒ¡ãƒ³ãƒã¯å­˜åœ¨ã—ã¾ã›ã‚“。

      戻る

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/size.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/size.html index d75ffc34..207b4f9e 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/size.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/size.html @@ -39,7 +39,7 @@ DWORD f_size (

      解説

      -

      f_size関数ã¯ã€ç¾ãƒªãƒ“ジョンã§ã¯ãƒžã‚¯ãƒ­ã¨ã—ã¦å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã™ã€‚

      +

      ã“ã®é–¢æ•°ã¯ã€ç¾ãƒªãƒ“ジョンã§ã¯ãƒžã‚¯ãƒ­ã¨ã—ã¦å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã™ã€‚ファイル オブジェクトã®æ­£å½“性ãƒã‚§ãƒƒã‚¯ã‚„排他制御ã¯è¡Œã„ã¾ã›ã‚“。

       #define f_size(fp) ((fp)->fsize)
       
      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/stat.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/stat.html index 724a9d5b..6e89c3ee 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/stat.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/stat.html @@ -55,6 +55,7 @@ FRESULT f_stat (

      解説

      指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¾ãŸã¯ã‚µãƒ– ディレクトリã®å­˜åœ¨ã‚’調ã¹ã¾ã™ã€‚存在ã—ãªã„å ´åˆã¯ã€FR_NO_FILEãŒå¸°ã‚Šã¾ã™ã€‚存在ã™ã‚‹å ´åˆã¯FR_OKãŒå¸°ã‚Šã€ãƒ•ã‚¡ã‚¤ãƒ«æƒ…報構造体ã«ãれ関ã™ã‚‹æƒ…å ±(サイズã€ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã€å±žæ€§ãŠã‚ˆã³çŸ­ã„ファイルå)ãŒã‚¹ãƒˆã‚¢ã•ã‚Œã¾ã™ã€‚

      +

      LFN構æˆã®ã¨ãã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«æƒ…報構造体を使ã†å‰ã«fno.lfnameをヌルã«è¨­å®šã—ã¦ãŠãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/sync.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/sync.html index 4b594d64..35afbb4d 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/sync.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/sync.html @@ -36,7 +36,6 @@ FRESULT f_sync ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT

      @@ -45,8 +44,8 @@ FRESULT f_sync (

      解説

      -

      ã“ã®é–¢æ•°ã¯f_close()ã¨åŒã˜å‡¦ç†ã‚’実行ã—ã¾ã™ãŒã€ãƒ•ã‚¡ã‚¤ãƒ«ã¯å¼•ã続ãé–‹ã‹ã‚ŒãŸã¾ã¾ã«ãªã‚Šã€èª­ã¿æ›¸ãを続行ã§ãã¾ã™ã€‚ロギングãªã©ã€æ›¸ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã§é•·æ™‚間ファイルãŒé–‹ã‹ã‚Œã¦ã„るアプリケーションã«ãŠã„ã¦ã€å®šæœŸçš„ã¾ãŸã¯åŒºåˆ‡ã‚Šã®è‰¯ã„ã¨ã“ã‚ã§ã“ã®é–¢æ•°ã‚’使用ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ä¸æ„ã®é›»æºæ–­ã‚„メディアã®å–り外ã—ã«ã‚ˆã‚Šå¤±ã‚れるデータを最å°ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®èƒŒæ™¯ã«ã¤ã„ã¦ã¯ã€ã‚¢ãƒ—リケーション ノートもå‚ç…§ã—ã¦ãã ã•ã„。

      -

      実際ã®ã¨ã“ã‚ã€f_close()内ã§ã¯ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ãŸå¾Œãƒ•ã‚¡ã‚¤ãƒ« オブジェクトを無効化ã—ã¦ã„ã‚‹ã ã‘ãªã®ã§ã€f_close()ç›´å‰ã«f_sync()ã‚’ç½®ãã“ã¨ã¯ç„¡æ„味ã§ã™ã€‚

      +

      ã“ã®é–¢æ•°ã¯f_close関数ã¨åŒã˜å‡¦ç†ã‚’実行ã—ã¾ã™ãŒã€ãƒ•ã‚¡ã‚¤ãƒ«ã¯å¼•ã続ãé–‹ã‹ã‚ŒãŸã¾ã¾ã«ãªã‚Šã€èª­ã¿æ›¸ãを続行ã§ãã¾ã™ã€‚ロギングãªã©ã€æ›¸ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã§é•·æ™‚間ファイルãŒé–‹ã‹ã‚Œã¦ã„るアプリケーションã«ãŠã„ã¦ã€å®šæœŸçš„ã¾ãŸã¯åŒºåˆ‡ã‚Šã®è‰¯ã„ã¨ã“ã‚ã§ã“ã®é–¢æ•°ã‚’使用ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ä¸æ„ã®é›»æºæ–­ã‚„メディアã®å–り外ã—ã«ã‚ˆã‚Šå¤±ã‚れるデータを最å°ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®èƒŒæ™¯ã«ã¤ã„ã¦ã¯ã€ã‚¢ãƒ—リケーション ノートもå‚ç…§ã—ã¦ãã ã•ã„。

      +

      実際ã®ã¨ã“ã‚ã€f_close関数内ã§ã¯ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ãŸå¾Œãƒ•ã‚¡ã‚¤ãƒ« オブジェクトを無効化ã—ã¦ã„ã‚‹ã ã‘ãªã®ã§ã€f_close関数ã®ç›´å‰ã«f_sync関数を置ãã“ã¨ã¯ç„¡æ„味ã§ã™ã€‚

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/tell.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/tell.html index d0506910..c0194447 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/tell.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/tell.html @@ -39,7 +39,7 @@ DWORD f_tell (

      解説

      -

      f_tell関数ã¯ã€ç¾ãƒªãƒ“ジョンã§ã¯ãƒžã‚¯ãƒ­ã¨ã—ã¦å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã™ã€‚

      +

      f_tell関数ã¯ã€ç¾ãƒªãƒ“ジョンã§ã¯ãƒžã‚¯ãƒ­ã¨ã—ã¦å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã™ã€‚ファイル オブジェクトã®æ­£å½“性ãƒã‚§ãƒƒã‚¯ã‚„排他制御ã¯è¡Œã„ã¾ã›ã‚“。

       #define f_tell(fp) ((fp)->fptr)
       
      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/truncate.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/truncate.html index b33a757e..54026031 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/truncate.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/truncate.html @@ -36,7 +36,6 @@ FRESULT f_truncate ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_DENIED, FR_INVALID_OBJECT, FR_TIMEOUT diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/unlink.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/unlink.html index 3ae691a2..d9b631b0 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/unlink.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/unlink.html @@ -54,13 +54,12 @@ FRESULT f_unlink (

      解説

      -

      削除対象ã®ã‚ªãƒ–ジェクトãŒæ¬¡ã®æ¡ä»¶ã«å½“ã¦ã¯ã¾ã‚‹å ´åˆã€ãã®ã‚¢ã‚¯ã‚»ã‚¹ã¯æ‹’å¦ã•ã‚Œé–¢æ•°ã¯å¤±æ•—ã—ã¾ã™ã€‚ +

      削除対象ã®ã‚ªãƒ–ジェクトãŒæ¬¡ã®æ¡ä»¶ã«å½“ã¦ã¯ã¾ã‚‹å ´åˆã€ãã®ã‚¢ã‚¯ã‚»ã‚¹ã¯æ‹’å¦(FR_DENIED)ã•ã‚Œé–¢æ•°ã¯å¤±æ•—ã—ã¾ã™ã€‚

        -
      • リード オンリー属性(AM_RDO)ã‚’æŒã£ã¦ã„ã‚‹å ´åˆã¯ã€æ‹’å¦(FR_DENIED)ã•ã‚Œã‚‹ã€‚
      • -
      • 空ã§ãªã„サブ ディレクトリã¾ãŸã¯ã‚«ãƒ¬ãƒ³ãƒˆ ディレクトリã§ã‚ã‚‹å ´åˆã¯ã€æ‹’å¦(FR_DENIED)ã•ã‚Œã‚‹ã€‚
      • -
      • é–‹ã‹ã‚Œã¦ã„るファイルã¾ãŸã¯ã‚µãƒ– ディレクトリã§ã‚ã‚‹å ´åˆã¯ã€å¤šé‡ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ãŒæœ‰åŠ¹ãªã‚‰å®‰å…¨ã«æ‹’å¦(FR_LOCKED)ã•ã‚Œã¾ã™ãŒã€ãã†ã§ãªã„ã¨ãã¯ä¸æ­£ãªæ“作ã¨ãªã‚Šã€FAT構造ãŒç ´å£Šã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚
      • +
      • リード オンリー属性(AM_RDO)ã‚’æŒã£ã¦ã„ã‚‹å ´åˆã€‚
      • +
      • 空ã§ãªã„サブ ディレクトリã¾ãŸã¯ã‚«ãƒ¬ãƒ³ãƒˆ ディレクトリã§ã‚ã‚‹å ´åˆã€‚
      • +
      • é–‹ã‹ã‚Œã¦ã„るオブジェクトã§ã‚ã‚‹å ´åˆã€‚多é‡ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ãŒæœ‰åŠ¹ã®ã¨ãã¯å®‰å…¨ã«æ‹’å¦ã•ã‚Œã‚‹ãŒã€ãã†ã§ãªã„ã¨ãã¯ä¸æ­£ãªæ“作ã¨ãªã‚ŠFAT構造ãŒç ´å£Šã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚る。
      -

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/write.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/write.html index c3de4a0c..a5ea4654 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/write.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/write.html @@ -45,7 +45,6 @@ FRESULT f_write ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_DENIED, FR_INVALID_OBJECT, FR_TIMEOUT diff --git a/firmware/chibios-portapack/ext/fatfs/doc/updates.txt b/firmware/chibios-portapack/ext/fatfs/doc/updates.txt deleted file mode 100644 index 20f64f46..00000000 --- a/firmware/chibios-portapack/ext/fatfs/doc/updates.txt +++ /dev/null @@ -1,152 +0,0 @@ -R0.10c, Nov 09, 2014 - Added a configuration option for the platforms without RTC. (_FS_NORTC) - Fixed volume label created by Mac OS X cannot be retrieved with f_getlabel(). - Fixed a potential problem of FAT access that can appear on disk error. - Fixed null pointer dereference on attempting to delete the root direcotry. - -R0.10b, May 19, 2014 - Fixed a hard error in the disk I/O layer can collapse the directory entry. - Fixed LFN entry is not deleted on delete/rename an object with its lossy converted SFN. - -R0.10a, Jan 15, 2014 - Added arbitrary strings as drive number in the path name. (_STR_VOLUME_ID) - Added an option for minimum sector size. (_MIN_SS) - 2nd argument of f_rename() can have a drive number and it will be ignored. - Fixed f_mount() with forced mount fails when drive number is larger than 0. - Fixed f_close() invalidates the file object without volume lock. - Fixed volume lock is left acquired after return from f_closedir(). - Fixed creation of a directory entry with LFN fails on too many SFN collisions. - -R0.10, Oct 02, 2013 - Added an option for character encoding on the file. (_STRF_ENCODE) - Added f_closedir(). - Added forced full FAT scan option for f_getfree(). (_FS_NOFSINFO) - Added forced mount feature with changes of f_mount(). - Improved behavior of volume auto detection. - Improved write throughput of f_puts() and f_printf(). - Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write(). - Fixed f_write() can be truncated when the file size is close to 4GB. - Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect result code on error. - -R0.09b, Jan 24, 2013 - Added f_getlabel() and f_setlabel(). (_USE_LABEL = 1) - -R0.09a, Aug 27, 2012 - Fixed assertion failure due to OS/2 EA on FAT12/16 volume. - Changed file functions reject null object pointer to avoid crash. - Changed option name _FS_SHARE to _FS_LOCK. - -R0.09, Sep 06, 2011 - f_mkfs() supports multiple partition to complete the multiple partition feature. - Added f_fdisk(). (_MULTI_PARTITION = 2) - -R0.08b, Jan 15, 2011 - Fast seek feature is also applied to f_read() and f_write(). - f_lseek() reports required table size on creating CLMP. - Extended format syntax of f_printf(). - Ignores duplicated directory separators in given path names. - -R0.08a, Aug 16, 2010 - Added f_getcwd(). (_FS_RPATH = 2) - Added sector erase feature. (_USE_ERASE) - Moved file lock semaphore table from fs object to the bss. - Fixed a wrong directory entry is created on non-LFN cfg when the given name contains ';'. - Fixed f_mkfs() creates wrong FAT32 volume. - -R0.08, May 15, 2010 - Added a memory configuration option. (_USE_LFN) - Added file lock feature. (_FS_SHARE) - Added fast seek feature. (_USE_FASTSEEK) - Changed some types on the API, XCHAR->TCHAR. - Changed fname member in the FILINFO structure on Unicode cfg. - String functions support UTF-8 encoding files on Unicode cfg. - -R0.07e, Nov 3, 2009 - Separated out configuration options from ff.h to ffconf.h. - Added a configuration option, _LFN_UNICODE. - Fixed f_unlink() fails to remove a sub-dir on _FS_RPATH. - Fixed name matching error on the 13 char boundary. - Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. - -R0.07c, Jun 21, 2009 - Fixed f_unlink() may return FR_OK on error. - Fixed wrong cache control in f_lseek(). - Added relative path feature. - Added f_chdir(). - Added f_chdrive(). - Added proper case conversion to extended characters. - -R0.07a, Apr 14, 2009 - Separated out OS dependent code on re-entrant configuration. - Added multiple sector size support. - -R0.07, Apr 01, 2009 - Merged Tiny-FatFs into FatFs as a buffer configuration option. - Added long file name support. - Added multiple code page support. - Added re-entrancy for multitask operation. - Added auto cluster size selection to f_mkfs(). - Added rewind option to f_readdir(). - Changed result code of critical errors. - Renamed string functions to avoid name collision. - -R0.06, Apr 01, 2008 - Added f_forward. (Tiny-FatFs) - Added string functions: fgets, fputc, fputs and fprintf. - Improved performance of f_lseek on moving to the same or following cluster. - -R0.05a, Feb 03, 2008 - Added f_truncate. - Added f_utime. - Fixed off by one error at FAT sub-type determination. - Fixed btr in f_read can be mistruncated. - Fixed cached sector is left not flushed when create and close without write. - -R0.05, Aug 26, 2007 - Changed arguments of f_read, f_write. - Changed arguments of f_mkfs. (FatFs) - Fixed f_mkfs on FAT32 creates incorrect FSInfo. (FatFs) - Fixed f_mkdir on FAT32 creates incorrect directory. (FatFs) - -R0.04b, May 05, 2007 - Added _USE_NTFLAG option. - Added FSInfo support. - Fixed some problems corresponds to FAT32. (Tiny-FatFs) - Fixed DBCS name can result FR_INVALID_NAME. - Fixed short seek (<= csize) collapses the file object. - -R0.04a, Apr 01, 2007 - Supported multiple partitions on a plysical drive. (FatFs) - Added minimization level 3. - Added a capability of extending file size to f_lseek. - Fixed an endian sensitive code in f_mkfs. (FatFs) - Fixed a problem corresponds to FAT32 support. (Tiny-FatFs) - -R0.04, Feb 04, 2007 - Supported multiple drive system. (FatFs) - Changed some APIs for multiple drive system. - Added f_mkfs. (FatFs) - Added _USE_FAT32 option. (Tiny-FatFs) - -R0.03a, Dec 11, 2006 - Improved cluster scan algolithm to write files fast. - Fixed f_mkdir creates incorrect directory on FAT32. - -R0.03, Sep 22, 2006 - Added f_rename. - Changed option _FS_MINIMUM to _FS_MINIMIZE. - -R0.02a, Jun 10, 2006 - Added a configuration option _FS_MINIMUM. - -R0.02, Jun 01, 2006 - Added FAT12. - Removed unbuffered mode. - Fixed a problem on small (<32M) patition. - -R0.01, Apr 29, 2006 - First release - -R0.00, Feb 26, 2006 - Prototype (not released) - diff --git a/firmware/chibios-portapack/ext/fatfs/src/00history.txt b/firmware/chibios-portapack/ext/fatfs/src/00history.txt new file mode 100644 index 00000000..8afb4813 --- /dev/null +++ b/firmware/chibios-portapack/ext/fatfs/src/00history.txt @@ -0,0 +1,245 @@ +---------------------------------------------------------------------------- + Revision history of FatFs module +---------------------------------------------------------------------------- + +R0.00 (February 26, 2006) + + Prototype. + + + +R0.01 (April 29, 2006) + + First stable version. + + + +R0.02 (June 01, 2006) + + Added FAT12 support. + Removed unbuffered mode. + Fixed a problem on small (<32M) partition. + + + +R0.02a (June 10, 2006) + + Added a configuration option (_FS_MINIMUM). + + + +R0.03 (September 22, 2006) + + Added f_rename(). + Changed option _FS_MINIMUM to _FS_MINIMIZE. + + + +R0.03a (December 11, 2006) + + Improved cluster scan algorithm to write files fast. + Fixed f_mkdir() creates incorrect directory on FAT32. + + + +R0.04 (February 04, 2007) + + Added f_mkfs(). + Supported multiple drive system. + Changed some interfaces for multiple drive system. + Changed f_mountdrv() to f_mount(). + + + +R0.04a (April 01, 2007) + + Supported multiple partitions on a physical drive. + Added a capability of extending file size to f_lseek(). + Added minimization level 3. + Fixed an endian sensitive code in f_mkfs(). + + + +R0.04b (May 05, 2007) + + Added a configuration option _USE_NTFLAG. + Added FSINFO support. + Fixed DBCS name can result FR_INVALID_NAME. + Fixed short seek (<= csize) collapses the file object. + + + +R0.05 (August 25, 2007) + + Changed arguments of f_read(), f_write() and f_mkfs(). + Fixed f_mkfs() on FAT32 creates incorrect FSINFO. + Fixed f_mkdir() on FAT32 creates incorrect directory. + + + +R0.05a (February 03, 2008) + + Added f_truncate() and f_utime(). + Fixed off by one error at FAT sub-type determination. + Fixed btr in f_read() can be mistruncated. + Fixed cached sector is not flushed when create and close without write. + + + +R0.06 (April 01, 2008) + + Added fputc(), fputs(), fprintf() and fgets(). + Improved performance of f_lseek() on moving to the same or following cluster. + + + +R0.07 (April 01, 2009) + + Merged Tiny-FatFs as a configuration option. (_FS_TINY) + Added long file name feature. (_USE_LFN) + Added multiple code page feature. (_CODE_PAGE) + Added re-entrancy for multitask operation. (_FS_REENTRANT) + Added auto cluster size selection to f_mkfs(). + Added rewind option to f_readdir(). + Changed result code of critical errors. + Renamed string functions to avoid name collision. + + + +R0.07a (April 14, 2009) + + Septemberarated out OS dependent code on reentrant cfg. + Added multiple sector size feature. + + + +R0.07c (June 21, 2009) + + Fixed f_unlink() can return FR_OK on error. + Fixed wrong cache control in f_lseek(). + Added relative path feature. + Added f_chdir() and f_chdrive(). + Added proper case conversion to extended character. + + + +R0.07e (November 03, 2009) + + Septemberarated out configuration options from ff.h to ffconf.h. + Fixed f_unlink() fails to remove a sub-directory on _FS_RPATH. + Fixed name matching error on the 13 character boundary. + Added a configuration option, _LFN_UNICODE. + Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. + + + +R0.08 (May 15, 2010) + + Added a memory configuration option. (_USE_LFN = 3) + Added file lock feature. (_FS_SHARE) + Added fast seek feature. (_USE_FASTSEEK) + Changed some types on the API, XCHAR->TCHAR. + Changed .fname in the FILINFO structure on Unicode cfg. + String functions support UTF-8 encoding files on Unicode cfg. + + + +R0.08a (August 16, 2010) + + Added f_getcwd(). (_FS_RPATH = 2) + Added sector erase feature. (_USE_ERASE) + Moved file lock semaphore table from fs object to the bss. + Fixed f_mkfs() creates wrong FAT32 volume. + + + +R0.08b (January 15, 2011) + + Fast seek feature is also applied to f_read() and f_write(). + f_lseek() reports required table size on creating CLMP. + Extended format syntax of f_printf(). + Ignores duplicated directory separators in given path name. + + + +R0.09 (September 06, 2011) + + f_mkfs() supports multiple partition to complete the multiple partition feature. + Added f_fdisk(). + + + +R0.09a (August 27, 2012) + + Changed f_open() and f_opendir() reject null object pointer to avoid crash. + Changed option name _FS_SHARE to _FS_LOCK. + Fixed assertion failure due to OS/2 EA on FAT12/16 volume. + + + +R0.09b (January 24, 2013) + + Added f_setlabel() and f_getlabel(). + + + +R0.10 (October 02, 2013) + + Added selection of character encoding on the file. (_STRF_ENCODE) + Added f_closedir(). + Added forced full FAT scan for f_getfree(). (_FS_NOFSINFO) + Added forced mount feature with changes of f_mount(). + Improved behavior of volume auto detection. + Improved write throughput of f_puts() and f_printf(). + Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write(). + Fixed f_write() can be truncated when the file size is close to 4GB. + Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect error code. + + + +R0.10a (January 15, 2014) + + Added arbitrary strings as drive number in the path name. (_STR_VOLUME_ID) + Added a configuration option of minimum sector size. (_MIN_SS) + 2nd argument of f_rename() can have a drive number and it will be ignored. + Fixed f_mount() with forced mount fails when drive number is >= 1. (appeared at R0.10) + Fixed f_close() invalidates the file object without volume lock. + Fixed f_closedir() returns but the volume lock is left acquired. (appeared at R0.10) + Fixed creation of an entry with LFN fails on too many SFN collisions. (appeared at R0.07) + + + +R0.10b (May 19, 2014) + + Fixed a hard error in the disk I/O layer can collapse the directory entry. + Fixed LFN entry is not deleted on delete/rename an object with lossy converted SFN. (appeared at R0.07) + + + +R0.10c (November 09, 2014) + + Added a configuration option for the platforms without RTC. (_FS_NORTC) + Changed option name _USE_ERASE to _USE_TRIM. + Fixed volume label created by Mac OS X cannot be retrieved with f_getlabel(). (appeared at R0.09b) + Fixed a potential problem of FAT access that can appear on disk error. + Fixed null pointer dereference on attempting to delete the root direcotry. (appeared at R0.08) + + + +R0.11 (February 09, 2015) + + Added f_findfirst(), f_findnext() and f_findclose(). (_USE_FIND) + Fixed f_unlink() does not remove cluster chain of the file. (appeared at R0.10c) + Fixed _FS_NORTC option does not work properly. (appeared at R0.10c) + + + +R0.11a (September 05, 2015) + + Fixed wrong media change can lead a deadlock at thread-safe configuration. + Added code page 771, 860, 861, 863, 864, 865 and 869. (_CODE_PAGE) + Removed some code pages actually not exist on the standard systems. (_CODE_PAGE) + Fixed errors in the case conversion teble of code page 437 and 850 (ff.c). + Fixed errors in the case conversion teble of Unicode (cc*.c). + + diff --git a/firmware/chibios-portapack/ext/fatfs/src/00readme.txt b/firmware/chibios-portapack/ext/fatfs/src/00readme.txt index b30f7d38..70994eda 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/00readme.txt +++ b/firmware/chibios-portapack/ext/fatfs/src/00readme.txt @@ -1,163 +1,21 @@ -FatFs Module Source Files R0.10c (C)ChaN, 2014 +FatFs Module Source Files R0.11 FILES - ffconf.h Configuration file for FatFs module. - ff.h Common include file for FatFs and application module. - ff.c FatFs module. - diskio.h Common include file for FatFs and disk I/O module. - diskio.c An example of glue function to attach existing disk I/O module to FatFs. - integer.h Integer type definitions for FatFs. - option Optional external functions. + 00readme.txt This file. + history.txt Revision history. + ffconf.h Configuration file for FatFs module. + ff.h Common include file for FatFs and application module. + ff.c FatFs module. + diskio.h Common include file for FatFs and disk I/O module. + diskio.c An example of glue function to attach existing disk I/O module to FatFs. + integer.h Integer type definitions for FatFs. + option Optional external functions. + Low level disk I/O module is not included in this archive because the FatFs module is only a generic file system layer and not depend on any specific storage device. You have to provide a low level disk I/O module that written - to control your storage device. + to control the target storage device. - - -AGREEMENTS - - FatFs module is an open source software to implement FAT file system to - small embedded systems. This is a free software and is opened for education, - research and commercial developments under license policy of following trems. - - Copyright (C) 2014, ChaN, all right reserved. - - * The FatFs module is a free software and there is NO WARRANTY. - * No restriction on use. You can use, modify and redistribute it for - personal, non-profit or commercial product UNDER YOUR RESPONSIBILITY. - * Redistributions of source code must retain the above copyright notice. - - - -REVISION HISTORY - - Feb 26, 2006 R0.00 Prototype - - Apr 29, 2006 R0.01 First release. - - Jun 01, 2006 R0.02 Added FAT12. - Removed unbuffered mode. - Fixed a problem on small (<32M) patition. - - Jun 10, 2006 R0.02a Added a configuration option _FS_MINIMUM. - - Sep 22, 2006 R0.03 Added f_rename. - Changed option _FS_MINIMUM to _FS_MINIMIZE. - - Dec 11, 2006 R0.03a Improved cluster scan algolithm to write files fast. - Fixed f_mkdir creates incorrect directory on FAT32. - - Feb 04, 2007 R0.04 Supported multiple drive system. (FatFs) - Changed some APIs for multiple drive system. - Added f_mkfs. (FatFs) - Added _USE_FAT32 option. (Tiny-FatFs) - - Apr 01, 2007 R0.04a Supported multiple partitions on a plysical drive. (FatFs) - Fixed an endian sensitive code in f_mkfs. (FatFs) - Added a capability of extending the file size to f_lseek. - Added minimization level 3. - Fixed a problem that can collapse a sector when recreate an - existing file in any sub-directory at non FAT32 cfg. (Tiny-FatFs) - - May 05, 2007 R0.04b Added _USE_NTFLAG option. - Added FSInfo support. - Fixed some problems corresponds to FAT32. (Tiny-FatFs) - Fixed DBCS name can result FR_INVALID_NAME. - Fixed short seek (0 < ofs <= csize) collapses the file object. - - Aug 25, 2007 R0.05 Changed arguments of f_read, f_write. - Changed arguments of f_mkfs. (FatFs) - Fixed f_mkfs on FAT32 creates incorrect FSInfo. (FatFs) - Fixed f_mkdir on FAT32 creates incorrect directory. (FatFs) - - Feb 03, 2008 R0.05a Added f_truncate(). - Added f_utime(). - Fixed off by one error at FAT sub-type determination. - Fixed btr in f_read() can be mistruncated. - Fixed cached sector is not flushed when create and close without write. - - Apr 01, 2008 R0.06 Added f_forward(). (Tiny-FatFs) - Added string functions: fputc(), fputs(), fprintf() and fgets(). - Improved performance of f_lseek() on move to the same or following cluster. - - Apr 01, 2009, R0.07 Merged Tiny-FatFs as a buffer configuration option. - Added long file name support. - Added multiple code page support. - Added re-entrancy for multitask operation. - Added auto cluster size selection to f_mkfs(). - Added rewind option to f_readdir(). - Changed result code of critical errors. - Renamed string functions to avoid name collision. - - Apr 14, 2009, R0.07a Separated out OS dependent code on reentrant cfg. - Added multiple sector size support. - - Jun 21, 2009, R0.07c Fixed f_unlink() may return FR_OK on error. - Fixed wrong cache control in f_lseek(). - Added relative path feature. - Added f_chdir(). - Added f_chdrive(). - Added proper case conversion for extended characters. - - Nov 03, 2009 R0.07e Separated out configuration options from ff.h to ffconf.h. - Added a configuration option, _LFN_UNICODE. - Fixed f_unlink() fails to remove a sub-dir on _FS_RPATH. - Fixed name matching error on the 13 char boundary. - Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. - - May 15, 2010, R0.08 Added a memory configuration option. (_USE_LFN) - Added file lock feature. (_FS_SHARE) - Added fast seek feature. (_USE_FASTSEEK) - Changed some types on the API, XCHAR->TCHAR. - Changed fname member in the FILINFO structure on Unicode cfg. - String functions support UTF-8 encoding files on Unicode cfg. - - Aug 16,'10 R0.08a Added f_getcwd(). (_FS_RPATH = 2) - Added sector erase feature. (_USE_ERASE) - Moved file lock semaphore table from fs object to the bss. - Fixed a wrong directory entry is created on non-LFN cfg when the given name contains ';'. - Fixed f_mkfs() creates wrong FAT32 volume. - - Jan 15,'11 R0.08b Fast seek feature is also applied to f_read() and f_write(). - f_lseek() reports required table size on creating CLMP. - Extended format syntax of f_printf function. - Ignores duplicated directory separators in given path names. - - Sep 06,'11 R0.09 f_mkfs() supports multiple partition to finish the multiple partition feature. - Added f_fdisk(). (_MULTI_PARTITION = 2) - - Aug 27,'12 R0.09a Fixed assertion failure due to OS/2 EA on FAT12/16. - Changed f_open() and f_opendir() reject null object pointer to avoid crash. - Changed option name _FS_SHARE to _FS_LOCK. - - Jan 23,'13 R0.09b Added f_getlabel() and f_setlabel(). (_USE_LABEL) - - Oct 02,'13 R0.10 Added selection of character encoding on the file. (_STRF_ENCODE) - Added f_closedir(). - Added forced full FAT scan for f_getfree(). (_FS_NOFSINFO) - Added forced mount feature with changes of f_mount(). - Improved behavior of volume auto detection. - Improved write throughput of f_puts() and f_printf(). - Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write(). - Fixed f_write() can be truncated when the file size is close to 4GB. - Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect error code. - - Jan 15,'14 R0.10a Added arbitrary strings as drive number in the path name. (_STR_VOLUME_ID) - Added a configuration option of minimum sector size. (_MIN_SS) - 2nd argument of f_rename() can have a drive number and it will be ignored. - Fixed f_mount() with forced mount fails when drive number is >= 1. - Fixed f_close() invalidates the file object without volume lock. - Fixed f_closedir() returns but the volume lock is left acquired. - Fixed creation of an entry with LFN fails on too many SFN collisions. - - Mar 19,'14 R0.10b Fixed a hard error in the disk I/O layer can collapse the directory entry. - Fixed LFN entry is not deleted on delete/rename an object with lossy converted SFN. - - Nov 09,'14 R0.10c Added a configuration option for the platforms without RTC. (_FS_NORTC) - Fixed volume label created by Mac OS X cannot be retrieved with f_getlabel(). - Fixed a potential problem of FAT access that can appear on disk error. - Fixed null pointer dereference on attempting to delete the root direcotry. diff --git a/firmware/chibios-portapack/ext/fatfs/src/diskio.c b/firmware/chibios-portapack/ext/fatfs/src/diskio.c index 169ae95e..82200ad0 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/diskio.c +++ b/firmware/chibios-portapack/ext/fatfs/src/diskio.c @@ -8,14 +8,14 @@ /*-----------------------------------------------------------------------*/ #include "diskio.h" /* FatFs lower layer API */ -#include "usbdisk.h" /* Example: USB drive control */ -#include "atadrive.h" /* Example: ATA drive control */ -#include "sdcard.h" /* Example: MMC/SDC contorl */ +#include "usbdisk.h" /* Example: Header file of existing USB MSD control module */ +#include "atadrive.h" /* Example: Header file of existing ATA harddisk control module */ +#include "sdcard.h" /* Example: Header file of existing MMC/SDC contorl module */ /* Definitions of physical drive number for each drive */ -#define ATA 0 /* Example: Map ATA drive to drive number 0 */ -#define MMC 1 /* Example: Map MMC/SD card to drive number 1 */ -#define USB 2 /* Example: Map USB drive to drive number 2 */ +#define ATA 0 /* Example: Map ATA harddisk to physical drive 0 */ +#define MMC 1 /* Example: Map MMC/SD card to physical drive 1 */ +#define USB 2 /* Example: Map USB MSD to physical drive 2 */ /*-----------------------------------------------------------------------*/ diff --git a/firmware/chibios-portapack/ext/fatfs/src/ff.c b/firmware/chibios-portapack/ext/fatfs/src/ff.c index 9c887c45..dfcf12ae 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/ff.c +++ b/firmware/chibios-portapack/ext/fatfs/src/ff.c @@ -1,137 +1,32 @@ /*----------------------------------------------------------------------------/ -/ FatFs - FAT file system module R0.10c (C)ChaN, 2014 +/ FatFs - FAT file system module R0.11a (C)ChaN, 2015 / /-----------------------------------------------------------------------------/ -/ FatFs module is a generic FAT file system module for small embedded systems. -/ This is a free software that opened for education, research and commercial -/ developments under license policy of following terms. +/ FatFs module is a free software that opened under license policy of +/ following conditions. / -/ Copyright (C) 2014, ChaN, all right reserved. +/ Copyright (C) 2015, ChaN, all right reserved. / -/ * The FatFs module is a free software and there is NO WARRANTY. -/ * No restriction on use. You can use, modify and redistribute it for -/ personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. -/ * Redistributions of source code must retain the above copyright notice. +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. / -/-----------------------------------------------------------------------------/ -/ Feb 26,'06 R0.00 Prototype. -/ -/ Apr 29,'06 R0.01 First stable version. -/ -/ Jun 01,'06 R0.02 Added FAT12 support. -/ Removed unbuffered mode. -/ Fixed a problem on small (<32M) partition. -/ Jun 10,'06 R0.02a Added a configuration option (_FS_MINIMUM). -/ -/ Sep 22,'06 R0.03 Added f_rename(). -/ Changed option _FS_MINIMUM to _FS_MINIMIZE. -/ Dec 11,'06 R0.03a Improved cluster scan algorithm to write files fast. -/ Fixed f_mkdir() creates incorrect directory on FAT32. -/ -/ Feb 04,'07 R0.04 Supported multiple drive system. -/ Changed some interfaces for multiple drive system. -/ Changed f_mountdrv() to f_mount(). -/ Added f_mkfs(). -/ Apr 01,'07 R0.04a Supported multiple partitions on a physical drive. -/ Added a capability of extending file size to f_lseek(). -/ Added minimization level 3. -/ Fixed an endian sensitive code in f_mkfs(). -/ May 05,'07 R0.04b Added a configuration option _USE_NTFLAG. -/ Added FSINFO support. -/ Fixed DBCS name can result FR_INVALID_NAME. -/ Fixed short seek (<= csize) collapses the file object. -/ -/ Aug 25,'07 R0.05 Changed arguments of f_read(), f_write() and f_mkfs(). -/ Fixed f_mkfs() on FAT32 creates incorrect FSINFO. -/ Fixed f_mkdir() on FAT32 creates incorrect directory. -/ Feb 03,'08 R0.05a Added f_truncate() and f_utime(). -/ Fixed off by one error at FAT sub-type determination. -/ Fixed btr in f_read() can be mistruncated. -/ Fixed cached sector is not flushed when create and close without write. -/ -/ Apr 01,'08 R0.06 Added fputc(), fputs(), fprintf() and fgets(). -/ Improved performance of f_lseek() on moving to the same or following cluster. -/ -/ Apr 01,'09 R0.07 Merged Tiny-FatFs as a configuration option. (_FS_TINY) -/ Added long file name feature. -/ Added multiple code page feature. -/ Added re-entrancy for multitask operation. -/ Added auto cluster size selection to f_mkfs(). -/ Added rewind option to f_readdir(). -/ Changed result code of critical errors. -/ Renamed string functions to avoid name collision. -/ Apr 14,'09 R0.07a Separated out OS dependent code on reentrant cfg. -/ Added multiple sector size feature. -/ Jun 21,'09 R0.07c Fixed f_unlink() can return FR_OK on error. -/ Fixed wrong cache control in f_lseek(). -/ Added relative path feature. -/ Added f_chdir() and f_chdrive(). -/ Added proper case conversion to extended character. -/ Nov 03,'09 R0.07e Separated out configuration options from ff.h to ffconf.h. -/ Fixed f_unlink() fails to remove a sub-directory on _FS_RPATH. -/ Fixed name matching error on the 13 character boundary. -/ Added a configuration option, _LFN_UNICODE. -/ Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. -/ -/ May 15,'10 R0.08 Added a memory configuration option. (_USE_LFN = 3) -/ Added file lock feature. (_FS_SHARE) -/ Added fast seek feature. (_USE_FASTSEEK) -/ Changed some types on the API, XCHAR->TCHAR. -/ Changed .fname in the FILINFO structure on Unicode cfg. -/ String functions support UTF-8 encoding files on Unicode cfg. -/ Aug 16,'10 R0.08a Added f_getcwd(). -/ Added sector erase feature. (_USE_ERASE) -/ Moved file lock semaphore table from fs object to the bss. -/ Fixed a wrong directory entry is created on non-LFN cfg when the given name contains ';'. -/ Fixed f_mkfs() creates wrong FAT32 volume. -/ Jan 15,'11 R0.08b Fast seek feature is also applied to f_read() and f_write(). -/ f_lseek() reports required table size on creating CLMP. -/ Extended format syntax of f_printf(). -/ Ignores duplicated directory separators in given path name. -/ -/ Sep 06,'11 R0.09 f_mkfs() supports multiple partition to complete the multiple partition feature. -/ Added f_fdisk(). -/ Aug 27,'12 R0.09a Changed f_open() and f_opendir() reject null object pointer to avoid crash. -/ Changed option name _FS_SHARE to _FS_LOCK. -/ Fixed assertion failure due to OS/2 EA on FAT12/16 volume. -/ Jan 24,'13 R0.09b Added f_setlabel() and f_getlabel(). -/ -/ Oct 02,'13 R0.10 Added selection of character encoding on the file. (_STRF_ENCODE) -/ Added f_closedir(). -/ Added forced full FAT scan for f_getfree(). (_FS_NOFSINFO) -/ Added forced mount feature with changes of f_mount(). -/ Improved behavior of volume auto detection. -/ Improved write throughput of f_puts() and f_printf(). -/ Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write(). -/ Fixed f_write() can be truncated when the file size is close to 4GB. -/ Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect error code. -/ Jan 15,'14 R0.10a Added arbitrary strings as drive number in the path name. (_STR_VOLUME_ID) -/ Added a configuration option of minimum sector size. (_MIN_SS) -/ 2nd argument of f_rename() can have a drive number and it will be ignored. -/ Fixed f_mount() with forced mount fails when drive number is >= 1. -/ Fixed f_close() invalidates the file object without volume lock. -/ Fixed f_closedir() returns but the volume lock is left acquired. -/ Fixed creation of an entry with LFN fails on too many SFN collisions. -/ May 19,'14 R0.10b Fixed a hard error in the disk I/O layer can collapse the directory entry. -/ Fixed LFN entry is not deleted on delete/rename an object with lossy converted SFN. -/ Nov 09,'14 R0.10c Added a configuration option for the platforms without RTC. (_FS_NORTC) -/ Fixed volume label created by Mac OS X cannot be retrieved with f_getlabel(). -/ Fixed a potential problem of FAT access that can appear on disk error. -/ Fixed null pointer dereference on attempting to delete the root direcotry. -/---------------------------------------------------------------------------*/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/----------------------------------------------------------------------------*/ + #include "ff.h" /* Declarations of FatFs API */ #include "diskio.h" /* Declarations of disk I/O functions */ - - /*-------------------------------------------------------------------------- Module Private Definitions ---------------------------------------------------------------------------*/ -#if _FATFS != 80376 /* Revision ID */ +#if _FATFS != 64180 /* Revision ID */ #error Wrong include file (ff.h). #endif @@ -163,8 +58,11 @@ /* Timestamp feature */ -#if _FS_NORTC -#define GET_FATTIME() ((DWORD)_NORTC_YEAR << 25 | (DWORD)_NORTC_MON << 21 | (DWORD)_NORTC_MDAY << 16) +#if _FS_NORTC == 1 +#if _NORTC_YEAR < 1980 || _NORTC_YEAR > 2107 || _NORTC_MON < 1 || _NORTC_MON > 12 || _NORTC_MDAY < 1 || _NORTC_MDAY > 31 +#error Invalid _FS_NORTC settings +#endif +#define GET_FATTIME() ((DWORD)(_NORTC_YEAR - 1980) << 25 | (DWORD)_NORTC_MON << 21 | (DWORD)_NORTC_MDAY << 16) #else #define GET_FATTIME() get_fattime() #endif @@ -185,7 +83,7 @@ typedef struct { -/* DBCS code ranges and SBCS extend character conversion table */ +/* DBCS code ranges and SBCS upper conversion tables */ #if _CODE_PAGE == 932 /* Japanese Shift-JIS */ #define _DF1S 0x81 /* DBC 1st byte range 1 start */ @@ -223,152 +121,192 @@ typedef struct { #define _DS2S 0xA1 #define _DS2E 0xFE -#elif _CODE_PAGE == 437 /* U.S. (OEM) */ +#elif _CODE_PAGE == 437 /* U.S. */ #define _DF1S 0 -#define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F,0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ - 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 720 /* Arabic (OEM) */ +#elif _CODE_PAGE == 720 /* Arabic */ #define _DF1S 0 -#define _EXCVT {0x80,0x81,0x45,0x41,0x84,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x49,0x49,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ - 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 737 /* Greek (OEM) */ +#elif _CODE_PAGE == 737 /* Greek */ #define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \ - 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xE7,0xE8,0xF1,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \ + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xEF,0xF5,0xF0,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 775 /* Baltic (OEM) */ +#elif _CODE_PAGE == 771 /* KBL */ #define _DF1S 0 -#define _EXCVT {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ - 0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDC,0xDE,0xDE, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFE,0xFF} -#elif _CODE_PAGE == 850 /* Multilingual Latin 1 (OEM) */ +#elif _CODE_PAGE == 775 /* Baltic */ #define _DF1S 0 -#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ - 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 852 /* Latin 2 (OEM) */ +#elif _CODE_PAGE == 850 /* Latin 1 */ #define _DF1S 0 -#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F,0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0x9F, \ - 0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF} +#define _EXCVT {0x43,0x55,0x45,0x41,0x41,0x41,0x41,0x43,0x45,0x45,0x45,0x49,0x49,0x49,0x41,0x41, \ + 0x45,0x92,0x92,0x4F,0x4F,0x4F,0x55,0x55,0x59,0x4F,0x55,0x4F,0x9C,0x4F,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0x41,0x41,0x41,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0x41,0x41,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0x45,0x45,0x45,0x49,0x49,0x49,0x49,0xD9,0xDA,0xDB,0xDC,0xDD,0x49,0xDF, \ + 0x4F,0xE1,0x4F,0x4F,0x4F,0x4F,0xE6,0xE8,0xE8,0x55,0x55,0x55,0x59,0x59,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 855 /* Cyrillic (OEM) */ +#elif _CODE_PAGE == 852 /* Latin 2 */ #define _DF1S 0 -#define _EXCVT {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F,0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \ - 0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \ - 0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0xAC, \ + 0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF} -#elif _CODE_PAGE == 857 /* Turkish (OEM) */ +#elif _CODE_PAGE == 855 /* Cyrillic */ #define _DF1S 0 -#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x98,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \ - 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0x59,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F, \ + 0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \ + 0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \ + 0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF, \ + 0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 858 /* Multilingual Latin 1 + Euro (OEM) */ +#elif _CODE_PAGE == 857 /* Turkish */ #define _DF1S 0 -#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ - 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0x49,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 862 /* Hebrew (OEM) */ +#elif _CODE_PAGE == 860 /* Portuguese */ #define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ - 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x80,0x9A,0x90,0x8F,0x8E,0x91,0x86,0x80,0x89,0x89,0x92,0x8B,0x8C,0x98,0x8E,0x8F, \ + 0x90,0x91,0x92,0x8C,0x99,0xA9,0x96,0x9D,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x86,0x8B,0x9F,0x96,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 866 /* Russian (OEM) */ +#elif _CODE_PAGE == 861 /* Icelandic */ #define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ - 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0x90,0x91,0x92,0x93,0x9d,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x8B,0x8B,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x8D,0x55,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA4,0xA5,0xA6,0xA7,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 874 /* Thai (OEM, Windows) */ +#elif _CODE_PAGE == 862 /* Hebrew */ #define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ - 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 1250 /* Central Europe (Windows) */ +#elif _CODE_PAGE == 863 /* Canadian-French */ #define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \ - 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xA3,0xB4,0xB5,0xB6,0xB7,0xB8,0xA5,0xAA,0xBB,0xBC,0xBD,0xBC,0xAF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF} +#define _EXCVT {0x43,0x55,0x45,0x41,0x41,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x41,0x8F, \ + 0x45,0x45,0x45,0x4F,0x45,0x49,0x55,0x55,0x98,0x4F,0x55,0x9B,0x9C,0x55,0x55,0x9F, \ + 0xA0,0xA1,0x4F,0x55,0xA4,0xA5,0xA6,0xA7,0x49,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 1251 /* Cyrillic (Windows) */ +#elif _CODE_PAGE == 864 /* Arabic */ #define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x82,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x80,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \ - 0xA0,0xA2,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB2,0xA5,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xA3,0xBD,0xBD,0xAF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF} +#define _EXCVT {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 1252 /* Latin 1 (Windows) */ +#elif _CODE_PAGE == 865 /* Nordic */ #define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xAd,0x9B,0x8C,0x9D,0xAE,0x9F, \ - 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F} +#define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 1253 /* Greek (Windows) */ +#elif _CODE_PAGE == 866 /* Russian */ #define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ - 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xA2,0xB8,0xB9,0xBA, \ - 0xE0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xFB,0xBC,0xFD,0xBF,0xFF} +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x90,0x91,0x92,0x93,0x9d,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 1254 /* Turkish (Windows) */ +#elif _CODE_PAGE == 869 /* Greek 2 */ #define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x9D,0x9E,0x9F, \ - 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F} - -#elif _CODE_PAGE == 1255 /* Hebrew (Windows) */ -#define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ - 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} - -#elif _CODE_PAGE == 1256 /* Arabic (Windows) */ -#define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x8C,0x9D,0x9E,0x9F, \ - 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0x41,0xE1,0x41,0xE3,0xE4,0xE5,0xE6,0x43,0x45,0x45,0x45,0x45,0xEC,0xED,0x49,0x49,0xF0,0xF1,0xF2,0xF3,0x4F,0xF5,0xF6,0xF7,0xF8,0x55,0xFA,0x55,0x55,0xFD,0xFE,0xFF} - -#elif _CODE_PAGE == 1257 /* Baltic (Windows) */ -#define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ - 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xBC,0xBD,0xBE,0xAF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF} - -#elif _CODE_PAGE == 1258 /* Vietnam (OEM, Windows) */ -#define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0xAC,0x9D,0x9E,0x9F, \ - 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xEC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xFE,0x9F} +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x86,0x9C,0x8D,0x8F,0x90, \ + 0x91,0x90,0x92,0x95,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xA4,0xA5,0xA6,0xD9,0xDA,0xDB,0xDC,0xA7,0xA8,0xDF, \ + 0xA9,0xAA,0xAC,0xAD,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xCF,0xCF,0xD0,0xEF, \ + 0xF0,0xF1,0xD1,0xD2,0xD3,0xF5,0xD4,0xF7,0xF8,0xF9,0xD5,0x96,0x95,0x98,0xFE,0xFF} #elif _CODE_PAGE == 1 /* ASCII (for only non-LFN cfg) */ #if _USE_LFN @@ -420,12 +358,12 @@ typedef struct { /* FAT sub-type boundaries (Differ from specs but correct for real DOS/Windows) */ -#define MIN_FAT16 4086U /* Minimum number of clusters as FAT16 */ -#define MIN_FAT32 65526U /* Minimum number of clusters as FAT32 */ +#define MIN_FAT16 4086U /* Minimum number of clusters of FAT16 */ +#define MIN_FAT32 65526U /* Minimum number of clusters of FAT32 */ /* FatFs refers the members in the FAT structures as byte array instead of -/ structure member because the structure is not binary compatible between +/ structure members because the structure is not binary compatible between / different platforms */ #define BS_jmpBoot 0 /* x86 jump instruction (3) */ @@ -442,7 +380,8 @@ typedef struct { #define BPB_NumHeads 26 /* Number of heads (2) */ #define BPB_HiddSec 28 /* Number of special hidden sectors (4) */ #define BPB_TotSec32 32 /* Volume size [sector] (4) */ -#define BS_DrvNum 36 /* Physical drive number (2) */ +#define BS_DrvNum 36 /* Physical drive number (1) */ +#define BS_NTres 37 /* Error flag (1) */ #define BS_BootSig 38 /* Extended boot signature (1) */ #define BS_VolID 39 /* Volume serial number (4) */ #define BS_VolLab 43 /* Volume label (8) */ @@ -453,7 +392,8 @@ typedef struct { #define BPB_RootClus 44 /* Root directory first cluster (4) */ #define BPB_FSInfo 48 /* Offset of FSINFO sector (2) */ #define BPB_BkBootSec 50 /* Offset of backup boot sector (2) */ -#define BS_DrvNum32 64 /* Physical drive number (2) */ +#define BS_DrvNum32 64 /* Physical drive number (1) */ +#define BS_NTres32 65 /* Error flag (1) */ #define BS_BootSig32 66 /* Extended boot signature (1) */ #define BS_VolID32 67 /* Volume serial number (4) */ #define BS_VolLab32 71 /* Volume label (8) */ @@ -468,7 +408,7 @@ typedef struct { #define DIR_Name 0 /* Short file name (11) */ #define DIR_Attr 11 /* Attribute (1) */ -#define DIR_NTres 12 /* NT flag (1) */ +#define DIR_NTres 12 /* Lower case flag (1) */ #define DIR_CrtTimeTenth 13 /* Created time sub-second (1) */ #define DIR_CrtTime 14 /* Created time (2) */ #define DIR_CrtDate 16 /* Created date (2) */ @@ -481,22 +421,25 @@ typedef struct { #define LDIR_Ord 0 /* LFN entry order and LLE flag (1) */ #define LDIR_Attr 11 /* LFN attribute (1) */ #define LDIR_Type 12 /* LFN type (1) */ -#define LDIR_Chksum 13 /* Sum of corresponding SFN entry */ -#define LDIR_FstClusLO 26 /* Filled by zero (0) */ -#define SZ_DIR 32 /* Size of a directory entry */ -#define LLE 0x40 /* Last long entry flag in LDIR_Ord */ -#define DDE 0xE5 /* Deleted directory entry mark in DIR_Name[0] */ -#define NDDE 0x05 /* Replacement of the character collides with DDE */ +#define LDIR_Chksum 13 /* Checksum of corresponding SFN entry */ +#define LDIR_FstClusLO 26 /* Must be zero (0) */ +#define SZ_DIRE 32 /* Size of a directory entry */ +#define LLEF 0x40 /* Last long entry flag in LDIR_Ord */ +#define DDEM 0xE5 /* Deleted directory entry mark at DIR_Name[0] */ +#define RDDEM 0x05 /* Replacement of the character collides with DDEM */ -/*------------------------------------------------------------*/ -/* Module private work area */ -/*------------------------------------------------------------*/ -/* Remark: Uninitialized variables with static duration are -/ guaranteed zero/null at start-up. If not, either the linker -/ or start-up routine being used is out of ANSI-C standard. +/*-------------------------------------------------------------------------- + + Module Private Work Area + +---------------------------------------------------------------------------*/ + +/* Remark: Uninitialized variables with static duration are guaranteed +/ zero/null at start-up. If not, either the linker or start-up routine +/ being used is not compliance with ANSI-C standard. */ #if _VOLUMES < 1 || _VOLUMES > 9 @@ -514,7 +457,7 @@ static FILESEM Files[_FS_LOCK]; /* Open object lock semaphores */ #endif #if _USE_LFN == 0 /* Non LFN feature */ -#define DEF_NAMEBUF BYTE sfn[12] +#define DEFINE_NAMEBUF BYTE sfn[12] #define INIT_BUF(dobj) (dobj).fn = sfn #define FREE_BUF() #else @@ -522,16 +465,16 @@ static FILESEM Files[_FS_LOCK]; /* Open object lock semaphores */ #error Wrong _MAX_LFN setting #endif #if _USE_LFN == 1 /* LFN feature with static working buffer */ -static WCHAR LfnBuf[_MAX_LFN+1]; -#define DEF_NAMEBUF BYTE sfn[12] +static WCHAR LfnBuf[_MAX_LFN + 1]; +#define DEFINE_NAMEBUF BYTE sfn[12] #define INIT_BUF(dobj) { (dobj).fn = sfn; (dobj).lfn = LfnBuf; } #define FREE_BUF() #elif _USE_LFN == 2 /* LFN feature with dynamic working buffer on the stack */ -#define DEF_NAMEBUF BYTE sfn[12]; WCHAR lbuf[_MAX_LFN+1] +#define DEFINE_NAMEBUF BYTE sfn[12]; WCHAR lbuf[_MAX_LFN + 1] #define INIT_BUF(dobj) { (dobj).fn = sfn; (dobj).lfn = lbuf; } #define FREE_BUF() #elif _USE_LFN == 3 /* LFN feature with dynamic working buffer on the heap */ -#define DEF_NAMEBUF BYTE sfn[12]; WCHAR *lfn +#define DEFINE_NAMEBUF BYTE sfn[12]; WCHAR *lfn #define INIT_BUF(dobj) { lfn = ff_memalloc((_MAX_LFN + 1) * 2); if (!lfn) LEAVE_FF((dobj).fs, FR_NOT_ENOUGH_CORE); (dobj).lfn = lfn; (dobj).fn = sfn; } #define FREE_BUF() ff_memfree(lfn) #else @@ -540,7 +483,7 @@ static WCHAR LfnBuf[_MAX_LFN+1]; #endif #ifdef _EXCVT -static const BYTE ExCvt[] = _EXCVT; /* Upper conversion table for extended characters */ +static const BYTE ExCvt[] = _EXCVT; /* Upper conversion table for SBCS extended characters */ #endif @@ -754,7 +697,7 @@ void clear_lock ( /* Clear lock entries of the volume */ /*-----------------------------------------------------------------------*/ #if !_FS_READONLY static -FRESULT sync_window ( +FRESULT sync_window ( /* FR_OK:succeeded, !=0:error */ FATFS* fs /* File system object */ ) { @@ -783,7 +726,7 @@ FRESULT sync_window ( static -FRESULT move_window ( +FRESULT move_window ( /* FR_OK(0):succeeded, !=0:error */ FATFS* fs, /* File system object */ DWORD sector /* Sector number to make appearance in the fs->win[] */ ) @@ -814,7 +757,7 @@ FRESULT move_window ( /*-----------------------------------------------------------------------*/ #if !_FS_READONLY static -FRESULT sync_fs ( /* FR_OK: successful, FR_DISK_ERR: failed */ +FRESULT sync_fs ( /* FR_OK:succeeded, !=0:error */ FATFS* fs /* File system object */ ) { @@ -823,16 +766,16 @@ FRESULT sync_fs ( /* FR_OK: successful, FR_DISK_ERR: failed */ res = sync_window(fs); if (res == FR_OK) { - /* Update FSINFO sector if needed */ + /* Update FSInfo sector if needed */ if (fs->fs_type == FS_FAT32 && fs->fsi_flag == 1) { - /* Create FSINFO structure */ + /* Create FSInfo structure */ mem_set(fs->win, 0, SS(fs)); - ST_WORD(fs->win+BS_55AA, 0xAA55); - ST_DWORD(fs->win+FSI_LeadSig, 0x41615252); - ST_DWORD(fs->win+FSI_StrucSig, 0x61417272); - ST_DWORD(fs->win+FSI_Free_Count, fs->free_clust); - ST_DWORD(fs->win+FSI_Nxt_Free, fs->last_clust); - /* Write it into the FSINFO sector */ + ST_WORD(fs->win + BS_55AA, 0xAA55); + ST_DWORD(fs->win + FSI_LeadSig, 0x41615252); + ST_DWORD(fs->win + FSI_StrucSig, 0x61417272); + ST_DWORD(fs->win + FSI_Free_Count, fs->free_clust); + ST_DWORD(fs->win + FSI_Nxt_Free, fs->last_clust); + /* Write it into the FSInfo sector */ fs->winsect = fs->volbase + 1; disk_write(fs->drv, fs->win, fs->winsect, 1); fs->fsi_flag = 0; @@ -854,7 +797,7 @@ FRESULT sync_fs ( /* FR_OK: successful, FR_DISK_ERR: failed */ /*-----------------------------------------------------------------------*/ /* Hidden API for hacks and disk tools */ -DWORD clust2sect ( /* !=0: Sector number, 0: Failed - invalid cluster# */ +DWORD clust2sect ( /* !=0:Sector number, 0:Failed (invalid cluster#) */ FATFS* fs, /* File system object */ DWORD clst /* Cluster# to be converted */ ) @@ -874,7 +817,7 @@ DWORD clust2sect ( /* !=0: Sector number, 0: Failed - invalid cluster# */ DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Internal error, 2..0x0FFFFFFF:Cluster status */ FATFS* fs, /* File system object */ - DWORD clst /* FAT item index (cluster#) to get the value */ + DWORD clst /* FAT index number (cluster number) to get the value */ ) { UINT wc, bc; @@ -882,7 +825,7 @@ DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Internal error, 2..0x0FFFFFFF:Cluste DWORD val; - if (clst < 2 || clst >= fs->n_fatent) { /* Check range */ + if (clst < 2 || clst >= fs->n_fatent) { /* Check if in valid range */ val = 1; /* Internal error */ } else { @@ -927,10 +870,10 @@ DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Internal error, 2..0x0FFFFFFF:Cluste /* Hidden API for hacks and disk tools */ #if !_FS_READONLY -FRESULT put_fat ( - FATFS* fs, /* File system object */ - DWORD clst, /* FAT item index (cluster#) to be set */ - DWORD val /* New value to mark the cluster */ +FRESULT put_fat ( /* FR_OK(0):succeeded, !=0:error */ + FATFS* fs, /* File system object */ + DWORD clst, /* FAT index number (cluster number) to be changed */ + DWORD val /* New value to be set to the entry */ ) { UINT bc; @@ -938,7 +881,7 @@ FRESULT put_fat ( FRESULT res; - if (clst < 2 || clst >= fs->n_fatent) { /* Check range */ + if (clst < 2 || clst >= fs->n_fatent) { /* Check if in valid range */ res = FR_INT_ERR; } else { @@ -991,7 +934,7 @@ FRESULT put_fat ( /*-----------------------------------------------------------------------*/ #if !_FS_READONLY static -FRESULT remove_chain ( +FRESULT remove_chain ( /* FR_OK(0):succeeded, !=0:error */ FATFS* fs, /* File system object */ DWORD clst /* Cluster# to remove a chain from */ ) @@ -1002,7 +945,7 @@ FRESULT remove_chain ( DWORD scl = clst, ecl = clst, rt[2]; #endif - if (clst < 2 || clst >= fs->n_fatent) { /* Check range */ + if (clst < 2 || clst >= fs->n_fatent) { /* Check if in valid range */ res = FR_INT_ERR; } else { @@ -1046,7 +989,7 @@ FRESULT remove_chain ( static DWORD create_chain ( /* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */ FATFS* fs, /* File system object */ - DWORD clst /* Cluster# to stretch. 0 means create a new chain. */ + DWORD clst /* Cluster# to stretch, 0:Create a new chain */ ) { DWORD cs, ncl, scl; @@ -1134,7 +1077,7 @@ DWORD clmt_clust ( /* <2:Error, >=2:Cluster number */ /*-----------------------------------------------------------------------*/ static -FRESULT dir_sdi ( +FRESULT dir_sdi ( /* FR_OK(0):succeeded, !=0:error */ DIR* dp, /* Pointer to directory object */ UINT idx /* Index of directory table */ ) @@ -1156,7 +1099,7 @@ FRESULT dir_sdi ( sect = dp->fs->dirbase; } else { /* Dynamic table (root-directory in FAT32 or sub-directory) */ - ic = SS(dp->fs) / SZ_DIR * dp->fs->csize; /* Entries per cluster */ + ic = SS(dp->fs) / SZ_DIRE * dp->fs->csize; /* Entries per cluster */ while (idx >= ic) { /* Follow cluster chain */ clst = get_fat(dp->fs, clst); /* Get next cluster */ if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ @@ -1168,8 +1111,8 @@ FRESULT dir_sdi ( } dp->clust = clst; /* Current cluster# */ if (!sect) return FR_INT_ERR; - dp->sect = sect + idx / (SS(dp->fs) / SZ_DIR); /* Sector# of the directory entry */ - dp->dir = dp->fs->win + (idx % (SS(dp->fs) / SZ_DIR)) * SZ_DIR; /* Ptr to the entry in the sector */ + dp->sect = sect + idx / (SS(dp->fs) / SZ_DIRE); /* Sector# of the directory entry */ + dp->dir = dp->fs->win + (idx % (SS(dp->fs) / SZ_DIRE)) * SZ_DIRE; /* Ptr to the entry in the sector */ return FR_OK; } @@ -1182,20 +1125,23 @@ FRESULT dir_sdi ( /*-----------------------------------------------------------------------*/ static -FRESULT dir_next ( /* FR_OK:Succeeded, FR_NO_FILE:End of table, FR_DENIED:Could not stretch */ +FRESULT dir_next ( /* FR_OK(0):succeeded, FR_NO_FILE:End of table, FR_DENIED:Could not stretch */ DIR* dp, /* Pointer to the directory object */ int stretch /* 0: Do not stretch table, 1: Stretch table if needed */ ) { DWORD clst; UINT i; +#if !_FS_READONLY + UINT c; +#endif i = dp->index + 1; if (!(i & 0xFFFF) || !dp->sect) /* Report EOT when index has reached 65535 */ return FR_NO_FILE; - if (!(i % (SS(dp->fs) / SZ_DIR))) { /* Sector changed? */ + if (!(i % (SS(dp->fs) / SZ_DIRE))) { /* Sector changed? */ dp->sect++; /* Next sector */ if (!dp->clust) { /* Static table */ @@ -1203,13 +1149,12 @@ FRESULT dir_next ( /* FR_OK:Succeeded, FR_NO_FILE:End of table, FR_DENIED:Could return FR_NO_FILE; } else { /* Dynamic table */ - if (((i / (SS(dp->fs) / SZ_DIR)) & (dp->fs->csize - 1)) == 0) { /* Cluster changed? */ + if (((i / (SS(dp->fs) / SZ_DIRE)) & (dp->fs->csize - 1)) == 0) { /* Cluster changed? */ clst = get_fat(dp->fs, dp->clust); /* Get next cluster */ if (clst <= 1) return FR_INT_ERR; if (clst == 0xFFFFFFFF) return FR_DISK_ERR; if (clst >= dp->fs->n_fatent) { /* If it reached end of dynamic table, */ #if !_FS_READONLY - UINT c; if (!stretch) return FR_NO_FILE; /* If do not stretch, report EOT */ clst = create_chain(dp->fs, dp->clust); /* Stretch cluster chain */ if (clst == 0) return FR_DENIED; /* No free cluster */ @@ -1237,7 +1182,7 @@ FRESULT dir_next ( /* FR_OK:Succeeded, FR_NO_FILE:End of table, FR_DENIED:Could } dp->index = (WORD)i; /* Current index */ - dp->dir = dp->fs->win + (i % (SS(dp->fs) / SZ_DIR)) * SZ_DIR; /* Current entry in the window */ + dp->dir = dp->fs->win + (i % (SS(dp->fs) / SZ_DIRE)) * SZ_DIRE; /* Current entry in the window */ return FR_OK; } @@ -1251,9 +1196,9 @@ FRESULT dir_next ( /* FR_OK:Succeeded, FR_NO_FILE:End of table, FR_DENIED:Could #if !_FS_READONLY static -FRESULT dir_alloc ( - DIR* dp, /* Pointer to the directory object */ - UINT nent /* Number of contiguous entries to allocate (1-21) */ +FRESULT dir_alloc ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp, /* Pointer to the directory object */ + UINT nent /* Number of contiguous entries to allocate (1-21) */ ) { FRESULT res; @@ -1266,7 +1211,7 @@ FRESULT dir_alloc ( do { res = move_window(dp->fs, dp->sect); if (res != FR_OK) break; - if (dp->dir[0] == DDE || dp->dir[0] == 0) { /* Is it a free entry? */ + if (dp->dir[0] == DDEM || dp->dir[0] == 0) { /* Is it a free entry? */ if (++n == nent) break; /* A block of contiguous free entries is found */ } else { n = 0; /* Not a blank entry. Restart to search */ @@ -1287,16 +1232,16 @@ FRESULT dir_alloc ( /*-----------------------------------------------------------------------*/ static -DWORD ld_clust ( - FATFS* fs, /* Pointer to the fs object */ - BYTE* dir /* Pointer to the directory entry */ +DWORD ld_clust ( /* Returns the top cluster value of the SFN entry */ + FATFS* fs, /* Pointer to the fs object */ + const BYTE* dir /* Pointer to the SFN entry */ ) { DWORD cl; - cl = LD_WORD(dir+DIR_FstClusLO); + cl = LD_WORD(dir + DIR_FstClusLO); if (fs->fs_type == FS_FAT32) - cl |= (DWORD)LD_WORD(dir+DIR_FstClusHI) << 16; + cl |= (DWORD)LD_WORD(dir + DIR_FstClusHI) << 16; return cl; } @@ -1305,12 +1250,12 @@ DWORD ld_clust ( #if !_FS_READONLY static void st_clust ( - BYTE* dir, /* Pointer to the directory entry */ + BYTE* dir, /* Pointer to the SFN entry */ DWORD cl /* Value to be set */ ) { - ST_WORD(dir+DIR_FstClusLO, cl); - ST_WORD(dir+DIR_FstClusHI, cl >> 16); + ST_WORD(dir + DIR_FstClusLO, cl); + ST_WORD(dir + DIR_FstClusHI, cl >> 16); } #endif @@ -1326,94 +1271,97 @@ const BYTE LfnOfs[] = {1,3,5,7,9,14,16,18,20,22,24,28,30}; /* Offset of LFN char static -int cmp_lfn ( /* 1:Matched, 0:Not matched */ - WCHAR* lfnbuf, /* Pointer to the LFN to be compared */ - BYTE* dir /* Pointer to the directory entry containing a part of LFN */ +int cmp_lfn ( /* 1:matched, 0:not matched */ + WCHAR* lfnbuf, /* Pointer to the LFN working buffer to be compared */ + BYTE* dir /* Pointer to the directory entry containing the part of LFN */ ) { UINT i, s; WCHAR wc, uc; - i = ((dir[LDIR_Ord] & ~LLE) - 1) * 13; /* Get offset in the LFN buffer */ - s = 0; wc = 1; - do { - uc = LD_WORD(dir+LfnOfs[s]); /* Pick an LFN character from the entry */ - if (wc) { /* Last character has not been processed */ - wc = ff_wtoupper(uc); /* Convert it to upper case */ - if (i >= _MAX_LFN || wc != ff_wtoupper(lfnbuf[i++])) /* Compare it */ - return 0; /* Not matched */ - } else { - if (uc != 0xFFFF) return 0; /* Check filler */ - } - } while (++s < 13); /* Repeat until all characters in the entry are checked */ + if (LD_WORD(dir + LDIR_FstClusLO) != 0) return 0; /* Check LDIR_FstClusLO */ - if ((dir[LDIR_Ord] & LLE) && wc && lfnbuf[i]) /* Last segment matched but different length */ + i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ + + for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ + uc = LD_WORD(dir + LfnOfs[s]); /* Pick an LFN character */ + if (wc) { + if (i >= _MAX_LFN || ff_wtoupper(uc) != ff_wtoupper(lfnbuf[i++])) /* Compare it */ + return 0; /* Not matched */ + wc = uc; + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } + + if ((dir[LDIR_Ord] & LLEF) && wc && lfnbuf[i]) /* Last segment matched but different length */ return 0; - return 1; /* The part of LFN matched */ + return 1; /* The part of LFN matched */ } static -int pick_lfn ( /* 1:Succeeded, 0:Buffer overflow */ - WCHAR* lfnbuf, /* Pointer to the Unicode-LFN buffer */ - BYTE* dir /* Pointer to the directory entry */ +int pick_lfn ( /* 1:succeeded, 0:buffer overflow or invalid LFN entry */ + WCHAR* lfnbuf, /* Pointer to the LFN working buffer */ + BYTE* dir /* Pointer to the LFN entry */ ) { UINT i, s; WCHAR wc, uc; + if (LD_WORD(dir + LDIR_FstClusLO) != 0) return 0; /* Check LDIR_FstClusLO */ + i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ - s = 0; wc = 1; - do { - uc = LD_WORD(dir+LfnOfs[s]); /* Pick an LFN character from the entry */ - if (wc) { /* Last character has not been processed */ + for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ + uc = LD_WORD(dir + LfnOfs[s]); /* Pick an LFN character */ + if (wc) { if (i >= _MAX_LFN) return 0; /* Buffer overflow? */ lfnbuf[i++] = wc = uc; /* Store it */ } else { if (uc != 0xFFFF) return 0; /* Check filler */ } - } while (++s < 13); /* Read all character in the entry */ + } - if (dir[LDIR_Ord] & LLE) { /* Put terminator if it is the last LFN part */ + if (dir[LDIR_Ord] & LLEF) { /* Put terminator if it is the last LFN part */ if (i >= _MAX_LFN) return 0; /* Buffer overflow? */ lfnbuf[i] = 0; } - return 1; + return 1; /* The part of LFN is valid */ } #if !_FS_READONLY static void fit_lfn ( - const WCHAR* lfnbuf, /* Pointer to the LFN buffer */ - BYTE* dir, /* Pointer to the directory entry */ + const WCHAR* lfnbuf, /* Pointer to the LFN working buffer */ + BYTE* dir, /* Pointer to the LFN entry to be processed */ BYTE ord, /* LFN order (1-20) */ - BYTE sum /* SFN sum */ + BYTE sum /* Checksum of the corresponding SFN */ ) { UINT i, s; WCHAR wc; - dir[LDIR_Chksum] = sum; /* Set check sum */ + dir[LDIR_Chksum] = sum; /* Set checksum */ dir[LDIR_Attr] = AM_LFN; /* Set attribute. LFN entry */ dir[LDIR_Type] = 0; - ST_WORD(dir+LDIR_FstClusLO, 0); + ST_WORD(dir + LDIR_FstClusLO, 0); - i = (ord - 1) * 13; /* Get offset in the LFN buffer */ + i = (ord - 1) * 13; /* Get offset in the LFN working buffer */ s = wc = 0; do { if (wc != 0xFFFF) wc = lfnbuf[i++]; /* Get an effective character */ ST_WORD(dir+LfnOfs[s], wc); /* Put it */ if (!wc) wc = 0xFFFF; /* Padding characters following last character */ } while (++s < 13); - if (wc == 0xFFFF || !lfnbuf[i]) ord |= LLE; /* Bottom LFN part is the start of LFN sequence */ + if (wc == 0xFFFF || !lfnbuf[i]) ord |= LLEF; /* Bottom LFN part is the start of LFN sequence */ dir[LDIR_Ord] = ord; /* Set the LFN order */ } @@ -1437,14 +1385,14 @@ void gen_numname ( { BYTE ns[8], c; UINT i, j; + WCHAR wc; + DWORD sr; mem_cpy(dst, src, 11); if (seq > 5) { /* On many collisions, generate a hash number instead of sequential number */ - WCHAR wc; - DWORD sr = seq; - + sr = seq; while (*lfn) { /* Create a CRC */ wc = *lfn++; for (i = 0; i < 16; i++) { @@ -1483,7 +1431,7 @@ void gen_numname ( /*-----------------------------------------------------------------------*/ -/* Calculate sum of an SFN */ +/* Calculate checksum of an SFN entry */ /*-----------------------------------------------------------------------*/ #if _USE_LFN static @@ -1507,7 +1455,7 @@ BYTE sum_sfn ( /*-----------------------------------------------------------------------*/ static -FRESULT dir_find ( +FRESULT dir_find ( /* FR_OK(0):succeeded, !=0:error */ DIR* dp /* Pointer to the directory object linked to the file name */ ) { @@ -1531,14 +1479,14 @@ FRESULT dir_find ( if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ #if _USE_LFN /* LFN configuration */ a = dir[DIR_Attr] & AM_MASK; - if (c == DDE || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ + if (c == DDEM || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ ord = 0xFF; dp->lfn_idx = 0xFFFF; /* Reset LFN sequence */ } else { if (a == AM_LFN) { /* An LFN entry is found */ if (dp->lfn) { - if (c & LLE) { /* Is it start of LFN sequence? */ + if (c & LLEF) { /* Is it start of LFN sequence? */ sum = dir[LDIR_Chksum]; - c &= ~LLE; ord = c; /* LFN start order */ + c &= ~LLEF; ord = c; /* LFN start order */ dp->lfn_idx = dp->index; /* Start index of LFN */ } /* Check validity of the LFN entry and compare it with given name */ @@ -1588,13 +1536,13 @@ FRESULT dir_read ( if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ a = dir[DIR_Attr] & AM_MASK; #if _USE_LFN /* LFN configuration */ - if (c == DDE || (!_FS_RPATH && c == '.') || (int)((a & ~AM_ARC) == AM_VOL) != vol) { /* An entry without valid data */ + if (c == DDEM || (!_FS_RPATH && c == '.') || (int)((a & ~AM_ARC) == AM_VOL) != vol) { /* An entry without valid data */ ord = 0xFF; } else { if (a == AM_LFN) { /* An LFN entry is found */ - if (c & LLE) { /* Is it start of LFN sequence? */ + if (c & LLEF) { /* Is it start of LFN sequence? */ sum = dir[LDIR_Chksum]; - c &= ~LLE; ord = c; + c &= ~LLEF; ord = c; dp->lfn_idx = dp->index; } /* Check LFN validity and capture it */ @@ -1606,7 +1554,7 @@ FRESULT dir_read ( } } #else /* Non LFN configuration */ - if (c != DDE && (_FS_RPATH || c != '.') && a != AM_LFN && (int)((a & ~AM_ARC) == AM_VOL) == vol) /* Is it a valid entry? */ + if (c != DDEM && (_FS_RPATH || c != '.') && a != AM_LFN && (int)((a & ~AM_ARC) == AM_VOL) == vol) /* Is it a valid entry? */ break; #endif res = dir_next(dp, 0); /* Next entry */ @@ -1627,7 +1575,7 @@ FRESULT dir_read ( /*-----------------------------------------------------------------------*/ #if !_FS_READONLY static -FRESULT dir_register ( /* FR_OK:Successful, FR_DENIED:No free entry or too many SFN collision, FR_DISK_ERR:Disk error */ +FRESULT dir_register ( /* FR_OK:succeeded, FR_DENIED:no free entry or too many SFN collision, FR_DISK_ERR:disk error */ DIR* dp /* Target directory with object name to be created */ ) { @@ -1667,7 +1615,7 @@ FRESULT dir_register ( /* FR_OK:Successful, FR_DENIED:No free entry or too many if (res == FR_OK && --nent) { /* Set LFN entry if needed */ res = dir_sdi(dp, dp->index - nent); if (res == FR_OK) { - sum = sum_sfn(dp->fn); /* Sum value of the SFN tied to the LFN */ + sum = sum_sfn(dp->fn); /* Checksum value of the SFN tied to the LFN */ do { /* Store LFN entries in bottom first */ res = move_window(dp->fs, dp->sect); if (res != FR_OK) break; @@ -1684,7 +1632,7 @@ FRESULT dir_register ( /* FR_OK:Successful, FR_DENIED:No free entry or too many if (res == FR_OK) { /* Set SFN entry */ res = move_window(dp->fs, dp->sect); if (res == FR_OK) { - mem_set(dp->dir, 0, SZ_DIR); /* Clean the entry */ + mem_set(dp->dir, 0, SZ_DIRE); /* Clean the entry */ mem_cpy(dp->dir, dp->fn, 11); /* Put SFN */ #if _USE_LFN dp->dir[DIR_NTres] = dp->fn[NSFLAG] & (NS_BODY | NS_EXT); /* Put NT flag */ @@ -1705,7 +1653,7 @@ FRESULT dir_register ( /* FR_OK:Successful, FR_DENIED:No free entry or too many /*-----------------------------------------------------------------------*/ #if !_FS_READONLY && !_FS_MINIMIZE static -FRESULT dir_remove ( /* FR_OK: Successful, FR_DISK_ERR: A disk error */ +FRESULT dir_remove ( /* FR_OK:Succeeded, FR_DISK_ERR:A disk error */ DIR* dp /* Directory object pointing the entry to be removed */ ) { @@ -1719,8 +1667,8 @@ FRESULT dir_remove ( /* FR_OK: Successful, FR_DISK_ERR: A disk error */ do { res = move_window(dp->fs, dp->sect); if (res != FR_OK) break; - mem_set(dp->dir, 0, SZ_DIR); /* Clear and mark the entry "deleted" */ - *dp->dir = DDE; + mem_set(dp->dir, 0, SZ_DIRE); /* Clear and mark the entry "deleted" */ + *dp->dir = DDEM; dp->fs->wflag = 1; if (dp->index >= i) break; /* When reached SFN, all entries of the object has been deleted. */ res = dir_next(dp, 0); /* Next entry */ @@ -1733,8 +1681,8 @@ FRESULT dir_remove ( /* FR_OK: Successful, FR_DISK_ERR: A disk error */ if (res == FR_OK) { res = move_window(dp->fs, dp->sect); if (res == FR_OK) { - mem_set(dp->dir, 0, SZ_DIR); /* Clear and mark the entry "deleted" */ - *dp->dir = DDE; + mem_set(dp->dir, 0, SZ_DIRE); /* Clear and mark the entry "deleted" */ + *dp->dir = DDEM; dp->fs->wflag = 1; } } @@ -1759,18 +1707,20 @@ void get_fileinfo ( /* No return code */ { UINT i; TCHAR *p, c; - + BYTE *dir; +#if _USE_LFN + WCHAR w, *lfn; +#endif p = fno->fname; if (dp->sect) { /* Get SFN */ - BYTE *dir = dp->dir; - + dir = dp->dir; i = 0; while (i < 11) { /* Copy name body and extension */ c = (TCHAR)dir[i++]; - if (c == ' ') continue; /* Skip padding spaces */ - if (c == NDDE) c = (TCHAR)DDE; /* Restore replaced DDE character */ - if (i == 9) *p++ = '.'; /* Insert a . if extension is exist */ + if (c == ' ') continue; /* Skip padding spaces */ + if (c == RDDEM) c = (TCHAR)DDEM; /* Restore replaced DDEM character */ + if (i == 9) *p++ = '.'; /* Insert a . if extension is exist */ #if _USE_LFN if (IsUpper(c) && (dir[DIR_NTres] & (i >= 9 ? NS_EXT : NS_BODY))) c += 0x20; /* To lower */ @@ -1784,16 +1734,14 @@ void get_fileinfo ( /* No return code */ *p++ = c; } fno->fattrib = dir[DIR_Attr]; /* Attribute */ - fno->fsize = LD_DWORD(dir+DIR_FileSize); /* Size */ - fno->fdate = LD_WORD(dir+DIR_WrtDate); /* Date */ - fno->ftime = LD_WORD(dir+DIR_WrtTime); /* Time */ + fno->fsize = LD_DWORD(dir + DIR_FileSize); /* Size */ + fno->fdate = LD_WORD(dir + DIR_WrtDate); /* Date */ + fno->ftime = LD_WORD(dir + DIR_WrtTime); /* Time */ } *p = 0; /* Terminate SFN string by a \0 */ #if _USE_LFN if (fno->lfname) { - WCHAR w, *lfn; - i = 0; p = fno->lfname; if (dp->sect && fno->lfsize && dp->lfn_idx != 0xFFFF) { /* Get LFN if available */ lfn = dp->lfn; @@ -1812,17 +1760,87 @@ void get_fileinfo ( /* No return code */ } #endif } -#endif /* _FS_MINIMIZE <= 1 || _FS_RPATH >= 2*/ +#endif /* _FS_MINIMIZE <= 1 || _FS_RPATH >= 2 */ /*-----------------------------------------------------------------------*/ -/* Pick a segment and create the object name in directory form */ +/* Pattern matching */ +/*-----------------------------------------------------------------------*/ +#if _USE_FIND && _FS_MINIMIZE <= 1 +static +WCHAR get_achar ( /* Get a character and advances ptr 1 or 2 */ + const TCHAR** ptr /* Pointer to pointer to the SBCS/DBCS/Unicode string */ +) +{ + WCHAR chr; + +#if !_LFN_UNICODE + chr = (BYTE)*(*ptr)++; /* Get a byte */ + if (IsLower(chr)) chr -= 0x20; /* To upper ASCII char */ + if (IsDBCS1(chr) && IsDBCS2(**ptr)) /* Get DBC 2nd byte if needed */ + chr = chr << 8 | (BYTE)*(*ptr)++; +#ifdef _EXCVT + if (chr >= 0x80) chr = ExCvt[chr - 0x80]; /* To upper SBCS extended char */ +#endif +#else + chr = ff_wtoupper(*(*ptr)++); /* Get a word and to upper */ +#endif + return chr; +} + + +static +int pattern_matching ( /* 0:mismatched, 1:matched */ + const TCHAR* pat, /* Matching pattern */ + const TCHAR* nam, /* String to be tested */ + int skip, /* Number of pre-skip chars (number of ?s) */ + int inf /* Infinite search (* specified) */ +) +{ + const TCHAR *pp, *np; + WCHAR pc, nc; + int nm, nx; + + + while (skip--) { /* Pre-skip name chars */ + if (!get_achar(&nam)) return 0; /* Branch mismatched if less name chars */ + } + if (!*pat && inf) return 1; /* (short circuit) */ + + do { + pp = pat; np = nam; /* Top of pattern and name to match */ + for (;;) { + if (*pp == '?' || *pp == '*') { /* Wildcard? */ + nm = nx = 0; + do { /* Analyze the wildcard chars */ + if (*pp++ == '?') nm++; else nx = 1; + } while (*pp == '?' || *pp == '*'); + if (pattern_matching(pp, np, nm, nx)) return 1; /* Test new branch (recurs upto number of wildcard blocks in the pattern) */ + nc = *np; break; /* Branch mismatched */ + } + pc = get_achar(&pp); /* Get a pattern char */ + nc = get_achar(&np); /* Get a name char */ + if (pc != nc) break; /* Branch mismatched? */ + if (!pc) return 1; /* Branch matched? (matched at end of both strings) */ + } + get_achar(&nam); /* nam++ */ + } while (inf && nc); /* Retry until end of name if infinite search is specified */ + + return 0; +} +#endif /* _USE_FIND && _FS_MINIMIZE <= 1 */ + + + + +/*-----------------------------------------------------------------------*/ +/* Pick a top segment and create the object name in directory form */ /*-----------------------------------------------------------------------*/ static -FRESULT create_name ( +FRESULT create_name ( /* FR_OK: successful, FR_INVALID_NAME: could not create */ DIR* dp, /* Pointer to the directory object */ const TCHAR** path /* Pointer to pointer to the segment in the path string */ ) @@ -1846,9 +1864,9 @@ FRESULT create_name ( w &= 0xFF; if (IsDBCS1(w)) { /* Check if it is a DBC 1st byte (always false on SBCS cfg) */ b = (BYTE)p[si++]; /* Get 2nd byte */ + w = (w << 8) + b; /* Create a DBC */ if (!IsDBCS2(b)) return FR_INVALID_NAME; /* Reject invalid sequence */ - w = (w << 8) + b; /* Create a DBC */ } w = ff_convert(w, 1); /* Convert ANSI/OEM to Unicode */ if (!w) return FR_INVALID_NAME; /* Reject invalid code */ @@ -1860,22 +1878,21 @@ FRESULT create_name ( *path = &p[si]; /* Return pointer to the next segment */ cf = (w < ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ #if _FS_RPATH - if ((di == 1 && lfn[di-1] == '.') || /* Is this a dot entry? */ - (di == 2 && lfn[di-1] == '.' && lfn[di-2] == '.')) { + if ((di == 1 && lfn[di - 1] == '.') || + (di == 2 && lfn[di - 1] == '.' && lfn[di - 2] == '.')) { /* Is this segment a dot entry? */ lfn[di] = 0; - for (i = 0; i < 11; i++) + for (i = 0; i < 11; i++) /* Create dot name for SFN entry */ dp->fn[i] = (i < di) ? '.' : ' '; dp->fn[i] = cf | NS_DOT; /* This is a dot entry */ return FR_OK; } #endif - while (di) { /* Strip trailing spaces and dots */ - w = lfn[di-1]; + while (di) { /* Snip off trailing spaces and dots if exist */ + w = lfn[di - 1]; if (w != ' ' && w != '.') break; di--; } if (!di) return FR_INVALID_NAME; /* Reject nul string */ - lfn[di] = 0; /* LFN is created */ /* Create SFN in directory form */ @@ -1912,12 +1929,12 @@ FRESULT create_name ( cf |= NS_LFN; /* Force create LFN entry */ } - if (_DF1S && w >= 0x100) { /* Double byte character (always false on SBCS cfg) */ + if (_DF1S && w >= 0x100) { /* Is this DBC? (always false at SBCS cfg) */ if (i >= ni - 1) { cf |= NS_LOSS | NS_LFN; i = ni; continue; } dp->fn[i++] = (BYTE)(w >> 8); - } else { /* Single byte character */ + } else { /* SBC */ if (!w || chk_chr("+,;=[]", w)) { /* Replace illegal characters for SFN */ w = '_'; cf |= NS_LOSS | NS_LFN;/* Lossy conversion */ } else { @@ -1933,7 +1950,7 @@ FRESULT create_name ( dp->fn[i++] = (BYTE)w; } - if (dp->fn[0] == DDE) dp->fn[0] = NDDE; /* If the first character collides with deleted mark, replace it with 0x05 */ + if (dp->fn[0] == DDEM) dp->fn[0] = RDDEM; /* If the first character collides with DDEM, replace it with RDDEM */ if (ni == 8) b <<= 2; if ((b & 0x0C) == 0x0C || (b & 0x03) == 0x03) /* Create LFN entry when there are composite capitals */ @@ -1954,7 +1971,7 @@ FRESULT create_name ( const char *p; /* Create file name in directory form */ - for (p = *path; *p == '/' || *p == '\\'; p++) ; /* Strip duplicated separator */ + for (p = *path; *p == '/' || *p == '\\'; p++) ; /* Skip duplicated separator */ sfn = dp->fn; mem_set(sfn, ' ', 11); si = i = b = 0; ni = 8; @@ -1989,13 +2006,13 @@ FRESULT create_name ( #endif #endif } - if (IsDBCS1(c)) { /* Check if it is a DBC 1st byte (always false on SBCS cfg) */ + if (IsDBCS1(c)) { /* Check if it is a DBC 1st byte (always false at SBCS cfg.) */ d = (BYTE)p[si++]; /* Get 2nd byte */ if (!IsDBCS2(d) || i >= ni - 1) /* Reject invalid DBC */ return FR_INVALID_NAME; sfn[i++] = c; sfn[i++] = d; - } else { /* Single byte code */ + } else { /* SBC */ if (chk_chr("\"*+,:;<=>\?[]|\x7F", c)) /* Reject illegal chrs for SFN */ return FR_INVALID_NAME; if (IsUpper(c)) { /* ASCII large capital? */ @@ -2012,7 +2029,7 @@ FRESULT create_name ( c = (c <= ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ if (!i) return FR_INVALID_NAME; /* Reject nul string */ - if (sfn[0] == DDE) sfn[0] = NDDE; /* When first character collides with DDE, replace it with 0x05 */ + if (sfn[0] == DDEM) sfn[0] = RDDEM; /* When first character collides with DDEM, replace it with RDDEM */ if (ni == 8) b <<= 2; if ((b & 0x03) == 0x01) c |= NS_EXT; /* NT flag (Name extension has only small capital) */ @@ -2101,6 +2118,12 @@ int get_ldnumber ( /* Returns logical drive number (-1:invalid drive) */ const TCHAR *tp, *tt; UINT i; int vol = -1; +#if _STR_VOLUME_ID /* Find string drive id */ + static const char* const str[] = {_VOLUME_STRS}; + const char *sp; + char c; + TCHAR tc; +#endif if (*path) { /* If the pointer is not a null */ @@ -2113,13 +2136,9 @@ int get_ldnumber ( /* Returns logical drive number (-1:invalid drive) */ vol = (int)i; *path = ++tt; } - } else { /* No numeric drive number */ -#if _STR_VOLUME_ID /* Find string drive id */ - static const char* const str[] = {_VOLUME_STRS}; - const char *sp; - char c; - TCHAR tc; - + } +#if _STR_VOLUME_ID + else { /* No numeric drive number, find string drive id */ i = 0; tt++; do { sp = str[i]; tp = *path; @@ -2132,8 +2151,8 @@ int get_ldnumber ( /* Returns logical drive number (-1:invalid drive) */ vol = (int)i; *path = tt; } -#endif } +#endif return vol; } #if _FS_RPATH && _VOLUMES >= 2 @@ -2153,7 +2172,7 @@ int get_ldnumber ( /* Returns logical drive number (-1:invalid drive) */ /*-----------------------------------------------------------------------*/ static -BYTE check_fs ( /* 0:FAT boor sector, 1:Valid boor sector but not FAT, 2:Not a boot sector, 3:Disk error */ +BYTE check_fs ( /* 0:Valid FAT-BS, 1:Valid BS but not FAT, 2:Not a BS, 3:Disk error */ FATFS* fs, /* File system object */ DWORD sect /* Sector# (lba) to check if it is an FAT boot record or not */ ) @@ -2187,12 +2206,13 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */ BYTE wmode /* !=0: Check write protection for write access */ ) { - BYTE fmt; + BYTE fmt, *pt; int vol; DSTATUS stat; - DWORD bsect, fasize, tsect, sysect, nclst, szbfat; + DWORD bsect, fasize, tsect, sysect, nclst, szbfat, br[4]; WORD nrsv; FATFS *fs; + UINT i; /* Get logical drive number from the path name */ @@ -2234,11 +2254,8 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */ bsect = 0; fmt = check_fs(fs, bsect); /* Load sector 0 and check if it is an FAT boot sector as SFD */ if (fmt == 1 || (!fmt && (LD2PT(vol)))) { /* Not an FAT boot sector or forced partition number */ - UINT i; - DWORD br[4]; - for (i = 0; i < 4; i++) { /* Get partition offset */ - BYTE *pt = fs->win+MBR_Table + i * SZ_PTE; + pt = fs->win + MBR_Table + i * SZ_PTE; br[i] = pt[4] ? LD_DWORD(&pt[8]) : 0; } i = LD2PT(vol); /* Partition number: 0:auto, 1-4:forced */ @@ -2253,11 +2270,11 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */ /* An FAT volume is found. Following code initializes the file system object */ - if (LD_WORD(fs->win+BPB_BytsPerSec) != SS(fs)) /* (BPB_BytsPerSec must be equal to the physical sector size) */ + if (LD_WORD(fs->win + BPB_BytsPerSec) != SS(fs)) /* (BPB_BytsPerSec must be equal to the physical sector size) */ return FR_NO_FILESYSTEM; - fasize = LD_WORD(fs->win+BPB_FATSz16); /* Number of sectors per FAT */ - if (!fasize) fasize = LD_DWORD(fs->win+BPB_FATSz32); + fasize = LD_WORD(fs->win + BPB_FATSz16); /* Number of sectors per FAT */ + if (!fasize) fasize = LD_DWORD(fs->win + BPB_FATSz32); fs->fsize = fasize; fs->n_fats = fs->win[BPB_NumFATs]; /* Number of FAT copies */ @@ -2269,18 +2286,18 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */ if (!fs->csize || (fs->csize & (fs->csize - 1))) /* (Must be power of 2) */ return FR_NO_FILESYSTEM; - fs->n_rootdir = LD_WORD(fs->win+BPB_RootEntCnt); /* Number of root directory entries */ - if (fs->n_rootdir % (SS(fs) / SZ_DIR)) /* (Must be sector aligned) */ + fs->n_rootdir = LD_WORD(fs->win + BPB_RootEntCnt); /* Number of root directory entries */ + if (fs->n_rootdir % (SS(fs) / SZ_DIRE)) /* (Must be sector aligned) */ return FR_NO_FILESYSTEM; - tsect = LD_WORD(fs->win+BPB_TotSec16); /* Number of sectors on the volume */ - if (!tsect) tsect = LD_DWORD(fs->win+BPB_TotSec32); + tsect = LD_WORD(fs->win + BPB_TotSec16); /* Number of sectors on the volume */ + if (!tsect) tsect = LD_DWORD(fs->win + BPB_TotSec32); - nrsv = LD_WORD(fs->win+BPB_RsvdSecCnt); /* Number of reserved sectors */ + nrsv = LD_WORD(fs->win + BPB_RsvdSecCnt); /* Number of reserved sectors */ if (!nrsv) return FR_NO_FILESYSTEM; /* (Must not be 0) */ /* Determine the FAT sub type */ - sysect = nrsv + fasize + fs->n_rootdir / (SS(fs) / SZ_DIR); /* RSV+FAT+DIR */ + sysect = nrsv + fasize + fs->n_rootdir / (SS(fs) / SZ_DIRE); /* RSV + FAT + DIR */ if (tsect < sysect) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ nclst = (tsect - sysect) / fs->csize; /* Number of clusters */ if (!nclst) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ @@ -2295,7 +2312,7 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */ fs->database = bsect + sysect; /* Data start sector */ if (fmt == FS_FAT32) { if (fs->n_rootdir) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must be 0) */ - fs->dirbase = LD_DWORD(fs->win+BPB_RootClus); /* Root directory start cluster */ + fs->dirbase = LD_DWORD(fs->win + BPB_RootClus); /* Root directory start cluster */ szbfat = fs->n_fatent * 4; /* (Needed FAT size) */ } else { if (!fs->n_rootdir) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must not be 0) */ @@ -2313,20 +2330,20 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */ /* Get fsinfo if available */ fs->fsi_flag = 0x80; #if (_FS_NOFSINFO & 3) != 3 - if (fmt == FS_FAT32 /* Enable FSINFO only if FAT32 and BPB_FSInfo is 1 */ - && LD_WORD(fs->win+BPB_FSInfo) == 1 + if (fmt == FS_FAT32 /* Enable FSINFO only if FAT32 and BPB_FSInfo == 1 */ + && LD_WORD(fs->win + BPB_FSInfo) == 1 && move_window(fs, bsect + 1) == FR_OK) { fs->fsi_flag = 0; - if (LD_WORD(fs->win+BS_55AA) == 0xAA55 /* Load FSINFO data if available */ - && LD_DWORD(fs->win+FSI_LeadSig) == 0x41615252 - && LD_DWORD(fs->win+FSI_StrucSig) == 0x61417272) + if (LD_WORD(fs->win + BS_55AA) == 0xAA55 /* Load FSINFO data if available */ + && LD_DWORD(fs->win + FSI_LeadSig) == 0x41615252 + && LD_DWORD(fs->win + FSI_StrucSig) == 0x61417272) { #if (_FS_NOFSINFO & 1) == 0 - fs->free_clust = LD_DWORD(fs->win+FSI_Free_Count); + fs->free_clust = LD_DWORD(fs->win + FSI_Free_Count); #endif #if (_FS_NOFSINFO & 2) == 0 - fs->last_clust = LD_DWORD(fs->win+FSI_Nxt_Free); + fs->last_clust = LD_DWORD(fs->win + FSI_Nxt_Free); #endif } } @@ -2359,14 +2376,11 @@ FRESULT validate ( /* FR_OK(0): The object is valid, !=0: Invalid */ FIL *fil = (FIL*)obj; /* Assuming offset of .fs and .id in the FIL/DIR structure is identical */ - if (!fil || !fil->fs || !fil->fs->fs_type || fil->fs->id != fil->id) + if (!fil || !fil->fs || !fil->fs->fs_type || fil->fs->id != fil->id || (disk_status(fil->fs->drv) & STA_NOINIT)) return FR_INVALID_OBJECT; ENTER_FF(fil->fs); /* Lock file system */ - if (disk_status(fil->fs->drv) & STA_NOINIT) - return FR_NOT_READY; - return FR_OK; } @@ -2377,7 +2391,7 @@ FRESULT validate ( /* FR_OK(0): The object is valid, !=0: Invalid */ Public Functions ---------------------------------------------------------------------------*/ +---------------------------------------------------------------------------*/ @@ -2441,7 +2455,10 @@ FRESULT f_open ( FRESULT res; DIR dj; BYTE *dir; - DEF_NAMEBUF; + DEFINE_NAMEBUF; +#if !_FS_READONLY + DWORD dw, cl; +#endif if (!fp) return FR_INVALID_OBJECT; @@ -2470,8 +2487,6 @@ FRESULT f_open ( } /* Create or Open a file */ if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { - DWORD dw, cl; - if (res != FR_OK) { /* No file, create new */ if (res == FR_NO_FILE) /* There is no file to open, create a new entry */ #if _FS_LOCK @@ -2491,12 +2506,13 @@ FRESULT f_open ( } } if (res == FR_OK && (mode & FA_CREATE_ALWAYS)) { /* Truncate it if overwrite mode */ - dw = GET_FATTIME(); /* Created time */ - ST_DWORD(dir+DIR_CrtTime, dw); + dw = GET_FATTIME(); + ST_DWORD(dir + DIR_CrtTime, dw);/* Set created time */ + ST_DWORD(dir + DIR_WrtTime, dw);/* Set modified time */ dir[DIR_Attr] = 0; /* Reset attribute */ - ST_DWORD(dir+DIR_FileSize, 0); /* size = 0 */ - cl = ld_clust(dj.fs, dir); /* Get start cluster */ - st_clust(dir, 0); /* cluster = 0 */ + ST_DWORD(dir + DIR_FileSize, 0);/* Reset file size */ + cl = ld_clust(dj.fs, dir); /* Get cluster chain */ + st_clust(dir, 0); /* Reset cluster */ dj.fs->wflag = 1; if (cl) { /* Remove the cluster chain if exist */ dw = dj.fs->winsect; @@ -2509,7 +2525,7 @@ FRESULT f_open ( } } else { /* Open an existing file */ - if (res == FR_OK) { /* Follow succeeded */ + if (res == FR_OK) { /* Following succeeded */ if (dir[DIR_Attr] & AM_DIR) { /* It is a directory */ res = FR_NO_FILE; } else { @@ -2546,7 +2562,7 @@ FRESULT f_open ( fp->flag = mode; /* File access mode */ fp->err = 0; /* Clear error flag */ fp->sclust = ld_clust(dj.fs, dir); /* File start cluster */ - fp->fsize = LD_DWORD(dir+DIR_FileSize); /* File size */ + fp->fsize = LD_DWORD(dir + DIR_FileSize); /* File size */ fp->fptr = 0; /* File pointer */ fp->dsect = 0; #if _USE_FASTSEEK @@ -2801,10 +2817,9 @@ FRESULT f_sync ( res = validate(fp); /* Check validity of the object */ if (res == FR_OK) { - if (fp->flag & FA__WRITTEN) { /* Has the file been written? */ - /* Write-back dirty buffer */ + if (fp->flag & FA__WRITTEN) { /* Is there any change to the file? */ #if !_FS_TINY - if (fp->flag & FA__DIRTY) { + if (fp->flag & FA__DIRTY) { /* Write-back cached data if needed */ if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK) LEAVE_FF(fp->fs, FR_DISK_ERR); fp->flag &= ~FA__DIRTY; @@ -2815,11 +2830,11 @@ FRESULT f_sync ( if (res == FR_OK) { dir = fp->dir_ptr; dir[DIR_Attr] |= AM_ARC; /* Set archive bit */ - ST_DWORD(dir+DIR_FileSize, fp->fsize); /* Update file size */ + ST_DWORD(dir + DIR_FileSize, fp->fsize); /* Update file size */ st_clust(dir, fp->sclust); /* Update start cluster */ - tm = GET_FATTIME(); /* Update updated time */ - ST_DWORD(dir+DIR_WrtTime, tm); - ST_WORD(dir+DIR_LstAccDate, 0); + tm = GET_FATTIME(); /* Update modified time */ + ST_DWORD(dir + DIR_WrtTime, tm); + ST_WORD(dir + DIR_LstAccDate, 0); fp->flag &= ~FA__WRITTEN; fp->fs->wflag = 1; res = sync_fs(fp->fs); @@ -2901,7 +2916,7 @@ FRESULT f_chdir ( { FRESULT res; DIR dj; - DEF_NAMEBUF; + DEFINE_NAMEBUF; /* Get logical drive number */ @@ -2939,7 +2954,7 @@ FRESULT f_getcwd ( DWORD ccl; TCHAR *tp; FILINFO fno; - DEF_NAMEBUF; + DEFINE_NAMEBUF; *buff = 0; @@ -3017,6 +3032,10 @@ FRESULT f_lseek ( ) { FRESULT res; + DWORD clst, bcs, nsect, ifptr; +#if _USE_FASTSEEK + DWORD cl, pcl, ncl, tcl, dsc, tlen, ulen, *tbl; +#endif res = validate(fp); /* Check validity of the object */ @@ -3026,8 +3045,6 @@ FRESULT f_lseek ( #if _USE_FASTSEEK if (fp->cltbl) { /* Fast seek */ - DWORD cl, pcl, ncl, tcl, dsc, tlen, ulen, *tbl; - if (ofs == CREATE_LINKMAP) { /* Create CLMT */ tbl = fp->cltbl; tlen = *tbl++; ulen = 2; /* Given table size and required table size */ @@ -3083,8 +3100,6 @@ FRESULT f_lseek ( /* Normal Seek */ { - DWORD clst, bcs, nsect, ifptr; - if (ofs > fp->fsize /* In read-only mode, clip offset with the file size */ #if !_FS_READONLY && !(fp->flag & FA_WRITE) @@ -3176,7 +3191,7 @@ FRESULT f_opendir ( { FRESULT res; FATFS* fs; - DEF_NAMEBUF; + DEFINE_NAMEBUF; if (!dp) return FR_INVALID_OBJECT; @@ -3263,7 +3278,7 @@ FRESULT f_readdir ( ) { FRESULT res; - DEF_NAMEBUF; + DEFINE_NAMEBUF; res = validate(dp); /* Check validity of the object */ @@ -3294,6 +3309,58 @@ FRESULT f_readdir ( +#if _USE_FIND +/*-----------------------------------------------------------------------*/ +/* Find next file */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_findnext ( + DIR* dp, /* Pointer to the open directory object */ + FILINFO* fno /* Pointer to the file information structure */ +) +{ + FRESULT res; + + + for (;;) { + res = f_readdir(dp, fno); /* Get a directory item */ + if (res != FR_OK || !fno || !fno->fname[0]) break; /* Terminate if any error or end of directory */ +#if _USE_LFN + if (fno->lfname && pattern_matching(dp->pat, fno->lfname, 0, 0)) break; /* Test for LFN if exist */ +#endif + if (pattern_matching(dp->pat, fno->fname, 0, 0)) break; /* Test for SFN */ + } + return res; + +} + + + +/*-----------------------------------------------------------------------*/ +/* Find first file */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_findfirst ( + DIR* dp, /* Pointer to the blank directory object */ + FILINFO* fno, /* Pointer to the file information structure */ + const TCHAR* path, /* Pointer to the directory to open */ + const TCHAR* pattern /* Pointer to the matching pattern */ +) +{ + FRESULT res; + + + dp->pat = pattern; /* Save pointer to pattern string */ + res = f_opendir(dp, path); /* Open the target directory */ + if (res == FR_OK) + res = f_findnext(dp, fno); /* Find the first item */ + return res; +} + +#endif /* _USE_FIND */ + + + #if _FS_MINIMIZE == 0 /*-----------------------------------------------------------------------*/ /* Get File Status */ @@ -3306,7 +3373,7 @@ FRESULT f_stat ( { FRESULT res; DIR dj; - DEF_NAMEBUF; + DEFINE_NAMEBUF; /* Get logical drive number */ @@ -3342,7 +3409,7 @@ FRESULT f_getfree ( { FRESULT res; FATFS *fs; - DWORD n, clst, sect, stat; + DWORD nfree, clst, sect, stat; UINT i; BYTE fat, *p; @@ -3357,18 +3424,17 @@ FRESULT f_getfree ( } else { /* Get number of free clusters */ fat = fs->fs_type; - n = 0; - if (fat == FS_FAT12) { + nfree = 0; + if (fat == FS_FAT12) { /* Sector unalighed entries: Search FAT via regular routine. */ clst = 2; do { stat = get_fat(fs, clst); if (stat == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } if (stat == 1) { res = FR_INT_ERR; break; } - if (stat == 0) n++; + if (stat == 0) nfree++; } while (++clst < fs->n_fatent); - } else { - clst = fs->n_fatent; - sect = fs->fatbase; + } else { /* Sector alighed entries: Accelerate the FAT search. */ + clst = fs->n_fatent; sect = fs->fatbase; i = 0; p = 0; do { if (!i) { @@ -3378,17 +3444,17 @@ FRESULT f_getfree ( i = SS(fs); } if (fat == FS_FAT16) { - if (LD_WORD(p) == 0) n++; + if (LD_WORD(p) == 0) nfree++; p += 2; i -= 2; } else { - if ((LD_DWORD(p) & 0x0FFFFFFF) == 0) n++; + if ((LD_DWORD(p) & 0x0FFFFFFF) == 0) nfree++; p += 4; i -= 4; } } while (--clst); } - fs->free_clust = n; - fs->fsi_flag |= 1; - *nclst = n; + fs->free_clust = nfree; /* free_clust is valid */ + fs->fsi_flag |= 1; /* FSInfo is to be updated */ + *nclst = nfree; /* Return the free clusters */ } } LEAVE_FF(fs, res); @@ -3465,7 +3531,7 @@ FRESULT f_unlink ( DIR dj, sdj; BYTE *dir; DWORD dclst = 0; - DEF_NAMEBUF; + DEFINE_NAMEBUF; /* Get logical drive number */ @@ -3486,22 +3552,23 @@ FRESULT f_unlink ( if (dir[DIR_Attr] & AM_RDO) res = FR_DENIED; /* Cannot remove R/O object */ } - if (res == FR_OK && (dir[DIR_Attr] & AM_DIR)) { /* Is it a sub-dir? */ + if (res == FR_OK) { dclst = ld_clust(dj.fs, dir); - if (!dclst) { - res = FR_INT_ERR; - } else { /* Make sure the sub-directory is empty */ - mem_cpy(&sdj, &dj, sizeof (DIR)); - sdj.sclust = dclst; - res = dir_sdi(&sdj, 2); /* Exclude dot entries */ - if (res == FR_OK) { - res = dir_read(&sdj, 0); /* Read an item */ - if (res == FR_OK /* Not empty directory */ + if (dclst && (dir[DIR_Attr] & AM_DIR)) { /* Is it a sub-directory ? */ #if _FS_RPATH - || dclst == dj.fs->cdir /* or current directory */ + if (dclst == dj.fs->cdir) { /* Is it the current directory? */ + res = FR_DENIED; + } else #endif - ) res = FR_DENIED; - if (res == FR_NO_FILE) res = FR_OK; /* It is empty */ + { + mem_cpy(&sdj, &dj, sizeof (DIR)); /* Open the sub-directory */ + sdj.sclust = dclst; + res = dir_sdi(&sdj, 2); + if (res == FR_OK) { + res = dir_read(&sdj, 0); /* Read an item (excluding dot entries) */ + if (res == FR_OK) res = FR_DENIED; /* Not empty? (cannot remove) */ + if (res == FR_NO_FILE) res = FR_OK; /* Empty? (can remove) */ + } } } } @@ -3533,7 +3600,7 @@ FRESULT f_mkdir ( DIR dj; BYTE *dir, n; DWORD dsc, dcl, pcl, tm = GET_FATTIME(); - DEF_NAMEBUF; + DEFINE_NAMEBUF; /* Get logical drive number */ @@ -3556,16 +3623,16 @@ FRESULT f_mkdir ( dsc = clust2sect(dj.fs, dcl); dir = dj.fs->win; mem_set(dir, 0, SS(dj.fs)); - mem_set(dir+DIR_Name, ' ', 11); /* Create "." entry */ + mem_set(dir + DIR_Name, ' ', 11); /* Create "." entry */ dir[DIR_Name] = '.'; dir[DIR_Attr] = AM_DIR; - ST_DWORD(dir+DIR_WrtTime, tm); + ST_DWORD(dir + DIR_WrtTime, tm); st_clust(dir, dcl); - mem_cpy(dir+SZ_DIR, dir, SZ_DIR); /* Create ".." entry */ - dir[SZ_DIR+1] = '.'; pcl = dj.sclust; + mem_cpy(dir + SZ_DIRE, dir, SZ_DIRE); /* Create ".." entry */ + dir[SZ_DIRE + 1] = '.'; pcl = dj.sclust; if (dj.fs->fs_type == FS_FAT32 && pcl == dj.fs->dirbase) pcl = 0; - st_clust(dir+SZ_DIR, pcl); + st_clust(dir + SZ_DIRE, pcl); for (n = dj.fs->csize; n; n--) { /* Write dot entries and clear following sectors */ dj.fs->winsect = dsc++; dj.fs->wflag = 1; @@ -3580,7 +3647,7 @@ FRESULT f_mkdir ( } else { dir = dj.dir; dir[DIR_Attr] = AM_DIR; /* Attribute */ - ST_DWORD(dir+DIR_WrtTime, tm); /* Created time */ + ST_DWORD(dir + DIR_WrtTime, tm); /* Created time */ st_clust(dir, dcl); /* Table start cluster */ dj.fs->wflag = 1; res = sync_fs(dj.fs); @@ -3601,18 +3668,17 @@ FRESULT f_mkdir ( FRESULT f_chmod ( const TCHAR* path, /* Pointer to the file path */ - BYTE value, /* Attribute bits */ + BYTE attr, /* Attribute bits */ BYTE mask /* Attribute mask to change */ ) { FRESULT res; DIR dj; BYTE *dir; - DEF_NAMEBUF; + DEFINE_NAMEBUF; - /* Get logical drive number */ - res = find_volume(&dj.fs, &path, 1); + res = find_volume(&dj.fs, &path, 1); /* Get logical drive number */ if (res == FR_OK) { INIT_BUF(dj); res = follow_path(&dj, path); /* Follow the file path */ @@ -3625,7 +3691,7 @@ FRESULT f_chmod ( res = FR_INVALID_NAME; } else { /* File or sub directory */ mask &= AM_RDO|AM_HID|AM_SYS|AM_ARC; /* Valid attribute mask */ - dir[DIR_Attr] = (value & mask) | (dir[DIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + dir[DIR_Attr] = (attr & mask) | (dir[DIR_Attr] & (BYTE)~mask); /* Apply attribute change */ dj.fs->wflag = 1; res = sync_fs(dj.fs); } @@ -3651,7 +3717,7 @@ FRESULT f_rename ( DIR djo, djn; BYTE buf[21], *dir; DWORD dw; - DEF_NAMEBUF; + DEFINE_NAMEBUF; /* Get logical drive number of the source object */ @@ -3669,7 +3735,7 @@ FRESULT f_rename ( if (!djo.dir) { /* Is root dir? */ res = FR_NO_FILE; } else { - mem_cpy(buf, djo.dir+DIR_Attr, 21); /* Save the object information except name */ + mem_cpy(buf, djo.dir + DIR_Attr, 21); /* Save information about object except name */ mem_cpy(&djn, &djo, sizeof (DIR)); /* Duplicate the directory object */ if (get_ldnumber(&path_new) >= 0) /* Snip drive number off and ignore it */ res = follow_path(&djn, path_new); /* and make sure if new object name is not conflicting */ @@ -3677,20 +3743,20 @@ FRESULT f_rename ( res = FR_INVALID_DRIVE; if (res == FR_OK) res = FR_EXIST; /* The new object name is already existing */ if (res == FR_NO_FILE) { /* It is a valid path and no name collision */ -/* Start of critical section that any interruption can cause a cross-link */ res = dir_register(&djn); /* Register the new entry */ if (res == FR_OK) { - dir = djn.dir; /* Copy object information except name */ - mem_cpy(dir+13, buf+2, 19); +/* Start of critical section where any interruption can cause a cross-link */ + dir = djn.dir; /* Copy information about object except name */ + mem_cpy(dir + 13, buf + 2, 19); dir[DIR_Attr] = buf[0] | AM_ARC; djo.fs->wflag = 1; - if ((dir[DIR_Attr] & AM_DIR) && djo.sclust != djn.sclust) { /* Update .. entry in the directory if needed */ + if ((dir[DIR_Attr] & AM_DIR) && djo.sclust != djn.sclust) { /* Update .. entry in the sub-directory if needed */ dw = clust2sect(djo.fs, ld_clust(djo.fs, dir)); if (!dw) { res = FR_INT_ERR; } else { res = move_window(djo.fs, dw); - dir = djo.fs->win+SZ_DIR; /* .. entry */ + dir = djo.fs->win + SZ_DIRE * 1; /* Ptr to .. entry */ if (res == FR_OK && dir[1] == '.') { st_clust(dir, djn.sclust); djo.fs->wflag = 1; @@ -3702,8 +3768,8 @@ FRESULT f_rename ( if (res == FR_OK) res = sync_fs(djo.fs); } - } /* End of critical section */ + } } } } @@ -3728,7 +3794,7 @@ FRESULT f_utime ( FRESULT res; DIR dj; BYTE *dir; - DEF_NAMEBUF; + DEFINE_NAMEBUF; /* Get logical drive number */ @@ -3744,8 +3810,8 @@ FRESULT f_utime ( if (!dir) { /* Root directory */ res = FR_INVALID_NAME; } else { /* File or sub-directory */ - ST_WORD(dir+DIR_WrtTime, fno->ftime); - ST_WORD(dir+DIR_WrtDate, fno->fdate); + ST_WORD(dir + DIR_WrtTime, fno->ftime); + ST_WORD(dir + DIR_WrtDate, fno->fdate); dj.fs->wflag = 1; res = sync_fs(dj.fs); } @@ -3762,6 +3828,7 @@ FRESULT f_utime ( + #if _USE_LABEL /*-----------------------------------------------------------------------*/ /* Get volume label */ @@ -3776,6 +3843,9 @@ FRESULT f_getlabel ( FRESULT res; DIR dj; UINT i, j; +#if _USE_LFN && _LFN_UNICODE + WCHAR w; +#endif /* Get logical drive number */ @@ -3789,7 +3859,6 @@ FRESULT f_getlabel ( res = dir_read(&dj, 1); /* Get an entry with AM_VOL */ if (res == FR_OK) { /* A volume label is exist */ #if _USE_LFN && _LFN_UNICODE - WCHAR w; i = j = 0; do { w = (i < 11) ? dj.dir[i++] : ' '; @@ -3851,7 +3920,7 @@ FRESULT f_setlabel ( /* Create a volume label in directory form */ vn[0] = 0; for (sl = 0; label[sl]; sl++) ; /* Get name length */ - for ( ; sl && label[sl-1] == ' '; sl--) ; /* Remove trailing spaces */ + for ( ; sl && label[sl - 1] == ' '; sl--) ; /* Remove trailing spaces */ if (sl) { /* Create volume label in directory form */ i = j = 0; do { @@ -3877,7 +3946,8 @@ FRESULT f_setlabel ( if (w >= 0x100) vn[j++] = (BYTE)(w >> 8); vn[j++] = (BYTE)w; } while (i < sl); - while (j < 11) vn[j++] = ' '; + while (j < 11) vn[j++] = ' '; /* Fill remaining name field */ + if (vn[0] == DDEM) LEAVE_FF(dj.fs, FR_INVALID_NAME); /* Reject illegal name (heading DDEM) */ } /* Set volume label */ @@ -3889,9 +3959,9 @@ FRESULT f_setlabel ( if (vn[0]) { mem_cpy(dj.dir, vn, 11); /* Change the volume label name */ tm = GET_FATTIME(); - ST_DWORD(dj.dir+DIR_WrtTime, tm); + ST_DWORD(dj.dir + DIR_WrtTime, tm); } else { - dj.dir[0] = DDE; /* Remove the volume label */ + dj.dir[0] = DDEM; /* Remove the volume label */ } dj.fs->wflag = 1; res = sync_fs(dj.fs); @@ -3901,11 +3971,11 @@ FRESULT f_setlabel ( if (vn[0]) { /* Create volume label as new */ res = dir_alloc(&dj, 1); /* Allocate an entry for volume label */ if (res == FR_OK) { - mem_set(dj.dir, 0, SZ_DIR); /* Set volume label */ + mem_set(dj.dir, 0, SZ_DIRE); /* Set volume label */ mem_cpy(dj.dir, vn, 11); dj.dir[DIR_Attr] = AM_VOL; tm = GET_FATTIME(); - ST_DWORD(dj.dir+DIR_WrtTime, tm); + ST_DWORD(dj.dir + DIR_WrtTime, tm); dj.fs->wflag = 1; res = sync_fs(dj.fs); } @@ -3984,7 +4054,7 @@ FRESULT f_forward ( #if _USE_MKFS && !_FS_READONLY /*-----------------------------------------------------------------------*/ -/* Create File System on the Drive */ +/* Create file system on the logical drive */ /*-----------------------------------------------------------------------*/ #define N_ROOTDIR 512 /* Number of root directory entries for FAT12/16 */ #define N_FATS 1 /* Number of FATs (1 or 2) */ @@ -4006,6 +4076,9 @@ FRESULT f_mkfs ( DWORD n_vol, n_rsv, n_fat, n_dir; /* Size */ FATFS *fs; DSTATUS stat; +#if _USE_TRIM + DWORD eb[2]; +#endif /* Check mounted drive and clear work area */ @@ -4029,11 +4102,11 @@ FRESULT f_mkfs ( if (_MULTI_PARTITION && part) { /* Get partition information from partition table in the MBR */ if (disk_read(pdrv, fs->win, 0, 1) != RES_OK) return FR_DISK_ERR; - if (LD_WORD(fs->win+BS_55AA) != 0xAA55) return FR_MKFS_ABORTED; + if (LD_WORD(fs->win + BS_55AA) != 0xAA55) return FR_MKFS_ABORTED; tbl = &fs->win[MBR_Table + (part - 1) * SZ_PTE]; if (!tbl[4]) return FR_MKFS_ABORTED; /* No partition? */ - b_vol = LD_DWORD(tbl+8); /* Volume start sector */ - n_vol = LD_DWORD(tbl+12); /* Volume size */ + b_vol = LD_DWORD(tbl + 8); /* Volume start sector */ + n_vol = LD_DWORD(tbl + 12); /* Volume size */ } else { /* Create a partition in this function */ if (disk_ioctl(pdrv, GET_SECTOR_COUNT, &n_vol) != RES_OK || n_vol < 128) @@ -4067,7 +4140,7 @@ FRESULT f_mkfs ( n_fat = (fmt == FS_FAT12) ? (n_clst * 3 + 1) / 2 + 3 : (n_clst * 2) + 4; n_fat = (n_fat + SS(fs) - 1) / SS(fs); n_rsv = 1; - n_dir = (DWORD)N_ROOTDIR * SZ_DIR / SS(fs); + n_dir = (DWORD)N_ROOTDIR * SZ_DIRE / SS(fs); } b_fat = b_vol + n_rsv; /* FAT area start sector */ b_dir = b_fat + n_fat * N_FATS; /* Directory area start sector */ @@ -4114,7 +4187,7 @@ FRESULT f_mkfs ( md = 0xF0; } else { /* Create partition table (FDISK) */ mem_set(fs->win, 0, SS(fs)); - tbl = fs->win+MBR_Table; /* Create partition table for single partition in the drive */ + tbl = fs->win + MBR_Table; /* Create partition table for single partition in the drive */ tbl[1] = 1; /* Partition start head */ tbl[2] = 1; /* Partition start sector */ tbl[3] = 0; /* Partition start cylinder */ @@ -4123,9 +4196,9 @@ FRESULT f_mkfs ( n = (b_vol + n_vol) / 63 / 255; tbl[6] = (BYTE)(n >> 2 | 63); /* Partition end sector */ tbl[7] = (BYTE)n; /* End cylinder */ - ST_DWORD(tbl+8, 63); /* Partition start in LBA */ - ST_DWORD(tbl+12, n_vol); /* Partition size in LBA */ - ST_WORD(fs->win+BS_55AA, 0xAA55); /* MBR signature */ + ST_DWORD(tbl + 8, 63); /* Partition start in LBA */ + ST_DWORD(tbl + 12, n_vol); /* Partition size in LBA */ + ST_WORD(fs->win + BS_55AA, 0xAA55); /* MBR signature */ if (disk_write(pdrv, fs->win, 0, 1) != RES_OK) /* Write it to the MBR */ return FR_DISK_ERR; md = 0xF8; @@ -4137,42 +4210,42 @@ FRESULT f_mkfs ( mem_set(tbl, 0, SS(fs)); mem_cpy(tbl, "\xEB\xFE\x90" "MSDOS5.0", 11);/* Boot jump code, OEM name */ i = SS(fs); /* Sector size */ - ST_WORD(tbl+BPB_BytsPerSec, i); + ST_WORD(tbl + BPB_BytsPerSec, i); tbl[BPB_SecPerClus] = (BYTE)au; /* Sectors per cluster */ - ST_WORD(tbl+BPB_RsvdSecCnt, n_rsv); /* Reserved sectors */ + ST_WORD(tbl + BPB_RsvdSecCnt, n_rsv); /* Reserved sectors */ tbl[BPB_NumFATs] = N_FATS; /* Number of FATs */ i = (fmt == FS_FAT32) ? 0 : N_ROOTDIR; /* Number of root directory entries */ - ST_WORD(tbl+BPB_RootEntCnt, i); + ST_WORD(tbl + BPB_RootEntCnt, i); if (n_vol < 0x10000) { /* Number of total sectors */ - ST_WORD(tbl+BPB_TotSec16, n_vol); + ST_WORD(tbl + BPB_TotSec16, n_vol); } else { - ST_DWORD(tbl+BPB_TotSec32, n_vol); + ST_DWORD(tbl + BPB_TotSec32, n_vol); } tbl[BPB_Media] = md; /* Media descriptor */ - ST_WORD(tbl+BPB_SecPerTrk, 63); /* Number of sectors per track */ - ST_WORD(tbl+BPB_NumHeads, 255); /* Number of heads */ - ST_DWORD(tbl+BPB_HiddSec, b_vol); /* Hidden sectors */ + ST_WORD(tbl + BPB_SecPerTrk, 63); /* Number of sectors per track */ + ST_WORD(tbl + BPB_NumHeads, 255); /* Number of heads */ + ST_DWORD(tbl + BPB_HiddSec, b_vol); /* Hidden sectors */ n = GET_FATTIME(); /* Use current time as VSN */ if (fmt == FS_FAT32) { - ST_DWORD(tbl+BS_VolID32, n); /* VSN */ - ST_DWORD(tbl+BPB_FATSz32, n_fat); /* Number of sectors per FAT */ - ST_DWORD(tbl+BPB_RootClus, 2); /* Root directory start cluster (2) */ - ST_WORD(tbl+BPB_FSInfo, 1); /* FSINFO record offset (VBR+1) */ - ST_WORD(tbl+BPB_BkBootSec, 6); /* Backup boot record offset (VBR+6) */ + ST_DWORD(tbl + BS_VolID32, n); /* VSN */ + ST_DWORD(tbl + BPB_FATSz32, n_fat); /* Number of sectors per FAT */ + ST_DWORD(tbl + BPB_RootClus, 2); /* Root directory start cluster (2) */ + ST_WORD(tbl + BPB_FSInfo, 1); /* FSINFO record offset (VBR + 1) */ + ST_WORD(tbl + BPB_BkBootSec, 6); /* Backup boot record offset (VBR + 6) */ tbl[BS_DrvNum32] = 0x80; /* Drive number */ tbl[BS_BootSig32] = 0x29; /* Extended boot signature */ - mem_cpy(tbl+BS_VolLab32, "NO NAME " "FAT32 ", 19); /* Volume label, FAT signature */ + mem_cpy(tbl + BS_VolLab32, "NO NAME " "FAT32 ", 19); /* Volume label, FAT signature */ } else { - ST_DWORD(tbl+BS_VolID, n); /* VSN */ - ST_WORD(tbl+BPB_FATSz16, n_fat); /* Number of sectors per FAT */ + ST_DWORD(tbl + BS_VolID, n); /* VSN */ + ST_WORD(tbl + BPB_FATSz16, n_fat); /* Number of sectors per FAT */ tbl[BS_DrvNum] = 0x80; /* Drive number */ tbl[BS_BootSig] = 0x29; /* Extended boot signature */ - mem_cpy(tbl+BS_VolLab, "NO NAME " "FAT ", 19); /* Volume label, FAT signature */ + mem_cpy(tbl + BS_VolLab, "NO NAME " "FAT ", 19); /* Volume label, FAT signature */ } - ST_WORD(tbl+BS_55AA, 0xAA55); /* Signature (Offset is fixed here regardless of sector size) */ + ST_WORD(tbl + BS_55AA, 0xAA55); /* Signature (Offset is fixed here regardless of sector size) */ if (disk_write(pdrv, tbl, b_vol, 1) != RES_OK) /* Write it to the VBR sector */ return FR_DISK_ERR; - if (fmt == FS_FAT32) /* Write backup VBR if needed (VBR+6) */ + if (fmt == FS_FAT32) /* Write it to the backup VBR if needed (VBR + 6) */ disk_write(pdrv, tbl, b_vol + 6, 1); /* Initialize FAT area */ @@ -4182,12 +4255,12 @@ FRESULT f_mkfs ( n = md; /* Media descriptor byte */ if (fmt != FS_FAT32) { n |= (fmt == FS_FAT12) ? 0x00FFFF00 : 0xFFFFFF00; - ST_DWORD(tbl+0, n); /* Reserve cluster #0-1 (FAT12/16) */ + ST_DWORD(tbl + 0, n); /* Reserve cluster #0-1 (FAT12/16) */ } else { n |= 0xFFFFFF00; - ST_DWORD(tbl+0, n); /* Reserve cluster #0-1 (FAT32) */ - ST_DWORD(tbl+4, 0xFFFFFFFF); - ST_DWORD(tbl+8, 0x0FFFFFFF); /* Reserve cluster #2 for root directory */ + ST_DWORD(tbl + 0, n); /* Reserve cluster #0-1 (FAT32) */ + ST_DWORD(tbl + 4, 0xFFFFFFFF); + ST_DWORD(tbl + 8, 0x0FFFFFFF); /* Reserve cluster #2 for root directory */ } if (disk_write(pdrv, tbl, wsect++, 1) != RES_OK) return FR_DISK_ERR; @@ -4207,8 +4280,6 @@ FRESULT f_mkfs ( #if _USE_TRIM /* Erase data area if needed */ { - DWORD eb[2]; - eb[0] = wsect; eb[1] = wsect + (n_clst - ((fmt == FS_FAT32) ? 1 : 0)) * au - 1; disk_ioctl(pdrv, CTRL_TRIM, eb); } @@ -4216,13 +4287,13 @@ FRESULT f_mkfs ( /* Create FSINFO if needed */ if (fmt == FS_FAT32) { - ST_DWORD(tbl+FSI_LeadSig, 0x41615252); - ST_DWORD(tbl+FSI_StrucSig, 0x61417272); - ST_DWORD(tbl+FSI_Free_Count, n_clst - 1); /* Number of free clusters */ - ST_DWORD(tbl+FSI_Nxt_Free, 2); /* Last allocated cluster# */ - ST_WORD(tbl+BS_55AA, 0xAA55); - disk_write(pdrv, tbl, b_vol + 1, 1); /* Write original (VBR+1) */ - disk_write(pdrv, tbl, b_vol + 7, 1); /* Write backup (VBR+7) */ + ST_DWORD(tbl + FSI_LeadSig, 0x41615252); + ST_DWORD(tbl + FSI_StrucSig, 0x61417272); + ST_DWORD(tbl + FSI_Free_Count, n_clst - 1); /* Number of free clusters */ + ST_DWORD(tbl + FSI_Nxt_Free, 2); /* Last allocated cluster# */ + ST_WORD(tbl + BS_55AA, 0xAA55); + disk_write(pdrv, tbl, b_vol + 1, 1); /* Write original (VBR + 1) */ + disk_write(pdrv, tbl, b_vol + 7, 1); /* Write backup (VBR + 7) */ } return (disk_ioctl(pdrv, CTRL_SYNC, 0) == RES_OK) ? FR_OK : FR_DISK_ERR; @@ -4232,7 +4303,7 @@ FRESULT f_mkfs ( #if _MULTI_PARTITION /*-----------------------------------------------------------------------*/ -/* Divide Physical Drive */ +/* Create partition table on the physical drive */ /*-----------------------------------------------------------------------*/ FRESULT f_fdisk ( @@ -4380,6 +4451,7 @@ TCHAR* f_gets ( + #if !_FS_READONLY #include /*-----------------------------------------------------------------------*/ diff --git a/firmware/chibios-portapack/ext/fatfs/src/ff.h b/firmware/chibios-portapack/ext/fatfs/src/ff.h index 5eaad5fe..917908d2 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/ff.h +++ b/firmware/chibios-portapack/ext/fatfs/src/ff.h @@ -1,21 +1,23 @@ /*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module include file R0.10c (C)ChaN, 2014 +/ FatFs - FAT file system module include R0.11a (C)ChaN, 2015 /----------------------------------------------------------------------------/ -/ FatFs module is a generic FAT file system module for small embedded systems. -/ This is a free software that opened for education, research and commercial -/ developments under license policy of following terms. +/ FatFs module is a free software that opened under license policy of +/ following conditions. / -/ Copyright (C) 2014, ChaN, all right reserved. +/ Copyright (C) 2015, ChaN, all right reserved. / -/ * The FatFs module is a free software and there is NO WARRANTY. -/ * No restriction on use. You can use, modify and redistribute it for -/ personal, non-profit or commercial product UNDER YOUR RESPONSIBILITY. -/ * Redistributions of source code must retain the above copyright notice. +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. / -/----------------------------------------------------------------------------*/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/---------------------------------------------------------------------------*/ + #ifndef _FATFS -#define _FATFS 80376 /* Revision ID */ +#define _FATFS 64180 /* Revision ID */ #ifdef __cplusplus extern "C" { @@ -154,11 +156,14 @@ typedef struct { WCHAR* lfn; /* Pointer to the LFN working buffer */ WORD lfn_idx; /* Last matched LFN index number (0xFFFF:No LFN) */ #endif +#if _USE_FIND + const TCHAR* pat; /* Pointer to the name matching pattern */ +#endif } DIR; -/* File status structure (FILINFO) */ +/* File information structure (FILINFO) */ typedef struct { DWORD fsize; /* File size */ @@ -195,7 +200,7 @@ typedef enum { FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */ FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */ FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */ - FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > _FS_SHARE */ + FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > _FS_LOCK */ FR_INVALID_PARAMETER /* (19) Given parameter is invalid */ } FRESULT; @@ -215,11 +220,13 @@ FRESULT f_sync (FIL* fp); /* Flush cached data of a writing file */ FRESULT f_opendir (DIR* dp, const TCHAR* path); /* Open a directory */ FRESULT f_closedir (DIR* dp); /* Close an open directory */ FRESULT f_readdir (DIR* dp, FILINFO* fno); /* Read a directory item */ +FRESULT f_findfirst (DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern); /* Find first file */ +FRESULT f_findnext (DIR* dp, FILINFO* fno); /* Find next file */ FRESULT f_mkdir (const TCHAR* path); /* Create a sub directory */ FRESULT f_unlink (const TCHAR* path); /* Delete an existing file or directory */ FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new); /* Rename/Move a file or directory */ FRESULT f_stat (const TCHAR* path, FILINFO* fno); /* Get file status */ -FRESULT f_chmod (const TCHAR* path, BYTE value, BYTE mask); /* Change attribute of the file/dir */ +FRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask); /* Change attribute of the file/dir */ FRESULT f_utime (const TCHAR* path, const FILINFO* fno); /* Change times-tamp of the file/dir */ FRESULT f_chdir (const TCHAR* path); /* Change current directory */ FRESULT f_chdrive (const TCHAR* path); /* Change current drive */ @@ -239,6 +246,8 @@ TCHAR* f_gets (TCHAR* buff, int len, FIL* fp); /* Get a string from the fil #define f_error(fp) ((fp)->err) #define f_tell(fp) ((fp)->fptr) #define f_size(fp) ((fp)->fsize) +#define f_rewind(fp) f_lseek((fp), 0) +#define f_rewinddir(dp) f_readdir((dp), 0) #ifndef EOF #define EOF (-1) diff --git a/firmware/chibios-portapack/ext/fatfs/src/ffconf_template.h b/firmware/chibios-portapack/ext/fatfs/src/ffconf.h similarity index 77% rename from firmware/chibios-portapack/ext/fatfs/src/ffconf_template.h rename to firmware/chibios-portapack/ext/fatfs/src/ffconf.h index f968d7e0..bbe74e43 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/ffconf_template.h +++ b/firmware/chibios-portapack/ext/fatfs/src/ffconf.h @@ -1,30 +1,22 @@ /*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module configuration file R0.10c (C)ChaN, 2014 +/ FatFs - FAT file system module configuration file R0.11a (C)ChaN, 2015 /---------------------------------------------------------------------------*/ -#define _FFCONF 80376 /* Revision ID */ +#define _FFCONF 64180 /* Revision ID */ /*---------------------------------------------------------------------------/ -/ Functions and Buffer Configurations +/ Function Configurations /---------------------------------------------------------------------------*/ -#define _FS_TINY 0 -/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) -/ At the tiny configuration, size of the file object (FIL) is reduced _MAX_SS -/ bytes. Instead of private sector buffer eliminated from the file object, -/ common sector buffer in the file system object (FATFS) is used for the file -/ data transfer. */ - - #define _FS_READONLY 0 /* This option switches read-only configuration. (0:Read/Write or 1:Read-only) -/ Read-only configuration removes basic writing API functions, f_write(), -/ f_sync(), f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), -/ f_getfree() and optional writing functions as well. */ +/ Read-only configuration removes writing API functions, f_write(), f_sync(), +/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() +/ and optional writing functions as well. */ #define _FS_MINIMIZE 0 -/* This option defines minimization level to remove some API functions. +/* This option defines minimization level to remove some basic API functions. / / 0: All basic functions are enabled. / 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_chmod(), f_utime(), @@ -42,9 +34,13 @@ / 2: Enable with LF-CRLF conversion. */ +#define _USE_FIND 0 +/* This option switches filtered directory read feature and related functions, +/ f_findfirst() and f_findnext(). (0:Disable or 1:Enable) */ + + #define _USE_MKFS 0 -/* This option switches f_mkfs() function. (0:Disable or 1:Enable) -/ To enable it, also _FS_READONLY need to be set to 0. */ +/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ #define _USE_FASTSEEK 0 @@ -57,8 +53,8 @@ #define _USE_FORWARD 0 -/* This option switches f_forward() function. (0:Disable or 1:Enable) */ -/* To enable it, also _FS_TINY need to be set to 1. */ +/* This option switches f_forward() function. (0:Disable or 1:Enable) +/ To enable it, also _FS_TINY need to be set to 1. */ /*---------------------------------------------------------------------------/ @@ -69,32 +65,29 @@ /* This option specifies the OEM code page to be used on the target system. / Incorrect setting of the code page can cause a file open failure. / -/ 932 - Japanese Shift_JIS (DBCS, OEM, Windows) -/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) -/ 949 - Korean (DBCS, OEM, Windows) -/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) -/ 1250 - Central Europe (Windows) -/ 1251 - Cyrillic (Windows) -/ 1252 - Latin 1 (Windows) -/ 1253 - Greek (Windows) -/ 1254 - Turkish (Windows) -/ 1255 - Hebrew (Windows) -/ 1256 - Arabic (Windows) -/ 1257 - Baltic (Windows) -/ 1258 - Vietnam (OEM, Windows) -/ 437 - U.S. (OEM) -/ 720 - Arabic (OEM) -/ 737 - Greek (OEM) -/ 775 - Baltic (OEM) -/ 850 - Multilingual Latin 1 (OEM) -/ 858 - Multilingual Latin 1 + Euro (OEM) -/ 852 - Latin 2 (OEM) -/ 855 - Cyrillic (OEM) -/ 866 - Russian (OEM) -/ 857 - Turkish (OEM) -/ 862 - Hebrew (OEM) -/ 874 - Thai (OEM, Windows) -/ 1 - ASCII (No extended character. Valid for only non-LFN configuration.) */ +/ 1 - ASCII (No extended character. Non-LFN cfg. only) +/ 437 - U.S. +/ 720 - Arabic +/ 737 - Greek +/ 771 - KBL +/ 775 - Baltic +/ 850 - Latin 1 +/ 852 - Latin 2 +/ 855 - Cyrillic +/ 857 - Turkish +/ 860 - Portuguese +/ 861 - Icelandic +/ 862 - Hebrew +/ 863 - Canadian French +/ 864 - Arabic +/ 865 - Nordic +/ 866 - Russian +/ 869 - Greek 2 +/ 932 - Japanese (DBCS) +/ 936 - Simplified Chinese (DBCS) +/ 949 - Korean (DBCS) +/ 950 - Traditional Chinese (DBCS) +*/ #define _USE_LFN 0 @@ -163,7 +156,7 @@ / number is bound to the same physical drive number and only an FAT volume found on / the physical drive will be mounted. When multi-partition feature is enabled (1), / each logical drive number is bound to arbitrary physical drive and partition -/ listed in the VolToPart[]. Also f_fdisk() funciton will be enabled. */ +/ listed in the VolToPart[]. Also f_fdisk() funciton will be available. */ #define _MIN_SS 512 @@ -199,15 +192,23 @@ / System Configurations /---------------------------------------------------------------------------*/ +#define _FS_TINY 0 +/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) +/ At the tiny configuration, size of the file object (FIL) is reduced _MAX_SS +/ bytes. Instead of private sector buffer eliminated from the file object, +/ common sector buffer in the file system object (FATFS) is used for the file +/ data transfer. */ + + #define _FS_NORTC 0 -#define _NORTC_MON 11 -#define _NORTC_MDAY 9 -#define _NORTC_YEAR 2014 +#define _NORTC_MON 1 +#define _NORTC_MDAY 1 +#define _NORTC_YEAR 2015 /* The _FS_NORTC option switches timestamp feature. If the system does not have / an RTC function or valid timestamp is not needed, set _FS_NORTC to 1 to disable / the timestamp feature. All objects modified by FatFs will have a fixed timestamp / defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR. -/ When timestamp feature is enabled (_FS_NORTC == 0), get_fattime() function need +/ When timestamp feature is enabled (_FS_NORTC == 0), get_fattime() function need / to be added to the project to read current time form RTC. _NORTC_MON, / _NORTC_MDAY and _NORTC_YEAR have no effect. / These options have no effect at read-only configuration (_FS_READONLY == 1). */ @@ -242,7 +243,8 @@ / / The _FS_TIMEOUT defines timeout period in unit of time tick. / The _SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, -/ SemaphoreHandle_t and etc.. */ +/ SemaphoreHandle_t and etc.. A header file for O/S definitions needs to be +/ included somewhere in the scope of ff.c. */ #define _WORD_ACCESS 0 @@ -256,15 +258,19 @@ / * Byte order on the memory is little-endian. / / If it is the case, _WORD_ACCESS can also be set to 1 to reduce code size. -/ Following table shows allowable settings of some processor types. +/ Following table shows allowable settings of some type of processors. / -/ ARM7TDMI 0 ColdFire 0 V850E 0 -/ Cortex-M3 0 Z80 0/1 V850ES 0/1 -/ Cortex-M0 0 x86 0/1 TLCS-870 0/1 -/ AVR 0/1 RX600(LE) 0/1 TLCS-900 0/1 -/ AVR32 0 RL78 0 R32C 0 -/ PIC18 0/1 SH-2 0 M16C 0/1 -/ PIC24 0 H8S 0 MSP430 0 -/ PIC32 0 H8/300H 0 8051 0/1 +/ ARM7TDMI 0 *2 ColdFire 0 *1 V850E 0 *2 +/ Cortex-M3 0 *3 Z80 0/1 V850ES 0/1 +/ Cortex-M0 0 *2 x86 0/1 TLCS-870 0/1 +/ AVR 0/1 RX600(LE) 0/1 TLCS-900 0/1 +/ AVR32 0 *1 RL78 0 *2 R32C 0 *2 +/ PIC18 0/1 SH-2 0 *1 M16C 0/1 +/ PIC24 0 *2 H8S 0 *1 MSP430 0 *2 +/ PIC32 0 *1 H8/300H 0 *1 8051 0/1 +/ +/ *1:Big-endian. +/ *2:Unaligned memory access is not supported. +/ *3:Some compilers generate LDM/STM for mem_cpy function. */ diff --git a/firmware/chibios-portapack/ext/fatfs/src/integer.h b/firmware/chibios-portapack/ext/fatfs/src/integer.h index 074a46bd..584bd1a9 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/integer.h +++ b/firmware/chibios-portapack/ext/fatfs/src/integer.h @@ -5,26 +5,26 @@ #ifndef _FF_INTEGER #define _FF_INTEGER -#ifdef _WIN32 /* FatFs development platform */ +#ifdef _WIN32 /* Development platform */ #include #include #else /* Embedded platform */ -/* This type MUST be 8 bit */ +/* This type MUST be 8-bit */ typedef unsigned char BYTE; -/* These types MUST be 16 bit */ +/* These types MUST be 16-bit */ typedef short SHORT; typedef unsigned short WORD; typedef unsigned short WCHAR; -/* These types MUST be 16 bit or 32 bit */ +/* These types MUST be 16-bit or 32-bit */ typedef int INT; typedef unsigned int UINT; -/* These types MUST be 32 bit */ +/* These types MUST be 32-bit */ typedef long LONG; typedef unsigned long DWORD; diff --git a/firmware/chibios-portapack/ext/fatfs/src/option/cc932.c b/firmware/chibios-portapack/ext/fatfs/src/option/cc932.c index 36db384b..19231a2b 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/option/cc932.c +++ b/firmware/chibios-portapack/ext/fatfs/src/option/cc932.c @@ -1,6 +1,5 @@ /*------------------------------------------------------------------------*/ -/* Unicode - OEM code bidirectional converter (C)ChaN, 2009 */ -/* */ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2015 */ /* CP932 (Japanese Shift-JIS) */ /*------------------------------------------------------------------------*/ @@ -111,1759 +110,1759 @@ const WCHAR uni2sjis[] = { 0x3088, 0x82E6, 0x3089, 0x82E7, 0x308A, 0x82E8, 0x308B, 0x82E9, 0x308C, 0x82EA, 0x308D, 0x82EB, 0x308E, 0x82EC, 0x308F, 0x82ED, 0x3090, 0x82EE, 0x3091, 0x82EF, 0x3092, 0x82F0, 0x3093, 0x82F1, - 0x309B, 0x814A, 0x309C, 0x814B, 0x309D, 0x8154, - 0x309E, 0x8155, 0x30A1, 0x8340, 0x30A2, 0x8341, 0x30A3, 0x8342, - 0x30A4, 0x8343, 0x30A5, 0x8344, 0x30A6, 0x8345, 0x30A7, 0x8346, - 0x30A8, 0x8347, 0x30A9, 0x8348, 0x30AA, 0x8349, 0x30AB, 0x834A, - 0x30AC, 0x834B, 0x30AD, 0x834C, 0x30AE, 0x834D, 0x30AF, 0x834E, - 0x30B0, 0x834F, 0x30B1, 0x8350, 0x30B2, 0x8351, 0x30B3, 0x8352, - 0x30B4, 0x8353, 0x30B5, 0x8354, 0x30B6, 0x8355, 0x30B7, 0x8356, - 0x30B8, 0x8357, 0x30B9, 0x8358, 0x30BA, 0x8359, 0x30BB, 0x835A, - 0x30BC, 0x835B, 0x30BD, 0x835C, 0x30BE, 0x835D, 0x30BF, 0x835E, - 0x30C0, 0x835F, 0x30C1, 0x8360, 0x30C2, 0x8361, 0x30C3, 0x8362, - 0x30C4, 0x8363, 0x30C5, 0x8364, 0x30C6, 0x8365, 0x30C7, 0x8366, - 0x30C8, 0x8367, 0x30C9, 0x8368, 0x30CA, 0x8369, 0x30CB, 0x836A, - 0x30CC, 0x836B, 0x30CD, 0x836C, 0x30CE, 0x836D, 0x30CF, 0x836E, - 0x30D0, 0x836F, 0x30D1, 0x8370, 0x30D2, 0x8371, 0x30D3, 0x8372, - 0x30D4, 0x8373, 0x30D5, 0x8374, 0x30D6, 0x8375, 0x30D7, 0x8376, - 0x30D8, 0x8377, 0x30D9, 0x8378, 0x30DA, 0x8379, 0x30DB, 0x837A, - 0x30DC, 0x837B, 0x30DD, 0x837C, 0x30DE, 0x837D, 0x30DF, 0x837E, - 0x30E0, 0x8380, 0x30E1, 0x8381, 0x30E2, 0x8382, 0x30E3, 0x8383, - 0x30E4, 0x8384, 0x30E5, 0x8385, 0x30E6, 0x8386, 0x30E7, 0x8387, - 0x30E8, 0x8388, 0x30E9, 0x8389, 0x30EA, 0x838A, 0x30EB, 0x838B, - 0x30EC, 0x838C, 0x30ED, 0x838D, 0x30EE, 0x838E, 0x30EF, 0x838F, - 0x30F0, 0x8390, 0x30F1, 0x8391, 0x30F2, 0x8392, 0x30F3, 0x8393, - 0x30F4, 0x8394, 0x30F5, 0x8395, 0x30F6, 0x8396, 0x30FB, 0x8145, - 0x30FC, 0x815B, 0x30FD, 0x8152, 0x30FE, 0x8153, 0x3231, 0x878A, - 0x3232, 0x878B, 0x3239, 0x878C, 0x32A4, 0x8785, 0x32A5, 0x8786, - 0x32A6, 0x8787, 0x32A7, 0x8788, 0x32A8, 0x8789, 0x3303, 0x8765, - 0x330D, 0x8769, 0x3314, 0x8760, 0x3318, 0x8763, 0x3322, 0x8761, - 0x3323, 0x876B, 0x3326, 0x876A, 0x3327, 0x8764, 0x332B, 0x876C, - 0x3336, 0x8766, 0x333B, 0x876E, 0x3349, 0x875F, 0x334A, 0x876D, - 0x334D, 0x8762, 0x3351, 0x8767, 0x3357, 0x8768, 0x337B, 0x877E, - 0x337C, 0x878F, 0x337D, 0x878E, 0x337E, 0x878D, 0x338E, 0x8772, - 0x338F, 0x8773, 0x339C, 0x876F, 0x339D, 0x8770, 0x339E, 0x8771, - 0x33A1, 0x8775, 0x33C4, 0x8774, 0x33CD, 0x8783, 0x4E00, 0x88EA, - 0x4E01, 0x929A, 0x4E03, 0x8EB5, 0x4E07, 0x969C, 0x4E08, 0x8FE4, - 0x4E09, 0x8E4F, 0x4E0A, 0x8FE3, 0x4E0B, 0x89BA, 0x4E0D, 0x9573, - 0x4E0E, 0x975E, 0x4E10, 0x98A0, 0x4E11, 0x894E, 0x4E14, 0x8A8E, - 0x4E15, 0x98A1, 0x4E16, 0x90A2, 0x4E17, 0x99C0, 0x4E18, 0x8B75, - 0x4E19, 0x95B8, 0x4E1E, 0x8FE5, 0x4E21, 0x97BC, 0x4E26, 0x95C0, - 0x4E28, 0xFA68, 0x4E2A, 0x98A2, 0x4E2D, 0x9286, 0x4E31, 0x98A3, - 0x4E32, 0x8BF8, 0x4E36, 0x98A4, 0x4E38, 0x8ADB, 0x4E39, 0x924F, - 0x4E3B, 0x8EE5, 0x4E3C, 0x98A5, 0x4E3F, 0x98A6, 0x4E42, 0x98A7, - 0x4E43, 0x9454, 0x4E45, 0x8B76, 0x4E4B, 0x9456, 0x4E4D, 0x93E1, - 0x4E4E, 0x8CC1, 0x4E4F, 0x9652, 0x4E55, 0xE568, 0x4E56, 0x98A8, - 0x4E57, 0x8FE6, 0x4E58, 0x98A9, 0x4E59, 0x89B3, 0x4E5D, 0x8BE3, - 0x4E5E, 0x8CEE, 0x4E5F, 0x96E7, 0x4E62, 0x9BA4, 0x4E71, 0x9790, - 0x4E73, 0x93FB, 0x4E7E, 0x8AA3, 0x4E80, 0x8B54, 0x4E82, 0x98AA, - 0x4E85, 0x98AB, 0x4E86, 0x97B9, 0x4E88, 0x975C, 0x4E89, 0x9188, - 0x4E8A, 0x98AD, 0x4E8B, 0x8E96, 0x4E8C, 0x93F1, 0x4E8E, 0x98B0, - 0x4E91, 0x895D, 0x4E92, 0x8CDD, 0x4E94, 0x8CDC, 0x4E95, 0x88E4, - 0x4E98, 0x986A, 0x4E99, 0x9869, 0x4E9B, 0x8DB1, 0x4E9C, 0x889F, - 0x4E9E, 0x98B1, 0x4E9F, 0x98B2, 0x4EA0, 0x98B3, 0x4EA1, 0x9653, - 0x4EA2, 0x98B4, 0x4EA4, 0x8CF0, 0x4EA5, 0x88E5, 0x4EA6, 0x9692, - 0x4EA8, 0x8B9C, 0x4EAB, 0x8B9D, 0x4EAC, 0x8B9E, 0x4EAD, 0x92E0, - 0x4EAE, 0x97BA, 0x4EB0, 0x98B5, 0x4EB3, 0x98B6, 0x4EB6, 0x98B7, - 0x4EBA, 0x906C, 0x4EC0, 0x8F59, 0x4EC1, 0x906D, 0x4EC2, 0x98BC, - 0x4EC4, 0x98BA, 0x4EC6, 0x98BB, 0x4EC7, 0x8B77, 0x4ECA, 0x8DA1, - 0x4ECB, 0x89EE, 0x4ECD, 0x98B9, 0x4ECE, 0x98B8, 0x4ECF, 0x95A7, - 0x4ED4, 0x8E65, 0x4ED5, 0x8E64, 0x4ED6, 0x91BC, 0x4ED7, 0x98BD, - 0x4ED8, 0x9574, 0x4ED9, 0x90E5, 0x4EDD, 0x8157, 0x4EDE, 0x98BE, - 0x4EDF, 0x98C0, 0x4EE1, 0xFA69, 0x4EE3, 0x91E3, 0x4EE4, 0x97DF, - 0x4EE5, 0x88C8, 0x4EED, 0x98BF, 0x4EEE, 0x89BC, 0x4EF0, 0x8BC2, - 0x4EF2, 0x9287, 0x4EF6, 0x8C8F, 0x4EF7, 0x98C1, 0x4EFB, 0x9443, - 0x4EFC, 0xFA6A, 0x4F00, 0xFA6B, 0x4F01, 0x8AE9, 0x4F03, 0xFA6C, - 0x4F09, 0x98C2, 0x4F0A, 0x88C9, 0x4F0D, 0x8CDE, 0x4F0E, 0x8AEA, - 0x4F0F, 0x959A, 0x4F10, 0x94B0, 0x4F11, 0x8B78, 0x4F1A, 0x89EF, - 0x4F1C, 0x98E5, 0x4F1D, 0x9360, 0x4F2F, 0x948C, 0x4F30, 0x98C4, - 0x4F34, 0x94BA, 0x4F36, 0x97E0, 0x4F38, 0x904C, 0x4F39, 0xFA6D, - 0x4F3A, 0x8E66, 0x4F3C, 0x8E97, 0x4F3D, 0x89BE, 0x4F43, 0x92CF, - 0x4F46, 0x9241, 0x4F47, 0x98C8, 0x4F4D, 0x88CA, 0x4F4E, 0x92E1, - 0x4F4F, 0x8F5A, 0x4F50, 0x8DB2, 0x4F51, 0x9743, 0x4F53, 0x91CC, - 0x4F55, 0x89BD, 0x4F56, 0xFA6E, 0x4F57, 0x98C7, 0x4F59, 0x975D, - 0x4F5A, 0x98C3, 0x4F5B, 0x98C5, 0x4F5C, 0x8DEC, 0x4F5D, 0x98C6, - 0x4F5E, 0x9B43, 0x4F69, 0x98CE, 0x4F6F, 0x98D1, 0x4F70, 0x98CF, - 0x4F73, 0x89C0, 0x4F75, 0x95B9, 0x4F76, 0x98C9, 0x4F7B, 0x98CD, - 0x4F7C, 0x8CF1, 0x4F7F, 0x8E67, 0x4F83, 0x8AA4, 0x4F86, 0x98D2, - 0x4F88, 0x98CA, 0x4F8A, 0xFA70, 0x4F8B, 0x97E1, 0x4F8D, 0x8E98, - 0x4F8F, 0x98CB, 0x4F91, 0x98D0, 0x4F92, 0xFA6F, 0x4F94, 0xFA72, - 0x4F96, 0x98D3, 0x4F98, 0x98CC, 0x4F9A, 0xFA71, 0x4F9B, 0x8B9F, - 0x4F9D, 0x88CB, 0x4FA0, 0x8BA0, 0x4FA1, 0x89BF, 0x4FAB, 0x9B44, - 0x4FAD, 0x9699, 0x4FAE, 0x958E, 0x4FAF, 0x8CF2, 0x4FB5, 0x904E, - 0x4FB6, 0x97B5, 0x4FBF, 0x95D6, 0x4FC2, 0x8C57, 0x4FC3, 0x91A3, - 0x4FC4, 0x89E2, 0x4FC9, 0xFA61, 0x4FCA, 0x8F72, 0x4FCD, 0xFA73, - 0x4FCE, 0x98D7, 0x4FD0, 0x98DC, 0x4FD1, 0x98DA, 0x4FD4, 0x98D5, - 0x4FD7, 0x91AD, 0x4FD8, 0x98D8, 0x4FDA, 0x98DB, 0x4FDB, 0x98D9, - 0x4FDD, 0x95DB, 0x4FDF, 0x98D6, 0x4FE1, 0x904D, 0x4FE3, 0x9693, - 0x4FE4, 0x98DD, 0x4FE5, 0x98DE, 0x4FEE, 0x8F43, 0x4FEF, 0x98EB, - 0x4FF3, 0x946F, 0x4FF5, 0x9555, 0x4FF6, 0x98E6, 0x4FF8, 0x95EE, - 0x4FFA, 0x89B4, 0x4FFE, 0x98EA, 0x4FFF, 0xFA76, 0x5005, 0x98E4, - 0x5006, 0x98ED, 0x5009, 0x9171, 0x500B, 0x8CC2, 0x500D, 0x947B, - 0x500F, 0xE0C5, 0x5011, 0x98EC, 0x5012, 0x937C, 0x5014, 0x98E1, - 0x5016, 0x8CF4, 0x5019, 0x8CF3, 0x501A, 0x98DF, 0x501E, 0xFA77, - 0x501F, 0x8ED8, 0x5021, 0x98E7, 0x5022, 0xFA75, 0x5023, 0x95ED, - 0x5024, 0x926C, 0x5025, 0x98E3, 0x5026, 0x8C91, 0x5028, 0x98E0, - 0x5029, 0x98E8, 0x502A, 0x98E2, 0x502B, 0x97CF, 0x502C, 0x98E9, - 0x502D, 0x9860, 0x5036, 0x8BE4, 0x5039, 0x8C90, 0x5040, 0xFA74, - 0x5042, 0xFA7A, 0x5043, 0x98EE, 0x5046, 0xFA78, 0x5047, 0x98EF, - 0x5048, 0x98F3, 0x5049, 0x88CC, 0x504F, 0x95CE, 0x5050, 0x98F2, - 0x5055, 0x98F1, 0x5056, 0x98F5, 0x505A, 0x98F4, 0x505C, 0x92E2, - 0x5065, 0x8C92, 0x506C, 0x98F6, 0x5070, 0xFA79, 0x5072, 0x8EC3, - 0x5074, 0x91A4, 0x5075, 0x92E3, 0x5076, 0x8BF4, 0x5078, 0x98F7, - 0x507D, 0x8B55, 0x5080, 0x98F8, 0x5085, 0x98FA, 0x508D, 0x9654, - 0x5091, 0x8C86, 0x5094, 0xFA7B, 0x5098, 0x8E50, 0x5099, 0x94F5, - 0x509A, 0x98F9, 0x50AC, 0x8DC3, 0x50AD, 0x9762, 0x50B2, 0x98FC, - 0x50B3, 0x9942, 0x50B4, 0x98FB, 0x50B5, 0x8DC2, 0x50B7, 0x8F9D, - 0x50BE, 0x8C58, 0x50C2, 0x9943, 0x50C5, 0x8BCD, 0x50C9, 0x9940, - 0x50CA, 0x9941, 0x50CD, 0x93AD, 0x50CF, 0x919C, 0x50D1, 0x8BA1, - 0x50D5, 0x966C, 0x50D6, 0x9944, 0x50D8, 0xFA7D, 0x50DA, 0x97BB, - 0x50DE, 0x9945, 0x50E3, 0x9948, 0x50E5, 0x9946, 0x50E7, 0x916D, - 0x50ED, 0x9947, 0x50EE, 0x9949, 0x50F4, 0xFA7C, 0x50F5, 0x994B, - 0x50F9, 0x994A, 0x50FB, 0x95C6, 0x5100, 0x8B56, 0x5101, 0x994D, - 0x5102, 0x994E, 0x5104, 0x89AD, 0x5109, 0x994C, 0x5112, 0x8EF2, - 0x5114, 0x9951, 0x5115, 0x9950, 0x5116, 0x994F, 0x5118, 0x98D4, - 0x511A, 0x9952, 0x511F, 0x8F9E, 0x5121, 0x9953, 0x512A, 0x9744, - 0x5132, 0x96D7, 0x5137, 0x9955, 0x513A, 0x9954, 0x513B, 0x9957, - 0x513C, 0x9956, 0x513F, 0x9958, 0x5140, 0x9959, 0x5141, 0x88F2, - 0x5143, 0x8CB3, 0x5144, 0x8C5A, 0x5145, 0x8F5B, 0x5146, 0x929B, - 0x5147, 0x8BA2, 0x5148, 0x90E6, 0x5149, 0x8CF5, 0x514A, 0xFA7E, - 0x514B, 0x8D8E, 0x514C, 0x995B, 0x514D, 0x96C6, 0x514E, 0x9365, - 0x5150, 0x8E99, 0x5152, 0x995A, 0x5154, 0x995C, 0x515A, 0x937D, - 0x515C, 0x8A95, 0x5162, 0x995D, 0x5164, 0xFA80, 0x5165, 0x93FC, - 0x5168, 0x9153, 0x5169, 0x995F, 0x516A, 0x9960, 0x516B, 0x94AA, - 0x516C, 0x8CF6, 0x516D, 0x985A, 0x516E, 0x9961, 0x5171, 0x8BA4, - 0x5175, 0x95BA, 0x5176, 0x91B4, 0x5177, 0x8BEF, 0x5178, 0x9354, - 0x517C, 0x8C93, 0x5180, 0x9962, 0x5182, 0x9963, 0x5185, 0x93E0, - 0x5186, 0x897E, 0x5189, 0x9966, 0x518A, 0x8DFB, 0x518C, 0x9965, - 0x518D, 0x8DC4, 0x518F, 0x9967, 0x5190, 0xE3EC, 0x5191, 0x9968, - 0x5192, 0x9660, 0x5193, 0x9969, 0x5195, 0x996A, 0x5196, 0x996B, - 0x5197, 0x8FE7, 0x5199, 0x8ECA, 0x519D, 0xFA81, 0x51A0, 0x8AA5, - 0x51A2, 0x996E, 0x51A4, 0x996C, 0x51A5, 0x96BB, 0x51A6, 0x996D, - 0x51A8, 0x9579, 0x51A9, 0x996F, 0x51AA, 0x9970, 0x51AB, 0x9971, - 0x51AC, 0x937E, 0x51B0, 0x9975, 0x51B1, 0x9973, 0x51B2, 0x9974, - 0x51B3, 0x9972, 0x51B4, 0x8DE1, 0x51B5, 0x9976, 0x51B6, 0x96E8, - 0x51B7, 0x97E2, 0x51BD, 0x9977, 0x51BE, 0xFA82, 0x51C4, 0x90A6, - 0x51C5, 0x9978, 0x51C6, 0x8F79, 0x51C9, 0x9979, 0x51CB, 0x929C, - 0x51CC, 0x97BD, 0x51CD, 0x9380, 0x51D6, 0x99C3, 0x51DB, 0x997A, - 0x51DC, 0xEAA3, 0x51DD, 0x8BC3, 0x51E0, 0x997B, 0x51E1, 0x967D, - 0x51E6, 0x8F88, 0x51E7, 0x91FA, 0x51E9, 0x997D, 0x51EA, 0x93E2, - 0x51EC, 0xFA83, 0x51ED, 0x997E, 0x51F0, 0x9980, 0x51F1, 0x8A4D, - 0x51F5, 0x9981, 0x51F6, 0x8BA5, 0x51F8, 0x93CA, 0x51F9, 0x899A, - 0x51FA, 0x8F6F, 0x51FD, 0x949F, 0x51FE, 0x9982, 0x5200, 0x9381, - 0x5203, 0x906E, 0x5204, 0x9983, 0x5206, 0x95AA, 0x5207, 0x90D8, - 0x5208, 0x8AA0, 0x520A, 0x8AA7, 0x520B, 0x9984, 0x520E, 0x9986, - 0x5211, 0x8C59, 0x5214, 0x9985, 0x5215, 0xFA84, 0x5217, 0x97F1, - 0x521D, 0x8F89, 0x5224, 0x94BB, 0x5225, 0x95CA, 0x5227, 0x9987, - 0x5229, 0x9798, 0x522A, 0x9988, 0x522E, 0x9989, 0x5230, 0x939E, - 0x5233, 0x998A, 0x5236, 0x90A7, 0x5237, 0x8DFC, 0x5238, 0x8C94, - 0x5239, 0x998B, 0x523A, 0x8E68, 0x523B, 0x8D8F, 0x5243, 0x92E4, - 0x5244, 0x998D, 0x5247, 0x91A5, 0x524A, 0x8DED, 0x524B, 0x998E, - 0x524C, 0x998F, 0x524D, 0x914F, 0x524F, 0x998C, 0x5254, 0x9991, - 0x5256, 0x9655, 0x525B, 0x8D84, 0x525E, 0x9990, 0x5263, 0x8C95, - 0x5264, 0x8DDC, 0x5265, 0x948D, 0x5269, 0x9994, 0x526A, 0x9992, - 0x526F, 0x959B, 0x5270, 0x8FE8, 0x5271, 0x999B, 0x5272, 0x8A84, - 0x5273, 0x9995, 0x5274, 0x9993, 0x5275, 0x916E, 0x527D, 0x9997, - 0x527F, 0x9996, 0x5283, 0x8A63, 0x5287, 0x8C80, 0x5288, 0x999C, - 0x5289, 0x97AB, 0x528D, 0x9998, 0x5291, 0x999D, 0x5292, 0x999A, - 0x5294, 0x9999, 0x529B, 0x97CD, 0x529C, 0xFA85, 0x529F, 0x8CF7, - 0x52A0, 0x89C1, 0x52A3, 0x97F2, 0x52A6, 0xFA86, 0x52A9, 0x8F95, - 0x52AA, 0x9377, 0x52AB, 0x8D85, 0x52AC, 0x99A0, 0x52AD, 0x99A1, - 0x52AF, 0xFB77, 0x52B1, 0x97E3, 0x52B4, 0x984A, 0x52B5, 0x99A3, - 0x52B9, 0x8CF8, 0x52BC, 0x99A2, 0x52BE, 0x8A4E, 0x52C0, 0xFA87, - 0x52C1, 0x99A4, 0x52C3, 0x9675, 0x52C5, 0x92BA, 0x52C7, 0x9745, - 0x52C9, 0x95D7, 0x52CD, 0x99A5, 0x52D2, 0xE8D3, 0x52D5, 0x93AE, - 0x52D7, 0x99A6, 0x52D8, 0x8AA8, 0x52D9, 0x96B1, 0x52DB, 0xFA88, - 0x52DD, 0x8F9F, 0x52DE, 0x99A7, 0x52DF, 0x95E5, 0x52E0, 0x99AB, - 0x52E2, 0x90A8, 0x52E3, 0x99A8, 0x52E4, 0x8BCE, 0x52E6, 0x99A9, - 0x52E7, 0x8AA9, 0x52F2, 0x8C4D, 0x52F3, 0x99AC, 0x52F5, 0x99AD, - 0x52F8, 0x99AE, 0x52F9, 0x99AF, 0x52FA, 0x8ED9, 0x52FE, 0x8CF9, - 0x52FF, 0x96DC, 0x5300, 0xFA89, 0x5301, 0x96E6, 0x5302, 0x93F5, - 0x5305, 0x95EF, 0x5306, 0x99B0, 0x5307, 0xFA8A, 0x5308, 0x99B1, - 0x530D, 0x99B3, 0x530F, 0x99B5, 0x5310, 0x99B4, 0x5315, 0x99B6, - 0x5316, 0x89BB, 0x5317, 0x966B, 0x5319, 0x8DFA, 0x531A, 0x99B7, - 0x531D, 0x9178, 0x5320, 0x8FA0, 0x5321, 0x8BA7, 0x5323, 0x99B8, - 0x5324, 0xFA8B, 0x532A, 0x94D9, 0x532F, 0x99B9, 0x5331, 0x99BA, - 0x5333, 0x99BB, 0x5338, 0x99BC, 0x5339, 0x9543, 0x533A, 0x8BE6, - 0x533B, 0x88E3, 0x533F, 0x93BD, 0x5340, 0x99BD, 0x5341, 0x8F5C, - 0x5343, 0x90E7, 0x5345, 0x99BF, 0x5346, 0x99BE, 0x5347, 0x8FA1, - 0x5348, 0x8CDF, 0x5349, 0x99C1, 0x534A, 0x94BC, 0x534D, 0x99C2, - 0x5351, 0x94DA, 0x5352, 0x91B2, 0x5353, 0x91EC, 0x5354, 0x8BA6, - 0x5357, 0x93EC, 0x5358, 0x9250, 0x535A, 0x948E, 0x535C, 0x966D, - 0x535E, 0x99C4, 0x5360, 0x90E8, 0x5366, 0x8C54, 0x5369, 0x99C5, - 0x536E, 0x99C6, 0x536F, 0x894B, 0x5370, 0x88F3, 0x5371, 0x8AEB, - 0x5372, 0xFA8C, 0x5373, 0x91A6, 0x5374, 0x8B70, 0x5375, 0x9791, - 0x5377, 0x99C9, 0x5378, 0x89B5, 0x537B, 0x99C8, 0x537F, 0x8BA8, - 0x5382, 0x99CA, 0x5384, 0x96EF, 0x5393, 0xFA8D, 0x5396, 0x99CB, - 0x5398, 0x97D0, 0x539A, 0x8CFA, 0x539F, 0x8CB4, 0x53A0, 0x99CC, - 0x53A5, 0x99CE, 0x53A6, 0x99CD, 0x53A8, 0x907E, 0x53A9, 0x8958, - 0x53AD, 0x897D, 0x53AE, 0x99CF, 0x53B0, 0x99D0, 0x53B2, 0xFA8E, - 0x53B3, 0x8CB5, 0x53B6, 0x99D1, 0x53BB, 0x8B8E, 0x53C2, 0x8E51, - 0x53C3, 0x99D2, 0x53C8, 0x9694, 0x53C9, 0x8DB3, 0x53CA, 0x8B79, - 0x53CB, 0x9746, 0x53CC, 0x916F, 0x53CD, 0x94BD, 0x53CE, 0x8EFB, - 0x53D4, 0x8F66, 0x53D6, 0x8EE6, 0x53D7, 0x8EF3, 0x53D9, 0x8F96, - 0x53DB, 0x94BE, 0x53DD, 0xFA8F, 0x53DF, 0x99D5, 0x53E1, 0x8962, - 0x53E2, 0x9170, 0x53E3, 0x8CFB, 0x53E4, 0x8CC3, 0x53E5, 0x8BE5, - 0x53E8, 0x99D9, 0x53E9, 0x9240, 0x53EA, 0x91FC, 0x53EB, 0x8BA9, - 0x53EC, 0x8FA2, 0x53ED, 0x99DA, 0x53EE, 0x99D8, 0x53EF, 0x89C2, - 0x53F0, 0x91E4, 0x53F1, 0x8EB6, 0x53F2, 0x8E6A, 0x53F3, 0x8945, - 0x53F6, 0x8A90, 0x53F7, 0x8D86, 0x53F8, 0x8E69, 0x53FA, 0x99DB, - 0x5401, 0x99DC, 0x5403, 0x8B68, 0x5404, 0x8A65, 0x5408, 0x8D87, - 0x5409, 0x8B67, 0x540A, 0x92DD, 0x540B, 0x8944, 0x540C, 0x93AF, - 0x540D, 0x96BC, 0x540E, 0x8D40, 0x540F, 0x9799, 0x5410, 0x9366, - 0x5411, 0x8CFC, 0x541B, 0x8C4E, 0x541D, 0x99E5, 0x541F, 0x8BE1, - 0x5420, 0x9669, 0x5426, 0x94DB, 0x5429, 0x99E4, 0x542B, 0x8ADC, - 0x542C, 0x99DF, 0x542D, 0x99E0, 0x542E, 0x99E2, 0x5436, 0x99E3, - 0x5438, 0x8B7A, 0x5439, 0x9081, 0x543B, 0x95AB, 0x543C, 0x99E1, - 0x543D, 0x99DD, 0x543E, 0x8CE1, 0x5440, 0x99DE, 0x5442, 0x9843, - 0x5446, 0x95F0, 0x5448, 0x92E6, 0x5449, 0x8CE0, 0x544A, 0x8D90, - 0x544E, 0x99E6, 0x5451, 0x93DB, 0x545F, 0x99EA, 0x5468, 0x8EFC, - 0x546A, 0x8EF4, 0x5470, 0x99ED, 0x5471, 0x99EB, 0x5473, 0x96A1, - 0x5475, 0x99E8, 0x5476, 0x99F1, 0x5477, 0x99EC, 0x547B, 0x99EF, - 0x547C, 0x8CC4, 0x547D, 0x96BD, 0x5480, 0x99F0, 0x5484, 0x99F2, - 0x5486, 0x99F4, 0x548A, 0xFA92, 0x548B, 0x8DEE, 0x548C, 0x9861, - 0x548E, 0x99E9, 0x548F, 0x99E7, 0x5490, 0x99F3, 0x5492, 0x99EE, - 0x549C, 0xFA91, 0x54A2, 0x99F6, 0x54A4, 0x9A42, 0x54A5, 0x99F8, - 0x54A8, 0x99FC, 0x54A9, 0xFA93, 0x54AB, 0x9A40, 0x54AC, 0x99F9, - 0x54AF, 0x9A5D, 0x54B2, 0x8DE7, 0x54B3, 0x8A50, 0x54B8, 0x99F7, - 0x54BC, 0x9A44, 0x54BD, 0x88F4, 0x54BE, 0x9A43, 0x54C0, 0x88A3, - 0x54C1, 0x9569, 0x54C2, 0x9A41, 0x54C4, 0x99FA, 0x54C7, 0x99F5, - 0x54C8, 0x99FB, 0x54C9, 0x8DC6, 0x54D8, 0x9A45, 0x54E1, 0x88F5, - 0x54E2, 0x9A4E, 0x54E5, 0x9A46, 0x54E6, 0x9A47, 0x54E8, 0x8FA3, - 0x54E9, 0x9689, 0x54ED, 0x9A4C, 0x54EE, 0x9A4B, 0x54F2, 0x934E, - 0x54FA, 0x9A4D, 0x54FD, 0x9A4A, 0x54FF, 0xFA94, 0x5504, 0x8953, - 0x5506, 0x8DB4, 0x5507, 0x904F, 0x550F, 0x9A48, 0x5510, 0x9382, - 0x5514, 0x9A49, 0x5516, 0x88A0, 0x552E, 0x9A53, 0x552F, 0x9742, - 0x5531, 0x8FA5, 0x5533, 0x9A59, 0x5538, 0x9A58, 0x5539, 0x9A4F, - 0x553E, 0x91C1, 0x5540, 0x9A50, 0x5544, 0x91ED, 0x5545, 0x9A55, - 0x5546, 0x8FA4, 0x554C, 0x9A52, 0x554F, 0x96E2, 0x5553, 0x8C5B, - 0x5556, 0x9A56, 0x5557, 0x9A57, 0x555C, 0x9A54, 0x555D, 0x9A5A, - 0x5563, 0x9A51, 0x557B, 0x9A60, 0x557C, 0x9A65, 0x557E, 0x9A61, - 0x5580, 0x9A5C, 0x5583, 0x9A66, 0x5584, 0x9150, 0x5586, 0xFA95, - 0x5587, 0x9A68, 0x5589, 0x8D41, 0x558A, 0x9A5E, 0x558B, 0x929D, - 0x5598, 0x9A62, 0x5599, 0x9A5B, 0x559A, 0x8AAB, 0x559C, 0x8AEC, - 0x559D, 0x8A85, 0x559E, 0x9A63, 0x559F, 0x9A5F, 0x55A7, 0x8C96, - 0x55A8, 0x9A69, 0x55A9, 0x9A67, 0x55AA, 0x9172, 0x55AB, 0x8B69, - 0x55AC, 0x8BAA, 0x55AE, 0x9A64, 0x55B0, 0x8BF2, 0x55B6, 0x8963, - 0x55C4, 0x9A6D, 0x55C5, 0x9A6B, 0x55C7, 0x9AA5, 0x55D4, 0x9A70, - 0x55DA, 0x9A6A, 0x55DC, 0x9A6E, 0x55DF, 0x9A6C, 0x55E3, 0x8E6B, - 0x55E4, 0x9A6F, 0x55F7, 0x9A72, 0x55F9, 0x9A77, 0x55FD, 0x9A75, - 0x55FE, 0x9A74, 0x5606, 0x9251, 0x5609, 0x89C3, 0x5614, 0x9A71, - 0x5616, 0x9A73, 0x5617, 0x8FA6, 0x5618, 0x8952, 0x561B, 0x9A76, - 0x5629, 0x89DC, 0x562F, 0x9A82, 0x5631, 0x8FFA, 0x5632, 0x9A7D, - 0x5634, 0x9A7B, 0x5636, 0x9A7C, 0x5638, 0x9A7E, 0x5642, 0x895C, - 0x564C, 0x9158, 0x564E, 0x9A78, 0x5650, 0x9A79, 0x565B, 0x8A9A, - 0x5664, 0x9A81, 0x5668, 0x8AED, 0x566A, 0x9A84, 0x566B, 0x9A80, - 0x566C, 0x9A83, 0x5674, 0x95AC, 0x5678, 0x93D3, 0x567A, 0x94B6, - 0x5680, 0x9A86, 0x5686, 0x9A85, 0x5687, 0x8A64, 0x568A, 0x9A87, - 0x568F, 0x9A8A, 0x5694, 0x9A89, 0x56A0, 0x9A88, 0x56A2, 0x9458, - 0x56A5, 0x9A8B, 0x56AE, 0x9A8C, 0x56B4, 0x9A8E, 0x56B6, 0x9A8D, - 0x56BC, 0x9A90, 0x56C0, 0x9A93, 0x56C1, 0x9A91, 0x56C2, 0x9A8F, - 0x56C3, 0x9A92, 0x56C8, 0x9A94, 0x56CE, 0x9A95, 0x56D1, 0x9A96, - 0x56D3, 0x9A97, 0x56D7, 0x9A98, 0x56D8, 0x9964, 0x56DA, 0x8EFA, - 0x56DB, 0x8E6C, 0x56DE, 0x89F1, 0x56E0, 0x88F6, 0x56E3, 0x9263, - 0x56EE, 0x9A99, 0x56F0, 0x8DA2, 0x56F2, 0x88CD, 0x56F3, 0x907D, - 0x56F9, 0x9A9A, 0x56FA, 0x8CC5, 0x56FD, 0x8D91, 0x56FF, 0x9A9C, - 0x5700, 0x9A9B, 0x5703, 0x95DE, 0x5704, 0x9A9D, 0x5708, 0x9A9F, - 0x5709, 0x9A9E, 0x570B, 0x9AA0, 0x570D, 0x9AA1, 0x570F, 0x8C97, - 0x5712, 0x8980, 0x5713, 0x9AA2, 0x5716, 0x9AA4, 0x5718, 0x9AA3, - 0x571C, 0x9AA6, 0x571F, 0x9379, 0x5726, 0x9AA7, 0x5727, 0x88B3, - 0x5728, 0x8DDD, 0x572D, 0x8C5C, 0x5730, 0x926E, 0x5737, 0x9AA8, - 0x5738, 0x9AA9, 0x573B, 0x9AAB, 0x5740, 0x9AAC, 0x5742, 0x8DE2, - 0x5747, 0x8BCF, 0x574A, 0x9656, 0x574E, 0x9AAA, 0x574F, 0x9AAD, - 0x5750, 0x8DBF, 0x5751, 0x8D42, 0x5759, 0xFA96, 0x5761, 0x9AB1, - 0x5764, 0x8DA3, 0x5765, 0xFA97, 0x5766, 0x9252, 0x5769, 0x9AAE, - 0x576A, 0x92D8, 0x577F, 0x9AB2, 0x5782, 0x9082, 0x5788, 0x9AB0, - 0x5789, 0x9AB3, 0x578B, 0x8C5E, 0x5793, 0x9AB4, 0x57A0, 0x9AB5, - 0x57A2, 0x8D43, 0x57A3, 0x8A5F, 0x57A4, 0x9AB7, 0x57AA, 0x9AB8, - 0x57AC, 0xFA98, 0x57B0, 0x9AB9, 0x57B3, 0x9AB6, 0x57C0, 0x9AAF, - 0x57C3, 0x9ABA, 0x57C6, 0x9ABB, 0x57C7, 0xFA9A, 0x57C8, 0xFA99, - 0x57CB, 0x9684, 0x57CE, 0x8FE9, 0x57D2, 0x9ABD, 0x57D3, 0x9ABE, - 0x57D4, 0x9ABC, 0x57D6, 0x9AC0, 0x57DC, 0x9457, 0x57DF, 0x88E6, - 0x57E0, 0x9575, 0x57E3, 0x9AC1, 0x57F4, 0x8FFB, 0x57F7, 0x8EB7, - 0x57F9, 0x947C, 0x57FA, 0x8AEE, 0x57FC, 0x8DE9, 0x5800, 0x9678, - 0x5802, 0x93B0, 0x5805, 0x8C98, 0x5806, 0x91CD, 0x580A, 0x9ABF, - 0x580B, 0x9AC2, 0x5815, 0x91C2, 0x5819, 0x9AC3, 0x581D, 0x9AC4, - 0x5821, 0x9AC6, 0x5824, 0x92E7, 0x582A, 0x8AAC, 0x582F, 0xEA9F, - 0x5830, 0x8981, 0x5831, 0x95F1, 0x5834, 0x8FEA, 0x5835, 0x9367, - 0x583A, 0x8DE4, 0x583D, 0x9ACC, 0x5840, 0x95BB, 0x5841, 0x97DB, - 0x584A, 0x89F2, 0x584B, 0x9AC8, 0x5851, 0x9159, 0x5852, 0x9ACB, - 0x5854, 0x9383, 0x5857, 0x9368, 0x5858, 0x9384, 0x5859, 0x94B7, - 0x585A, 0x92CB, 0x585E, 0x8DC7, 0x5862, 0x9AC7, 0x5869, 0x8996, - 0x586B, 0x9355, 0x5870, 0x9AC9, 0x5872, 0x9AC5, 0x5875, 0x906F, - 0x5879, 0x9ACD, 0x587E, 0x8F6D, 0x5883, 0x8BAB, 0x5885, 0x9ACE, - 0x5893, 0x95E6, 0x5897, 0x919D, 0x589C, 0x92C4, 0x589E, 0xFA9D, - 0x589F, 0x9AD0, 0x58A8, 0x966E, 0x58AB, 0x9AD1, 0x58AE, 0x9AD6, - 0x58B2, 0xFA9E, 0x58B3, 0x95AD, 0x58B8, 0x9AD5, 0x58B9, 0x9ACF, - 0x58BA, 0x9AD2, 0x58BB, 0x9AD4, 0x58BE, 0x8DA4, 0x58C1, 0x95C7, - 0x58C5, 0x9AD7, 0x58C7, 0x9264, 0x58CA, 0x89F3, 0x58CC, 0x8FEB, - 0x58D1, 0x9AD9, 0x58D3, 0x9AD8, 0x58D5, 0x8D88, 0x58D7, 0x9ADA, - 0x58D8, 0x9ADC, 0x58D9, 0x9ADB, 0x58DC, 0x9ADE, 0x58DE, 0x9AD3, - 0x58DF, 0x9AE0, 0x58E4, 0x9ADF, 0x58E5, 0x9ADD, 0x58EB, 0x8E6D, - 0x58EC, 0x9070, 0x58EE, 0x9173, 0x58EF, 0x9AE1, 0x58F0, 0x90BA, - 0x58F1, 0x88EB, 0x58F2, 0x9484, 0x58F7, 0x92D9, 0x58F9, 0x9AE3, - 0x58FA, 0x9AE2, 0x58FB, 0x9AE4, 0x58FC, 0x9AE5, 0x58FD, 0x9AE6, - 0x5902, 0x9AE7, 0x5909, 0x95CF, 0x590A, 0x9AE8, 0x590B, 0xFA9F, - 0x590F, 0x89C4, 0x5910, 0x9AE9, 0x5915, 0x975B, 0x5916, 0x8A4F, - 0x5918, 0x99C7, 0x5919, 0x8F67, 0x591A, 0x91BD, 0x591B, 0x9AEA, - 0x591C, 0x96E9, 0x5922, 0x96B2, 0x5925, 0x9AEC, 0x5927, 0x91E5, - 0x5929, 0x9356, 0x592A, 0x91BE, 0x592B, 0x9576, 0x592C, 0x9AED, - 0x592D, 0x9AEE, 0x592E, 0x899B, 0x5931, 0x8EB8, 0x5932, 0x9AEF, - 0x5937, 0x88CE, 0x5938, 0x9AF0, 0x593E, 0x9AF1, 0x5944, 0x8982, - 0x5947, 0x8AEF, 0x5948, 0x93DE, 0x5949, 0x95F2, 0x594E, 0x9AF5, - 0x594F, 0x9174, 0x5950, 0x9AF4, 0x5951, 0x8C5F, 0x5953, 0xFAA0, - 0x5954, 0x967A, 0x5955, 0x9AF3, 0x5957, 0x9385, 0x5958, 0x9AF7, - 0x595A, 0x9AF6, 0x595B, 0xFAA1, 0x595D, 0xFAA2, 0x5960, 0x9AF9, - 0x5962, 0x9AF8, 0x5963, 0xFAA3, 0x5965, 0x899C, 0x5967, 0x9AFA, - 0x5968, 0x8FA7, 0x5969, 0x9AFC, 0x596A, 0x9244, 0x596C, 0x9AFB, - 0x596E, 0x95B1, 0x5973, 0x8F97, 0x5974, 0x937A, 0x5978, 0x9B40, - 0x597D, 0x8D44, 0x5981, 0x9B41, 0x5982, 0x9440, 0x5983, 0x94DC, - 0x5984, 0x96CF, 0x598A, 0x9444, 0x598D, 0x9B4A, 0x5993, 0x8B57, - 0x5996, 0x9764, 0x5999, 0x96AD, 0x599B, 0x9BAA, 0x599D, 0x9B42, - 0x59A3, 0x9B45, 0x59A4, 0xFAA4, 0x59A5, 0x91C3, 0x59A8, 0x9657, - 0x59AC, 0x9369, 0x59B2, 0x9B46, 0x59B9, 0x9685, 0x59BA, 0xFAA5, - 0x59BB, 0x8DC8, 0x59BE, 0x8FA8, 0x59C6, 0x9B47, 0x59C9, 0x8E6F, - 0x59CB, 0x8E6E, 0x59D0, 0x88B7, 0x59D1, 0x8CC6, 0x59D3, 0x90A9, - 0x59D4, 0x88CF, 0x59D9, 0x9B4B, 0x59DA, 0x9B4C, 0x59DC, 0x9B49, - 0x59E5, 0x8957, 0x59E6, 0x8AAD, 0x59E8, 0x9B48, 0x59EA, 0x96C3, - 0x59EB, 0x9550, 0x59F6, 0x88A6, 0x59FB, 0x88F7, 0x59FF, 0x8E70, - 0x5A01, 0x88D0, 0x5A03, 0x88A1, 0x5A09, 0x9B51, 0x5A11, 0x9B4F, - 0x5A18, 0x96BA, 0x5A1A, 0x9B52, 0x5A1C, 0x9B50, 0x5A1F, 0x9B4E, - 0x5A20, 0x9050, 0x5A25, 0x9B4D, 0x5A29, 0x95D8, 0x5A2F, 0x8CE2, - 0x5A35, 0x9B56, 0x5A36, 0x9B57, 0x5A3C, 0x8FA9, 0x5A40, 0x9B53, - 0x5A41, 0x984B, 0x5A46, 0x946B, 0x5A49, 0x9B55, 0x5A5A, 0x8DA5, - 0x5A62, 0x9B58, 0x5A66, 0x9577, 0x5A6A, 0x9B59, 0x5A6C, 0x9B54, - 0x5A7F, 0x96B9, 0x5A92, 0x947D, 0x5A9A, 0x9B5A, 0x5A9B, 0x9551, - 0x5ABC, 0x9B5B, 0x5ABD, 0x9B5F, 0x5ABE, 0x9B5C, 0x5AC1, 0x89C5, - 0x5AC2, 0x9B5E, 0x5AC9, 0x8EB9, 0x5ACB, 0x9B5D, 0x5ACC, 0x8C99, - 0x5AD0, 0x9B6B, 0x5AD6, 0x9B64, 0x5AD7, 0x9B61, 0x5AE1, 0x9284, - 0x5AE3, 0x9B60, 0x5AE6, 0x9B62, 0x5AE9, 0x9B63, 0x5AFA, 0x9B65, - 0x5AFB, 0x9B66, 0x5B09, 0x8AF0, 0x5B0B, 0x9B68, 0x5B0C, 0x9B67, - 0x5B16, 0x9B69, 0x5B22, 0x8FEC, 0x5B2A, 0x9B6C, 0x5B2C, 0x92DA, - 0x5B30, 0x8964, 0x5B32, 0x9B6A, 0x5B36, 0x9B6D, 0x5B3E, 0x9B6E, - 0x5B40, 0x9B71, 0x5B43, 0x9B6F, 0x5B45, 0x9B70, 0x5B50, 0x8E71, - 0x5B51, 0x9B72, 0x5B54, 0x8D45, 0x5B55, 0x9B73, 0x5B56, 0xFAA6, - 0x5B57, 0x8E9A, 0x5B58, 0x91B6, 0x5B5A, 0x9B74, 0x5B5B, 0x9B75, - 0x5B5C, 0x8E79, 0x5B5D, 0x8D46, 0x5B5F, 0x96D0, 0x5B63, 0x8B47, - 0x5B64, 0x8CC7, 0x5B65, 0x9B76, 0x5B66, 0x8A77, 0x5B69, 0x9B77, - 0x5B6B, 0x91B7, 0x5B70, 0x9B78, 0x5B71, 0x9BA1, 0x5B73, 0x9B79, - 0x5B75, 0x9B7A, 0x5B78, 0x9B7B, 0x5B7A, 0x9B7D, 0x5B80, 0x9B7E, - 0x5B83, 0x9B80, 0x5B85, 0x91EE, 0x5B87, 0x8946, 0x5B88, 0x8EE7, - 0x5B89, 0x88C0, 0x5B8B, 0x9176, 0x5B8C, 0x8AAE, 0x5B8D, 0x8EB3, - 0x5B8F, 0x8D47, 0x5B95, 0x9386, 0x5B97, 0x8F40, 0x5B98, 0x8AAF, - 0x5B99, 0x9288, 0x5B9A, 0x92E8, 0x5B9B, 0x88B6, 0x5B9C, 0x8B58, - 0x5B9D, 0x95F3, 0x5B9F, 0x8EC0, 0x5BA2, 0x8B71, 0x5BA3, 0x90E9, - 0x5BA4, 0x8EBA, 0x5BA5, 0x9747, 0x5BA6, 0x9B81, 0x5BAE, 0x8B7B, - 0x5BB0, 0x8DC9, 0x5BB3, 0x8A51, 0x5BB4, 0x8983, 0x5BB5, 0x8FAA, - 0x5BB6, 0x89C6, 0x5BB8, 0x9B82, 0x5BB9, 0x9765, 0x5BBF, 0x8F68, - 0x5BC0, 0xFAA7, 0x5BC2, 0x8EE2, 0x5BC3, 0x9B83, 0x5BC4, 0x8AF1, - 0x5BC5, 0x93D0, 0x5BC6, 0x96A7, 0x5BC7, 0x9B84, 0x5BC9, 0x9B85, - 0x5BCC, 0x9578, 0x5BD0, 0x9B87, 0x5BD2, 0x8AA6, 0x5BD3, 0x8BF5, - 0x5BD4, 0x9B86, 0x5BD8, 0xFAA9, 0x5BDB, 0x8AB0, 0x5BDD, 0x9051, - 0x5BDE, 0x9B8B, 0x5BDF, 0x8E40, 0x5BE1, 0x89C7, 0x5BE2, 0x9B8A, - 0x5BE4, 0x9B88, 0x5BE5, 0x9B8C, 0x5BE6, 0x9B89, 0x5BE7, 0x944A, - 0x5BE8, 0x9ECB, 0x5BE9, 0x9052, 0x5BEB, 0x9B8D, 0x5BEC, 0xFAAA, - 0x5BEE, 0x97BE, 0x5BF0, 0x9B8E, 0x5BF3, 0x9B90, 0x5BF5, 0x929E, - 0x5BF6, 0x9B8F, 0x5BF8, 0x90A1, 0x5BFA, 0x8E9B, 0x5BFE, 0x91CE, - 0x5BFF, 0x8EF5, 0x5C01, 0x9595, 0x5C02, 0x90EA, 0x5C04, 0x8ECB, - 0x5C05, 0x9B91, 0x5C06, 0x8FAB, 0x5C07, 0x9B92, 0x5C08, 0x9B93, - 0x5C09, 0x88D1, 0x5C0A, 0x91B8, 0x5C0B, 0x9071, 0x5C0D, 0x9B94, - 0x5C0E, 0x93B1, 0x5C0F, 0x8FAC, 0x5C11, 0x8FAD, 0x5C13, 0x9B95, - 0x5C16, 0x90EB, 0x5C1A, 0x8FAE, 0x5C1E, 0xFAAB, 0x5C20, 0x9B96, - 0x5C22, 0x9B97, 0x5C24, 0x96DE, 0x5C28, 0x9B98, 0x5C2D, 0x8BC4, - 0x5C31, 0x8F41, 0x5C38, 0x9B99, 0x5C39, 0x9B9A, 0x5C3A, 0x8EDA, - 0x5C3B, 0x904B, 0x5C3C, 0x93F2, 0x5C3D, 0x9073, 0x5C3E, 0x94F6, - 0x5C3F, 0x9441, 0x5C40, 0x8BC7, 0x5C41, 0x9B9B, 0x5C45, 0x8B8F, - 0x5C46, 0x9B9C, 0x5C48, 0x8BFC, 0x5C4A, 0x93CD, 0x5C4B, 0x89AE, - 0x5C4D, 0x8E72, 0x5C4E, 0x9B9D, 0x5C4F, 0x9BA0, 0x5C50, 0x9B9F, - 0x5C51, 0x8BFB, 0x5C53, 0x9B9E, 0x5C55, 0x9357, 0x5C5E, 0x91AE, - 0x5C60, 0x936A, 0x5C61, 0x8EC6, 0x5C64, 0x9177, 0x5C65, 0x979A, - 0x5C6C, 0x9BA2, 0x5C6E, 0x9BA3, 0x5C6F, 0x93D4, 0x5C71, 0x8E52, - 0x5C76, 0x9BA5, 0x5C79, 0x9BA6, 0x5C8C, 0x9BA7, 0x5C90, 0x8AF2, - 0x5C91, 0x9BA8, 0x5C94, 0x9BA9, 0x5CA1, 0x89AA, 0x5CA6, 0xFAAC, - 0x5CA8, 0x915A, 0x5CA9, 0x8AE2, 0x5CAB, 0x9BAB, 0x5CAC, 0x96A6, - 0x5CB1, 0x91D0, 0x5CB3, 0x8A78, 0x5CB6, 0x9BAD, 0x5CB7, 0x9BAF, - 0x5CB8, 0x8ADD, 0x5CBA, 0xFAAD, 0x5CBB, 0x9BAC, 0x5CBC, 0x9BAE, - 0x5CBE, 0x9BB1, 0x5CC5, 0x9BB0, 0x5CC7, 0x9BB2, 0x5CD9, 0x9BB3, - 0x5CE0, 0x93BB, 0x5CE1, 0x8BAC, 0x5CE8, 0x89E3, 0x5CE9, 0x9BB4, - 0x5CEA, 0x9BB9, 0x5CED, 0x9BB7, 0x5CEF, 0x95F5, 0x5CF0, 0x95F4, - 0x5CF5, 0xFAAE, 0x5CF6, 0x9387, 0x5CFA, 0x9BB6, 0x5CFB, 0x8F73, - 0x5CFD, 0x9BB5, 0x5D07, 0x9092, 0x5D0B, 0x9BBA, 0x5D0E, 0x8DE8, - 0x5D11, 0x9BC0, 0x5D14, 0x9BC1, 0x5D15, 0x9BBB, 0x5D16, 0x8A52, - 0x5D17, 0x9BBC, 0x5D18, 0x9BC5, 0x5D19, 0x9BC4, 0x5D1A, 0x9BC3, - 0x5D1B, 0x9BBF, 0x5D1F, 0x9BBE, 0x5D22, 0x9BC2, 0x5D27, 0xFAAF, - 0x5D29, 0x95F6, 0x5D42, 0xFAB2, 0x5D4B, 0x9BC9, 0x5D4C, 0x9BC6, - 0x5D4E, 0x9BC8, 0x5D50, 0x9792, 0x5D52, 0x9BC7, 0x5D53, 0xFAB0, - 0x5D5C, 0x9BBD, 0x5D69, 0x9093, 0x5D6C, 0x9BCA, 0x5D6D, 0xFAB3, - 0x5D6F, 0x8DB5, 0x5D73, 0x9BCB, 0x5D76, 0x9BCC, 0x5D82, 0x9BCF, - 0x5D84, 0x9BCE, 0x5D87, 0x9BCD, 0x5D8B, 0x9388, 0x5D8C, 0x9BB8, - 0x5D90, 0x9BD5, 0x5D9D, 0x9BD1, 0x5DA2, 0x9BD0, 0x5DAC, 0x9BD2, - 0x5DAE, 0x9BD3, 0x5DB7, 0x9BD6, 0x5DB8, 0xFAB4, 0x5DB9, 0xFAB5, - 0x5DBA, 0x97E4, 0x5DBC, 0x9BD7, 0x5DBD, 0x9BD4, 0x5DC9, 0x9BD8, - 0x5DCC, 0x8ADE, 0x5DCD, 0x9BD9, 0x5DD0, 0xFAB6, 0x5DD2, 0x9BDB, - 0x5DD3, 0x9BDA, 0x5DD6, 0x9BDC, 0x5DDB, 0x9BDD, 0x5DDD, 0x90EC, - 0x5DDE, 0x8F42, 0x5DE1, 0x8F84, 0x5DE3, 0x9183, 0x5DE5, 0x8D48, - 0x5DE6, 0x8DB6, 0x5DE7, 0x8D49, 0x5DE8, 0x8B90, 0x5DEB, 0x9BDE, - 0x5DEE, 0x8DB7, 0x5DF1, 0x8CC8, 0x5DF2, 0x9BDF, 0x5DF3, 0x96A4, - 0x5DF4, 0x9462, 0x5DF5, 0x9BE0, 0x5DF7, 0x8D4A, 0x5DFB, 0x8AAA, - 0x5DFD, 0x9246, 0x5DFE, 0x8BD0, 0x5E02, 0x8E73, 0x5E03, 0x957A, - 0x5E06, 0x94BF, 0x5E0B, 0x9BE1, 0x5E0C, 0x8AF3, 0x5E11, 0x9BE4, - 0x5E16, 0x929F, 0x5E19, 0x9BE3, 0x5E1A, 0x9BE2, 0x5E1B, 0x9BE5, - 0x5E1D, 0x92E9, 0x5E25, 0x9083, 0x5E2B, 0x8E74, 0x5E2D, 0x90C8, - 0x5E2F, 0x91D1, 0x5E30, 0x8B41, 0x5E33, 0x92A0, 0x5E36, 0x9BE6, - 0x5E37, 0x9BE7, 0x5E38, 0x8FED, 0x5E3D, 0x9658, 0x5E40, 0x9BEA, - 0x5E43, 0x9BE9, 0x5E44, 0x9BE8, 0x5E45, 0x959D, 0x5E47, 0x9BF1, - 0x5E4C, 0x9679, 0x5E4E, 0x9BEB, 0x5E54, 0x9BED, 0x5E55, 0x968B, - 0x5E57, 0x9BEC, 0x5E5F, 0x9BEE, 0x5E61, 0x94A6, 0x5E62, 0x9BEF, - 0x5E63, 0x95BC, 0x5E64, 0x9BF0, 0x5E72, 0x8AB1, 0x5E73, 0x95BD, - 0x5E74, 0x944E, 0x5E75, 0x9BF2, 0x5E76, 0x9BF3, 0x5E78, 0x8D4B, - 0x5E79, 0x8AB2, 0x5E7A, 0x9BF4, 0x5E7B, 0x8CB6, 0x5E7C, 0x9763, - 0x5E7D, 0x9748, 0x5E7E, 0x8AF4, 0x5E7F, 0x9BF6, 0x5E81, 0x92A1, - 0x5E83, 0x8D4C, 0x5E84, 0x8FAF, 0x5E87, 0x94DD, 0x5E8A, 0x8FB0, - 0x5E8F, 0x8F98, 0x5E95, 0x92EA, 0x5E96, 0x95F7, 0x5E97, 0x9358, - 0x5E9A, 0x8D4D, 0x5E9C, 0x957B, 0x5EA0, 0x9BF7, 0x5EA6, 0x9378, - 0x5EA7, 0x8DC0, 0x5EAB, 0x8CC9, 0x5EAD, 0x92EB, 0x5EB5, 0x88C1, - 0x5EB6, 0x8F8E, 0x5EB7, 0x8D4E, 0x5EB8, 0x9766, 0x5EC1, 0x9BF8, - 0x5EC2, 0x9BF9, 0x5EC3, 0x9470, 0x5EC8, 0x9BFA, 0x5EC9, 0x97F5, - 0x5ECA, 0x984C, 0x5ECF, 0x9BFC, 0x5ED0, 0x9BFB, 0x5ED3, 0x8A66, - 0x5ED6, 0x9C40, 0x5EDA, 0x9C43, 0x5EDB, 0x9C44, 0x5EDD, 0x9C42, - 0x5EDF, 0x955F, 0x5EE0, 0x8FB1, 0x5EE1, 0x9C46, 0x5EE2, 0x9C45, - 0x5EE3, 0x9C41, 0x5EE8, 0x9C47, 0x5EE9, 0x9C48, 0x5EEC, 0x9C49, - 0x5EF0, 0x9C4C, 0x5EF1, 0x9C4A, 0x5EF3, 0x9C4B, 0x5EF4, 0x9C4D, - 0x5EF6, 0x8984, 0x5EF7, 0x92EC, 0x5EF8, 0x9C4E, 0x5EFA, 0x8C9A, - 0x5EFB, 0x89F4, 0x5EFC, 0x9455, 0x5EFE, 0x9C4F, 0x5EFF, 0x93F9, - 0x5F01, 0x95D9, 0x5F03, 0x9C50, 0x5F04, 0x984D, 0x5F09, 0x9C51, - 0x5F0A, 0x95BE, 0x5F0B, 0x9C54, 0x5F0C, 0x989F, 0x5F0D, 0x98AF, - 0x5F0F, 0x8EAE, 0x5F10, 0x93F3, 0x5F11, 0x9C55, 0x5F13, 0x8B7C, - 0x5F14, 0x92A2, 0x5F15, 0x88F8, 0x5F16, 0x9C56, 0x5F17, 0x95A4, - 0x5F18, 0x8D4F, 0x5F1B, 0x926F, 0x5F1F, 0x92ED, 0x5F21, 0xFAB7, - 0x5F25, 0x96ED, 0x5F26, 0x8CB7, 0x5F27, 0x8CCA, 0x5F29, 0x9C57, - 0x5F2D, 0x9C58, 0x5F2F, 0x9C5E, 0x5F31, 0x8EE3, 0x5F34, 0xFAB8, - 0x5F35, 0x92A3, 0x5F37, 0x8BAD, 0x5F38, 0x9C59, 0x5F3C, 0x954A, - 0x5F3E, 0x9265, 0x5F41, 0x9C5A, 0x5F45, 0xFA67, 0x5F48, 0x9C5B, - 0x5F4A, 0x8BAE, 0x5F4C, 0x9C5C, 0x5F4E, 0x9C5D, 0x5F51, 0x9C5F, - 0x5F53, 0x9396, 0x5F56, 0x9C60, 0x5F57, 0x9C61, 0x5F59, 0x9C62, - 0x5F5C, 0x9C53, 0x5F5D, 0x9C52, 0x5F61, 0x9C63, 0x5F62, 0x8C60, - 0x5F66, 0x9546, 0x5F67, 0xFAB9, 0x5F69, 0x8DCA, 0x5F6A, 0x9556, - 0x5F6B, 0x92A4, 0x5F6C, 0x956A, 0x5F6D, 0x9C64, 0x5F70, 0x8FB2, - 0x5F71, 0x8965, 0x5F73, 0x9C65, 0x5F77, 0x9C66, 0x5F79, 0x96F0, - 0x5F7C, 0x94DE, 0x5F7F, 0x9C69, 0x5F80, 0x899D, 0x5F81, 0x90AA, - 0x5F82, 0x9C68, 0x5F83, 0x9C67, 0x5F84, 0x8C61, 0x5F85, 0x91D2, - 0x5F87, 0x9C6D, 0x5F88, 0x9C6B, 0x5F8A, 0x9C6A, 0x5F8B, 0x97A5, - 0x5F8C, 0x8CE3, 0x5F90, 0x8F99, 0x5F91, 0x9C6C, 0x5F92, 0x936B, - 0x5F93, 0x8F5D, 0x5F97, 0x93BE, 0x5F98, 0x9C70, 0x5F99, 0x9C6F, - 0x5F9E, 0x9C6E, 0x5FA0, 0x9C71, 0x5FA1, 0x8CE4, 0x5FA8, 0x9C72, - 0x5FA9, 0x959C, 0x5FAA, 0x8F7A, 0x5FAD, 0x9C73, 0x5FAE, 0x94F7, - 0x5FB3, 0x93BF, 0x5FB4, 0x92A5, 0x5FB7, 0xFABA, 0x5FB9, 0x934F, - 0x5FBC, 0x9C74, 0x5FBD, 0x8B4A, 0x5FC3, 0x9053, 0x5FC5, 0x954B, - 0x5FCC, 0x8AF5, 0x5FCD, 0x9445, 0x5FD6, 0x9C75, 0x5FD7, 0x8E75, - 0x5FD8, 0x9659, 0x5FD9, 0x965A, 0x5FDC, 0x899E, 0x5FDD, 0x9C7A, - 0x5FDE, 0xFABB, 0x5FE0, 0x9289, 0x5FE4, 0x9C77, 0x5FEB, 0x89F5, - 0x5FF0, 0x9CAB, 0x5FF1, 0x9C79, 0x5FF5, 0x944F, 0x5FF8, 0x9C78, - 0x5FFB, 0x9C76, 0x5FFD, 0x8D9A, 0x5FFF, 0x9C7C, 0x600E, 0x9C83, - 0x600F, 0x9C89, 0x6010, 0x9C81, 0x6012, 0x937B, 0x6015, 0x9C86, - 0x6016, 0x957C, 0x6019, 0x9C80, 0x601B, 0x9C85, 0x601C, 0x97E5, - 0x601D, 0x8E76, 0x6020, 0x91D3, 0x6021, 0x9C7D, 0x6025, 0x8B7D, - 0x6026, 0x9C88, 0x6027, 0x90AB, 0x6028, 0x8985, 0x6029, 0x9C82, - 0x602A, 0x89F6, 0x602B, 0x9C87, 0x602F, 0x8BAF, 0x6031, 0x9C84, - 0x603A, 0x9C8A, 0x6041, 0x9C8C, 0x6042, 0x9C96, 0x6043, 0x9C94, - 0x6046, 0x9C91, 0x604A, 0x9C90, 0x604B, 0x97F6, 0x604D, 0x9C92, - 0x6050, 0x8BB0, 0x6052, 0x8D50, 0x6055, 0x8F9A, 0x6059, 0x9C99, - 0x605A, 0x9C8B, 0x605D, 0xFABC, 0x605F, 0x9C8F, 0x6060, 0x9C7E, - 0x6062, 0x89F8, 0x6063, 0x9C93, 0x6064, 0x9C95, 0x6065, 0x9270, - 0x6068, 0x8DA6, 0x6069, 0x89B6, 0x606A, 0x9C8D, 0x606B, 0x9C98, - 0x606C, 0x9C97, 0x606D, 0x8BB1, 0x606F, 0x91A7, 0x6070, 0x8A86, - 0x6075, 0x8C62, 0x6077, 0x9C8E, 0x6081, 0x9C9A, 0x6083, 0x9C9D, - 0x6084, 0x9C9F, 0x6085, 0xFABD, 0x6089, 0x8EBB, 0x608A, 0xFABE, - 0x608B, 0x9CA5, 0x608C, 0x92EE, 0x608D, 0x9C9B, 0x6092, 0x9CA3, - 0x6094, 0x89F7, 0x6096, 0x9CA1, 0x6097, 0x9CA2, 0x609A, 0x9C9E, - 0x609B, 0x9CA0, 0x609F, 0x8CE5, 0x60A0, 0x9749, 0x60A3, 0x8AB3, - 0x60A6, 0x8978, 0x60A7, 0x9CA4, 0x60A9, 0x9459, 0x60AA, 0x88AB, - 0x60B2, 0x94DF, 0x60B3, 0x9C7B, 0x60B4, 0x9CAA, 0x60B5, 0x9CAE, - 0x60B6, 0x96E3, 0x60B8, 0x9CA7, 0x60BC, 0x9389, 0x60BD, 0x9CAC, - 0x60C5, 0x8FEE, 0x60C6, 0x9CAD, 0x60C7, 0x93D5, 0x60D1, 0x9866, - 0x60D3, 0x9CA9, 0x60D5, 0xFAC0, 0x60D8, 0x9CAF, 0x60DA, 0x8D9B, - 0x60DC, 0x90C9, 0x60DE, 0xFABF, 0x60DF, 0x88D2, 0x60E0, 0x9CA8, - 0x60E1, 0x9CA6, 0x60E3, 0x9179, 0x60E7, 0x9C9C, 0x60E8, 0x8E53, - 0x60F0, 0x91C4, 0x60F1, 0x9CBB, 0x60F2, 0xFAC2, 0x60F3, 0x917A, - 0x60F4, 0x9CB6, 0x60F6, 0x9CB3, 0x60F7, 0x9CB4, 0x60F9, 0x8EE4, - 0x60FA, 0x9CB7, 0x60FB, 0x9CBA, 0x6100, 0x9CB5, 0x6101, 0x8F44, - 0x6103, 0x9CB8, 0x6106, 0x9CB2, 0x6108, 0x96FA, 0x6109, 0x96F9, - 0x610D, 0x9CBC, 0x610E, 0x9CBD, 0x610F, 0x88D3, 0x6111, 0xFAC3, - 0x6115, 0x9CB1, 0x611A, 0x8BF0, 0x611B, 0x88A4, 0x611F, 0x8AB4, - 0x6120, 0xFAC1, 0x6121, 0x9CB9, 0x6127, 0x9CC1, 0x6128, 0x9CC0, - 0x612C, 0x9CC5, 0x6130, 0xFAC5, 0x6134, 0x9CC6, 0x6137, 0xFAC4, - 0x613C, 0x9CC4, 0x613D, 0x9CC7, 0x613E, 0x9CBF, 0x613F, 0x9CC3, - 0x6142, 0x9CC8, 0x6144, 0x9CC9, 0x6147, 0x9CBE, 0x6148, 0x8E9C, - 0x614A, 0x9CC2, 0x614B, 0x91D4, 0x614C, 0x8D51, 0x614D, 0x9CB0, - 0x614E, 0x9054, 0x6153, 0x9CD6, 0x6155, 0x95E7, 0x6158, 0x9CCC, - 0x6159, 0x9CCD, 0x615A, 0x9CCE, 0x615D, 0x9CD5, 0x615F, 0x9CD4, - 0x6162, 0x969D, 0x6163, 0x8AB5, 0x6165, 0x9CD2, 0x6167, 0x8C64, - 0x6168, 0x8A53, 0x616B, 0x9CCF, 0x616E, 0x97B6, 0x616F, 0x9CD1, - 0x6170, 0x88D4, 0x6171, 0x9CD3, 0x6173, 0x9CCA, 0x6174, 0x9CD0, - 0x6175, 0x9CD7, 0x6176, 0x8C63, 0x6177, 0x9CCB, 0x617E, 0x977C, - 0x6182, 0x974A, 0x6187, 0x9CDA, 0x618A, 0x9CDE, 0x618E, 0x919E, - 0x6190, 0x97F7, 0x6191, 0x9CDF, 0x6194, 0x9CDC, 0x6196, 0x9CD9, - 0x6198, 0xFAC6, 0x6199, 0x9CD8, 0x619A, 0x9CDD, 0x61A4, 0x95AE, - 0x61A7, 0x93B2, 0x61A9, 0x8C65, 0x61AB, 0x9CE0, 0x61AC, 0x9CDB, - 0x61AE, 0x9CE1, 0x61B2, 0x8C9B, 0x61B6, 0x89AF, 0x61BA, 0x9CE9, - 0x61BE, 0x8AB6, 0x61C3, 0x9CE7, 0x61C6, 0x9CE8, 0x61C7, 0x8DA7, - 0x61C8, 0x9CE6, 0x61C9, 0x9CE4, 0x61CA, 0x9CE3, 0x61CB, 0x9CEA, - 0x61CC, 0x9CE2, 0x61CD, 0x9CEC, 0x61D0, 0x89F9, 0x61E3, 0x9CEE, - 0x61E6, 0x9CED, 0x61F2, 0x92A6, 0x61F4, 0x9CF1, 0x61F6, 0x9CEF, - 0x61F7, 0x9CE5, 0x61F8, 0x8C9C, 0x61FA, 0x9CF0, 0x61FC, 0x9CF4, - 0x61FD, 0x9CF3, 0x61FE, 0x9CF5, 0x61FF, 0x9CF2, 0x6200, 0x9CF6, - 0x6208, 0x9CF7, 0x6209, 0x9CF8, 0x620A, 0x95E8, 0x620C, 0x9CFA, - 0x620D, 0x9CF9, 0x620E, 0x8F5E, 0x6210, 0x90AC, 0x6211, 0x89E4, - 0x6212, 0x89FA, 0x6213, 0xFAC7, 0x6214, 0x9CFB, 0x6216, 0x88BD, - 0x621A, 0x90CA, 0x621B, 0x9CFC, 0x621D, 0xE6C1, 0x621E, 0x9D40, - 0x621F, 0x8C81, 0x6221, 0x9D41, 0x6226, 0x90ED, 0x622A, 0x9D42, - 0x622E, 0x9D43, 0x622F, 0x8B59, 0x6230, 0x9D44, 0x6232, 0x9D45, - 0x6233, 0x9D46, 0x6234, 0x91D5, 0x6238, 0x8CCB, 0x623B, 0x96DF, - 0x623F, 0x965B, 0x6240, 0x8F8A, 0x6241, 0x9D47, 0x6247, 0x90EE, - 0x6248, 0xE7BB, 0x6249, 0x94E0, 0x624B, 0x8EE8, 0x624D, 0x8DCB, - 0x624E, 0x9D48, 0x6253, 0x91C5, 0x6255, 0x95A5, 0x6258, 0x91EF, - 0x625B, 0x9D4B, 0x625E, 0x9D49, 0x6260, 0x9D4C, 0x6263, 0x9D4A, - 0x6268, 0x9D4D, 0x626E, 0x95AF, 0x6271, 0x88B5, 0x6276, 0x957D, - 0x6279, 0x94E1, 0x627C, 0x9D4E, 0x627E, 0x9D51, 0x627F, 0x8FB3, - 0x6280, 0x8B5A, 0x6282, 0x9D4F, 0x6283, 0x9D56, 0x6284, 0x8FB4, - 0x6289, 0x9D50, 0x628A, 0x9463, 0x6291, 0x977D, 0x6292, 0x9D52, - 0x6293, 0x9D53, 0x6294, 0x9D57, 0x6295, 0x938A, 0x6296, 0x9D54, - 0x6297, 0x8D52, 0x6298, 0x90DC, 0x629B, 0x9D65, 0x629C, 0x94B2, - 0x629E, 0x91F0, 0x62A6, 0xFAC8, 0x62AB, 0x94E2, 0x62AC, 0x9DAB, - 0x62B1, 0x95F8, 0x62B5, 0x92EF, 0x62B9, 0x9695, 0x62BB, 0x9D5A, - 0x62BC, 0x899F, 0x62BD, 0x928A, 0x62C2, 0x9D63, 0x62C5, 0x9253, - 0x62C6, 0x9D5D, 0x62C7, 0x9D64, 0x62C8, 0x9D5F, 0x62C9, 0x9D66, - 0x62CA, 0x9D62, 0x62CC, 0x9D61, 0x62CD, 0x948F, 0x62CF, 0x9D5B, - 0x62D0, 0x89FB, 0x62D1, 0x9D59, 0x62D2, 0x8B91, 0x62D3, 0x91F1, - 0x62D4, 0x9D55, 0x62D7, 0x9D58, 0x62D8, 0x8D53, 0x62D9, 0x90D9, - 0x62DB, 0x8FB5, 0x62DC, 0x9D60, 0x62DD, 0x9471, 0x62E0, 0x8B92, - 0x62E1, 0x8A67, 0x62EC, 0x8A87, 0x62ED, 0x9040, 0x62EE, 0x9D68, - 0x62EF, 0x9D6D, 0x62F1, 0x9D69, 0x62F3, 0x8C9D, 0x62F5, 0x9D6E, - 0x62F6, 0x8E41, 0x62F7, 0x8D89, 0x62FE, 0x8F45, 0x62FF, 0x9D5C, - 0x6301, 0x8E9D, 0x6302, 0x9D6B, 0x6307, 0x8E77, 0x6308, 0x9D6C, - 0x6309, 0x88C2, 0x630C, 0x9D67, 0x6311, 0x92A7, 0x6319, 0x8B93, - 0x631F, 0x8BB2, 0x6327, 0x9D6A, 0x6328, 0x88A5, 0x632B, 0x8DC1, - 0x632F, 0x9055, 0x633A, 0x92F0, 0x633D, 0x94D2, 0x633E, 0x9D70, - 0x633F, 0x917D, 0x6349, 0x91A8, 0x634C, 0x8E4A, 0x634D, 0x9D71, - 0x634F, 0x9D73, 0x6350, 0x9D6F, 0x6355, 0x95DF, 0x6357, 0x92BB, - 0x635C, 0x917B, 0x6367, 0x95F9, 0x6368, 0x8ECC, 0x6369, 0x9D80, - 0x636B, 0x9D7E, 0x636E, 0x9098, 0x6372, 0x8C9E, 0x6376, 0x9D78, - 0x6377, 0x8FB7, 0x637A, 0x93E6, 0x637B, 0x9450, 0x6380, 0x9D76, - 0x6383, 0x917C, 0x6388, 0x8EF6, 0x6389, 0x9D7B, 0x638C, 0x8FB6, - 0x638E, 0x9D75, 0x638F, 0x9D7A, 0x6392, 0x9472, 0x6396, 0x9D74, - 0x6398, 0x8C40, 0x639B, 0x8A7C, 0x639F, 0x9D7C, 0x63A0, 0x97A9, - 0x63A1, 0x8DCC, 0x63A2, 0x9254, 0x63A3, 0x9D79, 0x63A5, 0x90DA, - 0x63A7, 0x8D54, 0x63A8, 0x9084, 0x63A9, 0x8986, 0x63AA, 0x915B, - 0x63AB, 0x9D77, 0x63AC, 0x8B64, 0x63B2, 0x8C66, 0x63B4, 0x92CD, - 0x63B5, 0x9D7D, 0x63BB, 0x917E, 0x63BE, 0x9D81, 0x63C0, 0x9D83, - 0x63C3, 0x91B5, 0x63C4, 0x9D89, 0x63C6, 0x9D84, 0x63C9, 0x9D86, - 0x63CF, 0x9560, 0x63D0, 0x92F1, 0x63D2, 0x9D87, 0x63D6, 0x974B, - 0x63DA, 0x9767, 0x63DB, 0x8AB7, 0x63E1, 0x88AC, 0x63E3, 0x9D85, - 0x63E9, 0x9D82, 0x63EE, 0x8AF6, 0x63F4, 0x8987, 0x63F5, 0xFAC9, - 0x63F6, 0x9D88, 0x63FA, 0x9768, 0x6406, 0x9D8C, 0x640D, 0x91B9, - 0x640F, 0x9D93, 0x6413, 0x9D8D, 0x6416, 0x9D8A, 0x6417, 0x9D91, - 0x641C, 0x9D72, 0x6426, 0x9D8E, 0x6428, 0x9D92, 0x642C, 0x94C0, - 0x642D, 0x938B, 0x6434, 0x9D8B, 0x6436, 0x9D8F, 0x643A, 0x8C67, - 0x643E, 0x8DEF, 0x6442, 0x90DB, 0x644E, 0x9D97, 0x6458, 0x9345, - 0x6460, 0xFACA, 0x6467, 0x9D94, 0x6469, 0x9680, 0x646F, 0x9D95, - 0x6476, 0x9D96, 0x6478, 0x96CC, 0x647A, 0x90A0, 0x6483, 0x8C82, - 0x6488, 0x9D9D, 0x6492, 0x8E54, 0x6493, 0x9D9A, 0x6495, 0x9D99, - 0x649A, 0x9451, 0x649D, 0xFACB, 0x649E, 0x93B3, 0x64A4, 0x9350, - 0x64A5, 0x9D9B, 0x64A9, 0x9D9C, 0x64AB, 0x958F, 0x64AD, 0x9464, - 0x64AE, 0x8E42, 0x64B0, 0x90EF, 0x64B2, 0x966F, 0x64B9, 0x8A68, - 0x64BB, 0x9DA3, 0x64BC, 0x9D9E, 0x64C1, 0x9769, 0x64C2, 0x9DA5, - 0x64C5, 0x9DA1, 0x64C7, 0x9DA2, 0x64CD, 0x9180, 0x64CE, 0xFACC, - 0x64D2, 0x9DA0, 0x64D4, 0x9D5E, 0x64D8, 0x9DA4, 0x64DA, 0x9D9F, - 0x64E0, 0x9DA9, 0x64E1, 0x9DAA, 0x64E2, 0x9346, 0x64E3, 0x9DAC, - 0x64E6, 0x8E43, 0x64E7, 0x9DA7, 0x64EC, 0x8B5B, 0x64EF, 0x9DAD, - 0x64F1, 0x9DA6, 0x64F2, 0x9DB1, 0x64F4, 0x9DB0, 0x64F6, 0x9DAF, - 0x64FA, 0x9DB2, 0x64FD, 0x9DB4, 0x64FE, 0x8FEF, 0x6500, 0x9DB3, - 0x6505, 0x9DB7, 0x6518, 0x9DB5, 0x651C, 0x9DB6, 0x651D, 0x9D90, - 0x6523, 0x9DB9, 0x6524, 0x9DB8, 0x652A, 0x9D98, 0x652B, 0x9DBA, - 0x652C, 0x9DAE, 0x652F, 0x8E78, 0x6534, 0x9DBB, 0x6535, 0x9DBC, - 0x6536, 0x9DBE, 0x6537, 0x9DBD, 0x6538, 0x9DBF, 0x6539, 0x89FC, - 0x653B, 0x8D55, 0x653E, 0x95FA, 0x653F, 0x90AD, 0x6545, 0x8CCC, - 0x6548, 0x9DC1, 0x654D, 0x9DC4, 0x654E, 0xFACD, 0x654F, 0x9571, - 0x6551, 0x8B7E, 0x6555, 0x9DC3, 0x6556, 0x9DC2, 0x6557, 0x9473, - 0x6558, 0x9DC5, 0x6559, 0x8BB3, 0x655D, 0x9DC7, 0x655E, 0x9DC6, - 0x6562, 0x8AB8, 0x6563, 0x8E55, 0x6566, 0x93D6, 0x656C, 0x8C68, - 0x6570, 0x9094, 0x6572, 0x9DC8, 0x6574, 0x90AE, 0x6575, 0x9347, - 0x6577, 0x957E, 0x6578, 0x9DC9, 0x6582, 0x9DCA, 0x6583, 0x9DCB, - 0x6587, 0x95B6, 0x6588, 0x9B7C, 0x6589, 0x90C4, 0x658C, 0x956B, - 0x658E, 0x8DD6, 0x6590, 0x94E3, 0x6591, 0x94C1, 0x6597, 0x936C, - 0x6599, 0x97BF, 0x659B, 0x9DCD, 0x659C, 0x8ECE, 0x659F, 0x9DCE, - 0x65A1, 0x88B4, 0x65A4, 0x8BD2, 0x65A5, 0x90CB, 0x65A7, 0x9580, - 0x65AB, 0x9DCF, 0x65AC, 0x8E61, 0x65AD, 0x9266, 0x65AF, 0x8E7A, - 0x65B0, 0x9056, 0x65B7, 0x9DD0, 0x65B9, 0x95FB, 0x65BC, 0x8997, - 0x65BD, 0x8E7B, 0x65C1, 0x9DD3, 0x65C3, 0x9DD1, 0x65C4, 0x9DD4, - 0x65C5, 0x97B7, 0x65C6, 0x9DD2, 0x65CB, 0x90F9, 0x65CC, 0x9DD5, - 0x65CF, 0x91B0, 0x65D2, 0x9DD6, 0x65D7, 0x8AF8, 0x65D9, 0x9DD8, - 0x65DB, 0x9DD7, 0x65E0, 0x9DD9, 0x65E1, 0x9DDA, 0x65E2, 0x8AF9, - 0x65E5, 0x93FA, 0x65E6, 0x9255, 0x65E7, 0x8B8C, 0x65E8, 0x8E7C, - 0x65E9, 0x9181, 0x65EC, 0x8F7B, 0x65ED, 0x88AE, 0x65F1, 0x9DDB, - 0x65FA, 0x89A0, 0x65FB, 0x9DDF, 0x6600, 0xFACE, 0x6602, 0x8D56, - 0x6603, 0x9DDE, 0x6606, 0x8DA9, 0x6607, 0x8FB8, 0x6609, 0xFAD1, - 0x660A, 0x9DDD, 0x660C, 0x8FB9, 0x660E, 0x96BE, 0x660F, 0x8DA8, - 0x6613, 0x88D5, 0x6614, 0x90CC, 0x6615, 0xFACF, 0x661C, 0x9DE4, - 0x661E, 0xFAD3, 0x661F, 0x90AF, 0x6620, 0x8966, 0x6624, 0xFAD4, - 0x6625, 0x8F74, 0x6627, 0x9686, 0x6628, 0x8DF0, 0x662D, 0x8FBA, - 0x662E, 0xFAD2, 0x662F, 0x90A5, 0x6631, 0xFA63, 0x6634, 0x9DE3, - 0x6635, 0x9DE1, 0x6636, 0x9DE2, 0x663B, 0xFAD0, 0x663C, 0x928B, - 0x663F, 0x9E45, 0x6641, 0x9DE8, 0x6642, 0x8E9E, 0x6643, 0x8D57, - 0x6644, 0x9DE6, 0x6649, 0x9DE7, 0x664B, 0x9057, 0x664F, 0x9DE5, - 0x6652, 0x8E4E, 0x6657, 0xFAD6, 0x6659, 0xFAD7, 0x665D, 0x9DEA, - 0x665E, 0x9DE9, 0x665F, 0x9DEE, 0x6662, 0x9DEF, 0x6664, 0x9DEB, - 0x6665, 0xFAD5, 0x6666, 0x8A41, 0x6667, 0x9DEC, 0x6668, 0x9DED, - 0x6669, 0x94D3, 0x666E, 0x9581, 0x666F, 0x8C69, 0x6670, 0x9DF0, - 0x6673, 0xFAD9, 0x6674, 0x90B0, 0x6676, 0x8FBB, 0x667A, 0x9271, - 0x6681, 0x8BC5, 0x6683, 0x9DF1, 0x6684, 0x9DF5, 0x6687, 0x89C9, - 0x6688, 0x9DF2, 0x6689, 0x9DF4, 0x668E, 0x9DF3, 0x6691, 0x8F8B, - 0x6696, 0x9267, 0x6697, 0x88C3, 0x6698, 0x9DF6, 0x6699, 0xFADA, - 0x669D, 0x9DF7, 0x66A0, 0xFADB, 0x66A2, 0x92A8, 0x66A6, 0x97EF, - 0x66AB, 0x8E62, 0x66AE, 0x95E9, 0x66B2, 0xFADC, 0x66B4, 0x965C, - 0x66B8, 0x9E41, 0x66B9, 0x9DF9, 0x66BC, 0x9DFC, 0x66BE, 0x9DFB, - 0x66BF, 0xFADD, 0x66C1, 0x9DF8, 0x66C4, 0x9E40, 0x66C7, 0x93DC, - 0x66C9, 0x9DFA, 0x66D6, 0x9E42, 0x66D9, 0x8F8C, 0x66DA, 0x9E43, - 0x66DC, 0x976A, 0x66DD, 0x9498, 0x66E0, 0x9E44, 0x66E6, 0x9E46, - 0x66E9, 0x9E47, 0x66F0, 0x9E48, 0x66F2, 0x8BC8, 0x66F3, 0x8967, - 0x66F4, 0x8D58, 0x66F5, 0x9E49, 0x66F7, 0x9E4A, 0x66F8, 0x8F91, - 0x66F9, 0x9182, 0x66FA, 0xFADE, 0x66FB, 0xFA66, 0x66FC, 0x99D6, - 0x66FD, 0x915D, 0x66FE, 0x915C, 0x66FF, 0x91D6, 0x6700, 0x8DC5, - 0x6703, 0x98F0, 0x6708, 0x8C8E, 0x6709, 0x974C, 0x670B, 0x95FC, - 0x670D, 0x959E, 0x670E, 0xFADF, 0x670F, 0x9E4B, 0x6714, 0x8DF1, - 0x6715, 0x92BD, 0x6716, 0x9E4C, 0x6717, 0x984E, 0x671B, 0x965D, - 0x671D, 0x92A9, 0x671E, 0x9E4D, 0x671F, 0x8AFA, 0x6726, 0x9E4E, - 0x6727, 0x9E4F, 0x6728, 0x96D8, 0x672A, 0x96A2, 0x672B, 0x9696, - 0x672C, 0x967B, 0x672D, 0x8E44, 0x672E, 0x9E51, 0x6731, 0x8EE9, - 0x6734, 0x9670, 0x6736, 0x9E53, 0x6737, 0x9E56, 0x6738, 0x9E55, - 0x673A, 0x8AF7, 0x673D, 0x8B80, 0x673F, 0x9E52, 0x6741, 0x9E54, - 0x6746, 0x9E57, 0x6749, 0x9099, 0x674E, 0x979B, 0x674F, 0x88C7, - 0x6750, 0x8DDE, 0x6751, 0x91BA, 0x6753, 0x8EDB, 0x6756, 0x8FF1, - 0x6759, 0x9E5A, 0x675C, 0x936D, 0x675E, 0x9E58, 0x675F, 0x91A9, - 0x6760, 0x9E59, 0x6761, 0x8FF0, 0x6762, 0x96DB, 0x6763, 0x9E5B, - 0x6764, 0x9E5C, 0x6765, 0x9788, 0x6766, 0xFAE1, 0x676A, 0x9E61, - 0x676D, 0x8D59, 0x676F, 0x9474, 0x6770, 0x9E5E, 0x6771, 0x938C, - 0x6772, 0x9DDC, 0x6773, 0x9DE0, 0x6775, 0x8B6E, 0x6777, 0x9466, - 0x677C, 0x9E60, 0x677E, 0x8FBC, 0x677F, 0x94C2, 0x6785, 0x9E66, - 0x6787, 0x94F8, 0x6789, 0x9E5D, 0x678B, 0x9E63, 0x678C, 0x9E62, - 0x6790, 0x90CD, 0x6795, 0x968D, 0x6797, 0x97D1, 0x679A, 0x9687, - 0x679C, 0x89CA, 0x679D, 0x8E7D, 0x67A0, 0x9867, 0x67A1, 0x9E65, - 0x67A2, 0x9095, 0x67A6, 0x9E64, 0x67A9, 0x9E5F, 0x67AF, 0x8CCD, - 0x67B3, 0x9E6B, 0x67B4, 0x9E69, 0x67B6, 0x89CB, 0x67B7, 0x9E67, - 0x67B8, 0x9E6D, 0x67B9, 0x9E73, 0x67BB, 0xFAE2, 0x67C0, 0xFAE4, - 0x67C1, 0x91C6, 0x67C4, 0x95BF, 0x67C6, 0x9E75, 0x67CA, 0x9541, - 0x67CE, 0x9E74, 0x67CF, 0x9490, 0x67D0, 0x965E, 0x67D1, 0x8AB9, - 0x67D3, 0x90F5, 0x67D4, 0x8F5F, 0x67D8, 0x92D1, 0x67DA, 0x974D, - 0x67DD, 0x9E70, 0x67DE, 0x9E6F, 0x67E2, 0x9E71, 0x67E4, 0x9E6E, - 0x67E7, 0x9E76, 0x67E9, 0x9E6C, 0x67EC, 0x9E6A, 0x67EE, 0x9E72, - 0x67EF, 0x9E68, 0x67F1, 0x928C, 0x67F3, 0x96F6, 0x67F4, 0x8EC4, - 0x67F5, 0x8DF2, 0x67FB, 0x8DB8, 0x67FE, 0x968F, 0x67FF, 0x8A60, - 0x6801, 0xFAE5, 0x6802, 0x92CC, 0x6803, 0x93C8, 0x6804, 0x8968, - 0x6813, 0x90F0, 0x6816, 0x90B2, 0x6817, 0x8C49, 0x681E, 0x9E78, - 0x6821, 0x8D5A, 0x6822, 0x8A9C, 0x6829, 0x9E7A, 0x682A, 0x8A94, - 0x682B, 0x9E81, 0x6832, 0x9E7D, 0x6834, 0x90F1, 0x6838, 0x8A6A, - 0x6839, 0x8DAA, 0x683C, 0x8A69, 0x683D, 0x8DCD, 0x6840, 0x9E7B, - 0x6841, 0x8C85, 0x6842, 0x8C6A, 0x6843, 0x938D, 0x6844, 0xFAE6, - 0x6846, 0x9E79, 0x6848, 0x88C4, 0x684D, 0x9E7C, 0x684E, 0x9E7E, - 0x6850, 0x8BCB, 0x6851, 0x8C4B, 0x6852, 0xFAE3, 0x6853, 0x8ABA, - 0x6854, 0x8B6A, 0x6859, 0x9E82, 0x685C, 0x8DF7, 0x685D, 0x9691, - 0x685F, 0x8E56, 0x6863, 0x9E83, 0x6867, 0x954F, 0x6874, 0x9E8F, - 0x6876, 0x89B1, 0x6877, 0x9E84, 0x687E, 0x9E95, 0x687F, 0x9E85, - 0x6881, 0x97C0, 0x6883, 0x9E8C, 0x6885, 0x947E, 0x688D, 0x9E94, - 0x688F, 0x9E87, 0x6893, 0x88B2, 0x6894, 0x9E89, 0x6897, 0x8D5B, - 0x689B, 0x9E8B, 0x689D, 0x9E8A, 0x689F, 0x9E86, 0x68A0, 0x9E91, - 0x68A2, 0x8FBD, 0x68A6, 0x9AEB, 0x68A7, 0x8CE6, 0x68A8, 0x979C, - 0x68AD, 0x9E88, 0x68AF, 0x92F2, 0x68B0, 0x8A42, 0x68B1, 0x8DAB, - 0x68B3, 0x9E80, 0x68B5, 0x9E90, 0x68B6, 0x8A81, 0x68B9, 0x9E8E, - 0x68BA, 0x9E92, 0x68BC, 0x938E, 0x68C4, 0x8AFC, 0x68C6, 0x9EB0, - 0x68C8, 0xFA64, 0x68C9, 0x96C7, 0x68CA, 0x9E97, 0x68CB, 0x8AFB, - 0x68CD, 0x9E9E, 0x68CF, 0xFAE7, 0x68D2, 0x965F, 0x68D4, 0x9E9F, - 0x68D5, 0x9EA1, 0x68D7, 0x9EA5, 0x68D8, 0x9E99, 0x68DA, 0x9249, - 0x68DF, 0x938F, 0x68E0, 0x9EA9, 0x68E1, 0x9E9C, 0x68E3, 0x9EA6, - 0x68E7, 0x9EA0, 0x68EE, 0x9058, 0x68EF, 0x9EAA, 0x68F2, 0x90B1, - 0x68F9, 0x9EA8, 0x68FA, 0x8ABB, 0x6900, 0x986F, 0x6901, 0x9E96, - 0x6904, 0x9EA4, 0x6905, 0x88D6, 0x6908, 0x9E98, 0x690B, 0x96B8, - 0x690C, 0x9E9D, 0x690D, 0x9041, 0x690E, 0x92C5, 0x690F, 0x9E93, - 0x6912, 0x9EA3, 0x6919, 0x909A, 0x691A, 0x9EAD, 0x691B, 0x8A91, - 0x691C, 0x8C9F, 0x6921, 0x9EAF, 0x6922, 0x9E9A, 0x6923, 0x9EAE, - 0x6925, 0x9EA7, 0x6926, 0x9E9B, 0x6928, 0x9EAB, 0x692A, 0x9EAC, - 0x6930, 0x9EBD, 0x6934, 0x93CC, 0x6936, 0x9EA2, 0x6939, 0x9EB9, - 0x693D, 0x9EBB, 0x693F, 0x92D6, 0x694A, 0x976B, 0x6953, 0x9596, - 0x6954, 0x9EB6, 0x6955, 0x91C8, 0x6959, 0x9EBC, 0x695A, 0x915E, - 0x695C, 0x9EB3, 0x695D, 0x9EC0, 0x695E, 0x9EBF, 0x6960, 0x93ED, - 0x6961, 0x9EBE, 0x6962, 0x93E8, 0x6968, 0xFAE9, 0x696A, 0x9EC2, - 0x696B, 0x9EB5, 0x696D, 0x8BC6, 0x696E, 0x9EB8, 0x696F, 0x8F7C, - 0x6973, 0x9480, 0x6974, 0x9EBA, 0x6975, 0x8BC9, 0x6977, 0x9EB2, - 0x6978, 0x9EB4, 0x6979, 0x9EB1, 0x697C, 0x984F, 0x697D, 0x8A79, - 0x697E, 0x9EB7, 0x6981, 0x9EC1, 0x6982, 0x8A54, 0x698A, 0x8DE5, - 0x698E, 0x897C, 0x6991, 0x9ED2, 0x6994, 0x9850, 0x6995, 0x9ED5, - 0x6998, 0xFAEB, 0x699B, 0x9059, 0x699C, 0x9ED4, 0x69A0, 0x9ED3, - 0x69A7, 0x9ED0, 0x69AE, 0x9EC4, 0x69B1, 0x9EE1, 0x69B2, 0x9EC3, - 0x69B4, 0x9ED6, 0x69BB, 0x9ECE, 0x69BE, 0x9EC9, 0x69BF, 0x9EC6, - 0x69C1, 0x9EC7, 0x69C3, 0x9ECF, 0x69C7, 0xEAA0, 0x69CA, 0x9ECC, - 0x69CB, 0x8D5C, 0x69CC, 0x92C6, 0x69CD, 0x9184, 0x69CE, 0x9ECA, - 0x69D0, 0x9EC5, 0x69D3, 0x9EC8, 0x69D8, 0x976C, 0x69D9, 0x968A, - 0x69DD, 0x9ECD, 0x69DE, 0x9ED7, 0x69E2, 0xFAEC, 0x69E7, 0x9EDF, - 0x69E8, 0x9ED8, 0x69EB, 0x9EE5, 0x69ED, 0x9EE3, 0x69F2, 0x9EDE, - 0x69F9, 0x9EDD, 0x69FB, 0x92CE, 0x69FD, 0x9185, 0x69FF, 0x9EDB, - 0x6A02, 0x9ED9, 0x6A05, 0x9EE0, 0x6A0A, 0x9EE6, 0x6A0B, 0x94F3, - 0x6A0C, 0x9EEC, 0x6A12, 0x9EE7, 0x6A13, 0x9EEA, 0x6A14, 0x9EE4, - 0x6A17, 0x9294, 0x6A19, 0x9557, 0x6A1B, 0x9EDA, 0x6A1E, 0x9EE2, - 0x6A1F, 0x8FBE, 0x6A21, 0x96CD, 0x6A22, 0x9EF6, 0x6A23, 0x9EE9, - 0x6A29, 0x8CA0, 0x6A2A, 0x89A1, 0x6A2B, 0x8A7E, 0x6A2E, 0x9ED1, - 0x6A30, 0xFAED, 0x6A35, 0x8FBF, 0x6A36, 0x9EEE, 0x6A38, 0x9EF5, - 0x6A39, 0x8EF7, 0x6A3A, 0x8A92, 0x6A3D, 0x924D, 0x6A44, 0x9EEB, - 0x6A46, 0xFAEF, 0x6A47, 0x9EF0, 0x6A48, 0x9EF4, 0x6A4B, 0x8BB4, - 0x6A58, 0x8B6B, 0x6A59, 0x9EF2, 0x6A5F, 0x8B40, 0x6A61, 0x93C9, - 0x6A62, 0x9EF1, 0x6A66, 0x9EF3, 0x6A6B, 0xFAEE, 0x6A72, 0x9EED, - 0x6A73, 0xFAF0, 0x6A78, 0x9EEF, 0x6A7E, 0xFAF1, 0x6A7F, 0x8A80, - 0x6A80, 0x9268, 0x6A84, 0x9EFA, 0x6A8D, 0x9EF8, 0x6A8E, 0x8CE7, - 0x6A90, 0x9EF7, 0x6A97, 0x9F40, 0x6A9C, 0x9E77, 0x6AA0, 0x9EF9, - 0x6AA2, 0x9EFB, 0x6AA3, 0x9EFC, 0x6AAA, 0x9F4B, 0x6AAC, 0x9F47, - 0x6AAE, 0x9E8D, 0x6AB3, 0x9F46, 0x6AB8, 0x9F45, 0x6ABB, 0x9F42, - 0x6AC1, 0x9EE8, 0x6AC2, 0x9F44, 0x6AC3, 0x9F43, 0x6AD1, 0x9F49, - 0x6AD3, 0x9845, 0x6ADA, 0x9F4C, 0x6ADB, 0x8BF9, 0x6ADE, 0x9F48, - 0x6ADF, 0x9F4A, 0x6AE2, 0xFAF2, 0x6AE4, 0xFAF3, 0x6AE8, 0x94A5, - 0x6AEA, 0x9F4D, 0x6AFA, 0x9F51, 0x6AFB, 0x9F4E, 0x6B04, 0x9793, - 0x6B05, 0x9F4F, 0x6B0A, 0x9EDC, 0x6B12, 0x9F52, 0x6B16, 0x9F53, - 0x6B1D, 0x8954, 0x6B1F, 0x9F55, 0x6B20, 0x8C87, 0x6B21, 0x8E9F, - 0x6B23, 0x8BD3, 0x6B27, 0x89A2, 0x6B32, 0x977E, 0x6B37, 0x9F57, - 0x6B38, 0x9F56, 0x6B39, 0x9F59, 0x6B3A, 0x8B5C, 0x6B3D, 0x8BD4, - 0x6B3E, 0x8ABC, 0x6B43, 0x9F5C, 0x6B47, 0x9F5B, 0x6B49, 0x9F5D, - 0x6B4C, 0x89CC, 0x6B4E, 0x9256, 0x6B50, 0x9F5E, 0x6B53, 0x8ABD, - 0x6B54, 0x9F60, 0x6B59, 0x9F5F, 0x6B5B, 0x9F61, 0x6B5F, 0x9F62, - 0x6B61, 0x9F63, 0x6B62, 0x8E7E, 0x6B63, 0x90B3, 0x6B64, 0x8D9F, - 0x6B66, 0x9590, 0x6B69, 0x95E0, 0x6B6A, 0x9863, 0x6B6F, 0x8E95, - 0x6B73, 0x8DCE, 0x6B74, 0x97F0, 0x6B78, 0x9F64, 0x6B79, 0x9F65, - 0x6B7B, 0x8E80, 0x6B7F, 0x9F66, 0x6B80, 0x9F67, 0x6B83, 0x9F69, - 0x6B84, 0x9F68, 0x6B86, 0x9677, 0x6B89, 0x8F7D, 0x6B8A, 0x8EEA, - 0x6B8B, 0x8E63, 0x6B8D, 0x9F6A, 0x6B95, 0x9F6C, 0x6B96, 0x9042, - 0x6B98, 0x9F6B, 0x6B9E, 0x9F6D, 0x6BA4, 0x9F6E, 0x6BAA, 0x9F6F, - 0x6BAB, 0x9F70, 0x6BAF, 0x9F71, 0x6BB1, 0x9F73, 0x6BB2, 0x9F72, - 0x6BB3, 0x9F74, 0x6BB4, 0x89A3, 0x6BB5, 0x9269, 0x6BB7, 0x9F75, - 0x6BBA, 0x8E45, 0x6BBB, 0x8A6B, 0x6BBC, 0x9F76, 0x6BBF, 0x9361, - 0x6BC0, 0x9ACA, 0x6BC5, 0x8B42, 0x6BC6, 0x9F77, 0x6BCB, 0x9F78, - 0x6BCD, 0x95EA, 0x6BCE, 0x9688, 0x6BD2, 0x93C5, 0x6BD3, 0x9F79, - 0x6BD4, 0x94E4, 0x6BD6, 0xFAF4, 0x6BD8, 0x94F9, 0x6BDB, 0x96D1, - 0x6BDF, 0x9F7A, 0x6BEB, 0x9F7C, 0x6BEC, 0x9F7B, 0x6BEF, 0x9F7E, - 0x6BF3, 0x9F7D, 0x6C08, 0x9F81, 0x6C0F, 0x8E81, 0x6C11, 0x96AF, - 0x6C13, 0x9F82, 0x6C14, 0x9F83, 0x6C17, 0x8B43, 0x6C1B, 0x9F84, - 0x6C23, 0x9F86, 0x6C24, 0x9F85, 0x6C34, 0x9085, 0x6C37, 0x9558, - 0x6C38, 0x8969, 0x6C3E, 0x94C3, 0x6C3F, 0xFAF5, 0x6C40, 0x92F3, - 0x6C41, 0x8F60, 0x6C42, 0x8B81, 0x6C4E, 0x94C4, 0x6C50, 0x8EAC, - 0x6C55, 0x9F88, 0x6C57, 0x8ABE, 0x6C5A, 0x8998, 0x6C5C, 0xFAF6, - 0x6C5D, 0x93F0, 0x6C5E, 0x9F87, 0x6C5F, 0x8D5D, 0x6C60, 0x9272, - 0x6C62, 0x9F89, 0x6C68, 0x9F91, 0x6C6A, 0x9F8A, 0x6C6F, 0xFAF8, - 0x6C70, 0x91BF, 0x6C72, 0x8B82, 0x6C73, 0x9F92, 0x6C7A, 0x8C88, - 0x6C7D, 0x8B44, 0x6C7E, 0x9F90, 0x6C81, 0x9F8E, 0x6C82, 0x9F8B, - 0x6C83, 0x9780, 0x6C86, 0xFAF7, 0x6C88, 0x92BE, 0x6C8C, 0x93D7, - 0x6C8D, 0x9F8C, 0x6C90, 0x9F94, 0x6C92, 0x9F93, 0x6C93, 0x8C42, - 0x6C96, 0x89AB, 0x6C99, 0x8DB9, 0x6C9A, 0x9F8D, 0x6C9B, 0x9F8F, - 0x6CA1, 0x9676, 0x6CA2, 0x91F2, 0x6CAB, 0x9697, 0x6CAE, 0x9F9C, - 0x6CB1, 0x9F9D, 0x6CB3, 0x89CD, 0x6CB8, 0x95A6, 0x6CB9, 0x96FB, - 0x6CBA, 0x9F9F, 0x6CBB, 0x8EA1, 0x6CBC, 0x8FC0, 0x6CBD, 0x9F98, - 0x6CBE, 0x9F9E, 0x6CBF, 0x8988, 0x6CC1, 0x8BB5, 0x6CC4, 0x9F95, - 0x6CC5, 0x9F9A, 0x6CC9, 0x90F2, 0x6CCA, 0x9491, 0x6CCC, 0x94E5, - 0x6CD3, 0x9F97, 0x6CD5, 0x9640, 0x6CD7, 0x9F99, 0x6CD9, 0x9FA2, - 0x6CDA, 0xFAF9, 0x6CDB, 0x9FA0, 0x6CDD, 0x9F9B, 0x6CE1, 0x9641, - 0x6CE2, 0x9467, 0x6CE3, 0x8B83, 0x6CE5, 0x9344, 0x6CE8, 0x928D, - 0x6CEA, 0x9FA3, 0x6CEF, 0x9FA1, 0x6CF0, 0x91D7, 0x6CF1, 0x9F96, - 0x6CF3, 0x896A, 0x6D04, 0xFAFA, 0x6D0B, 0x976D, 0x6D0C, 0x9FAE, - 0x6D12, 0x9FAD, 0x6D17, 0x90F4, 0x6D19, 0x9FAA, 0x6D1B, 0x978C, - 0x6D1E, 0x93B4, 0x6D1F, 0x9FA4, 0x6D25, 0x92C3, 0x6D29, 0x896B, - 0x6D2A, 0x8D5E, 0x6D2B, 0x9FA7, 0x6D32, 0x8F46, 0x6D33, 0x9FAC, - 0x6D35, 0x9FAB, 0x6D36, 0x9FA6, 0x6D38, 0x9FA9, 0x6D3B, 0x8A88, - 0x6D3D, 0x9FA8, 0x6D3E, 0x9468, 0x6D41, 0x97AC, 0x6D44, 0x8FF2, - 0x6D45, 0x90F3, 0x6D59, 0x9FB4, 0x6D5A, 0x9FB2, 0x6D5C, 0x956C, - 0x6D63, 0x9FAF, 0x6D64, 0x9FB1, 0x6D66, 0x8959, 0x6D69, 0x8D5F, - 0x6D6A, 0x9851, 0x6D6C, 0x8A5C, 0x6D6E, 0x9582, 0x6D6F, 0xFAFC, - 0x6D74, 0x9781, 0x6D77, 0x8A43, 0x6D78, 0x905A, 0x6D79, 0x9FB3, - 0x6D85, 0x9FB8, 0x6D87, 0xFAFB, 0x6D88, 0x8FC1, 0x6D8C, 0x974F, - 0x6D8E, 0x9FB5, 0x6D93, 0x9FB0, 0x6D95, 0x9FB6, 0x6D96, 0xFB40, - 0x6D99, 0x97DC, 0x6D9B, 0x9393, 0x6D9C, 0x93C0, 0x6DAC, 0xFB41, - 0x6DAF, 0x8A55, 0x6DB2, 0x8974, 0x6DB5, 0x9FBC, 0x6DB8, 0x9FBF, - 0x6DBC, 0x97C1, 0x6DC0, 0x9784, 0x6DC5, 0x9FC6, 0x6DC6, 0x9FC0, - 0x6DC7, 0x9FBD, 0x6DCB, 0x97D2, 0x6DCC, 0x9FC3, 0x6DCF, 0xFB42, - 0x6DD1, 0x8F69, 0x6DD2, 0x9FC5, 0x6DD5, 0x9FCA, 0x6DD8, 0x9391, - 0x6DD9, 0x9FC8, 0x6DDE, 0x9FC2, 0x6DE1, 0x9257, 0x6DE4, 0x9FC9, - 0x6DE6, 0x9FBE, 0x6DE8, 0x9FC4, 0x6DEA, 0x9FCB, 0x6DEB, 0x88FA, - 0x6DEC, 0x9FC1, 0x6DEE, 0x9FCC, 0x6DF1, 0x905B, 0x6DF2, 0xFB44, - 0x6DF3, 0x8F7E, 0x6DF5, 0x95A3, 0x6DF7, 0x8DAC, 0x6DF8, 0xFB43, - 0x6DF9, 0x9FB9, 0x6DFA, 0x9FC7, 0x6DFB, 0x9359, 0x6DFC, 0xFB45, - 0x6E05, 0x90B4, 0x6E07, 0x8A89, 0x6E08, 0x8DCF, 0x6E09, 0x8FC2, - 0x6E0A, 0x9FBB, 0x6E0B, 0x8F61, 0x6E13, 0x8C6B, 0x6E15, 0x9FBA, - 0x6E19, 0x9FD0, 0x6E1A, 0x8F8D, 0x6E1B, 0x8CB8, 0x6E1D, 0x9FDF, - 0x6E1F, 0x9FD9, 0x6E20, 0x8B94, 0x6E21, 0x936E, 0x6E23, 0x9FD4, - 0x6E24, 0x9FDD, 0x6E25, 0x88AD, 0x6E26, 0x8951, 0x6E27, 0xFB48, - 0x6E29, 0x89B7, 0x6E2B, 0x9FD6, 0x6E2C, 0x91AA, 0x6E2D, 0x9FCD, - 0x6E2E, 0x9FCF, 0x6E2F, 0x8D60, 0x6E38, 0x9FE0, 0x6E39, 0xFB46, - 0x6E3A, 0x9FDB, 0x6E3C, 0xFB49, 0x6E3E, 0x9FD3, 0x6E43, 0x9FDA, - 0x6E4A, 0x96A9, 0x6E4D, 0x9FD8, 0x6E4E, 0x9FDC, 0x6E56, 0x8CCE, - 0x6E58, 0x8FC3, 0x6E5B, 0x9258, 0x6E5C, 0xFB47, 0x6E5F, 0x9FD2, - 0x6E67, 0x974E, 0x6E6B, 0x9FD5, 0x6E6E, 0x9FCE, 0x6E6F, 0x9392, - 0x6E72, 0x9FD1, 0x6E76, 0x9FD7, 0x6E7E, 0x9870, 0x6E7F, 0x8EBC, - 0x6E80, 0x969E, 0x6E82, 0x9FE1, 0x6E8C, 0x94AC, 0x6E8F, 0x9FED, - 0x6E90, 0x8CB9, 0x6E96, 0x8F80, 0x6E98, 0x9FE3, 0x6E9C, 0x97AD, - 0x6E9D, 0x8D61, 0x6E9F, 0x9FF0, 0x6EA2, 0x88EC, 0x6EA5, 0x9FEE, - 0x6EAA, 0x9FE2, 0x6EAF, 0x9FE8, 0x6EB2, 0x9FEA, 0x6EB6, 0x976E, - 0x6EB7, 0x9FE5, 0x6EBA, 0x934D, 0x6EBD, 0x9FE7, 0x6EBF, 0xFB4A, - 0x6EC2, 0x9FEF, 0x6EC4, 0x9FE9, 0x6EC5, 0x96C5, 0x6EC9, 0x9FE4, - 0x6ECB, 0x8EA0, 0x6ECC, 0x9FFC, 0x6ED1, 0x8A8A, 0x6ED3, 0x9FE6, - 0x6ED4, 0x9FEB, 0x6ED5, 0x9FEC, 0x6EDD, 0x91EA, 0x6EDE, 0x91D8, - 0x6EEC, 0x9FF4, 0x6EEF, 0x9FFA, 0x6EF2, 0x9FF8, 0x6EF4, 0x9348, - 0x6EF7, 0xE042, 0x6EF8, 0x9FF5, 0x6EFE, 0x9FF6, 0x6EFF, 0x9FDE, - 0x6F01, 0x8B99, 0x6F02, 0x9559, 0x6F06, 0x8EBD, 0x6F09, 0x8D97, - 0x6F0F, 0x9852, 0x6F11, 0x9FF2, 0x6F13, 0xE041, 0x6F14, 0x8989, - 0x6F15, 0x9186, 0x6F20, 0x9499, 0x6F22, 0x8ABF, 0x6F23, 0x97F8, - 0x6F2B, 0x969F, 0x6F2C, 0x92D0, 0x6F31, 0x9FF9, 0x6F32, 0x9FFB, - 0x6F38, 0x9151, 0x6F3E, 0xE040, 0x6F3F, 0x9FF7, 0x6F41, 0x9FF1, - 0x6F45, 0x8AC1, 0x6F54, 0x8C89, 0x6F58, 0xE04E, 0x6F5B, 0xE049, - 0x6F5C, 0x90F6, 0x6F5F, 0x8A83, 0x6F64, 0x8F81, 0x6F66, 0xE052, - 0x6F6D, 0xE04B, 0x6F6E, 0x92AA, 0x6F6F, 0xE048, 0x6F70, 0x92D7, - 0x6F74, 0xE06B, 0x6F78, 0xE045, 0x6F7A, 0xE044, 0x6F7C, 0xE04D, - 0x6F80, 0xE047, 0x6F81, 0xE046, 0x6F82, 0xE04C, 0x6F84, 0x909F, - 0x6F86, 0xE043, 0x6F88, 0xFB4B, 0x6F8E, 0xE04F, 0x6F91, 0xE050, - 0x6F97, 0x8AC0, 0x6FA1, 0xE055, 0x6FA3, 0xE054, 0x6FA4, 0xE056, - 0x6FAA, 0xE059, 0x6FB1, 0x9362, 0x6FB3, 0xE053, 0x6FB5, 0xFB4C, - 0x6FB9, 0xE057, 0x6FC0, 0x8C83, 0x6FC1, 0x91F7, 0x6FC2, 0xE051, - 0x6FC3, 0x945A, 0x6FC6, 0xE058, 0x6FD4, 0xE05D, 0x6FD5, 0xE05B, - 0x6FD8, 0xE05E, 0x6FDB, 0xE061, 0x6FDF, 0xE05A, 0x6FE0, 0x8D8A, - 0x6FE1, 0x9447, 0x6FE4, 0x9FB7, 0x6FEB, 0x9794, 0x6FEC, 0xE05C, - 0x6FEE, 0xE060, 0x6FEF, 0x91F3, 0x6FF1, 0xE05F, 0x6FF3, 0xE04A, - 0x6FF5, 0xFB4D, 0x6FF6, 0xE889, 0x6FFA, 0xE064, 0x6FFE, 0xE068, - 0x7001, 0xE066, 0x7005, 0xFB4E, 0x7007, 0xFB4F, 0x7009, 0xE062, - 0x700B, 0xE063, 0x700F, 0xE067, 0x7011, 0xE065, 0x7015, 0x956D, - 0x7018, 0xE06D, 0x701A, 0xE06A, 0x701B, 0xE069, 0x701D, 0xE06C, - 0x701E, 0x93D2, 0x701F, 0xE06E, 0x7026, 0x9295, 0x7027, 0x91EB, - 0x7028, 0xFB50, 0x702C, 0x90A3, 0x7030, 0xE06F, 0x7032, 0xE071, - 0x703E, 0xE070, 0x704C, 0x9FF3, 0x7051, 0xE072, 0x7058, 0x93E5, - 0x7063, 0xE073, 0x706B, 0x89CE, 0x706F, 0x9394, 0x7070, 0x8A44, - 0x7078, 0x8B84, 0x707C, 0x8EDC, 0x707D, 0x8DD0, 0x7085, 0xFB51, - 0x7089, 0x9846, 0x708A, 0x9086, 0x708E, 0x898A, 0x7092, 0xE075, - 0x7099, 0xE074, 0x70AB, 0xFB52, 0x70AC, 0xE078, 0x70AD, 0x9259, - 0x70AE, 0xE07B, 0x70AF, 0xE076, 0x70B3, 0xE07A, 0x70B8, 0xE079, - 0x70B9, 0x935F, 0x70BA, 0x88D7, 0x70BB, 0xFA62, 0x70C8, 0x97F3, - 0x70CB, 0xE07D, 0x70CF, 0x8947, 0x70D9, 0xE080, 0x70DD, 0xE07E, - 0x70DF, 0xE07C, 0x70F1, 0xE077, 0x70F9, 0x9642, 0x70FD, 0xE082, - 0x7104, 0xFB54, 0x7109, 0xE081, 0x710F, 0xFB53, 0x7114, 0x898B, - 0x7119, 0xE084, 0x711A, 0x95B0, 0x711C, 0xE083, 0x7121, 0x96B3, - 0x7126, 0x8FC5, 0x7136, 0x9152, 0x713C, 0x8FC4, 0x7146, 0xFB56, - 0x7147, 0xFB57, 0x7149, 0x97F9, 0x714C, 0xE08A, 0x714E, 0x90F7, - 0x7155, 0xE086, 0x7156, 0xE08B, 0x7159, 0x898C, 0x715C, 0xFB55, - 0x7162, 0xE089, 0x7164, 0x9481, 0x7165, 0xE085, 0x7166, 0xE088, - 0x7167, 0x8FC6, 0x7169, 0x94CF, 0x716C, 0xE08C, 0x716E, 0x8ECF, - 0x717D, 0x90F8, 0x7184, 0xE08F, 0x7188, 0xE087, 0x718A, 0x8C46, - 0x718F, 0xE08D, 0x7194, 0x976F, 0x7195, 0xE090, 0x7199, 0xEAA4, - 0x719F, 0x8F6E, 0x71A8, 0xE091, 0x71AC, 0xE092, 0x71B1, 0x944D, - 0x71B9, 0xE094, 0x71BE, 0xE095, 0x71C1, 0xFB59, 0x71C3, 0x9452, - 0x71C8, 0x9395, 0x71C9, 0xE097, 0x71CE, 0xE099, 0x71D0, 0x97D3, - 0x71D2, 0xE096, 0x71D4, 0xE098, 0x71D5, 0x898D, 0x71D7, 0xE093, - 0x71DF, 0x9A7A, 0x71E0, 0xE09A, 0x71E5, 0x9187, 0x71E6, 0x8E57, - 0x71E7, 0xE09C, 0x71EC, 0xE09B, 0x71ED, 0x9043, 0x71EE, 0x99D7, - 0x71F5, 0xE09D, 0x71F9, 0xE09F, 0x71FB, 0xE08E, 0x71FC, 0xE09E, - 0x71FE, 0xFB5A, 0x71FF, 0xE0A0, 0x7206, 0x949A, 0x720D, 0xE0A1, - 0x7210, 0xE0A2, 0x721B, 0xE0A3, 0x7228, 0xE0A4, 0x722A, 0x92DC, - 0x722C, 0xE0A6, 0x722D, 0xE0A5, 0x7230, 0xE0A7, 0x7232, 0xE0A8, - 0x7235, 0x8EDD, 0x7236, 0x9583, 0x723A, 0x96EA, 0x723B, 0xE0A9, - 0x723C, 0xE0AA, 0x723D, 0x9175, 0x723E, 0x8EA2, 0x723F, 0xE0AB, - 0x7240, 0xE0AC, 0x7246, 0xE0AD, 0x7247, 0x95D0, 0x7248, 0x94C5, - 0x724B, 0xE0AE, 0x724C, 0x9476, 0x7252, 0x92AB, 0x7258, 0xE0AF, - 0x7259, 0x89E5, 0x725B, 0x8B8D, 0x725D, 0x96C4, 0x725F, 0x96B4, - 0x7261, 0x89B2, 0x7262, 0x9853, 0x7267, 0x9671, 0x7269, 0x95A8, - 0x7272, 0x90B5, 0x7274, 0xE0B0, 0x7279, 0x93C1, 0x727D, 0x8CA1, - 0x727E, 0xE0B1, 0x7280, 0x8DD2, 0x7281, 0xE0B3, 0x7282, 0xE0B2, - 0x7287, 0xE0B4, 0x7292, 0xE0B5, 0x7296, 0xE0B6, 0x72A0, 0x8B5D, - 0x72A2, 0xE0B7, 0x72A7, 0xE0B8, 0x72AC, 0x8CA2, 0x72AF, 0x94C6, - 0x72B1, 0xFB5B, 0x72B2, 0xE0BA, 0x72B6, 0x8FF3, 0x72B9, 0xE0B9, - 0x72BE, 0xFB5C, 0x72C2, 0x8BB6, 0x72C3, 0xE0BB, 0x72C4, 0xE0BD, - 0x72C6, 0xE0BC, 0x72CE, 0xE0BE, 0x72D0, 0x8CCF, 0x72D2, 0xE0BF, - 0x72D7, 0x8BE7, 0x72D9, 0x915F, 0x72DB, 0x8D9D, 0x72E0, 0xE0C1, - 0x72E1, 0xE0C2, 0x72E2, 0xE0C0, 0x72E9, 0x8EEB, 0x72EC, 0x93C6, - 0x72ED, 0x8BB7, 0x72F7, 0xE0C4, 0x72F8, 0x924B, 0x72F9, 0xE0C3, - 0x72FC, 0x9854, 0x72FD, 0x9482, 0x730A, 0xE0C7, 0x7316, 0xE0C9, - 0x7317, 0xE0C6, 0x731B, 0x96D2, 0x731C, 0xE0C8, 0x731D, 0xE0CA, - 0x731F, 0x97C2, 0x7324, 0xFB5D, 0x7325, 0xE0CE, 0x7329, 0xE0CD, - 0x732A, 0x9296, 0x732B, 0x944C, 0x732E, 0x8CA3, 0x732F, 0xE0CC, - 0x7334, 0xE0CB, 0x7336, 0x9750, 0x7337, 0x9751, 0x733E, 0xE0CF, - 0x733F, 0x898E, 0x7344, 0x8D96, 0x7345, 0x8E82, 0x734E, 0xE0D0, - 0x734F, 0xE0D1, 0x7357, 0xE0D3, 0x7363, 0x8F62, 0x7368, 0xE0D5, - 0x736A, 0xE0D4, 0x7370, 0xE0D6, 0x7372, 0x8A6C, 0x7375, 0xE0D8, - 0x7377, 0xFB5F, 0x7378, 0xE0D7, 0x737A, 0xE0DA, 0x737B, 0xE0D9, - 0x7384, 0x8CBA, 0x7387, 0x97A6, 0x7389, 0x8BCA, 0x738B, 0x89A4, - 0x7396, 0x8BE8, 0x73A9, 0x8ADF, 0x73B2, 0x97E6, 0x73B3, 0xE0DC, - 0x73BB, 0xE0DE, 0x73BD, 0xFB60, 0x73C0, 0xE0DF, 0x73C2, 0x89CF, - 0x73C8, 0xE0DB, 0x73C9, 0xFB61, 0x73CA, 0x8E58, 0x73CD, 0x92BF, - 0x73CE, 0xE0DD, 0x73D2, 0xFB64, 0x73D6, 0xFB62, 0x73DE, 0xE0E2, - 0x73E0, 0x8EEC, 0x73E3, 0xFB63, 0x73E5, 0xE0E0, 0x73EA, 0x8C5D, - 0x73ED, 0x94C7, 0x73EE, 0xE0E1, 0x73F1, 0xE0FC, 0x73F5, 0xFB66, - 0x73F8, 0xE0E7, 0x73FE, 0x8CBB, 0x7403, 0x8B85, 0x7405, 0xE0E4, - 0x7406, 0x979D, 0x7407, 0xFB65, 0x7409, 0x97AE, 0x7422, 0x91F4, - 0x7425, 0xE0E6, 0x7426, 0xFB67, 0x7429, 0xFB69, 0x742A, 0xFB68, - 0x742E, 0xFB6A, 0x7432, 0xE0E8, 0x7433, 0x97D4, 0x7434, 0x8BD5, - 0x7435, 0x94FA, 0x7436, 0x9469, 0x743A, 0xE0E9, 0x743F, 0xE0EB, - 0x7441, 0xE0EE, 0x7455, 0xE0EA, 0x7459, 0xE0ED, 0x745A, 0x8CE8, - 0x745B, 0x896C, 0x745C, 0xE0EF, 0x745E, 0x9090, 0x745F, 0xE0EC, - 0x7460, 0x97DA, 0x7462, 0xFB6B, 0x7463, 0xE0F2, 0x7464, 0xEAA2, - 0x7469, 0xE0F0, 0x746A, 0xE0F3, 0x746F, 0xE0E5, 0x7470, 0xE0F1, - 0x7473, 0x8DBA, 0x7476, 0xE0F4, 0x747E, 0xE0F5, 0x7483, 0x979E, - 0x7489, 0xFB6C, 0x748B, 0xE0F6, 0x749E, 0xE0F7, 0x749F, 0xFB6D, - 0x74A2, 0xE0E3, 0x74A7, 0xE0F8, 0x74B0, 0x8AC2, 0x74BD, 0x8EA3, - 0x74CA, 0xE0F9, 0x74CF, 0xE0FA, 0x74D4, 0xE0FB, 0x74DC, 0x895A, - 0x74E0, 0xE140, 0x74E2, 0x955A, 0x74E3, 0xE141, 0x74E6, 0x8AA2, - 0x74E7, 0xE142, 0x74E9, 0xE143, 0x74EE, 0xE144, 0x74F0, 0xE146, - 0x74F1, 0xE147, 0x74F2, 0xE145, 0x74F6, 0x9572, 0x74F7, 0xE149, - 0x74F8, 0xE148, 0x7501, 0xFB6E, 0x7503, 0xE14B, 0x7504, 0xE14A, - 0x7505, 0xE14C, 0x750C, 0xE14D, 0x750D, 0xE14F, 0x750E, 0xE14E, - 0x7511, 0x8D99, 0x7513, 0xE151, 0x7515, 0xE150, 0x7518, 0x8AC3, - 0x751A, 0x9072, 0x751C, 0x935B, 0x751E, 0xE152, 0x751F, 0x90B6, - 0x7523, 0x8E59, 0x7525, 0x8999, 0x7526, 0xE153, 0x7528, 0x9770, - 0x752B, 0x95E1, 0x752C, 0xE154, 0x752F, 0xFAA8, 0x7530, 0x9363, - 0x7531, 0x9752, 0x7532, 0x8D62, 0x7533, 0x905C, 0x7537, 0x926A, - 0x7538, 0x99B2, 0x753A, 0x92AC, 0x753B, 0x89E6, 0x753C, 0xE155, - 0x7544, 0xE156, 0x7546, 0xE15B, 0x7549, 0xE159, 0x754A, 0xE158, - 0x754B, 0x9DC0, 0x754C, 0x8A45, 0x754D, 0xE157, 0x754F, 0x88D8, - 0x7551, 0x94A8, 0x7554, 0x94C8, 0x7559, 0x97AF, 0x755A, 0xE15C, - 0x755B, 0xE15A, 0x755C, 0x927B, 0x755D, 0x90A4, 0x7560, 0x94A9, - 0x7562, 0x954C, 0x7564, 0xE15E, 0x7565, 0x97AA, 0x7566, 0x8C6C, - 0x7567, 0xE15F, 0x7569, 0xE15D, 0x756A, 0x94D4, 0x756B, 0xE160, - 0x756D, 0xE161, 0x756F, 0xFB6F, 0x7570, 0x88D9, 0x7573, 0x8FF4, - 0x7574, 0xE166, 0x7576, 0xE163, 0x7577, 0x93EB, 0x7578, 0xE162, - 0x757F, 0x8B45, 0x7582, 0xE169, 0x7586, 0xE164, 0x7587, 0xE165, - 0x7589, 0xE168, 0x758A, 0xE167, 0x758B, 0x9544, 0x758E, 0x9161, - 0x758F, 0x9160, 0x7591, 0x8B5E, 0x7594, 0xE16A, 0x759A, 0xE16B, - 0x759D, 0xE16C, 0x75A3, 0xE16E, 0x75A5, 0xE16D, 0x75AB, 0x8975, - 0x75B1, 0xE176, 0x75B2, 0x94E6, 0x75B3, 0xE170, 0x75B5, 0xE172, - 0x75B8, 0xE174, 0x75B9, 0x905D, 0x75BC, 0xE175, 0x75BD, 0xE173, - 0x75BE, 0x8EBE, 0x75C2, 0xE16F, 0x75C3, 0xE171, 0x75C5, 0x9561, - 0x75C7, 0x8FC7, 0x75CA, 0xE178, 0x75CD, 0xE177, 0x75D2, 0xE179, - 0x75D4, 0x8EA4, 0x75D5, 0x8DAD, 0x75D8, 0x9397, 0x75D9, 0xE17A, - 0x75DB, 0x92C9, 0x75DE, 0xE17C, 0x75E2, 0x979F, 0x75E3, 0xE17B, - 0x75E9, 0x9189, 0x75F0, 0xE182, 0x75F2, 0xE184, 0x75F3, 0xE185, - 0x75F4, 0x9273, 0x75FA, 0xE183, 0x75FC, 0xE180, 0x75FE, 0xE17D, - 0x75FF, 0xE17E, 0x7601, 0xE181, 0x7609, 0xE188, 0x760B, 0xE186, - 0x760D, 0xE187, 0x761F, 0xE189, 0x7620, 0xE18B, 0x7621, 0xE18C, - 0x7622, 0xE18D, 0x7624, 0xE18E, 0x7627, 0xE18A, 0x7630, 0xE190, - 0x7634, 0xE18F, 0x763B, 0xE191, 0x7642, 0x97C3, 0x7646, 0xE194, - 0x7647, 0xE192, 0x7648, 0xE193, 0x764C, 0x8AE0, 0x7652, 0x96FC, - 0x7656, 0x95C8, 0x7658, 0xE196, 0x765C, 0xE195, 0x7661, 0xE197, - 0x7662, 0xE198, 0x7667, 0xE19C, 0x7668, 0xE199, 0x7669, 0xE19A, - 0x766A, 0xE19B, 0x766C, 0xE19D, 0x7670, 0xE19E, 0x7672, 0xE19F, - 0x7676, 0xE1A0, 0x7678, 0xE1A1, 0x767A, 0x94AD, 0x767B, 0x936F, - 0x767C, 0xE1A2, 0x767D, 0x9492, 0x767E, 0x9553, 0x7680, 0xE1A3, - 0x7682, 0xFB70, 0x7683, 0xE1A4, 0x7684, 0x9349, 0x7686, 0x8A46, - 0x7687, 0x8D63, 0x7688, 0xE1A5, 0x768B, 0xE1A6, 0x768E, 0xE1A7, - 0x7690, 0x8E48, 0x7693, 0xE1A9, 0x7696, 0xE1A8, 0x7699, 0xE1AA, - 0x769A, 0xE1AB, 0x769B, 0xFB73, 0x769C, 0xFB71, 0x769E, 0xFB72, - 0x76A6, 0xFB74, 0x76AE, 0x94E7, 0x76B0, 0xE1AC, 0x76B4, 0xE1AD, - 0x76B7, 0xEA89, 0x76B8, 0xE1AE, 0x76B9, 0xE1AF, 0x76BA, 0xE1B0, - 0x76BF, 0x8E4D, 0x76C2, 0xE1B1, 0x76C3, 0x9475, 0x76C6, 0x967E, - 0x76C8, 0x896D, 0x76CA, 0x8976, 0x76CD, 0xE1B2, 0x76D2, 0xE1B4, - 0x76D6, 0xE1B3, 0x76D7, 0x9390, 0x76DB, 0x90B7, 0x76DC, 0x9F58, - 0x76DE, 0xE1B5, 0x76DF, 0x96BF, 0x76E1, 0xE1B6, 0x76E3, 0x8AC4, - 0x76E4, 0x94D5, 0x76E5, 0xE1B7, 0x76E7, 0xE1B8, 0x76EA, 0xE1B9, - 0x76EE, 0x96DA, 0x76F2, 0x96D3, 0x76F4, 0x92BC, 0x76F8, 0x918A, - 0x76FB, 0xE1BB, 0x76FE, 0x8F82, 0x7701, 0x8FC8, 0x7704, 0xE1BE, - 0x7707, 0xE1BD, 0x7708, 0xE1BC, 0x7709, 0x94FB, 0x770B, 0x8AC5, - 0x770C, 0x8CA7, 0x771B, 0xE1C4, 0x771E, 0xE1C1, 0x771F, 0x905E, - 0x7720, 0x96B0, 0x7724, 0xE1C0, 0x7725, 0xE1C2, 0x7726, 0xE1C3, - 0x7729, 0xE1BF, 0x7737, 0xE1C5, 0x7738, 0xE1C6, 0x773A, 0x92AD, - 0x773C, 0x8AE1, 0x7740, 0x9285, 0x7746, 0xFB76, 0x7747, 0xE1C7, - 0x775A, 0xE1C8, 0x775B, 0xE1CB, 0x7761, 0x9087, 0x7763, 0x93C2, - 0x7765, 0xE1CC, 0x7766, 0x9672, 0x7768, 0xE1C9, 0x776B, 0xE1CA, - 0x7779, 0xE1CF, 0x777E, 0xE1CE, 0x777F, 0xE1CD, 0x778B, 0xE1D1, - 0x778E, 0xE1D0, 0x7791, 0xE1D2, 0x779E, 0xE1D4, 0x77A0, 0xE1D3, - 0x77A5, 0x95CB, 0x77AC, 0x8F75, 0x77AD, 0x97C4, 0x77B0, 0xE1D5, - 0x77B3, 0x93B5, 0x77B6, 0xE1D6, 0x77B9, 0xE1D7, 0x77BB, 0xE1DB, - 0x77BC, 0xE1D9, 0x77BD, 0xE1DA, 0x77BF, 0xE1D8, 0x77C7, 0xE1DC, - 0x77CD, 0xE1DD, 0x77D7, 0xE1DE, 0x77DA, 0xE1DF, 0x77DB, 0x96B5, - 0x77DC, 0xE1E0, 0x77E2, 0x96EE, 0x77E3, 0xE1E1, 0x77E5, 0x926D, - 0x77E7, 0x948A, 0x77E9, 0x8BE9, 0x77ED, 0x925A, 0x77EE, 0xE1E2, - 0x77EF, 0x8BB8, 0x77F3, 0x90CE, 0x77FC, 0xE1E3, 0x7802, 0x8DBB, - 0x780C, 0xE1E4, 0x7812, 0xE1E5, 0x7814, 0x8CA4, 0x7815, 0x8DD3, - 0x7820, 0xE1E7, 0x7821, 0xFB78, 0x7825, 0x9375, 0x7826, 0x8DD4, - 0x7827, 0x8B6D, 0x7832, 0x9643, 0x7834, 0x946A, 0x783A, 0x9376, - 0x783F, 0x8D7B, 0x7845, 0xE1E9, 0x784E, 0xFB79, 0x785D, 0x8FC9, - 0x7864, 0xFB7A, 0x786B, 0x97B0, 0x786C, 0x8D64, 0x786F, 0x8CA5, - 0x7872, 0x94A1, 0x7874, 0xE1EB, 0x787A, 0xFB7B, 0x787C, 0xE1ED, - 0x7881, 0x8CE9, 0x7886, 0xE1EC, 0x7887, 0x92F4, 0x788C, 0xE1EF, - 0x788D, 0x8A56, 0x788E, 0xE1EA, 0x7891, 0x94E8, 0x7893, 0x894F, - 0x7895, 0x8DEA, 0x7897, 0x9871, 0x789A, 0xE1EE, 0x78A3, 0xE1F0, - 0x78A7, 0x95C9, 0x78A9, 0x90D7, 0x78AA, 0xE1F2, 0x78AF, 0xE1F3, - 0x78B5, 0xE1F1, 0x78BA, 0x8A6D, 0x78BC, 0xE1F9, 0x78BE, 0xE1F8, - 0x78C1, 0x8EA5, 0x78C5, 0xE1FA, 0x78C6, 0xE1F5, 0x78CA, 0xE1FB, - 0x78CB, 0xE1F6, 0x78D0, 0x94D6, 0x78D1, 0xE1F4, 0x78D4, 0xE1F7, - 0x78DA, 0xE241, 0x78E7, 0xE240, 0x78E8, 0x9681, 0x78EC, 0xE1FC, - 0x78EF, 0x88E9, 0x78F4, 0xE243, 0x78FD, 0xE242, 0x7901, 0x8FCA, - 0x7907, 0xE244, 0x790E, 0x9162, 0x7911, 0xE246, 0x7912, 0xE245, - 0x7919, 0xE247, 0x7926, 0xE1E6, 0x792A, 0xE1E8, 0x792B, 0xE249, - 0x792C, 0xE248, 0x7930, 0xFB7C, 0x793A, 0x8EA6, 0x793C, 0x97E7, - 0x793E, 0x8ED0, 0x7940, 0xE24A, 0x7941, 0x8C56, 0x7947, 0x8B5F, - 0x7948, 0x8B46, 0x7949, 0x8E83, 0x7950, 0x9753, 0x7953, 0xE250, - 0x7955, 0xE24F, 0x7956, 0x9163, 0x7957, 0xE24C, 0x795A, 0xE24E, - 0x795D, 0x8F6A, 0x795E, 0x905F, 0x795F, 0xE24D, 0x7960, 0xE24B, - 0x7962, 0x9449, 0x7965, 0x8FCB, 0x7968, 0x955B, 0x796D, 0x8DD5, - 0x7977, 0x9398, 0x797A, 0xE251, 0x797F, 0xE252, 0x7980, 0xE268, - 0x7981, 0x8BD6, 0x7984, 0x985C, 0x7985, 0x9154, 0x798A, 0xE253, - 0x798D, 0x89D0, 0x798E, 0x92F5, 0x798F, 0x959F, 0x7994, 0xFB81, - 0x799B, 0xFB83, 0x799D, 0xE254, 0x79A6, 0x8B9A, 0x79A7, 0xE255, - 0x79AA, 0xE257, 0x79AE, 0xE258, 0x79B0, 0x9448, 0x79B3, 0xE259, - 0x79B9, 0xE25A, 0x79BA, 0xE25B, 0x79BD, 0x8BD7, 0x79BE, 0x89D1, - 0x79BF, 0x93C3, 0x79C0, 0x8F47, 0x79C1, 0x8E84, 0x79C9, 0xE25C, - 0x79CB, 0x8F48, 0x79D1, 0x89C8, 0x79D2, 0x9562, 0x79D5, 0xE25D, - 0x79D8, 0x94E9, 0x79DF, 0x9164, 0x79E1, 0xE260, 0x79E3, 0xE261, - 0x79E4, 0x9489, 0x79E6, 0x9060, 0x79E7, 0xE25E, 0x79E9, 0x9281, - 0x79EC, 0xE25F, 0x79F0, 0x8FCC, 0x79FB, 0x88DA, 0x7A00, 0x8B48, - 0x7A08, 0xE262, 0x7A0B, 0x92F6, 0x7A0D, 0xE263, 0x7A0E, 0x90C5, - 0x7A14, 0x96AB, 0x7A17, 0x9542, 0x7A18, 0xE264, 0x7A19, 0xE265, - 0x7A1A, 0x9274, 0x7A1C, 0x97C5, 0x7A1F, 0xE267, 0x7A20, 0xE266, - 0x7A2E, 0x8EED, 0x7A31, 0xE269, 0x7A32, 0x88EE, 0x7A37, 0xE26C, - 0x7A3B, 0xE26A, 0x7A3C, 0x89D2, 0x7A3D, 0x8C6D, 0x7A3E, 0xE26B, - 0x7A3F, 0x8D65, 0x7A40, 0x8D92, 0x7A42, 0x95E4, 0x7A43, 0xE26D, - 0x7A46, 0x9673, 0x7A49, 0xE26F, 0x7A4D, 0x90CF, 0x7A4E, 0x896E, - 0x7A4F, 0x89B8, 0x7A50, 0x88AA, 0x7A57, 0xE26E, 0x7A61, 0xE270, - 0x7A62, 0xE271, 0x7A63, 0x8FF5, 0x7A69, 0xE272, 0x7A6B, 0x8A6E, - 0x7A70, 0xE274, 0x7A74, 0x8C8A, 0x7A76, 0x8B86, 0x7A79, 0xE275, - 0x7A7A, 0x8BF3, 0x7A7D, 0xE276, 0x7A7F, 0x90FA, 0x7A81, 0x93CB, - 0x7A83, 0x90DE, 0x7A84, 0x8DF3, 0x7A88, 0xE277, 0x7A92, 0x9282, - 0x7A93, 0x918B, 0x7A95, 0xE279, 0x7A96, 0xE27B, 0x7A97, 0xE278, - 0x7A98, 0xE27A, 0x7A9F, 0x8C41, 0x7AA9, 0xE27C, 0x7AAA, 0x8C45, - 0x7AAE, 0x8B87, 0x7AAF, 0x9771, 0x7AB0, 0xE27E, 0x7AB6, 0xE280, - 0x7ABA, 0x894D, 0x7ABF, 0xE283, 0x7AC3, 0x8A96, 0x7AC4, 0xE282, - 0x7AC5, 0xE281, 0x7AC7, 0xE285, 0x7AC8, 0xE27D, 0x7ACA, 0xE286, - 0x7ACB, 0x97A7, 0x7ACD, 0xE287, 0x7ACF, 0xE288, 0x7AD1, 0xFB84, - 0x7AD2, 0x9AF2, 0x7AD3, 0xE28A, 0x7AD5, 0xE289, 0x7AD9, 0xE28B, - 0x7ADA, 0xE28C, 0x7ADC, 0x97B3, 0x7ADD, 0xE28D, 0x7ADF, 0xE8ED, - 0x7AE0, 0x8FCD, 0x7AE1, 0xE28E, 0x7AE2, 0xE28F, 0x7AE3, 0x8F76, - 0x7AE5, 0x93B6, 0x7AE6, 0xE290, 0x7AE7, 0xFB85, 0x7AEA, 0x9247, - 0x7AEB, 0xFB87, 0x7AED, 0xE291, 0x7AEF, 0x925B, 0x7AF0, 0xE292, - 0x7AF6, 0x8BA3, 0x7AF8, 0x995E, 0x7AF9, 0x927C, 0x7AFA, 0x8EB1, - 0x7AFF, 0x8AC6, 0x7B02, 0xE293, 0x7B04, 0xE2A0, 0x7B06, 0xE296, - 0x7B08, 0x8B88, 0x7B0A, 0xE295, 0x7B0B, 0xE2A2, 0x7B0F, 0xE294, - 0x7B11, 0x8FCE, 0x7B18, 0xE298, 0x7B19, 0xE299, 0x7B1B, 0x934A, - 0x7B1E, 0xE29A, 0x7B20, 0x8A7D, 0x7B25, 0x9079, 0x7B26, 0x9584, - 0x7B28, 0xE29C, 0x7B2C, 0x91E6, 0x7B33, 0xE297, 0x7B35, 0xE29B, - 0x7B36, 0xE29D, 0x7B39, 0x8DF9, 0x7B45, 0xE2A4, 0x7B46, 0x954D, - 0x7B48, 0x94A4, 0x7B49, 0x9399, 0x7B4B, 0x8BD8, 0x7B4C, 0xE2A3, - 0x7B4D, 0xE2A1, 0x7B4F, 0x94B3, 0x7B50, 0xE29E, 0x7B51, 0x927D, - 0x7B52, 0x939B, 0x7B54, 0x939A, 0x7B56, 0x8DF4, 0x7B5D, 0xE2B6, - 0x7B65, 0xE2A6, 0x7B67, 0xE2A8, 0x7B6C, 0xE2AB, 0x7B6E, 0xE2AC, - 0x7B70, 0xE2A9, 0x7B71, 0xE2AA, 0x7B74, 0xE2A7, 0x7B75, 0xE2A5, - 0x7B7A, 0xE29F, 0x7B86, 0x95CD, 0x7B87, 0x89D3, 0x7B8B, 0xE2B3, - 0x7B8D, 0xE2B0, 0x7B8F, 0xE2B5, 0x7B92, 0xE2B4, 0x7B94, 0x9493, - 0x7B95, 0x96A5, 0x7B97, 0x8E5A, 0x7B98, 0xE2AE, 0x7B99, 0xE2B7, - 0x7B9A, 0xE2B2, 0x7B9C, 0xE2B1, 0x7B9D, 0xE2AD, 0x7B9E, 0xFB88, - 0x7B9F, 0xE2AF, 0x7BA1, 0x8AC7, 0x7BAA, 0x925C, 0x7BAD, 0x90FB, - 0x7BB1, 0x94A0, 0x7BB4, 0xE2BC, 0x7BB8, 0x94A2, 0x7BC0, 0x90DF, - 0x7BC1, 0xE2B9, 0x7BC4, 0x94CD, 0x7BC6, 0xE2BD, 0x7BC7, 0x95D1, - 0x7BC9, 0x927A, 0x7BCB, 0xE2B8, 0x7BCC, 0xE2BA, 0x7BCF, 0xE2BB, - 0x7BDD, 0xE2BE, 0x7BE0, 0x8EC2, 0x7BE4, 0x93C4, 0x7BE5, 0xE2C3, - 0x7BE6, 0xE2C2, 0x7BE9, 0xE2BF, 0x7BED, 0x9855, 0x7BF3, 0xE2C8, - 0x7BF6, 0xE2CC, 0x7BF7, 0xE2C9, 0x7C00, 0xE2C5, 0x7C07, 0xE2C6, - 0x7C0D, 0xE2CB, 0x7C11, 0xE2C0, 0x7C12, 0x99D3, 0x7C13, 0xE2C7, - 0x7C14, 0xE2C1, 0x7C17, 0xE2CA, 0x7C1F, 0xE2D0, 0x7C21, 0x8AC8, - 0x7C23, 0xE2CD, 0x7C27, 0xE2CE, 0x7C2A, 0xE2CF, 0x7C2B, 0xE2D2, - 0x7C37, 0xE2D1, 0x7C38, 0x94F4, 0x7C3D, 0xE2D3, 0x7C3E, 0x97FA, - 0x7C3F, 0x95EB, 0x7C40, 0xE2D8, 0x7C43, 0xE2D5, 0x7C4C, 0xE2D4, - 0x7C4D, 0x90D0, 0x7C4F, 0xE2D7, 0x7C50, 0xE2D9, 0x7C54, 0xE2D6, - 0x7C56, 0xE2DD, 0x7C58, 0xE2DA, 0x7C5F, 0xE2DB, 0x7C60, 0xE2C4, - 0x7C64, 0xE2DC, 0x7C65, 0xE2DE, 0x7C6C, 0xE2DF, 0x7C73, 0x95C4, - 0x7C75, 0xE2E0, 0x7C7E, 0x96E0, 0x7C81, 0x8BCC, 0x7C82, 0x8C48, - 0x7C83, 0xE2E1, 0x7C89, 0x95B2, 0x7C8B, 0x9088, 0x7C8D, 0x96AE, - 0x7C90, 0xE2E2, 0x7C92, 0x97B1, 0x7C95, 0x9494, 0x7C97, 0x9165, - 0x7C98, 0x9453, 0x7C9B, 0x8F6C, 0x7C9F, 0x88BE, 0x7CA1, 0xE2E7, - 0x7CA2, 0xE2E5, 0x7CA4, 0xE2E3, 0x7CA5, 0x8A9F, 0x7CA7, 0x8FCF, - 0x7CA8, 0xE2E8, 0x7CAB, 0xE2E6, 0x7CAD, 0xE2E4, 0x7CAE, 0xE2EC, - 0x7CB1, 0xE2EB, 0x7CB2, 0xE2EA, 0x7CB3, 0xE2E9, 0x7CB9, 0xE2ED, - 0x7CBD, 0xE2EE, 0x7CBE, 0x90B8, 0x7CC0, 0xE2EF, 0x7CC2, 0xE2F1, - 0x7CC5, 0xE2F0, 0x7CCA, 0x8CD0, 0x7CCE, 0x9157, 0x7CD2, 0xE2F3, - 0x7CD6, 0x939C, 0x7CD8, 0xE2F2, 0x7CDC, 0xE2F4, 0x7CDE, 0x95B3, - 0x7CDF, 0x918C, 0x7CE0, 0x8D66, 0x7CE2, 0xE2F5, 0x7CE7, 0x97C6, - 0x7CEF, 0xE2F7, 0x7CF2, 0xE2F8, 0x7CF4, 0xE2F9, 0x7CF6, 0xE2FA, - 0x7CF8, 0x8E85, 0x7CFA, 0xE2FB, 0x7CFB, 0x8C6E, 0x7CFE, 0x8B8A, - 0x7D00, 0x8B49, 0x7D02, 0xE340, 0x7D04, 0x96F1, 0x7D05, 0x8D67, - 0x7D06, 0xE2FC, 0x7D0A, 0xE343, 0x7D0B, 0x96E4, 0x7D0D, 0x945B, - 0x7D10, 0x9552, 0x7D14, 0x8F83, 0x7D15, 0xE342, 0x7D17, 0x8ED1, - 0x7D18, 0x8D68, 0x7D19, 0x8E86, 0x7D1A, 0x8B89, 0x7D1B, 0x95B4, - 0x7D1C, 0xE341, 0x7D20, 0x9166, 0x7D21, 0x9661, 0x7D22, 0x8DF5, - 0x7D2B, 0x8E87, 0x7D2C, 0x92DB, 0x7D2E, 0xE346, 0x7D2F, 0x97DD, - 0x7D30, 0x8DD7, 0x7D32, 0xE347, 0x7D33, 0x9061, 0x7D35, 0xE349, - 0x7D39, 0x8FD0, 0x7D3A, 0x8DAE, 0x7D3F, 0xE348, 0x7D42, 0x8F49, - 0x7D43, 0x8CBC, 0x7D44, 0x9167, 0x7D45, 0xE344, 0x7D46, 0xE34A, - 0x7D48, 0xFB8A, 0x7D4B, 0xE345, 0x7D4C, 0x8C6F, 0x7D4E, 0xE34D, - 0x7D4F, 0xE351, 0x7D50, 0x8C8B, 0x7D56, 0xE34C, 0x7D5B, 0xE355, - 0x7D5C, 0xFB8B, 0x7D5E, 0x8D69, 0x7D61, 0x978D, 0x7D62, 0x88BA, - 0x7D63, 0xE352, 0x7D66, 0x8B8B, 0x7D68, 0xE34F, 0x7D6E, 0xE350, - 0x7D71, 0x939D, 0x7D72, 0xE34E, 0x7D73, 0xE34B, 0x7D75, 0x8A47, - 0x7D76, 0x90E2, 0x7D79, 0x8CA6, 0x7D7D, 0xE357, 0x7D89, 0xE354, - 0x7D8F, 0xE356, 0x7D93, 0xE353, 0x7D99, 0x8C70, 0x7D9A, 0x91B1, - 0x7D9B, 0xE358, 0x7D9C, 0x918E, 0x7D9F, 0xE365, 0x7DA0, 0xFB8D, - 0x7DA2, 0xE361, 0x7DA3, 0xE35B, 0x7DAB, 0xE35F, 0x7DAC, 0x8EF8, - 0x7DAD, 0x88DB, 0x7DAE, 0xE35A, 0x7DAF, 0xE362, 0x7DB0, 0xE366, - 0x7DB1, 0x8D6A, 0x7DB2, 0x96D4, 0x7DB4, 0x92D4, 0x7DB5, 0xE35C, - 0x7DB7, 0xFB8C, 0x7DB8, 0xE364, 0x7DBA, 0xE359, 0x7DBB, 0x925D, - 0x7DBD, 0xE35E, 0x7DBE, 0x88BB, 0x7DBF, 0x96C8, 0x7DC7, 0xE35D, - 0x7DCA, 0x8BD9, 0x7DCB, 0x94EA, 0x7DCF, 0x918D, 0x7DD1, 0x97CE, - 0x7DD2, 0x8F8F, 0x7DD5, 0xE38E, 0x7DD6, 0xFB8E, 0x7DD8, 0xE367, - 0x7DDA, 0x90FC, 0x7DDC, 0xE363, 0x7DDD, 0xE368, 0x7DDE, 0xE36A, - 0x7DE0, 0x92F7, 0x7DE1, 0xE36D, 0x7DE4, 0xE369, 0x7DE8, 0x95D2, - 0x7DE9, 0x8AC9, 0x7DEC, 0x96C9, 0x7DEF, 0x88DC, 0x7DF2, 0xE36C, - 0x7DF4, 0x97FB, 0x7DFB, 0xE36B, 0x7E01, 0x898F, 0x7E04, 0x93EA, - 0x7E05, 0xE36E, 0x7E09, 0xE375, 0x7E0A, 0xE36F, 0x7E0B, 0xE376, - 0x7E12, 0xE372, 0x7E1B, 0x949B, 0x7E1E, 0x8EC8, 0x7E1F, 0xE374, - 0x7E21, 0xE371, 0x7E22, 0xE377, 0x7E23, 0xE370, 0x7E26, 0x8F63, - 0x7E2B, 0x9644, 0x7E2E, 0x8F6B, 0x7E31, 0xE373, 0x7E32, 0xE380, - 0x7E35, 0xE37B, 0x7E37, 0xE37E, 0x7E39, 0xE37C, 0x7E3A, 0xE381, - 0x7E3B, 0xE37A, 0x7E3D, 0xE360, 0x7E3E, 0x90D1, 0x7E41, 0x94C9, - 0x7E43, 0xE37D, 0x7E46, 0xE378, 0x7E4A, 0x9140, 0x7E4B, 0x8C71, - 0x7E4D, 0x8F4A, 0x7E52, 0xFB8F, 0x7E54, 0x9044, 0x7E55, 0x9155, - 0x7E56, 0xE384, 0x7E59, 0xE386, 0x7E5A, 0xE387, 0x7E5D, 0xE383, - 0x7E5E, 0xE385, 0x7E66, 0xE379, 0x7E67, 0xE382, 0x7E69, 0xE38A, - 0x7E6A, 0xE389, 0x7E6D, 0x969A, 0x7E70, 0x8C4A, 0x7E79, 0xE388, - 0x7E7B, 0xE38C, 0x7E7C, 0xE38B, 0x7E7D, 0xE38F, 0x7E7F, 0xE391, - 0x7E82, 0x8E5B, 0x7E83, 0xE38D, 0x7E88, 0xE392, 0x7E89, 0xE393, - 0x7E8A, 0xFA5C, 0x7E8C, 0xE394, 0x7E8E, 0xE39A, 0x7E8F, 0x935A, - 0x7E90, 0xE396, 0x7E92, 0xE395, 0x7E93, 0xE397, 0x7E94, 0xE398, - 0x7E96, 0xE399, 0x7E9B, 0xE39B, 0x7E9C, 0xE39C, 0x7F36, 0x8ACA, - 0x7F38, 0xE39D, 0x7F3A, 0xE39E, 0x7F45, 0xE39F, 0x7F47, 0xFB90, - 0x7F4C, 0xE3A0, 0x7F4D, 0xE3A1, 0x7F4E, 0xE3A2, 0x7F50, 0xE3A3, - 0x7F51, 0xE3A4, 0x7F54, 0xE3A6, 0x7F55, 0xE3A5, 0x7F58, 0xE3A7, - 0x7F5F, 0xE3A8, 0x7F60, 0xE3A9, 0x7F67, 0xE3AC, 0x7F68, 0xE3AA, - 0x7F69, 0xE3AB, 0x7F6A, 0x8DDF, 0x7F6B, 0x8C72, 0x7F6E, 0x9275, - 0x7F70, 0x94B1, 0x7F72, 0x8F90, 0x7F75, 0x946C, 0x7F77, 0x94EB, - 0x7F78, 0xE3AD, 0x7F79, 0x9CEB, 0x7F82, 0xE3AE, 0x7F83, 0xE3B0, - 0x7F85, 0x9785, 0x7F86, 0xE3AF, 0x7F87, 0xE3B2, 0x7F88, 0xE3B1, - 0x7F8A, 0x9772, 0x7F8C, 0xE3B3, 0x7F8E, 0x94FC, 0x7F94, 0xE3B4, - 0x7F9A, 0xE3B7, 0x7F9D, 0xE3B6, 0x7F9E, 0xE3B5, 0x7FA1, 0xFB91, - 0x7FA3, 0xE3B8, 0x7FA4, 0x8C51, 0x7FA8, 0x9141, 0x7FA9, 0x8B60, - 0x7FAE, 0xE3BC, 0x7FAF, 0xE3B9, 0x7FB2, 0xE3BA, 0x7FB6, 0xE3BD, - 0x7FB8, 0xE3BE, 0x7FB9, 0xE3BB, 0x7FBD, 0x8948, 0x7FC1, 0x89A5, - 0x7FC5, 0xE3C0, 0x7FC6, 0xE3C1, 0x7FCA, 0xE3C2, 0x7FCC, 0x9782, - 0x7FD2, 0x8F4B, 0x7FD4, 0xE3C4, 0x7FD5, 0xE3C3, 0x7FE0, 0x9089, - 0x7FE1, 0xE3C5, 0x7FE6, 0xE3C6, 0x7FE9, 0xE3C7, 0x7FEB, 0x8AE3, - 0x7FF0, 0x8ACB, 0x7FF3, 0xE3C8, 0x7FF9, 0xE3C9, 0x7FFB, 0x967C, - 0x7FFC, 0x9783, 0x8000, 0x9773, 0x8001, 0x9856, 0x8003, 0x8D6C, - 0x8004, 0xE3CC, 0x8005, 0x8ED2, 0x8006, 0xE3CB, 0x800B, 0xE3CD, - 0x800C, 0x8EA7, 0x8010, 0x91CF, 0x8012, 0xE3CE, 0x8015, 0x8D6B, - 0x8017, 0x96D5, 0x8018, 0xE3CF, 0x8019, 0xE3D0, 0x801C, 0xE3D1, - 0x8021, 0xE3D2, 0x8028, 0xE3D3, 0x8033, 0x8EA8, 0x8036, 0x96EB, - 0x803B, 0xE3D5, 0x803D, 0x925E, 0x803F, 0xE3D4, 0x8046, 0xE3D7, - 0x804A, 0xE3D6, 0x8052, 0xE3D8, 0x8056, 0x90B9, 0x8058, 0xE3D9, - 0x805A, 0xE3DA, 0x805E, 0x95B7, 0x805F, 0xE3DB, 0x8061, 0x918F, - 0x8062, 0xE3DC, 0x8068, 0xE3DD, 0x806F, 0x97FC, 0x8070, 0xE3E0, - 0x8072, 0xE3DF, 0x8073, 0xE3DE, 0x8074, 0x92AE, 0x8076, 0xE3E1, - 0x8077, 0x9045, 0x8079, 0xE3E2, 0x807D, 0xE3E3, 0x807E, 0x9857, - 0x807F, 0xE3E4, 0x8084, 0xE3E5, 0x8085, 0xE3E7, 0x8086, 0xE3E6, - 0x8087, 0x94A3, 0x8089, 0x93F7, 0x808B, 0x985D, 0x808C, 0x94A7, - 0x8093, 0xE3E9, 0x8096, 0x8FD1, 0x8098, 0x9549, 0x809A, 0xE3EA, - 0x809B, 0xE3E8, 0x809D, 0x8ACC, 0x80A1, 0x8CD2, 0x80A2, 0x8E88, - 0x80A5, 0x94EC, 0x80A9, 0x8CA8, 0x80AA, 0x9662, 0x80AC, 0xE3ED, - 0x80AD, 0xE3EB, 0x80AF, 0x8D6D, 0x80B1, 0x8D6E, 0x80B2, 0x88E7, - 0x80B4, 0x8DE6, 0x80BA, 0x9478, 0x80C3, 0x88DD, 0x80C4, 0xE3F2, - 0x80C6, 0x925F, 0x80CC, 0x9477, 0x80CE, 0x91D9, 0x80D6, 0xE3F4, - 0x80D9, 0xE3F0, 0x80DA, 0xE3F3, 0x80DB, 0xE3EE, 0x80DD, 0xE3F1, - 0x80DE, 0x9645, 0x80E1, 0x8CD3, 0x80E4, 0x88FB, 0x80E5, 0xE3EF, - 0x80EF, 0xE3F6, 0x80F1, 0xE3F7, 0x80F4, 0x93B7, 0x80F8, 0x8BB9, - 0x80FC, 0xE445, 0x80FD, 0x945C, 0x8102, 0x8E89, 0x8105, 0x8BBA, - 0x8106, 0x90C6, 0x8107, 0x9865, 0x8108, 0x96AC, 0x8109, 0xE3F5, - 0x810A, 0x90D2, 0x811A, 0x8B72, 0x811B, 0xE3F8, 0x8123, 0xE3FA, - 0x8129, 0xE3F9, 0x812F, 0xE3FB, 0x8131, 0x9245, 0x8133, 0x945D, - 0x8139, 0x92AF, 0x813E, 0xE442, 0x8146, 0xE441, 0x814B, 0xE3FC, - 0x814E, 0x9074, 0x8150, 0x9585, 0x8151, 0xE444, 0x8153, 0xE443, - 0x8154, 0x8D6F, 0x8155, 0x9872, 0x815F, 0xE454, 0x8165, 0xE448, - 0x8166, 0xE449, 0x816B, 0x8EEE, 0x816E, 0xE447, 0x8170, 0x8D98, - 0x8171, 0xE446, 0x8174, 0xE44A, 0x8178, 0x92B0, 0x8179, 0x95A0, - 0x817A, 0x9142, 0x817F, 0x91DA, 0x8180, 0xE44E, 0x8182, 0xE44F, - 0x8183, 0xE44B, 0x8188, 0xE44C, 0x818A, 0xE44D, 0x818F, 0x8D70, - 0x8193, 0xE455, 0x8195, 0xE451, 0x819A, 0x9586, 0x819C, 0x968C, - 0x819D, 0x9547, 0x81A0, 0xE450, 0x81A3, 0xE453, 0x81A4, 0xE452, - 0x81A8, 0x9663, 0x81A9, 0xE456, 0x81B0, 0xE457, 0x81B3, 0x9156, - 0x81B5, 0xE458, 0x81B8, 0xE45A, 0x81BA, 0xE45E, 0x81BD, 0xE45B, - 0x81BE, 0xE459, 0x81BF, 0x945E, 0x81C0, 0xE45C, 0x81C2, 0xE45D, - 0x81C6, 0x89B0, 0x81C8, 0xE464, 0x81C9, 0xE45F, 0x81CD, 0xE460, - 0x81D1, 0xE461, 0x81D3, 0x919F, 0x81D8, 0xE463, 0x81D9, 0xE462, - 0x81DA, 0xE465, 0x81DF, 0xE466, 0x81E0, 0xE467, 0x81E3, 0x9062, - 0x81E5, 0x89E7, 0x81E7, 0xE468, 0x81E8, 0x97D5, 0x81EA, 0x8EA9, - 0x81ED, 0x8F4C, 0x81F3, 0x8E8A, 0x81F4, 0x9276, 0x81FA, 0xE469, - 0x81FB, 0xE46A, 0x81FC, 0x8950, 0x81FE, 0xE46B, 0x8201, 0xE46C, - 0x8202, 0xE46D, 0x8205, 0xE46E, 0x8207, 0xE46F, 0x8208, 0x8BBB, - 0x8209, 0x9DA8, 0x820A, 0xE470, 0x820C, 0x90E3, 0x820D, 0xE471, - 0x820E, 0x8EC9, 0x8210, 0xE472, 0x8212, 0x98AE, 0x8216, 0xE473, - 0x8217, 0x95DC, 0x8218, 0x8ADA, 0x821B, 0x9143, 0x821C, 0x8F77, - 0x821E, 0x9591, 0x821F, 0x8F4D, 0x8229, 0xE474, 0x822A, 0x8D71, - 0x822B, 0xE475, 0x822C, 0x94CA, 0x822E, 0xE484, 0x8233, 0xE477, - 0x8235, 0x91C7, 0x8236, 0x9495, 0x8237, 0x8CBD, 0x8238, 0xE476, - 0x8239, 0x9144, 0x8240, 0xE478, 0x8247, 0x92F8, 0x8258, 0xE47A, - 0x8259, 0xE479, 0x825A, 0xE47C, 0x825D, 0xE47B, 0x825F, 0xE47D, - 0x8262, 0xE480, 0x8264, 0xE47E, 0x8266, 0x8ACD, 0x8268, 0xE481, - 0x826A, 0xE482, 0x826B, 0xE483, 0x826E, 0x8DAF, 0x826F, 0x97C7, - 0x8271, 0xE485, 0x8272, 0x9046, 0x8276, 0x8990, 0x8277, 0xE486, - 0x8278, 0xE487, 0x827E, 0xE488, 0x828B, 0x88F0, 0x828D, 0xE489, - 0x8292, 0xE48A, 0x8299, 0x9587, 0x829D, 0x8EC5, 0x829F, 0xE48C, - 0x82A5, 0x8A48, 0x82A6, 0x88B0, 0x82AB, 0xE48B, 0x82AC, 0xE48E, - 0x82AD, 0x946D, 0x82AF, 0x9063, 0x82B1, 0x89D4, 0x82B3, 0x9646, - 0x82B8, 0x8C7C, 0x82B9, 0x8BDA, 0x82BB, 0xE48D, 0x82BD, 0x89E8, - 0x82C5, 0x8AA1, 0x82D1, 0x8991, 0x82D2, 0xE492, 0x82D3, 0x97E8, - 0x82D4, 0x91DB, 0x82D7, 0x9563, 0x82D9, 0xE49E, 0x82DB, 0x89D5, - 0x82DC, 0xE49C, 0x82DE, 0xE49A, 0x82DF, 0xE491, 0x82E1, 0xE48F, - 0x82E3, 0xE490, 0x82E5, 0x8EE1, 0x82E6, 0x8BEA, 0x82E7, 0x9297, - 0x82EB, 0x93CF, 0x82F1, 0x8970, 0x82F3, 0xE494, 0x82F4, 0xE493, - 0x82F9, 0xE499, 0x82FA, 0xE495, 0x82FB, 0xE498, 0x8301, 0xFB93, - 0x8302, 0x96CE, 0x8303, 0xE497, 0x8304, 0x89D6, 0x8305, 0x8A9D, - 0x8306, 0xE49B, 0x8309, 0xE49D, 0x830E, 0x8C73, 0x8316, 0xE4A1, - 0x8317, 0xE4AA, 0x8318, 0xE4AB, 0x831C, 0x88A9, 0x8323, 0xE4B2, - 0x8328, 0x88EF, 0x832B, 0xE4A9, 0x832F, 0xE4A8, 0x8331, 0xE4A3, - 0x8332, 0xE4A2, 0x8334, 0xE4A0, 0x8335, 0xE49F, 0x8336, 0x9283, - 0x8338, 0x91F9, 0x8339, 0xE4A5, 0x8340, 0xE4A4, 0x8345, 0xE4A7, - 0x8349, 0x9190, 0x834A, 0x8C74, 0x834F, 0x8960, 0x8350, 0xE4A6, - 0x8352, 0x8D72, 0x8358, 0x9191, 0x8362, 0xFB94, 0x8373, 0xE4B8, - 0x8375, 0xE4B9, 0x8377, 0x89D7, 0x837B, 0x89AC, 0x837C, 0xE4B6, - 0x837F, 0xFB95, 0x8385, 0xE4AC, 0x8387, 0xE4B4, 0x8389, 0xE4BB, - 0x838A, 0xE4B5, 0x838E, 0xE4B3, 0x8393, 0xE496, 0x8396, 0xE4B1, - 0x839A, 0xE4AD, 0x839E, 0x8ACE, 0x839F, 0xE4AF, 0x83A0, 0xE4BA, - 0x83A2, 0xE4B0, 0x83A8, 0xE4BC, 0x83AA, 0xE4AE, 0x83AB, 0x949C, - 0x83B1, 0x9789, 0x83B5, 0xE4B7, 0x83BD, 0xE4CD, 0x83C1, 0xE4C5, - 0x83C5, 0x909B, 0x83C7, 0xFB96, 0x83CA, 0x8B65, 0x83CC, 0x8BDB, - 0x83CE, 0xE4C0, 0x83D3, 0x89D9, 0x83D6, 0x8FD2, 0x83D8, 0xE4C3, - 0x83DC, 0x8DD8, 0x83DF, 0x9370, 0x83E0, 0xE4C8, 0x83E9, 0x95EC, - 0x83EB, 0xE4BF, 0x83EF, 0x89D8, 0x83F0, 0x8CD4, 0x83F1, 0x9548, - 0x83F2, 0xE4C9, 0x83F4, 0xE4BD, 0x83F6, 0xFB97, 0x83F7, 0xE4C6, - 0x83FB, 0xE4D0, 0x83FD, 0xE4C1, 0x8403, 0xE4C2, 0x8404, 0x93B8, - 0x8407, 0xE4C7, 0x840B, 0xE4C4, 0x840C, 0x9647, 0x840D, 0xE4CA, - 0x840E, 0x88DE, 0x8413, 0xE4BE, 0x8420, 0xE4CC, 0x8422, 0xE4CB, - 0x8429, 0x948B, 0x842A, 0xE4D2, 0x842C, 0xE4DD, 0x8431, 0x8A9E, - 0x8435, 0xE4E0, 0x8438, 0xE4CE, 0x843C, 0xE4D3, 0x843D, 0x978E, - 0x8446, 0xE4DC, 0x8448, 0xFB98, 0x8449, 0x9774, 0x844E, 0x97A8, - 0x8457, 0x9298, 0x845B, 0x8A8B, 0x8461, 0x9592, 0x8462, 0xE4E2, - 0x8463, 0x939F, 0x8466, 0x88AF, 0x8469, 0xE4DB, 0x846B, 0xE4D7, - 0x846C, 0x9192, 0x846D, 0xE4D1, 0x846E, 0xE4D9, 0x846F, 0xE4DE, - 0x8471, 0x944B, 0x8475, 0x88A8, 0x8477, 0xE4D6, 0x8479, 0xE4DF, - 0x847A, 0x9598, 0x8482, 0xE4DA, 0x8484, 0xE4D5, 0x848B, 0x8FD3, - 0x8490, 0x8F4E, 0x8494, 0x8EAA, 0x8499, 0x96D6, 0x849C, 0x9566, - 0x849F, 0xE4E5, 0x84A1, 0xE4EE, 0x84AD, 0xE4D8, 0x84B2, 0x8A97, - 0x84B4, 0xFB99, 0x84B8, 0x8FF6, 0x84B9, 0xE4E3, 0x84BB, 0xE4E8, - 0x84BC, 0x9193, 0x84BF, 0xE4E4, 0x84C1, 0xE4EB, 0x84C4, 0x927E, - 0x84C6, 0xE4EC, 0x84C9, 0x9775, 0x84CA, 0xE4E1, 0x84CB, 0x8A57, - 0x84CD, 0xE4E7, 0x84D0, 0xE4EA, 0x84D1, 0x96AA, 0x84D6, 0xE4ED, - 0x84D9, 0xE4E6, 0x84DA, 0xE4E9, 0x84DC, 0xFA60, 0x84EC, 0x9648, - 0x84EE, 0x9840, 0x84F4, 0xE4F1, 0x84FC, 0xE4F8, 0x84FF, 0xE4F0, - 0x8500, 0x8EC1, 0x8506, 0xE4CF, 0x8511, 0x95CC, 0x8513, 0x96A0, - 0x8514, 0xE4F7, 0x8515, 0xE4F6, 0x8517, 0xE4F2, 0x8518, 0xE4F3, - 0x851A, 0x8955, 0x851F, 0xE4F5, 0x8521, 0xE4EF, 0x8526, 0x92D3, - 0x852C, 0xE4F4, 0x852D, 0x88FC, 0x8535, 0x91A0, 0x853D, 0x95C1, - 0x8540, 0xE4F9, 0x8541, 0xE540, 0x8543, 0x94D7, 0x8548, 0xE4FC, - 0x8549, 0x8FD4, 0x854A, 0x8EC7, 0x854B, 0xE542, 0x854E, 0x8BBC, - 0x8553, 0xFB9A, 0x8555, 0xE543, 0x8557, 0x9599, 0x8558, 0xE4FB, - 0x8559, 0xFB9B, 0x855A, 0xE4D4, 0x8563, 0xE4FA, 0x8568, 0x986E, - 0x8569, 0x93A0, 0x856A, 0x9593, 0x856B, 0xFB9C, 0x856D, 0xE54A, - 0x8577, 0xE550, 0x857E, 0xE551, 0x8580, 0xE544, 0x8584, 0x9496, - 0x8587, 0xE54E, 0x8588, 0xE546, 0x858A, 0xE548, 0x8590, 0xE552, - 0x8591, 0xE547, 0x8594, 0xE54B, 0x8597, 0x8992, 0x8599, 0x93E3, - 0x859B, 0xE54C, 0x859C, 0xE54F, 0x85A4, 0xE545, 0x85A6, 0x9145, - 0x85A8, 0xE549, 0x85A9, 0x8E46, 0x85AA, 0x9064, 0x85AB, 0x8C4F, - 0x85AC, 0x96F2, 0x85AE, 0x96F7, 0x85AF, 0x8F92, 0x85B0, 0xFB9E, - 0x85B9, 0xE556, 0x85BA, 0xE554, 0x85C1, 0x986D, 0x85C9, 0xE553, - 0x85CD, 0x9795, 0x85CF, 0xE555, 0x85D0, 0xE557, 0x85D5, 0xE558, - 0x85DC, 0xE55B, 0x85DD, 0xE559, 0x85E4, 0x93A1, 0x85E5, 0xE55A, - 0x85E9, 0x94CB, 0x85EA, 0xE54D, 0x85F7, 0x8F93, 0x85F9, 0xE55C, - 0x85FA, 0xE561, 0x85FB, 0x9194, 0x85FE, 0xE560, 0x8602, 0xE541, - 0x8606, 0xE562, 0x8607, 0x9168, 0x860A, 0xE55D, 0x860B, 0xE55F, - 0x8613, 0xE55E, 0x8616, 0x9F50, 0x8617, 0x9F41, 0x861A, 0xE564, - 0x8622, 0xE563, 0x862D, 0x9796, 0x862F, 0xE1BA, 0x8630, 0xE565, - 0x863F, 0xE566, 0x864D, 0xE567, 0x864E, 0x8CD5, 0x8650, 0x8B73, - 0x8654, 0xE569, 0x8655, 0x997C, 0x865A, 0x8B95, 0x865C, 0x97B8, - 0x865E, 0x8BF1, 0x865F, 0xE56A, 0x8667, 0xE56B, 0x866B, 0x928E, - 0x8671, 0xE56C, 0x8679, 0x93F8, 0x867B, 0x88B8, 0x868A, 0x89E1, - 0x868B, 0xE571, 0x868C, 0xE572, 0x8693, 0xE56D, 0x8695, 0x8E5C, - 0x86A3, 0xE56E, 0x86A4, 0x9461, 0x86A9, 0xE56F, 0x86AA, 0xE570, - 0x86AB, 0xE57A, 0x86AF, 0xE574, 0x86B0, 0xE577, 0x86B6, 0xE573, - 0x86C4, 0xE575, 0x86C6, 0xE576, 0x86C7, 0x8ED6, 0x86C9, 0xE578, - 0x86CB, 0x9260, 0x86CD, 0x8C75, 0x86CE, 0x8A61, 0x86D4, 0xE57B, - 0x86D9, 0x8A5E, 0x86DB, 0xE581, 0x86DE, 0xE57C, 0x86DF, 0xE580, - 0x86E4, 0x94B8, 0x86E9, 0xE57D, 0x86EC, 0xE57E, 0x86ED, 0x9567, - 0x86EE, 0x94D8, 0x86EF, 0xE582, 0x86F8, 0x91FB, 0x86F9, 0xE58C, - 0x86FB, 0xE588, 0x86FE, 0x89E9, 0x8700, 0xE586, 0x8702, 0x9649, - 0x8703, 0xE587, 0x8706, 0xE584, 0x8708, 0xE585, 0x8709, 0xE58A, - 0x870A, 0xE58D, 0x870D, 0xE58B, 0x8711, 0xE589, 0x8712, 0xE583, - 0x8718, 0x9277, 0x871A, 0xE594, 0x871C, 0x96A8, 0x8725, 0xE592, - 0x8729, 0xE593, 0x8734, 0xE58E, 0x8737, 0xE590, 0x873B, 0xE591, - 0x873F, 0xE58F, 0x8749, 0x90E4, 0x874B, 0x9858, 0x874C, 0xE598, - 0x874E, 0xE599, 0x8753, 0xE59F, 0x8755, 0x9049, 0x8757, 0xE59B, - 0x8759, 0xE59E, 0x875F, 0xE596, 0x8760, 0xE595, 0x8763, 0xE5A0, - 0x8766, 0x89DA, 0x8768, 0xE59C, 0x876A, 0xE5A1, 0x876E, 0xE59D, - 0x8774, 0xE59A, 0x8776, 0x92B1, 0x8778, 0xE597, 0x877F, 0x9488, - 0x8782, 0xE5A5, 0x878D, 0x975A, 0x879F, 0xE5A4, 0x87A2, 0xE5A3, - 0x87AB, 0xE5AC, 0x87AF, 0xE5A6, 0x87B3, 0xE5AE, 0x87BA, 0x9786, - 0x87BB, 0xE5B1, 0x87BD, 0xE5A8, 0x87C0, 0xE5A9, 0x87C4, 0xE5AD, - 0x87C6, 0xE5B0, 0x87C7, 0xE5AF, 0x87CB, 0xE5A7, 0x87D0, 0xE5AA, - 0x87D2, 0xE5BB, 0x87E0, 0xE5B4, 0x87EF, 0xE5B2, 0x87F2, 0xE5B3, - 0x87F6, 0xE5B8, 0x87F7, 0xE5B9, 0x87F9, 0x8A49, 0x87FB, 0x8B61, - 0x87FE, 0xE5B7, 0x8805, 0xE5A2, 0x8807, 0xFBA1, 0x880D, 0xE5B6, - 0x880E, 0xE5BA, 0x880F, 0xE5B5, 0x8811, 0xE5BC, 0x8815, 0xE5BE, - 0x8816, 0xE5BD, 0x8821, 0xE5C0, 0x8822, 0xE5BF, 0x8823, 0xE579, - 0x8827, 0xE5C4, 0x8831, 0xE5C1, 0x8836, 0xE5C2, 0x8839, 0xE5C3, - 0x883B, 0xE5C5, 0x8840, 0x8C8C, 0x8842, 0xE5C7, 0x8844, 0xE5C6, - 0x8846, 0x8F4F, 0x884C, 0x8D73, 0x884D, 0x9FA5, 0x8852, 0xE5C8, - 0x8853, 0x8F70, 0x8857, 0x8A58, 0x8859, 0xE5C9, 0x885B, 0x8971, - 0x885D, 0x8FD5, 0x885E, 0xE5CA, 0x8861, 0x8D74, 0x8862, 0xE5CB, - 0x8863, 0x88DF, 0x8868, 0x955C, 0x886B, 0xE5CC, 0x8870, 0x908A, - 0x8872, 0xE5D3, 0x8875, 0xE5D0, 0x8877, 0x928F, 0x887D, 0xE5D1, - 0x887E, 0xE5CE, 0x887F, 0x8BDC, 0x8881, 0xE5CD, 0x8882, 0xE5D4, - 0x8888, 0x8C55, 0x888B, 0x91DC, 0x888D, 0xE5DA, 0x8892, 0xE5D6, - 0x8896, 0x91B3, 0x8897, 0xE5D5, 0x8899, 0xE5D8, 0x889E, 0xE5CF, - 0x88A2, 0xE5D9, 0x88A4, 0xE5DB, 0x88AB, 0x94ED, 0x88AE, 0xE5D7, - 0x88B0, 0xE5DC, 0x88B1, 0xE5DE, 0x88B4, 0x8CD1, 0x88B5, 0xE5D2, - 0x88B7, 0x88BF, 0x88BF, 0xE5DD, 0x88C1, 0x8DD9, 0x88C2, 0x97F4, - 0x88C3, 0xE5DF, 0x88C4, 0xE5E0, 0x88C5, 0x9195, 0x88CF, 0x97A0, - 0x88D4, 0xE5E1, 0x88D5, 0x9754, 0x88D8, 0xE5E2, 0x88D9, 0xE5E3, - 0x88DC, 0x95E2, 0x88DD, 0xE5E4, 0x88DF, 0x8DBE, 0x88E1, 0x97A1, - 0x88E8, 0xE5E9, 0x88F2, 0xE5EA, 0x88F3, 0x8FD6, 0x88F4, 0xE5E8, - 0x88F5, 0xFBA2, 0x88F8, 0x9787, 0x88F9, 0xE5E5, 0x88FC, 0xE5E7, - 0x88FD, 0x90BB, 0x88FE, 0x909E, 0x8902, 0xE5E6, 0x8904, 0xE5EB, - 0x8907, 0x95A1, 0x890A, 0xE5ED, 0x890C, 0xE5EC, 0x8910, 0x8A8C, - 0x8912, 0x964A, 0x8913, 0xE5EE, 0x891C, 0xFA5D, 0x891D, 0xE5FA, - 0x891E, 0xE5F0, 0x8925, 0xE5F1, 0x892A, 0xE5F2, 0x892B, 0xE5F3, - 0x8936, 0xE5F7, 0x8938, 0xE5F8, 0x893B, 0xE5F6, 0x8941, 0xE5F4, - 0x8943, 0xE5EF, 0x8944, 0xE5F5, 0x894C, 0xE5F9, 0x894D, 0xE8B5, - 0x8956, 0x89A6, 0x895E, 0xE5FC, 0x895F, 0x8BDD, 0x8960, 0xE5FB, - 0x8964, 0xE641, 0x8966, 0xE640, 0x896A, 0xE643, 0x896D, 0xE642, - 0x896F, 0xE644, 0x8972, 0x8F50, 0x8974, 0xE645, 0x8977, 0xE646, - 0x897E, 0xE647, 0x897F, 0x90BC, 0x8981, 0x9776, 0x8983, 0xE648, - 0x8986, 0x95A2, 0x8987, 0x9465, 0x8988, 0xE649, 0x898A, 0xE64A, - 0x898B, 0x8CA9, 0x898F, 0x8B4B, 0x8993, 0xE64B, 0x8996, 0x8E8B, - 0x8997, 0x9460, 0x8998, 0xE64C, 0x899A, 0x8A6F, 0x89A1, 0xE64D, - 0x89A6, 0xE64F, 0x89A7, 0x9797, 0x89A9, 0xE64E, 0x89AA, 0x9065, - 0x89AC, 0xE650, 0x89AF, 0xE651, 0x89B2, 0xE652, 0x89B3, 0x8ACF, - 0x89BA, 0xE653, 0x89BD, 0xE654, 0x89BF, 0xE655, 0x89C0, 0xE656, - 0x89D2, 0x8A70, 0x89DA, 0xE657, 0x89DC, 0xE658, 0x89DD, 0xE659, - 0x89E3, 0x89F0, 0x89E6, 0x9047, 0x89E7, 0xE65A, 0x89F4, 0xE65B, - 0x89F8, 0xE65C, 0x8A00, 0x8CBE, 0x8A02, 0x92F9, 0x8A03, 0xE65D, - 0x8A08, 0x8C76, 0x8A0A, 0x9075, 0x8A0C, 0xE660, 0x8A0E, 0x93A2, - 0x8A10, 0xE65F, 0x8A12, 0xFBA3, 0x8A13, 0x8C50, 0x8A16, 0xE65E, - 0x8A17, 0x91F5, 0x8A18, 0x8B4C, 0x8A1B, 0xE661, 0x8A1D, 0xE662, - 0x8A1F, 0x8FD7, 0x8A23, 0x8C8D, 0x8A25, 0xE663, 0x8A2A, 0x964B, - 0x8A2D, 0x90DD, 0x8A31, 0x8B96, 0x8A33, 0x96F3, 0x8A34, 0x9169, - 0x8A36, 0xE664, 0x8A37, 0xFBA4, 0x8A3A, 0x9066, 0x8A3B, 0x9290, - 0x8A3C, 0x8FD8, 0x8A41, 0xE665, 0x8A46, 0xE668, 0x8A48, 0xE669, - 0x8A50, 0x8DBC, 0x8A51, 0x91C0, 0x8A52, 0xE667, 0x8A54, 0x8FD9, - 0x8A55, 0x955D, 0x8A5B, 0xE666, 0x8A5E, 0x8E8C, 0x8A60, 0x8972, - 0x8A62, 0xE66D, 0x8A63, 0x8C77, 0x8A66, 0x8E8E, 0x8A69, 0x8E8D, - 0x8A6B, 0x986C, 0x8A6C, 0xE66C, 0x8A6D, 0xE66B, 0x8A6E, 0x9146, - 0x8A70, 0x8B6C, 0x8A71, 0x9862, 0x8A72, 0x8A59, 0x8A73, 0x8FDA, - 0x8A79, 0xFBA5, 0x8A7C, 0xE66A, 0x8A82, 0xE66F, 0x8A84, 0xE670, - 0x8A85, 0xE66E, 0x8A87, 0x8CD6, 0x8A89, 0x975F, 0x8A8C, 0x8E8F, - 0x8A8D, 0x9446, 0x8A91, 0xE673, 0x8A93, 0x90BE, 0x8A95, 0x9261, - 0x8A98, 0x9755, 0x8A9A, 0xE676, 0x8A9E, 0x8CEA, 0x8AA0, 0x90BD, - 0x8AA1, 0xE672, 0x8AA3, 0xE677, 0x8AA4, 0x8CEB, 0x8AA5, 0xE674, - 0x8AA6, 0xE675, 0x8AA7, 0xFBA6, 0x8AA8, 0xE671, 0x8AAC, 0x90E0, - 0x8AAD, 0x93C7, 0x8AB0, 0x924E, 0x8AB2, 0x89DB, 0x8AB9, 0x94EE, - 0x8ABC, 0x8B62, 0x8ABE, 0xFBA7, 0x8ABF, 0x92B2, 0x8AC2, 0xE67A, - 0x8AC4, 0xE678, 0x8AC7, 0x926B, 0x8ACB, 0x90BF, 0x8ACC, 0x8AD0, - 0x8ACD, 0xE679, 0x8ACF, 0x907A, 0x8AD2, 0x97C8, 0x8AD6, 0x985F, - 0x8ADA, 0xE67B, 0x8ADB, 0xE687, 0x8ADC, 0x92B3, 0x8ADE, 0xE686, - 0x8ADF, 0xFBA8, 0x8AE0, 0xE683, 0x8AE1, 0xE68B, 0x8AE2, 0xE684, - 0x8AE4, 0xE680, 0x8AE6, 0x92FA, 0x8AE7, 0xE67E, 0x8AEB, 0xE67C, - 0x8AED, 0x9740, 0x8AEE, 0x8E90, 0x8AF1, 0xE681, 0x8AF3, 0xE67D, - 0x8AF6, 0xFBAA, 0x8AF7, 0xE685, 0x8AF8, 0x8F94, 0x8AFA, 0x8CBF, - 0x8AFE, 0x91F8, 0x8B00, 0x9664, 0x8B01, 0x8979, 0x8B02, 0x88E0, - 0x8B04, 0x93A3, 0x8B07, 0xE689, 0x8B0C, 0xE688, 0x8B0E, 0x93E4, - 0x8B10, 0xE68D, 0x8B14, 0xE682, 0x8B16, 0xE68C, 0x8B17, 0xE68E, - 0x8B19, 0x8CAA, 0x8B1A, 0xE68A, 0x8B1B, 0x8D75, 0x8B1D, 0x8ED3, - 0x8B20, 0xE68F, 0x8B21, 0x9777, 0x8B26, 0xE692, 0x8B28, 0xE695, - 0x8B2B, 0xE693, 0x8B2C, 0x9554, 0x8B33, 0xE690, 0x8B39, 0x8BDE, - 0x8B3E, 0xE694, 0x8B41, 0xE696, 0x8B49, 0xE69A, 0x8B4C, 0xE697, - 0x8B4E, 0xE699, 0x8B4F, 0xE698, 0x8B53, 0xFBAB, 0x8B56, 0xE69B, - 0x8B58, 0x8EAF, 0x8B5A, 0xE69D, 0x8B5B, 0xE69C, 0x8B5C, 0x9588, - 0x8B5F, 0xE69F, 0x8B66, 0x8C78, 0x8B6B, 0xE69E, 0x8B6C, 0xE6A0, - 0x8B6F, 0xE6A1, 0x8B70, 0x8B63, 0x8B71, 0xE3BF, 0x8B72, 0x8FF7, - 0x8B74, 0xE6A2, 0x8B77, 0x8CEC, 0x8B7D, 0xE6A3, 0x8B7F, 0xFBAC, - 0x8B80, 0xE6A4, 0x8B83, 0x8E5D, 0x8B8A, 0x9DCC, 0x8B8C, 0xE6A5, - 0x8B8E, 0xE6A6, 0x8B90, 0x8F51, 0x8B92, 0xE6A7, 0x8B93, 0xE6A8, - 0x8B96, 0xE6A9, 0x8B99, 0xE6AA, 0x8B9A, 0xE6AB, 0x8C37, 0x924A, - 0x8C3A, 0xE6AC, 0x8C3F, 0xE6AE, 0x8C41, 0xE6AD, 0x8C46, 0x93A4, - 0x8C48, 0xE6AF, 0x8C4A, 0x964C, 0x8C4C, 0xE6B0, 0x8C4E, 0xE6B1, - 0x8C50, 0xE6B2, 0x8C55, 0xE6B3, 0x8C5A, 0x93D8, 0x8C61, 0x8FDB, - 0x8C62, 0xE6B4, 0x8C6A, 0x8D8B, 0x8C6B, 0x98AC, 0x8C6C, 0xE6B5, - 0x8C78, 0xE6B6, 0x8C79, 0x955E, 0x8C7A, 0xE6B7, 0x8C7C, 0xE6BF, - 0x8C82, 0xE6B8, 0x8C85, 0xE6BA, 0x8C89, 0xE6B9, 0x8C8A, 0xE6BB, - 0x8C8C, 0x9665, 0x8C8D, 0xE6BC, 0x8C8E, 0xE6BD, 0x8C94, 0xE6BE, - 0x8C98, 0xE6C0, 0x8C9D, 0x8A4C, 0x8C9E, 0x92E5, 0x8CA0, 0x9589, - 0x8CA1, 0x8DE0, 0x8CA2, 0x8D76, 0x8CA7, 0x956E, 0x8CA8, 0x89DD, - 0x8CA9, 0x94CC, 0x8CAA, 0xE6C3, 0x8CAB, 0x8AD1, 0x8CAC, 0x90D3, - 0x8CAD, 0xE6C2, 0x8CAE, 0xE6C7, 0x8CAF, 0x9299, 0x8CB0, 0x96E1, - 0x8CB2, 0xE6C5, 0x8CB3, 0xE6C6, 0x8CB4, 0x8B4D, 0x8CB6, 0xE6C8, - 0x8CB7, 0x9483, 0x8CB8, 0x91DD, 0x8CBB, 0x94EF, 0x8CBC, 0x935C, - 0x8CBD, 0xE6C4, 0x8CBF, 0x9666, 0x8CC0, 0x89EA, 0x8CC1, 0xE6CA, - 0x8CC2, 0x9847, 0x8CC3, 0x92C0, 0x8CC4, 0x9864, 0x8CC7, 0x8E91, - 0x8CC8, 0xE6C9, 0x8CCA, 0x91AF, 0x8CCD, 0xE6DA, 0x8CCE, 0x9147, - 0x8CD1, 0x93F6, 0x8CD3, 0x956F, 0x8CDA, 0xE6CD, 0x8CDB, 0x8E5E, - 0x8CDC, 0x8E92, 0x8CDE, 0x8FDC, 0x8CE0, 0x9485, 0x8CE2, 0x8CAB, - 0x8CE3, 0xE6CC, 0x8CE4, 0xE6CB, 0x8CE6, 0x958A, 0x8CEA, 0x8EBF, - 0x8CED, 0x9371, 0x8CF0, 0xFBAD, 0x8CF4, 0xFBAE, 0x8CFA, 0xE6CF, - 0x8CFB, 0xE6D0, 0x8CFC, 0x8D77, 0x8CFD, 0xE6CE, 0x8D04, 0xE6D1, - 0x8D05, 0xE6D2, 0x8D07, 0xE6D4, 0x8D08, 0x91A1, 0x8D0A, 0xE6D3, - 0x8D0B, 0x8AE4, 0x8D0D, 0xE6D6, 0x8D0F, 0xE6D5, 0x8D10, 0xE6D7, - 0x8D12, 0xFBAF, 0x8D13, 0xE6D9, 0x8D14, 0xE6DB, 0x8D16, 0xE6DC, - 0x8D64, 0x90D4, 0x8D66, 0x8ECD, 0x8D67, 0xE6DD, 0x8D6B, 0x8A71, - 0x8D6D, 0xE6DE, 0x8D70, 0x9196, 0x8D71, 0xE6DF, 0x8D73, 0xE6E0, - 0x8D74, 0x958B, 0x8D76, 0xFBB0, 0x8D77, 0x8B4E, 0x8D81, 0xE6E1, - 0x8D85, 0x92B4, 0x8D8A, 0x897A, 0x8D99, 0xE6E2, 0x8DA3, 0x8EEF, - 0x8DA8, 0x9096, 0x8DB3, 0x91AB, 0x8DBA, 0xE6E5, 0x8DBE, 0xE6E4, - 0x8DC2, 0xE6E3, 0x8DCB, 0xE6EB, 0x8DCC, 0xE6E9, 0x8DCF, 0xE6E6, - 0x8DD6, 0xE6E8, 0x8DDA, 0xE6E7, 0x8DDB, 0xE6EA, 0x8DDD, 0x8B97, - 0x8DDF, 0xE6EE, 0x8DE1, 0x90D5, 0x8DE3, 0xE6EF, 0x8DE8, 0x8CD7, - 0x8DEA, 0xE6EC, 0x8DEB, 0xE6ED, 0x8DEF, 0x9848, 0x8DF3, 0x92B5, - 0x8DF5, 0x9148, 0x8DFC, 0xE6F0, 0x8DFF, 0xE6F3, 0x8E08, 0xE6F1, - 0x8E09, 0xE6F2, 0x8E0A, 0x9778, 0x8E0F, 0x93A5, 0x8E10, 0xE6F6, - 0x8E1D, 0xE6F4, 0x8E1E, 0xE6F5, 0x8E1F, 0xE6F7, 0x8E2A, 0xE748, - 0x8E30, 0xE6FA, 0x8E34, 0xE6FB, 0x8E35, 0xE6F9, 0x8E42, 0xE6F8, - 0x8E44, 0x92FB, 0x8E47, 0xE740, 0x8E48, 0xE744, 0x8E49, 0xE741, - 0x8E4A, 0xE6FC, 0x8E4C, 0xE742, 0x8E50, 0xE743, 0x8E55, 0xE74A, - 0x8E59, 0xE745, 0x8E5F, 0x90D6, 0x8E60, 0xE747, 0x8E63, 0xE749, - 0x8E64, 0xE746, 0x8E72, 0xE74C, 0x8E74, 0x8F52, 0x8E76, 0xE74B, - 0x8E7C, 0xE74D, 0x8E81, 0xE74E, 0x8E84, 0xE751, 0x8E85, 0xE750, - 0x8E87, 0xE74F, 0x8E8A, 0xE753, 0x8E8B, 0xE752, 0x8E8D, 0x96F4, - 0x8E91, 0xE755, 0x8E93, 0xE754, 0x8E94, 0xE756, 0x8E99, 0xE757, - 0x8EA1, 0xE759, 0x8EAA, 0xE758, 0x8EAB, 0x9067, 0x8EAC, 0xE75A, - 0x8EAF, 0x8BEB, 0x8EB0, 0xE75B, 0x8EB1, 0xE75D, 0x8EBE, 0xE75E, - 0x8EC5, 0xE75F, 0x8EC6, 0xE75C, 0x8EC8, 0xE760, 0x8ECA, 0x8ED4, - 0x8ECB, 0xE761, 0x8ECC, 0x8B4F, 0x8ECD, 0x8C52, 0x8ECF, 0xFBB2, - 0x8ED2, 0x8CAC, 0x8EDB, 0xE762, 0x8EDF, 0x93EE, 0x8EE2, 0x935D, - 0x8EE3, 0xE763, 0x8EEB, 0xE766, 0x8EF8, 0x8EB2, 0x8EFB, 0xE765, - 0x8EFC, 0xE764, 0x8EFD, 0x8C79, 0x8EFE, 0xE767, 0x8F03, 0x8A72, - 0x8F05, 0xE769, 0x8F09, 0x8DDA, 0x8F0A, 0xE768, 0x8F0C, 0xE771, - 0x8F12, 0xE76B, 0x8F13, 0xE76D, 0x8F14, 0x95E3, 0x8F15, 0xE76A, - 0x8F19, 0xE76C, 0x8F1B, 0xE770, 0x8F1C, 0xE76E, 0x8F1D, 0x8B50, - 0x8F1F, 0xE76F, 0x8F26, 0xE772, 0x8F29, 0x9479, 0x8F2A, 0x97D6, - 0x8F2F, 0x8F53, 0x8F33, 0xE773, 0x8F38, 0x9741, 0x8F39, 0xE775, - 0x8F3B, 0xE774, 0x8F3E, 0xE778, 0x8F3F, 0x9760, 0x8F42, 0xE777, - 0x8F44, 0x8A8D, 0x8F45, 0xE776, 0x8F46, 0xE77B, 0x8F49, 0xE77A, - 0x8F4C, 0xE779, 0x8F4D, 0x9351, 0x8F4E, 0xE77C, 0x8F57, 0xE77D, - 0x8F5C, 0xE77E, 0x8F5F, 0x8D8C, 0x8F61, 0x8C44, 0x8F62, 0xE780, - 0x8F63, 0xE781, 0x8F64, 0xE782, 0x8F9B, 0x9068, 0x8F9C, 0xE783, - 0x8F9E, 0x8EAB, 0x8F9F, 0xE784, 0x8FA3, 0xE785, 0x8FA7, 0x999F, - 0x8FA8, 0x999E, 0x8FAD, 0xE786, 0x8FAE, 0xE390, 0x8FAF, 0xE787, - 0x8FB0, 0x9243, 0x8FB1, 0x904A, 0x8FB2, 0x945F, 0x8FB7, 0xE788, - 0x8FBA, 0x95D3, 0x8FBB, 0x92D2, 0x8FBC, 0x8D9E, 0x8FBF, 0x9248, - 0x8FC2, 0x8949, 0x8FC4, 0x9698, 0x8FC5, 0x9076, 0x8FCE, 0x8C7D, - 0x8FD1, 0x8BDF, 0x8FD4, 0x95D4, 0x8FDA, 0xE789, 0x8FE2, 0xE78B, - 0x8FE5, 0xE78A, 0x8FE6, 0x89DE, 0x8FE9, 0x93F4, 0x8FEA, 0xE78C, - 0x8FEB, 0x9497, 0x8FED, 0x9352, 0x8FEF, 0xE78D, 0x8FF0, 0x8F71, - 0x8FF4, 0xE78F, 0x8FF7, 0x96C0, 0x8FF8, 0xE79E, 0x8FF9, 0xE791, - 0x8FFA, 0xE792, 0x8FFD, 0x92C7, 0x9000, 0x91DE, 0x9001, 0x9197, - 0x9003, 0x93A6, 0x9005, 0xE790, 0x9006, 0x8B74, 0x900B, 0xE799, - 0x900D, 0xE796, 0x900E, 0xE7A3, 0x900F, 0x93A7, 0x9010, 0x9280, - 0x9011, 0xE793, 0x9013, 0x92FC, 0x9014, 0x9372, 0x9015, 0xE794, - 0x9016, 0xE798, 0x9017, 0x9080, 0x9019, 0x9487, 0x901A, 0x92CA, - 0x901D, 0x90C0, 0x901E, 0xE797, 0x901F, 0x91AC, 0x9020, 0x91A2, - 0x9021, 0xE795, 0x9022, 0x88A7, 0x9023, 0x9841, 0x9027, 0xE79A, - 0x902E, 0x91DF, 0x9031, 0x8F54, 0x9032, 0x9069, 0x9035, 0xE79C, - 0x9036, 0xE79B, 0x9038, 0x88ED, 0x9039, 0xE79D, 0x903C, 0x954E, - 0x903E, 0xE7A5, 0x9041, 0x93D9, 0x9042, 0x908B, 0x9045, 0x9278, - 0x9047, 0x8BF6, 0x9049, 0xE7A4, 0x904A, 0x9756, 0x904B, 0x895E, - 0x904D, 0x95D5, 0x904E, 0x89DF, 0x904F, 0xE79F, 0x9050, 0xE7A0, - 0x9051, 0xE7A1, 0x9052, 0xE7A2, 0x9053, 0x93B9, 0x9054, 0x9242, - 0x9055, 0x88E1, 0x9056, 0xE7A6, 0x9058, 0xE7A7, 0x9059, 0xEAA1, - 0x905C, 0x91BB, 0x905E, 0xE7A8, 0x9060, 0x8993, 0x9061, 0x916B, - 0x9063, 0x8CAD, 0x9065, 0x9779, 0x9067, 0xFBB5, 0x9068, 0xE7A9, - 0x9069, 0x934B, 0x906D, 0x9198, 0x906E, 0x8ED5, 0x906F, 0xE7AA, - 0x9072, 0xE7AD, 0x9075, 0x8F85, 0x9076, 0xE7AB, 0x9077, 0x914A, - 0x9078, 0x9149, 0x907A, 0x88E2, 0x907C, 0x97C9, 0x907D, 0xE7AF, - 0x907F, 0x94F0, 0x9080, 0xE7B1, 0x9081, 0xE7B0, 0x9082, 0xE7AE, - 0x9083, 0xE284, 0x9084, 0x8AD2, 0x9087, 0xE78E, 0x9089, 0xE7B3, - 0x908A, 0xE7B2, 0x908F, 0xE7B4, 0x9091, 0x9757, 0x90A3, 0x93DF, - 0x90A6, 0x964D, 0x90A8, 0xE7B5, 0x90AA, 0x8ED7, 0x90AF, 0xE7B6, - 0x90B1, 0xE7B7, 0x90B5, 0xE7B8, 0x90B8, 0x9340, 0x90C1, 0x88E8, - 0x90CA, 0x8D78, 0x90CE, 0x9859, 0x90DB, 0xE7BC, 0x90DE, 0xFBB6, - 0x90E1, 0x8C53, 0x90E2, 0xE7B9, 0x90E4, 0xE7BA, 0x90E8, 0x9594, - 0x90ED, 0x8A73, 0x90F5, 0x9758, 0x90F7, 0x8BBD, 0x90FD, 0x9373, - 0x9102, 0xE7BD, 0x9112, 0xE7BE, 0x9115, 0xFBB8, 0x9119, 0xE7BF, - 0x9127, 0xFBB9, 0x912D, 0x9341, 0x9130, 0xE7C1, 0x9132, 0xE7C0, - 0x9149, 0x93D1, 0x914A, 0xE7C2, 0x914B, 0x8F55, 0x914C, 0x8EDE, - 0x914D, 0x947A, 0x914E, 0x9291, 0x9152, 0x8EF0, 0x9154, 0x908C, - 0x9156, 0xE7C3, 0x9158, 0xE7C4, 0x9162, 0x907C, 0x9163, 0xE7C5, - 0x9165, 0xE7C6, 0x9169, 0xE7C7, 0x916A, 0x978F, 0x916C, 0x8F56, - 0x9172, 0xE7C9, 0x9173, 0xE7C8, 0x9175, 0x8D79, 0x9177, 0x8D93, - 0x9178, 0x8E5F, 0x9182, 0xE7CC, 0x9187, 0x8F86, 0x9189, 0xE7CB, - 0x918B, 0xE7CA, 0x918D, 0x91E7, 0x9190, 0x8CED, 0x9192, 0x90C1, - 0x9197, 0x94AE, 0x919C, 0x8F58, 0x91A2, 0xE7CD, 0x91A4, 0x8FDD, - 0x91AA, 0xE7D0, 0x91AB, 0xE7CE, 0x91AF, 0xE7CF, 0x91B4, 0xE7D2, - 0x91B5, 0xE7D1, 0x91B8, 0x8FF8, 0x91BA, 0xE7D3, 0x91C0, 0xE7D4, - 0x91C1, 0xE7D5, 0x91C6, 0x94CE, 0x91C7, 0x8DD1, 0x91C8, 0x8EDF, - 0x91C9, 0xE7D6, 0x91CB, 0xE7D7, 0x91CC, 0x97A2, 0x91CD, 0x8F64, - 0x91CE, 0x96EC, 0x91CF, 0x97CA, 0x91D0, 0xE7D8, 0x91D1, 0x8BE0, - 0x91D6, 0xE7D9, 0x91D7, 0xFBBB, 0x91D8, 0x9342, 0x91DA, 0xFBBA, - 0x91DB, 0xE7DC, 0x91DC, 0x8A98, 0x91DD, 0x906A, 0x91DE, 0xFBBC, - 0x91DF, 0xE7DA, 0x91E1, 0xE7DB, 0x91E3, 0x92DE, 0x91E4, 0xFBBF, - 0x91E5, 0xFBC0, 0x91E6, 0x9674, 0x91E7, 0x8BFA, 0x91ED, 0xFBBD, - 0x91EE, 0xFBBE, 0x91F5, 0xE7DE, 0x91F6, 0xE7DF, 0x91FC, 0xE7DD, - 0x91FF, 0xE7E1, 0x9206, 0xFBC1, 0x920A, 0xFBC3, 0x920D, 0x93DD, - 0x920E, 0x8A62, 0x9210, 0xFBC2, 0x9211, 0xE7E5, 0x9214, 0xE7E2, - 0x9215, 0xE7E4, 0x921E, 0xE7E0, 0x9229, 0xE86E, 0x922C, 0xE7E3, - 0x9234, 0x97E9, 0x9237, 0x8CD8, 0x9239, 0xFBCA, 0x923A, 0xFBC4, - 0x923C, 0xFBC6, 0x923F, 0xE7ED, 0x9240, 0xFBC5, 0x9244, 0x9353, - 0x9245, 0xE7E8, 0x9248, 0xE7EB, 0x9249, 0xE7E9, 0x924B, 0xE7EE, - 0x924E, 0xFBC7, 0x9250, 0xE7EF, 0x9251, 0xFBC9, 0x9257, 0xE7E7, - 0x9259, 0xFBC8, 0x925A, 0xE7F4, 0x925B, 0x8994, 0x925E, 0xE7E6, - 0x9262, 0x94AB, 0x9264, 0xE7EA, 0x9266, 0x8FDE, 0x9267, 0xFBCB, - 0x9271, 0x8D7A, 0x9277, 0xFBCD, 0x9278, 0xFBCE, 0x927E, 0x9667, - 0x9280, 0x8BE2, 0x9283, 0x8F65, 0x9285, 0x93BA, 0x9288, 0xFA5F, - 0x9291, 0x914C, 0x9293, 0xE7F2, 0x9295, 0xE7EC, 0x9296, 0xE7F1, - 0x9298, 0x96C1, 0x929A, 0x92B6, 0x929B, 0xE7F3, 0x929C, 0xE7F0, - 0x92A7, 0xFBCC, 0x92AD, 0x914B, 0x92B7, 0xE7F7, 0x92B9, 0xE7F6, - 0x92CF, 0xE7F5, 0x92D0, 0xFBD2, 0x92D2, 0x964E, 0x92D3, 0xFBD6, - 0x92D5, 0xFBD4, 0x92D7, 0xFBD0, 0x92D9, 0xFBD1, 0x92E0, 0xFBD5, - 0x92E4, 0x8F9B, 0x92E7, 0xFBCF, 0x92E9, 0xE7F8, 0x92EA, 0x95DD, - 0x92ED, 0x8973, 0x92F2, 0x9565, 0x92F3, 0x9292, 0x92F8, 0x8B98, - 0x92F9, 0xFA65, 0x92FA, 0xE7FA, 0x92FB, 0xFBD9, 0x92FC, 0x8D7C, - 0x92FF, 0xFBDC, 0x9302, 0xFBDE, 0x9306, 0x8E4B, 0x930F, 0xE7F9, - 0x9310, 0x908D, 0x9318, 0x908E, 0x9319, 0xE840, 0x931A, 0xE842, - 0x931D, 0xFBDD, 0x931E, 0xFBDB, 0x9320, 0x8FF9, 0x9321, 0xFBD8, - 0x9322, 0xE841, 0x9323, 0xE843, 0x9325, 0xFBD7, 0x9326, 0x8BD1, - 0x9328, 0x9564, 0x932B, 0x8EE0, 0x932C, 0x9842, 0x932E, 0xE7FC, - 0x932F, 0x8DF6, 0x9332, 0x985E, 0x9335, 0xE845, 0x933A, 0xE844, - 0x933B, 0xE846, 0x9344, 0xE7FB, 0x9348, 0xFA5E, 0x934B, 0x93E7, - 0x934D, 0x9374, 0x9354, 0x92D5, 0x9356, 0xE84B, 0x9357, 0xFBE0, - 0x935B, 0x9262, 0x935C, 0xE847, 0x9360, 0xE848, 0x936C, 0x8C4C, - 0x936E, 0xE84A, 0x9370, 0xFBDF, 0x9375, 0x8CAE, 0x937C, 0xE849, - 0x937E, 0x8FDF, 0x938C, 0x8A99, 0x9394, 0xE84F, 0x9396, 0x8DBD, - 0x9397, 0x9199, 0x939A, 0x92C8, 0x93A4, 0xFBE1, 0x93A7, 0x8A5A, - 0x93AC, 0xE84D, 0x93AD, 0xE84E, 0x93AE, 0x92C1, 0x93B0, 0xE84C, - 0x93B9, 0xE850, 0x93C3, 0xE856, 0x93C6, 0xFBE2, 0x93C8, 0xE859, - 0x93D0, 0xE858, 0x93D1, 0x934C, 0x93D6, 0xE851, 0x93D7, 0xE852, - 0x93D8, 0xE855, 0x93DD, 0xE857, 0x93DE, 0xFBE3, 0x93E1, 0x8BBE, - 0x93E4, 0xE85A, 0x93E5, 0xE854, 0x93E8, 0xE853, 0x93F8, 0xFBE4, - 0x9403, 0xE85E, 0x9407, 0xE85F, 0x9410, 0xE860, 0x9413, 0xE85D, - 0x9414, 0xE85C, 0x9418, 0x8FE0, 0x9419, 0x93A8, 0x941A, 0xE85B, - 0x9421, 0xE864, 0x942B, 0xE862, 0x9431, 0xFBE5, 0x9435, 0xE863, - 0x9436, 0xE861, 0x9438, 0x91F6, 0x943A, 0xE865, 0x9441, 0xE866, - 0x9444, 0xE868, 0x9445, 0xFBE6, 0x9448, 0xFBE7, 0x9451, 0x8AD3, - 0x9452, 0xE867, 0x9453, 0x96F8, 0x945A, 0xE873, 0x945B, 0xE869, - 0x945E, 0xE86C, 0x9460, 0xE86A, 0x9462, 0xE86B, 0x946A, 0xE86D, - 0x9470, 0xE86F, 0x9475, 0xE870, 0x9477, 0xE871, 0x947C, 0xE874, - 0x947D, 0xE872, 0x947E, 0xE875, 0x947F, 0xE877, 0x9481, 0xE876, - 0x9577, 0x92B7, 0x9580, 0x96E5, 0x9582, 0xE878, 0x9583, 0x914D, - 0x9587, 0xE879, 0x9589, 0x95C2, 0x958A, 0xE87A, 0x958B, 0x8A4A, - 0x958F, 0x895B, 0x9591, 0x8AD5, 0x9592, 0xFBE8, 0x9593, 0x8AD4, - 0x9594, 0xE87B, 0x9596, 0xE87C, 0x9598, 0xE87D, 0x9599, 0xE87E, - 0x95A0, 0xE880, 0x95A2, 0x8AD6, 0x95A3, 0x8A74, 0x95A4, 0x8D7D, - 0x95A5, 0x94B4, 0x95A7, 0xE882, 0x95A8, 0xE881, 0x95AD, 0xE883, - 0x95B2, 0x897B, 0x95B9, 0xE886, 0x95BB, 0xE885, 0x95BC, 0xE884, - 0x95BE, 0xE887, 0x95C3, 0xE88A, 0x95C7, 0x88C5, 0x95CA, 0xE888, - 0x95CC, 0xE88C, 0x95CD, 0xE88B, 0x95D4, 0xE88E, 0x95D5, 0xE88D, - 0x95D6, 0xE88F, 0x95D8, 0x93AC, 0x95DC, 0xE890, 0x95E1, 0xE891, - 0x95E2, 0xE893, 0x95E5, 0xE892, 0x961C, 0x958C, 0x9621, 0xE894, - 0x9628, 0xE895, 0x962A, 0x8DE3, 0x962E, 0xE896, 0x962F, 0xE897, - 0x9632, 0x9668, 0x963B, 0x916A, 0x963F, 0x88A2, 0x9640, 0x91C9, - 0x9642, 0xE898, 0x9644, 0x958D, 0x964B, 0xE89B, 0x964C, 0xE899, - 0x964D, 0x8D7E, 0x964F, 0xE89A, 0x9650, 0x8CC0, 0x965B, 0x95C3, - 0x965C, 0xE89D, 0x965D, 0xE89F, 0x965E, 0xE89E, 0x965F, 0xE8A0, - 0x9662, 0x8940, 0x9663, 0x9077, 0x9664, 0x8F9C, 0x9665, 0x8AD7, - 0x9666, 0xE8A1, 0x966A, 0x9486, 0x966C, 0xE8A3, 0x9670, 0x8941, - 0x9672, 0xE8A2, 0x9673, 0x92C2, 0x9675, 0x97CB, 0x9676, 0x93A9, - 0x9677, 0xE89C, 0x9678, 0x97A4, 0x967A, 0x8CAF, 0x967D, 0x977A, - 0x9685, 0x8BF7, 0x9686, 0x97B2, 0x9688, 0x8C47, 0x968A, 0x91E0, - 0x968B, 0xE440, 0x968D, 0xE8A4, 0x968E, 0x8A4B, 0x968F, 0x908F, - 0x9694, 0x8A75, 0x9695, 0xE8A6, 0x9697, 0xE8A7, 0x9698, 0xE8A5, - 0x9699, 0x8C84, 0x969B, 0x8DDB, 0x969C, 0x8FE1, 0x969D, 0xFBEB, - 0x96A0, 0x8942, 0x96A3, 0x97D7, 0x96A7, 0xE8A9, 0x96A8, 0xE7AC, - 0x96AA, 0xE8A8, 0x96AF, 0xFBEC, 0x96B0, 0xE8AC, 0x96B1, 0xE8AA, - 0x96B2, 0xE8AB, 0x96B4, 0xE8AD, 0x96B6, 0xE8AE, 0x96B7, 0x97EA, - 0x96B8, 0xE8AF, 0x96B9, 0xE8B0, 0x96BB, 0x90C7, 0x96BC, 0x94B9, - 0x96C0, 0x909D, 0x96C1, 0x8AE5, 0x96C4, 0x9759, 0x96C5, 0x89EB, - 0x96C6, 0x8F57, 0x96C7, 0x8CD9, 0x96C9, 0xE8B3, 0x96CB, 0xE8B2, - 0x96CC, 0x8E93, 0x96CD, 0xE8B4, 0x96CE, 0xE8B1, 0x96D1, 0x8E47, - 0x96D5, 0xE8B8, 0x96D6, 0xE5AB, 0x96D9, 0x99D4, 0x96DB, 0x9097, - 0x96DC, 0xE8B6, 0x96E2, 0x97A3, 0x96E3, 0x93EF, 0x96E8, 0x894A, - 0x96EA, 0x90E1, 0x96EB, 0x8EB4, 0x96F0, 0x95B5, 0x96F2, 0x895F, - 0x96F6, 0x97EB, 0x96F7, 0x978B, 0x96F9, 0xE8B9, 0x96FB, 0x9364, - 0x9700, 0x8EF9, 0x9704, 0xE8BA, 0x9706, 0xE8BB, 0x9707, 0x906B, - 0x9708, 0xE8BC, 0x970A, 0x97EC, 0x970D, 0xE8B7, 0x970E, 0xE8BE, - 0x970F, 0xE8C0, 0x9711, 0xE8BF, 0x9713, 0xE8BD, 0x9716, 0xE8C1, - 0x9719, 0xE8C2, 0x971C, 0x919A, 0x971E, 0x89E0, 0x9724, 0xE8C3, - 0x9727, 0x96B6, 0x972A, 0xE8C4, 0x9730, 0xE8C5, 0x9732, 0x9849, - 0x9733, 0xFBED, 0x9738, 0x9E50, 0x9739, 0xE8C6, 0x973B, 0xFBEE, - 0x973D, 0xE8C7, 0x973E, 0xE8C8, 0x9742, 0xE8CC, 0x9743, 0xFBEF, - 0x9744, 0xE8C9, 0x9746, 0xE8CA, 0x9748, 0xE8CB, 0x9749, 0xE8CD, - 0x974D, 0xFBF0, 0x974F, 0xFBF1, 0x9751, 0xFBF2, 0x9752, 0x90C2, - 0x9755, 0xFBF3, 0x9756, 0x96F5, 0x9759, 0x90C3, 0x975C, 0xE8CE, - 0x975E, 0x94F1, 0x9760, 0xE8CF, 0x9761, 0xEA72, 0x9762, 0x96CA, - 0x9764, 0xE8D0, 0x9766, 0xE8D1, 0x9768, 0xE8D2, 0x9769, 0x8A76, - 0x976B, 0xE8D4, 0x976D, 0x9078, 0x9771, 0xE8D5, 0x9774, 0x8C43, - 0x9779, 0xE8D6, 0x977A, 0xE8DA, 0x977C, 0xE8D8, 0x9781, 0xE8D9, - 0x9784, 0x8A93, 0x9785, 0xE8D7, 0x9786, 0xE8DB, 0x978B, 0xE8DC, - 0x978D, 0x88C6, 0x978F, 0xE8DD, 0x9790, 0xE8DE, 0x9798, 0x8FE2, - 0x979C, 0xE8DF, 0x97A0, 0x8B66, 0x97A3, 0xE8E2, 0x97A6, 0xE8E1, - 0x97A8, 0xE8E0, 0x97AB, 0xE691, 0x97AD, 0x95DA, 0x97B3, 0xE8E3, - 0x97B4, 0xE8E4, 0x97C3, 0xE8E5, 0x97C6, 0xE8E6, 0x97C8, 0xE8E7, - 0x97CB, 0xE8E8, 0x97D3, 0x8AD8, 0x97DC, 0xE8E9, 0x97ED, 0xE8EA, - 0x97EE, 0x9442, 0x97F2, 0xE8EC, 0x97F3, 0x89B9, 0x97F5, 0xE8EF, - 0x97F6, 0xE8EE, 0x97FB, 0x8943, 0x97FF, 0x8BBF, 0x9801, 0x95C5, - 0x9802, 0x92B8, 0x9803, 0x8DA0, 0x9805, 0x8D80, 0x9806, 0x8F87, - 0x9808, 0x907B, 0x980C, 0xE8F1, 0x980F, 0xE8F0, 0x9810, 0x9761, - 0x9811, 0x8AE6, 0x9812, 0x94D0, 0x9813, 0x93DA, 0x9817, 0x909C, - 0x9818, 0x97CC, 0x981A, 0x8C7A, 0x9821, 0xE8F4, 0x9824, 0xE8F3, - 0x982C, 0x966A, 0x982D, 0x93AA, 0x9834, 0x896F, 0x9837, 0xE8F5, - 0x9838, 0xE8F2, 0x983B, 0x9570, 0x983C, 0x978A, 0x983D, 0xE8F6, - 0x9846, 0xE8F7, 0x984B, 0xE8F9, 0x984C, 0x91E8, 0x984D, 0x8A7A, - 0x984E, 0x8A7B, 0x984F, 0xE8F8, 0x9854, 0x8AE7, 0x9855, 0x8CB0, - 0x9857, 0xFBF4, 0x9858, 0x8AE8, 0x985B, 0x935E, 0x985E, 0x97DE, - 0x9865, 0xFBF5, 0x9867, 0x8CDA, 0x986B, 0xE8FA, 0x986F, 0xE8FB, - 0x9870, 0xE8FC, 0x9871, 0xE940, 0x9873, 0xE942, 0x9874, 0xE941, - 0x98A8, 0x9597, 0x98AA, 0xE943, 0x98AF, 0xE944, 0x98B1, 0xE945, - 0x98B6, 0xE946, 0x98C3, 0xE948, 0x98C4, 0xE947, 0x98C6, 0xE949, - 0x98DB, 0x94F2, 0x98DC, 0xE3CA, 0x98DF, 0x9048, 0x98E2, 0x8B51, - 0x98E9, 0xE94A, 0x98EB, 0xE94B, 0x98ED, 0x99AA, 0x98EE, 0x9F5A, - 0x98EF, 0x94D1, 0x98F2, 0x88F9, 0x98F4, 0x88B9, 0x98FC, 0x8E94, - 0x98FD, 0x964F, 0x98FE, 0x8FFC, 0x9903, 0xE94C, 0x9905, 0x96DD, - 0x9909, 0xE94D, 0x990A, 0x977B, 0x990C, 0x8961, 0x9910, 0x8E60, - 0x9912, 0xE94E, 0x9913, 0x89EC, 0x9914, 0xE94F, 0x9918, 0xE950, - 0x991D, 0xE952, 0x991E, 0xE953, 0x9920, 0xE955, 0x9921, 0xE951, - 0x9924, 0xE954, 0x9927, 0xFBF8, 0x9928, 0x8AD9, 0x992C, 0xE956, - 0x992E, 0xE957, 0x993D, 0xE958, 0x993E, 0xE959, 0x9942, 0xE95A, - 0x9945, 0xE95C, 0x9949, 0xE95B, 0x994B, 0xE95E, 0x994C, 0xE961, - 0x9950, 0xE95D, 0x9951, 0xE95F, 0x9952, 0xE960, 0x9955, 0xE962, - 0x9957, 0x8BC0, 0x9996, 0x8EF1, 0x9997, 0xE963, 0x9998, 0xE964, - 0x9999, 0x8D81, 0x999E, 0xFBFA, 0x99A5, 0xE965, 0x99A8, 0x8A5D, - 0x99AC, 0x946E, 0x99AD, 0xE966, 0x99AE, 0xE967, 0x99B3, 0x9279, - 0x99B4, 0x93E9, 0x99BC, 0xE968, 0x99C1, 0x949D, 0x99C4, 0x91CA, - 0x99C5, 0x8977, 0x99C6, 0x8BEC, 0x99C8, 0x8BED, 0x99D0, 0x9293, - 0x99D1, 0xE96D, 0x99D2, 0x8BEE, 0x99D5, 0x89ED, 0x99D8, 0xE96C, - 0x99DB, 0xE96A, 0x99DD, 0xE96B, 0x99DF, 0xE969, 0x99E2, 0xE977, - 0x99ED, 0xE96E, 0x99EE, 0xE96F, 0x99F1, 0xE970, 0x99F2, 0xE971, - 0x99F8, 0xE973, 0x99FB, 0xE972, 0x99FF, 0x8F78, 0x9A01, 0xE974, - 0x9A05, 0xE976, 0x9A0E, 0x8B52, 0x9A0F, 0xE975, 0x9A12, 0x919B, - 0x9A13, 0x8CB1, 0x9A19, 0xE978, 0x9A28, 0x91CB, 0x9A2B, 0xE979, - 0x9A30, 0x93AB, 0x9A37, 0xE97A, 0x9A3E, 0xE980, 0x9A40, 0xE97D, - 0x9A42, 0xE97C, 0x9A43, 0xE97E, 0x9A45, 0xE97B, 0x9A4D, 0xE982, - 0x9A4E, 0xFBFB, 0x9A55, 0xE981, 0x9A57, 0xE984, 0x9A5A, 0x8BC1, - 0x9A5B, 0xE983, 0x9A5F, 0xE985, 0x9A62, 0xE986, 0x9A64, 0xE988, - 0x9A65, 0xE987, 0x9A69, 0xE989, 0x9A6A, 0xE98B, 0x9A6B, 0xE98A, - 0x9AA8, 0x8D9C, 0x9AAD, 0xE98C, 0x9AB0, 0xE98D, 0x9AB8, 0x8A5B, - 0x9ABC, 0xE98E, 0x9AC0, 0xE98F, 0x9AC4, 0x9091, 0x9ACF, 0xE990, - 0x9AD1, 0xE991, 0x9AD3, 0xE992, 0x9AD4, 0xE993, 0x9AD8, 0x8D82, - 0x9AD9, 0xFBFC, 0x9ADC, 0xFC40, 0x9ADE, 0xE994, 0x9ADF, 0xE995, - 0x9AE2, 0xE996, 0x9AE3, 0xE997, 0x9AE6, 0xE998, 0x9AEA, 0x94AF, - 0x9AEB, 0xE99A, 0x9AED, 0x9545, 0x9AEE, 0xE99B, 0x9AEF, 0xE999, - 0x9AF1, 0xE99D, 0x9AF4, 0xE99C, 0x9AF7, 0xE99E, 0x9AFB, 0xE99F, - 0x9B06, 0xE9A0, 0x9B18, 0xE9A1, 0x9B1A, 0xE9A2, 0x9B1F, 0xE9A3, - 0x9B22, 0xE9A4, 0x9B23, 0xE9A5, 0x9B25, 0xE9A6, 0x9B27, 0xE9A7, - 0x9B28, 0xE9A8, 0x9B29, 0xE9A9, 0x9B2A, 0xE9AA, 0x9B2E, 0xE9AB, - 0x9B2F, 0xE9AC, 0x9B31, 0x9F54, 0x9B32, 0xE9AD, 0x9B3B, 0xE2F6, - 0x9B3C, 0x8B53, 0x9B41, 0x8A40, 0x9B42, 0x8DB0, 0x9B43, 0xE9AF, - 0x9B44, 0xE9AE, 0x9B45, 0x96A3, 0x9B4D, 0xE9B1, 0x9B4E, 0xE9B2, - 0x9B4F, 0xE9B0, 0x9B51, 0xE9B3, 0x9B54, 0x9682, 0x9B58, 0xE9B4, - 0x9B5A, 0x8B9B, 0x9B6F, 0x9844, 0x9B72, 0xFC42, 0x9B74, 0xE9B5, - 0x9B75, 0xFC41, 0x9B83, 0xE9B7, 0x9B8E, 0x88BC, 0x9B8F, 0xFC43, - 0x9B91, 0xE9B8, 0x9B92, 0x95A9, 0x9B93, 0xE9B6, 0x9B96, 0xE9B9, - 0x9B97, 0xE9BA, 0x9B9F, 0xE9BB, 0x9BA0, 0xE9BC, 0x9BA8, 0xE9BD, - 0x9BAA, 0x968E, 0x9BAB, 0x8E4C, 0x9BAD, 0x8DF8, 0x9BAE, 0x914E, - 0x9BB1, 0xFC44, 0x9BB4, 0xE9BE, 0x9BB9, 0xE9C1, 0x9BBB, 0xFC45, - 0x9BC0, 0xE9BF, 0x9BC6, 0xE9C2, 0x9BC9, 0x8CEF, 0x9BCA, 0xE9C0, - 0x9BCF, 0xE9C3, 0x9BD1, 0xE9C4, 0x9BD2, 0xE9C5, 0x9BD4, 0xE9C9, - 0x9BD6, 0x8E49, 0x9BDB, 0x91E2, 0x9BE1, 0xE9CA, 0x9BE2, 0xE9C7, - 0x9BE3, 0xE9C6, 0x9BE4, 0xE9C8, 0x9BE8, 0x8C7E, 0x9BF0, 0xE9CE, - 0x9BF1, 0xE9CD, 0x9BF2, 0xE9CC, 0x9BF5, 0x88B1, 0x9C00, 0xFC46, - 0x9C04, 0xE9D8, 0x9C06, 0xE9D4, 0x9C08, 0xE9D5, 0x9C09, 0xE9D1, - 0x9C0A, 0xE9D7, 0x9C0C, 0xE9D3, 0x9C0D, 0x8A82, 0x9C10, 0x986B, - 0x9C12, 0xE9D6, 0x9C13, 0xE9D2, 0x9C14, 0xE9D0, 0x9C15, 0xE9CF, - 0x9C1B, 0xE9DA, 0x9C21, 0xE9DD, 0x9C24, 0xE9DC, 0x9C25, 0xE9DB, - 0x9C2D, 0x9568, 0x9C2E, 0xE9D9, 0x9C2F, 0x88F1, 0x9C30, 0xE9DE, - 0x9C32, 0xE9E0, 0x9C39, 0x8A8F, 0x9C3A, 0xE9CB, 0x9C3B, 0x8956, - 0x9C3E, 0xE9E2, 0x9C46, 0xE9E1, 0x9C47, 0xE9DF, 0x9C48, 0x924C, - 0x9C52, 0x9690, 0x9C57, 0x97D8, 0x9C5A, 0xE9E3, 0x9C60, 0xE9E4, - 0x9C67, 0xE9E5, 0x9C76, 0xE9E6, 0x9C78, 0xE9E7, 0x9CE5, 0x92B9, - 0x9CE7, 0xE9E8, 0x9CE9, 0x94B5, 0x9CEB, 0xE9ED, 0x9CEC, 0xE9E9, - 0x9CF0, 0xE9EA, 0x9CF3, 0x9650, 0x9CF4, 0x96C2, 0x9CF6, 0x93CE, - 0x9D03, 0xE9EE, 0x9D06, 0xE9EF, 0x9D07, 0x93BC, 0x9D08, 0xE9EC, - 0x9D09, 0xE9EB, 0x9D0E, 0x89A8, 0x9D12, 0xE9F7, 0x9D15, 0xE9F6, - 0x9D1B, 0x8995, 0x9D1F, 0xE9F4, 0x9D23, 0xE9F3, 0x9D26, 0xE9F1, - 0x9D28, 0x8A9B, 0x9D2A, 0xE9F0, 0x9D2B, 0x8EB0, 0x9D2C, 0x89A7, - 0x9D3B, 0x8D83, 0x9D3E, 0xE9FA, 0x9D3F, 0xE9F9, 0x9D41, 0xE9F8, - 0x9D44, 0xE9F5, 0x9D46, 0xE9FB, 0x9D48, 0xE9FC, 0x9D50, 0xEA44, - 0x9D51, 0xEA43, 0x9D59, 0xEA45, 0x9D5C, 0x894C, 0x9D5D, 0xEA40, - 0x9D5E, 0xEA41, 0x9D60, 0x8D94, 0x9D61, 0x96B7, 0x9D64, 0xEA42, - 0x9D6B, 0xFC48, 0x9D6C, 0x9651, 0x9D6F, 0xEA4A, 0x9D70, 0xFC47, - 0x9D72, 0xEA46, 0x9D7A, 0xEA4B, 0x9D87, 0xEA48, 0x9D89, 0xEA47, - 0x9D8F, 0x8C7B, 0x9D9A, 0xEA4C, 0x9DA4, 0xEA4D, 0x9DA9, 0xEA4E, - 0x9DAB, 0xEA49, 0x9DAF, 0xE9F2, 0x9DB2, 0xEA4F, 0x9DB4, 0x92DF, - 0x9DB8, 0xEA53, 0x9DBA, 0xEA54, 0x9DBB, 0xEA52, 0x9DC1, 0xEA51, - 0x9DC2, 0xEA57, 0x9DC4, 0xEA50, 0x9DC6, 0xEA55, 0x9DCF, 0xEA56, - 0x9DD3, 0xEA59, 0x9DD9, 0xEA58, 0x9DE6, 0xEA5B, 0x9DED, 0xEA5C, - 0x9DEF, 0xEA5D, 0x9DF2, 0x9868, 0x9DF8, 0xEA5A, 0x9DF9, 0x91E9, - 0x9DFA, 0x8DEB, 0x9DFD, 0xEA5E, 0x9E19, 0xFC4A, 0x9E1A, 0xEA5F, - 0x9E1B, 0xEA60, 0x9E1E, 0xEA61, 0x9E75, 0xEA62, 0x9E78, 0x8CB2, - 0x9E79, 0xEA63, 0x9E7D, 0xEA64, 0x9E7F, 0x8EAD, 0x9E81, 0xEA65, - 0x9E88, 0xEA66, 0x9E8B, 0xEA67, 0x9E8C, 0xEA68, 0x9E91, 0xEA6B, - 0x9E92, 0xEA69, 0x9E93, 0x985B, 0x9E95, 0xEA6A, 0x9E97, 0x97ED, - 0x9E9D, 0xEA6C, 0x9E9F, 0x97D9, 0x9EA5, 0xEA6D, 0x9EA6, 0x949E, - 0x9EA9, 0xEA6E, 0x9EAA, 0xEA70, 0x9EAD, 0xEA71, 0x9EB8, 0xEA6F, - 0x9EB9, 0x8D8D, 0x9EBA, 0x96CB, 0x9EBB, 0x9683, 0x9EBC, 0x9BF5, - 0x9EBE, 0x9F80, 0x9EBF, 0x969B, 0x9EC4, 0x89A9, 0x9ECC, 0xEA73, - 0x9ECD, 0x8B6F, 0x9ECE, 0xEA74, 0x9ECF, 0xEA75, 0x9ED0, 0xEA76, - 0x9ED1, 0xFC4B, 0x9ED2, 0x8D95, 0x9ED4, 0xEA77, 0x9ED8, 0xE0D2, - 0x9ED9, 0x96D9, 0x9EDB, 0x91E1, 0x9EDC, 0xEA78, 0x9EDD, 0xEA7A, - 0x9EDE, 0xEA79, 0x9EE0, 0xEA7B, 0x9EE5, 0xEA7C, 0x9EE8, 0xEA7D, - 0x9EEF, 0xEA7E, 0x9EF4, 0xEA80, 0x9EF6, 0xEA81, 0x9EF7, 0xEA82, - 0x9EF9, 0xEA83, 0x9EFB, 0xEA84, 0x9EFC, 0xEA85, 0x9EFD, 0xEA86, - 0x9F07, 0xEA87, 0x9F08, 0xEA88, 0x9F0E, 0x9343, 0x9F13, 0x8CDB, - 0x9F15, 0xEA8A, 0x9F20, 0x916C, 0x9F21, 0xEA8B, 0x9F2C, 0xEA8C, - 0x9F3B, 0x9540, 0x9F3E, 0xEA8D, 0x9F4A, 0xEA8E, 0x9F4B, 0xE256, - 0x9F4E, 0xE6D8, 0x9F4F, 0xE8EB, 0x9F52, 0xEA8F, 0x9F54, 0xEA90, - 0x9F5F, 0xEA92, 0x9F60, 0xEA93, 0x9F61, 0xEA94, 0x9F62, 0x97EE, - 0x9F63, 0xEA91, 0x9F66, 0xEA95, 0x9F67, 0xEA96, 0x9F6A, 0xEA98, - 0x9F6C, 0xEA97, 0x9F72, 0xEA9A, 0x9F76, 0xEA9B, 0x9F77, 0xEA99, - 0x9F8D, 0x97B4, 0x9F95, 0xEA9C, 0x9F9C, 0xEA9D, 0x9F9D, 0xE273, - 0x9FA0, 0xEA9E, 0xF929, 0xFAE0, 0xF9DC, 0xFBE9, 0xFA0E, 0xFA90, - 0xFA0F, 0xFA9B, 0xFA10, 0xFA9C, 0xFA11, 0xFAB1, 0xFA12, 0xFAD8, - 0xFA13, 0xFAE8, 0xFA14, 0xFAEA, 0xFA15, 0xFB58, 0xFA16, 0xFB5E, - 0xFA17, 0xFB75, 0xFA18, 0xFB7D, 0xFA19, 0xFB7E, 0xFA1A, 0xFB80, - 0xFA1B, 0xFB82, 0xFA1C, 0xFB86, 0xFA1D, 0xFB89, 0xFA1E, 0xFB92, - 0xFA1F, 0xFB9D, 0xFA20, 0xFB9F, 0xFA21, 0xFBA0, 0xFA22, 0xFBA9, - 0xFA23, 0xFBB1, 0xFA24, 0xFBB3, 0xFA25, 0xFBB4, 0xFA26, 0xFBB7, - 0xFA27, 0xFBD3, 0xFA28, 0xFBDA, 0xFA29, 0xFBEA, 0xFA2A, 0xFBF6, - 0xFA2B, 0xFBF7, 0xFA2C, 0xFBF9, 0xFA2D, 0xFC49, 0xFF01, 0x8149, - 0xFF02, 0xFA57, 0xFF03, 0x8194, 0xFF04, 0x8190, 0xFF05, 0x8193, - 0xFF06, 0x8195, 0xFF07, 0xFA56, 0xFF08, 0x8169, 0xFF09, 0x816A, - 0xFF0A, 0x8196, 0xFF0B, 0x817B, 0xFF0C, 0x8143, 0xFF0D, 0x817C, - 0xFF0E, 0x8144, 0xFF0F, 0x815E, 0xFF10, 0x824F, 0xFF11, 0x8250, - 0xFF12, 0x8251, 0xFF13, 0x8252, 0xFF14, 0x8253, 0xFF15, 0x8254, - 0xFF16, 0x8255, 0xFF17, 0x8256, 0xFF18, 0x8257, 0xFF19, 0x8258, - 0xFF1A, 0x8146, 0xFF1B, 0x8147, 0xFF1C, 0x8183, 0xFF1D, 0x8181, - 0xFF1E, 0x8184, 0xFF1F, 0x8148, 0xFF20, 0x8197, 0xFF21, 0x8260, - 0xFF22, 0x8261, 0xFF23, 0x8262, 0xFF24, 0x8263, 0xFF25, 0x8264, - 0xFF26, 0x8265, 0xFF27, 0x8266, 0xFF28, 0x8267, 0xFF29, 0x8268, - 0xFF2A, 0x8269, 0xFF2B, 0x826A, 0xFF2C, 0x826B, 0xFF2D, 0x826C, - 0xFF2E, 0x826D, 0xFF2F, 0x826E, 0xFF30, 0x826F, 0xFF31, 0x8270, - 0xFF32, 0x8271, 0xFF33, 0x8272, 0xFF34, 0x8273, 0xFF35, 0x8274, - 0xFF36, 0x8275, 0xFF37, 0x8276, 0xFF38, 0x8277, 0xFF39, 0x8278, - 0xFF3A, 0x8279, 0xFF3B, 0x816D, 0xFF3C, 0x815F, 0xFF3D, 0x816E, - 0xFF3E, 0x814F, 0xFF3F, 0x8151, 0xFF40, 0x814D, 0xFF41, 0x8281, - 0xFF42, 0x8282, 0xFF43, 0x8283, 0xFF44, 0x8284, 0xFF45, 0x8285, - 0xFF46, 0x8286, 0xFF47, 0x8287, 0xFF48, 0x8288, 0xFF49, 0x8289, - 0xFF4A, 0x828A, 0xFF4B, 0x828B, 0xFF4C, 0x828C, 0xFF4D, 0x828D, - 0xFF4E, 0x828E, 0xFF4F, 0x828F, 0xFF50, 0x8290, 0xFF51, 0x8291, - 0xFF52, 0x8292, 0xFF53, 0x8293, 0xFF54, 0x8294, 0xFF55, 0x8295, - 0xFF56, 0x8296, 0xFF57, 0x8297, 0xFF58, 0x8298, 0xFF59, 0x8299, - 0xFF5A, 0x829A, 0xFF5B, 0x816F, 0xFF5C, 0x8162, 0xFF5D, 0x8170, - 0xFF5E, 0x8160, 0xFF61, 0x00A1, 0xFF62, 0x00A2, 0xFF63, 0x00A3, - 0xFF64, 0x00A4, 0xFF65, 0x00A5, 0xFF66, 0x00A6, 0xFF67, 0x00A7, - 0xFF68, 0x00A8, 0xFF69, 0x00A9, 0xFF6A, 0x00AA, 0xFF6B, 0x00AB, - 0xFF6C, 0x00AC, 0xFF6D, 0x00AD, 0xFF6E, 0x00AE, 0xFF6F, 0x00AF, - 0xFF70, 0x00B0, 0xFF71, 0x00B1, 0xFF72, 0x00B2, 0xFF73, 0x00B3, - 0xFF74, 0x00B4, 0xFF75, 0x00B5, 0xFF76, 0x00B6, 0xFF77, 0x00B7, - 0xFF78, 0x00B8, 0xFF79, 0x00B9, 0xFF7A, 0x00BA, 0xFF7B, 0x00BB, - 0xFF7C, 0x00BC, 0xFF7D, 0x00BD, 0xFF7E, 0x00BE, 0xFF7F, 0x00BF, - 0xFF80, 0x00C0, 0xFF81, 0x00C1, 0xFF82, 0x00C2, 0xFF83, 0x00C3, - 0xFF84, 0x00C4, 0xFF85, 0x00C5, 0xFF86, 0x00C6, 0xFF87, 0x00C7, - 0xFF88, 0x00C8, 0xFF89, 0x00C9, 0xFF8A, 0x00CA, 0xFF8B, 0x00CB, - 0xFF8C, 0x00CC, 0xFF8D, 0x00CD, 0xFF8E, 0x00CE, 0xFF8F, 0x00CF, - 0xFF90, 0x00D0, 0xFF91, 0x00D1, 0xFF92, 0x00D2, 0xFF93, 0x00D3, - 0xFF94, 0x00D4, 0xFF95, 0x00D5, 0xFF96, 0x00D6, 0xFF97, 0x00D7, - 0xFF98, 0x00D8, 0xFF99, 0x00D9, 0xFF9A, 0x00DA, 0xFF9B, 0x00DB, - 0xFF9C, 0x00DC, 0xFF9D, 0x00DD, 0xFF9E, 0x00DE, 0xFF9F, 0x00DF, - 0xFFE0, 0x8191, 0xFFE1, 0x8192, 0xFFE2, 0x81CA, 0xFFE3, 0x8150, - 0xFFE4, 0xFA55, 0xFFE5, 0x818F, 0, 0 + 0x309B, 0x814A, 0x309C, 0x814B, 0x309D, 0x8154, 0x309E, 0x8155, + 0x30A1, 0x8340, 0x30A2, 0x8341, 0x30A3, 0x8342, 0x30A4, 0x8343, + 0x30A5, 0x8344, 0x30A6, 0x8345, 0x30A7, 0x8346, 0x30A8, 0x8347, + 0x30A9, 0x8348, 0x30AA, 0x8349, 0x30AB, 0x834A, 0x30AC, 0x834B, + 0x30AD, 0x834C, 0x30AE, 0x834D, 0x30AF, 0x834E, 0x30B0, 0x834F, + 0x30B1, 0x8350, 0x30B2, 0x8351, 0x30B3, 0x8352, 0x30B4, 0x8353, + 0x30B5, 0x8354, 0x30B6, 0x8355, 0x30B7, 0x8356, 0x30B8, 0x8357, + 0x30B9, 0x8358, 0x30BA, 0x8359, 0x30BB, 0x835A, 0x30BC, 0x835B, + 0x30BD, 0x835C, 0x30BE, 0x835D, 0x30BF, 0x835E, 0x30C0, 0x835F, + 0x30C1, 0x8360, 0x30C2, 0x8361, 0x30C3, 0x8362, 0x30C4, 0x8363, + 0x30C5, 0x8364, 0x30C6, 0x8365, 0x30C7, 0x8366, 0x30C8, 0x8367, + 0x30C9, 0x8368, 0x30CA, 0x8369, 0x30CB, 0x836A, 0x30CC, 0x836B, + 0x30CD, 0x836C, 0x30CE, 0x836D, 0x30CF, 0x836E, 0x30D0, 0x836F, + 0x30D1, 0x8370, 0x30D2, 0x8371, 0x30D3, 0x8372, 0x30D4, 0x8373, + 0x30D5, 0x8374, 0x30D6, 0x8375, 0x30D7, 0x8376, 0x30D8, 0x8377, + 0x30D9, 0x8378, 0x30DA, 0x8379, 0x30DB, 0x837A, 0x30DC, 0x837B, + 0x30DD, 0x837C, 0x30DE, 0x837D, 0x30DF, 0x837E, 0x30E0, 0x8380, + 0x30E1, 0x8381, 0x30E2, 0x8382, 0x30E3, 0x8383, 0x30E4, 0x8384, + 0x30E5, 0x8385, 0x30E6, 0x8386, 0x30E7, 0x8387, 0x30E8, 0x8388, + 0x30E9, 0x8389, 0x30EA, 0x838A, 0x30EB, 0x838B, 0x30EC, 0x838C, + 0x30ED, 0x838D, 0x30EE, 0x838E, 0x30EF, 0x838F, 0x30F0, 0x8390, + 0x30F1, 0x8391, 0x30F2, 0x8392, 0x30F3, 0x8393, 0x30F4, 0x8394, + 0x30F5, 0x8395, 0x30F6, 0x8396, 0x30FB, 0x8145, 0x30FC, 0x815B, + 0x30FD, 0x8152, 0x30FE, 0x8153, 0x3231, 0x878A, 0x3232, 0x878B, + 0x3239, 0x878C, 0x32A4, 0x8785, 0x32A5, 0x8786, 0x32A6, 0x8787, + 0x32A7, 0x8788, 0x32A8, 0x8789, 0x3303, 0x8765, 0x330D, 0x8769, + 0x3314, 0x8760, 0x3318, 0x8763, 0x3322, 0x8761, 0x3323, 0x876B, + 0x3326, 0x876A, 0x3327, 0x8764, 0x332B, 0x876C, 0x3336, 0x8766, + 0x333B, 0x876E, 0x3349, 0x875F, 0x334A, 0x876D, 0x334D, 0x8762, + 0x3351, 0x8767, 0x3357, 0x8768, 0x337B, 0x877E, 0x337C, 0x878F, + 0x337D, 0x878E, 0x337E, 0x878D, 0x338E, 0x8772, 0x338F, 0x8773, + 0x339C, 0x876F, 0x339D, 0x8770, 0x339E, 0x8771, 0x33A1, 0x8775, + 0x33C4, 0x8774, 0x33CD, 0x8783, 0x4E00, 0x88EA, 0x4E01, 0x929A, + 0x4E03, 0x8EB5, 0x4E07, 0x969C, 0x4E08, 0x8FE4, 0x4E09, 0x8E4F, + 0x4E0A, 0x8FE3, 0x4E0B, 0x89BA, 0x4E0D, 0x9573, 0x4E0E, 0x975E, + 0x4E10, 0x98A0, 0x4E11, 0x894E, 0x4E14, 0x8A8E, 0x4E15, 0x98A1, + 0x4E16, 0x90A2, 0x4E17, 0x99C0, 0x4E18, 0x8B75, 0x4E19, 0x95B8, + 0x4E1E, 0x8FE5, 0x4E21, 0x97BC, 0x4E26, 0x95C0, 0x4E28, 0xFA68, + 0x4E2A, 0x98A2, 0x4E2D, 0x9286, 0x4E31, 0x98A3, 0x4E32, 0x8BF8, + 0x4E36, 0x98A4, 0x4E38, 0x8ADB, 0x4E39, 0x924F, 0x4E3B, 0x8EE5, + 0x4E3C, 0x98A5, 0x4E3F, 0x98A6, 0x4E42, 0x98A7, 0x4E43, 0x9454, + 0x4E45, 0x8B76, 0x4E4B, 0x9456, 0x4E4D, 0x93E1, 0x4E4E, 0x8CC1, + 0x4E4F, 0x9652, 0x4E55, 0xE568, 0x4E56, 0x98A8, 0x4E57, 0x8FE6, + 0x4E58, 0x98A9, 0x4E59, 0x89B3, 0x4E5D, 0x8BE3, 0x4E5E, 0x8CEE, + 0x4E5F, 0x96E7, 0x4E62, 0x9BA4, 0x4E71, 0x9790, 0x4E73, 0x93FB, + 0x4E7E, 0x8AA3, 0x4E80, 0x8B54, 0x4E82, 0x98AA, 0x4E85, 0x98AB, + 0x4E86, 0x97B9, 0x4E88, 0x975C, 0x4E89, 0x9188, 0x4E8A, 0x98AD, + 0x4E8B, 0x8E96, 0x4E8C, 0x93F1, 0x4E8E, 0x98B0, 0x4E91, 0x895D, + 0x4E92, 0x8CDD, 0x4E94, 0x8CDC, 0x4E95, 0x88E4, 0x4E98, 0x986A, + 0x4E99, 0x9869, 0x4E9B, 0x8DB1, 0x4E9C, 0x889F, 0x4E9E, 0x98B1, + 0x4E9F, 0x98B2, 0x4EA0, 0x98B3, 0x4EA1, 0x9653, 0x4EA2, 0x98B4, + 0x4EA4, 0x8CF0, 0x4EA5, 0x88E5, 0x4EA6, 0x9692, 0x4EA8, 0x8B9C, + 0x4EAB, 0x8B9D, 0x4EAC, 0x8B9E, 0x4EAD, 0x92E0, 0x4EAE, 0x97BA, + 0x4EB0, 0x98B5, 0x4EB3, 0x98B6, 0x4EB6, 0x98B7, 0x4EBA, 0x906C, + 0x4EC0, 0x8F59, 0x4EC1, 0x906D, 0x4EC2, 0x98BC, 0x4EC4, 0x98BA, + 0x4EC6, 0x98BB, 0x4EC7, 0x8B77, 0x4ECA, 0x8DA1, 0x4ECB, 0x89EE, + 0x4ECD, 0x98B9, 0x4ECE, 0x98B8, 0x4ECF, 0x95A7, 0x4ED4, 0x8E65, + 0x4ED5, 0x8E64, 0x4ED6, 0x91BC, 0x4ED7, 0x98BD, 0x4ED8, 0x9574, + 0x4ED9, 0x90E5, 0x4EDD, 0x8157, 0x4EDE, 0x98BE, 0x4EDF, 0x98C0, + 0x4EE1, 0xFA69, 0x4EE3, 0x91E3, 0x4EE4, 0x97DF, 0x4EE5, 0x88C8, + 0x4EED, 0x98BF, 0x4EEE, 0x89BC, 0x4EF0, 0x8BC2, 0x4EF2, 0x9287, + 0x4EF6, 0x8C8F, 0x4EF7, 0x98C1, 0x4EFB, 0x9443, 0x4EFC, 0xFA6A, + 0x4F00, 0xFA6B, 0x4F01, 0x8AE9, 0x4F03, 0xFA6C, 0x4F09, 0x98C2, + 0x4F0A, 0x88C9, 0x4F0D, 0x8CDE, 0x4F0E, 0x8AEA, 0x4F0F, 0x959A, + 0x4F10, 0x94B0, 0x4F11, 0x8B78, 0x4F1A, 0x89EF, 0x4F1C, 0x98E5, + 0x4F1D, 0x9360, 0x4F2F, 0x948C, 0x4F30, 0x98C4, 0x4F34, 0x94BA, + 0x4F36, 0x97E0, 0x4F38, 0x904C, 0x4F39, 0xFA6D, 0x4F3A, 0x8E66, + 0x4F3C, 0x8E97, 0x4F3D, 0x89BE, 0x4F43, 0x92CF, 0x4F46, 0x9241, + 0x4F47, 0x98C8, 0x4F4D, 0x88CA, 0x4F4E, 0x92E1, 0x4F4F, 0x8F5A, + 0x4F50, 0x8DB2, 0x4F51, 0x9743, 0x4F53, 0x91CC, 0x4F55, 0x89BD, + 0x4F56, 0xFA6E, 0x4F57, 0x98C7, 0x4F59, 0x975D, 0x4F5A, 0x98C3, + 0x4F5B, 0x98C5, 0x4F5C, 0x8DEC, 0x4F5D, 0x98C6, 0x4F5E, 0x9B43, + 0x4F69, 0x98CE, 0x4F6F, 0x98D1, 0x4F70, 0x98CF, 0x4F73, 0x89C0, + 0x4F75, 0x95B9, 0x4F76, 0x98C9, 0x4F7B, 0x98CD, 0x4F7C, 0x8CF1, + 0x4F7F, 0x8E67, 0x4F83, 0x8AA4, 0x4F86, 0x98D2, 0x4F88, 0x98CA, + 0x4F8A, 0xFA70, 0x4F8B, 0x97E1, 0x4F8D, 0x8E98, 0x4F8F, 0x98CB, + 0x4F91, 0x98D0, 0x4F92, 0xFA6F, 0x4F94, 0xFA72, 0x4F96, 0x98D3, + 0x4F98, 0x98CC, 0x4F9A, 0xFA71, 0x4F9B, 0x8B9F, 0x4F9D, 0x88CB, + 0x4FA0, 0x8BA0, 0x4FA1, 0x89BF, 0x4FAB, 0x9B44, 0x4FAD, 0x9699, + 0x4FAE, 0x958E, 0x4FAF, 0x8CF2, 0x4FB5, 0x904E, 0x4FB6, 0x97B5, + 0x4FBF, 0x95D6, 0x4FC2, 0x8C57, 0x4FC3, 0x91A3, 0x4FC4, 0x89E2, + 0x4FC9, 0xFA61, 0x4FCA, 0x8F72, 0x4FCD, 0xFA73, 0x4FCE, 0x98D7, + 0x4FD0, 0x98DC, 0x4FD1, 0x98DA, 0x4FD4, 0x98D5, 0x4FD7, 0x91AD, + 0x4FD8, 0x98D8, 0x4FDA, 0x98DB, 0x4FDB, 0x98D9, 0x4FDD, 0x95DB, + 0x4FDF, 0x98D6, 0x4FE1, 0x904D, 0x4FE3, 0x9693, 0x4FE4, 0x98DD, + 0x4FE5, 0x98DE, 0x4FEE, 0x8F43, 0x4FEF, 0x98EB, 0x4FF3, 0x946F, + 0x4FF5, 0x9555, 0x4FF6, 0x98E6, 0x4FF8, 0x95EE, 0x4FFA, 0x89B4, + 0x4FFE, 0x98EA, 0x4FFF, 0xFA76, 0x5005, 0x98E4, 0x5006, 0x98ED, + 0x5009, 0x9171, 0x500B, 0x8CC2, 0x500D, 0x947B, 0x500F, 0xE0C5, + 0x5011, 0x98EC, 0x5012, 0x937C, 0x5014, 0x98E1, 0x5016, 0x8CF4, + 0x5019, 0x8CF3, 0x501A, 0x98DF, 0x501E, 0xFA77, 0x501F, 0x8ED8, + 0x5021, 0x98E7, 0x5022, 0xFA75, 0x5023, 0x95ED, 0x5024, 0x926C, + 0x5025, 0x98E3, 0x5026, 0x8C91, 0x5028, 0x98E0, 0x5029, 0x98E8, + 0x502A, 0x98E2, 0x502B, 0x97CF, 0x502C, 0x98E9, 0x502D, 0x9860, + 0x5036, 0x8BE4, 0x5039, 0x8C90, 0x5040, 0xFA74, 0x5042, 0xFA7A, + 0x5043, 0x98EE, 0x5046, 0xFA78, 0x5047, 0x98EF, 0x5048, 0x98F3, + 0x5049, 0x88CC, 0x504F, 0x95CE, 0x5050, 0x98F2, 0x5055, 0x98F1, + 0x5056, 0x98F5, 0x505A, 0x98F4, 0x505C, 0x92E2, 0x5065, 0x8C92, + 0x506C, 0x98F6, 0x5070, 0xFA79, 0x5072, 0x8EC3, 0x5074, 0x91A4, + 0x5075, 0x92E3, 0x5076, 0x8BF4, 0x5078, 0x98F7, 0x507D, 0x8B55, + 0x5080, 0x98F8, 0x5085, 0x98FA, 0x508D, 0x9654, 0x5091, 0x8C86, + 0x5094, 0xFA7B, 0x5098, 0x8E50, 0x5099, 0x94F5, 0x509A, 0x98F9, + 0x50AC, 0x8DC3, 0x50AD, 0x9762, 0x50B2, 0x98FC, 0x50B3, 0x9942, + 0x50B4, 0x98FB, 0x50B5, 0x8DC2, 0x50B7, 0x8F9D, 0x50BE, 0x8C58, + 0x50C2, 0x9943, 0x50C5, 0x8BCD, 0x50C9, 0x9940, 0x50CA, 0x9941, + 0x50CD, 0x93AD, 0x50CF, 0x919C, 0x50D1, 0x8BA1, 0x50D5, 0x966C, + 0x50D6, 0x9944, 0x50D8, 0xFA7D, 0x50DA, 0x97BB, 0x50DE, 0x9945, + 0x50E3, 0x9948, 0x50E5, 0x9946, 0x50E7, 0x916D, 0x50ED, 0x9947, + 0x50EE, 0x9949, 0x50F4, 0xFA7C, 0x50F5, 0x994B, 0x50F9, 0x994A, + 0x50FB, 0x95C6, 0x5100, 0x8B56, 0x5101, 0x994D, 0x5102, 0x994E, + 0x5104, 0x89AD, 0x5109, 0x994C, 0x5112, 0x8EF2, 0x5114, 0x9951, + 0x5115, 0x9950, 0x5116, 0x994F, 0x5118, 0x98D4, 0x511A, 0x9952, + 0x511F, 0x8F9E, 0x5121, 0x9953, 0x512A, 0x9744, 0x5132, 0x96D7, + 0x5137, 0x9955, 0x513A, 0x9954, 0x513B, 0x9957, 0x513C, 0x9956, + 0x513F, 0x9958, 0x5140, 0x9959, 0x5141, 0x88F2, 0x5143, 0x8CB3, + 0x5144, 0x8C5A, 0x5145, 0x8F5B, 0x5146, 0x929B, 0x5147, 0x8BA2, + 0x5148, 0x90E6, 0x5149, 0x8CF5, 0x514A, 0xFA7E, 0x514B, 0x8D8E, + 0x514C, 0x995B, 0x514D, 0x96C6, 0x514E, 0x9365, 0x5150, 0x8E99, + 0x5152, 0x995A, 0x5154, 0x995C, 0x515A, 0x937D, 0x515C, 0x8A95, + 0x5162, 0x995D, 0x5164, 0xFA80, 0x5165, 0x93FC, 0x5168, 0x9153, + 0x5169, 0x995F, 0x516A, 0x9960, 0x516B, 0x94AA, 0x516C, 0x8CF6, + 0x516D, 0x985A, 0x516E, 0x9961, 0x5171, 0x8BA4, 0x5175, 0x95BA, + 0x5176, 0x91B4, 0x5177, 0x8BEF, 0x5178, 0x9354, 0x517C, 0x8C93, + 0x5180, 0x9962, 0x5182, 0x9963, 0x5185, 0x93E0, 0x5186, 0x897E, + 0x5189, 0x9966, 0x518A, 0x8DFB, 0x518C, 0x9965, 0x518D, 0x8DC4, + 0x518F, 0x9967, 0x5190, 0xE3EC, 0x5191, 0x9968, 0x5192, 0x9660, + 0x5193, 0x9969, 0x5195, 0x996A, 0x5196, 0x996B, 0x5197, 0x8FE7, + 0x5199, 0x8ECA, 0x519D, 0xFA81, 0x51A0, 0x8AA5, 0x51A2, 0x996E, + 0x51A4, 0x996C, 0x51A5, 0x96BB, 0x51A6, 0x996D, 0x51A8, 0x9579, + 0x51A9, 0x996F, 0x51AA, 0x9970, 0x51AB, 0x9971, 0x51AC, 0x937E, + 0x51B0, 0x9975, 0x51B1, 0x9973, 0x51B2, 0x9974, 0x51B3, 0x9972, + 0x51B4, 0x8DE1, 0x51B5, 0x9976, 0x51B6, 0x96E8, 0x51B7, 0x97E2, + 0x51BD, 0x9977, 0x51BE, 0xFA82, 0x51C4, 0x90A6, 0x51C5, 0x9978, + 0x51C6, 0x8F79, 0x51C9, 0x9979, 0x51CB, 0x929C, 0x51CC, 0x97BD, + 0x51CD, 0x9380, 0x51D6, 0x99C3, 0x51DB, 0x997A, 0x51DC, 0xEAA3, + 0x51DD, 0x8BC3, 0x51E0, 0x997B, 0x51E1, 0x967D, 0x51E6, 0x8F88, + 0x51E7, 0x91FA, 0x51E9, 0x997D, 0x51EA, 0x93E2, 0x51EC, 0xFA83, + 0x51ED, 0x997E, 0x51F0, 0x9980, 0x51F1, 0x8A4D, 0x51F5, 0x9981, + 0x51F6, 0x8BA5, 0x51F8, 0x93CA, 0x51F9, 0x899A, 0x51FA, 0x8F6F, + 0x51FD, 0x949F, 0x51FE, 0x9982, 0x5200, 0x9381, 0x5203, 0x906E, + 0x5204, 0x9983, 0x5206, 0x95AA, 0x5207, 0x90D8, 0x5208, 0x8AA0, + 0x520A, 0x8AA7, 0x520B, 0x9984, 0x520E, 0x9986, 0x5211, 0x8C59, + 0x5214, 0x9985, 0x5215, 0xFA84, 0x5217, 0x97F1, 0x521D, 0x8F89, + 0x5224, 0x94BB, 0x5225, 0x95CA, 0x5227, 0x9987, 0x5229, 0x9798, + 0x522A, 0x9988, 0x522E, 0x9989, 0x5230, 0x939E, 0x5233, 0x998A, + 0x5236, 0x90A7, 0x5237, 0x8DFC, 0x5238, 0x8C94, 0x5239, 0x998B, + 0x523A, 0x8E68, 0x523B, 0x8D8F, 0x5243, 0x92E4, 0x5244, 0x998D, + 0x5247, 0x91A5, 0x524A, 0x8DED, 0x524B, 0x998E, 0x524C, 0x998F, + 0x524D, 0x914F, 0x524F, 0x998C, 0x5254, 0x9991, 0x5256, 0x9655, + 0x525B, 0x8D84, 0x525E, 0x9990, 0x5263, 0x8C95, 0x5264, 0x8DDC, + 0x5265, 0x948D, 0x5269, 0x9994, 0x526A, 0x9992, 0x526F, 0x959B, + 0x5270, 0x8FE8, 0x5271, 0x999B, 0x5272, 0x8A84, 0x5273, 0x9995, + 0x5274, 0x9993, 0x5275, 0x916E, 0x527D, 0x9997, 0x527F, 0x9996, + 0x5283, 0x8A63, 0x5287, 0x8C80, 0x5288, 0x999C, 0x5289, 0x97AB, + 0x528D, 0x9998, 0x5291, 0x999D, 0x5292, 0x999A, 0x5294, 0x9999, + 0x529B, 0x97CD, 0x529C, 0xFA85, 0x529F, 0x8CF7, 0x52A0, 0x89C1, + 0x52A3, 0x97F2, 0x52A6, 0xFA86, 0x52A9, 0x8F95, 0x52AA, 0x9377, + 0x52AB, 0x8D85, 0x52AC, 0x99A0, 0x52AD, 0x99A1, 0x52AF, 0xFB77, + 0x52B1, 0x97E3, 0x52B4, 0x984A, 0x52B5, 0x99A3, 0x52B9, 0x8CF8, + 0x52BC, 0x99A2, 0x52BE, 0x8A4E, 0x52C0, 0xFA87, 0x52C1, 0x99A4, + 0x52C3, 0x9675, 0x52C5, 0x92BA, 0x52C7, 0x9745, 0x52C9, 0x95D7, + 0x52CD, 0x99A5, 0x52D2, 0xE8D3, 0x52D5, 0x93AE, 0x52D7, 0x99A6, + 0x52D8, 0x8AA8, 0x52D9, 0x96B1, 0x52DB, 0xFA88, 0x52DD, 0x8F9F, + 0x52DE, 0x99A7, 0x52DF, 0x95E5, 0x52E0, 0x99AB, 0x52E2, 0x90A8, + 0x52E3, 0x99A8, 0x52E4, 0x8BCE, 0x52E6, 0x99A9, 0x52E7, 0x8AA9, + 0x52F2, 0x8C4D, 0x52F3, 0x99AC, 0x52F5, 0x99AD, 0x52F8, 0x99AE, + 0x52F9, 0x99AF, 0x52FA, 0x8ED9, 0x52FE, 0x8CF9, 0x52FF, 0x96DC, + 0x5300, 0xFA89, 0x5301, 0x96E6, 0x5302, 0x93F5, 0x5305, 0x95EF, + 0x5306, 0x99B0, 0x5307, 0xFA8A, 0x5308, 0x99B1, 0x530D, 0x99B3, + 0x530F, 0x99B5, 0x5310, 0x99B4, 0x5315, 0x99B6, 0x5316, 0x89BB, + 0x5317, 0x966B, 0x5319, 0x8DFA, 0x531A, 0x99B7, 0x531D, 0x9178, + 0x5320, 0x8FA0, 0x5321, 0x8BA7, 0x5323, 0x99B8, 0x5324, 0xFA8B, + 0x532A, 0x94D9, 0x532F, 0x99B9, 0x5331, 0x99BA, 0x5333, 0x99BB, + 0x5338, 0x99BC, 0x5339, 0x9543, 0x533A, 0x8BE6, 0x533B, 0x88E3, + 0x533F, 0x93BD, 0x5340, 0x99BD, 0x5341, 0x8F5C, 0x5343, 0x90E7, + 0x5345, 0x99BF, 0x5346, 0x99BE, 0x5347, 0x8FA1, 0x5348, 0x8CDF, + 0x5349, 0x99C1, 0x534A, 0x94BC, 0x534D, 0x99C2, 0x5351, 0x94DA, + 0x5352, 0x91B2, 0x5353, 0x91EC, 0x5354, 0x8BA6, 0x5357, 0x93EC, + 0x5358, 0x9250, 0x535A, 0x948E, 0x535C, 0x966D, 0x535E, 0x99C4, + 0x5360, 0x90E8, 0x5366, 0x8C54, 0x5369, 0x99C5, 0x536E, 0x99C6, + 0x536F, 0x894B, 0x5370, 0x88F3, 0x5371, 0x8AEB, 0x5372, 0xFA8C, + 0x5373, 0x91A6, 0x5374, 0x8B70, 0x5375, 0x9791, 0x5377, 0x99C9, + 0x5378, 0x89B5, 0x537B, 0x99C8, 0x537F, 0x8BA8, 0x5382, 0x99CA, + 0x5384, 0x96EF, 0x5393, 0xFA8D, 0x5396, 0x99CB, 0x5398, 0x97D0, + 0x539A, 0x8CFA, 0x539F, 0x8CB4, 0x53A0, 0x99CC, 0x53A5, 0x99CE, + 0x53A6, 0x99CD, 0x53A8, 0x907E, 0x53A9, 0x8958, 0x53AD, 0x897D, + 0x53AE, 0x99CF, 0x53B0, 0x99D0, 0x53B2, 0xFA8E, 0x53B3, 0x8CB5, + 0x53B6, 0x99D1, 0x53BB, 0x8B8E, 0x53C2, 0x8E51, 0x53C3, 0x99D2, + 0x53C8, 0x9694, 0x53C9, 0x8DB3, 0x53CA, 0x8B79, 0x53CB, 0x9746, + 0x53CC, 0x916F, 0x53CD, 0x94BD, 0x53CE, 0x8EFB, 0x53D4, 0x8F66, + 0x53D6, 0x8EE6, 0x53D7, 0x8EF3, 0x53D9, 0x8F96, 0x53DB, 0x94BE, + 0x53DD, 0xFA8F, 0x53DF, 0x99D5, 0x53E1, 0x8962, 0x53E2, 0x9170, + 0x53E3, 0x8CFB, 0x53E4, 0x8CC3, 0x53E5, 0x8BE5, 0x53E8, 0x99D9, + 0x53E9, 0x9240, 0x53EA, 0x91FC, 0x53EB, 0x8BA9, 0x53EC, 0x8FA2, + 0x53ED, 0x99DA, 0x53EE, 0x99D8, 0x53EF, 0x89C2, 0x53F0, 0x91E4, + 0x53F1, 0x8EB6, 0x53F2, 0x8E6A, 0x53F3, 0x8945, 0x53F6, 0x8A90, + 0x53F7, 0x8D86, 0x53F8, 0x8E69, 0x53FA, 0x99DB, 0x5401, 0x99DC, + 0x5403, 0x8B68, 0x5404, 0x8A65, 0x5408, 0x8D87, 0x5409, 0x8B67, + 0x540A, 0x92DD, 0x540B, 0x8944, 0x540C, 0x93AF, 0x540D, 0x96BC, + 0x540E, 0x8D40, 0x540F, 0x9799, 0x5410, 0x9366, 0x5411, 0x8CFC, + 0x541B, 0x8C4E, 0x541D, 0x99E5, 0x541F, 0x8BE1, 0x5420, 0x9669, + 0x5426, 0x94DB, 0x5429, 0x99E4, 0x542B, 0x8ADC, 0x542C, 0x99DF, + 0x542D, 0x99E0, 0x542E, 0x99E2, 0x5436, 0x99E3, 0x5438, 0x8B7A, + 0x5439, 0x9081, 0x543B, 0x95AB, 0x543C, 0x99E1, 0x543D, 0x99DD, + 0x543E, 0x8CE1, 0x5440, 0x99DE, 0x5442, 0x9843, 0x5446, 0x95F0, + 0x5448, 0x92E6, 0x5449, 0x8CE0, 0x544A, 0x8D90, 0x544E, 0x99E6, + 0x5451, 0x93DB, 0x545F, 0x99EA, 0x5468, 0x8EFC, 0x546A, 0x8EF4, + 0x5470, 0x99ED, 0x5471, 0x99EB, 0x5473, 0x96A1, 0x5475, 0x99E8, + 0x5476, 0x99F1, 0x5477, 0x99EC, 0x547B, 0x99EF, 0x547C, 0x8CC4, + 0x547D, 0x96BD, 0x5480, 0x99F0, 0x5484, 0x99F2, 0x5486, 0x99F4, + 0x548A, 0xFA92, 0x548B, 0x8DEE, 0x548C, 0x9861, 0x548E, 0x99E9, + 0x548F, 0x99E7, 0x5490, 0x99F3, 0x5492, 0x99EE, 0x549C, 0xFA91, + 0x54A2, 0x99F6, 0x54A4, 0x9A42, 0x54A5, 0x99F8, 0x54A8, 0x99FC, + 0x54A9, 0xFA93, 0x54AB, 0x9A40, 0x54AC, 0x99F9, 0x54AF, 0x9A5D, + 0x54B2, 0x8DE7, 0x54B3, 0x8A50, 0x54B8, 0x99F7, 0x54BC, 0x9A44, + 0x54BD, 0x88F4, 0x54BE, 0x9A43, 0x54C0, 0x88A3, 0x54C1, 0x9569, + 0x54C2, 0x9A41, 0x54C4, 0x99FA, 0x54C7, 0x99F5, 0x54C8, 0x99FB, + 0x54C9, 0x8DC6, 0x54D8, 0x9A45, 0x54E1, 0x88F5, 0x54E2, 0x9A4E, + 0x54E5, 0x9A46, 0x54E6, 0x9A47, 0x54E8, 0x8FA3, 0x54E9, 0x9689, + 0x54ED, 0x9A4C, 0x54EE, 0x9A4B, 0x54F2, 0x934E, 0x54FA, 0x9A4D, + 0x54FD, 0x9A4A, 0x54FF, 0xFA94, 0x5504, 0x8953, 0x5506, 0x8DB4, + 0x5507, 0x904F, 0x550F, 0x9A48, 0x5510, 0x9382, 0x5514, 0x9A49, + 0x5516, 0x88A0, 0x552E, 0x9A53, 0x552F, 0x9742, 0x5531, 0x8FA5, + 0x5533, 0x9A59, 0x5538, 0x9A58, 0x5539, 0x9A4F, 0x553E, 0x91C1, + 0x5540, 0x9A50, 0x5544, 0x91ED, 0x5545, 0x9A55, 0x5546, 0x8FA4, + 0x554C, 0x9A52, 0x554F, 0x96E2, 0x5553, 0x8C5B, 0x5556, 0x9A56, + 0x5557, 0x9A57, 0x555C, 0x9A54, 0x555D, 0x9A5A, 0x5563, 0x9A51, + 0x557B, 0x9A60, 0x557C, 0x9A65, 0x557E, 0x9A61, 0x5580, 0x9A5C, + 0x5583, 0x9A66, 0x5584, 0x9150, 0x5586, 0xFA95, 0x5587, 0x9A68, + 0x5589, 0x8D41, 0x558A, 0x9A5E, 0x558B, 0x929D, 0x5598, 0x9A62, + 0x5599, 0x9A5B, 0x559A, 0x8AAB, 0x559C, 0x8AEC, 0x559D, 0x8A85, + 0x559E, 0x9A63, 0x559F, 0x9A5F, 0x55A7, 0x8C96, 0x55A8, 0x9A69, + 0x55A9, 0x9A67, 0x55AA, 0x9172, 0x55AB, 0x8B69, 0x55AC, 0x8BAA, + 0x55AE, 0x9A64, 0x55B0, 0x8BF2, 0x55B6, 0x8963, 0x55C4, 0x9A6D, + 0x55C5, 0x9A6B, 0x55C7, 0x9AA5, 0x55D4, 0x9A70, 0x55DA, 0x9A6A, + 0x55DC, 0x9A6E, 0x55DF, 0x9A6C, 0x55E3, 0x8E6B, 0x55E4, 0x9A6F, + 0x55F7, 0x9A72, 0x55F9, 0x9A77, 0x55FD, 0x9A75, 0x55FE, 0x9A74, + 0x5606, 0x9251, 0x5609, 0x89C3, 0x5614, 0x9A71, 0x5616, 0x9A73, + 0x5617, 0x8FA6, 0x5618, 0x8952, 0x561B, 0x9A76, 0x5629, 0x89DC, + 0x562F, 0x9A82, 0x5631, 0x8FFA, 0x5632, 0x9A7D, 0x5634, 0x9A7B, + 0x5636, 0x9A7C, 0x5638, 0x9A7E, 0x5642, 0x895C, 0x564C, 0x9158, + 0x564E, 0x9A78, 0x5650, 0x9A79, 0x565B, 0x8A9A, 0x5664, 0x9A81, + 0x5668, 0x8AED, 0x566A, 0x9A84, 0x566B, 0x9A80, 0x566C, 0x9A83, + 0x5674, 0x95AC, 0x5678, 0x93D3, 0x567A, 0x94B6, 0x5680, 0x9A86, + 0x5686, 0x9A85, 0x5687, 0x8A64, 0x568A, 0x9A87, 0x568F, 0x9A8A, + 0x5694, 0x9A89, 0x56A0, 0x9A88, 0x56A2, 0x9458, 0x56A5, 0x9A8B, + 0x56AE, 0x9A8C, 0x56B4, 0x9A8E, 0x56B6, 0x9A8D, 0x56BC, 0x9A90, + 0x56C0, 0x9A93, 0x56C1, 0x9A91, 0x56C2, 0x9A8F, 0x56C3, 0x9A92, + 0x56C8, 0x9A94, 0x56CE, 0x9A95, 0x56D1, 0x9A96, 0x56D3, 0x9A97, + 0x56D7, 0x9A98, 0x56D8, 0x9964, 0x56DA, 0x8EFA, 0x56DB, 0x8E6C, + 0x56DE, 0x89F1, 0x56E0, 0x88F6, 0x56E3, 0x9263, 0x56EE, 0x9A99, + 0x56F0, 0x8DA2, 0x56F2, 0x88CD, 0x56F3, 0x907D, 0x56F9, 0x9A9A, + 0x56FA, 0x8CC5, 0x56FD, 0x8D91, 0x56FF, 0x9A9C, 0x5700, 0x9A9B, + 0x5703, 0x95DE, 0x5704, 0x9A9D, 0x5708, 0x9A9F, 0x5709, 0x9A9E, + 0x570B, 0x9AA0, 0x570D, 0x9AA1, 0x570F, 0x8C97, 0x5712, 0x8980, + 0x5713, 0x9AA2, 0x5716, 0x9AA4, 0x5718, 0x9AA3, 0x571C, 0x9AA6, + 0x571F, 0x9379, 0x5726, 0x9AA7, 0x5727, 0x88B3, 0x5728, 0x8DDD, + 0x572D, 0x8C5C, 0x5730, 0x926E, 0x5737, 0x9AA8, 0x5738, 0x9AA9, + 0x573B, 0x9AAB, 0x5740, 0x9AAC, 0x5742, 0x8DE2, 0x5747, 0x8BCF, + 0x574A, 0x9656, 0x574E, 0x9AAA, 0x574F, 0x9AAD, 0x5750, 0x8DBF, + 0x5751, 0x8D42, 0x5759, 0xFA96, 0x5761, 0x9AB1, 0x5764, 0x8DA3, + 0x5765, 0xFA97, 0x5766, 0x9252, 0x5769, 0x9AAE, 0x576A, 0x92D8, + 0x577F, 0x9AB2, 0x5782, 0x9082, 0x5788, 0x9AB0, 0x5789, 0x9AB3, + 0x578B, 0x8C5E, 0x5793, 0x9AB4, 0x57A0, 0x9AB5, 0x57A2, 0x8D43, + 0x57A3, 0x8A5F, 0x57A4, 0x9AB7, 0x57AA, 0x9AB8, 0x57AC, 0xFA98, + 0x57B0, 0x9AB9, 0x57B3, 0x9AB6, 0x57C0, 0x9AAF, 0x57C3, 0x9ABA, + 0x57C6, 0x9ABB, 0x57C7, 0xFA9A, 0x57C8, 0xFA99, 0x57CB, 0x9684, + 0x57CE, 0x8FE9, 0x57D2, 0x9ABD, 0x57D3, 0x9ABE, 0x57D4, 0x9ABC, + 0x57D6, 0x9AC0, 0x57DC, 0x9457, 0x57DF, 0x88E6, 0x57E0, 0x9575, + 0x57E3, 0x9AC1, 0x57F4, 0x8FFB, 0x57F7, 0x8EB7, 0x57F9, 0x947C, + 0x57FA, 0x8AEE, 0x57FC, 0x8DE9, 0x5800, 0x9678, 0x5802, 0x93B0, + 0x5805, 0x8C98, 0x5806, 0x91CD, 0x580A, 0x9ABF, 0x580B, 0x9AC2, + 0x5815, 0x91C2, 0x5819, 0x9AC3, 0x581D, 0x9AC4, 0x5821, 0x9AC6, + 0x5824, 0x92E7, 0x582A, 0x8AAC, 0x582F, 0xEA9F, 0x5830, 0x8981, + 0x5831, 0x95F1, 0x5834, 0x8FEA, 0x5835, 0x9367, 0x583A, 0x8DE4, + 0x583D, 0x9ACC, 0x5840, 0x95BB, 0x5841, 0x97DB, 0x584A, 0x89F2, + 0x584B, 0x9AC8, 0x5851, 0x9159, 0x5852, 0x9ACB, 0x5854, 0x9383, + 0x5857, 0x9368, 0x5858, 0x9384, 0x5859, 0x94B7, 0x585A, 0x92CB, + 0x585E, 0x8DC7, 0x5862, 0x9AC7, 0x5869, 0x8996, 0x586B, 0x9355, + 0x5870, 0x9AC9, 0x5872, 0x9AC5, 0x5875, 0x906F, 0x5879, 0x9ACD, + 0x587E, 0x8F6D, 0x5883, 0x8BAB, 0x5885, 0x9ACE, 0x5893, 0x95E6, + 0x5897, 0x919D, 0x589C, 0x92C4, 0x589E, 0xFA9D, 0x589F, 0x9AD0, + 0x58A8, 0x966E, 0x58AB, 0x9AD1, 0x58AE, 0x9AD6, 0x58B2, 0xFA9E, + 0x58B3, 0x95AD, 0x58B8, 0x9AD5, 0x58B9, 0x9ACF, 0x58BA, 0x9AD2, + 0x58BB, 0x9AD4, 0x58BE, 0x8DA4, 0x58C1, 0x95C7, 0x58C5, 0x9AD7, + 0x58C7, 0x9264, 0x58CA, 0x89F3, 0x58CC, 0x8FEB, 0x58D1, 0x9AD9, + 0x58D3, 0x9AD8, 0x58D5, 0x8D88, 0x58D7, 0x9ADA, 0x58D8, 0x9ADC, + 0x58D9, 0x9ADB, 0x58DC, 0x9ADE, 0x58DE, 0x9AD3, 0x58DF, 0x9AE0, + 0x58E4, 0x9ADF, 0x58E5, 0x9ADD, 0x58EB, 0x8E6D, 0x58EC, 0x9070, + 0x58EE, 0x9173, 0x58EF, 0x9AE1, 0x58F0, 0x90BA, 0x58F1, 0x88EB, + 0x58F2, 0x9484, 0x58F7, 0x92D9, 0x58F9, 0x9AE3, 0x58FA, 0x9AE2, + 0x58FB, 0x9AE4, 0x58FC, 0x9AE5, 0x58FD, 0x9AE6, 0x5902, 0x9AE7, + 0x5909, 0x95CF, 0x590A, 0x9AE8, 0x590B, 0xFA9F, 0x590F, 0x89C4, + 0x5910, 0x9AE9, 0x5915, 0x975B, 0x5916, 0x8A4F, 0x5918, 0x99C7, + 0x5919, 0x8F67, 0x591A, 0x91BD, 0x591B, 0x9AEA, 0x591C, 0x96E9, + 0x5922, 0x96B2, 0x5925, 0x9AEC, 0x5927, 0x91E5, 0x5929, 0x9356, + 0x592A, 0x91BE, 0x592B, 0x9576, 0x592C, 0x9AED, 0x592D, 0x9AEE, + 0x592E, 0x899B, 0x5931, 0x8EB8, 0x5932, 0x9AEF, 0x5937, 0x88CE, + 0x5938, 0x9AF0, 0x593E, 0x9AF1, 0x5944, 0x8982, 0x5947, 0x8AEF, + 0x5948, 0x93DE, 0x5949, 0x95F2, 0x594E, 0x9AF5, 0x594F, 0x9174, + 0x5950, 0x9AF4, 0x5951, 0x8C5F, 0x5953, 0xFAA0, 0x5954, 0x967A, + 0x5955, 0x9AF3, 0x5957, 0x9385, 0x5958, 0x9AF7, 0x595A, 0x9AF6, + 0x595B, 0xFAA1, 0x595D, 0xFAA2, 0x5960, 0x9AF9, 0x5962, 0x9AF8, + 0x5963, 0xFAA3, 0x5965, 0x899C, 0x5967, 0x9AFA, 0x5968, 0x8FA7, + 0x5969, 0x9AFC, 0x596A, 0x9244, 0x596C, 0x9AFB, 0x596E, 0x95B1, + 0x5973, 0x8F97, 0x5974, 0x937A, 0x5978, 0x9B40, 0x597D, 0x8D44, + 0x5981, 0x9B41, 0x5982, 0x9440, 0x5983, 0x94DC, 0x5984, 0x96CF, + 0x598A, 0x9444, 0x598D, 0x9B4A, 0x5993, 0x8B57, 0x5996, 0x9764, + 0x5999, 0x96AD, 0x599B, 0x9BAA, 0x599D, 0x9B42, 0x59A3, 0x9B45, + 0x59A4, 0xFAA4, 0x59A5, 0x91C3, 0x59A8, 0x9657, 0x59AC, 0x9369, + 0x59B2, 0x9B46, 0x59B9, 0x9685, 0x59BA, 0xFAA5, 0x59BB, 0x8DC8, + 0x59BE, 0x8FA8, 0x59C6, 0x9B47, 0x59C9, 0x8E6F, 0x59CB, 0x8E6E, + 0x59D0, 0x88B7, 0x59D1, 0x8CC6, 0x59D3, 0x90A9, 0x59D4, 0x88CF, + 0x59D9, 0x9B4B, 0x59DA, 0x9B4C, 0x59DC, 0x9B49, 0x59E5, 0x8957, + 0x59E6, 0x8AAD, 0x59E8, 0x9B48, 0x59EA, 0x96C3, 0x59EB, 0x9550, + 0x59F6, 0x88A6, 0x59FB, 0x88F7, 0x59FF, 0x8E70, 0x5A01, 0x88D0, + 0x5A03, 0x88A1, 0x5A09, 0x9B51, 0x5A11, 0x9B4F, 0x5A18, 0x96BA, + 0x5A1A, 0x9B52, 0x5A1C, 0x9B50, 0x5A1F, 0x9B4E, 0x5A20, 0x9050, + 0x5A25, 0x9B4D, 0x5A29, 0x95D8, 0x5A2F, 0x8CE2, 0x5A35, 0x9B56, + 0x5A36, 0x9B57, 0x5A3C, 0x8FA9, 0x5A40, 0x9B53, 0x5A41, 0x984B, + 0x5A46, 0x946B, 0x5A49, 0x9B55, 0x5A5A, 0x8DA5, 0x5A62, 0x9B58, + 0x5A66, 0x9577, 0x5A6A, 0x9B59, 0x5A6C, 0x9B54, 0x5A7F, 0x96B9, + 0x5A92, 0x947D, 0x5A9A, 0x9B5A, 0x5A9B, 0x9551, 0x5ABC, 0x9B5B, + 0x5ABD, 0x9B5F, 0x5ABE, 0x9B5C, 0x5AC1, 0x89C5, 0x5AC2, 0x9B5E, + 0x5AC9, 0x8EB9, 0x5ACB, 0x9B5D, 0x5ACC, 0x8C99, 0x5AD0, 0x9B6B, + 0x5AD6, 0x9B64, 0x5AD7, 0x9B61, 0x5AE1, 0x9284, 0x5AE3, 0x9B60, + 0x5AE6, 0x9B62, 0x5AE9, 0x9B63, 0x5AFA, 0x9B65, 0x5AFB, 0x9B66, + 0x5B09, 0x8AF0, 0x5B0B, 0x9B68, 0x5B0C, 0x9B67, 0x5B16, 0x9B69, + 0x5B22, 0x8FEC, 0x5B2A, 0x9B6C, 0x5B2C, 0x92DA, 0x5B30, 0x8964, + 0x5B32, 0x9B6A, 0x5B36, 0x9B6D, 0x5B3E, 0x9B6E, 0x5B40, 0x9B71, + 0x5B43, 0x9B6F, 0x5B45, 0x9B70, 0x5B50, 0x8E71, 0x5B51, 0x9B72, + 0x5B54, 0x8D45, 0x5B55, 0x9B73, 0x5B56, 0xFAA6, 0x5B57, 0x8E9A, + 0x5B58, 0x91B6, 0x5B5A, 0x9B74, 0x5B5B, 0x9B75, 0x5B5C, 0x8E79, + 0x5B5D, 0x8D46, 0x5B5F, 0x96D0, 0x5B63, 0x8B47, 0x5B64, 0x8CC7, + 0x5B65, 0x9B76, 0x5B66, 0x8A77, 0x5B69, 0x9B77, 0x5B6B, 0x91B7, + 0x5B70, 0x9B78, 0x5B71, 0x9BA1, 0x5B73, 0x9B79, 0x5B75, 0x9B7A, + 0x5B78, 0x9B7B, 0x5B7A, 0x9B7D, 0x5B80, 0x9B7E, 0x5B83, 0x9B80, + 0x5B85, 0x91EE, 0x5B87, 0x8946, 0x5B88, 0x8EE7, 0x5B89, 0x88C0, + 0x5B8B, 0x9176, 0x5B8C, 0x8AAE, 0x5B8D, 0x8EB3, 0x5B8F, 0x8D47, + 0x5B95, 0x9386, 0x5B97, 0x8F40, 0x5B98, 0x8AAF, 0x5B99, 0x9288, + 0x5B9A, 0x92E8, 0x5B9B, 0x88B6, 0x5B9C, 0x8B58, 0x5B9D, 0x95F3, + 0x5B9F, 0x8EC0, 0x5BA2, 0x8B71, 0x5BA3, 0x90E9, 0x5BA4, 0x8EBA, + 0x5BA5, 0x9747, 0x5BA6, 0x9B81, 0x5BAE, 0x8B7B, 0x5BB0, 0x8DC9, + 0x5BB3, 0x8A51, 0x5BB4, 0x8983, 0x5BB5, 0x8FAA, 0x5BB6, 0x89C6, + 0x5BB8, 0x9B82, 0x5BB9, 0x9765, 0x5BBF, 0x8F68, 0x5BC0, 0xFAA7, + 0x5BC2, 0x8EE2, 0x5BC3, 0x9B83, 0x5BC4, 0x8AF1, 0x5BC5, 0x93D0, + 0x5BC6, 0x96A7, 0x5BC7, 0x9B84, 0x5BC9, 0x9B85, 0x5BCC, 0x9578, + 0x5BD0, 0x9B87, 0x5BD2, 0x8AA6, 0x5BD3, 0x8BF5, 0x5BD4, 0x9B86, + 0x5BD8, 0xFAA9, 0x5BDB, 0x8AB0, 0x5BDD, 0x9051, 0x5BDE, 0x9B8B, + 0x5BDF, 0x8E40, 0x5BE1, 0x89C7, 0x5BE2, 0x9B8A, 0x5BE4, 0x9B88, + 0x5BE5, 0x9B8C, 0x5BE6, 0x9B89, 0x5BE7, 0x944A, 0x5BE8, 0x9ECB, + 0x5BE9, 0x9052, 0x5BEB, 0x9B8D, 0x5BEC, 0xFAAA, 0x5BEE, 0x97BE, + 0x5BF0, 0x9B8E, 0x5BF3, 0x9B90, 0x5BF5, 0x929E, 0x5BF6, 0x9B8F, + 0x5BF8, 0x90A1, 0x5BFA, 0x8E9B, 0x5BFE, 0x91CE, 0x5BFF, 0x8EF5, + 0x5C01, 0x9595, 0x5C02, 0x90EA, 0x5C04, 0x8ECB, 0x5C05, 0x9B91, + 0x5C06, 0x8FAB, 0x5C07, 0x9B92, 0x5C08, 0x9B93, 0x5C09, 0x88D1, + 0x5C0A, 0x91B8, 0x5C0B, 0x9071, 0x5C0D, 0x9B94, 0x5C0E, 0x93B1, + 0x5C0F, 0x8FAC, 0x5C11, 0x8FAD, 0x5C13, 0x9B95, 0x5C16, 0x90EB, + 0x5C1A, 0x8FAE, 0x5C1E, 0xFAAB, 0x5C20, 0x9B96, 0x5C22, 0x9B97, + 0x5C24, 0x96DE, 0x5C28, 0x9B98, 0x5C2D, 0x8BC4, 0x5C31, 0x8F41, + 0x5C38, 0x9B99, 0x5C39, 0x9B9A, 0x5C3A, 0x8EDA, 0x5C3B, 0x904B, + 0x5C3C, 0x93F2, 0x5C3D, 0x9073, 0x5C3E, 0x94F6, 0x5C3F, 0x9441, + 0x5C40, 0x8BC7, 0x5C41, 0x9B9B, 0x5C45, 0x8B8F, 0x5C46, 0x9B9C, + 0x5C48, 0x8BFC, 0x5C4A, 0x93CD, 0x5C4B, 0x89AE, 0x5C4D, 0x8E72, + 0x5C4E, 0x9B9D, 0x5C4F, 0x9BA0, 0x5C50, 0x9B9F, 0x5C51, 0x8BFB, + 0x5C53, 0x9B9E, 0x5C55, 0x9357, 0x5C5E, 0x91AE, 0x5C60, 0x936A, + 0x5C61, 0x8EC6, 0x5C64, 0x9177, 0x5C65, 0x979A, 0x5C6C, 0x9BA2, + 0x5C6E, 0x9BA3, 0x5C6F, 0x93D4, 0x5C71, 0x8E52, 0x5C76, 0x9BA5, + 0x5C79, 0x9BA6, 0x5C8C, 0x9BA7, 0x5C90, 0x8AF2, 0x5C91, 0x9BA8, + 0x5C94, 0x9BA9, 0x5CA1, 0x89AA, 0x5CA6, 0xFAAC, 0x5CA8, 0x915A, + 0x5CA9, 0x8AE2, 0x5CAB, 0x9BAB, 0x5CAC, 0x96A6, 0x5CB1, 0x91D0, + 0x5CB3, 0x8A78, 0x5CB6, 0x9BAD, 0x5CB7, 0x9BAF, 0x5CB8, 0x8ADD, + 0x5CBA, 0xFAAD, 0x5CBB, 0x9BAC, 0x5CBC, 0x9BAE, 0x5CBE, 0x9BB1, + 0x5CC5, 0x9BB0, 0x5CC7, 0x9BB2, 0x5CD9, 0x9BB3, 0x5CE0, 0x93BB, + 0x5CE1, 0x8BAC, 0x5CE8, 0x89E3, 0x5CE9, 0x9BB4, 0x5CEA, 0x9BB9, + 0x5CED, 0x9BB7, 0x5CEF, 0x95F5, 0x5CF0, 0x95F4, 0x5CF5, 0xFAAE, + 0x5CF6, 0x9387, 0x5CFA, 0x9BB6, 0x5CFB, 0x8F73, 0x5CFD, 0x9BB5, + 0x5D07, 0x9092, 0x5D0B, 0x9BBA, 0x5D0E, 0x8DE8, 0x5D11, 0x9BC0, + 0x5D14, 0x9BC1, 0x5D15, 0x9BBB, 0x5D16, 0x8A52, 0x5D17, 0x9BBC, + 0x5D18, 0x9BC5, 0x5D19, 0x9BC4, 0x5D1A, 0x9BC3, 0x5D1B, 0x9BBF, + 0x5D1F, 0x9BBE, 0x5D22, 0x9BC2, 0x5D27, 0xFAAF, 0x5D29, 0x95F6, + 0x5D42, 0xFAB2, 0x5D4B, 0x9BC9, 0x5D4C, 0x9BC6, 0x5D4E, 0x9BC8, + 0x5D50, 0x9792, 0x5D52, 0x9BC7, 0x5D53, 0xFAB0, 0x5D5C, 0x9BBD, + 0x5D69, 0x9093, 0x5D6C, 0x9BCA, 0x5D6D, 0xFAB3, 0x5D6F, 0x8DB5, + 0x5D73, 0x9BCB, 0x5D76, 0x9BCC, 0x5D82, 0x9BCF, 0x5D84, 0x9BCE, + 0x5D87, 0x9BCD, 0x5D8B, 0x9388, 0x5D8C, 0x9BB8, 0x5D90, 0x9BD5, + 0x5D9D, 0x9BD1, 0x5DA2, 0x9BD0, 0x5DAC, 0x9BD2, 0x5DAE, 0x9BD3, + 0x5DB7, 0x9BD6, 0x5DB8, 0xFAB4, 0x5DB9, 0xFAB5, 0x5DBA, 0x97E4, + 0x5DBC, 0x9BD7, 0x5DBD, 0x9BD4, 0x5DC9, 0x9BD8, 0x5DCC, 0x8ADE, + 0x5DCD, 0x9BD9, 0x5DD0, 0xFAB6, 0x5DD2, 0x9BDB, 0x5DD3, 0x9BDA, + 0x5DD6, 0x9BDC, 0x5DDB, 0x9BDD, 0x5DDD, 0x90EC, 0x5DDE, 0x8F42, + 0x5DE1, 0x8F84, 0x5DE3, 0x9183, 0x5DE5, 0x8D48, 0x5DE6, 0x8DB6, + 0x5DE7, 0x8D49, 0x5DE8, 0x8B90, 0x5DEB, 0x9BDE, 0x5DEE, 0x8DB7, + 0x5DF1, 0x8CC8, 0x5DF2, 0x9BDF, 0x5DF3, 0x96A4, 0x5DF4, 0x9462, + 0x5DF5, 0x9BE0, 0x5DF7, 0x8D4A, 0x5DFB, 0x8AAA, 0x5DFD, 0x9246, + 0x5DFE, 0x8BD0, 0x5E02, 0x8E73, 0x5E03, 0x957A, 0x5E06, 0x94BF, + 0x5E0B, 0x9BE1, 0x5E0C, 0x8AF3, 0x5E11, 0x9BE4, 0x5E16, 0x929F, + 0x5E19, 0x9BE3, 0x5E1A, 0x9BE2, 0x5E1B, 0x9BE5, 0x5E1D, 0x92E9, + 0x5E25, 0x9083, 0x5E2B, 0x8E74, 0x5E2D, 0x90C8, 0x5E2F, 0x91D1, + 0x5E30, 0x8B41, 0x5E33, 0x92A0, 0x5E36, 0x9BE6, 0x5E37, 0x9BE7, + 0x5E38, 0x8FED, 0x5E3D, 0x9658, 0x5E40, 0x9BEA, 0x5E43, 0x9BE9, + 0x5E44, 0x9BE8, 0x5E45, 0x959D, 0x5E47, 0x9BF1, 0x5E4C, 0x9679, + 0x5E4E, 0x9BEB, 0x5E54, 0x9BED, 0x5E55, 0x968B, 0x5E57, 0x9BEC, + 0x5E5F, 0x9BEE, 0x5E61, 0x94A6, 0x5E62, 0x9BEF, 0x5E63, 0x95BC, + 0x5E64, 0x9BF0, 0x5E72, 0x8AB1, 0x5E73, 0x95BD, 0x5E74, 0x944E, + 0x5E75, 0x9BF2, 0x5E76, 0x9BF3, 0x5E78, 0x8D4B, 0x5E79, 0x8AB2, + 0x5E7A, 0x9BF4, 0x5E7B, 0x8CB6, 0x5E7C, 0x9763, 0x5E7D, 0x9748, + 0x5E7E, 0x8AF4, 0x5E7F, 0x9BF6, 0x5E81, 0x92A1, 0x5E83, 0x8D4C, + 0x5E84, 0x8FAF, 0x5E87, 0x94DD, 0x5E8A, 0x8FB0, 0x5E8F, 0x8F98, + 0x5E95, 0x92EA, 0x5E96, 0x95F7, 0x5E97, 0x9358, 0x5E9A, 0x8D4D, + 0x5E9C, 0x957B, 0x5EA0, 0x9BF7, 0x5EA6, 0x9378, 0x5EA7, 0x8DC0, + 0x5EAB, 0x8CC9, 0x5EAD, 0x92EB, 0x5EB5, 0x88C1, 0x5EB6, 0x8F8E, + 0x5EB7, 0x8D4E, 0x5EB8, 0x9766, 0x5EC1, 0x9BF8, 0x5EC2, 0x9BF9, + 0x5EC3, 0x9470, 0x5EC8, 0x9BFA, 0x5EC9, 0x97F5, 0x5ECA, 0x984C, + 0x5ECF, 0x9BFC, 0x5ED0, 0x9BFB, 0x5ED3, 0x8A66, 0x5ED6, 0x9C40, + 0x5EDA, 0x9C43, 0x5EDB, 0x9C44, 0x5EDD, 0x9C42, 0x5EDF, 0x955F, + 0x5EE0, 0x8FB1, 0x5EE1, 0x9C46, 0x5EE2, 0x9C45, 0x5EE3, 0x9C41, + 0x5EE8, 0x9C47, 0x5EE9, 0x9C48, 0x5EEC, 0x9C49, 0x5EF0, 0x9C4C, + 0x5EF1, 0x9C4A, 0x5EF3, 0x9C4B, 0x5EF4, 0x9C4D, 0x5EF6, 0x8984, + 0x5EF7, 0x92EC, 0x5EF8, 0x9C4E, 0x5EFA, 0x8C9A, 0x5EFB, 0x89F4, + 0x5EFC, 0x9455, 0x5EFE, 0x9C4F, 0x5EFF, 0x93F9, 0x5F01, 0x95D9, + 0x5F03, 0x9C50, 0x5F04, 0x984D, 0x5F09, 0x9C51, 0x5F0A, 0x95BE, + 0x5F0B, 0x9C54, 0x5F0C, 0x989F, 0x5F0D, 0x98AF, 0x5F0F, 0x8EAE, + 0x5F10, 0x93F3, 0x5F11, 0x9C55, 0x5F13, 0x8B7C, 0x5F14, 0x92A2, + 0x5F15, 0x88F8, 0x5F16, 0x9C56, 0x5F17, 0x95A4, 0x5F18, 0x8D4F, + 0x5F1B, 0x926F, 0x5F1F, 0x92ED, 0x5F21, 0xFAB7, 0x5F25, 0x96ED, + 0x5F26, 0x8CB7, 0x5F27, 0x8CCA, 0x5F29, 0x9C57, 0x5F2D, 0x9C58, + 0x5F2F, 0x9C5E, 0x5F31, 0x8EE3, 0x5F34, 0xFAB8, 0x5F35, 0x92A3, + 0x5F37, 0x8BAD, 0x5F38, 0x9C59, 0x5F3C, 0x954A, 0x5F3E, 0x9265, + 0x5F41, 0x9C5A, 0x5F45, 0xFA67, 0x5F48, 0x9C5B, 0x5F4A, 0x8BAE, + 0x5F4C, 0x9C5C, 0x5F4E, 0x9C5D, 0x5F51, 0x9C5F, 0x5F53, 0x9396, + 0x5F56, 0x9C60, 0x5F57, 0x9C61, 0x5F59, 0x9C62, 0x5F5C, 0x9C53, + 0x5F5D, 0x9C52, 0x5F61, 0x9C63, 0x5F62, 0x8C60, 0x5F66, 0x9546, + 0x5F67, 0xFAB9, 0x5F69, 0x8DCA, 0x5F6A, 0x9556, 0x5F6B, 0x92A4, + 0x5F6C, 0x956A, 0x5F6D, 0x9C64, 0x5F70, 0x8FB2, 0x5F71, 0x8965, + 0x5F73, 0x9C65, 0x5F77, 0x9C66, 0x5F79, 0x96F0, 0x5F7C, 0x94DE, + 0x5F7F, 0x9C69, 0x5F80, 0x899D, 0x5F81, 0x90AA, 0x5F82, 0x9C68, + 0x5F83, 0x9C67, 0x5F84, 0x8C61, 0x5F85, 0x91D2, 0x5F87, 0x9C6D, + 0x5F88, 0x9C6B, 0x5F8A, 0x9C6A, 0x5F8B, 0x97A5, 0x5F8C, 0x8CE3, + 0x5F90, 0x8F99, 0x5F91, 0x9C6C, 0x5F92, 0x936B, 0x5F93, 0x8F5D, + 0x5F97, 0x93BE, 0x5F98, 0x9C70, 0x5F99, 0x9C6F, 0x5F9E, 0x9C6E, + 0x5FA0, 0x9C71, 0x5FA1, 0x8CE4, 0x5FA8, 0x9C72, 0x5FA9, 0x959C, + 0x5FAA, 0x8F7A, 0x5FAD, 0x9C73, 0x5FAE, 0x94F7, 0x5FB3, 0x93BF, + 0x5FB4, 0x92A5, 0x5FB7, 0xFABA, 0x5FB9, 0x934F, 0x5FBC, 0x9C74, + 0x5FBD, 0x8B4A, 0x5FC3, 0x9053, 0x5FC5, 0x954B, 0x5FCC, 0x8AF5, + 0x5FCD, 0x9445, 0x5FD6, 0x9C75, 0x5FD7, 0x8E75, 0x5FD8, 0x9659, + 0x5FD9, 0x965A, 0x5FDC, 0x899E, 0x5FDD, 0x9C7A, 0x5FDE, 0xFABB, + 0x5FE0, 0x9289, 0x5FE4, 0x9C77, 0x5FEB, 0x89F5, 0x5FF0, 0x9CAB, + 0x5FF1, 0x9C79, 0x5FF5, 0x944F, 0x5FF8, 0x9C78, 0x5FFB, 0x9C76, + 0x5FFD, 0x8D9A, 0x5FFF, 0x9C7C, 0x600E, 0x9C83, 0x600F, 0x9C89, + 0x6010, 0x9C81, 0x6012, 0x937B, 0x6015, 0x9C86, 0x6016, 0x957C, + 0x6019, 0x9C80, 0x601B, 0x9C85, 0x601C, 0x97E5, 0x601D, 0x8E76, + 0x6020, 0x91D3, 0x6021, 0x9C7D, 0x6025, 0x8B7D, 0x6026, 0x9C88, + 0x6027, 0x90AB, 0x6028, 0x8985, 0x6029, 0x9C82, 0x602A, 0x89F6, + 0x602B, 0x9C87, 0x602F, 0x8BAF, 0x6031, 0x9C84, 0x603A, 0x9C8A, + 0x6041, 0x9C8C, 0x6042, 0x9C96, 0x6043, 0x9C94, 0x6046, 0x9C91, + 0x604A, 0x9C90, 0x604B, 0x97F6, 0x604D, 0x9C92, 0x6050, 0x8BB0, + 0x6052, 0x8D50, 0x6055, 0x8F9A, 0x6059, 0x9C99, 0x605A, 0x9C8B, + 0x605D, 0xFABC, 0x605F, 0x9C8F, 0x6060, 0x9C7E, 0x6062, 0x89F8, + 0x6063, 0x9C93, 0x6064, 0x9C95, 0x6065, 0x9270, 0x6068, 0x8DA6, + 0x6069, 0x89B6, 0x606A, 0x9C8D, 0x606B, 0x9C98, 0x606C, 0x9C97, + 0x606D, 0x8BB1, 0x606F, 0x91A7, 0x6070, 0x8A86, 0x6075, 0x8C62, + 0x6077, 0x9C8E, 0x6081, 0x9C9A, 0x6083, 0x9C9D, 0x6084, 0x9C9F, + 0x6085, 0xFABD, 0x6089, 0x8EBB, 0x608A, 0xFABE, 0x608B, 0x9CA5, + 0x608C, 0x92EE, 0x608D, 0x9C9B, 0x6092, 0x9CA3, 0x6094, 0x89F7, + 0x6096, 0x9CA1, 0x6097, 0x9CA2, 0x609A, 0x9C9E, 0x609B, 0x9CA0, + 0x609F, 0x8CE5, 0x60A0, 0x9749, 0x60A3, 0x8AB3, 0x60A6, 0x8978, + 0x60A7, 0x9CA4, 0x60A9, 0x9459, 0x60AA, 0x88AB, 0x60B2, 0x94DF, + 0x60B3, 0x9C7B, 0x60B4, 0x9CAA, 0x60B5, 0x9CAE, 0x60B6, 0x96E3, + 0x60B8, 0x9CA7, 0x60BC, 0x9389, 0x60BD, 0x9CAC, 0x60C5, 0x8FEE, + 0x60C6, 0x9CAD, 0x60C7, 0x93D5, 0x60D1, 0x9866, 0x60D3, 0x9CA9, + 0x60D5, 0xFAC0, 0x60D8, 0x9CAF, 0x60DA, 0x8D9B, 0x60DC, 0x90C9, + 0x60DE, 0xFABF, 0x60DF, 0x88D2, 0x60E0, 0x9CA8, 0x60E1, 0x9CA6, + 0x60E3, 0x9179, 0x60E7, 0x9C9C, 0x60E8, 0x8E53, 0x60F0, 0x91C4, + 0x60F1, 0x9CBB, 0x60F2, 0xFAC2, 0x60F3, 0x917A, 0x60F4, 0x9CB6, + 0x60F6, 0x9CB3, 0x60F7, 0x9CB4, 0x60F9, 0x8EE4, 0x60FA, 0x9CB7, + 0x60FB, 0x9CBA, 0x6100, 0x9CB5, 0x6101, 0x8F44, 0x6103, 0x9CB8, + 0x6106, 0x9CB2, 0x6108, 0x96FA, 0x6109, 0x96F9, 0x610D, 0x9CBC, + 0x610E, 0x9CBD, 0x610F, 0x88D3, 0x6111, 0xFAC3, 0x6115, 0x9CB1, + 0x611A, 0x8BF0, 0x611B, 0x88A4, 0x611F, 0x8AB4, 0x6120, 0xFAC1, + 0x6121, 0x9CB9, 0x6127, 0x9CC1, 0x6128, 0x9CC0, 0x612C, 0x9CC5, + 0x6130, 0xFAC5, 0x6134, 0x9CC6, 0x6137, 0xFAC4, 0x613C, 0x9CC4, + 0x613D, 0x9CC7, 0x613E, 0x9CBF, 0x613F, 0x9CC3, 0x6142, 0x9CC8, + 0x6144, 0x9CC9, 0x6147, 0x9CBE, 0x6148, 0x8E9C, 0x614A, 0x9CC2, + 0x614B, 0x91D4, 0x614C, 0x8D51, 0x614D, 0x9CB0, 0x614E, 0x9054, + 0x6153, 0x9CD6, 0x6155, 0x95E7, 0x6158, 0x9CCC, 0x6159, 0x9CCD, + 0x615A, 0x9CCE, 0x615D, 0x9CD5, 0x615F, 0x9CD4, 0x6162, 0x969D, + 0x6163, 0x8AB5, 0x6165, 0x9CD2, 0x6167, 0x8C64, 0x6168, 0x8A53, + 0x616B, 0x9CCF, 0x616E, 0x97B6, 0x616F, 0x9CD1, 0x6170, 0x88D4, + 0x6171, 0x9CD3, 0x6173, 0x9CCA, 0x6174, 0x9CD0, 0x6175, 0x9CD7, + 0x6176, 0x8C63, 0x6177, 0x9CCB, 0x617E, 0x977C, 0x6182, 0x974A, + 0x6187, 0x9CDA, 0x618A, 0x9CDE, 0x618E, 0x919E, 0x6190, 0x97F7, + 0x6191, 0x9CDF, 0x6194, 0x9CDC, 0x6196, 0x9CD9, 0x6198, 0xFAC6, + 0x6199, 0x9CD8, 0x619A, 0x9CDD, 0x61A4, 0x95AE, 0x61A7, 0x93B2, + 0x61A9, 0x8C65, 0x61AB, 0x9CE0, 0x61AC, 0x9CDB, 0x61AE, 0x9CE1, + 0x61B2, 0x8C9B, 0x61B6, 0x89AF, 0x61BA, 0x9CE9, 0x61BE, 0x8AB6, + 0x61C3, 0x9CE7, 0x61C6, 0x9CE8, 0x61C7, 0x8DA7, 0x61C8, 0x9CE6, + 0x61C9, 0x9CE4, 0x61CA, 0x9CE3, 0x61CB, 0x9CEA, 0x61CC, 0x9CE2, + 0x61CD, 0x9CEC, 0x61D0, 0x89F9, 0x61E3, 0x9CEE, 0x61E6, 0x9CED, + 0x61F2, 0x92A6, 0x61F4, 0x9CF1, 0x61F6, 0x9CEF, 0x61F7, 0x9CE5, + 0x61F8, 0x8C9C, 0x61FA, 0x9CF0, 0x61FC, 0x9CF4, 0x61FD, 0x9CF3, + 0x61FE, 0x9CF5, 0x61FF, 0x9CF2, 0x6200, 0x9CF6, 0x6208, 0x9CF7, + 0x6209, 0x9CF8, 0x620A, 0x95E8, 0x620C, 0x9CFA, 0x620D, 0x9CF9, + 0x620E, 0x8F5E, 0x6210, 0x90AC, 0x6211, 0x89E4, 0x6212, 0x89FA, + 0x6213, 0xFAC7, 0x6214, 0x9CFB, 0x6216, 0x88BD, 0x621A, 0x90CA, + 0x621B, 0x9CFC, 0x621D, 0xE6C1, 0x621E, 0x9D40, 0x621F, 0x8C81, + 0x6221, 0x9D41, 0x6226, 0x90ED, 0x622A, 0x9D42, 0x622E, 0x9D43, + 0x622F, 0x8B59, 0x6230, 0x9D44, 0x6232, 0x9D45, 0x6233, 0x9D46, + 0x6234, 0x91D5, 0x6238, 0x8CCB, 0x623B, 0x96DF, 0x623F, 0x965B, + 0x6240, 0x8F8A, 0x6241, 0x9D47, 0x6247, 0x90EE, 0x6248, 0xE7BB, + 0x6249, 0x94E0, 0x624B, 0x8EE8, 0x624D, 0x8DCB, 0x624E, 0x9D48, + 0x6253, 0x91C5, 0x6255, 0x95A5, 0x6258, 0x91EF, 0x625B, 0x9D4B, + 0x625E, 0x9D49, 0x6260, 0x9D4C, 0x6263, 0x9D4A, 0x6268, 0x9D4D, + 0x626E, 0x95AF, 0x6271, 0x88B5, 0x6276, 0x957D, 0x6279, 0x94E1, + 0x627C, 0x9D4E, 0x627E, 0x9D51, 0x627F, 0x8FB3, 0x6280, 0x8B5A, + 0x6282, 0x9D4F, 0x6283, 0x9D56, 0x6284, 0x8FB4, 0x6289, 0x9D50, + 0x628A, 0x9463, 0x6291, 0x977D, 0x6292, 0x9D52, 0x6293, 0x9D53, + 0x6294, 0x9D57, 0x6295, 0x938A, 0x6296, 0x9D54, 0x6297, 0x8D52, + 0x6298, 0x90DC, 0x629B, 0x9D65, 0x629C, 0x94B2, 0x629E, 0x91F0, + 0x62A6, 0xFAC8, 0x62AB, 0x94E2, 0x62AC, 0x9DAB, 0x62B1, 0x95F8, + 0x62B5, 0x92EF, 0x62B9, 0x9695, 0x62BB, 0x9D5A, 0x62BC, 0x899F, + 0x62BD, 0x928A, 0x62C2, 0x9D63, 0x62C5, 0x9253, 0x62C6, 0x9D5D, + 0x62C7, 0x9D64, 0x62C8, 0x9D5F, 0x62C9, 0x9D66, 0x62CA, 0x9D62, + 0x62CC, 0x9D61, 0x62CD, 0x948F, 0x62CF, 0x9D5B, 0x62D0, 0x89FB, + 0x62D1, 0x9D59, 0x62D2, 0x8B91, 0x62D3, 0x91F1, 0x62D4, 0x9D55, + 0x62D7, 0x9D58, 0x62D8, 0x8D53, 0x62D9, 0x90D9, 0x62DB, 0x8FB5, + 0x62DC, 0x9D60, 0x62DD, 0x9471, 0x62E0, 0x8B92, 0x62E1, 0x8A67, + 0x62EC, 0x8A87, 0x62ED, 0x9040, 0x62EE, 0x9D68, 0x62EF, 0x9D6D, + 0x62F1, 0x9D69, 0x62F3, 0x8C9D, 0x62F5, 0x9D6E, 0x62F6, 0x8E41, + 0x62F7, 0x8D89, 0x62FE, 0x8F45, 0x62FF, 0x9D5C, 0x6301, 0x8E9D, + 0x6302, 0x9D6B, 0x6307, 0x8E77, 0x6308, 0x9D6C, 0x6309, 0x88C2, + 0x630C, 0x9D67, 0x6311, 0x92A7, 0x6319, 0x8B93, 0x631F, 0x8BB2, + 0x6327, 0x9D6A, 0x6328, 0x88A5, 0x632B, 0x8DC1, 0x632F, 0x9055, + 0x633A, 0x92F0, 0x633D, 0x94D2, 0x633E, 0x9D70, 0x633F, 0x917D, + 0x6349, 0x91A8, 0x634C, 0x8E4A, 0x634D, 0x9D71, 0x634F, 0x9D73, + 0x6350, 0x9D6F, 0x6355, 0x95DF, 0x6357, 0x92BB, 0x635C, 0x917B, + 0x6367, 0x95F9, 0x6368, 0x8ECC, 0x6369, 0x9D80, 0x636B, 0x9D7E, + 0x636E, 0x9098, 0x6372, 0x8C9E, 0x6376, 0x9D78, 0x6377, 0x8FB7, + 0x637A, 0x93E6, 0x637B, 0x9450, 0x6380, 0x9D76, 0x6383, 0x917C, + 0x6388, 0x8EF6, 0x6389, 0x9D7B, 0x638C, 0x8FB6, 0x638E, 0x9D75, + 0x638F, 0x9D7A, 0x6392, 0x9472, 0x6396, 0x9D74, 0x6398, 0x8C40, + 0x639B, 0x8A7C, 0x639F, 0x9D7C, 0x63A0, 0x97A9, 0x63A1, 0x8DCC, + 0x63A2, 0x9254, 0x63A3, 0x9D79, 0x63A5, 0x90DA, 0x63A7, 0x8D54, + 0x63A8, 0x9084, 0x63A9, 0x8986, 0x63AA, 0x915B, 0x63AB, 0x9D77, + 0x63AC, 0x8B64, 0x63B2, 0x8C66, 0x63B4, 0x92CD, 0x63B5, 0x9D7D, + 0x63BB, 0x917E, 0x63BE, 0x9D81, 0x63C0, 0x9D83, 0x63C3, 0x91B5, + 0x63C4, 0x9D89, 0x63C6, 0x9D84, 0x63C9, 0x9D86, 0x63CF, 0x9560, + 0x63D0, 0x92F1, 0x63D2, 0x9D87, 0x63D6, 0x974B, 0x63DA, 0x9767, + 0x63DB, 0x8AB7, 0x63E1, 0x88AC, 0x63E3, 0x9D85, 0x63E9, 0x9D82, + 0x63EE, 0x8AF6, 0x63F4, 0x8987, 0x63F5, 0xFAC9, 0x63F6, 0x9D88, + 0x63FA, 0x9768, 0x6406, 0x9D8C, 0x640D, 0x91B9, 0x640F, 0x9D93, + 0x6413, 0x9D8D, 0x6416, 0x9D8A, 0x6417, 0x9D91, 0x641C, 0x9D72, + 0x6426, 0x9D8E, 0x6428, 0x9D92, 0x642C, 0x94C0, 0x642D, 0x938B, + 0x6434, 0x9D8B, 0x6436, 0x9D8F, 0x643A, 0x8C67, 0x643E, 0x8DEF, + 0x6442, 0x90DB, 0x644E, 0x9D97, 0x6458, 0x9345, 0x6460, 0xFACA, + 0x6467, 0x9D94, 0x6469, 0x9680, 0x646F, 0x9D95, 0x6476, 0x9D96, + 0x6478, 0x96CC, 0x647A, 0x90A0, 0x6483, 0x8C82, 0x6488, 0x9D9D, + 0x6492, 0x8E54, 0x6493, 0x9D9A, 0x6495, 0x9D99, 0x649A, 0x9451, + 0x649D, 0xFACB, 0x649E, 0x93B3, 0x64A4, 0x9350, 0x64A5, 0x9D9B, + 0x64A9, 0x9D9C, 0x64AB, 0x958F, 0x64AD, 0x9464, 0x64AE, 0x8E42, + 0x64B0, 0x90EF, 0x64B2, 0x966F, 0x64B9, 0x8A68, 0x64BB, 0x9DA3, + 0x64BC, 0x9D9E, 0x64C1, 0x9769, 0x64C2, 0x9DA5, 0x64C5, 0x9DA1, + 0x64C7, 0x9DA2, 0x64CD, 0x9180, 0x64CE, 0xFACC, 0x64D2, 0x9DA0, + 0x64D4, 0x9D5E, 0x64D8, 0x9DA4, 0x64DA, 0x9D9F, 0x64E0, 0x9DA9, + 0x64E1, 0x9DAA, 0x64E2, 0x9346, 0x64E3, 0x9DAC, 0x64E6, 0x8E43, + 0x64E7, 0x9DA7, 0x64EC, 0x8B5B, 0x64EF, 0x9DAD, 0x64F1, 0x9DA6, + 0x64F2, 0x9DB1, 0x64F4, 0x9DB0, 0x64F6, 0x9DAF, 0x64FA, 0x9DB2, + 0x64FD, 0x9DB4, 0x64FE, 0x8FEF, 0x6500, 0x9DB3, 0x6505, 0x9DB7, + 0x6518, 0x9DB5, 0x651C, 0x9DB6, 0x651D, 0x9D90, 0x6523, 0x9DB9, + 0x6524, 0x9DB8, 0x652A, 0x9D98, 0x652B, 0x9DBA, 0x652C, 0x9DAE, + 0x652F, 0x8E78, 0x6534, 0x9DBB, 0x6535, 0x9DBC, 0x6536, 0x9DBE, + 0x6537, 0x9DBD, 0x6538, 0x9DBF, 0x6539, 0x89FC, 0x653B, 0x8D55, + 0x653E, 0x95FA, 0x653F, 0x90AD, 0x6545, 0x8CCC, 0x6548, 0x9DC1, + 0x654D, 0x9DC4, 0x654E, 0xFACD, 0x654F, 0x9571, 0x6551, 0x8B7E, + 0x6555, 0x9DC3, 0x6556, 0x9DC2, 0x6557, 0x9473, 0x6558, 0x9DC5, + 0x6559, 0x8BB3, 0x655D, 0x9DC7, 0x655E, 0x9DC6, 0x6562, 0x8AB8, + 0x6563, 0x8E55, 0x6566, 0x93D6, 0x656C, 0x8C68, 0x6570, 0x9094, + 0x6572, 0x9DC8, 0x6574, 0x90AE, 0x6575, 0x9347, 0x6577, 0x957E, + 0x6578, 0x9DC9, 0x6582, 0x9DCA, 0x6583, 0x9DCB, 0x6587, 0x95B6, + 0x6588, 0x9B7C, 0x6589, 0x90C4, 0x658C, 0x956B, 0x658E, 0x8DD6, + 0x6590, 0x94E3, 0x6591, 0x94C1, 0x6597, 0x936C, 0x6599, 0x97BF, + 0x659B, 0x9DCD, 0x659C, 0x8ECE, 0x659F, 0x9DCE, 0x65A1, 0x88B4, + 0x65A4, 0x8BD2, 0x65A5, 0x90CB, 0x65A7, 0x9580, 0x65AB, 0x9DCF, + 0x65AC, 0x8E61, 0x65AD, 0x9266, 0x65AF, 0x8E7A, 0x65B0, 0x9056, + 0x65B7, 0x9DD0, 0x65B9, 0x95FB, 0x65BC, 0x8997, 0x65BD, 0x8E7B, + 0x65C1, 0x9DD3, 0x65C3, 0x9DD1, 0x65C4, 0x9DD4, 0x65C5, 0x97B7, + 0x65C6, 0x9DD2, 0x65CB, 0x90F9, 0x65CC, 0x9DD5, 0x65CF, 0x91B0, + 0x65D2, 0x9DD6, 0x65D7, 0x8AF8, 0x65D9, 0x9DD8, 0x65DB, 0x9DD7, + 0x65E0, 0x9DD9, 0x65E1, 0x9DDA, 0x65E2, 0x8AF9, 0x65E5, 0x93FA, + 0x65E6, 0x9255, 0x65E7, 0x8B8C, 0x65E8, 0x8E7C, 0x65E9, 0x9181, + 0x65EC, 0x8F7B, 0x65ED, 0x88AE, 0x65F1, 0x9DDB, 0x65FA, 0x89A0, + 0x65FB, 0x9DDF, 0x6600, 0xFACE, 0x6602, 0x8D56, 0x6603, 0x9DDE, + 0x6606, 0x8DA9, 0x6607, 0x8FB8, 0x6609, 0xFAD1, 0x660A, 0x9DDD, + 0x660C, 0x8FB9, 0x660E, 0x96BE, 0x660F, 0x8DA8, 0x6613, 0x88D5, + 0x6614, 0x90CC, 0x6615, 0xFACF, 0x661C, 0x9DE4, 0x661E, 0xFAD3, + 0x661F, 0x90AF, 0x6620, 0x8966, 0x6624, 0xFAD4, 0x6625, 0x8F74, + 0x6627, 0x9686, 0x6628, 0x8DF0, 0x662D, 0x8FBA, 0x662E, 0xFAD2, + 0x662F, 0x90A5, 0x6631, 0xFA63, 0x6634, 0x9DE3, 0x6635, 0x9DE1, + 0x6636, 0x9DE2, 0x663B, 0xFAD0, 0x663C, 0x928B, 0x663F, 0x9E45, + 0x6641, 0x9DE8, 0x6642, 0x8E9E, 0x6643, 0x8D57, 0x6644, 0x9DE6, + 0x6649, 0x9DE7, 0x664B, 0x9057, 0x664F, 0x9DE5, 0x6652, 0x8E4E, + 0x6657, 0xFAD6, 0x6659, 0xFAD7, 0x665D, 0x9DEA, 0x665E, 0x9DE9, + 0x665F, 0x9DEE, 0x6662, 0x9DEF, 0x6664, 0x9DEB, 0x6665, 0xFAD5, + 0x6666, 0x8A41, 0x6667, 0x9DEC, 0x6668, 0x9DED, 0x6669, 0x94D3, + 0x666E, 0x9581, 0x666F, 0x8C69, 0x6670, 0x9DF0, 0x6673, 0xFAD9, + 0x6674, 0x90B0, 0x6676, 0x8FBB, 0x667A, 0x9271, 0x6681, 0x8BC5, + 0x6683, 0x9DF1, 0x6684, 0x9DF5, 0x6687, 0x89C9, 0x6688, 0x9DF2, + 0x6689, 0x9DF4, 0x668E, 0x9DF3, 0x6691, 0x8F8B, 0x6696, 0x9267, + 0x6697, 0x88C3, 0x6698, 0x9DF6, 0x6699, 0xFADA, 0x669D, 0x9DF7, + 0x66A0, 0xFADB, 0x66A2, 0x92A8, 0x66A6, 0x97EF, 0x66AB, 0x8E62, + 0x66AE, 0x95E9, 0x66B2, 0xFADC, 0x66B4, 0x965C, 0x66B8, 0x9E41, + 0x66B9, 0x9DF9, 0x66BC, 0x9DFC, 0x66BE, 0x9DFB, 0x66BF, 0xFADD, + 0x66C1, 0x9DF8, 0x66C4, 0x9E40, 0x66C7, 0x93DC, 0x66C9, 0x9DFA, + 0x66D6, 0x9E42, 0x66D9, 0x8F8C, 0x66DA, 0x9E43, 0x66DC, 0x976A, + 0x66DD, 0x9498, 0x66E0, 0x9E44, 0x66E6, 0x9E46, 0x66E9, 0x9E47, + 0x66F0, 0x9E48, 0x66F2, 0x8BC8, 0x66F3, 0x8967, 0x66F4, 0x8D58, + 0x66F5, 0x9E49, 0x66F7, 0x9E4A, 0x66F8, 0x8F91, 0x66F9, 0x9182, + 0x66FA, 0xFADE, 0x66FB, 0xFA66, 0x66FC, 0x99D6, 0x66FD, 0x915D, + 0x66FE, 0x915C, 0x66FF, 0x91D6, 0x6700, 0x8DC5, 0x6703, 0x98F0, + 0x6708, 0x8C8E, 0x6709, 0x974C, 0x670B, 0x95FC, 0x670D, 0x959E, + 0x670E, 0xFADF, 0x670F, 0x9E4B, 0x6714, 0x8DF1, 0x6715, 0x92BD, + 0x6716, 0x9E4C, 0x6717, 0x984E, 0x671B, 0x965D, 0x671D, 0x92A9, + 0x671E, 0x9E4D, 0x671F, 0x8AFA, 0x6726, 0x9E4E, 0x6727, 0x9E4F, + 0x6728, 0x96D8, 0x672A, 0x96A2, 0x672B, 0x9696, 0x672C, 0x967B, + 0x672D, 0x8E44, 0x672E, 0x9E51, 0x6731, 0x8EE9, 0x6734, 0x9670, + 0x6736, 0x9E53, 0x6737, 0x9E56, 0x6738, 0x9E55, 0x673A, 0x8AF7, + 0x673D, 0x8B80, 0x673F, 0x9E52, 0x6741, 0x9E54, 0x6746, 0x9E57, + 0x6749, 0x9099, 0x674E, 0x979B, 0x674F, 0x88C7, 0x6750, 0x8DDE, + 0x6751, 0x91BA, 0x6753, 0x8EDB, 0x6756, 0x8FF1, 0x6759, 0x9E5A, + 0x675C, 0x936D, 0x675E, 0x9E58, 0x675F, 0x91A9, 0x6760, 0x9E59, + 0x6761, 0x8FF0, 0x6762, 0x96DB, 0x6763, 0x9E5B, 0x6764, 0x9E5C, + 0x6765, 0x9788, 0x6766, 0xFAE1, 0x676A, 0x9E61, 0x676D, 0x8D59, + 0x676F, 0x9474, 0x6770, 0x9E5E, 0x6771, 0x938C, 0x6772, 0x9DDC, + 0x6773, 0x9DE0, 0x6775, 0x8B6E, 0x6777, 0x9466, 0x677C, 0x9E60, + 0x677E, 0x8FBC, 0x677F, 0x94C2, 0x6785, 0x9E66, 0x6787, 0x94F8, + 0x6789, 0x9E5D, 0x678B, 0x9E63, 0x678C, 0x9E62, 0x6790, 0x90CD, + 0x6795, 0x968D, 0x6797, 0x97D1, 0x679A, 0x9687, 0x679C, 0x89CA, + 0x679D, 0x8E7D, 0x67A0, 0x9867, 0x67A1, 0x9E65, 0x67A2, 0x9095, + 0x67A6, 0x9E64, 0x67A9, 0x9E5F, 0x67AF, 0x8CCD, 0x67B3, 0x9E6B, + 0x67B4, 0x9E69, 0x67B6, 0x89CB, 0x67B7, 0x9E67, 0x67B8, 0x9E6D, + 0x67B9, 0x9E73, 0x67BB, 0xFAE2, 0x67C0, 0xFAE4, 0x67C1, 0x91C6, + 0x67C4, 0x95BF, 0x67C6, 0x9E75, 0x67CA, 0x9541, 0x67CE, 0x9E74, + 0x67CF, 0x9490, 0x67D0, 0x965E, 0x67D1, 0x8AB9, 0x67D3, 0x90F5, + 0x67D4, 0x8F5F, 0x67D8, 0x92D1, 0x67DA, 0x974D, 0x67DD, 0x9E70, + 0x67DE, 0x9E6F, 0x67E2, 0x9E71, 0x67E4, 0x9E6E, 0x67E7, 0x9E76, + 0x67E9, 0x9E6C, 0x67EC, 0x9E6A, 0x67EE, 0x9E72, 0x67EF, 0x9E68, + 0x67F1, 0x928C, 0x67F3, 0x96F6, 0x67F4, 0x8EC4, 0x67F5, 0x8DF2, + 0x67FB, 0x8DB8, 0x67FE, 0x968F, 0x67FF, 0x8A60, 0x6801, 0xFAE5, + 0x6802, 0x92CC, 0x6803, 0x93C8, 0x6804, 0x8968, 0x6813, 0x90F0, + 0x6816, 0x90B2, 0x6817, 0x8C49, 0x681E, 0x9E78, 0x6821, 0x8D5A, + 0x6822, 0x8A9C, 0x6829, 0x9E7A, 0x682A, 0x8A94, 0x682B, 0x9E81, + 0x6832, 0x9E7D, 0x6834, 0x90F1, 0x6838, 0x8A6A, 0x6839, 0x8DAA, + 0x683C, 0x8A69, 0x683D, 0x8DCD, 0x6840, 0x9E7B, 0x6841, 0x8C85, + 0x6842, 0x8C6A, 0x6843, 0x938D, 0x6844, 0xFAE6, 0x6846, 0x9E79, + 0x6848, 0x88C4, 0x684D, 0x9E7C, 0x684E, 0x9E7E, 0x6850, 0x8BCB, + 0x6851, 0x8C4B, 0x6852, 0xFAE3, 0x6853, 0x8ABA, 0x6854, 0x8B6A, + 0x6859, 0x9E82, 0x685C, 0x8DF7, 0x685D, 0x9691, 0x685F, 0x8E56, + 0x6863, 0x9E83, 0x6867, 0x954F, 0x6874, 0x9E8F, 0x6876, 0x89B1, + 0x6877, 0x9E84, 0x687E, 0x9E95, 0x687F, 0x9E85, 0x6881, 0x97C0, + 0x6883, 0x9E8C, 0x6885, 0x947E, 0x688D, 0x9E94, 0x688F, 0x9E87, + 0x6893, 0x88B2, 0x6894, 0x9E89, 0x6897, 0x8D5B, 0x689B, 0x9E8B, + 0x689D, 0x9E8A, 0x689F, 0x9E86, 0x68A0, 0x9E91, 0x68A2, 0x8FBD, + 0x68A6, 0x9AEB, 0x68A7, 0x8CE6, 0x68A8, 0x979C, 0x68AD, 0x9E88, + 0x68AF, 0x92F2, 0x68B0, 0x8A42, 0x68B1, 0x8DAB, 0x68B3, 0x9E80, + 0x68B5, 0x9E90, 0x68B6, 0x8A81, 0x68B9, 0x9E8E, 0x68BA, 0x9E92, + 0x68BC, 0x938E, 0x68C4, 0x8AFC, 0x68C6, 0x9EB0, 0x68C8, 0xFA64, + 0x68C9, 0x96C7, 0x68CA, 0x9E97, 0x68CB, 0x8AFB, 0x68CD, 0x9E9E, + 0x68CF, 0xFAE7, 0x68D2, 0x965F, 0x68D4, 0x9E9F, 0x68D5, 0x9EA1, + 0x68D7, 0x9EA5, 0x68D8, 0x9E99, 0x68DA, 0x9249, 0x68DF, 0x938F, + 0x68E0, 0x9EA9, 0x68E1, 0x9E9C, 0x68E3, 0x9EA6, 0x68E7, 0x9EA0, + 0x68EE, 0x9058, 0x68EF, 0x9EAA, 0x68F2, 0x90B1, 0x68F9, 0x9EA8, + 0x68FA, 0x8ABB, 0x6900, 0x986F, 0x6901, 0x9E96, 0x6904, 0x9EA4, + 0x6905, 0x88D6, 0x6908, 0x9E98, 0x690B, 0x96B8, 0x690C, 0x9E9D, + 0x690D, 0x9041, 0x690E, 0x92C5, 0x690F, 0x9E93, 0x6912, 0x9EA3, + 0x6919, 0x909A, 0x691A, 0x9EAD, 0x691B, 0x8A91, 0x691C, 0x8C9F, + 0x6921, 0x9EAF, 0x6922, 0x9E9A, 0x6923, 0x9EAE, 0x6925, 0x9EA7, + 0x6926, 0x9E9B, 0x6928, 0x9EAB, 0x692A, 0x9EAC, 0x6930, 0x9EBD, + 0x6934, 0x93CC, 0x6936, 0x9EA2, 0x6939, 0x9EB9, 0x693D, 0x9EBB, + 0x693F, 0x92D6, 0x694A, 0x976B, 0x6953, 0x9596, 0x6954, 0x9EB6, + 0x6955, 0x91C8, 0x6959, 0x9EBC, 0x695A, 0x915E, 0x695C, 0x9EB3, + 0x695D, 0x9EC0, 0x695E, 0x9EBF, 0x6960, 0x93ED, 0x6961, 0x9EBE, + 0x6962, 0x93E8, 0x6968, 0xFAE9, 0x696A, 0x9EC2, 0x696B, 0x9EB5, + 0x696D, 0x8BC6, 0x696E, 0x9EB8, 0x696F, 0x8F7C, 0x6973, 0x9480, + 0x6974, 0x9EBA, 0x6975, 0x8BC9, 0x6977, 0x9EB2, 0x6978, 0x9EB4, + 0x6979, 0x9EB1, 0x697C, 0x984F, 0x697D, 0x8A79, 0x697E, 0x9EB7, + 0x6981, 0x9EC1, 0x6982, 0x8A54, 0x698A, 0x8DE5, 0x698E, 0x897C, + 0x6991, 0x9ED2, 0x6994, 0x9850, 0x6995, 0x9ED5, 0x6998, 0xFAEB, + 0x699B, 0x9059, 0x699C, 0x9ED4, 0x69A0, 0x9ED3, 0x69A7, 0x9ED0, + 0x69AE, 0x9EC4, 0x69B1, 0x9EE1, 0x69B2, 0x9EC3, 0x69B4, 0x9ED6, + 0x69BB, 0x9ECE, 0x69BE, 0x9EC9, 0x69BF, 0x9EC6, 0x69C1, 0x9EC7, + 0x69C3, 0x9ECF, 0x69C7, 0xEAA0, 0x69CA, 0x9ECC, 0x69CB, 0x8D5C, + 0x69CC, 0x92C6, 0x69CD, 0x9184, 0x69CE, 0x9ECA, 0x69D0, 0x9EC5, + 0x69D3, 0x9EC8, 0x69D8, 0x976C, 0x69D9, 0x968A, 0x69DD, 0x9ECD, + 0x69DE, 0x9ED7, 0x69E2, 0xFAEC, 0x69E7, 0x9EDF, 0x69E8, 0x9ED8, + 0x69EB, 0x9EE5, 0x69ED, 0x9EE3, 0x69F2, 0x9EDE, 0x69F9, 0x9EDD, + 0x69FB, 0x92CE, 0x69FD, 0x9185, 0x69FF, 0x9EDB, 0x6A02, 0x9ED9, + 0x6A05, 0x9EE0, 0x6A0A, 0x9EE6, 0x6A0B, 0x94F3, 0x6A0C, 0x9EEC, + 0x6A12, 0x9EE7, 0x6A13, 0x9EEA, 0x6A14, 0x9EE4, 0x6A17, 0x9294, + 0x6A19, 0x9557, 0x6A1B, 0x9EDA, 0x6A1E, 0x9EE2, 0x6A1F, 0x8FBE, + 0x6A21, 0x96CD, 0x6A22, 0x9EF6, 0x6A23, 0x9EE9, 0x6A29, 0x8CA0, + 0x6A2A, 0x89A1, 0x6A2B, 0x8A7E, 0x6A2E, 0x9ED1, 0x6A30, 0xFAED, + 0x6A35, 0x8FBF, 0x6A36, 0x9EEE, 0x6A38, 0x9EF5, 0x6A39, 0x8EF7, + 0x6A3A, 0x8A92, 0x6A3D, 0x924D, 0x6A44, 0x9EEB, 0x6A46, 0xFAEF, + 0x6A47, 0x9EF0, 0x6A48, 0x9EF4, 0x6A4B, 0x8BB4, 0x6A58, 0x8B6B, + 0x6A59, 0x9EF2, 0x6A5F, 0x8B40, 0x6A61, 0x93C9, 0x6A62, 0x9EF1, + 0x6A66, 0x9EF3, 0x6A6B, 0xFAEE, 0x6A72, 0x9EED, 0x6A73, 0xFAF0, + 0x6A78, 0x9EEF, 0x6A7E, 0xFAF1, 0x6A7F, 0x8A80, 0x6A80, 0x9268, + 0x6A84, 0x9EFA, 0x6A8D, 0x9EF8, 0x6A8E, 0x8CE7, 0x6A90, 0x9EF7, + 0x6A97, 0x9F40, 0x6A9C, 0x9E77, 0x6AA0, 0x9EF9, 0x6AA2, 0x9EFB, + 0x6AA3, 0x9EFC, 0x6AAA, 0x9F4B, 0x6AAC, 0x9F47, 0x6AAE, 0x9E8D, + 0x6AB3, 0x9F46, 0x6AB8, 0x9F45, 0x6ABB, 0x9F42, 0x6AC1, 0x9EE8, + 0x6AC2, 0x9F44, 0x6AC3, 0x9F43, 0x6AD1, 0x9F49, 0x6AD3, 0x9845, + 0x6ADA, 0x9F4C, 0x6ADB, 0x8BF9, 0x6ADE, 0x9F48, 0x6ADF, 0x9F4A, + 0x6AE2, 0xFAF2, 0x6AE4, 0xFAF3, 0x6AE8, 0x94A5, 0x6AEA, 0x9F4D, + 0x6AFA, 0x9F51, 0x6AFB, 0x9F4E, 0x6B04, 0x9793, 0x6B05, 0x9F4F, + 0x6B0A, 0x9EDC, 0x6B12, 0x9F52, 0x6B16, 0x9F53, 0x6B1D, 0x8954, + 0x6B1F, 0x9F55, 0x6B20, 0x8C87, 0x6B21, 0x8E9F, 0x6B23, 0x8BD3, + 0x6B27, 0x89A2, 0x6B32, 0x977E, 0x6B37, 0x9F57, 0x6B38, 0x9F56, + 0x6B39, 0x9F59, 0x6B3A, 0x8B5C, 0x6B3D, 0x8BD4, 0x6B3E, 0x8ABC, + 0x6B43, 0x9F5C, 0x6B47, 0x9F5B, 0x6B49, 0x9F5D, 0x6B4C, 0x89CC, + 0x6B4E, 0x9256, 0x6B50, 0x9F5E, 0x6B53, 0x8ABD, 0x6B54, 0x9F60, + 0x6B59, 0x9F5F, 0x6B5B, 0x9F61, 0x6B5F, 0x9F62, 0x6B61, 0x9F63, + 0x6B62, 0x8E7E, 0x6B63, 0x90B3, 0x6B64, 0x8D9F, 0x6B66, 0x9590, + 0x6B69, 0x95E0, 0x6B6A, 0x9863, 0x6B6F, 0x8E95, 0x6B73, 0x8DCE, + 0x6B74, 0x97F0, 0x6B78, 0x9F64, 0x6B79, 0x9F65, 0x6B7B, 0x8E80, + 0x6B7F, 0x9F66, 0x6B80, 0x9F67, 0x6B83, 0x9F69, 0x6B84, 0x9F68, + 0x6B86, 0x9677, 0x6B89, 0x8F7D, 0x6B8A, 0x8EEA, 0x6B8B, 0x8E63, + 0x6B8D, 0x9F6A, 0x6B95, 0x9F6C, 0x6B96, 0x9042, 0x6B98, 0x9F6B, + 0x6B9E, 0x9F6D, 0x6BA4, 0x9F6E, 0x6BAA, 0x9F6F, 0x6BAB, 0x9F70, + 0x6BAF, 0x9F71, 0x6BB1, 0x9F73, 0x6BB2, 0x9F72, 0x6BB3, 0x9F74, + 0x6BB4, 0x89A3, 0x6BB5, 0x9269, 0x6BB7, 0x9F75, 0x6BBA, 0x8E45, + 0x6BBB, 0x8A6B, 0x6BBC, 0x9F76, 0x6BBF, 0x9361, 0x6BC0, 0x9ACA, + 0x6BC5, 0x8B42, 0x6BC6, 0x9F77, 0x6BCB, 0x9F78, 0x6BCD, 0x95EA, + 0x6BCE, 0x9688, 0x6BD2, 0x93C5, 0x6BD3, 0x9F79, 0x6BD4, 0x94E4, + 0x6BD6, 0xFAF4, 0x6BD8, 0x94F9, 0x6BDB, 0x96D1, 0x6BDF, 0x9F7A, + 0x6BEB, 0x9F7C, 0x6BEC, 0x9F7B, 0x6BEF, 0x9F7E, 0x6BF3, 0x9F7D, + 0x6C08, 0x9F81, 0x6C0F, 0x8E81, 0x6C11, 0x96AF, 0x6C13, 0x9F82, + 0x6C14, 0x9F83, 0x6C17, 0x8B43, 0x6C1B, 0x9F84, 0x6C23, 0x9F86, + 0x6C24, 0x9F85, 0x6C34, 0x9085, 0x6C37, 0x9558, 0x6C38, 0x8969, + 0x6C3E, 0x94C3, 0x6C3F, 0xFAF5, 0x6C40, 0x92F3, 0x6C41, 0x8F60, + 0x6C42, 0x8B81, 0x6C4E, 0x94C4, 0x6C50, 0x8EAC, 0x6C55, 0x9F88, + 0x6C57, 0x8ABE, 0x6C5A, 0x8998, 0x6C5C, 0xFAF6, 0x6C5D, 0x93F0, + 0x6C5E, 0x9F87, 0x6C5F, 0x8D5D, 0x6C60, 0x9272, 0x6C62, 0x9F89, + 0x6C68, 0x9F91, 0x6C6A, 0x9F8A, 0x6C6F, 0xFAF8, 0x6C70, 0x91BF, + 0x6C72, 0x8B82, 0x6C73, 0x9F92, 0x6C7A, 0x8C88, 0x6C7D, 0x8B44, + 0x6C7E, 0x9F90, 0x6C81, 0x9F8E, 0x6C82, 0x9F8B, 0x6C83, 0x9780, + 0x6C86, 0xFAF7, 0x6C88, 0x92BE, 0x6C8C, 0x93D7, 0x6C8D, 0x9F8C, + 0x6C90, 0x9F94, 0x6C92, 0x9F93, 0x6C93, 0x8C42, 0x6C96, 0x89AB, + 0x6C99, 0x8DB9, 0x6C9A, 0x9F8D, 0x6C9B, 0x9F8F, 0x6CA1, 0x9676, + 0x6CA2, 0x91F2, 0x6CAB, 0x9697, 0x6CAE, 0x9F9C, 0x6CB1, 0x9F9D, + 0x6CB3, 0x89CD, 0x6CB8, 0x95A6, 0x6CB9, 0x96FB, 0x6CBA, 0x9F9F, + 0x6CBB, 0x8EA1, 0x6CBC, 0x8FC0, 0x6CBD, 0x9F98, 0x6CBE, 0x9F9E, + 0x6CBF, 0x8988, 0x6CC1, 0x8BB5, 0x6CC4, 0x9F95, 0x6CC5, 0x9F9A, + 0x6CC9, 0x90F2, 0x6CCA, 0x9491, 0x6CCC, 0x94E5, 0x6CD3, 0x9F97, + 0x6CD5, 0x9640, 0x6CD7, 0x9F99, 0x6CD9, 0x9FA2, 0x6CDA, 0xFAF9, + 0x6CDB, 0x9FA0, 0x6CDD, 0x9F9B, 0x6CE1, 0x9641, 0x6CE2, 0x9467, + 0x6CE3, 0x8B83, 0x6CE5, 0x9344, 0x6CE8, 0x928D, 0x6CEA, 0x9FA3, + 0x6CEF, 0x9FA1, 0x6CF0, 0x91D7, 0x6CF1, 0x9F96, 0x6CF3, 0x896A, + 0x6D04, 0xFAFA, 0x6D0B, 0x976D, 0x6D0C, 0x9FAE, 0x6D12, 0x9FAD, + 0x6D17, 0x90F4, 0x6D19, 0x9FAA, 0x6D1B, 0x978C, 0x6D1E, 0x93B4, + 0x6D1F, 0x9FA4, 0x6D25, 0x92C3, 0x6D29, 0x896B, 0x6D2A, 0x8D5E, + 0x6D2B, 0x9FA7, 0x6D32, 0x8F46, 0x6D33, 0x9FAC, 0x6D35, 0x9FAB, + 0x6D36, 0x9FA6, 0x6D38, 0x9FA9, 0x6D3B, 0x8A88, 0x6D3D, 0x9FA8, + 0x6D3E, 0x9468, 0x6D41, 0x97AC, 0x6D44, 0x8FF2, 0x6D45, 0x90F3, + 0x6D59, 0x9FB4, 0x6D5A, 0x9FB2, 0x6D5C, 0x956C, 0x6D63, 0x9FAF, + 0x6D64, 0x9FB1, 0x6D66, 0x8959, 0x6D69, 0x8D5F, 0x6D6A, 0x9851, + 0x6D6C, 0x8A5C, 0x6D6E, 0x9582, 0x6D6F, 0xFAFC, 0x6D74, 0x9781, + 0x6D77, 0x8A43, 0x6D78, 0x905A, 0x6D79, 0x9FB3, 0x6D85, 0x9FB8, + 0x6D87, 0xFAFB, 0x6D88, 0x8FC1, 0x6D8C, 0x974F, 0x6D8E, 0x9FB5, + 0x6D93, 0x9FB0, 0x6D95, 0x9FB6, 0x6D96, 0xFB40, 0x6D99, 0x97DC, + 0x6D9B, 0x9393, 0x6D9C, 0x93C0, 0x6DAC, 0xFB41, 0x6DAF, 0x8A55, + 0x6DB2, 0x8974, 0x6DB5, 0x9FBC, 0x6DB8, 0x9FBF, 0x6DBC, 0x97C1, + 0x6DC0, 0x9784, 0x6DC5, 0x9FC6, 0x6DC6, 0x9FC0, 0x6DC7, 0x9FBD, + 0x6DCB, 0x97D2, 0x6DCC, 0x9FC3, 0x6DCF, 0xFB42, 0x6DD1, 0x8F69, + 0x6DD2, 0x9FC5, 0x6DD5, 0x9FCA, 0x6DD8, 0x9391, 0x6DD9, 0x9FC8, + 0x6DDE, 0x9FC2, 0x6DE1, 0x9257, 0x6DE4, 0x9FC9, 0x6DE6, 0x9FBE, + 0x6DE8, 0x9FC4, 0x6DEA, 0x9FCB, 0x6DEB, 0x88FA, 0x6DEC, 0x9FC1, + 0x6DEE, 0x9FCC, 0x6DF1, 0x905B, 0x6DF2, 0xFB44, 0x6DF3, 0x8F7E, + 0x6DF5, 0x95A3, 0x6DF7, 0x8DAC, 0x6DF8, 0xFB43, 0x6DF9, 0x9FB9, + 0x6DFA, 0x9FC7, 0x6DFB, 0x9359, 0x6DFC, 0xFB45, 0x6E05, 0x90B4, + 0x6E07, 0x8A89, 0x6E08, 0x8DCF, 0x6E09, 0x8FC2, 0x6E0A, 0x9FBB, + 0x6E0B, 0x8F61, 0x6E13, 0x8C6B, 0x6E15, 0x9FBA, 0x6E19, 0x9FD0, + 0x6E1A, 0x8F8D, 0x6E1B, 0x8CB8, 0x6E1D, 0x9FDF, 0x6E1F, 0x9FD9, + 0x6E20, 0x8B94, 0x6E21, 0x936E, 0x6E23, 0x9FD4, 0x6E24, 0x9FDD, + 0x6E25, 0x88AD, 0x6E26, 0x8951, 0x6E27, 0xFB48, 0x6E29, 0x89B7, + 0x6E2B, 0x9FD6, 0x6E2C, 0x91AA, 0x6E2D, 0x9FCD, 0x6E2E, 0x9FCF, + 0x6E2F, 0x8D60, 0x6E38, 0x9FE0, 0x6E39, 0xFB46, 0x6E3A, 0x9FDB, + 0x6E3C, 0xFB49, 0x6E3E, 0x9FD3, 0x6E43, 0x9FDA, 0x6E4A, 0x96A9, + 0x6E4D, 0x9FD8, 0x6E4E, 0x9FDC, 0x6E56, 0x8CCE, 0x6E58, 0x8FC3, + 0x6E5B, 0x9258, 0x6E5C, 0xFB47, 0x6E5F, 0x9FD2, 0x6E67, 0x974E, + 0x6E6B, 0x9FD5, 0x6E6E, 0x9FCE, 0x6E6F, 0x9392, 0x6E72, 0x9FD1, + 0x6E76, 0x9FD7, 0x6E7E, 0x9870, 0x6E7F, 0x8EBC, 0x6E80, 0x969E, + 0x6E82, 0x9FE1, 0x6E8C, 0x94AC, 0x6E8F, 0x9FED, 0x6E90, 0x8CB9, + 0x6E96, 0x8F80, 0x6E98, 0x9FE3, 0x6E9C, 0x97AD, 0x6E9D, 0x8D61, + 0x6E9F, 0x9FF0, 0x6EA2, 0x88EC, 0x6EA5, 0x9FEE, 0x6EAA, 0x9FE2, + 0x6EAF, 0x9FE8, 0x6EB2, 0x9FEA, 0x6EB6, 0x976E, 0x6EB7, 0x9FE5, + 0x6EBA, 0x934D, 0x6EBD, 0x9FE7, 0x6EBF, 0xFB4A, 0x6EC2, 0x9FEF, + 0x6EC4, 0x9FE9, 0x6EC5, 0x96C5, 0x6EC9, 0x9FE4, 0x6ECB, 0x8EA0, + 0x6ECC, 0x9FFC, 0x6ED1, 0x8A8A, 0x6ED3, 0x9FE6, 0x6ED4, 0x9FEB, + 0x6ED5, 0x9FEC, 0x6EDD, 0x91EA, 0x6EDE, 0x91D8, 0x6EEC, 0x9FF4, + 0x6EEF, 0x9FFA, 0x6EF2, 0x9FF8, 0x6EF4, 0x9348, 0x6EF7, 0xE042, + 0x6EF8, 0x9FF5, 0x6EFE, 0x9FF6, 0x6EFF, 0x9FDE, 0x6F01, 0x8B99, + 0x6F02, 0x9559, 0x6F06, 0x8EBD, 0x6F09, 0x8D97, 0x6F0F, 0x9852, + 0x6F11, 0x9FF2, 0x6F13, 0xE041, 0x6F14, 0x8989, 0x6F15, 0x9186, + 0x6F20, 0x9499, 0x6F22, 0x8ABF, 0x6F23, 0x97F8, 0x6F2B, 0x969F, + 0x6F2C, 0x92D0, 0x6F31, 0x9FF9, 0x6F32, 0x9FFB, 0x6F38, 0x9151, + 0x6F3E, 0xE040, 0x6F3F, 0x9FF7, 0x6F41, 0x9FF1, 0x6F45, 0x8AC1, + 0x6F54, 0x8C89, 0x6F58, 0xE04E, 0x6F5B, 0xE049, 0x6F5C, 0x90F6, + 0x6F5F, 0x8A83, 0x6F64, 0x8F81, 0x6F66, 0xE052, 0x6F6D, 0xE04B, + 0x6F6E, 0x92AA, 0x6F6F, 0xE048, 0x6F70, 0x92D7, 0x6F74, 0xE06B, + 0x6F78, 0xE045, 0x6F7A, 0xE044, 0x6F7C, 0xE04D, 0x6F80, 0xE047, + 0x6F81, 0xE046, 0x6F82, 0xE04C, 0x6F84, 0x909F, 0x6F86, 0xE043, + 0x6F88, 0xFB4B, 0x6F8E, 0xE04F, 0x6F91, 0xE050, 0x6F97, 0x8AC0, + 0x6FA1, 0xE055, 0x6FA3, 0xE054, 0x6FA4, 0xE056, 0x6FAA, 0xE059, + 0x6FB1, 0x9362, 0x6FB3, 0xE053, 0x6FB5, 0xFB4C, 0x6FB9, 0xE057, + 0x6FC0, 0x8C83, 0x6FC1, 0x91F7, 0x6FC2, 0xE051, 0x6FC3, 0x945A, + 0x6FC6, 0xE058, 0x6FD4, 0xE05D, 0x6FD5, 0xE05B, 0x6FD8, 0xE05E, + 0x6FDB, 0xE061, 0x6FDF, 0xE05A, 0x6FE0, 0x8D8A, 0x6FE1, 0x9447, + 0x6FE4, 0x9FB7, 0x6FEB, 0x9794, 0x6FEC, 0xE05C, 0x6FEE, 0xE060, + 0x6FEF, 0x91F3, 0x6FF1, 0xE05F, 0x6FF3, 0xE04A, 0x6FF5, 0xFB4D, + 0x6FF6, 0xE889, 0x6FFA, 0xE064, 0x6FFE, 0xE068, 0x7001, 0xE066, + 0x7005, 0xFB4E, 0x7007, 0xFB4F, 0x7009, 0xE062, 0x700B, 0xE063, + 0x700F, 0xE067, 0x7011, 0xE065, 0x7015, 0x956D, 0x7018, 0xE06D, + 0x701A, 0xE06A, 0x701B, 0xE069, 0x701D, 0xE06C, 0x701E, 0x93D2, + 0x701F, 0xE06E, 0x7026, 0x9295, 0x7027, 0x91EB, 0x7028, 0xFB50, + 0x702C, 0x90A3, 0x7030, 0xE06F, 0x7032, 0xE071, 0x703E, 0xE070, + 0x704C, 0x9FF3, 0x7051, 0xE072, 0x7058, 0x93E5, 0x7063, 0xE073, + 0x706B, 0x89CE, 0x706F, 0x9394, 0x7070, 0x8A44, 0x7078, 0x8B84, + 0x707C, 0x8EDC, 0x707D, 0x8DD0, 0x7085, 0xFB51, 0x7089, 0x9846, + 0x708A, 0x9086, 0x708E, 0x898A, 0x7092, 0xE075, 0x7099, 0xE074, + 0x70AB, 0xFB52, 0x70AC, 0xE078, 0x70AD, 0x9259, 0x70AE, 0xE07B, + 0x70AF, 0xE076, 0x70B3, 0xE07A, 0x70B8, 0xE079, 0x70B9, 0x935F, + 0x70BA, 0x88D7, 0x70BB, 0xFA62, 0x70C8, 0x97F3, 0x70CB, 0xE07D, + 0x70CF, 0x8947, 0x70D9, 0xE080, 0x70DD, 0xE07E, 0x70DF, 0xE07C, + 0x70F1, 0xE077, 0x70F9, 0x9642, 0x70FD, 0xE082, 0x7104, 0xFB54, + 0x7109, 0xE081, 0x710F, 0xFB53, 0x7114, 0x898B, 0x7119, 0xE084, + 0x711A, 0x95B0, 0x711C, 0xE083, 0x7121, 0x96B3, 0x7126, 0x8FC5, + 0x7136, 0x9152, 0x713C, 0x8FC4, 0x7146, 0xFB56, 0x7147, 0xFB57, + 0x7149, 0x97F9, 0x714C, 0xE08A, 0x714E, 0x90F7, 0x7155, 0xE086, + 0x7156, 0xE08B, 0x7159, 0x898C, 0x715C, 0xFB55, 0x7162, 0xE089, + 0x7164, 0x9481, 0x7165, 0xE085, 0x7166, 0xE088, 0x7167, 0x8FC6, + 0x7169, 0x94CF, 0x716C, 0xE08C, 0x716E, 0x8ECF, 0x717D, 0x90F8, + 0x7184, 0xE08F, 0x7188, 0xE087, 0x718A, 0x8C46, 0x718F, 0xE08D, + 0x7194, 0x976F, 0x7195, 0xE090, 0x7199, 0xEAA4, 0x719F, 0x8F6E, + 0x71A8, 0xE091, 0x71AC, 0xE092, 0x71B1, 0x944D, 0x71B9, 0xE094, + 0x71BE, 0xE095, 0x71C1, 0xFB59, 0x71C3, 0x9452, 0x71C8, 0x9395, + 0x71C9, 0xE097, 0x71CE, 0xE099, 0x71D0, 0x97D3, 0x71D2, 0xE096, + 0x71D4, 0xE098, 0x71D5, 0x898D, 0x71D7, 0xE093, 0x71DF, 0x9A7A, + 0x71E0, 0xE09A, 0x71E5, 0x9187, 0x71E6, 0x8E57, 0x71E7, 0xE09C, + 0x71EC, 0xE09B, 0x71ED, 0x9043, 0x71EE, 0x99D7, 0x71F5, 0xE09D, + 0x71F9, 0xE09F, 0x71FB, 0xE08E, 0x71FC, 0xE09E, 0x71FE, 0xFB5A, + 0x71FF, 0xE0A0, 0x7206, 0x949A, 0x720D, 0xE0A1, 0x7210, 0xE0A2, + 0x721B, 0xE0A3, 0x7228, 0xE0A4, 0x722A, 0x92DC, 0x722C, 0xE0A6, + 0x722D, 0xE0A5, 0x7230, 0xE0A7, 0x7232, 0xE0A8, 0x7235, 0x8EDD, + 0x7236, 0x9583, 0x723A, 0x96EA, 0x723B, 0xE0A9, 0x723C, 0xE0AA, + 0x723D, 0x9175, 0x723E, 0x8EA2, 0x723F, 0xE0AB, 0x7240, 0xE0AC, + 0x7246, 0xE0AD, 0x7247, 0x95D0, 0x7248, 0x94C5, 0x724B, 0xE0AE, + 0x724C, 0x9476, 0x7252, 0x92AB, 0x7258, 0xE0AF, 0x7259, 0x89E5, + 0x725B, 0x8B8D, 0x725D, 0x96C4, 0x725F, 0x96B4, 0x7261, 0x89B2, + 0x7262, 0x9853, 0x7267, 0x9671, 0x7269, 0x95A8, 0x7272, 0x90B5, + 0x7274, 0xE0B0, 0x7279, 0x93C1, 0x727D, 0x8CA1, 0x727E, 0xE0B1, + 0x7280, 0x8DD2, 0x7281, 0xE0B3, 0x7282, 0xE0B2, 0x7287, 0xE0B4, + 0x7292, 0xE0B5, 0x7296, 0xE0B6, 0x72A0, 0x8B5D, 0x72A2, 0xE0B7, + 0x72A7, 0xE0B8, 0x72AC, 0x8CA2, 0x72AF, 0x94C6, 0x72B1, 0xFB5B, + 0x72B2, 0xE0BA, 0x72B6, 0x8FF3, 0x72B9, 0xE0B9, 0x72BE, 0xFB5C, + 0x72C2, 0x8BB6, 0x72C3, 0xE0BB, 0x72C4, 0xE0BD, 0x72C6, 0xE0BC, + 0x72CE, 0xE0BE, 0x72D0, 0x8CCF, 0x72D2, 0xE0BF, 0x72D7, 0x8BE7, + 0x72D9, 0x915F, 0x72DB, 0x8D9D, 0x72E0, 0xE0C1, 0x72E1, 0xE0C2, + 0x72E2, 0xE0C0, 0x72E9, 0x8EEB, 0x72EC, 0x93C6, 0x72ED, 0x8BB7, + 0x72F7, 0xE0C4, 0x72F8, 0x924B, 0x72F9, 0xE0C3, 0x72FC, 0x9854, + 0x72FD, 0x9482, 0x730A, 0xE0C7, 0x7316, 0xE0C9, 0x7317, 0xE0C6, + 0x731B, 0x96D2, 0x731C, 0xE0C8, 0x731D, 0xE0CA, 0x731F, 0x97C2, + 0x7324, 0xFB5D, 0x7325, 0xE0CE, 0x7329, 0xE0CD, 0x732A, 0x9296, + 0x732B, 0x944C, 0x732E, 0x8CA3, 0x732F, 0xE0CC, 0x7334, 0xE0CB, + 0x7336, 0x9750, 0x7337, 0x9751, 0x733E, 0xE0CF, 0x733F, 0x898E, + 0x7344, 0x8D96, 0x7345, 0x8E82, 0x734E, 0xE0D0, 0x734F, 0xE0D1, + 0x7357, 0xE0D3, 0x7363, 0x8F62, 0x7368, 0xE0D5, 0x736A, 0xE0D4, + 0x7370, 0xE0D6, 0x7372, 0x8A6C, 0x7375, 0xE0D8, 0x7377, 0xFB5F, + 0x7378, 0xE0D7, 0x737A, 0xE0DA, 0x737B, 0xE0D9, 0x7384, 0x8CBA, + 0x7387, 0x97A6, 0x7389, 0x8BCA, 0x738B, 0x89A4, 0x7396, 0x8BE8, + 0x73A9, 0x8ADF, 0x73B2, 0x97E6, 0x73B3, 0xE0DC, 0x73BB, 0xE0DE, + 0x73BD, 0xFB60, 0x73C0, 0xE0DF, 0x73C2, 0x89CF, 0x73C8, 0xE0DB, + 0x73C9, 0xFB61, 0x73CA, 0x8E58, 0x73CD, 0x92BF, 0x73CE, 0xE0DD, + 0x73D2, 0xFB64, 0x73D6, 0xFB62, 0x73DE, 0xE0E2, 0x73E0, 0x8EEC, + 0x73E3, 0xFB63, 0x73E5, 0xE0E0, 0x73EA, 0x8C5D, 0x73ED, 0x94C7, + 0x73EE, 0xE0E1, 0x73F1, 0xE0FC, 0x73F5, 0xFB66, 0x73F8, 0xE0E7, + 0x73FE, 0x8CBB, 0x7403, 0x8B85, 0x7405, 0xE0E4, 0x7406, 0x979D, + 0x7407, 0xFB65, 0x7409, 0x97AE, 0x7422, 0x91F4, 0x7425, 0xE0E6, + 0x7426, 0xFB67, 0x7429, 0xFB69, 0x742A, 0xFB68, 0x742E, 0xFB6A, + 0x7432, 0xE0E8, 0x7433, 0x97D4, 0x7434, 0x8BD5, 0x7435, 0x94FA, + 0x7436, 0x9469, 0x743A, 0xE0E9, 0x743F, 0xE0EB, 0x7441, 0xE0EE, + 0x7455, 0xE0EA, 0x7459, 0xE0ED, 0x745A, 0x8CE8, 0x745B, 0x896C, + 0x745C, 0xE0EF, 0x745E, 0x9090, 0x745F, 0xE0EC, 0x7460, 0x97DA, + 0x7462, 0xFB6B, 0x7463, 0xE0F2, 0x7464, 0xEAA2, 0x7469, 0xE0F0, + 0x746A, 0xE0F3, 0x746F, 0xE0E5, 0x7470, 0xE0F1, 0x7473, 0x8DBA, + 0x7476, 0xE0F4, 0x747E, 0xE0F5, 0x7483, 0x979E, 0x7489, 0xFB6C, + 0x748B, 0xE0F6, 0x749E, 0xE0F7, 0x749F, 0xFB6D, 0x74A2, 0xE0E3, + 0x74A7, 0xE0F8, 0x74B0, 0x8AC2, 0x74BD, 0x8EA3, 0x74CA, 0xE0F9, + 0x74CF, 0xE0FA, 0x74D4, 0xE0FB, 0x74DC, 0x895A, 0x74E0, 0xE140, + 0x74E2, 0x955A, 0x74E3, 0xE141, 0x74E6, 0x8AA2, 0x74E7, 0xE142, + 0x74E9, 0xE143, 0x74EE, 0xE144, 0x74F0, 0xE146, 0x74F1, 0xE147, + 0x74F2, 0xE145, 0x74F6, 0x9572, 0x74F7, 0xE149, 0x74F8, 0xE148, + 0x7501, 0xFB6E, 0x7503, 0xE14B, 0x7504, 0xE14A, 0x7505, 0xE14C, + 0x750C, 0xE14D, 0x750D, 0xE14F, 0x750E, 0xE14E, 0x7511, 0x8D99, + 0x7513, 0xE151, 0x7515, 0xE150, 0x7518, 0x8AC3, 0x751A, 0x9072, + 0x751C, 0x935B, 0x751E, 0xE152, 0x751F, 0x90B6, 0x7523, 0x8E59, + 0x7525, 0x8999, 0x7526, 0xE153, 0x7528, 0x9770, 0x752B, 0x95E1, + 0x752C, 0xE154, 0x752F, 0xFAA8, 0x7530, 0x9363, 0x7531, 0x9752, + 0x7532, 0x8D62, 0x7533, 0x905C, 0x7537, 0x926A, 0x7538, 0x99B2, + 0x753A, 0x92AC, 0x753B, 0x89E6, 0x753C, 0xE155, 0x7544, 0xE156, + 0x7546, 0xE15B, 0x7549, 0xE159, 0x754A, 0xE158, 0x754B, 0x9DC0, + 0x754C, 0x8A45, 0x754D, 0xE157, 0x754F, 0x88D8, 0x7551, 0x94A8, + 0x7554, 0x94C8, 0x7559, 0x97AF, 0x755A, 0xE15C, 0x755B, 0xE15A, + 0x755C, 0x927B, 0x755D, 0x90A4, 0x7560, 0x94A9, 0x7562, 0x954C, + 0x7564, 0xE15E, 0x7565, 0x97AA, 0x7566, 0x8C6C, 0x7567, 0xE15F, + 0x7569, 0xE15D, 0x756A, 0x94D4, 0x756B, 0xE160, 0x756D, 0xE161, + 0x756F, 0xFB6F, 0x7570, 0x88D9, 0x7573, 0x8FF4, 0x7574, 0xE166, + 0x7576, 0xE163, 0x7577, 0x93EB, 0x7578, 0xE162, 0x757F, 0x8B45, + 0x7582, 0xE169, 0x7586, 0xE164, 0x7587, 0xE165, 0x7589, 0xE168, + 0x758A, 0xE167, 0x758B, 0x9544, 0x758E, 0x9161, 0x758F, 0x9160, + 0x7591, 0x8B5E, 0x7594, 0xE16A, 0x759A, 0xE16B, 0x759D, 0xE16C, + 0x75A3, 0xE16E, 0x75A5, 0xE16D, 0x75AB, 0x8975, 0x75B1, 0xE176, + 0x75B2, 0x94E6, 0x75B3, 0xE170, 0x75B5, 0xE172, 0x75B8, 0xE174, + 0x75B9, 0x905D, 0x75BC, 0xE175, 0x75BD, 0xE173, 0x75BE, 0x8EBE, + 0x75C2, 0xE16F, 0x75C3, 0xE171, 0x75C5, 0x9561, 0x75C7, 0x8FC7, + 0x75CA, 0xE178, 0x75CD, 0xE177, 0x75D2, 0xE179, 0x75D4, 0x8EA4, + 0x75D5, 0x8DAD, 0x75D8, 0x9397, 0x75D9, 0xE17A, 0x75DB, 0x92C9, + 0x75DE, 0xE17C, 0x75E2, 0x979F, 0x75E3, 0xE17B, 0x75E9, 0x9189, + 0x75F0, 0xE182, 0x75F2, 0xE184, 0x75F3, 0xE185, 0x75F4, 0x9273, + 0x75FA, 0xE183, 0x75FC, 0xE180, 0x75FE, 0xE17D, 0x75FF, 0xE17E, + 0x7601, 0xE181, 0x7609, 0xE188, 0x760B, 0xE186, 0x760D, 0xE187, + 0x761F, 0xE189, 0x7620, 0xE18B, 0x7621, 0xE18C, 0x7622, 0xE18D, + 0x7624, 0xE18E, 0x7627, 0xE18A, 0x7630, 0xE190, 0x7634, 0xE18F, + 0x763B, 0xE191, 0x7642, 0x97C3, 0x7646, 0xE194, 0x7647, 0xE192, + 0x7648, 0xE193, 0x764C, 0x8AE0, 0x7652, 0x96FC, 0x7656, 0x95C8, + 0x7658, 0xE196, 0x765C, 0xE195, 0x7661, 0xE197, 0x7662, 0xE198, + 0x7667, 0xE19C, 0x7668, 0xE199, 0x7669, 0xE19A, 0x766A, 0xE19B, + 0x766C, 0xE19D, 0x7670, 0xE19E, 0x7672, 0xE19F, 0x7676, 0xE1A0, + 0x7678, 0xE1A1, 0x767A, 0x94AD, 0x767B, 0x936F, 0x767C, 0xE1A2, + 0x767D, 0x9492, 0x767E, 0x9553, 0x7680, 0xE1A3, 0x7682, 0xFB70, + 0x7683, 0xE1A4, 0x7684, 0x9349, 0x7686, 0x8A46, 0x7687, 0x8D63, + 0x7688, 0xE1A5, 0x768B, 0xE1A6, 0x768E, 0xE1A7, 0x7690, 0x8E48, + 0x7693, 0xE1A9, 0x7696, 0xE1A8, 0x7699, 0xE1AA, 0x769A, 0xE1AB, + 0x769B, 0xFB73, 0x769C, 0xFB71, 0x769E, 0xFB72, 0x76A6, 0xFB74, + 0x76AE, 0x94E7, 0x76B0, 0xE1AC, 0x76B4, 0xE1AD, 0x76B7, 0xEA89, + 0x76B8, 0xE1AE, 0x76B9, 0xE1AF, 0x76BA, 0xE1B0, 0x76BF, 0x8E4D, + 0x76C2, 0xE1B1, 0x76C3, 0x9475, 0x76C6, 0x967E, 0x76C8, 0x896D, + 0x76CA, 0x8976, 0x76CD, 0xE1B2, 0x76D2, 0xE1B4, 0x76D6, 0xE1B3, + 0x76D7, 0x9390, 0x76DB, 0x90B7, 0x76DC, 0x9F58, 0x76DE, 0xE1B5, + 0x76DF, 0x96BF, 0x76E1, 0xE1B6, 0x76E3, 0x8AC4, 0x76E4, 0x94D5, + 0x76E5, 0xE1B7, 0x76E7, 0xE1B8, 0x76EA, 0xE1B9, 0x76EE, 0x96DA, + 0x76F2, 0x96D3, 0x76F4, 0x92BC, 0x76F8, 0x918A, 0x76FB, 0xE1BB, + 0x76FE, 0x8F82, 0x7701, 0x8FC8, 0x7704, 0xE1BE, 0x7707, 0xE1BD, + 0x7708, 0xE1BC, 0x7709, 0x94FB, 0x770B, 0x8AC5, 0x770C, 0x8CA7, + 0x771B, 0xE1C4, 0x771E, 0xE1C1, 0x771F, 0x905E, 0x7720, 0x96B0, + 0x7724, 0xE1C0, 0x7725, 0xE1C2, 0x7726, 0xE1C3, 0x7729, 0xE1BF, + 0x7737, 0xE1C5, 0x7738, 0xE1C6, 0x773A, 0x92AD, 0x773C, 0x8AE1, + 0x7740, 0x9285, 0x7746, 0xFB76, 0x7747, 0xE1C7, 0x775A, 0xE1C8, + 0x775B, 0xE1CB, 0x7761, 0x9087, 0x7763, 0x93C2, 0x7765, 0xE1CC, + 0x7766, 0x9672, 0x7768, 0xE1C9, 0x776B, 0xE1CA, 0x7779, 0xE1CF, + 0x777E, 0xE1CE, 0x777F, 0xE1CD, 0x778B, 0xE1D1, 0x778E, 0xE1D0, + 0x7791, 0xE1D2, 0x779E, 0xE1D4, 0x77A0, 0xE1D3, 0x77A5, 0x95CB, + 0x77AC, 0x8F75, 0x77AD, 0x97C4, 0x77B0, 0xE1D5, 0x77B3, 0x93B5, + 0x77B6, 0xE1D6, 0x77B9, 0xE1D7, 0x77BB, 0xE1DB, 0x77BC, 0xE1D9, + 0x77BD, 0xE1DA, 0x77BF, 0xE1D8, 0x77C7, 0xE1DC, 0x77CD, 0xE1DD, + 0x77D7, 0xE1DE, 0x77DA, 0xE1DF, 0x77DB, 0x96B5, 0x77DC, 0xE1E0, + 0x77E2, 0x96EE, 0x77E3, 0xE1E1, 0x77E5, 0x926D, 0x77E7, 0x948A, + 0x77E9, 0x8BE9, 0x77ED, 0x925A, 0x77EE, 0xE1E2, 0x77EF, 0x8BB8, + 0x77F3, 0x90CE, 0x77FC, 0xE1E3, 0x7802, 0x8DBB, 0x780C, 0xE1E4, + 0x7812, 0xE1E5, 0x7814, 0x8CA4, 0x7815, 0x8DD3, 0x7820, 0xE1E7, + 0x7821, 0xFB78, 0x7825, 0x9375, 0x7826, 0x8DD4, 0x7827, 0x8B6D, + 0x7832, 0x9643, 0x7834, 0x946A, 0x783A, 0x9376, 0x783F, 0x8D7B, + 0x7845, 0xE1E9, 0x784E, 0xFB79, 0x785D, 0x8FC9, 0x7864, 0xFB7A, + 0x786B, 0x97B0, 0x786C, 0x8D64, 0x786F, 0x8CA5, 0x7872, 0x94A1, + 0x7874, 0xE1EB, 0x787A, 0xFB7B, 0x787C, 0xE1ED, 0x7881, 0x8CE9, + 0x7886, 0xE1EC, 0x7887, 0x92F4, 0x788C, 0xE1EF, 0x788D, 0x8A56, + 0x788E, 0xE1EA, 0x7891, 0x94E8, 0x7893, 0x894F, 0x7895, 0x8DEA, + 0x7897, 0x9871, 0x789A, 0xE1EE, 0x78A3, 0xE1F0, 0x78A7, 0x95C9, + 0x78A9, 0x90D7, 0x78AA, 0xE1F2, 0x78AF, 0xE1F3, 0x78B5, 0xE1F1, + 0x78BA, 0x8A6D, 0x78BC, 0xE1F9, 0x78BE, 0xE1F8, 0x78C1, 0x8EA5, + 0x78C5, 0xE1FA, 0x78C6, 0xE1F5, 0x78CA, 0xE1FB, 0x78CB, 0xE1F6, + 0x78D0, 0x94D6, 0x78D1, 0xE1F4, 0x78D4, 0xE1F7, 0x78DA, 0xE241, + 0x78E7, 0xE240, 0x78E8, 0x9681, 0x78EC, 0xE1FC, 0x78EF, 0x88E9, + 0x78F4, 0xE243, 0x78FD, 0xE242, 0x7901, 0x8FCA, 0x7907, 0xE244, + 0x790E, 0x9162, 0x7911, 0xE246, 0x7912, 0xE245, 0x7919, 0xE247, + 0x7926, 0xE1E6, 0x792A, 0xE1E8, 0x792B, 0xE249, 0x792C, 0xE248, + 0x7930, 0xFB7C, 0x793A, 0x8EA6, 0x793C, 0x97E7, 0x793E, 0x8ED0, + 0x7940, 0xE24A, 0x7941, 0x8C56, 0x7947, 0x8B5F, 0x7948, 0x8B46, + 0x7949, 0x8E83, 0x7950, 0x9753, 0x7953, 0xE250, 0x7955, 0xE24F, + 0x7956, 0x9163, 0x7957, 0xE24C, 0x795A, 0xE24E, 0x795D, 0x8F6A, + 0x795E, 0x905F, 0x795F, 0xE24D, 0x7960, 0xE24B, 0x7962, 0x9449, + 0x7965, 0x8FCB, 0x7968, 0x955B, 0x796D, 0x8DD5, 0x7977, 0x9398, + 0x797A, 0xE251, 0x797F, 0xE252, 0x7980, 0xE268, 0x7981, 0x8BD6, + 0x7984, 0x985C, 0x7985, 0x9154, 0x798A, 0xE253, 0x798D, 0x89D0, + 0x798E, 0x92F5, 0x798F, 0x959F, 0x7994, 0xFB81, 0x799B, 0xFB83, + 0x799D, 0xE254, 0x79A6, 0x8B9A, 0x79A7, 0xE255, 0x79AA, 0xE257, + 0x79AE, 0xE258, 0x79B0, 0x9448, 0x79B3, 0xE259, 0x79B9, 0xE25A, + 0x79BA, 0xE25B, 0x79BD, 0x8BD7, 0x79BE, 0x89D1, 0x79BF, 0x93C3, + 0x79C0, 0x8F47, 0x79C1, 0x8E84, 0x79C9, 0xE25C, 0x79CB, 0x8F48, + 0x79D1, 0x89C8, 0x79D2, 0x9562, 0x79D5, 0xE25D, 0x79D8, 0x94E9, + 0x79DF, 0x9164, 0x79E1, 0xE260, 0x79E3, 0xE261, 0x79E4, 0x9489, + 0x79E6, 0x9060, 0x79E7, 0xE25E, 0x79E9, 0x9281, 0x79EC, 0xE25F, + 0x79F0, 0x8FCC, 0x79FB, 0x88DA, 0x7A00, 0x8B48, 0x7A08, 0xE262, + 0x7A0B, 0x92F6, 0x7A0D, 0xE263, 0x7A0E, 0x90C5, 0x7A14, 0x96AB, + 0x7A17, 0x9542, 0x7A18, 0xE264, 0x7A19, 0xE265, 0x7A1A, 0x9274, + 0x7A1C, 0x97C5, 0x7A1F, 0xE267, 0x7A20, 0xE266, 0x7A2E, 0x8EED, + 0x7A31, 0xE269, 0x7A32, 0x88EE, 0x7A37, 0xE26C, 0x7A3B, 0xE26A, + 0x7A3C, 0x89D2, 0x7A3D, 0x8C6D, 0x7A3E, 0xE26B, 0x7A3F, 0x8D65, + 0x7A40, 0x8D92, 0x7A42, 0x95E4, 0x7A43, 0xE26D, 0x7A46, 0x9673, + 0x7A49, 0xE26F, 0x7A4D, 0x90CF, 0x7A4E, 0x896E, 0x7A4F, 0x89B8, + 0x7A50, 0x88AA, 0x7A57, 0xE26E, 0x7A61, 0xE270, 0x7A62, 0xE271, + 0x7A63, 0x8FF5, 0x7A69, 0xE272, 0x7A6B, 0x8A6E, 0x7A70, 0xE274, + 0x7A74, 0x8C8A, 0x7A76, 0x8B86, 0x7A79, 0xE275, 0x7A7A, 0x8BF3, + 0x7A7D, 0xE276, 0x7A7F, 0x90FA, 0x7A81, 0x93CB, 0x7A83, 0x90DE, + 0x7A84, 0x8DF3, 0x7A88, 0xE277, 0x7A92, 0x9282, 0x7A93, 0x918B, + 0x7A95, 0xE279, 0x7A96, 0xE27B, 0x7A97, 0xE278, 0x7A98, 0xE27A, + 0x7A9F, 0x8C41, 0x7AA9, 0xE27C, 0x7AAA, 0x8C45, 0x7AAE, 0x8B87, + 0x7AAF, 0x9771, 0x7AB0, 0xE27E, 0x7AB6, 0xE280, 0x7ABA, 0x894D, + 0x7ABF, 0xE283, 0x7AC3, 0x8A96, 0x7AC4, 0xE282, 0x7AC5, 0xE281, + 0x7AC7, 0xE285, 0x7AC8, 0xE27D, 0x7ACA, 0xE286, 0x7ACB, 0x97A7, + 0x7ACD, 0xE287, 0x7ACF, 0xE288, 0x7AD1, 0xFB84, 0x7AD2, 0x9AF2, + 0x7AD3, 0xE28A, 0x7AD5, 0xE289, 0x7AD9, 0xE28B, 0x7ADA, 0xE28C, + 0x7ADC, 0x97B3, 0x7ADD, 0xE28D, 0x7ADF, 0xE8ED, 0x7AE0, 0x8FCD, + 0x7AE1, 0xE28E, 0x7AE2, 0xE28F, 0x7AE3, 0x8F76, 0x7AE5, 0x93B6, + 0x7AE6, 0xE290, 0x7AE7, 0xFB85, 0x7AEA, 0x9247, 0x7AEB, 0xFB87, + 0x7AED, 0xE291, 0x7AEF, 0x925B, 0x7AF0, 0xE292, 0x7AF6, 0x8BA3, + 0x7AF8, 0x995E, 0x7AF9, 0x927C, 0x7AFA, 0x8EB1, 0x7AFF, 0x8AC6, + 0x7B02, 0xE293, 0x7B04, 0xE2A0, 0x7B06, 0xE296, 0x7B08, 0x8B88, + 0x7B0A, 0xE295, 0x7B0B, 0xE2A2, 0x7B0F, 0xE294, 0x7B11, 0x8FCE, + 0x7B18, 0xE298, 0x7B19, 0xE299, 0x7B1B, 0x934A, 0x7B1E, 0xE29A, + 0x7B20, 0x8A7D, 0x7B25, 0x9079, 0x7B26, 0x9584, 0x7B28, 0xE29C, + 0x7B2C, 0x91E6, 0x7B33, 0xE297, 0x7B35, 0xE29B, 0x7B36, 0xE29D, + 0x7B39, 0x8DF9, 0x7B45, 0xE2A4, 0x7B46, 0x954D, 0x7B48, 0x94A4, + 0x7B49, 0x9399, 0x7B4B, 0x8BD8, 0x7B4C, 0xE2A3, 0x7B4D, 0xE2A1, + 0x7B4F, 0x94B3, 0x7B50, 0xE29E, 0x7B51, 0x927D, 0x7B52, 0x939B, + 0x7B54, 0x939A, 0x7B56, 0x8DF4, 0x7B5D, 0xE2B6, 0x7B65, 0xE2A6, + 0x7B67, 0xE2A8, 0x7B6C, 0xE2AB, 0x7B6E, 0xE2AC, 0x7B70, 0xE2A9, + 0x7B71, 0xE2AA, 0x7B74, 0xE2A7, 0x7B75, 0xE2A5, 0x7B7A, 0xE29F, + 0x7B86, 0x95CD, 0x7B87, 0x89D3, 0x7B8B, 0xE2B3, 0x7B8D, 0xE2B0, + 0x7B8F, 0xE2B5, 0x7B92, 0xE2B4, 0x7B94, 0x9493, 0x7B95, 0x96A5, + 0x7B97, 0x8E5A, 0x7B98, 0xE2AE, 0x7B99, 0xE2B7, 0x7B9A, 0xE2B2, + 0x7B9C, 0xE2B1, 0x7B9D, 0xE2AD, 0x7B9E, 0xFB88, 0x7B9F, 0xE2AF, + 0x7BA1, 0x8AC7, 0x7BAA, 0x925C, 0x7BAD, 0x90FB, 0x7BB1, 0x94A0, + 0x7BB4, 0xE2BC, 0x7BB8, 0x94A2, 0x7BC0, 0x90DF, 0x7BC1, 0xE2B9, + 0x7BC4, 0x94CD, 0x7BC6, 0xE2BD, 0x7BC7, 0x95D1, 0x7BC9, 0x927A, + 0x7BCB, 0xE2B8, 0x7BCC, 0xE2BA, 0x7BCF, 0xE2BB, 0x7BDD, 0xE2BE, + 0x7BE0, 0x8EC2, 0x7BE4, 0x93C4, 0x7BE5, 0xE2C3, 0x7BE6, 0xE2C2, + 0x7BE9, 0xE2BF, 0x7BED, 0x9855, 0x7BF3, 0xE2C8, 0x7BF6, 0xE2CC, + 0x7BF7, 0xE2C9, 0x7C00, 0xE2C5, 0x7C07, 0xE2C6, 0x7C0D, 0xE2CB, + 0x7C11, 0xE2C0, 0x7C12, 0x99D3, 0x7C13, 0xE2C7, 0x7C14, 0xE2C1, + 0x7C17, 0xE2CA, 0x7C1F, 0xE2D0, 0x7C21, 0x8AC8, 0x7C23, 0xE2CD, + 0x7C27, 0xE2CE, 0x7C2A, 0xE2CF, 0x7C2B, 0xE2D2, 0x7C37, 0xE2D1, + 0x7C38, 0x94F4, 0x7C3D, 0xE2D3, 0x7C3E, 0x97FA, 0x7C3F, 0x95EB, + 0x7C40, 0xE2D8, 0x7C43, 0xE2D5, 0x7C4C, 0xE2D4, 0x7C4D, 0x90D0, + 0x7C4F, 0xE2D7, 0x7C50, 0xE2D9, 0x7C54, 0xE2D6, 0x7C56, 0xE2DD, + 0x7C58, 0xE2DA, 0x7C5F, 0xE2DB, 0x7C60, 0xE2C4, 0x7C64, 0xE2DC, + 0x7C65, 0xE2DE, 0x7C6C, 0xE2DF, 0x7C73, 0x95C4, 0x7C75, 0xE2E0, + 0x7C7E, 0x96E0, 0x7C81, 0x8BCC, 0x7C82, 0x8C48, 0x7C83, 0xE2E1, + 0x7C89, 0x95B2, 0x7C8B, 0x9088, 0x7C8D, 0x96AE, 0x7C90, 0xE2E2, + 0x7C92, 0x97B1, 0x7C95, 0x9494, 0x7C97, 0x9165, 0x7C98, 0x9453, + 0x7C9B, 0x8F6C, 0x7C9F, 0x88BE, 0x7CA1, 0xE2E7, 0x7CA2, 0xE2E5, + 0x7CA4, 0xE2E3, 0x7CA5, 0x8A9F, 0x7CA7, 0x8FCF, 0x7CA8, 0xE2E8, + 0x7CAB, 0xE2E6, 0x7CAD, 0xE2E4, 0x7CAE, 0xE2EC, 0x7CB1, 0xE2EB, + 0x7CB2, 0xE2EA, 0x7CB3, 0xE2E9, 0x7CB9, 0xE2ED, 0x7CBD, 0xE2EE, + 0x7CBE, 0x90B8, 0x7CC0, 0xE2EF, 0x7CC2, 0xE2F1, 0x7CC5, 0xE2F0, + 0x7CCA, 0x8CD0, 0x7CCE, 0x9157, 0x7CD2, 0xE2F3, 0x7CD6, 0x939C, + 0x7CD8, 0xE2F2, 0x7CDC, 0xE2F4, 0x7CDE, 0x95B3, 0x7CDF, 0x918C, + 0x7CE0, 0x8D66, 0x7CE2, 0xE2F5, 0x7CE7, 0x97C6, 0x7CEF, 0xE2F7, + 0x7CF2, 0xE2F8, 0x7CF4, 0xE2F9, 0x7CF6, 0xE2FA, 0x7CF8, 0x8E85, + 0x7CFA, 0xE2FB, 0x7CFB, 0x8C6E, 0x7CFE, 0x8B8A, 0x7D00, 0x8B49, + 0x7D02, 0xE340, 0x7D04, 0x96F1, 0x7D05, 0x8D67, 0x7D06, 0xE2FC, + 0x7D0A, 0xE343, 0x7D0B, 0x96E4, 0x7D0D, 0x945B, 0x7D10, 0x9552, + 0x7D14, 0x8F83, 0x7D15, 0xE342, 0x7D17, 0x8ED1, 0x7D18, 0x8D68, + 0x7D19, 0x8E86, 0x7D1A, 0x8B89, 0x7D1B, 0x95B4, 0x7D1C, 0xE341, + 0x7D20, 0x9166, 0x7D21, 0x9661, 0x7D22, 0x8DF5, 0x7D2B, 0x8E87, + 0x7D2C, 0x92DB, 0x7D2E, 0xE346, 0x7D2F, 0x97DD, 0x7D30, 0x8DD7, + 0x7D32, 0xE347, 0x7D33, 0x9061, 0x7D35, 0xE349, 0x7D39, 0x8FD0, + 0x7D3A, 0x8DAE, 0x7D3F, 0xE348, 0x7D42, 0x8F49, 0x7D43, 0x8CBC, + 0x7D44, 0x9167, 0x7D45, 0xE344, 0x7D46, 0xE34A, 0x7D48, 0xFB8A, + 0x7D4B, 0xE345, 0x7D4C, 0x8C6F, 0x7D4E, 0xE34D, 0x7D4F, 0xE351, + 0x7D50, 0x8C8B, 0x7D56, 0xE34C, 0x7D5B, 0xE355, 0x7D5C, 0xFB8B, + 0x7D5E, 0x8D69, 0x7D61, 0x978D, 0x7D62, 0x88BA, 0x7D63, 0xE352, + 0x7D66, 0x8B8B, 0x7D68, 0xE34F, 0x7D6E, 0xE350, 0x7D71, 0x939D, + 0x7D72, 0xE34E, 0x7D73, 0xE34B, 0x7D75, 0x8A47, 0x7D76, 0x90E2, + 0x7D79, 0x8CA6, 0x7D7D, 0xE357, 0x7D89, 0xE354, 0x7D8F, 0xE356, + 0x7D93, 0xE353, 0x7D99, 0x8C70, 0x7D9A, 0x91B1, 0x7D9B, 0xE358, + 0x7D9C, 0x918E, 0x7D9F, 0xE365, 0x7DA0, 0xFB8D, 0x7DA2, 0xE361, + 0x7DA3, 0xE35B, 0x7DAB, 0xE35F, 0x7DAC, 0x8EF8, 0x7DAD, 0x88DB, + 0x7DAE, 0xE35A, 0x7DAF, 0xE362, 0x7DB0, 0xE366, 0x7DB1, 0x8D6A, + 0x7DB2, 0x96D4, 0x7DB4, 0x92D4, 0x7DB5, 0xE35C, 0x7DB7, 0xFB8C, + 0x7DB8, 0xE364, 0x7DBA, 0xE359, 0x7DBB, 0x925D, 0x7DBD, 0xE35E, + 0x7DBE, 0x88BB, 0x7DBF, 0x96C8, 0x7DC7, 0xE35D, 0x7DCA, 0x8BD9, + 0x7DCB, 0x94EA, 0x7DCF, 0x918D, 0x7DD1, 0x97CE, 0x7DD2, 0x8F8F, + 0x7DD5, 0xE38E, 0x7DD6, 0xFB8E, 0x7DD8, 0xE367, 0x7DDA, 0x90FC, + 0x7DDC, 0xE363, 0x7DDD, 0xE368, 0x7DDE, 0xE36A, 0x7DE0, 0x92F7, + 0x7DE1, 0xE36D, 0x7DE4, 0xE369, 0x7DE8, 0x95D2, 0x7DE9, 0x8AC9, + 0x7DEC, 0x96C9, 0x7DEF, 0x88DC, 0x7DF2, 0xE36C, 0x7DF4, 0x97FB, + 0x7DFB, 0xE36B, 0x7E01, 0x898F, 0x7E04, 0x93EA, 0x7E05, 0xE36E, + 0x7E09, 0xE375, 0x7E0A, 0xE36F, 0x7E0B, 0xE376, 0x7E12, 0xE372, + 0x7E1B, 0x949B, 0x7E1E, 0x8EC8, 0x7E1F, 0xE374, 0x7E21, 0xE371, + 0x7E22, 0xE377, 0x7E23, 0xE370, 0x7E26, 0x8F63, 0x7E2B, 0x9644, + 0x7E2E, 0x8F6B, 0x7E31, 0xE373, 0x7E32, 0xE380, 0x7E35, 0xE37B, + 0x7E37, 0xE37E, 0x7E39, 0xE37C, 0x7E3A, 0xE381, 0x7E3B, 0xE37A, + 0x7E3D, 0xE360, 0x7E3E, 0x90D1, 0x7E41, 0x94C9, 0x7E43, 0xE37D, + 0x7E46, 0xE378, 0x7E4A, 0x9140, 0x7E4B, 0x8C71, 0x7E4D, 0x8F4A, + 0x7E52, 0xFB8F, 0x7E54, 0x9044, 0x7E55, 0x9155, 0x7E56, 0xE384, + 0x7E59, 0xE386, 0x7E5A, 0xE387, 0x7E5D, 0xE383, 0x7E5E, 0xE385, + 0x7E66, 0xE379, 0x7E67, 0xE382, 0x7E69, 0xE38A, 0x7E6A, 0xE389, + 0x7E6D, 0x969A, 0x7E70, 0x8C4A, 0x7E79, 0xE388, 0x7E7B, 0xE38C, + 0x7E7C, 0xE38B, 0x7E7D, 0xE38F, 0x7E7F, 0xE391, 0x7E82, 0x8E5B, + 0x7E83, 0xE38D, 0x7E88, 0xE392, 0x7E89, 0xE393, 0x7E8A, 0xFA5C, + 0x7E8C, 0xE394, 0x7E8E, 0xE39A, 0x7E8F, 0x935A, 0x7E90, 0xE396, + 0x7E92, 0xE395, 0x7E93, 0xE397, 0x7E94, 0xE398, 0x7E96, 0xE399, + 0x7E9B, 0xE39B, 0x7E9C, 0xE39C, 0x7F36, 0x8ACA, 0x7F38, 0xE39D, + 0x7F3A, 0xE39E, 0x7F45, 0xE39F, 0x7F47, 0xFB90, 0x7F4C, 0xE3A0, + 0x7F4D, 0xE3A1, 0x7F4E, 0xE3A2, 0x7F50, 0xE3A3, 0x7F51, 0xE3A4, + 0x7F54, 0xE3A6, 0x7F55, 0xE3A5, 0x7F58, 0xE3A7, 0x7F5F, 0xE3A8, + 0x7F60, 0xE3A9, 0x7F67, 0xE3AC, 0x7F68, 0xE3AA, 0x7F69, 0xE3AB, + 0x7F6A, 0x8DDF, 0x7F6B, 0x8C72, 0x7F6E, 0x9275, 0x7F70, 0x94B1, + 0x7F72, 0x8F90, 0x7F75, 0x946C, 0x7F77, 0x94EB, 0x7F78, 0xE3AD, + 0x7F79, 0x9CEB, 0x7F82, 0xE3AE, 0x7F83, 0xE3B0, 0x7F85, 0x9785, + 0x7F86, 0xE3AF, 0x7F87, 0xE3B2, 0x7F88, 0xE3B1, 0x7F8A, 0x9772, + 0x7F8C, 0xE3B3, 0x7F8E, 0x94FC, 0x7F94, 0xE3B4, 0x7F9A, 0xE3B7, + 0x7F9D, 0xE3B6, 0x7F9E, 0xE3B5, 0x7FA1, 0xFB91, 0x7FA3, 0xE3B8, + 0x7FA4, 0x8C51, 0x7FA8, 0x9141, 0x7FA9, 0x8B60, 0x7FAE, 0xE3BC, + 0x7FAF, 0xE3B9, 0x7FB2, 0xE3BA, 0x7FB6, 0xE3BD, 0x7FB8, 0xE3BE, + 0x7FB9, 0xE3BB, 0x7FBD, 0x8948, 0x7FC1, 0x89A5, 0x7FC5, 0xE3C0, + 0x7FC6, 0xE3C1, 0x7FCA, 0xE3C2, 0x7FCC, 0x9782, 0x7FD2, 0x8F4B, + 0x7FD4, 0xE3C4, 0x7FD5, 0xE3C3, 0x7FE0, 0x9089, 0x7FE1, 0xE3C5, + 0x7FE6, 0xE3C6, 0x7FE9, 0xE3C7, 0x7FEB, 0x8AE3, 0x7FF0, 0x8ACB, + 0x7FF3, 0xE3C8, 0x7FF9, 0xE3C9, 0x7FFB, 0x967C, 0x7FFC, 0x9783, + 0x8000, 0x9773, 0x8001, 0x9856, 0x8003, 0x8D6C, 0x8004, 0xE3CC, + 0x8005, 0x8ED2, 0x8006, 0xE3CB, 0x800B, 0xE3CD, 0x800C, 0x8EA7, + 0x8010, 0x91CF, 0x8012, 0xE3CE, 0x8015, 0x8D6B, 0x8017, 0x96D5, + 0x8018, 0xE3CF, 0x8019, 0xE3D0, 0x801C, 0xE3D1, 0x8021, 0xE3D2, + 0x8028, 0xE3D3, 0x8033, 0x8EA8, 0x8036, 0x96EB, 0x803B, 0xE3D5, + 0x803D, 0x925E, 0x803F, 0xE3D4, 0x8046, 0xE3D7, 0x804A, 0xE3D6, + 0x8052, 0xE3D8, 0x8056, 0x90B9, 0x8058, 0xE3D9, 0x805A, 0xE3DA, + 0x805E, 0x95B7, 0x805F, 0xE3DB, 0x8061, 0x918F, 0x8062, 0xE3DC, + 0x8068, 0xE3DD, 0x806F, 0x97FC, 0x8070, 0xE3E0, 0x8072, 0xE3DF, + 0x8073, 0xE3DE, 0x8074, 0x92AE, 0x8076, 0xE3E1, 0x8077, 0x9045, + 0x8079, 0xE3E2, 0x807D, 0xE3E3, 0x807E, 0x9857, 0x807F, 0xE3E4, + 0x8084, 0xE3E5, 0x8085, 0xE3E7, 0x8086, 0xE3E6, 0x8087, 0x94A3, + 0x8089, 0x93F7, 0x808B, 0x985D, 0x808C, 0x94A7, 0x8093, 0xE3E9, + 0x8096, 0x8FD1, 0x8098, 0x9549, 0x809A, 0xE3EA, 0x809B, 0xE3E8, + 0x809D, 0x8ACC, 0x80A1, 0x8CD2, 0x80A2, 0x8E88, 0x80A5, 0x94EC, + 0x80A9, 0x8CA8, 0x80AA, 0x9662, 0x80AC, 0xE3ED, 0x80AD, 0xE3EB, + 0x80AF, 0x8D6D, 0x80B1, 0x8D6E, 0x80B2, 0x88E7, 0x80B4, 0x8DE6, + 0x80BA, 0x9478, 0x80C3, 0x88DD, 0x80C4, 0xE3F2, 0x80C6, 0x925F, + 0x80CC, 0x9477, 0x80CE, 0x91D9, 0x80D6, 0xE3F4, 0x80D9, 0xE3F0, + 0x80DA, 0xE3F3, 0x80DB, 0xE3EE, 0x80DD, 0xE3F1, 0x80DE, 0x9645, + 0x80E1, 0x8CD3, 0x80E4, 0x88FB, 0x80E5, 0xE3EF, 0x80EF, 0xE3F6, + 0x80F1, 0xE3F7, 0x80F4, 0x93B7, 0x80F8, 0x8BB9, 0x80FC, 0xE445, + 0x80FD, 0x945C, 0x8102, 0x8E89, 0x8105, 0x8BBA, 0x8106, 0x90C6, + 0x8107, 0x9865, 0x8108, 0x96AC, 0x8109, 0xE3F5, 0x810A, 0x90D2, + 0x811A, 0x8B72, 0x811B, 0xE3F8, 0x8123, 0xE3FA, 0x8129, 0xE3F9, + 0x812F, 0xE3FB, 0x8131, 0x9245, 0x8133, 0x945D, 0x8139, 0x92AF, + 0x813E, 0xE442, 0x8146, 0xE441, 0x814B, 0xE3FC, 0x814E, 0x9074, + 0x8150, 0x9585, 0x8151, 0xE444, 0x8153, 0xE443, 0x8154, 0x8D6F, + 0x8155, 0x9872, 0x815F, 0xE454, 0x8165, 0xE448, 0x8166, 0xE449, + 0x816B, 0x8EEE, 0x816E, 0xE447, 0x8170, 0x8D98, 0x8171, 0xE446, + 0x8174, 0xE44A, 0x8178, 0x92B0, 0x8179, 0x95A0, 0x817A, 0x9142, + 0x817F, 0x91DA, 0x8180, 0xE44E, 0x8182, 0xE44F, 0x8183, 0xE44B, + 0x8188, 0xE44C, 0x818A, 0xE44D, 0x818F, 0x8D70, 0x8193, 0xE455, + 0x8195, 0xE451, 0x819A, 0x9586, 0x819C, 0x968C, 0x819D, 0x9547, + 0x81A0, 0xE450, 0x81A3, 0xE453, 0x81A4, 0xE452, 0x81A8, 0x9663, + 0x81A9, 0xE456, 0x81B0, 0xE457, 0x81B3, 0x9156, 0x81B5, 0xE458, + 0x81B8, 0xE45A, 0x81BA, 0xE45E, 0x81BD, 0xE45B, 0x81BE, 0xE459, + 0x81BF, 0x945E, 0x81C0, 0xE45C, 0x81C2, 0xE45D, 0x81C6, 0x89B0, + 0x81C8, 0xE464, 0x81C9, 0xE45F, 0x81CD, 0xE460, 0x81D1, 0xE461, + 0x81D3, 0x919F, 0x81D8, 0xE463, 0x81D9, 0xE462, 0x81DA, 0xE465, + 0x81DF, 0xE466, 0x81E0, 0xE467, 0x81E3, 0x9062, 0x81E5, 0x89E7, + 0x81E7, 0xE468, 0x81E8, 0x97D5, 0x81EA, 0x8EA9, 0x81ED, 0x8F4C, + 0x81F3, 0x8E8A, 0x81F4, 0x9276, 0x81FA, 0xE469, 0x81FB, 0xE46A, + 0x81FC, 0x8950, 0x81FE, 0xE46B, 0x8201, 0xE46C, 0x8202, 0xE46D, + 0x8205, 0xE46E, 0x8207, 0xE46F, 0x8208, 0x8BBB, 0x8209, 0x9DA8, + 0x820A, 0xE470, 0x820C, 0x90E3, 0x820D, 0xE471, 0x820E, 0x8EC9, + 0x8210, 0xE472, 0x8212, 0x98AE, 0x8216, 0xE473, 0x8217, 0x95DC, + 0x8218, 0x8ADA, 0x821B, 0x9143, 0x821C, 0x8F77, 0x821E, 0x9591, + 0x821F, 0x8F4D, 0x8229, 0xE474, 0x822A, 0x8D71, 0x822B, 0xE475, + 0x822C, 0x94CA, 0x822E, 0xE484, 0x8233, 0xE477, 0x8235, 0x91C7, + 0x8236, 0x9495, 0x8237, 0x8CBD, 0x8238, 0xE476, 0x8239, 0x9144, + 0x8240, 0xE478, 0x8247, 0x92F8, 0x8258, 0xE47A, 0x8259, 0xE479, + 0x825A, 0xE47C, 0x825D, 0xE47B, 0x825F, 0xE47D, 0x8262, 0xE480, + 0x8264, 0xE47E, 0x8266, 0x8ACD, 0x8268, 0xE481, 0x826A, 0xE482, + 0x826B, 0xE483, 0x826E, 0x8DAF, 0x826F, 0x97C7, 0x8271, 0xE485, + 0x8272, 0x9046, 0x8276, 0x8990, 0x8277, 0xE486, 0x8278, 0xE487, + 0x827E, 0xE488, 0x828B, 0x88F0, 0x828D, 0xE489, 0x8292, 0xE48A, + 0x8299, 0x9587, 0x829D, 0x8EC5, 0x829F, 0xE48C, 0x82A5, 0x8A48, + 0x82A6, 0x88B0, 0x82AB, 0xE48B, 0x82AC, 0xE48E, 0x82AD, 0x946D, + 0x82AF, 0x9063, 0x82B1, 0x89D4, 0x82B3, 0x9646, 0x82B8, 0x8C7C, + 0x82B9, 0x8BDA, 0x82BB, 0xE48D, 0x82BD, 0x89E8, 0x82C5, 0x8AA1, + 0x82D1, 0x8991, 0x82D2, 0xE492, 0x82D3, 0x97E8, 0x82D4, 0x91DB, + 0x82D7, 0x9563, 0x82D9, 0xE49E, 0x82DB, 0x89D5, 0x82DC, 0xE49C, + 0x82DE, 0xE49A, 0x82DF, 0xE491, 0x82E1, 0xE48F, 0x82E3, 0xE490, + 0x82E5, 0x8EE1, 0x82E6, 0x8BEA, 0x82E7, 0x9297, 0x82EB, 0x93CF, + 0x82F1, 0x8970, 0x82F3, 0xE494, 0x82F4, 0xE493, 0x82F9, 0xE499, + 0x82FA, 0xE495, 0x82FB, 0xE498, 0x8301, 0xFB93, 0x8302, 0x96CE, + 0x8303, 0xE497, 0x8304, 0x89D6, 0x8305, 0x8A9D, 0x8306, 0xE49B, + 0x8309, 0xE49D, 0x830E, 0x8C73, 0x8316, 0xE4A1, 0x8317, 0xE4AA, + 0x8318, 0xE4AB, 0x831C, 0x88A9, 0x8323, 0xE4B2, 0x8328, 0x88EF, + 0x832B, 0xE4A9, 0x832F, 0xE4A8, 0x8331, 0xE4A3, 0x8332, 0xE4A2, + 0x8334, 0xE4A0, 0x8335, 0xE49F, 0x8336, 0x9283, 0x8338, 0x91F9, + 0x8339, 0xE4A5, 0x8340, 0xE4A4, 0x8345, 0xE4A7, 0x8349, 0x9190, + 0x834A, 0x8C74, 0x834F, 0x8960, 0x8350, 0xE4A6, 0x8352, 0x8D72, + 0x8358, 0x9191, 0x8362, 0xFB94, 0x8373, 0xE4B8, 0x8375, 0xE4B9, + 0x8377, 0x89D7, 0x837B, 0x89AC, 0x837C, 0xE4B6, 0x837F, 0xFB95, + 0x8385, 0xE4AC, 0x8387, 0xE4B4, 0x8389, 0xE4BB, 0x838A, 0xE4B5, + 0x838E, 0xE4B3, 0x8393, 0xE496, 0x8396, 0xE4B1, 0x839A, 0xE4AD, + 0x839E, 0x8ACE, 0x839F, 0xE4AF, 0x83A0, 0xE4BA, 0x83A2, 0xE4B0, + 0x83A8, 0xE4BC, 0x83AA, 0xE4AE, 0x83AB, 0x949C, 0x83B1, 0x9789, + 0x83B5, 0xE4B7, 0x83BD, 0xE4CD, 0x83C1, 0xE4C5, 0x83C5, 0x909B, + 0x83C7, 0xFB96, 0x83CA, 0x8B65, 0x83CC, 0x8BDB, 0x83CE, 0xE4C0, + 0x83D3, 0x89D9, 0x83D6, 0x8FD2, 0x83D8, 0xE4C3, 0x83DC, 0x8DD8, + 0x83DF, 0x9370, 0x83E0, 0xE4C8, 0x83E9, 0x95EC, 0x83EB, 0xE4BF, + 0x83EF, 0x89D8, 0x83F0, 0x8CD4, 0x83F1, 0x9548, 0x83F2, 0xE4C9, + 0x83F4, 0xE4BD, 0x83F6, 0xFB97, 0x83F7, 0xE4C6, 0x83FB, 0xE4D0, + 0x83FD, 0xE4C1, 0x8403, 0xE4C2, 0x8404, 0x93B8, 0x8407, 0xE4C7, + 0x840B, 0xE4C4, 0x840C, 0x9647, 0x840D, 0xE4CA, 0x840E, 0x88DE, + 0x8413, 0xE4BE, 0x8420, 0xE4CC, 0x8422, 0xE4CB, 0x8429, 0x948B, + 0x842A, 0xE4D2, 0x842C, 0xE4DD, 0x8431, 0x8A9E, 0x8435, 0xE4E0, + 0x8438, 0xE4CE, 0x843C, 0xE4D3, 0x843D, 0x978E, 0x8446, 0xE4DC, + 0x8448, 0xFB98, 0x8449, 0x9774, 0x844E, 0x97A8, 0x8457, 0x9298, + 0x845B, 0x8A8B, 0x8461, 0x9592, 0x8462, 0xE4E2, 0x8463, 0x939F, + 0x8466, 0x88AF, 0x8469, 0xE4DB, 0x846B, 0xE4D7, 0x846C, 0x9192, + 0x846D, 0xE4D1, 0x846E, 0xE4D9, 0x846F, 0xE4DE, 0x8471, 0x944B, + 0x8475, 0x88A8, 0x8477, 0xE4D6, 0x8479, 0xE4DF, 0x847A, 0x9598, + 0x8482, 0xE4DA, 0x8484, 0xE4D5, 0x848B, 0x8FD3, 0x8490, 0x8F4E, + 0x8494, 0x8EAA, 0x8499, 0x96D6, 0x849C, 0x9566, 0x849F, 0xE4E5, + 0x84A1, 0xE4EE, 0x84AD, 0xE4D8, 0x84B2, 0x8A97, 0x84B4, 0xFB99, + 0x84B8, 0x8FF6, 0x84B9, 0xE4E3, 0x84BB, 0xE4E8, 0x84BC, 0x9193, + 0x84BF, 0xE4E4, 0x84C1, 0xE4EB, 0x84C4, 0x927E, 0x84C6, 0xE4EC, + 0x84C9, 0x9775, 0x84CA, 0xE4E1, 0x84CB, 0x8A57, 0x84CD, 0xE4E7, + 0x84D0, 0xE4EA, 0x84D1, 0x96AA, 0x84D6, 0xE4ED, 0x84D9, 0xE4E6, + 0x84DA, 0xE4E9, 0x84DC, 0xFA60, 0x84EC, 0x9648, 0x84EE, 0x9840, + 0x84F4, 0xE4F1, 0x84FC, 0xE4F8, 0x84FF, 0xE4F0, 0x8500, 0x8EC1, + 0x8506, 0xE4CF, 0x8511, 0x95CC, 0x8513, 0x96A0, 0x8514, 0xE4F7, + 0x8515, 0xE4F6, 0x8517, 0xE4F2, 0x8518, 0xE4F3, 0x851A, 0x8955, + 0x851F, 0xE4F5, 0x8521, 0xE4EF, 0x8526, 0x92D3, 0x852C, 0xE4F4, + 0x852D, 0x88FC, 0x8535, 0x91A0, 0x853D, 0x95C1, 0x8540, 0xE4F9, + 0x8541, 0xE540, 0x8543, 0x94D7, 0x8548, 0xE4FC, 0x8549, 0x8FD4, + 0x854A, 0x8EC7, 0x854B, 0xE542, 0x854E, 0x8BBC, 0x8553, 0xFB9A, + 0x8555, 0xE543, 0x8557, 0x9599, 0x8558, 0xE4FB, 0x8559, 0xFB9B, + 0x855A, 0xE4D4, 0x8563, 0xE4FA, 0x8568, 0x986E, 0x8569, 0x93A0, + 0x856A, 0x9593, 0x856B, 0xFB9C, 0x856D, 0xE54A, 0x8577, 0xE550, + 0x857E, 0xE551, 0x8580, 0xE544, 0x8584, 0x9496, 0x8587, 0xE54E, + 0x8588, 0xE546, 0x858A, 0xE548, 0x8590, 0xE552, 0x8591, 0xE547, + 0x8594, 0xE54B, 0x8597, 0x8992, 0x8599, 0x93E3, 0x859B, 0xE54C, + 0x859C, 0xE54F, 0x85A4, 0xE545, 0x85A6, 0x9145, 0x85A8, 0xE549, + 0x85A9, 0x8E46, 0x85AA, 0x9064, 0x85AB, 0x8C4F, 0x85AC, 0x96F2, + 0x85AE, 0x96F7, 0x85AF, 0x8F92, 0x85B0, 0xFB9E, 0x85B9, 0xE556, + 0x85BA, 0xE554, 0x85C1, 0x986D, 0x85C9, 0xE553, 0x85CD, 0x9795, + 0x85CF, 0xE555, 0x85D0, 0xE557, 0x85D5, 0xE558, 0x85DC, 0xE55B, + 0x85DD, 0xE559, 0x85E4, 0x93A1, 0x85E5, 0xE55A, 0x85E9, 0x94CB, + 0x85EA, 0xE54D, 0x85F7, 0x8F93, 0x85F9, 0xE55C, 0x85FA, 0xE561, + 0x85FB, 0x9194, 0x85FE, 0xE560, 0x8602, 0xE541, 0x8606, 0xE562, + 0x8607, 0x9168, 0x860A, 0xE55D, 0x860B, 0xE55F, 0x8613, 0xE55E, + 0x8616, 0x9F50, 0x8617, 0x9F41, 0x861A, 0xE564, 0x8622, 0xE563, + 0x862D, 0x9796, 0x862F, 0xE1BA, 0x8630, 0xE565, 0x863F, 0xE566, + 0x864D, 0xE567, 0x864E, 0x8CD5, 0x8650, 0x8B73, 0x8654, 0xE569, + 0x8655, 0x997C, 0x865A, 0x8B95, 0x865C, 0x97B8, 0x865E, 0x8BF1, + 0x865F, 0xE56A, 0x8667, 0xE56B, 0x866B, 0x928E, 0x8671, 0xE56C, + 0x8679, 0x93F8, 0x867B, 0x88B8, 0x868A, 0x89E1, 0x868B, 0xE571, + 0x868C, 0xE572, 0x8693, 0xE56D, 0x8695, 0x8E5C, 0x86A3, 0xE56E, + 0x86A4, 0x9461, 0x86A9, 0xE56F, 0x86AA, 0xE570, 0x86AB, 0xE57A, + 0x86AF, 0xE574, 0x86B0, 0xE577, 0x86B6, 0xE573, 0x86C4, 0xE575, + 0x86C6, 0xE576, 0x86C7, 0x8ED6, 0x86C9, 0xE578, 0x86CB, 0x9260, + 0x86CD, 0x8C75, 0x86CE, 0x8A61, 0x86D4, 0xE57B, 0x86D9, 0x8A5E, + 0x86DB, 0xE581, 0x86DE, 0xE57C, 0x86DF, 0xE580, 0x86E4, 0x94B8, + 0x86E9, 0xE57D, 0x86EC, 0xE57E, 0x86ED, 0x9567, 0x86EE, 0x94D8, + 0x86EF, 0xE582, 0x86F8, 0x91FB, 0x86F9, 0xE58C, 0x86FB, 0xE588, + 0x86FE, 0x89E9, 0x8700, 0xE586, 0x8702, 0x9649, 0x8703, 0xE587, + 0x8706, 0xE584, 0x8708, 0xE585, 0x8709, 0xE58A, 0x870A, 0xE58D, + 0x870D, 0xE58B, 0x8711, 0xE589, 0x8712, 0xE583, 0x8718, 0x9277, + 0x871A, 0xE594, 0x871C, 0x96A8, 0x8725, 0xE592, 0x8729, 0xE593, + 0x8734, 0xE58E, 0x8737, 0xE590, 0x873B, 0xE591, 0x873F, 0xE58F, + 0x8749, 0x90E4, 0x874B, 0x9858, 0x874C, 0xE598, 0x874E, 0xE599, + 0x8753, 0xE59F, 0x8755, 0x9049, 0x8757, 0xE59B, 0x8759, 0xE59E, + 0x875F, 0xE596, 0x8760, 0xE595, 0x8763, 0xE5A0, 0x8766, 0x89DA, + 0x8768, 0xE59C, 0x876A, 0xE5A1, 0x876E, 0xE59D, 0x8774, 0xE59A, + 0x8776, 0x92B1, 0x8778, 0xE597, 0x877F, 0x9488, 0x8782, 0xE5A5, + 0x878D, 0x975A, 0x879F, 0xE5A4, 0x87A2, 0xE5A3, 0x87AB, 0xE5AC, + 0x87AF, 0xE5A6, 0x87B3, 0xE5AE, 0x87BA, 0x9786, 0x87BB, 0xE5B1, + 0x87BD, 0xE5A8, 0x87C0, 0xE5A9, 0x87C4, 0xE5AD, 0x87C6, 0xE5B0, + 0x87C7, 0xE5AF, 0x87CB, 0xE5A7, 0x87D0, 0xE5AA, 0x87D2, 0xE5BB, + 0x87E0, 0xE5B4, 0x87EF, 0xE5B2, 0x87F2, 0xE5B3, 0x87F6, 0xE5B8, + 0x87F7, 0xE5B9, 0x87F9, 0x8A49, 0x87FB, 0x8B61, 0x87FE, 0xE5B7, + 0x8805, 0xE5A2, 0x8807, 0xFBA1, 0x880D, 0xE5B6, 0x880E, 0xE5BA, + 0x880F, 0xE5B5, 0x8811, 0xE5BC, 0x8815, 0xE5BE, 0x8816, 0xE5BD, + 0x8821, 0xE5C0, 0x8822, 0xE5BF, 0x8823, 0xE579, 0x8827, 0xE5C4, + 0x8831, 0xE5C1, 0x8836, 0xE5C2, 0x8839, 0xE5C3, 0x883B, 0xE5C5, + 0x8840, 0x8C8C, 0x8842, 0xE5C7, 0x8844, 0xE5C6, 0x8846, 0x8F4F, + 0x884C, 0x8D73, 0x884D, 0x9FA5, 0x8852, 0xE5C8, 0x8853, 0x8F70, + 0x8857, 0x8A58, 0x8859, 0xE5C9, 0x885B, 0x8971, 0x885D, 0x8FD5, + 0x885E, 0xE5CA, 0x8861, 0x8D74, 0x8862, 0xE5CB, 0x8863, 0x88DF, + 0x8868, 0x955C, 0x886B, 0xE5CC, 0x8870, 0x908A, 0x8872, 0xE5D3, + 0x8875, 0xE5D0, 0x8877, 0x928F, 0x887D, 0xE5D1, 0x887E, 0xE5CE, + 0x887F, 0x8BDC, 0x8881, 0xE5CD, 0x8882, 0xE5D4, 0x8888, 0x8C55, + 0x888B, 0x91DC, 0x888D, 0xE5DA, 0x8892, 0xE5D6, 0x8896, 0x91B3, + 0x8897, 0xE5D5, 0x8899, 0xE5D8, 0x889E, 0xE5CF, 0x88A2, 0xE5D9, + 0x88A4, 0xE5DB, 0x88AB, 0x94ED, 0x88AE, 0xE5D7, 0x88B0, 0xE5DC, + 0x88B1, 0xE5DE, 0x88B4, 0x8CD1, 0x88B5, 0xE5D2, 0x88B7, 0x88BF, + 0x88BF, 0xE5DD, 0x88C1, 0x8DD9, 0x88C2, 0x97F4, 0x88C3, 0xE5DF, + 0x88C4, 0xE5E0, 0x88C5, 0x9195, 0x88CF, 0x97A0, 0x88D4, 0xE5E1, + 0x88D5, 0x9754, 0x88D8, 0xE5E2, 0x88D9, 0xE5E3, 0x88DC, 0x95E2, + 0x88DD, 0xE5E4, 0x88DF, 0x8DBE, 0x88E1, 0x97A1, 0x88E8, 0xE5E9, + 0x88F2, 0xE5EA, 0x88F3, 0x8FD6, 0x88F4, 0xE5E8, 0x88F5, 0xFBA2, + 0x88F8, 0x9787, 0x88F9, 0xE5E5, 0x88FC, 0xE5E7, 0x88FD, 0x90BB, + 0x88FE, 0x909E, 0x8902, 0xE5E6, 0x8904, 0xE5EB, 0x8907, 0x95A1, + 0x890A, 0xE5ED, 0x890C, 0xE5EC, 0x8910, 0x8A8C, 0x8912, 0x964A, + 0x8913, 0xE5EE, 0x891C, 0xFA5D, 0x891D, 0xE5FA, 0x891E, 0xE5F0, + 0x8925, 0xE5F1, 0x892A, 0xE5F2, 0x892B, 0xE5F3, 0x8936, 0xE5F7, + 0x8938, 0xE5F8, 0x893B, 0xE5F6, 0x8941, 0xE5F4, 0x8943, 0xE5EF, + 0x8944, 0xE5F5, 0x894C, 0xE5F9, 0x894D, 0xE8B5, 0x8956, 0x89A6, + 0x895E, 0xE5FC, 0x895F, 0x8BDD, 0x8960, 0xE5FB, 0x8964, 0xE641, + 0x8966, 0xE640, 0x896A, 0xE643, 0x896D, 0xE642, 0x896F, 0xE644, + 0x8972, 0x8F50, 0x8974, 0xE645, 0x8977, 0xE646, 0x897E, 0xE647, + 0x897F, 0x90BC, 0x8981, 0x9776, 0x8983, 0xE648, 0x8986, 0x95A2, + 0x8987, 0x9465, 0x8988, 0xE649, 0x898A, 0xE64A, 0x898B, 0x8CA9, + 0x898F, 0x8B4B, 0x8993, 0xE64B, 0x8996, 0x8E8B, 0x8997, 0x9460, + 0x8998, 0xE64C, 0x899A, 0x8A6F, 0x89A1, 0xE64D, 0x89A6, 0xE64F, + 0x89A7, 0x9797, 0x89A9, 0xE64E, 0x89AA, 0x9065, 0x89AC, 0xE650, + 0x89AF, 0xE651, 0x89B2, 0xE652, 0x89B3, 0x8ACF, 0x89BA, 0xE653, + 0x89BD, 0xE654, 0x89BF, 0xE655, 0x89C0, 0xE656, 0x89D2, 0x8A70, + 0x89DA, 0xE657, 0x89DC, 0xE658, 0x89DD, 0xE659, 0x89E3, 0x89F0, + 0x89E6, 0x9047, 0x89E7, 0xE65A, 0x89F4, 0xE65B, 0x89F8, 0xE65C, + 0x8A00, 0x8CBE, 0x8A02, 0x92F9, 0x8A03, 0xE65D, 0x8A08, 0x8C76, + 0x8A0A, 0x9075, 0x8A0C, 0xE660, 0x8A0E, 0x93A2, 0x8A10, 0xE65F, + 0x8A12, 0xFBA3, 0x8A13, 0x8C50, 0x8A16, 0xE65E, 0x8A17, 0x91F5, + 0x8A18, 0x8B4C, 0x8A1B, 0xE661, 0x8A1D, 0xE662, 0x8A1F, 0x8FD7, + 0x8A23, 0x8C8D, 0x8A25, 0xE663, 0x8A2A, 0x964B, 0x8A2D, 0x90DD, + 0x8A31, 0x8B96, 0x8A33, 0x96F3, 0x8A34, 0x9169, 0x8A36, 0xE664, + 0x8A37, 0xFBA4, 0x8A3A, 0x9066, 0x8A3B, 0x9290, 0x8A3C, 0x8FD8, + 0x8A41, 0xE665, 0x8A46, 0xE668, 0x8A48, 0xE669, 0x8A50, 0x8DBC, + 0x8A51, 0x91C0, 0x8A52, 0xE667, 0x8A54, 0x8FD9, 0x8A55, 0x955D, + 0x8A5B, 0xE666, 0x8A5E, 0x8E8C, 0x8A60, 0x8972, 0x8A62, 0xE66D, + 0x8A63, 0x8C77, 0x8A66, 0x8E8E, 0x8A69, 0x8E8D, 0x8A6B, 0x986C, + 0x8A6C, 0xE66C, 0x8A6D, 0xE66B, 0x8A6E, 0x9146, 0x8A70, 0x8B6C, + 0x8A71, 0x9862, 0x8A72, 0x8A59, 0x8A73, 0x8FDA, 0x8A79, 0xFBA5, + 0x8A7C, 0xE66A, 0x8A82, 0xE66F, 0x8A84, 0xE670, 0x8A85, 0xE66E, + 0x8A87, 0x8CD6, 0x8A89, 0x975F, 0x8A8C, 0x8E8F, 0x8A8D, 0x9446, + 0x8A91, 0xE673, 0x8A93, 0x90BE, 0x8A95, 0x9261, 0x8A98, 0x9755, + 0x8A9A, 0xE676, 0x8A9E, 0x8CEA, 0x8AA0, 0x90BD, 0x8AA1, 0xE672, + 0x8AA3, 0xE677, 0x8AA4, 0x8CEB, 0x8AA5, 0xE674, 0x8AA6, 0xE675, + 0x8AA7, 0xFBA6, 0x8AA8, 0xE671, 0x8AAC, 0x90E0, 0x8AAD, 0x93C7, + 0x8AB0, 0x924E, 0x8AB2, 0x89DB, 0x8AB9, 0x94EE, 0x8ABC, 0x8B62, + 0x8ABE, 0xFBA7, 0x8ABF, 0x92B2, 0x8AC2, 0xE67A, 0x8AC4, 0xE678, + 0x8AC7, 0x926B, 0x8ACB, 0x90BF, 0x8ACC, 0x8AD0, 0x8ACD, 0xE679, + 0x8ACF, 0x907A, 0x8AD2, 0x97C8, 0x8AD6, 0x985F, 0x8ADA, 0xE67B, + 0x8ADB, 0xE687, 0x8ADC, 0x92B3, 0x8ADE, 0xE686, 0x8ADF, 0xFBA8, + 0x8AE0, 0xE683, 0x8AE1, 0xE68B, 0x8AE2, 0xE684, 0x8AE4, 0xE680, + 0x8AE6, 0x92FA, 0x8AE7, 0xE67E, 0x8AEB, 0xE67C, 0x8AED, 0x9740, + 0x8AEE, 0x8E90, 0x8AF1, 0xE681, 0x8AF3, 0xE67D, 0x8AF6, 0xFBAA, + 0x8AF7, 0xE685, 0x8AF8, 0x8F94, 0x8AFA, 0x8CBF, 0x8AFE, 0x91F8, + 0x8B00, 0x9664, 0x8B01, 0x8979, 0x8B02, 0x88E0, 0x8B04, 0x93A3, + 0x8B07, 0xE689, 0x8B0C, 0xE688, 0x8B0E, 0x93E4, 0x8B10, 0xE68D, + 0x8B14, 0xE682, 0x8B16, 0xE68C, 0x8B17, 0xE68E, 0x8B19, 0x8CAA, + 0x8B1A, 0xE68A, 0x8B1B, 0x8D75, 0x8B1D, 0x8ED3, 0x8B20, 0xE68F, + 0x8B21, 0x9777, 0x8B26, 0xE692, 0x8B28, 0xE695, 0x8B2B, 0xE693, + 0x8B2C, 0x9554, 0x8B33, 0xE690, 0x8B39, 0x8BDE, 0x8B3E, 0xE694, + 0x8B41, 0xE696, 0x8B49, 0xE69A, 0x8B4C, 0xE697, 0x8B4E, 0xE699, + 0x8B4F, 0xE698, 0x8B53, 0xFBAB, 0x8B56, 0xE69B, 0x8B58, 0x8EAF, + 0x8B5A, 0xE69D, 0x8B5B, 0xE69C, 0x8B5C, 0x9588, 0x8B5F, 0xE69F, + 0x8B66, 0x8C78, 0x8B6B, 0xE69E, 0x8B6C, 0xE6A0, 0x8B6F, 0xE6A1, + 0x8B70, 0x8B63, 0x8B71, 0xE3BF, 0x8B72, 0x8FF7, 0x8B74, 0xE6A2, + 0x8B77, 0x8CEC, 0x8B7D, 0xE6A3, 0x8B7F, 0xFBAC, 0x8B80, 0xE6A4, + 0x8B83, 0x8E5D, 0x8B8A, 0x9DCC, 0x8B8C, 0xE6A5, 0x8B8E, 0xE6A6, + 0x8B90, 0x8F51, 0x8B92, 0xE6A7, 0x8B93, 0xE6A8, 0x8B96, 0xE6A9, + 0x8B99, 0xE6AA, 0x8B9A, 0xE6AB, 0x8C37, 0x924A, 0x8C3A, 0xE6AC, + 0x8C3F, 0xE6AE, 0x8C41, 0xE6AD, 0x8C46, 0x93A4, 0x8C48, 0xE6AF, + 0x8C4A, 0x964C, 0x8C4C, 0xE6B0, 0x8C4E, 0xE6B1, 0x8C50, 0xE6B2, + 0x8C55, 0xE6B3, 0x8C5A, 0x93D8, 0x8C61, 0x8FDB, 0x8C62, 0xE6B4, + 0x8C6A, 0x8D8B, 0x8C6B, 0x98AC, 0x8C6C, 0xE6B5, 0x8C78, 0xE6B6, + 0x8C79, 0x955E, 0x8C7A, 0xE6B7, 0x8C7C, 0xE6BF, 0x8C82, 0xE6B8, + 0x8C85, 0xE6BA, 0x8C89, 0xE6B9, 0x8C8A, 0xE6BB, 0x8C8C, 0x9665, + 0x8C8D, 0xE6BC, 0x8C8E, 0xE6BD, 0x8C94, 0xE6BE, 0x8C98, 0xE6C0, + 0x8C9D, 0x8A4C, 0x8C9E, 0x92E5, 0x8CA0, 0x9589, 0x8CA1, 0x8DE0, + 0x8CA2, 0x8D76, 0x8CA7, 0x956E, 0x8CA8, 0x89DD, 0x8CA9, 0x94CC, + 0x8CAA, 0xE6C3, 0x8CAB, 0x8AD1, 0x8CAC, 0x90D3, 0x8CAD, 0xE6C2, + 0x8CAE, 0xE6C7, 0x8CAF, 0x9299, 0x8CB0, 0x96E1, 0x8CB2, 0xE6C5, + 0x8CB3, 0xE6C6, 0x8CB4, 0x8B4D, 0x8CB6, 0xE6C8, 0x8CB7, 0x9483, + 0x8CB8, 0x91DD, 0x8CBB, 0x94EF, 0x8CBC, 0x935C, 0x8CBD, 0xE6C4, + 0x8CBF, 0x9666, 0x8CC0, 0x89EA, 0x8CC1, 0xE6CA, 0x8CC2, 0x9847, + 0x8CC3, 0x92C0, 0x8CC4, 0x9864, 0x8CC7, 0x8E91, 0x8CC8, 0xE6C9, + 0x8CCA, 0x91AF, 0x8CCD, 0xE6DA, 0x8CCE, 0x9147, 0x8CD1, 0x93F6, + 0x8CD3, 0x956F, 0x8CDA, 0xE6CD, 0x8CDB, 0x8E5E, 0x8CDC, 0x8E92, + 0x8CDE, 0x8FDC, 0x8CE0, 0x9485, 0x8CE2, 0x8CAB, 0x8CE3, 0xE6CC, + 0x8CE4, 0xE6CB, 0x8CE6, 0x958A, 0x8CEA, 0x8EBF, 0x8CED, 0x9371, + 0x8CF0, 0xFBAD, 0x8CF4, 0xFBAE, 0x8CFA, 0xE6CF, 0x8CFB, 0xE6D0, + 0x8CFC, 0x8D77, 0x8CFD, 0xE6CE, 0x8D04, 0xE6D1, 0x8D05, 0xE6D2, + 0x8D07, 0xE6D4, 0x8D08, 0x91A1, 0x8D0A, 0xE6D3, 0x8D0B, 0x8AE4, + 0x8D0D, 0xE6D6, 0x8D0F, 0xE6D5, 0x8D10, 0xE6D7, 0x8D12, 0xFBAF, + 0x8D13, 0xE6D9, 0x8D14, 0xE6DB, 0x8D16, 0xE6DC, 0x8D64, 0x90D4, + 0x8D66, 0x8ECD, 0x8D67, 0xE6DD, 0x8D6B, 0x8A71, 0x8D6D, 0xE6DE, + 0x8D70, 0x9196, 0x8D71, 0xE6DF, 0x8D73, 0xE6E0, 0x8D74, 0x958B, + 0x8D76, 0xFBB0, 0x8D77, 0x8B4E, 0x8D81, 0xE6E1, 0x8D85, 0x92B4, + 0x8D8A, 0x897A, 0x8D99, 0xE6E2, 0x8DA3, 0x8EEF, 0x8DA8, 0x9096, + 0x8DB3, 0x91AB, 0x8DBA, 0xE6E5, 0x8DBE, 0xE6E4, 0x8DC2, 0xE6E3, + 0x8DCB, 0xE6EB, 0x8DCC, 0xE6E9, 0x8DCF, 0xE6E6, 0x8DD6, 0xE6E8, + 0x8DDA, 0xE6E7, 0x8DDB, 0xE6EA, 0x8DDD, 0x8B97, 0x8DDF, 0xE6EE, + 0x8DE1, 0x90D5, 0x8DE3, 0xE6EF, 0x8DE8, 0x8CD7, 0x8DEA, 0xE6EC, + 0x8DEB, 0xE6ED, 0x8DEF, 0x9848, 0x8DF3, 0x92B5, 0x8DF5, 0x9148, + 0x8DFC, 0xE6F0, 0x8DFF, 0xE6F3, 0x8E08, 0xE6F1, 0x8E09, 0xE6F2, + 0x8E0A, 0x9778, 0x8E0F, 0x93A5, 0x8E10, 0xE6F6, 0x8E1D, 0xE6F4, + 0x8E1E, 0xE6F5, 0x8E1F, 0xE6F7, 0x8E2A, 0xE748, 0x8E30, 0xE6FA, + 0x8E34, 0xE6FB, 0x8E35, 0xE6F9, 0x8E42, 0xE6F8, 0x8E44, 0x92FB, + 0x8E47, 0xE740, 0x8E48, 0xE744, 0x8E49, 0xE741, 0x8E4A, 0xE6FC, + 0x8E4C, 0xE742, 0x8E50, 0xE743, 0x8E55, 0xE74A, 0x8E59, 0xE745, + 0x8E5F, 0x90D6, 0x8E60, 0xE747, 0x8E63, 0xE749, 0x8E64, 0xE746, + 0x8E72, 0xE74C, 0x8E74, 0x8F52, 0x8E76, 0xE74B, 0x8E7C, 0xE74D, + 0x8E81, 0xE74E, 0x8E84, 0xE751, 0x8E85, 0xE750, 0x8E87, 0xE74F, + 0x8E8A, 0xE753, 0x8E8B, 0xE752, 0x8E8D, 0x96F4, 0x8E91, 0xE755, + 0x8E93, 0xE754, 0x8E94, 0xE756, 0x8E99, 0xE757, 0x8EA1, 0xE759, + 0x8EAA, 0xE758, 0x8EAB, 0x9067, 0x8EAC, 0xE75A, 0x8EAF, 0x8BEB, + 0x8EB0, 0xE75B, 0x8EB1, 0xE75D, 0x8EBE, 0xE75E, 0x8EC5, 0xE75F, + 0x8EC6, 0xE75C, 0x8EC8, 0xE760, 0x8ECA, 0x8ED4, 0x8ECB, 0xE761, + 0x8ECC, 0x8B4F, 0x8ECD, 0x8C52, 0x8ECF, 0xFBB2, 0x8ED2, 0x8CAC, + 0x8EDB, 0xE762, 0x8EDF, 0x93EE, 0x8EE2, 0x935D, 0x8EE3, 0xE763, + 0x8EEB, 0xE766, 0x8EF8, 0x8EB2, 0x8EFB, 0xE765, 0x8EFC, 0xE764, + 0x8EFD, 0x8C79, 0x8EFE, 0xE767, 0x8F03, 0x8A72, 0x8F05, 0xE769, + 0x8F09, 0x8DDA, 0x8F0A, 0xE768, 0x8F0C, 0xE771, 0x8F12, 0xE76B, + 0x8F13, 0xE76D, 0x8F14, 0x95E3, 0x8F15, 0xE76A, 0x8F19, 0xE76C, + 0x8F1B, 0xE770, 0x8F1C, 0xE76E, 0x8F1D, 0x8B50, 0x8F1F, 0xE76F, + 0x8F26, 0xE772, 0x8F29, 0x9479, 0x8F2A, 0x97D6, 0x8F2F, 0x8F53, + 0x8F33, 0xE773, 0x8F38, 0x9741, 0x8F39, 0xE775, 0x8F3B, 0xE774, + 0x8F3E, 0xE778, 0x8F3F, 0x9760, 0x8F42, 0xE777, 0x8F44, 0x8A8D, + 0x8F45, 0xE776, 0x8F46, 0xE77B, 0x8F49, 0xE77A, 0x8F4C, 0xE779, + 0x8F4D, 0x9351, 0x8F4E, 0xE77C, 0x8F57, 0xE77D, 0x8F5C, 0xE77E, + 0x8F5F, 0x8D8C, 0x8F61, 0x8C44, 0x8F62, 0xE780, 0x8F63, 0xE781, + 0x8F64, 0xE782, 0x8F9B, 0x9068, 0x8F9C, 0xE783, 0x8F9E, 0x8EAB, + 0x8F9F, 0xE784, 0x8FA3, 0xE785, 0x8FA7, 0x999F, 0x8FA8, 0x999E, + 0x8FAD, 0xE786, 0x8FAE, 0xE390, 0x8FAF, 0xE787, 0x8FB0, 0x9243, + 0x8FB1, 0x904A, 0x8FB2, 0x945F, 0x8FB7, 0xE788, 0x8FBA, 0x95D3, + 0x8FBB, 0x92D2, 0x8FBC, 0x8D9E, 0x8FBF, 0x9248, 0x8FC2, 0x8949, + 0x8FC4, 0x9698, 0x8FC5, 0x9076, 0x8FCE, 0x8C7D, 0x8FD1, 0x8BDF, + 0x8FD4, 0x95D4, 0x8FDA, 0xE789, 0x8FE2, 0xE78B, 0x8FE5, 0xE78A, + 0x8FE6, 0x89DE, 0x8FE9, 0x93F4, 0x8FEA, 0xE78C, 0x8FEB, 0x9497, + 0x8FED, 0x9352, 0x8FEF, 0xE78D, 0x8FF0, 0x8F71, 0x8FF4, 0xE78F, + 0x8FF7, 0x96C0, 0x8FF8, 0xE79E, 0x8FF9, 0xE791, 0x8FFA, 0xE792, + 0x8FFD, 0x92C7, 0x9000, 0x91DE, 0x9001, 0x9197, 0x9003, 0x93A6, + 0x9005, 0xE790, 0x9006, 0x8B74, 0x900B, 0xE799, 0x900D, 0xE796, + 0x900E, 0xE7A3, 0x900F, 0x93A7, 0x9010, 0x9280, 0x9011, 0xE793, + 0x9013, 0x92FC, 0x9014, 0x9372, 0x9015, 0xE794, 0x9016, 0xE798, + 0x9017, 0x9080, 0x9019, 0x9487, 0x901A, 0x92CA, 0x901D, 0x90C0, + 0x901E, 0xE797, 0x901F, 0x91AC, 0x9020, 0x91A2, 0x9021, 0xE795, + 0x9022, 0x88A7, 0x9023, 0x9841, 0x9027, 0xE79A, 0x902E, 0x91DF, + 0x9031, 0x8F54, 0x9032, 0x9069, 0x9035, 0xE79C, 0x9036, 0xE79B, + 0x9038, 0x88ED, 0x9039, 0xE79D, 0x903C, 0x954E, 0x903E, 0xE7A5, + 0x9041, 0x93D9, 0x9042, 0x908B, 0x9045, 0x9278, 0x9047, 0x8BF6, + 0x9049, 0xE7A4, 0x904A, 0x9756, 0x904B, 0x895E, 0x904D, 0x95D5, + 0x904E, 0x89DF, 0x904F, 0xE79F, 0x9050, 0xE7A0, 0x9051, 0xE7A1, + 0x9052, 0xE7A2, 0x9053, 0x93B9, 0x9054, 0x9242, 0x9055, 0x88E1, + 0x9056, 0xE7A6, 0x9058, 0xE7A7, 0x9059, 0xEAA1, 0x905C, 0x91BB, + 0x905E, 0xE7A8, 0x9060, 0x8993, 0x9061, 0x916B, 0x9063, 0x8CAD, + 0x9065, 0x9779, 0x9067, 0xFBB5, 0x9068, 0xE7A9, 0x9069, 0x934B, + 0x906D, 0x9198, 0x906E, 0x8ED5, 0x906F, 0xE7AA, 0x9072, 0xE7AD, + 0x9075, 0x8F85, 0x9076, 0xE7AB, 0x9077, 0x914A, 0x9078, 0x9149, + 0x907A, 0x88E2, 0x907C, 0x97C9, 0x907D, 0xE7AF, 0x907F, 0x94F0, + 0x9080, 0xE7B1, 0x9081, 0xE7B0, 0x9082, 0xE7AE, 0x9083, 0xE284, + 0x9084, 0x8AD2, 0x9087, 0xE78E, 0x9089, 0xE7B3, 0x908A, 0xE7B2, + 0x908F, 0xE7B4, 0x9091, 0x9757, 0x90A3, 0x93DF, 0x90A6, 0x964D, + 0x90A8, 0xE7B5, 0x90AA, 0x8ED7, 0x90AF, 0xE7B6, 0x90B1, 0xE7B7, + 0x90B5, 0xE7B8, 0x90B8, 0x9340, 0x90C1, 0x88E8, 0x90CA, 0x8D78, + 0x90CE, 0x9859, 0x90DB, 0xE7BC, 0x90DE, 0xFBB6, 0x90E1, 0x8C53, + 0x90E2, 0xE7B9, 0x90E4, 0xE7BA, 0x90E8, 0x9594, 0x90ED, 0x8A73, + 0x90F5, 0x9758, 0x90F7, 0x8BBD, 0x90FD, 0x9373, 0x9102, 0xE7BD, + 0x9112, 0xE7BE, 0x9115, 0xFBB8, 0x9119, 0xE7BF, 0x9127, 0xFBB9, + 0x912D, 0x9341, 0x9130, 0xE7C1, 0x9132, 0xE7C0, 0x9149, 0x93D1, + 0x914A, 0xE7C2, 0x914B, 0x8F55, 0x914C, 0x8EDE, 0x914D, 0x947A, + 0x914E, 0x9291, 0x9152, 0x8EF0, 0x9154, 0x908C, 0x9156, 0xE7C3, + 0x9158, 0xE7C4, 0x9162, 0x907C, 0x9163, 0xE7C5, 0x9165, 0xE7C6, + 0x9169, 0xE7C7, 0x916A, 0x978F, 0x916C, 0x8F56, 0x9172, 0xE7C9, + 0x9173, 0xE7C8, 0x9175, 0x8D79, 0x9177, 0x8D93, 0x9178, 0x8E5F, + 0x9182, 0xE7CC, 0x9187, 0x8F86, 0x9189, 0xE7CB, 0x918B, 0xE7CA, + 0x918D, 0x91E7, 0x9190, 0x8CED, 0x9192, 0x90C1, 0x9197, 0x94AE, + 0x919C, 0x8F58, 0x91A2, 0xE7CD, 0x91A4, 0x8FDD, 0x91AA, 0xE7D0, + 0x91AB, 0xE7CE, 0x91AF, 0xE7CF, 0x91B4, 0xE7D2, 0x91B5, 0xE7D1, + 0x91B8, 0x8FF8, 0x91BA, 0xE7D3, 0x91C0, 0xE7D4, 0x91C1, 0xE7D5, + 0x91C6, 0x94CE, 0x91C7, 0x8DD1, 0x91C8, 0x8EDF, 0x91C9, 0xE7D6, + 0x91CB, 0xE7D7, 0x91CC, 0x97A2, 0x91CD, 0x8F64, 0x91CE, 0x96EC, + 0x91CF, 0x97CA, 0x91D0, 0xE7D8, 0x91D1, 0x8BE0, 0x91D6, 0xE7D9, + 0x91D7, 0xFBBB, 0x91D8, 0x9342, 0x91DA, 0xFBBA, 0x91DB, 0xE7DC, + 0x91DC, 0x8A98, 0x91DD, 0x906A, 0x91DE, 0xFBBC, 0x91DF, 0xE7DA, + 0x91E1, 0xE7DB, 0x91E3, 0x92DE, 0x91E4, 0xFBBF, 0x91E5, 0xFBC0, + 0x91E6, 0x9674, 0x91E7, 0x8BFA, 0x91ED, 0xFBBD, 0x91EE, 0xFBBE, + 0x91F5, 0xE7DE, 0x91F6, 0xE7DF, 0x91FC, 0xE7DD, 0x91FF, 0xE7E1, + 0x9206, 0xFBC1, 0x920A, 0xFBC3, 0x920D, 0x93DD, 0x920E, 0x8A62, + 0x9210, 0xFBC2, 0x9211, 0xE7E5, 0x9214, 0xE7E2, 0x9215, 0xE7E4, + 0x921E, 0xE7E0, 0x9229, 0xE86E, 0x922C, 0xE7E3, 0x9234, 0x97E9, + 0x9237, 0x8CD8, 0x9239, 0xFBCA, 0x923A, 0xFBC4, 0x923C, 0xFBC6, + 0x923F, 0xE7ED, 0x9240, 0xFBC5, 0x9244, 0x9353, 0x9245, 0xE7E8, + 0x9248, 0xE7EB, 0x9249, 0xE7E9, 0x924B, 0xE7EE, 0x924E, 0xFBC7, + 0x9250, 0xE7EF, 0x9251, 0xFBC9, 0x9257, 0xE7E7, 0x9259, 0xFBC8, + 0x925A, 0xE7F4, 0x925B, 0x8994, 0x925E, 0xE7E6, 0x9262, 0x94AB, + 0x9264, 0xE7EA, 0x9266, 0x8FDE, 0x9267, 0xFBCB, 0x9271, 0x8D7A, + 0x9277, 0xFBCD, 0x9278, 0xFBCE, 0x927E, 0x9667, 0x9280, 0x8BE2, + 0x9283, 0x8F65, 0x9285, 0x93BA, 0x9288, 0xFA5F, 0x9291, 0x914C, + 0x9293, 0xE7F2, 0x9295, 0xE7EC, 0x9296, 0xE7F1, 0x9298, 0x96C1, + 0x929A, 0x92B6, 0x929B, 0xE7F3, 0x929C, 0xE7F0, 0x92A7, 0xFBCC, + 0x92AD, 0x914B, 0x92B7, 0xE7F7, 0x92B9, 0xE7F6, 0x92CF, 0xE7F5, + 0x92D0, 0xFBD2, 0x92D2, 0x964E, 0x92D3, 0xFBD6, 0x92D5, 0xFBD4, + 0x92D7, 0xFBD0, 0x92D9, 0xFBD1, 0x92E0, 0xFBD5, 0x92E4, 0x8F9B, + 0x92E7, 0xFBCF, 0x92E9, 0xE7F8, 0x92EA, 0x95DD, 0x92ED, 0x8973, + 0x92F2, 0x9565, 0x92F3, 0x9292, 0x92F8, 0x8B98, 0x92F9, 0xFA65, + 0x92FA, 0xE7FA, 0x92FB, 0xFBD9, 0x92FC, 0x8D7C, 0x92FF, 0xFBDC, + 0x9302, 0xFBDE, 0x9306, 0x8E4B, 0x930F, 0xE7F9, 0x9310, 0x908D, + 0x9318, 0x908E, 0x9319, 0xE840, 0x931A, 0xE842, 0x931D, 0xFBDD, + 0x931E, 0xFBDB, 0x9320, 0x8FF9, 0x9321, 0xFBD8, 0x9322, 0xE841, + 0x9323, 0xE843, 0x9325, 0xFBD7, 0x9326, 0x8BD1, 0x9328, 0x9564, + 0x932B, 0x8EE0, 0x932C, 0x9842, 0x932E, 0xE7FC, 0x932F, 0x8DF6, + 0x9332, 0x985E, 0x9335, 0xE845, 0x933A, 0xE844, 0x933B, 0xE846, + 0x9344, 0xE7FB, 0x9348, 0xFA5E, 0x934B, 0x93E7, 0x934D, 0x9374, + 0x9354, 0x92D5, 0x9356, 0xE84B, 0x9357, 0xFBE0, 0x935B, 0x9262, + 0x935C, 0xE847, 0x9360, 0xE848, 0x936C, 0x8C4C, 0x936E, 0xE84A, + 0x9370, 0xFBDF, 0x9375, 0x8CAE, 0x937C, 0xE849, 0x937E, 0x8FDF, + 0x938C, 0x8A99, 0x9394, 0xE84F, 0x9396, 0x8DBD, 0x9397, 0x9199, + 0x939A, 0x92C8, 0x93A4, 0xFBE1, 0x93A7, 0x8A5A, 0x93AC, 0xE84D, + 0x93AD, 0xE84E, 0x93AE, 0x92C1, 0x93B0, 0xE84C, 0x93B9, 0xE850, + 0x93C3, 0xE856, 0x93C6, 0xFBE2, 0x93C8, 0xE859, 0x93D0, 0xE858, + 0x93D1, 0x934C, 0x93D6, 0xE851, 0x93D7, 0xE852, 0x93D8, 0xE855, + 0x93DD, 0xE857, 0x93DE, 0xFBE3, 0x93E1, 0x8BBE, 0x93E4, 0xE85A, + 0x93E5, 0xE854, 0x93E8, 0xE853, 0x93F8, 0xFBE4, 0x9403, 0xE85E, + 0x9407, 0xE85F, 0x9410, 0xE860, 0x9413, 0xE85D, 0x9414, 0xE85C, + 0x9418, 0x8FE0, 0x9419, 0x93A8, 0x941A, 0xE85B, 0x9421, 0xE864, + 0x942B, 0xE862, 0x9431, 0xFBE5, 0x9435, 0xE863, 0x9436, 0xE861, + 0x9438, 0x91F6, 0x943A, 0xE865, 0x9441, 0xE866, 0x9444, 0xE868, + 0x9445, 0xFBE6, 0x9448, 0xFBE7, 0x9451, 0x8AD3, 0x9452, 0xE867, + 0x9453, 0x96F8, 0x945A, 0xE873, 0x945B, 0xE869, 0x945E, 0xE86C, + 0x9460, 0xE86A, 0x9462, 0xE86B, 0x946A, 0xE86D, 0x9470, 0xE86F, + 0x9475, 0xE870, 0x9477, 0xE871, 0x947C, 0xE874, 0x947D, 0xE872, + 0x947E, 0xE875, 0x947F, 0xE877, 0x9481, 0xE876, 0x9577, 0x92B7, + 0x9580, 0x96E5, 0x9582, 0xE878, 0x9583, 0x914D, 0x9587, 0xE879, + 0x9589, 0x95C2, 0x958A, 0xE87A, 0x958B, 0x8A4A, 0x958F, 0x895B, + 0x9591, 0x8AD5, 0x9592, 0xFBE8, 0x9593, 0x8AD4, 0x9594, 0xE87B, + 0x9596, 0xE87C, 0x9598, 0xE87D, 0x9599, 0xE87E, 0x95A0, 0xE880, + 0x95A2, 0x8AD6, 0x95A3, 0x8A74, 0x95A4, 0x8D7D, 0x95A5, 0x94B4, + 0x95A7, 0xE882, 0x95A8, 0xE881, 0x95AD, 0xE883, 0x95B2, 0x897B, + 0x95B9, 0xE886, 0x95BB, 0xE885, 0x95BC, 0xE884, 0x95BE, 0xE887, + 0x95C3, 0xE88A, 0x95C7, 0x88C5, 0x95CA, 0xE888, 0x95CC, 0xE88C, + 0x95CD, 0xE88B, 0x95D4, 0xE88E, 0x95D5, 0xE88D, 0x95D6, 0xE88F, + 0x95D8, 0x93AC, 0x95DC, 0xE890, 0x95E1, 0xE891, 0x95E2, 0xE893, + 0x95E5, 0xE892, 0x961C, 0x958C, 0x9621, 0xE894, 0x9628, 0xE895, + 0x962A, 0x8DE3, 0x962E, 0xE896, 0x962F, 0xE897, 0x9632, 0x9668, + 0x963B, 0x916A, 0x963F, 0x88A2, 0x9640, 0x91C9, 0x9642, 0xE898, + 0x9644, 0x958D, 0x964B, 0xE89B, 0x964C, 0xE899, 0x964D, 0x8D7E, + 0x964F, 0xE89A, 0x9650, 0x8CC0, 0x965B, 0x95C3, 0x965C, 0xE89D, + 0x965D, 0xE89F, 0x965E, 0xE89E, 0x965F, 0xE8A0, 0x9662, 0x8940, + 0x9663, 0x9077, 0x9664, 0x8F9C, 0x9665, 0x8AD7, 0x9666, 0xE8A1, + 0x966A, 0x9486, 0x966C, 0xE8A3, 0x9670, 0x8941, 0x9672, 0xE8A2, + 0x9673, 0x92C2, 0x9675, 0x97CB, 0x9676, 0x93A9, 0x9677, 0xE89C, + 0x9678, 0x97A4, 0x967A, 0x8CAF, 0x967D, 0x977A, 0x9685, 0x8BF7, + 0x9686, 0x97B2, 0x9688, 0x8C47, 0x968A, 0x91E0, 0x968B, 0xE440, + 0x968D, 0xE8A4, 0x968E, 0x8A4B, 0x968F, 0x908F, 0x9694, 0x8A75, + 0x9695, 0xE8A6, 0x9697, 0xE8A7, 0x9698, 0xE8A5, 0x9699, 0x8C84, + 0x969B, 0x8DDB, 0x969C, 0x8FE1, 0x969D, 0xFBEB, 0x96A0, 0x8942, + 0x96A3, 0x97D7, 0x96A7, 0xE8A9, 0x96A8, 0xE7AC, 0x96AA, 0xE8A8, + 0x96AF, 0xFBEC, 0x96B0, 0xE8AC, 0x96B1, 0xE8AA, 0x96B2, 0xE8AB, + 0x96B4, 0xE8AD, 0x96B6, 0xE8AE, 0x96B7, 0x97EA, 0x96B8, 0xE8AF, + 0x96B9, 0xE8B0, 0x96BB, 0x90C7, 0x96BC, 0x94B9, 0x96C0, 0x909D, + 0x96C1, 0x8AE5, 0x96C4, 0x9759, 0x96C5, 0x89EB, 0x96C6, 0x8F57, + 0x96C7, 0x8CD9, 0x96C9, 0xE8B3, 0x96CB, 0xE8B2, 0x96CC, 0x8E93, + 0x96CD, 0xE8B4, 0x96CE, 0xE8B1, 0x96D1, 0x8E47, 0x96D5, 0xE8B8, + 0x96D6, 0xE5AB, 0x96D9, 0x99D4, 0x96DB, 0x9097, 0x96DC, 0xE8B6, + 0x96E2, 0x97A3, 0x96E3, 0x93EF, 0x96E8, 0x894A, 0x96EA, 0x90E1, + 0x96EB, 0x8EB4, 0x96F0, 0x95B5, 0x96F2, 0x895F, 0x96F6, 0x97EB, + 0x96F7, 0x978B, 0x96F9, 0xE8B9, 0x96FB, 0x9364, 0x9700, 0x8EF9, + 0x9704, 0xE8BA, 0x9706, 0xE8BB, 0x9707, 0x906B, 0x9708, 0xE8BC, + 0x970A, 0x97EC, 0x970D, 0xE8B7, 0x970E, 0xE8BE, 0x970F, 0xE8C0, + 0x9711, 0xE8BF, 0x9713, 0xE8BD, 0x9716, 0xE8C1, 0x9719, 0xE8C2, + 0x971C, 0x919A, 0x971E, 0x89E0, 0x9724, 0xE8C3, 0x9727, 0x96B6, + 0x972A, 0xE8C4, 0x9730, 0xE8C5, 0x9732, 0x9849, 0x9733, 0xFBED, + 0x9738, 0x9E50, 0x9739, 0xE8C6, 0x973B, 0xFBEE, 0x973D, 0xE8C7, + 0x973E, 0xE8C8, 0x9742, 0xE8CC, 0x9743, 0xFBEF, 0x9744, 0xE8C9, + 0x9746, 0xE8CA, 0x9748, 0xE8CB, 0x9749, 0xE8CD, 0x974D, 0xFBF0, + 0x974F, 0xFBF1, 0x9751, 0xFBF2, 0x9752, 0x90C2, 0x9755, 0xFBF3, + 0x9756, 0x96F5, 0x9759, 0x90C3, 0x975C, 0xE8CE, 0x975E, 0x94F1, + 0x9760, 0xE8CF, 0x9761, 0xEA72, 0x9762, 0x96CA, 0x9764, 0xE8D0, + 0x9766, 0xE8D1, 0x9768, 0xE8D2, 0x9769, 0x8A76, 0x976B, 0xE8D4, + 0x976D, 0x9078, 0x9771, 0xE8D5, 0x9774, 0x8C43, 0x9779, 0xE8D6, + 0x977A, 0xE8DA, 0x977C, 0xE8D8, 0x9781, 0xE8D9, 0x9784, 0x8A93, + 0x9785, 0xE8D7, 0x9786, 0xE8DB, 0x978B, 0xE8DC, 0x978D, 0x88C6, + 0x978F, 0xE8DD, 0x9790, 0xE8DE, 0x9798, 0x8FE2, 0x979C, 0xE8DF, + 0x97A0, 0x8B66, 0x97A3, 0xE8E2, 0x97A6, 0xE8E1, 0x97A8, 0xE8E0, + 0x97AB, 0xE691, 0x97AD, 0x95DA, 0x97B3, 0xE8E3, 0x97B4, 0xE8E4, + 0x97C3, 0xE8E5, 0x97C6, 0xE8E6, 0x97C8, 0xE8E7, 0x97CB, 0xE8E8, + 0x97D3, 0x8AD8, 0x97DC, 0xE8E9, 0x97ED, 0xE8EA, 0x97EE, 0x9442, + 0x97F2, 0xE8EC, 0x97F3, 0x89B9, 0x97F5, 0xE8EF, 0x97F6, 0xE8EE, + 0x97FB, 0x8943, 0x97FF, 0x8BBF, 0x9801, 0x95C5, 0x9802, 0x92B8, + 0x9803, 0x8DA0, 0x9805, 0x8D80, 0x9806, 0x8F87, 0x9808, 0x907B, + 0x980C, 0xE8F1, 0x980F, 0xE8F0, 0x9810, 0x9761, 0x9811, 0x8AE6, + 0x9812, 0x94D0, 0x9813, 0x93DA, 0x9817, 0x909C, 0x9818, 0x97CC, + 0x981A, 0x8C7A, 0x9821, 0xE8F4, 0x9824, 0xE8F3, 0x982C, 0x966A, + 0x982D, 0x93AA, 0x9834, 0x896F, 0x9837, 0xE8F5, 0x9838, 0xE8F2, + 0x983B, 0x9570, 0x983C, 0x978A, 0x983D, 0xE8F6, 0x9846, 0xE8F7, + 0x984B, 0xE8F9, 0x984C, 0x91E8, 0x984D, 0x8A7A, 0x984E, 0x8A7B, + 0x984F, 0xE8F8, 0x9854, 0x8AE7, 0x9855, 0x8CB0, 0x9857, 0xFBF4, + 0x9858, 0x8AE8, 0x985B, 0x935E, 0x985E, 0x97DE, 0x9865, 0xFBF5, + 0x9867, 0x8CDA, 0x986B, 0xE8FA, 0x986F, 0xE8FB, 0x9870, 0xE8FC, + 0x9871, 0xE940, 0x9873, 0xE942, 0x9874, 0xE941, 0x98A8, 0x9597, + 0x98AA, 0xE943, 0x98AF, 0xE944, 0x98B1, 0xE945, 0x98B6, 0xE946, + 0x98C3, 0xE948, 0x98C4, 0xE947, 0x98C6, 0xE949, 0x98DB, 0x94F2, + 0x98DC, 0xE3CA, 0x98DF, 0x9048, 0x98E2, 0x8B51, 0x98E9, 0xE94A, + 0x98EB, 0xE94B, 0x98ED, 0x99AA, 0x98EE, 0x9F5A, 0x98EF, 0x94D1, + 0x98F2, 0x88F9, 0x98F4, 0x88B9, 0x98FC, 0x8E94, 0x98FD, 0x964F, + 0x98FE, 0x8FFC, 0x9903, 0xE94C, 0x9905, 0x96DD, 0x9909, 0xE94D, + 0x990A, 0x977B, 0x990C, 0x8961, 0x9910, 0x8E60, 0x9912, 0xE94E, + 0x9913, 0x89EC, 0x9914, 0xE94F, 0x9918, 0xE950, 0x991D, 0xE952, + 0x991E, 0xE953, 0x9920, 0xE955, 0x9921, 0xE951, 0x9924, 0xE954, + 0x9927, 0xFBF8, 0x9928, 0x8AD9, 0x992C, 0xE956, 0x992E, 0xE957, + 0x993D, 0xE958, 0x993E, 0xE959, 0x9942, 0xE95A, 0x9945, 0xE95C, + 0x9949, 0xE95B, 0x994B, 0xE95E, 0x994C, 0xE961, 0x9950, 0xE95D, + 0x9951, 0xE95F, 0x9952, 0xE960, 0x9955, 0xE962, 0x9957, 0x8BC0, + 0x9996, 0x8EF1, 0x9997, 0xE963, 0x9998, 0xE964, 0x9999, 0x8D81, + 0x999E, 0xFBFA, 0x99A5, 0xE965, 0x99A8, 0x8A5D, 0x99AC, 0x946E, + 0x99AD, 0xE966, 0x99AE, 0xE967, 0x99B3, 0x9279, 0x99B4, 0x93E9, + 0x99BC, 0xE968, 0x99C1, 0x949D, 0x99C4, 0x91CA, 0x99C5, 0x8977, + 0x99C6, 0x8BEC, 0x99C8, 0x8BED, 0x99D0, 0x9293, 0x99D1, 0xE96D, + 0x99D2, 0x8BEE, 0x99D5, 0x89ED, 0x99D8, 0xE96C, 0x99DB, 0xE96A, + 0x99DD, 0xE96B, 0x99DF, 0xE969, 0x99E2, 0xE977, 0x99ED, 0xE96E, + 0x99EE, 0xE96F, 0x99F1, 0xE970, 0x99F2, 0xE971, 0x99F8, 0xE973, + 0x99FB, 0xE972, 0x99FF, 0x8F78, 0x9A01, 0xE974, 0x9A05, 0xE976, + 0x9A0E, 0x8B52, 0x9A0F, 0xE975, 0x9A12, 0x919B, 0x9A13, 0x8CB1, + 0x9A19, 0xE978, 0x9A28, 0x91CB, 0x9A2B, 0xE979, 0x9A30, 0x93AB, + 0x9A37, 0xE97A, 0x9A3E, 0xE980, 0x9A40, 0xE97D, 0x9A42, 0xE97C, + 0x9A43, 0xE97E, 0x9A45, 0xE97B, 0x9A4D, 0xE982, 0x9A4E, 0xFBFB, + 0x9A55, 0xE981, 0x9A57, 0xE984, 0x9A5A, 0x8BC1, 0x9A5B, 0xE983, + 0x9A5F, 0xE985, 0x9A62, 0xE986, 0x9A64, 0xE988, 0x9A65, 0xE987, + 0x9A69, 0xE989, 0x9A6A, 0xE98B, 0x9A6B, 0xE98A, 0x9AA8, 0x8D9C, + 0x9AAD, 0xE98C, 0x9AB0, 0xE98D, 0x9AB8, 0x8A5B, 0x9ABC, 0xE98E, + 0x9AC0, 0xE98F, 0x9AC4, 0x9091, 0x9ACF, 0xE990, 0x9AD1, 0xE991, + 0x9AD3, 0xE992, 0x9AD4, 0xE993, 0x9AD8, 0x8D82, 0x9AD9, 0xFBFC, + 0x9ADC, 0xFC40, 0x9ADE, 0xE994, 0x9ADF, 0xE995, 0x9AE2, 0xE996, + 0x9AE3, 0xE997, 0x9AE6, 0xE998, 0x9AEA, 0x94AF, 0x9AEB, 0xE99A, + 0x9AED, 0x9545, 0x9AEE, 0xE99B, 0x9AEF, 0xE999, 0x9AF1, 0xE99D, + 0x9AF4, 0xE99C, 0x9AF7, 0xE99E, 0x9AFB, 0xE99F, 0x9B06, 0xE9A0, + 0x9B18, 0xE9A1, 0x9B1A, 0xE9A2, 0x9B1F, 0xE9A3, 0x9B22, 0xE9A4, + 0x9B23, 0xE9A5, 0x9B25, 0xE9A6, 0x9B27, 0xE9A7, 0x9B28, 0xE9A8, + 0x9B29, 0xE9A9, 0x9B2A, 0xE9AA, 0x9B2E, 0xE9AB, 0x9B2F, 0xE9AC, + 0x9B31, 0x9F54, 0x9B32, 0xE9AD, 0x9B3B, 0xE2F6, 0x9B3C, 0x8B53, + 0x9B41, 0x8A40, 0x9B42, 0x8DB0, 0x9B43, 0xE9AF, 0x9B44, 0xE9AE, + 0x9B45, 0x96A3, 0x9B4D, 0xE9B1, 0x9B4E, 0xE9B2, 0x9B4F, 0xE9B0, + 0x9B51, 0xE9B3, 0x9B54, 0x9682, 0x9B58, 0xE9B4, 0x9B5A, 0x8B9B, + 0x9B6F, 0x9844, 0x9B72, 0xFC42, 0x9B74, 0xE9B5, 0x9B75, 0xFC41, + 0x9B83, 0xE9B7, 0x9B8E, 0x88BC, 0x9B8F, 0xFC43, 0x9B91, 0xE9B8, + 0x9B92, 0x95A9, 0x9B93, 0xE9B6, 0x9B96, 0xE9B9, 0x9B97, 0xE9BA, + 0x9B9F, 0xE9BB, 0x9BA0, 0xE9BC, 0x9BA8, 0xE9BD, 0x9BAA, 0x968E, + 0x9BAB, 0x8E4C, 0x9BAD, 0x8DF8, 0x9BAE, 0x914E, 0x9BB1, 0xFC44, + 0x9BB4, 0xE9BE, 0x9BB9, 0xE9C1, 0x9BBB, 0xFC45, 0x9BC0, 0xE9BF, + 0x9BC6, 0xE9C2, 0x9BC9, 0x8CEF, 0x9BCA, 0xE9C0, 0x9BCF, 0xE9C3, + 0x9BD1, 0xE9C4, 0x9BD2, 0xE9C5, 0x9BD4, 0xE9C9, 0x9BD6, 0x8E49, + 0x9BDB, 0x91E2, 0x9BE1, 0xE9CA, 0x9BE2, 0xE9C7, 0x9BE3, 0xE9C6, + 0x9BE4, 0xE9C8, 0x9BE8, 0x8C7E, 0x9BF0, 0xE9CE, 0x9BF1, 0xE9CD, + 0x9BF2, 0xE9CC, 0x9BF5, 0x88B1, 0x9C00, 0xFC46, 0x9C04, 0xE9D8, + 0x9C06, 0xE9D4, 0x9C08, 0xE9D5, 0x9C09, 0xE9D1, 0x9C0A, 0xE9D7, + 0x9C0C, 0xE9D3, 0x9C0D, 0x8A82, 0x9C10, 0x986B, 0x9C12, 0xE9D6, + 0x9C13, 0xE9D2, 0x9C14, 0xE9D0, 0x9C15, 0xE9CF, 0x9C1B, 0xE9DA, + 0x9C21, 0xE9DD, 0x9C24, 0xE9DC, 0x9C25, 0xE9DB, 0x9C2D, 0x9568, + 0x9C2E, 0xE9D9, 0x9C2F, 0x88F1, 0x9C30, 0xE9DE, 0x9C32, 0xE9E0, + 0x9C39, 0x8A8F, 0x9C3A, 0xE9CB, 0x9C3B, 0x8956, 0x9C3E, 0xE9E2, + 0x9C46, 0xE9E1, 0x9C47, 0xE9DF, 0x9C48, 0x924C, 0x9C52, 0x9690, + 0x9C57, 0x97D8, 0x9C5A, 0xE9E3, 0x9C60, 0xE9E4, 0x9C67, 0xE9E5, + 0x9C76, 0xE9E6, 0x9C78, 0xE9E7, 0x9CE5, 0x92B9, 0x9CE7, 0xE9E8, + 0x9CE9, 0x94B5, 0x9CEB, 0xE9ED, 0x9CEC, 0xE9E9, 0x9CF0, 0xE9EA, + 0x9CF3, 0x9650, 0x9CF4, 0x96C2, 0x9CF6, 0x93CE, 0x9D03, 0xE9EE, + 0x9D06, 0xE9EF, 0x9D07, 0x93BC, 0x9D08, 0xE9EC, 0x9D09, 0xE9EB, + 0x9D0E, 0x89A8, 0x9D12, 0xE9F7, 0x9D15, 0xE9F6, 0x9D1B, 0x8995, + 0x9D1F, 0xE9F4, 0x9D23, 0xE9F3, 0x9D26, 0xE9F1, 0x9D28, 0x8A9B, + 0x9D2A, 0xE9F0, 0x9D2B, 0x8EB0, 0x9D2C, 0x89A7, 0x9D3B, 0x8D83, + 0x9D3E, 0xE9FA, 0x9D3F, 0xE9F9, 0x9D41, 0xE9F8, 0x9D44, 0xE9F5, + 0x9D46, 0xE9FB, 0x9D48, 0xE9FC, 0x9D50, 0xEA44, 0x9D51, 0xEA43, + 0x9D59, 0xEA45, 0x9D5C, 0x894C, 0x9D5D, 0xEA40, 0x9D5E, 0xEA41, + 0x9D60, 0x8D94, 0x9D61, 0x96B7, 0x9D64, 0xEA42, 0x9D6B, 0xFC48, + 0x9D6C, 0x9651, 0x9D6F, 0xEA4A, 0x9D70, 0xFC47, 0x9D72, 0xEA46, + 0x9D7A, 0xEA4B, 0x9D87, 0xEA48, 0x9D89, 0xEA47, 0x9D8F, 0x8C7B, + 0x9D9A, 0xEA4C, 0x9DA4, 0xEA4D, 0x9DA9, 0xEA4E, 0x9DAB, 0xEA49, + 0x9DAF, 0xE9F2, 0x9DB2, 0xEA4F, 0x9DB4, 0x92DF, 0x9DB8, 0xEA53, + 0x9DBA, 0xEA54, 0x9DBB, 0xEA52, 0x9DC1, 0xEA51, 0x9DC2, 0xEA57, + 0x9DC4, 0xEA50, 0x9DC6, 0xEA55, 0x9DCF, 0xEA56, 0x9DD3, 0xEA59, + 0x9DD9, 0xEA58, 0x9DE6, 0xEA5B, 0x9DED, 0xEA5C, 0x9DEF, 0xEA5D, + 0x9DF2, 0x9868, 0x9DF8, 0xEA5A, 0x9DF9, 0x91E9, 0x9DFA, 0x8DEB, + 0x9DFD, 0xEA5E, 0x9E19, 0xFC4A, 0x9E1A, 0xEA5F, 0x9E1B, 0xEA60, + 0x9E1E, 0xEA61, 0x9E75, 0xEA62, 0x9E78, 0x8CB2, 0x9E79, 0xEA63, + 0x9E7D, 0xEA64, 0x9E7F, 0x8EAD, 0x9E81, 0xEA65, 0x9E88, 0xEA66, + 0x9E8B, 0xEA67, 0x9E8C, 0xEA68, 0x9E91, 0xEA6B, 0x9E92, 0xEA69, + 0x9E93, 0x985B, 0x9E95, 0xEA6A, 0x9E97, 0x97ED, 0x9E9D, 0xEA6C, + 0x9E9F, 0x97D9, 0x9EA5, 0xEA6D, 0x9EA6, 0x949E, 0x9EA9, 0xEA6E, + 0x9EAA, 0xEA70, 0x9EAD, 0xEA71, 0x9EB8, 0xEA6F, 0x9EB9, 0x8D8D, + 0x9EBA, 0x96CB, 0x9EBB, 0x9683, 0x9EBC, 0x9BF5, 0x9EBE, 0x9F80, + 0x9EBF, 0x969B, 0x9EC4, 0x89A9, 0x9ECC, 0xEA73, 0x9ECD, 0x8B6F, + 0x9ECE, 0xEA74, 0x9ECF, 0xEA75, 0x9ED0, 0xEA76, 0x9ED1, 0xFC4B, + 0x9ED2, 0x8D95, 0x9ED4, 0xEA77, 0x9ED8, 0xE0D2, 0x9ED9, 0x96D9, + 0x9EDB, 0x91E1, 0x9EDC, 0xEA78, 0x9EDD, 0xEA7A, 0x9EDE, 0xEA79, + 0x9EE0, 0xEA7B, 0x9EE5, 0xEA7C, 0x9EE8, 0xEA7D, 0x9EEF, 0xEA7E, + 0x9EF4, 0xEA80, 0x9EF6, 0xEA81, 0x9EF7, 0xEA82, 0x9EF9, 0xEA83, + 0x9EFB, 0xEA84, 0x9EFC, 0xEA85, 0x9EFD, 0xEA86, 0x9F07, 0xEA87, + 0x9F08, 0xEA88, 0x9F0E, 0x9343, 0x9F13, 0x8CDB, 0x9F15, 0xEA8A, + 0x9F20, 0x916C, 0x9F21, 0xEA8B, 0x9F2C, 0xEA8C, 0x9F3B, 0x9540, + 0x9F3E, 0xEA8D, 0x9F4A, 0xEA8E, 0x9F4B, 0xE256, 0x9F4E, 0xE6D8, + 0x9F4F, 0xE8EB, 0x9F52, 0xEA8F, 0x9F54, 0xEA90, 0x9F5F, 0xEA92, + 0x9F60, 0xEA93, 0x9F61, 0xEA94, 0x9F62, 0x97EE, 0x9F63, 0xEA91, + 0x9F66, 0xEA95, 0x9F67, 0xEA96, 0x9F6A, 0xEA98, 0x9F6C, 0xEA97, + 0x9F72, 0xEA9A, 0x9F76, 0xEA9B, 0x9F77, 0xEA99, 0x9F8D, 0x97B4, + 0x9F95, 0xEA9C, 0x9F9C, 0xEA9D, 0x9F9D, 0xE273, 0x9FA0, 0xEA9E, + 0xF929, 0xFAE0, 0xF9DC, 0xFBE9, 0xFA0E, 0xFA90, 0xFA0F, 0xFA9B, + 0xFA10, 0xFA9C, 0xFA11, 0xFAB1, 0xFA12, 0xFAD8, 0xFA13, 0xFAE8, + 0xFA14, 0xFAEA, 0xFA15, 0xFB58, 0xFA16, 0xFB5E, 0xFA17, 0xFB75, + 0xFA18, 0xFB7D, 0xFA19, 0xFB7E, 0xFA1A, 0xFB80, 0xFA1B, 0xFB82, + 0xFA1C, 0xFB86, 0xFA1D, 0xFB89, 0xFA1E, 0xFB92, 0xFA1F, 0xFB9D, + 0xFA20, 0xFB9F, 0xFA21, 0xFBA0, 0xFA22, 0xFBA9, 0xFA23, 0xFBB1, + 0xFA24, 0xFBB3, 0xFA25, 0xFBB4, 0xFA26, 0xFBB7, 0xFA27, 0xFBD3, + 0xFA28, 0xFBDA, 0xFA29, 0xFBEA, 0xFA2A, 0xFBF6, 0xFA2B, 0xFBF7, + 0xFA2C, 0xFBF9, 0xFA2D, 0xFC49, 0xFF01, 0x8149, 0xFF02, 0xFA57, + 0xFF03, 0x8194, 0xFF04, 0x8190, 0xFF05, 0x8193, 0xFF06, 0x8195, + 0xFF07, 0xFA56, 0xFF08, 0x8169, 0xFF09, 0x816A, 0xFF0A, 0x8196, + 0xFF0B, 0x817B, 0xFF0C, 0x8143, 0xFF0D, 0x817C, 0xFF0E, 0x8144, + 0xFF0F, 0x815E, 0xFF10, 0x824F, 0xFF11, 0x8250, 0xFF12, 0x8251, + 0xFF13, 0x8252, 0xFF14, 0x8253, 0xFF15, 0x8254, 0xFF16, 0x8255, + 0xFF17, 0x8256, 0xFF18, 0x8257, 0xFF19, 0x8258, 0xFF1A, 0x8146, + 0xFF1B, 0x8147, 0xFF1C, 0x8183, 0xFF1D, 0x8181, 0xFF1E, 0x8184, + 0xFF1F, 0x8148, 0xFF20, 0x8197, 0xFF21, 0x8260, 0xFF22, 0x8261, + 0xFF23, 0x8262, 0xFF24, 0x8263, 0xFF25, 0x8264, 0xFF26, 0x8265, + 0xFF27, 0x8266, 0xFF28, 0x8267, 0xFF29, 0x8268, 0xFF2A, 0x8269, + 0xFF2B, 0x826A, 0xFF2C, 0x826B, 0xFF2D, 0x826C, 0xFF2E, 0x826D, + 0xFF2F, 0x826E, 0xFF30, 0x826F, 0xFF31, 0x8270, 0xFF32, 0x8271, + 0xFF33, 0x8272, 0xFF34, 0x8273, 0xFF35, 0x8274, 0xFF36, 0x8275, + 0xFF37, 0x8276, 0xFF38, 0x8277, 0xFF39, 0x8278, 0xFF3A, 0x8279, + 0xFF3B, 0x816D, 0xFF3C, 0x815F, 0xFF3D, 0x816E, 0xFF3E, 0x814F, + 0xFF3F, 0x8151, 0xFF40, 0x814D, 0xFF41, 0x8281, 0xFF42, 0x8282, + 0xFF43, 0x8283, 0xFF44, 0x8284, 0xFF45, 0x8285, 0xFF46, 0x8286, + 0xFF47, 0x8287, 0xFF48, 0x8288, 0xFF49, 0x8289, 0xFF4A, 0x828A, + 0xFF4B, 0x828B, 0xFF4C, 0x828C, 0xFF4D, 0x828D, 0xFF4E, 0x828E, + 0xFF4F, 0x828F, 0xFF50, 0x8290, 0xFF51, 0x8291, 0xFF52, 0x8292, + 0xFF53, 0x8293, 0xFF54, 0x8294, 0xFF55, 0x8295, 0xFF56, 0x8296, + 0xFF57, 0x8297, 0xFF58, 0x8298, 0xFF59, 0x8299, 0xFF5A, 0x829A, + 0xFF5B, 0x816F, 0xFF5C, 0x8162, 0xFF5D, 0x8170, 0xFF5E, 0x8160, + 0xFF61, 0x00A1, 0xFF62, 0x00A2, 0xFF63, 0x00A3, 0xFF64, 0x00A4, + 0xFF65, 0x00A5, 0xFF66, 0x00A6, 0xFF67, 0x00A7, 0xFF68, 0x00A8, + 0xFF69, 0x00A9, 0xFF6A, 0x00AA, 0xFF6B, 0x00AB, 0xFF6C, 0x00AC, + 0xFF6D, 0x00AD, 0xFF6E, 0x00AE, 0xFF6F, 0x00AF, 0xFF70, 0x00B0, + 0xFF71, 0x00B1, 0xFF72, 0x00B2, 0xFF73, 0x00B3, 0xFF74, 0x00B4, + 0xFF75, 0x00B5, 0xFF76, 0x00B6, 0xFF77, 0x00B7, 0xFF78, 0x00B8, + 0xFF79, 0x00B9, 0xFF7A, 0x00BA, 0xFF7B, 0x00BB, 0xFF7C, 0x00BC, + 0xFF7D, 0x00BD, 0xFF7E, 0x00BE, 0xFF7F, 0x00BF, 0xFF80, 0x00C0, + 0xFF81, 0x00C1, 0xFF82, 0x00C2, 0xFF83, 0x00C3, 0xFF84, 0x00C4, + 0xFF85, 0x00C5, 0xFF86, 0x00C6, 0xFF87, 0x00C7, 0xFF88, 0x00C8, + 0xFF89, 0x00C9, 0xFF8A, 0x00CA, 0xFF8B, 0x00CB, 0xFF8C, 0x00CC, + 0xFF8D, 0x00CD, 0xFF8E, 0x00CE, 0xFF8F, 0x00CF, 0xFF90, 0x00D0, + 0xFF91, 0x00D1, 0xFF92, 0x00D2, 0xFF93, 0x00D3, 0xFF94, 0x00D4, + 0xFF95, 0x00D5, 0xFF96, 0x00D6, 0xFF97, 0x00D7, 0xFF98, 0x00D8, + 0xFF99, 0x00D9, 0xFF9A, 0x00DA, 0xFF9B, 0x00DB, 0xFF9C, 0x00DC, + 0xFF9D, 0x00DD, 0xFF9E, 0x00DE, 0xFF9F, 0x00DF, 0xFFE0, 0x8191, + 0xFFE1, 0x8192, 0xFFE2, 0x81CA, 0xFFE3, 0x8150, 0xFFE4, 0xFA55, + 0xFFE5, 0x818F, 0, 0 }; #if !_TINY_TABLE @@ -1979,1745 +1978,1745 @@ const WCHAR sjis2uni[] = { 0x8386, 0x30E6, 0x8387, 0x30E7, 0x8388, 0x30E8, 0x8389, 0x30E9, 0x838A, 0x30EA, 0x838B, 0x30EB, 0x838C, 0x30EC, 0x838D, 0x30ED, 0x838E, 0x30EE, 0x838F, 0x30EF, 0x8390, 0x30F0, 0x8391, 0x30F1, - 0x8392, 0x30F2, 0x8393, 0x30F3, 0x8394, 0x30F4, - 0x8395, 0x30F5, 0x8396, 0x30F6, 0x839F, 0x0391, 0x83A0, 0x0392, - 0x83A1, 0x0393, 0x83A2, 0x0394, 0x83A3, 0x0395, 0x83A4, 0x0396, - 0x83A5, 0x0397, 0x83A6, 0x0398, 0x83A7, 0x0399, 0x83A8, 0x039A, - 0x83A9, 0x039B, 0x83AA, 0x039C, 0x83AB, 0x039D, 0x83AC, 0x039E, - 0x83AD, 0x039F, 0x83AE, 0x03A0, 0x83AF, 0x03A1, 0x83B0, 0x03A3, - 0x83B1, 0x03A4, 0x83B2, 0x03A5, 0x83B3, 0x03A6, 0x83B4, 0x03A7, - 0x83B5, 0x03A8, 0x83B6, 0x03A9, 0x83BF, 0x03B1, 0x83C0, 0x03B2, - 0x83C1, 0x03B3, 0x83C2, 0x03B4, 0x83C3, 0x03B5, 0x83C4, 0x03B6, - 0x83C5, 0x03B7, 0x83C6, 0x03B8, 0x83C7, 0x03B9, 0x83C8, 0x03BA, - 0x83C9, 0x03BB, 0x83CA, 0x03BC, 0x83CB, 0x03BD, 0x83CC, 0x03BE, - 0x83CD, 0x03BF, 0x83CE, 0x03C0, 0x83CF, 0x03C1, 0x83D0, 0x03C3, - 0x83D1, 0x03C4, 0x83D2, 0x03C5, 0x83D3, 0x03C6, 0x83D4, 0x03C7, - 0x83D5, 0x03C8, 0x83D6, 0x03C9, 0x8440, 0x0410, 0x8441, 0x0411, - 0x8442, 0x0412, 0x8443, 0x0413, 0x8444, 0x0414, 0x8445, 0x0415, - 0x8446, 0x0401, 0x8447, 0x0416, 0x8448, 0x0417, 0x8449, 0x0418, - 0x844A, 0x0419, 0x844B, 0x041A, 0x844C, 0x041B, 0x844D, 0x041C, - 0x844E, 0x041D, 0x844F, 0x041E, 0x8450, 0x041F, 0x8451, 0x0420, - 0x8452, 0x0421, 0x8453, 0x0422, 0x8454, 0x0423, 0x8455, 0x0424, - 0x8456, 0x0425, 0x8457, 0x0426, 0x8458, 0x0427, 0x8459, 0x0428, - 0x845A, 0x0429, 0x845B, 0x042A, 0x845C, 0x042B, 0x845D, 0x042C, - 0x845E, 0x042D, 0x845F, 0x042E, 0x8460, 0x042F, 0x8470, 0x0430, - 0x8471, 0x0431, 0x8472, 0x0432, 0x8473, 0x0433, 0x8474, 0x0434, - 0x8475, 0x0435, 0x8476, 0x0451, 0x8477, 0x0436, 0x8478, 0x0437, - 0x8479, 0x0438, 0x847A, 0x0439, 0x847B, 0x043A, 0x847C, 0x043B, - 0x847D, 0x043C, 0x847E, 0x043D, 0x8480, 0x043E, 0x8481, 0x043F, - 0x8482, 0x0440, 0x8483, 0x0441, 0x8484, 0x0442, 0x8485, 0x0443, - 0x8486, 0x0444, 0x8487, 0x0445, 0x8488, 0x0446, 0x8489, 0x0447, - 0x848A, 0x0448, 0x848B, 0x0449, 0x848C, 0x044A, 0x848D, 0x044B, - 0x848E, 0x044C, 0x848F, 0x044D, 0x8490, 0x044E, 0x8491, 0x044F, - 0x849F, 0x2500, 0x84A0, 0x2502, 0x84A1, 0x250C, 0x84A2, 0x2510, - 0x84A3, 0x2518, 0x84A4, 0x2514, 0x84A5, 0x251C, 0x84A6, 0x252C, - 0x84A7, 0x2524, 0x84A8, 0x2534, 0x84A9, 0x253C, 0x84AA, 0x2501, - 0x84AB, 0x2503, 0x84AC, 0x250F, 0x84AD, 0x2513, 0x84AE, 0x251B, - 0x84AF, 0x2517, 0x84B0, 0x2523, 0x84B1, 0x2533, 0x84B2, 0x252B, - 0x84B3, 0x253B, 0x84B4, 0x254B, 0x84B5, 0x2520, 0x84B6, 0x252F, - 0x84B7, 0x2528, 0x84B8, 0x2537, 0x84B9, 0x253F, 0x84BA, 0x251D, - 0x84BB, 0x2530, 0x84BC, 0x2525, 0x84BD, 0x2538, 0x84BE, 0x2542, - 0x8740, 0x2460, 0x8741, 0x2461, 0x8742, 0x2462, 0x8743, 0x2463, - 0x8744, 0x2464, 0x8745, 0x2465, 0x8746, 0x2466, 0x8747, 0x2467, - 0x8748, 0x2468, 0x8749, 0x2469, 0x874A, 0x246A, 0x874B, 0x246B, - 0x874C, 0x246C, 0x874D, 0x246D, 0x874E, 0x246E, 0x874F, 0x246F, - 0x8750, 0x2470, 0x8751, 0x2471, 0x8752, 0x2472, 0x8753, 0x2473, - 0x8754, 0x2160, 0x8755, 0x2161, 0x8756, 0x2162, 0x8757, 0x2163, - 0x8758, 0x2164, 0x8759, 0x2165, 0x875A, 0x2166, 0x875B, 0x2167, - 0x875C, 0x2168, 0x875D, 0x2169, 0x875F, 0x3349, 0x8760, 0x3314, - 0x8761, 0x3322, 0x8762, 0x334D, 0x8763, 0x3318, 0x8764, 0x3327, - 0x8765, 0x3303, 0x8766, 0x3336, 0x8767, 0x3351, 0x8768, 0x3357, - 0x8769, 0x330D, 0x876A, 0x3326, 0x876B, 0x3323, 0x876C, 0x332B, - 0x876D, 0x334A, 0x876E, 0x333B, 0x876F, 0x339C, 0x8770, 0x339D, - 0x8771, 0x339E, 0x8772, 0x338E, 0x8773, 0x338F, 0x8774, 0x33C4, - 0x8775, 0x33A1, 0x877E, 0x337B, 0x8780, 0x301D, 0x8781, 0x301F, - 0x8782, 0x2116, 0x8783, 0x33CD, 0x8784, 0x2121, 0x8785, 0x32A4, - 0x8786, 0x32A5, 0x8787, 0x32A6, 0x8788, 0x32A7, 0x8789, 0x32A8, - 0x878A, 0x3231, 0x878B, 0x3232, 0x878C, 0x3239, 0x878D, 0x337E, - 0x878E, 0x337D, 0x878F, 0x337C, 0x8793, 0x222E, 0x8794, 0x2211, - 0x8798, 0x221F, 0x8799, 0x22BF, 0x889F, 0x4E9C, 0x88A0, 0x5516, - 0x88A1, 0x5A03, 0x88A2, 0x963F, 0x88A3, 0x54C0, 0x88A4, 0x611B, - 0x88A5, 0x6328, 0x88A6, 0x59F6, 0x88A7, 0x9022, 0x88A8, 0x8475, - 0x88A9, 0x831C, 0x88AA, 0x7A50, 0x88AB, 0x60AA, 0x88AC, 0x63E1, - 0x88AD, 0x6E25, 0x88AE, 0x65ED, 0x88AF, 0x8466, 0x88B0, 0x82A6, - 0x88B1, 0x9BF5, 0x88B2, 0x6893, 0x88B3, 0x5727, 0x88B4, 0x65A1, - 0x88B5, 0x6271, 0x88B6, 0x5B9B, 0x88B7, 0x59D0, 0x88B8, 0x867B, - 0x88B9, 0x98F4, 0x88BA, 0x7D62, 0x88BB, 0x7DBE, 0x88BC, 0x9B8E, - 0x88BD, 0x6216, 0x88BE, 0x7C9F, 0x88BF, 0x88B7, 0x88C0, 0x5B89, - 0x88C1, 0x5EB5, 0x88C2, 0x6309, 0x88C3, 0x6697, 0x88C4, 0x6848, - 0x88C5, 0x95C7, 0x88C6, 0x978D, 0x88C7, 0x674F, 0x88C8, 0x4EE5, - 0x88C9, 0x4F0A, 0x88CA, 0x4F4D, 0x88CB, 0x4F9D, 0x88CC, 0x5049, - 0x88CD, 0x56F2, 0x88CE, 0x5937, 0x88CF, 0x59D4, 0x88D0, 0x5A01, - 0x88D1, 0x5C09, 0x88D2, 0x60DF, 0x88D3, 0x610F, 0x88D4, 0x6170, - 0x88D5, 0x6613, 0x88D6, 0x6905, 0x88D7, 0x70BA, 0x88D8, 0x754F, - 0x88D9, 0x7570, 0x88DA, 0x79FB, 0x88DB, 0x7DAD, 0x88DC, 0x7DEF, - 0x88DD, 0x80C3, 0x88DE, 0x840E, 0x88DF, 0x8863, 0x88E0, 0x8B02, - 0x88E1, 0x9055, 0x88E2, 0x907A, 0x88E3, 0x533B, 0x88E4, 0x4E95, - 0x88E5, 0x4EA5, 0x88E6, 0x57DF, 0x88E7, 0x80B2, 0x88E8, 0x90C1, - 0x88E9, 0x78EF, 0x88EA, 0x4E00, 0x88EB, 0x58F1, 0x88EC, 0x6EA2, - 0x88ED, 0x9038, 0x88EE, 0x7A32, 0x88EF, 0x8328, 0x88F0, 0x828B, - 0x88F1, 0x9C2F, 0x88F2, 0x5141, 0x88F3, 0x5370, 0x88F4, 0x54BD, - 0x88F5, 0x54E1, 0x88F6, 0x56E0, 0x88F7, 0x59FB, 0x88F8, 0x5F15, - 0x88F9, 0x98F2, 0x88FA, 0x6DEB, 0x88FB, 0x80E4, 0x88FC, 0x852D, - 0x8940, 0x9662, 0x8941, 0x9670, 0x8942, 0x96A0, 0x8943, 0x97FB, - 0x8944, 0x540B, 0x8945, 0x53F3, 0x8946, 0x5B87, 0x8947, 0x70CF, - 0x8948, 0x7FBD, 0x8949, 0x8FC2, 0x894A, 0x96E8, 0x894B, 0x536F, - 0x894C, 0x9D5C, 0x894D, 0x7ABA, 0x894E, 0x4E11, 0x894F, 0x7893, - 0x8950, 0x81FC, 0x8951, 0x6E26, 0x8952, 0x5618, 0x8953, 0x5504, - 0x8954, 0x6B1D, 0x8955, 0x851A, 0x8956, 0x9C3B, 0x8957, 0x59E5, - 0x8958, 0x53A9, 0x8959, 0x6D66, 0x895A, 0x74DC, 0x895B, 0x958F, - 0x895C, 0x5642, 0x895D, 0x4E91, 0x895E, 0x904B, 0x895F, 0x96F2, - 0x8960, 0x834F, 0x8961, 0x990C, 0x8962, 0x53E1, 0x8963, 0x55B6, - 0x8964, 0x5B30, 0x8965, 0x5F71, 0x8966, 0x6620, 0x8967, 0x66F3, - 0x8968, 0x6804, 0x8969, 0x6C38, 0x896A, 0x6CF3, 0x896B, 0x6D29, - 0x896C, 0x745B, 0x896D, 0x76C8, 0x896E, 0x7A4E, 0x896F, 0x9834, - 0x8970, 0x82F1, 0x8971, 0x885B, 0x8972, 0x8A60, 0x8973, 0x92ED, - 0x8974, 0x6DB2, 0x8975, 0x75AB, 0x8976, 0x76CA, 0x8977, 0x99C5, - 0x8978, 0x60A6, 0x8979, 0x8B01, 0x897A, 0x8D8A, 0x897B, 0x95B2, - 0x897C, 0x698E, 0x897D, 0x53AD, 0x897E, 0x5186, 0x8980, 0x5712, - 0x8981, 0x5830, 0x8982, 0x5944, 0x8983, 0x5BB4, 0x8984, 0x5EF6, - 0x8985, 0x6028, 0x8986, 0x63A9, 0x8987, 0x63F4, 0x8988, 0x6CBF, - 0x8989, 0x6F14, 0x898A, 0x708E, 0x898B, 0x7114, 0x898C, 0x7159, - 0x898D, 0x71D5, 0x898E, 0x733F, 0x898F, 0x7E01, 0x8990, 0x8276, - 0x8991, 0x82D1, 0x8992, 0x8597, 0x8993, 0x9060, 0x8994, 0x925B, - 0x8995, 0x9D1B, 0x8996, 0x5869, 0x8997, 0x65BC, 0x8998, 0x6C5A, - 0x8999, 0x7525, 0x899A, 0x51F9, 0x899B, 0x592E, 0x899C, 0x5965, - 0x899D, 0x5F80, 0x899E, 0x5FDC, 0x899F, 0x62BC, 0x89A0, 0x65FA, - 0x89A1, 0x6A2A, 0x89A2, 0x6B27, 0x89A3, 0x6BB4, 0x89A4, 0x738B, - 0x89A5, 0x7FC1, 0x89A6, 0x8956, 0x89A7, 0x9D2C, 0x89A8, 0x9D0E, - 0x89A9, 0x9EC4, 0x89AA, 0x5CA1, 0x89AB, 0x6C96, 0x89AC, 0x837B, - 0x89AD, 0x5104, 0x89AE, 0x5C4B, 0x89AF, 0x61B6, 0x89B0, 0x81C6, - 0x89B1, 0x6876, 0x89B2, 0x7261, 0x89B3, 0x4E59, 0x89B4, 0x4FFA, - 0x89B5, 0x5378, 0x89B6, 0x6069, 0x89B7, 0x6E29, 0x89B8, 0x7A4F, - 0x89B9, 0x97F3, 0x89BA, 0x4E0B, 0x89BB, 0x5316, 0x89BC, 0x4EEE, - 0x89BD, 0x4F55, 0x89BE, 0x4F3D, 0x89BF, 0x4FA1, 0x89C0, 0x4F73, - 0x89C1, 0x52A0, 0x89C2, 0x53EF, 0x89C3, 0x5609, 0x89C4, 0x590F, - 0x89C5, 0x5AC1, 0x89C6, 0x5BB6, 0x89C7, 0x5BE1, 0x89C8, 0x79D1, - 0x89C9, 0x6687, 0x89CA, 0x679C, 0x89CB, 0x67B6, 0x89CC, 0x6B4C, - 0x89CD, 0x6CB3, 0x89CE, 0x706B, 0x89CF, 0x73C2, 0x89D0, 0x798D, - 0x89D1, 0x79BE, 0x89D2, 0x7A3C, 0x89D3, 0x7B87, 0x89D4, 0x82B1, - 0x89D5, 0x82DB, 0x89D6, 0x8304, 0x89D7, 0x8377, 0x89D8, 0x83EF, - 0x89D9, 0x83D3, 0x89DA, 0x8766, 0x89DB, 0x8AB2, 0x89DC, 0x5629, - 0x89DD, 0x8CA8, 0x89DE, 0x8FE6, 0x89DF, 0x904E, 0x89E0, 0x971E, - 0x89E1, 0x868A, 0x89E2, 0x4FC4, 0x89E3, 0x5CE8, 0x89E4, 0x6211, - 0x89E5, 0x7259, 0x89E6, 0x753B, 0x89E7, 0x81E5, 0x89E8, 0x82BD, - 0x89E9, 0x86FE, 0x89EA, 0x8CC0, 0x89EB, 0x96C5, 0x89EC, 0x9913, - 0x89ED, 0x99D5, 0x89EE, 0x4ECB, 0x89EF, 0x4F1A, 0x89F0, 0x89E3, - 0x89F1, 0x56DE, 0x89F2, 0x584A, 0x89F3, 0x58CA, 0x89F4, 0x5EFB, - 0x89F5, 0x5FEB, 0x89F6, 0x602A, 0x89F7, 0x6094, 0x89F8, 0x6062, - 0x89F9, 0x61D0, 0x89FA, 0x6212, 0x89FB, 0x62D0, 0x89FC, 0x6539, - 0x8A40, 0x9B41, 0x8A41, 0x6666, 0x8A42, 0x68B0, 0x8A43, 0x6D77, - 0x8A44, 0x7070, 0x8A45, 0x754C, 0x8A46, 0x7686, 0x8A47, 0x7D75, - 0x8A48, 0x82A5, 0x8A49, 0x87F9, 0x8A4A, 0x958B, 0x8A4B, 0x968E, - 0x8A4C, 0x8C9D, 0x8A4D, 0x51F1, 0x8A4E, 0x52BE, 0x8A4F, 0x5916, - 0x8A50, 0x54B3, 0x8A51, 0x5BB3, 0x8A52, 0x5D16, 0x8A53, 0x6168, - 0x8A54, 0x6982, 0x8A55, 0x6DAF, 0x8A56, 0x788D, 0x8A57, 0x84CB, - 0x8A58, 0x8857, 0x8A59, 0x8A72, 0x8A5A, 0x93A7, 0x8A5B, 0x9AB8, - 0x8A5C, 0x6D6C, 0x8A5D, 0x99A8, 0x8A5E, 0x86D9, 0x8A5F, 0x57A3, - 0x8A60, 0x67FF, 0x8A61, 0x86CE, 0x8A62, 0x920E, 0x8A63, 0x5283, - 0x8A64, 0x5687, 0x8A65, 0x5404, 0x8A66, 0x5ED3, 0x8A67, 0x62E1, - 0x8A68, 0x64B9, 0x8A69, 0x683C, 0x8A6A, 0x6838, 0x8A6B, 0x6BBB, - 0x8A6C, 0x7372, 0x8A6D, 0x78BA, 0x8A6E, 0x7A6B, 0x8A6F, 0x899A, - 0x8A70, 0x89D2, 0x8A71, 0x8D6B, 0x8A72, 0x8F03, 0x8A73, 0x90ED, - 0x8A74, 0x95A3, 0x8A75, 0x9694, 0x8A76, 0x9769, 0x8A77, 0x5B66, - 0x8A78, 0x5CB3, 0x8A79, 0x697D, 0x8A7A, 0x984D, 0x8A7B, 0x984E, - 0x8A7C, 0x639B, 0x8A7D, 0x7B20, 0x8A7E, 0x6A2B, 0x8A80, 0x6A7F, - 0x8A81, 0x68B6, 0x8A82, 0x9C0D, 0x8A83, 0x6F5F, 0x8A84, 0x5272, - 0x8A85, 0x559D, 0x8A86, 0x6070, 0x8A87, 0x62EC, 0x8A88, 0x6D3B, - 0x8A89, 0x6E07, 0x8A8A, 0x6ED1, 0x8A8B, 0x845B, 0x8A8C, 0x8910, - 0x8A8D, 0x8F44, 0x8A8E, 0x4E14, 0x8A8F, 0x9C39, 0x8A90, 0x53F6, - 0x8A91, 0x691B, 0x8A92, 0x6A3A, 0x8A93, 0x9784, 0x8A94, 0x682A, - 0x8A95, 0x515C, 0x8A96, 0x7AC3, 0x8A97, 0x84B2, 0x8A98, 0x91DC, - 0x8A99, 0x938C, 0x8A9A, 0x565B, 0x8A9B, 0x9D28, 0x8A9C, 0x6822, - 0x8A9D, 0x8305, 0x8A9E, 0x8431, 0x8A9F, 0x7CA5, 0x8AA0, 0x5208, - 0x8AA1, 0x82C5, 0x8AA2, 0x74E6, 0x8AA3, 0x4E7E, 0x8AA4, 0x4F83, - 0x8AA5, 0x51A0, 0x8AA6, 0x5BD2, 0x8AA7, 0x520A, 0x8AA8, 0x52D8, - 0x8AA9, 0x52E7, 0x8AAA, 0x5DFB, 0x8AAB, 0x559A, 0x8AAC, 0x582A, - 0x8AAD, 0x59E6, 0x8AAE, 0x5B8C, 0x8AAF, 0x5B98, 0x8AB0, 0x5BDB, - 0x8AB1, 0x5E72, 0x8AB2, 0x5E79, 0x8AB3, 0x60A3, 0x8AB4, 0x611F, - 0x8AB5, 0x6163, 0x8AB6, 0x61BE, 0x8AB7, 0x63DB, 0x8AB8, 0x6562, - 0x8AB9, 0x67D1, 0x8ABA, 0x6853, 0x8ABB, 0x68FA, 0x8ABC, 0x6B3E, - 0x8ABD, 0x6B53, 0x8ABE, 0x6C57, 0x8ABF, 0x6F22, 0x8AC0, 0x6F97, - 0x8AC1, 0x6F45, 0x8AC2, 0x74B0, 0x8AC3, 0x7518, 0x8AC4, 0x76E3, - 0x8AC5, 0x770B, 0x8AC6, 0x7AFF, 0x8AC7, 0x7BA1, 0x8AC8, 0x7C21, - 0x8AC9, 0x7DE9, 0x8ACA, 0x7F36, 0x8ACB, 0x7FF0, 0x8ACC, 0x809D, - 0x8ACD, 0x8266, 0x8ACE, 0x839E, 0x8ACF, 0x89B3, 0x8AD0, 0x8ACC, - 0x8AD1, 0x8CAB, 0x8AD2, 0x9084, 0x8AD3, 0x9451, 0x8AD4, 0x9593, - 0x8AD5, 0x9591, 0x8AD6, 0x95A2, 0x8AD7, 0x9665, 0x8AD8, 0x97D3, - 0x8AD9, 0x9928, 0x8ADA, 0x8218, 0x8ADB, 0x4E38, 0x8ADC, 0x542B, - 0x8ADD, 0x5CB8, 0x8ADE, 0x5DCC, 0x8ADF, 0x73A9, 0x8AE0, 0x764C, - 0x8AE1, 0x773C, 0x8AE2, 0x5CA9, 0x8AE3, 0x7FEB, 0x8AE4, 0x8D0B, - 0x8AE5, 0x96C1, 0x8AE6, 0x9811, 0x8AE7, 0x9854, 0x8AE8, 0x9858, - 0x8AE9, 0x4F01, 0x8AEA, 0x4F0E, 0x8AEB, 0x5371, 0x8AEC, 0x559C, - 0x8AED, 0x5668, 0x8AEE, 0x57FA, 0x8AEF, 0x5947, 0x8AF0, 0x5B09, - 0x8AF1, 0x5BC4, 0x8AF2, 0x5C90, 0x8AF3, 0x5E0C, 0x8AF4, 0x5E7E, - 0x8AF5, 0x5FCC, 0x8AF6, 0x63EE, 0x8AF7, 0x673A, 0x8AF8, 0x65D7, - 0x8AF9, 0x65E2, 0x8AFA, 0x671F, 0x8AFB, 0x68CB, 0x8AFC, 0x68C4, - 0x8B40, 0x6A5F, 0x8B41, 0x5E30, 0x8B42, 0x6BC5, 0x8B43, 0x6C17, - 0x8B44, 0x6C7D, 0x8B45, 0x757F, 0x8B46, 0x7948, 0x8B47, 0x5B63, - 0x8B48, 0x7A00, 0x8B49, 0x7D00, 0x8B4A, 0x5FBD, 0x8B4B, 0x898F, - 0x8B4C, 0x8A18, 0x8B4D, 0x8CB4, 0x8B4E, 0x8D77, 0x8B4F, 0x8ECC, - 0x8B50, 0x8F1D, 0x8B51, 0x98E2, 0x8B52, 0x9A0E, 0x8B53, 0x9B3C, - 0x8B54, 0x4E80, 0x8B55, 0x507D, 0x8B56, 0x5100, 0x8B57, 0x5993, - 0x8B58, 0x5B9C, 0x8B59, 0x622F, 0x8B5A, 0x6280, 0x8B5B, 0x64EC, - 0x8B5C, 0x6B3A, 0x8B5D, 0x72A0, 0x8B5E, 0x7591, 0x8B5F, 0x7947, - 0x8B60, 0x7FA9, 0x8B61, 0x87FB, 0x8B62, 0x8ABC, 0x8B63, 0x8B70, - 0x8B64, 0x63AC, 0x8B65, 0x83CA, 0x8B66, 0x97A0, 0x8B67, 0x5409, - 0x8B68, 0x5403, 0x8B69, 0x55AB, 0x8B6A, 0x6854, 0x8B6B, 0x6A58, - 0x8B6C, 0x8A70, 0x8B6D, 0x7827, 0x8B6E, 0x6775, 0x8B6F, 0x9ECD, - 0x8B70, 0x5374, 0x8B71, 0x5BA2, 0x8B72, 0x811A, 0x8B73, 0x8650, - 0x8B74, 0x9006, 0x8B75, 0x4E18, 0x8B76, 0x4E45, 0x8B77, 0x4EC7, - 0x8B78, 0x4F11, 0x8B79, 0x53CA, 0x8B7A, 0x5438, 0x8B7B, 0x5BAE, - 0x8B7C, 0x5F13, 0x8B7D, 0x6025, 0x8B7E, 0x6551, 0x8B80, 0x673D, - 0x8B81, 0x6C42, 0x8B82, 0x6C72, 0x8B83, 0x6CE3, 0x8B84, 0x7078, - 0x8B85, 0x7403, 0x8B86, 0x7A76, 0x8B87, 0x7AAE, 0x8B88, 0x7B08, - 0x8B89, 0x7D1A, 0x8B8A, 0x7CFE, 0x8B8B, 0x7D66, 0x8B8C, 0x65E7, - 0x8B8D, 0x725B, 0x8B8E, 0x53BB, 0x8B8F, 0x5C45, 0x8B90, 0x5DE8, - 0x8B91, 0x62D2, 0x8B92, 0x62E0, 0x8B93, 0x6319, 0x8B94, 0x6E20, - 0x8B95, 0x865A, 0x8B96, 0x8A31, 0x8B97, 0x8DDD, 0x8B98, 0x92F8, - 0x8B99, 0x6F01, 0x8B9A, 0x79A6, 0x8B9B, 0x9B5A, 0x8B9C, 0x4EA8, - 0x8B9D, 0x4EAB, 0x8B9E, 0x4EAC, 0x8B9F, 0x4F9B, 0x8BA0, 0x4FA0, - 0x8BA1, 0x50D1, 0x8BA2, 0x5147, 0x8BA3, 0x7AF6, 0x8BA4, 0x5171, - 0x8BA5, 0x51F6, 0x8BA6, 0x5354, 0x8BA7, 0x5321, 0x8BA8, 0x537F, - 0x8BA9, 0x53EB, 0x8BAA, 0x55AC, 0x8BAB, 0x5883, 0x8BAC, 0x5CE1, - 0x8BAD, 0x5F37, 0x8BAE, 0x5F4A, 0x8BAF, 0x602F, 0x8BB0, 0x6050, - 0x8BB1, 0x606D, 0x8BB2, 0x631F, 0x8BB3, 0x6559, 0x8BB4, 0x6A4B, - 0x8BB5, 0x6CC1, 0x8BB6, 0x72C2, 0x8BB7, 0x72ED, 0x8BB8, 0x77EF, - 0x8BB9, 0x80F8, 0x8BBA, 0x8105, 0x8BBB, 0x8208, 0x8BBC, 0x854E, - 0x8BBD, 0x90F7, 0x8BBE, 0x93E1, 0x8BBF, 0x97FF, 0x8BC0, 0x9957, - 0x8BC1, 0x9A5A, 0x8BC2, 0x4EF0, 0x8BC3, 0x51DD, 0x8BC4, 0x5C2D, - 0x8BC5, 0x6681, 0x8BC6, 0x696D, 0x8BC7, 0x5C40, 0x8BC8, 0x66F2, - 0x8BC9, 0x6975, 0x8BCA, 0x7389, 0x8BCB, 0x6850, 0x8BCC, 0x7C81, - 0x8BCD, 0x50C5, 0x8BCE, 0x52E4, 0x8BCF, 0x5747, 0x8BD0, 0x5DFE, - 0x8BD1, 0x9326, 0x8BD2, 0x65A4, 0x8BD3, 0x6B23, 0x8BD4, 0x6B3D, - 0x8BD5, 0x7434, 0x8BD6, 0x7981, 0x8BD7, 0x79BD, 0x8BD8, 0x7B4B, - 0x8BD9, 0x7DCA, 0x8BDA, 0x82B9, 0x8BDB, 0x83CC, 0x8BDC, 0x887F, - 0x8BDD, 0x895F, 0x8BDE, 0x8B39, 0x8BDF, 0x8FD1, 0x8BE0, 0x91D1, - 0x8BE1, 0x541F, 0x8BE2, 0x9280, 0x8BE3, 0x4E5D, 0x8BE4, 0x5036, - 0x8BE5, 0x53E5, 0x8BE6, 0x533A, 0x8BE7, 0x72D7, 0x8BE8, 0x7396, - 0x8BE9, 0x77E9, 0x8BEA, 0x82E6, 0x8BEB, 0x8EAF, 0x8BEC, 0x99C6, - 0x8BED, 0x99C8, 0x8BEE, 0x99D2, 0x8BEF, 0x5177, 0x8BF0, 0x611A, - 0x8BF1, 0x865E, 0x8BF2, 0x55B0, 0x8BF3, 0x7A7A, 0x8BF4, 0x5076, - 0x8BF5, 0x5BD3, 0x8BF6, 0x9047, 0x8BF7, 0x9685, 0x8BF8, 0x4E32, - 0x8BF9, 0x6ADB, 0x8BFA, 0x91E7, 0x8BFB, 0x5C51, 0x8BFC, 0x5C48, - 0x8C40, 0x6398, 0x8C41, 0x7A9F, 0x8C42, 0x6C93, 0x8C43, 0x9774, - 0x8C44, 0x8F61, 0x8C45, 0x7AAA, 0x8C46, 0x718A, 0x8C47, 0x9688, - 0x8C48, 0x7C82, 0x8C49, 0x6817, 0x8C4A, 0x7E70, 0x8C4B, 0x6851, - 0x8C4C, 0x936C, 0x8C4D, 0x52F2, 0x8C4E, 0x541B, 0x8C4F, 0x85AB, - 0x8C50, 0x8A13, 0x8C51, 0x7FA4, 0x8C52, 0x8ECD, 0x8C53, 0x90E1, - 0x8C54, 0x5366, 0x8C55, 0x8888, 0x8C56, 0x7941, 0x8C57, 0x4FC2, - 0x8C58, 0x50BE, 0x8C59, 0x5211, 0x8C5A, 0x5144, 0x8C5B, 0x5553, - 0x8C5C, 0x572D, 0x8C5D, 0x73EA, 0x8C5E, 0x578B, 0x8C5F, 0x5951, - 0x8C60, 0x5F62, 0x8C61, 0x5F84, 0x8C62, 0x6075, 0x8C63, 0x6176, - 0x8C64, 0x6167, 0x8C65, 0x61A9, 0x8C66, 0x63B2, 0x8C67, 0x643A, - 0x8C68, 0x656C, 0x8C69, 0x666F, 0x8C6A, 0x6842, 0x8C6B, 0x6E13, - 0x8C6C, 0x7566, 0x8C6D, 0x7A3D, 0x8C6E, 0x7CFB, 0x8C6F, 0x7D4C, - 0x8C70, 0x7D99, 0x8C71, 0x7E4B, 0x8C72, 0x7F6B, 0x8C73, 0x830E, - 0x8C74, 0x834A, 0x8C75, 0x86CD, 0x8C76, 0x8A08, 0x8C77, 0x8A63, - 0x8C78, 0x8B66, 0x8C79, 0x8EFD, 0x8C7A, 0x981A, 0x8C7B, 0x9D8F, - 0x8C7C, 0x82B8, 0x8C7D, 0x8FCE, 0x8C7E, 0x9BE8, 0x8C80, 0x5287, - 0x8C81, 0x621F, 0x8C82, 0x6483, 0x8C83, 0x6FC0, 0x8C84, 0x9699, - 0x8C85, 0x6841, 0x8C86, 0x5091, 0x8C87, 0x6B20, 0x8C88, 0x6C7A, - 0x8C89, 0x6F54, 0x8C8A, 0x7A74, 0x8C8B, 0x7D50, 0x8C8C, 0x8840, - 0x8C8D, 0x8A23, 0x8C8E, 0x6708, 0x8C8F, 0x4EF6, 0x8C90, 0x5039, - 0x8C91, 0x5026, 0x8C92, 0x5065, 0x8C93, 0x517C, 0x8C94, 0x5238, - 0x8C95, 0x5263, 0x8C96, 0x55A7, 0x8C97, 0x570F, 0x8C98, 0x5805, - 0x8C99, 0x5ACC, 0x8C9A, 0x5EFA, 0x8C9B, 0x61B2, 0x8C9C, 0x61F8, - 0x8C9D, 0x62F3, 0x8C9E, 0x6372, 0x8C9F, 0x691C, 0x8CA0, 0x6A29, - 0x8CA1, 0x727D, 0x8CA2, 0x72AC, 0x8CA3, 0x732E, 0x8CA4, 0x7814, - 0x8CA5, 0x786F, 0x8CA6, 0x7D79, 0x8CA7, 0x770C, 0x8CA8, 0x80A9, - 0x8CA9, 0x898B, 0x8CAA, 0x8B19, 0x8CAB, 0x8CE2, 0x8CAC, 0x8ED2, - 0x8CAD, 0x9063, 0x8CAE, 0x9375, 0x8CAF, 0x967A, 0x8CB0, 0x9855, - 0x8CB1, 0x9A13, 0x8CB2, 0x9E78, 0x8CB3, 0x5143, 0x8CB4, 0x539F, - 0x8CB5, 0x53B3, 0x8CB6, 0x5E7B, 0x8CB7, 0x5F26, 0x8CB8, 0x6E1B, - 0x8CB9, 0x6E90, 0x8CBA, 0x7384, 0x8CBB, 0x73FE, 0x8CBC, 0x7D43, - 0x8CBD, 0x8237, 0x8CBE, 0x8A00, 0x8CBF, 0x8AFA, 0x8CC0, 0x9650, - 0x8CC1, 0x4E4E, 0x8CC2, 0x500B, 0x8CC3, 0x53E4, 0x8CC4, 0x547C, - 0x8CC5, 0x56FA, 0x8CC6, 0x59D1, 0x8CC7, 0x5B64, 0x8CC8, 0x5DF1, - 0x8CC9, 0x5EAB, 0x8CCA, 0x5F27, 0x8CCB, 0x6238, 0x8CCC, 0x6545, - 0x8CCD, 0x67AF, 0x8CCE, 0x6E56, 0x8CCF, 0x72D0, 0x8CD0, 0x7CCA, - 0x8CD1, 0x88B4, 0x8CD2, 0x80A1, 0x8CD3, 0x80E1, 0x8CD4, 0x83F0, - 0x8CD5, 0x864E, 0x8CD6, 0x8A87, 0x8CD7, 0x8DE8, 0x8CD8, 0x9237, - 0x8CD9, 0x96C7, 0x8CDA, 0x9867, 0x8CDB, 0x9F13, 0x8CDC, 0x4E94, - 0x8CDD, 0x4E92, 0x8CDE, 0x4F0D, 0x8CDF, 0x5348, 0x8CE0, 0x5449, - 0x8CE1, 0x543E, 0x8CE2, 0x5A2F, 0x8CE3, 0x5F8C, 0x8CE4, 0x5FA1, - 0x8CE5, 0x609F, 0x8CE6, 0x68A7, 0x8CE7, 0x6A8E, 0x8CE8, 0x745A, - 0x8CE9, 0x7881, 0x8CEA, 0x8A9E, 0x8CEB, 0x8AA4, 0x8CEC, 0x8B77, - 0x8CED, 0x9190, 0x8CEE, 0x4E5E, 0x8CEF, 0x9BC9, 0x8CF0, 0x4EA4, - 0x8CF1, 0x4F7C, 0x8CF2, 0x4FAF, 0x8CF3, 0x5019, 0x8CF4, 0x5016, - 0x8CF5, 0x5149, 0x8CF6, 0x516C, 0x8CF7, 0x529F, 0x8CF8, 0x52B9, - 0x8CF9, 0x52FE, 0x8CFA, 0x539A, 0x8CFB, 0x53E3, 0x8CFC, 0x5411, - 0x8D40, 0x540E, 0x8D41, 0x5589, 0x8D42, 0x5751, 0x8D43, 0x57A2, - 0x8D44, 0x597D, 0x8D45, 0x5B54, 0x8D46, 0x5B5D, 0x8D47, 0x5B8F, - 0x8D48, 0x5DE5, 0x8D49, 0x5DE7, 0x8D4A, 0x5DF7, 0x8D4B, 0x5E78, - 0x8D4C, 0x5E83, 0x8D4D, 0x5E9A, 0x8D4E, 0x5EB7, 0x8D4F, 0x5F18, - 0x8D50, 0x6052, 0x8D51, 0x614C, 0x8D52, 0x6297, 0x8D53, 0x62D8, - 0x8D54, 0x63A7, 0x8D55, 0x653B, 0x8D56, 0x6602, 0x8D57, 0x6643, - 0x8D58, 0x66F4, 0x8D59, 0x676D, 0x8D5A, 0x6821, 0x8D5B, 0x6897, - 0x8D5C, 0x69CB, 0x8D5D, 0x6C5F, 0x8D5E, 0x6D2A, 0x8D5F, 0x6D69, - 0x8D60, 0x6E2F, 0x8D61, 0x6E9D, 0x8D62, 0x7532, 0x8D63, 0x7687, - 0x8D64, 0x786C, 0x8D65, 0x7A3F, 0x8D66, 0x7CE0, 0x8D67, 0x7D05, - 0x8D68, 0x7D18, 0x8D69, 0x7D5E, 0x8D6A, 0x7DB1, 0x8D6B, 0x8015, - 0x8D6C, 0x8003, 0x8D6D, 0x80AF, 0x8D6E, 0x80B1, 0x8D6F, 0x8154, - 0x8D70, 0x818F, 0x8D71, 0x822A, 0x8D72, 0x8352, 0x8D73, 0x884C, - 0x8D74, 0x8861, 0x8D75, 0x8B1B, 0x8D76, 0x8CA2, 0x8D77, 0x8CFC, - 0x8D78, 0x90CA, 0x8D79, 0x9175, 0x8D7A, 0x9271, 0x8D7B, 0x783F, - 0x8D7C, 0x92FC, 0x8D7D, 0x95A4, 0x8D7E, 0x964D, 0x8D80, 0x9805, - 0x8D81, 0x9999, 0x8D82, 0x9AD8, 0x8D83, 0x9D3B, 0x8D84, 0x525B, - 0x8D85, 0x52AB, 0x8D86, 0x53F7, 0x8D87, 0x5408, 0x8D88, 0x58D5, - 0x8D89, 0x62F7, 0x8D8A, 0x6FE0, 0x8D8B, 0x8C6A, 0x8D8C, 0x8F5F, - 0x8D8D, 0x9EB9, 0x8D8E, 0x514B, 0x8D8F, 0x523B, 0x8D90, 0x544A, - 0x8D91, 0x56FD, 0x8D92, 0x7A40, 0x8D93, 0x9177, 0x8D94, 0x9D60, - 0x8D95, 0x9ED2, 0x8D96, 0x7344, 0x8D97, 0x6F09, 0x8D98, 0x8170, - 0x8D99, 0x7511, 0x8D9A, 0x5FFD, 0x8D9B, 0x60DA, 0x8D9C, 0x9AA8, - 0x8D9D, 0x72DB, 0x8D9E, 0x8FBC, 0x8D9F, 0x6B64, 0x8DA0, 0x9803, - 0x8DA1, 0x4ECA, 0x8DA2, 0x56F0, 0x8DA3, 0x5764, 0x8DA4, 0x58BE, - 0x8DA5, 0x5A5A, 0x8DA6, 0x6068, 0x8DA7, 0x61C7, 0x8DA8, 0x660F, - 0x8DA9, 0x6606, 0x8DAA, 0x6839, 0x8DAB, 0x68B1, 0x8DAC, 0x6DF7, - 0x8DAD, 0x75D5, 0x8DAE, 0x7D3A, 0x8DAF, 0x826E, 0x8DB0, 0x9B42, - 0x8DB1, 0x4E9B, 0x8DB2, 0x4F50, 0x8DB3, 0x53C9, 0x8DB4, 0x5506, - 0x8DB5, 0x5D6F, 0x8DB6, 0x5DE6, 0x8DB7, 0x5DEE, 0x8DB8, 0x67FB, - 0x8DB9, 0x6C99, 0x8DBA, 0x7473, 0x8DBB, 0x7802, 0x8DBC, 0x8A50, - 0x8DBD, 0x9396, 0x8DBE, 0x88DF, 0x8DBF, 0x5750, 0x8DC0, 0x5EA7, - 0x8DC1, 0x632B, 0x8DC2, 0x50B5, 0x8DC3, 0x50AC, 0x8DC4, 0x518D, - 0x8DC5, 0x6700, 0x8DC6, 0x54C9, 0x8DC7, 0x585E, 0x8DC8, 0x59BB, - 0x8DC9, 0x5BB0, 0x8DCA, 0x5F69, 0x8DCB, 0x624D, 0x8DCC, 0x63A1, - 0x8DCD, 0x683D, 0x8DCE, 0x6B73, 0x8DCF, 0x6E08, 0x8DD0, 0x707D, - 0x8DD1, 0x91C7, 0x8DD2, 0x7280, 0x8DD3, 0x7815, 0x8DD4, 0x7826, - 0x8DD5, 0x796D, 0x8DD6, 0x658E, 0x8DD7, 0x7D30, 0x8DD8, 0x83DC, - 0x8DD9, 0x88C1, 0x8DDA, 0x8F09, 0x8DDB, 0x969B, 0x8DDC, 0x5264, - 0x8DDD, 0x5728, 0x8DDE, 0x6750, 0x8DDF, 0x7F6A, 0x8DE0, 0x8CA1, - 0x8DE1, 0x51B4, 0x8DE2, 0x5742, 0x8DE3, 0x962A, 0x8DE4, 0x583A, - 0x8DE5, 0x698A, 0x8DE6, 0x80B4, 0x8DE7, 0x54B2, 0x8DE8, 0x5D0E, - 0x8DE9, 0x57FC, 0x8DEA, 0x7895, 0x8DEB, 0x9DFA, 0x8DEC, 0x4F5C, - 0x8DED, 0x524A, 0x8DEE, 0x548B, 0x8DEF, 0x643E, 0x8DF0, 0x6628, - 0x8DF1, 0x6714, 0x8DF2, 0x67F5, 0x8DF3, 0x7A84, 0x8DF4, 0x7B56, - 0x8DF5, 0x7D22, 0x8DF6, 0x932F, 0x8DF7, 0x685C, 0x8DF8, 0x9BAD, - 0x8DF9, 0x7B39, 0x8DFA, 0x5319, 0x8DFB, 0x518A, 0x8DFC, 0x5237, - 0x8E40, 0x5BDF, 0x8E41, 0x62F6, 0x8E42, 0x64AE, 0x8E43, 0x64E6, - 0x8E44, 0x672D, 0x8E45, 0x6BBA, 0x8E46, 0x85A9, 0x8E47, 0x96D1, - 0x8E48, 0x7690, 0x8E49, 0x9BD6, 0x8E4A, 0x634C, 0x8E4B, 0x9306, - 0x8E4C, 0x9BAB, 0x8E4D, 0x76BF, 0x8E4E, 0x6652, 0x8E4F, 0x4E09, - 0x8E50, 0x5098, 0x8E51, 0x53C2, 0x8E52, 0x5C71, 0x8E53, 0x60E8, - 0x8E54, 0x6492, 0x8E55, 0x6563, 0x8E56, 0x685F, 0x8E57, 0x71E6, - 0x8E58, 0x73CA, 0x8E59, 0x7523, 0x8E5A, 0x7B97, 0x8E5B, 0x7E82, - 0x8E5C, 0x8695, 0x8E5D, 0x8B83, 0x8E5E, 0x8CDB, 0x8E5F, 0x9178, - 0x8E60, 0x9910, 0x8E61, 0x65AC, 0x8E62, 0x66AB, 0x8E63, 0x6B8B, - 0x8E64, 0x4ED5, 0x8E65, 0x4ED4, 0x8E66, 0x4F3A, 0x8E67, 0x4F7F, - 0x8E68, 0x523A, 0x8E69, 0x53F8, 0x8E6A, 0x53F2, 0x8E6B, 0x55E3, - 0x8E6C, 0x56DB, 0x8E6D, 0x58EB, 0x8E6E, 0x59CB, 0x8E6F, 0x59C9, - 0x8E70, 0x59FF, 0x8E71, 0x5B50, 0x8E72, 0x5C4D, 0x8E73, 0x5E02, - 0x8E74, 0x5E2B, 0x8E75, 0x5FD7, 0x8E76, 0x601D, 0x8E77, 0x6307, - 0x8E78, 0x652F, 0x8E79, 0x5B5C, 0x8E7A, 0x65AF, 0x8E7B, 0x65BD, - 0x8E7C, 0x65E8, 0x8E7D, 0x679D, 0x8E7E, 0x6B62, 0x8E80, 0x6B7B, - 0x8E81, 0x6C0F, 0x8E82, 0x7345, 0x8E83, 0x7949, 0x8E84, 0x79C1, - 0x8E85, 0x7CF8, 0x8E86, 0x7D19, 0x8E87, 0x7D2B, 0x8E88, 0x80A2, - 0x8E89, 0x8102, 0x8E8A, 0x81F3, 0x8E8B, 0x8996, 0x8E8C, 0x8A5E, - 0x8E8D, 0x8A69, 0x8E8E, 0x8A66, 0x8E8F, 0x8A8C, 0x8E90, 0x8AEE, - 0x8E91, 0x8CC7, 0x8E92, 0x8CDC, 0x8E93, 0x96CC, 0x8E94, 0x98FC, - 0x8E95, 0x6B6F, 0x8E96, 0x4E8B, 0x8E97, 0x4F3C, 0x8E98, 0x4F8D, - 0x8E99, 0x5150, 0x8E9A, 0x5B57, 0x8E9B, 0x5BFA, 0x8E9C, 0x6148, - 0x8E9D, 0x6301, 0x8E9E, 0x6642, 0x8E9F, 0x6B21, 0x8EA0, 0x6ECB, - 0x8EA1, 0x6CBB, 0x8EA2, 0x723E, 0x8EA3, 0x74BD, 0x8EA4, 0x75D4, - 0x8EA5, 0x78C1, 0x8EA6, 0x793A, 0x8EA7, 0x800C, 0x8EA8, 0x8033, - 0x8EA9, 0x81EA, 0x8EAA, 0x8494, 0x8EAB, 0x8F9E, 0x8EAC, 0x6C50, - 0x8EAD, 0x9E7F, 0x8EAE, 0x5F0F, 0x8EAF, 0x8B58, 0x8EB0, 0x9D2B, - 0x8EB1, 0x7AFA, 0x8EB2, 0x8EF8, 0x8EB3, 0x5B8D, 0x8EB4, 0x96EB, - 0x8EB5, 0x4E03, 0x8EB6, 0x53F1, 0x8EB7, 0x57F7, 0x8EB8, 0x5931, - 0x8EB9, 0x5AC9, 0x8EBA, 0x5BA4, 0x8EBB, 0x6089, 0x8EBC, 0x6E7F, - 0x8EBD, 0x6F06, 0x8EBE, 0x75BE, 0x8EBF, 0x8CEA, 0x8EC0, 0x5B9F, - 0x8EC1, 0x8500, 0x8EC2, 0x7BE0, 0x8EC3, 0x5072, 0x8EC4, 0x67F4, - 0x8EC5, 0x829D, 0x8EC6, 0x5C61, 0x8EC7, 0x854A, 0x8EC8, 0x7E1E, - 0x8EC9, 0x820E, 0x8ECA, 0x5199, 0x8ECB, 0x5C04, 0x8ECC, 0x6368, - 0x8ECD, 0x8D66, 0x8ECE, 0x659C, 0x8ECF, 0x716E, 0x8ED0, 0x793E, - 0x8ED1, 0x7D17, 0x8ED2, 0x8005, 0x8ED3, 0x8B1D, 0x8ED4, 0x8ECA, - 0x8ED5, 0x906E, 0x8ED6, 0x86C7, 0x8ED7, 0x90AA, 0x8ED8, 0x501F, - 0x8ED9, 0x52FA, 0x8EDA, 0x5C3A, 0x8EDB, 0x6753, 0x8EDC, 0x707C, - 0x8EDD, 0x7235, 0x8EDE, 0x914C, 0x8EDF, 0x91C8, 0x8EE0, 0x932B, - 0x8EE1, 0x82E5, 0x8EE2, 0x5BC2, 0x8EE3, 0x5F31, 0x8EE4, 0x60F9, - 0x8EE5, 0x4E3B, 0x8EE6, 0x53D6, 0x8EE7, 0x5B88, 0x8EE8, 0x624B, - 0x8EE9, 0x6731, 0x8EEA, 0x6B8A, 0x8EEB, 0x72E9, 0x8EEC, 0x73E0, - 0x8EED, 0x7A2E, 0x8EEE, 0x816B, 0x8EEF, 0x8DA3, 0x8EF0, 0x9152, - 0x8EF1, 0x9996, 0x8EF2, 0x5112, 0x8EF3, 0x53D7, 0x8EF4, 0x546A, - 0x8EF5, 0x5BFF, 0x8EF6, 0x6388, 0x8EF7, 0x6A39, 0x8EF8, 0x7DAC, - 0x8EF9, 0x9700, 0x8EFA, 0x56DA, 0x8EFB, 0x53CE, 0x8EFC, 0x5468, - 0x8F40, 0x5B97, 0x8F41, 0x5C31, 0x8F42, 0x5DDE, 0x8F43, 0x4FEE, - 0x8F44, 0x6101, 0x8F45, 0x62FE, 0x8F46, 0x6D32, 0x8F47, 0x79C0, - 0x8F48, 0x79CB, 0x8F49, 0x7D42, 0x8F4A, 0x7E4D, 0x8F4B, 0x7FD2, - 0x8F4C, 0x81ED, 0x8F4D, 0x821F, 0x8F4E, 0x8490, 0x8F4F, 0x8846, - 0x8F50, 0x8972, 0x8F51, 0x8B90, 0x8F52, 0x8E74, 0x8F53, 0x8F2F, - 0x8F54, 0x9031, 0x8F55, 0x914B, 0x8F56, 0x916C, 0x8F57, 0x96C6, - 0x8F58, 0x919C, 0x8F59, 0x4EC0, 0x8F5A, 0x4F4F, 0x8F5B, 0x5145, - 0x8F5C, 0x5341, 0x8F5D, 0x5F93, 0x8F5E, 0x620E, 0x8F5F, 0x67D4, - 0x8F60, 0x6C41, 0x8F61, 0x6E0B, 0x8F62, 0x7363, 0x8F63, 0x7E26, - 0x8F64, 0x91CD, 0x8F65, 0x9283, 0x8F66, 0x53D4, 0x8F67, 0x5919, - 0x8F68, 0x5BBF, 0x8F69, 0x6DD1, 0x8F6A, 0x795D, 0x8F6B, 0x7E2E, - 0x8F6C, 0x7C9B, 0x8F6D, 0x587E, 0x8F6E, 0x719F, 0x8F6F, 0x51FA, - 0x8F70, 0x8853, 0x8F71, 0x8FF0, 0x8F72, 0x4FCA, 0x8F73, 0x5CFB, - 0x8F74, 0x6625, 0x8F75, 0x77AC, 0x8F76, 0x7AE3, 0x8F77, 0x821C, - 0x8F78, 0x99FF, 0x8F79, 0x51C6, 0x8F7A, 0x5FAA, 0x8F7B, 0x65EC, - 0x8F7C, 0x696F, 0x8F7D, 0x6B89, 0x8F7E, 0x6DF3, 0x8F80, 0x6E96, - 0x8F81, 0x6F64, 0x8F82, 0x76FE, 0x8F83, 0x7D14, 0x8F84, 0x5DE1, - 0x8F85, 0x9075, 0x8F86, 0x9187, 0x8F87, 0x9806, 0x8F88, 0x51E6, - 0x8F89, 0x521D, 0x8F8A, 0x6240, 0x8F8B, 0x6691, 0x8F8C, 0x66D9, - 0x8F8D, 0x6E1A, 0x8F8E, 0x5EB6, 0x8F8F, 0x7DD2, 0x8F90, 0x7F72, - 0x8F91, 0x66F8, 0x8F92, 0x85AF, 0x8F93, 0x85F7, 0x8F94, 0x8AF8, - 0x8F95, 0x52A9, 0x8F96, 0x53D9, 0x8F97, 0x5973, 0x8F98, 0x5E8F, - 0x8F99, 0x5F90, 0x8F9A, 0x6055, 0x8F9B, 0x92E4, 0x8F9C, 0x9664, - 0x8F9D, 0x50B7, 0x8F9E, 0x511F, 0x8F9F, 0x52DD, 0x8FA0, 0x5320, - 0x8FA1, 0x5347, 0x8FA2, 0x53EC, 0x8FA3, 0x54E8, 0x8FA4, 0x5546, - 0x8FA5, 0x5531, 0x8FA6, 0x5617, 0x8FA7, 0x5968, 0x8FA8, 0x59BE, - 0x8FA9, 0x5A3C, 0x8FAA, 0x5BB5, 0x8FAB, 0x5C06, 0x8FAC, 0x5C0F, - 0x8FAD, 0x5C11, 0x8FAE, 0x5C1A, 0x8FAF, 0x5E84, 0x8FB0, 0x5E8A, - 0x8FB1, 0x5EE0, 0x8FB2, 0x5F70, 0x8FB3, 0x627F, 0x8FB4, 0x6284, - 0x8FB5, 0x62DB, 0x8FB6, 0x638C, 0x8FB7, 0x6377, 0x8FB8, 0x6607, - 0x8FB9, 0x660C, 0x8FBA, 0x662D, 0x8FBB, 0x6676, 0x8FBC, 0x677E, - 0x8FBD, 0x68A2, 0x8FBE, 0x6A1F, 0x8FBF, 0x6A35, 0x8FC0, 0x6CBC, - 0x8FC1, 0x6D88, 0x8FC2, 0x6E09, 0x8FC3, 0x6E58, 0x8FC4, 0x713C, - 0x8FC5, 0x7126, 0x8FC6, 0x7167, 0x8FC7, 0x75C7, 0x8FC8, 0x7701, - 0x8FC9, 0x785D, 0x8FCA, 0x7901, 0x8FCB, 0x7965, 0x8FCC, 0x79F0, - 0x8FCD, 0x7AE0, 0x8FCE, 0x7B11, 0x8FCF, 0x7CA7, 0x8FD0, 0x7D39, - 0x8FD1, 0x8096, 0x8FD2, 0x83D6, 0x8FD3, 0x848B, 0x8FD4, 0x8549, - 0x8FD5, 0x885D, 0x8FD6, 0x88F3, 0x8FD7, 0x8A1F, 0x8FD8, 0x8A3C, - 0x8FD9, 0x8A54, 0x8FDA, 0x8A73, 0x8FDB, 0x8C61, 0x8FDC, 0x8CDE, - 0x8FDD, 0x91A4, 0x8FDE, 0x9266, 0x8FDF, 0x937E, 0x8FE0, 0x9418, - 0x8FE1, 0x969C, 0x8FE2, 0x9798, 0x8FE3, 0x4E0A, 0x8FE4, 0x4E08, - 0x8FE5, 0x4E1E, 0x8FE6, 0x4E57, 0x8FE7, 0x5197, 0x8FE8, 0x5270, - 0x8FE9, 0x57CE, 0x8FEA, 0x5834, 0x8FEB, 0x58CC, 0x8FEC, 0x5B22, - 0x8FED, 0x5E38, 0x8FEE, 0x60C5, 0x8FEF, 0x64FE, 0x8FF0, 0x6761, - 0x8FF1, 0x6756, 0x8FF2, 0x6D44, 0x8FF3, 0x72B6, 0x8FF4, 0x7573, - 0x8FF5, 0x7A63, 0x8FF6, 0x84B8, 0x8FF7, 0x8B72, 0x8FF8, 0x91B8, - 0x8FF9, 0x9320, 0x8FFA, 0x5631, 0x8FFB, 0x57F4, 0x8FFC, 0x98FE, - 0x9040, 0x62ED, 0x9041, 0x690D, 0x9042, 0x6B96, 0x9043, 0x71ED, - 0x9044, 0x7E54, 0x9045, 0x8077, 0x9046, 0x8272, 0x9047, 0x89E6, - 0x9048, 0x98DF, 0x9049, 0x8755, 0x904A, 0x8FB1, 0x904B, 0x5C3B, - 0x904C, 0x4F38, 0x904D, 0x4FE1, 0x904E, 0x4FB5, 0x904F, 0x5507, - 0x9050, 0x5A20, 0x9051, 0x5BDD, 0x9052, 0x5BE9, 0x9053, 0x5FC3, - 0x9054, 0x614E, 0x9055, 0x632F, 0x9056, 0x65B0, 0x9057, 0x664B, - 0x9058, 0x68EE, 0x9059, 0x699B, 0x905A, 0x6D78, 0x905B, 0x6DF1, - 0x905C, 0x7533, 0x905D, 0x75B9, 0x905E, 0x771F, 0x905F, 0x795E, - 0x9060, 0x79E6, 0x9061, 0x7D33, 0x9062, 0x81E3, 0x9063, 0x82AF, - 0x9064, 0x85AA, 0x9065, 0x89AA, 0x9066, 0x8A3A, 0x9067, 0x8EAB, - 0x9068, 0x8F9B, 0x9069, 0x9032, 0x906A, 0x91DD, 0x906B, 0x9707, - 0x906C, 0x4EBA, 0x906D, 0x4EC1, 0x906E, 0x5203, 0x906F, 0x5875, - 0x9070, 0x58EC, 0x9071, 0x5C0B, 0x9072, 0x751A, 0x9073, 0x5C3D, - 0x9074, 0x814E, 0x9075, 0x8A0A, 0x9076, 0x8FC5, 0x9077, 0x9663, - 0x9078, 0x976D, 0x9079, 0x7B25, 0x907A, 0x8ACF, 0x907B, 0x9808, - 0x907C, 0x9162, 0x907D, 0x56F3, 0x907E, 0x53A8, 0x9080, 0x9017, - 0x9081, 0x5439, 0x9082, 0x5782, 0x9083, 0x5E25, 0x9084, 0x63A8, - 0x9085, 0x6C34, 0x9086, 0x708A, 0x9087, 0x7761, 0x9088, 0x7C8B, - 0x9089, 0x7FE0, 0x908A, 0x8870, 0x908B, 0x9042, 0x908C, 0x9154, - 0x908D, 0x9310, 0x908E, 0x9318, 0x908F, 0x968F, 0x9090, 0x745E, - 0x9091, 0x9AC4, 0x9092, 0x5D07, 0x9093, 0x5D69, 0x9094, 0x6570, - 0x9095, 0x67A2, 0x9096, 0x8DA8, 0x9097, 0x96DB, 0x9098, 0x636E, - 0x9099, 0x6749, 0x909A, 0x6919, 0x909B, 0x83C5, 0x909C, 0x9817, - 0x909D, 0x96C0, 0x909E, 0x88FE, 0x909F, 0x6F84, 0x90A0, 0x647A, - 0x90A1, 0x5BF8, 0x90A2, 0x4E16, 0x90A3, 0x702C, 0x90A4, 0x755D, - 0x90A5, 0x662F, 0x90A6, 0x51C4, 0x90A7, 0x5236, 0x90A8, 0x52E2, - 0x90A9, 0x59D3, 0x90AA, 0x5F81, 0x90AB, 0x6027, 0x90AC, 0x6210, - 0x90AD, 0x653F, 0x90AE, 0x6574, 0x90AF, 0x661F, 0x90B0, 0x6674, - 0x90B1, 0x68F2, 0x90B2, 0x6816, 0x90B3, 0x6B63, 0x90B4, 0x6E05, - 0x90B5, 0x7272, 0x90B6, 0x751F, 0x90B7, 0x76DB, 0x90B8, 0x7CBE, - 0x90B9, 0x8056, 0x90BA, 0x58F0, 0x90BB, 0x88FD, 0x90BC, 0x897F, - 0x90BD, 0x8AA0, 0x90BE, 0x8A93, 0x90BF, 0x8ACB, 0x90C0, 0x901D, - 0x90C1, 0x9192, 0x90C2, 0x9752, 0x90C3, 0x9759, 0x90C4, 0x6589, - 0x90C5, 0x7A0E, 0x90C6, 0x8106, 0x90C7, 0x96BB, 0x90C8, 0x5E2D, - 0x90C9, 0x60DC, 0x90CA, 0x621A, 0x90CB, 0x65A5, 0x90CC, 0x6614, - 0x90CD, 0x6790, 0x90CE, 0x77F3, 0x90CF, 0x7A4D, 0x90D0, 0x7C4D, - 0x90D1, 0x7E3E, 0x90D2, 0x810A, 0x90D3, 0x8CAC, 0x90D4, 0x8D64, - 0x90D5, 0x8DE1, 0x90D6, 0x8E5F, 0x90D7, 0x78A9, 0x90D8, 0x5207, - 0x90D9, 0x62D9, 0x90DA, 0x63A5, 0x90DB, 0x6442, 0x90DC, 0x6298, - 0x90DD, 0x8A2D, 0x90DE, 0x7A83, 0x90DF, 0x7BC0, 0x90E0, 0x8AAC, - 0x90E1, 0x96EA, 0x90E2, 0x7D76, 0x90E3, 0x820C, 0x90E4, 0x8749, - 0x90E5, 0x4ED9, 0x90E6, 0x5148, 0x90E7, 0x5343, 0x90E8, 0x5360, - 0x90E9, 0x5BA3, 0x90EA, 0x5C02, 0x90EB, 0x5C16, 0x90EC, 0x5DDD, - 0x90ED, 0x6226, 0x90EE, 0x6247, 0x90EF, 0x64B0, 0x90F0, 0x6813, - 0x90F1, 0x6834, 0x90F2, 0x6CC9, 0x90F3, 0x6D45, 0x90F4, 0x6D17, - 0x90F5, 0x67D3, 0x90F6, 0x6F5C, 0x90F7, 0x714E, 0x90F8, 0x717D, - 0x90F9, 0x65CB, 0x90FA, 0x7A7F, 0x90FB, 0x7BAD, 0x90FC, 0x7DDA, - 0x9140, 0x7E4A, 0x9141, 0x7FA8, 0x9142, 0x817A, 0x9143, 0x821B, - 0x9144, 0x8239, 0x9145, 0x85A6, 0x9146, 0x8A6E, 0x9147, 0x8CCE, - 0x9148, 0x8DF5, 0x9149, 0x9078, 0x914A, 0x9077, 0x914B, 0x92AD, - 0x914C, 0x9291, 0x914D, 0x9583, 0x914E, 0x9BAE, 0x914F, 0x524D, - 0x9150, 0x5584, 0x9151, 0x6F38, 0x9152, 0x7136, 0x9153, 0x5168, - 0x9154, 0x7985, 0x9155, 0x7E55, 0x9156, 0x81B3, 0x9157, 0x7CCE, - 0x9158, 0x564C, 0x9159, 0x5851, 0x915A, 0x5CA8, 0x915B, 0x63AA, - 0x915C, 0x66FE, 0x915D, 0x66FD, 0x915E, 0x695A, 0x915F, 0x72D9, - 0x9160, 0x758F, 0x9161, 0x758E, 0x9162, 0x790E, 0x9163, 0x7956, - 0x9164, 0x79DF, 0x9165, 0x7C97, 0x9166, 0x7D20, 0x9167, 0x7D44, - 0x9168, 0x8607, 0x9169, 0x8A34, 0x916A, 0x963B, 0x916B, 0x9061, - 0x916C, 0x9F20, 0x916D, 0x50E7, 0x916E, 0x5275, 0x916F, 0x53CC, - 0x9170, 0x53E2, 0x9171, 0x5009, 0x9172, 0x55AA, 0x9173, 0x58EE, - 0x9174, 0x594F, 0x9175, 0x723D, 0x9176, 0x5B8B, 0x9177, 0x5C64, - 0x9178, 0x531D, 0x9179, 0x60E3, 0x917A, 0x60F3, 0x917B, 0x635C, - 0x917C, 0x6383, 0x917D, 0x633F, 0x917E, 0x63BB, 0x9180, 0x64CD, - 0x9181, 0x65E9, 0x9182, 0x66F9, 0x9183, 0x5DE3, 0x9184, 0x69CD, - 0x9185, 0x69FD, 0x9186, 0x6F15, 0x9187, 0x71E5, 0x9188, 0x4E89, - 0x9189, 0x75E9, 0x918A, 0x76F8, 0x918B, 0x7A93, 0x918C, 0x7CDF, - 0x918D, 0x7DCF, 0x918E, 0x7D9C, 0x918F, 0x8061, 0x9190, 0x8349, - 0x9191, 0x8358, 0x9192, 0x846C, 0x9193, 0x84BC, 0x9194, 0x85FB, - 0x9195, 0x88C5, 0x9196, 0x8D70, 0x9197, 0x9001, 0x9198, 0x906D, - 0x9199, 0x9397, 0x919A, 0x971C, 0x919B, 0x9A12, 0x919C, 0x50CF, - 0x919D, 0x5897, 0x919E, 0x618E, 0x919F, 0x81D3, 0x91A0, 0x8535, - 0x91A1, 0x8D08, 0x91A2, 0x9020, 0x91A3, 0x4FC3, 0x91A4, 0x5074, - 0x91A5, 0x5247, 0x91A6, 0x5373, 0x91A7, 0x606F, 0x91A8, 0x6349, - 0x91A9, 0x675F, 0x91AA, 0x6E2C, 0x91AB, 0x8DB3, 0x91AC, 0x901F, - 0x91AD, 0x4FD7, 0x91AE, 0x5C5E, 0x91AF, 0x8CCA, 0x91B0, 0x65CF, - 0x91B1, 0x7D9A, 0x91B2, 0x5352, 0x91B3, 0x8896, 0x91B4, 0x5176, - 0x91B5, 0x63C3, 0x91B6, 0x5B58, 0x91B7, 0x5B6B, 0x91B8, 0x5C0A, - 0x91B9, 0x640D, 0x91BA, 0x6751, 0x91BB, 0x905C, 0x91BC, 0x4ED6, - 0x91BD, 0x591A, 0x91BE, 0x592A, 0x91BF, 0x6C70, 0x91C0, 0x8A51, - 0x91C1, 0x553E, 0x91C2, 0x5815, 0x91C3, 0x59A5, 0x91C4, 0x60F0, - 0x91C5, 0x6253, 0x91C6, 0x67C1, 0x91C7, 0x8235, 0x91C8, 0x6955, - 0x91C9, 0x9640, 0x91CA, 0x99C4, 0x91CB, 0x9A28, 0x91CC, 0x4F53, - 0x91CD, 0x5806, 0x91CE, 0x5BFE, 0x91CF, 0x8010, 0x91D0, 0x5CB1, - 0x91D1, 0x5E2F, 0x91D2, 0x5F85, 0x91D3, 0x6020, 0x91D4, 0x614B, - 0x91D5, 0x6234, 0x91D6, 0x66FF, 0x91D7, 0x6CF0, 0x91D8, 0x6EDE, - 0x91D9, 0x80CE, 0x91DA, 0x817F, 0x91DB, 0x82D4, 0x91DC, 0x888B, - 0x91DD, 0x8CB8, 0x91DE, 0x9000, 0x91DF, 0x902E, 0x91E0, 0x968A, - 0x91E1, 0x9EDB, 0x91E2, 0x9BDB, 0x91E3, 0x4EE3, 0x91E4, 0x53F0, - 0x91E5, 0x5927, 0x91E6, 0x7B2C, 0x91E7, 0x918D, 0x91E8, 0x984C, - 0x91E9, 0x9DF9, 0x91EA, 0x6EDD, 0x91EB, 0x7027, 0x91EC, 0x5353, - 0x91ED, 0x5544, 0x91EE, 0x5B85, 0x91EF, 0x6258, 0x91F0, 0x629E, - 0x91F1, 0x62D3, 0x91F2, 0x6CA2, 0x91F3, 0x6FEF, 0x91F4, 0x7422, - 0x91F5, 0x8A17, 0x91F6, 0x9438, 0x91F7, 0x6FC1, 0x91F8, 0x8AFE, - 0x91F9, 0x8338, 0x91FA, 0x51E7, 0x91FB, 0x86F8, 0x91FC, 0x53EA, - 0x9240, 0x53E9, 0x9241, 0x4F46, 0x9242, 0x9054, 0x9243, 0x8FB0, - 0x9244, 0x596A, 0x9245, 0x8131, 0x9246, 0x5DFD, 0x9247, 0x7AEA, - 0x9248, 0x8FBF, 0x9249, 0x68DA, 0x924A, 0x8C37, 0x924B, 0x72F8, - 0x924C, 0x9C48, 0x924D, 0x6A3D, 0x924E, 0x8AB0, 0x924F, 0x4E39, - 0x9250, 0x5358, 0x9251, 0x5606, 0x9252, 0x5766, 0x9253, 0x62C5, - 0x9254, 0x63A2, 0x9255, 0x65E6, 0x9256, 0x6B4E, 0x9257, 0x6DE1, - 0x9258, 0x6E5B, 0x9259, 0x70AD, 0x925A, 0x77ED, 0x925B, 0x7AEF, - 0x925C, 0x7BAA, 0x925D, 0x7DBB, 0x925E, 0x803D, 0x925F, 0x80C6, - 0x9260, 0x86CB, 0x9261, 0x8A95, 0x9262, 0x935B, 0x9263, 0x56E3, - 0x9264, 0x58C7, 0x9265, 0x5F3E, 0x9266, 0x65AD, 0x9267, 0x6696, - 0x9268, 0x6A80, 0x9269, 0x6BB5, 0x926A, 0x7537, 0x926B, 0x8AC7, - 0x926C, 0x5024, 0x926D, 0x77E5, 0x926E, 0x5730, 0x926F, 0x5F1B, - 0x9270, 0x6065, 0x9271, 0x667A, 0x9272, 0x6C60, 0x9273, 0x75F4, - 0x9274, 0x7A1A, 0x9275, 0x7F6E, 0x9276, 0x81F4, 0x9277, 0x8718, - 0x9278, 0x9045, 0x9279, 0x99B3, 0x927A, 0x7BC9, 0x927B, 0x755C, - 0x927C, 0x7AF9, 0x927D, 0x7B51, 0x927E, 0x84C4, 0x9280, 0x9010, - 0x9281, 0x79E9, 0x9282, 0x7A92, 0x9283, 0x8336, 0x9284, 0x5AE1, - 0x9285, 0x7740, 0x9286, 0x4E2D, 0x9287, 0x4EF2, 0x9288, 0x5B99, - 0x9289, 0x5FE0, 0x928A, 0x62BD, 0x928B, 0x663C, 0x928C, 0x67F1, - 0x928D, 0x6CE8, 0x928E, 0x866B, 0x928F, 0x8877, 0x9290, 0x8A3B, - 0x9291, 0x914E, 0x9292, 0x92F3, 0x9293, 0x99D0, 0x9294, 0x6A17, - 0x9295, 0x7026, 0x9296, 0x732A, 0x9297, 0x82E7, 0x9298, 0x8457, - 0x9299, 0x8CAF, 0x929A, 0x4E01, 0x929B, 0x5146, 0x929C, 0x51CB, - 0x929D, 0x558B, 0x929E, 0x5BF5, 0x929F, 0x5E16, 0x92A0, 0x5E33, - 0x92A1, 0x5E81, 0x92A2, 0x5F14, 0x92A3, 0x5F35, 0x92A4, 0x5F6B, - 0x92A5, 0x5FB4, 0x92A6, 0x61F2, 0x92A7, 0x6311, 0x92A8, 0x66A2, - 0x92A9, 0x671D, 0x92AA, 0x6F6E, 0x92AB, 0x7252, 0x92AC, 0x753A, - 0x92AD, 0x773A, 0x92AE, 0x8074, 0x92AF, 0x8139, 0x92B0, 0x8178, - 0x92B1, 0x8776, 0x92B2, 0x8ABF, 0x92B3, 0x8ADC, 0x92B4, 0x8D85, - 0x92B5, 0x8DF3, 0x92B6, 0x929A, 0x92B7, 0x9577, 0x92B8, 0x9802, - 0x92B9, 0x9CE5, 0x92BA, 0x52C5, 0x92BB, 0x6357, 0x92BC, 0x76F4, - 0x92BD, 0x6715, 0x92BE, 0x6C88, 0x92BF, 0x73CD, 0x92C0, 0x8CC3, - 0x92C1, 0x93AE, 0x92C2, 0x9673, 0x92C3, 0x6D25, 0x92C4, 0x589C, - 0x92C5, 0x690E, 0x92C6, 0x69CC, 0x92C7, 0x8FFD, 0x92C8, 0x939A, - 0x92C9, 0x75DB, 0x92CA, 0x901A, 0x92CB, 0x585A, 0x92CC, 0x6802, - 0x92CD, 0x63B4, 0x92CE, 0x69FB, 0x92CF, 0x4F43, 0x92D0, 0x6F2C, - 0x92D1, 0x67D8, 0x92D2, 0x8FBB, 0x92D3, 0x8526, 0x92D4, 0x7DB4, - 0x92D5, 0x9354, 0x92D6, 0x693F, 0x92D7, 0x6F70, 0x92D8, 0x576A, - 0x92D9, 0x58F7, 0x92DA, 0x5B2C, 0x92DB, 0x7D2C, 0x92DC, 0x722A, - 0x92DD, 0x540A, 0x92DE, 0x91E3, 0x92DF, 0x9DB4, 0x92E0, 0x4EAD, - 0x92E1, 0x4F4E, 0x92E2, 0x505C, 0x92E3, 0x5075, 0x92E4, 0x5243, - 0x92E5, 0x8C9E, 0x92E6, 0x5448, 0x92E7, 0x5824, 0x92E8, 0x5B9A, - 0x92E9, 0x5E1D, 0x92EA, 0x5E95, 0x92EB, 0x5EAD, 0x92EC, 0x5EF7, - 0x92ED, 0x5F1F, 0x92EE, 0x608C, 0x92EF, 0x62B5, 0x92F0, 0x633A, - 0x92F1, 0x63D0, 0x92F2, 0x68AF, 0x92F3, 0x6C40, 0x92F4, 0x7887, - 0x92F5, 0x798E, 0x92F6, 0x7A0B, 0x92F7, 0x7DE0, 0x92F8, 0x8247, - 0x92F9, 0x8A02, 0x92FA, 0x8AE6, 0x92FB, 0x8E44, 0x92FC, 0x9013, - 0x9340, 0x90B8, 0x9341, 0x912D, 0x9342, 0x91D8, 0x9343, 0x9F0E, - 0x9344, 0x6CE5, 0x9345, 0x6458, 0x9346, 0x64E2, 0x9347, 0x6575, - 0x9348, 0x6EF4, 0x9349, 0x7684, 0x934A, 0x7B1B, 0x934B, 0x9069, - 0x934C, 0x93D1, 0x934D, 0x6EBA, 0x934E, 0x54F2, 0x934F, 0x5FB9, - 0x9350, 0x64A4, 0x9351, 0x8F4D, 0x9352, 0x8FED, 0x9353, 0x9244, - 0x9354, 0x5178, 0x9355, 0x586B, 0x9356, 0x5929, 0x9357, 0x5C55, - 0x9358, 0x5E97, 0x9359, 0x6DFB, 0x935A, 0x7E8F, 0x935B, 0x751C, - 0x935C, 0x8CBC, 0x935D, 0x8EE2, 0x935E, 0x985B, 0x935F, 0x70B9, - 0x9360, 0x4F1D, 0x9361, 0x6BBF, 0x9362, 0x6FB1, 0x9363, 0x7530, - 0x9364, 0x96FB, 0x9365, 0x514E, 0x9366, 0x5410, 0x9367, 0x5835, - 0x9368, 0x5857, 0x9369, 0x59AC, 0x936A, 0x5C60, 0x936B, 0x5F92, - 0x936C, 0x6597, 0x936D, 0x675C, 0x936E, 0x6E21, 0x936F, 0x767B, - 0x9370, 0x83DF, 0x9371, 0x8CED, 0x9372, 0x9014, 0x9373, 0x90FD, - 0x9374, 0x934D, 0x9375, 0x7825, 0x9376, 0x783A, 0x9377, 0x52AA, - 0x9378, 0x5EA6, 0x9379, 0x571F, 0x937A, 0x5974, 0x937B, 0x6012, - 0x937C, 0x5012, 0x937D, 0x515A, 0x937E, 0x51AC, 0x9380, 0x51CD, - 0x9381, 0x5200, 0x9382, 0x5510, 0x9383, 0x5854, 0x9384, 0x5858, - 0x9385, 0x5957, 0x9386, 0x5B95, 0x9387, 0x5CF6, 0x9388, 0x5D8B, - 0x9389, 0x60BC, 0x938A, 0x6295, 0x938B, 0x642D, 0x938C, 0x6771, - 0x938D, 0x6843, 0x938E, 0x68BC, 0x938F, 0x68DF, 0x9390, 0x76D7, - 0x9391, 0x6DD8, 0x9392, 0x6E6F, 0x9393, 0x6D9B, 0x9394, 0x706F, - 0x9395, 0x71C8, 0x9396, 0x5F53, 0x9397, 0x75D8, 0x9398, 0x7977, - 0x9399, 0x7B49, 0x939A, 0x7B54, 0x939B, 0x7B52, 0x939C, 0x7CD6, - 0x939D, 0x7D71, 0x939E, 0x5230, 0x939F, 0x8463, 0x93A0, 0x8569, - 0x93A1, 0x85E4, 0x93A2, 0x8A0E, 0x93A3, 0x8B04, 0x93A4, 0x8C46, - 0x93A5, 0x8E0F, 0x93A6, 0x9003, 0x93A7, 0x900F, 0x93A8, 0x9419, - 0x93A9, 0x9676, 0x93AA, 0x982D, 0x93AB, 0x9A30, 0x93AC, 0x95D8, - 0x93AD, 0x50CD, 0x93AE, 0x52D5, 0x93AF, 0x540C, 0x93B0, 0x5802, - 0x93B1, 0x5C0E, 0x93B2, 0x61A7, 0x93B3, 0x649E, 0x93B4, 0x6D1E, - 0x93B5, 0x77B3, 0x93B6, 0x7AE5, 0x93B7, 0x80F4, 0x93B8, 0x8404, - 0x93B9, 0x9053, 0x93BA, 0x9285, 0x93BB, 0x5CE0, 0x93BC, 0x9D07, - 0x93BD, 0x533F, 0x93BE, 0x5F97, 0x93BF, 0x5FB3, 0x93C0, 0x6D9C, - 0x93C1, 0x7279, 0x93C2, 0x7763, 0x93C3, 0x79BF, 0x93C4, 0x7BE4, - 0x93C5, 0x6BD2, 0x93C6, 0x72EC, 0x93C7, 0x8AAD, 0x93C8, 0x6803, - 0x93C9, 0x6A61, 0x93CA, 0x51F8, 0x93CB, 0x7A81, 0x93CC, 0x6934, - 0x93CD, 0x5C4A, 0x93CE, 0x9CF6, 0x93CF, 0x82EB, 0x93D0, 0x5BC5, - 0x93D1, 0x9149, 0x93D2, 0x701E, 0x93D3, 0x5678, 0x93D4, 0x5C6F, - 0x93D5, 0x60C7, 0x93D6, 0x6566, 0x93D7, 0x6C8C, 0x93D8, 0x8C5A, - 0x93D9, 0x9041, 0x93DA, 0x9813, 0x93DB, 0x5451, 0x93DC, 0x66C7, - 0x93DD, 0x920D, 0x93DE, 0x5948, 0x93DF, 0x90A3, 0x93E0, 0x5185, - 0x93E1, 0x4E4D, 0x93E2, 0x51EA, 0x93E3, 0x8599, 0x93E4, 0x8B0E, - 0x93E5, 0x7058, 0x93E6, 0x637A, 0x93E7, 0x934B, 0x93E8, 0x6962, - 0x93E9, 0x99B4, 0x93EA, 0x7E04, 0x93EB, 0x7577, 0x93EC, 0x5357, - 0x93ED, 0x6960, 0x93EE, 0x8EDF, 0x93EF, 0x96E3, 0x93F0, 0x6C5D, - 0x93F1, 0x4E8C, 0x93F2, 0x5C3C, 0x93F3, 0x5F10, 0x93F4, 0x8FE9, - 0x93F5, 0x5302, 0x93F6, 0x8CD1, 0x93F7, 0x8089, 0x93F8, 0x8679, - 0x93F9, 0x5EFF, 0x93FA, 0x65E5, 0x93FB, 0x4E73, 0x93FC, 0x5165, - 0x9440, 0x5982, 0x9441, 0x5C3F, 0x9442, 0x97EE, 0x9443, 0x4EFB, - 0x9444, 0x598A, 0x9445, 0x5FCD, 0x9446, 0x8A8D, 0x9447, 0x6FE1, - 0x9448, 0x79B0, 0x9449, 0x7962, 0x944A, 0x5BE7, 0x944B, 0x8471, - 0x944C, 0x732B, 0x944D, 0x71B1, 0x944E, 0x5E74, 0x944F, 0x5FF5, - 0x9450, 0x637B, 0x9451, 0x649A, 0x9452, 0x71C3, 0x9453, 0x7C98, - 0x9454, 0x4E43, 0x9455, 0x5EFC, 0x9456, 0x4E4B, 0x9457, 0x57DC, - 0x9458, 0x56A2, 0x9459, 0x60A9, 0x945A, 0x6FC3, 0x945B, 0x7D0D, - 0x945C, 0x80FD, 0x945D, 0x8133, 0x945E, 0x81BF, 0x945F, 0x8FB2, - 0x9460, 0x8997, 0x9461, 0x86A4, 0x9462, 0x5DF4, 0x9463, 0x628A, - 0x9464, 0x64AD, 0x9465, 0x8987, 0x9466, 0x6777, 0x9467, 0x6CE2, - 0x9468, 0x6D3E, 0x9469, 0x7436, 0x946A, 0x7834, 0x946B, 0x5A46, - 0x946C, 0x7F75, 0x946D, 0x82AD, 0x946E, 0x99AC, 0x946F, 0x4FF3, - 0x9470, 0x5EC3, 0x9471, 0x62DD, 0x9472, 0x6392, 0x9473, 0x6557, - 0x9474, 0x676F, 0x9475, 0x76C3, 0x9476, 0x724C, 0x9477, 0x80CC, - 0x9478, 0x80BA, 0x9479, 0x8F29, 0x947A, 0x914D, 0x947B, 0x500D, - 0x947C, 0x57F9, 0x947D, 0x5A92, 0x947E, 0x6885, 0x9480, 0x6973, - 0x9481, 0x7164, 0x9482, 0x72FD, 0x9483, 0x8CB7, 0x9484, 0x58F2, - 0x9485, 0x8CE0, 0x9486, 0x966A, 0x9487, 0x9019, 0x9488, 0x877F, - 0x9489, 0x79E4, 0x948A, 0x77E7, 0x948B, 0x8429, 0x948C, 0x4F2F, - 0x948D, 0x5265, 0x948E, 0x535A, 0x948F, 0x62CD, 0x9490, 0x67CF, - 0x9491, 0x6CCA, 0x9492, 0x767D, 0x9493, 0x7B94, 0x9494, 0x7C95, - 0x9495, 0x8236, 0x9496, 0x8584, 0x9497, 0x8FEB, 0x9498, 0x66DD, - 0x9499, 0x6F20, 0x949A, 0x7206, 0x949B, 0x7E1B, 0x949C, 0x83AB, - 0x949D, 0x99C1, 0x949E, 0x9EA6, 0x949F, 0x51FD, 0x94A0, 0x7BB1, - 0x94A1, 0x7872, 0x94A2, 0x7BB8, 0x94A3, 0x8087, 0x94A4, 0x7B48, - 0x94A5, 0x6AE8, 0x94A6, 0x5E61, 0x94A7, 0x808C, 0x94A8, 0x7551, - 0x94A9, 0x7560, 0x94AA, 0x516B, 0x94AB, 0x9262, 0x94AC, 0x6E8C, - 0x94AD, 0x767A, 0x94AE, 0x9197, 0x94AF, 0x9AEA, 0x94B0, 0x4F10, - 0x94B1, 0x7F70, 0x94B2, 0x629C, 0x94B3, 0x7B4F, 0x94B4, 0x95A5, - 0x94B5, 0x9CE9, 0x94B6, 0x567A, 0x94B7, 0x5859, 0x94B8, 0x86E4, - 0x94B9, 0x96BC, 0x94BA, 0x4F34, 0x94BB, 0x5224, 0x94BC, 0x534A, - 0x94BD, 0x53CD, 0x94BE, 0x53DB, 0x94BF, 0x5E06, 0x94C0, 0x642C, - 0x94C1, 0x6591, 0x94C2, 0x677F, 0x94C3, 0x6C3E, 0x94C4, 0x6C4E, - 0x94C5, 0x7248, 0x94C6, 0x72AF, 0x94C7, 0x73ED, 0x94C8, 0x7554, - 0x94C9, 0x7E41, 0x94CA, 0x822C, 0x94CB, 0x85E9, 0x94CC, 0x8CA9, - 0x94CD, 0x7BC4, 0x94CE, 0x91C6, 0x94CF, 0x7169, 0x94D0, 0x9812, - 0x94D1, 0x98EF, 0x94D2, 0x633D, 0x94D3, 0x6669, 0x94D4, 0x756A, - 0x94D5, 0x76E4, 0x94D6, 0x78D0, 0x94D7, 0x8543, 0x94D8, 0x86EE, - 0x94D9, 0x532A, 0x94DA, 0x5351, 0x94DB, 0x5426, 0x94DC, 0x5983, - 0x94DD, 0x5E87, 0x94DE, 0x5F7C, 0x94DF, 0x60B2, 0x94E0, 0x6249, - 0x94E1, 0x6279, 0x94E2, 0x62AB, 0x94E3, 0x6590, 0x94E4, 0x6BD4, - 0x94E5, 0x6CCC, 0x94E6, 0x75B2, 0x94E7, 0x76AE, 0x94E8, 0x7891, - 0x94E9, 0x79D8, 0x94EA, 0x7DCB, 0x94EB, 0x7F77, 0x94EC, 0x80A5, - 0x94ED, 0x88AB, 0x94EE, 0x8AB9, 0x94EF, 0x8CBB, 0x94F0, 0x907F, - 0x94F1, 0x975E, 0x94F2, 0x98DB, 0x94F3, 0x6A0B, 0x94F4, 0x7C38, - 0x94F5, 0x5099, 0x94F6, 0x5C3E, 0x94F7, 0x5FAE, 0x94F8, 0x6787, - 0x94F9, 0x6BD8, 0x94FA, 0x7435, 0x94FB, 0x7709, 0x94FC, 0x7F8E, - 0x9540, 0x9F3B, 0x9541, 0x67CA, 0x9542, 0x7A17, 0x9543, 0x5339, - 0x9544, 0x758B, 0x9545, 0x9AED, 0x9546, 0x5F66, 0x9547, 0x819D, - 0x9548, 0x83F1, 0x9549, 0x8098, 0x954A, 0x5F3C, 0x954B, 0x5FC5, - 0x954C, 0x7562, 0x954D, 0x7B46, 0x954E, 0x903C, 0x954F, 0x6867, - 0x9550, 0x59EB, 0x9551, 0x5A9B, 0x9552, 0x7D10, 0x9553, 0x767E, - 0x9554, 0x8B2C, 0x9555, 0x4FF5, 0x9556, 0x5F6A, 0x9557, 0x6A19, - 0x9558, 0x6C37, 0x9559, 0x6F02, 0x955A, 0x74E2, 0x955B, 0x7968, - 0x955C, 0x8868, 0x955D, 0x8A55, 0x955E, 0x8C79, 0x955F, 0x5EDF, - 0x9560, 0x63CF, 0x9561, 0x75C5, 0x9562, 0x79D2, 0x9563, 0x82D7, - 0x9564, 0x9328, 0x9565, 0x92F2, 0x9566, 0x849C, 0x9567, 0x86ED, - 0x9568, 0x9C2D, 0x9569, 0x54C1, 0x956A, 0x5F6C, 0x956B, 0x658C, - 0x956C, 0x6D5C, 0x956D, 0x7015, 0x956E, 0x8CA7, 0x956F, 0x8CD3, - 0x9570, 0x983B, 0x9571, 0x654F, 0x9572, 0x74F6, 0x9573, 0x4E0D, - 0x9574, 0x4ED8, 0x9575, 0x57E0, 0x9576, 0x592B, 0x9577, 0x5A66, - 0x9578, 0x5BCC, 0x9579, 0x51A8, 0x957A, 0x5E03, 0x957B, 0x5E9C, - 0x957C, 0x6016, 0x957D, 0x6276, 0x957E, 0x6577, 0x9580, 0x65A7, - 0x9581, 0x666E, 0x9582, 0x6D6E, 0x9583, 0x7236, 0x9584, 0x7B26, - 0x9585, 0x8150, 0x9586, 0x819A, 0x9587, 0x8299, 0x9588, 0x8B5C, - 0x9589, 0x8CA0, 0x958A, 0x8CE6, 0x958B, 0x8D74, 0x958C, 0x961C, - 0x958D, 0x9644, 0x958E, 0x4FAE, 0x958F, 0x64AB, 0x9590, 0x6B66, - 0x9591, 0x821E, 0x9592, 0x8461, 0x9593, 0x856A, 0x9594, 0x90E8, - 0x9595, 0x5C01, 0x9596, 0x6953, 0x9597, 0x98A8, 0x9598, 0x847A, - 0x9599, 0x8557, 0x959A, 0x4F0F, 0x959B, 0x526F, 0x959C, 0x5FA9, - 0x959D, 0x5E45, 0x959E, 0x670D, 0x959F, 0x798F, 0x95A0, 0x8179, - 0x95A1, 0x8907, 0x95A2, 0x8986, 0x95A3, 0x6DF5, 0x95A4, 0x5F17, - 0x95A5, 0x6255, 0x95A6, 0x6CB8, 0x95A7, 0x4ECF, 0x95A8, 0x7269, - 0x95A9, 0x9B92, 0x95AA, 0x5206, 0x95AB, 0x543B, 0x95AC, 0x5674, - 0x95AD, 0x58B3, 0x95AE, 0x61A4, 0x95AF, 0x626E, 0x95B0, 0x711A, - 0x95B1, 0x596E, 0x95B2, 0x7C89, 0x95B3, 0x7CDE, 0x95B4, 0x7D1B, - 0x95B5, 0x96F0, 0x95B6, 0x6587, 0x95B7, 0x805E, 0x95B8, 0x4E19, - 0x95B9, 0x4F75, 0x95BA, 0x5175, 0x95BB, 0x5840, 0x95BC, 0x5E63, - 0x95BD, 0x5E73, 0x95BE, 0x5F0A, 0x95BF, 0x67C4, 0x95C0, 0x4E26, - 0x95C1, 0x853D, 0x95C2, 0x9589, 0x95C3, 0x965B, 0x95C4, 0x7C73, - 0x95C5, 0x9801, 0x95C6, 0x50FB, 0x95C7, 0x58C1, 0x95C8, 0x7656, - 0x95C9, 0x78A7, 0x95CA, 0x5225, 0x95CB, 0x77A5, 0x95CC, 0x8511, - 0x95CD, 0x7B86, 0x95CE, 0x504F, 0x95CF, 0x5909, 0x95D0, 0x7247, - 0x95D1, 0x7BC7, 0x95D2, 0x7DE8, 0x95D3, 0x8FBA, 0x95D4, 0x8FD4, - 0x95D5, 0x904D, 0x95D6, 0x4FBF, 0x95D7, 0x52C9, 0x95D8, 0x5A29, - 0x95D9, 0x5F01, 0x95DA, 0x97AD, 0x95DB, 0x4FDD, 0x95DC, 0x8217, - 0x95DD, 0x92EA, 0x95DE, 0x5703, 0x95DF, 0x6355, 0x95E0, 0x6B69, - 0x95E1, 0x752B, 0x95E2, 0x88DC, 0x95E3, 0x8F14, 0x95E4, 0x7A42, - 0x95E5, 0x52DF, 0x95E6, 0x5893, 0x95E7, 0x6155, 0x95E8, 0x620A, - 0x95E9, 0x66AE, 0x95EA, 0x6BCD, 0x95EB, 0x7C3F, 0x95EC, 0x83E9, - 0x95ED, 0x5023, 0x95EE, 0x4FF8, 0x95EF, 0x5305, 0x95F0, 0x5446, - 0x95F1, 0x5831, 0x95F2, 0x5949, 0x95F3, 0x5B9D, 0x95F4, 0x5CF0, - 0x95F5, 0x5CEF, 0x95F6, 0x5D29, 0x95F7, 0x5E96, 0x95F8, 0x62B1, - 0x95F9, 0x6367, 0x95FA, 0x653E, 0x95FB, 0x65B9, 0x95FC, 0x670B, - 0x9640, 0x6CD5, 0x9641, 0x6CE1, 0x9642, 0x70F9, 0x9643, 0x7832, - 0x9644, 0x7E2B, 0x9645, 0x80DE, 0x9646, 0x82B3, 0x9647, 0x840C, - 0x9648, 0x84EC, 0x9649, 0x8702, 0x964A, 0x8912, 0x964B, 0x8A2A, - 0x964C, 0x8C4A, 0x964D, 0x90A6, 0x964E, 0x92D2, 0x964F, 0x98FD, - 0x9650, 0x9CF3, 0x9651, 0x9D6C, 0x9652, 0x4E4F, 0x9653, 0x4EA1, - 0x9654, 0x508D, 0x9655, 0x5256, 0x9656, 0x574A, 0x9657, 0x59A8, - 0x9658, 0x5E3D, 0x9659, 0x5FD8, 0x965A, 0x5FD9, 0x965B, 0x623F, - 0x965C, 0x66B4, 0x965D, 0x671B, 0x965E, 0x67D0, 0x965F, 0x68D2, - 0x9660, 0x5192, 0x9661, 0x7D21, 0x9662, 0x80AA, 0x9663, 0x81A8, - 0x9664, 0x8B00, 0x9665, 0x8C8C, 0x9666, 0x8CBF, 0x9667, 0x927E, - 0x9668, 0x9632, 0x9669, 0x5420, 0x966A, 0x982C, 0x966B, 0x5317, - 0x966C, 0x50D5, 0x966D, 0x535C, 0x966E, 0x58A8, 0x966F, 0x64B2, - 0x9670, 0x6734, 0x9671, 0x7267, 0x9672, 0x7766, 0x9673, 0x7A46, - 0x9674, 0x91E6, 0x9675, 0x52C3, 0x9676, 0x6CA1, 0x9677, 0x6B86, - 0x9678, 0x5800, 0x9679, 0x5E4C, 0x967A, 0x5954, 0x967B, 0x672C, - 0x967C, 0x7FFB, 0x967D, 0x51E1, 0x967E, 0x76C6, 0x9680, 0x6469, - 0x9681, 0x78E8, 0x9682, 0x9B54, 0x9683, 0x9EBB, 0x9684, 0x57CB, - 0x9685, 0x59B9, 0x9686, 0x6627, 0x9687, 0x679A, 0x9688, 0x6BCE, - 0x9689, 0x54E9, 0x968A, 0x69D9, 0x968B, 0x5E55, 0x968C, 0x819C, - 0x968D, 0x6795, 0x968E, 0x9BAA, 0x968F, 0x67FE, 0x9690, 0x9C52, - 0x9691, 0x685D, 0x9692, 0x4EA6, 0x9693, 0x4FE3, 0x9694, 0x53C8, - 0x9695, 0x62B9, 0x9696, 0x672B, 0x9697, 0x6CAB, 0x9698, 0x8FC4, - 0x9699, 0x4FAD, 0x969A, 0x7E6D, 0x969B, 0x9EBF, 0x969C, 0x4E07, - 0x969D, 0x6162, 0x969E, 0x6E80, 0x969F, 0x6F2B, 0x96A0, 0x8513, - 0x96A1, 0x5473, 0x96A2, 0x672A, 0x96A3, 0x9B45, 0x96A4, 0x5DF3, - 0x96A5, 0x7B95, 0x96A6, 0x5CAC, 0x96A7, 0x5BC6, 0x96A8, 0x871C, - 0x96A9, 0x6E4A, 0x96AA, 0x84D1, 0x96AB, 0x7A14, 0x96AC, 0x8108, - 0x96AD, 0x5999, 0x96AE, 0x7C8D, 0x96AF, 0x6C11, 0x96B0, 0x7720, - 0x96B1, 0x52D9, 0x96B2, 0x5922, 0x96B3, 0x7121, 0x96B4, 0x725F, - 0x96B5, 0x77DB, 0x96B6, 0x9727, 0x96B7, 0x9D61, 0x96B8, 0x690B, - 0x96B9, 0x5A7F, 0x96BA, 0x5A18, 0x96BB, 0x51A5, 0x96BC, 0x540D, - 0x96BD, 0x547D, 0x96BE, 0x660E, 0x96BF, 0x76DF, 0x96C0, 0x8FF7, - 0x96C1, 0x9298, 0x96C2, 0x9CF4, 0x96C3, 0x59EA, 0x96C4, 0x725D, - 0x96C5, 0x6EC5, 0x96C6, 0x514D, 0x96C7, 0x68C9, 0x96C8, 0x7DBF, - 0x96C9, 0x7DEC, 0x96CA, 0x9762, 0x96CB, 0x9EBA, 0x96CC, 0x6478, - 0x96CD, 0x6A21, 0x96CE, 0x8302, 0x96CF, 0x5984, 0x96D0, 0x5B5F, - 0x96D1, 0x6BDB, 0x96D2, 0x731B, 0x96D3, 0x76F2, 0x96D4, 0x7DB2, - 0x96D5, 0x8017, 0x96D6, 0x8499, 0x96D7, 0x5132, 0x96D8, 0x6728, - 0x96D9, 0x9ED9, 0x96DA, 0x76EE, 0x96DB, 0x6762, 0x96DC, 0x52FF, - 0x96DD, 0x9905, 0x96DE, 0x5C24, 0x96DF, 0x623B, 0x96E0, 0x7C7E, - 0x96E1, 0x8CB0, 0x96E2, 0x554F, 0x96E3, 0x60B6, 0x96E4, 0x7D0B, - 0x96E5, 0x9580, 0x96E6, 0x5301, 0x96E7, 0x4E5F, 0x96E8, 0x51B6, - 0x96E9, 0x591C, 0x96EA, 0x723A, 0x96EB, 0x8036, 0x96EC, 0x91CE, - 0x96ED, 0x5F25, 0x96EE, 0x77E2, 0x96EF, 0x5384, 0x96F0, 0x5F79, - 0x96F1, 0x7D04, 0x96F2, 0x85AC, 0x96F3, 0x8A33, 0x96F4, 0x8E8D, - 0x96F5, 0x9756, 0x96F6, 0x67F3, 0x96F7, 0x85AE, 0x96F8, 0x9453, - 0x96F9, 0x6109, 0x96FA, 0x6108, 0x96FB, 0x6CB9, 0x96FC, 0x7652, - 0x9740, 0x8AED, 0x9741, 0x8F38, 0x9742, 0x552F, 0x9743, 0x4F51, - 0x9744, 0x512A, 0x9745, 0x52C7, 0x9746, 0x53CB, 0x9747, 0x5BA5, - 0x9748, 0x5E7D, 0x9749, 0x60A0, 0x974A, 0x6182, 0x974B, 0x63D6, - 0x974C, 0x6709, 0x974D, 0x67DA, 0x974E, 0x6E67, 0x974F, 0x6D8C, - 0x9750, 0x7336, 0x9751, 0x7337, 0x9752, 0x7531, 0x9753, 0x7950, - 0x9754, 0x88D5, 0x9755, 0x8A98, 0x9756, 0x904A, 0x9757, 0x9091, - 0x9758, 0x90F5, 0x9759, 0x96C4, 0x975A, 0x878D, 0x975B, 0x5915, - 0x975C, 0x4E88, 0x975D, 0x4F59, 0x975E, 0x4E0E, 0x975F, 0x8A89, - 0x9760, 0x8F3F, 0x9761, 0x9810, 0x9762, 0x50AD, 0x9763, 0x5E7C, - 0x9764, 0x5996, 0x9765, 0x5BB9, 0x9766, 0x5EB8, 0x9767, 0x63DA, - 0x9768, 0x63FA, 0x9769, 0x64C1, 0x976A, 0x66DC, 0x976B, 0x694A, - 0x976C, 0x69D8, 0x976D, 0x6D0B, 0x976E, 0x6EB6, 0x976F, 0x7194, - 0x9770, 0x7528, 0x9771, 0x7AAF, 0x9772, 0x7F8A, 0x9773, 0x8000, - 0x9774, 0x8449, 0x9775, 0x84C9, 0x9776, 0x8981, 0x9777, 0x8B21, - 0x9778, 0x8E0A, 0x9779, 0x9065, 0x977A, 0x967D, 0x977B, 0x990A, - 0x977C, 0x617E, 0x977D, 0x6291, 0x977E, 0x6B32, 0x9780, 0x6C83, - 0x9781, 0x6D74, 0x9782, 0x7FCC, 0x9783, 0x7FFC, 0x9784, 0x6DC0, - 0x9785, 0x7F85, 0x9786, 0x87BA, 0x9787, 0x88F8, 0x9788, 0x6765, - 0x9789, 0x83B1, 0x978A, 0x983C, 0x978B, 0x96F7, 0x978C, 0x6D1B, - 0x978D, 0x7D61, 0x978E, 0x843D, 0x978F, 0x916A, 0x9790, 0x4E71, - 0x9791, 0x5375, 0x9792, 0x5D50, 0x9793, 0x6B04, 0x9794, 0x6FEB, - 0x9795, 0x85CD, 0x9796, 0x862D, 0x9797, 0x89A7, 0x9798, 0x5229, - 0x9799, 0x540F, 0x979A, 0x5C65, 0x979B, 0x674E, 0x979C, 0x68A8, - 0x979D, 0x7406, 0x979E, 0x7483, 0x979F, 0x75E2, 0x97A0, 0x88CF, - 0x97A1, 0x88E1, 0x97A2, 0x91CC, 0x97A3, 0x96E2, 0x97A4, 0x9678, - 0x97A5, 0x5F8B, 0x97A6, 0x7387, 0x97A7, 0x7ACB, 0x97A8, 0x844E, - 0x97A9, 0x63A0, 0x97AA, 0x7565, 0x97AB, 0x5289, 0x97AC, 0x6D41, - 0x97AD, 0x6E9C, 0x97AE, 0x7409, 0x97AF, 0x7559, 0x97B0, 0x786B, - 0x97B1, 0x7C92, 0x97B2, 0x9686, 0x97B3, 0x7ADC, 0x97B4, 0x9F8D, - 0x97B5, 0x4FB6, 0x97B6, 0x616E, 0x97B7, 0x65C5, 0x97B8, 0x865C, - 0x97B9, 0x4E86, 0x97BA, 0x4EAE, 0x97BB, 0x50DA, 0x97BC, 0x4E21, - 0x97BD, 0x51CC, 0x97BE, 0x5BEE, 0x97BF, 0x6599, 0x97C0, 0x6881, - 0x97C1, 0x6DBC, 0x97C2, 0x731F, 0x97C3, 0x7642, 0x97C4, 0x77AD, - 0x97C5, 0x7A1C, 0x97C6, 0x7CE7, 0x97C7, 0x826F, 0x97C8, 0x8AD2, - 0x97C9, 0x907C, 0x97CA, 0x91CF, 0x97CB, 0x9675, 0x97CC, 0x9818, - 0x97CD, 0x529B, 0x97CE, 0x7DD1, 0x97CF, 0x502B, 0x97D0, 0x5398, - 0x97D1, 0x6797, 0x97D2, 0x6DCB, 0x97D3, 0x71D0, 0x97D4, 0x7433, - 0x97D5, 0x81E8, 0x97D6, 0x8F2A, 0x97D7, 0x96A3, 0x97D8, 0x9C57, - 0x97D9, 0x9E9F, 0x97DA, 0x7460, 0x97DB, 0x5841, 0x97DC, 0x6D99, - 0x97DD, 0x7D2F, 0x97DE, 0x985E, 0x97DF, 0x4EE4, 0x97E0, 0x4F36, - 0x97E1, 0x4F8B, 0x97E2, 0x51B7, 0x97E3, 0x52B1, 0x97E4, 0x5DBA, - 0x97E5, 0x601C, 0x97E6, 0x73B2, 0x97E7, 0x793C, 0x97E8, 0x82D3, - 0x97E9, 0x9234, 0x97EA, 0x96B7, 0x97EB, 0x96F6, 0x97EC, 0x970A, - 0x97ED, 0x9E97, 0x97EE, 0x9F62, 0x97EF, 0x66A6, 0x97F0, 0x6B74, - 0x97F1, 0x5217, 0x97F2, 0x52A3, 0x97F3, 0x70C8, 0x97F4, 0x88C2, - 0x97F5, 0x5EC9, 0x97F6, 0x604B, 0x97F7, 0x6190, 0x97F8, 0x6F23, - 0x97F9, 0x7149, 0x97FA, 0x7C3E, 0x97FB, 0x7DF4, 0x97FC, 0x806F, - 0x9840, 0x84EE, 0x9841, 0x9023, 0x9842, 0x932C, 0x9843, 0x5442, - 0x9844, 0x9B6F, 0x9845, 0x6AD3, 0x9846, 0x7089, 0x9847, 0x8CC2, - 0x9848, 0x8DEF, 0x9849, 0x9732, 0x984A, 0x52B4, 0x984B, 0x5A41, - 0x984C, 0x5ECA, 0x984D, 0x5F04, 0x984E, 0x6717, 0x984F, 0x697C, - 0x9850, 0x6994, 0x9851, 0x6D6A, 0x9852, 0x6F0F, 0x9853, 0x7262, - 0x9854, 0x72FC, 0x9855, 0x7BED, 0x9856, 0x8001, 0x9857, 0x807E, - 0x9858, 0x874B, 0x9859, 0x90CE, 0x985A, 0x516D, 0x985B, 0x9E93, - 0x985C, 0x7984, 0x985D, 0x808B, 0x985E, 0x9332, 0x985F, 0x8AD6, - 0x9860, 0x502D, 0x9861, 0x548C, 0x9862, 0x8A71, 0x9863, 0x6B6A, - 0x9864, 0x8CC4, 0x9865, 0x8107, 0x9866, 0x60D1, 0x9867, 0x67A0, - 0x9868, 0x9DF2, 0x9869, 0x4E99, 0x986A, 0x4E98, 0x986B, 0x9C10, - 0x986C, 0x8A6B, 0x986D, 0x85C1, 0x986E, 0x8568, 0x986F, 0x6900, - 0x9870, 0x6E7E, 0x9871, 0x7897, 0x9872, 0x8155, 0x989F, 0x5F0C, - 0x98A0, 0x4E10, 0x98A1, 0x4E15, 0x98A2, 0x4E2A, 0x98A3, 0x4E31, - 0x98A4, 0x4E36, 0x98A5, 0x4E3C, 0x98A6, 0x4E3F, 0x98A7, 0x4E42, - 0x98A8, 0x4E56, 0x98A9, 0x4E58, 0x98AA, 0x4E82, 0x98AB, 0x4E85, - 0x98AC, 0x8C6B, 0x98AD, 0x4E8A, 0x98AE, 0x8212, 0x98AF, 0x5F0D, - 0x98B0, 0x4E8E, 0x98B1, 0x4E9E, 0x98B2, 0x4E9F, 0x98B3, 0x4EA0, - 0x98B4, 0x4EA2, 0x98B5, 0x4EB0, 0x98B6, 0x4EB3, 0x98B7, 0x4EB6, - 0x98B8, 0x4ECE, 0x98B9, 0x4ECD, 0x98BA, 0x4EC4, 0x98BB, 0x4EC6, - 0x98BC, 0x4EC2, 0x98BD, 0x4ED7, 0x98BE, 0x4EDE, 0x98BF, 0x4EED, - 0x98C0, 0x4EDF, 0x98C1, 0x4EF7, 0x98C2, 0x4F09, 0x98C3, 0x4F5A, - 0x98C4, 0x4F30, 0x98C5, 0x4F5B, 0x98C6, 0x4F5D, 0x98C7, 0x4F57, - 0x98C8, 0x4F47, 0x98C9, 0x4F76, 0x98CA, 0x4F88, 0x98CB, 0x4F8F, - 0x98CC, 0x4F98, 0x98CD, 0x4F7B, 0x98CE, 0x4F69, 0x98CF, 0x4F70, - 0x98D0, 0x4F91, 0x98D1, 0x4F6F, 0x98D2, 0x4F86, 0x98D3, 0x4F96, - 0x98D4, 0x5118, 0x98D5, 0x4FD4, 0x98D6, 0x4FDF, 0x98D7, 0x4FCE, - 0x98D8, 0x4FD8, 0x98D9, 0x4FDB, 0x98DA, 0x4FD1, 0x98DB, 0x4FDA, - 0x98DC, 0x4FD0, 0x98DD, 0x4FE4, 0x98DE, 0x4FE5, 0x98DF, 0x501A, - 0x98E0, 0x5028, 0x98E1, 0x5014, 0x98E2, 0x502A, 0x98E3, 0x5025, - 0x98E4, 0x5005, 0x98E5, 0x4F1C, 0x98E6, 0x4FF6, 0x98E7, 0x5021, - 0x98E8, 0x5029, 0x98E9, 0x502C, 0x98EA, 0x4FFE, 0x98EB, 0x4FEF, - 0x98EC, 0x5011, 0x98ED, 0x5006, 0x98EE, 0x5043, 0x98EF, 0x5047, - 0x98F0, 0x6703, 0x98F1, 0x5055, 0x98F2, 0x5050, 0x98F3, 0x5048, - 0x98F4, 0x505A, 0x98F5, 0x5056, 0x98F6, 0x506C, 0x98F7, 0x5078, - 0x98F8, 0x5080, 0x98F9, 0x509A, 0x98FA, 0x5085, 0x98FB, 0x50B4, - 0x98FC, 0x50B2, 0x9940, 0x50C9, 0x9941, 0x50CA, 0x9942, 0x50B3, - 0x9943, 0x50C2, 0x9944, 0x50D6, 0x9945, 0x50DE, 0x9946, 0x50E5, - 0x9947, 0x50ED, 0x9948, 0x50E3, 0x9949, 0x50EE, 0x994A, 0x50F9, - 0x994B, 0x50F5, 0x994C, 0x5109, 0x994D, 0x5101, 0x994E, 0x5102, - 0x994F, 0x5116, 0x9950, 0x5115, 0x9951, 0x5114, 0x9952, 0x511A, - 0x9953, 0x5121, 0x9954, 0x513A, 0x9955, 0x5137, 0x9956, 0x513C, - 0x9957, 0x513B, 0x9958, 0x513F, 0x9959, 0x5140, 0x995A, 0x5152, - 0x995B, 0x514C, 0x995C, 0x5154, 0x995D, 0x5162, 0x995E, 0x7AF8, - 0x995F, 0x5169, 0x9960, 0x516A, 0x9961, 0x516E, 0x9962, 0x5180, - 0x9963, 0x5182, 0x9964, 0x56D8, 0x9965, 0x518C, 0x9966, 0x5189, - 0x9967, 0x518F, 0x9968, 0x5191, 0x9969, 0x5193, 0x996A, 0x5195, - 0x996B, 0x5196, 0x996C, 0x51A4, 0x996D, 0x51A6, 0x996E, 0x51A2, - 0x996F, 0x51A9, 0x9970, 0x51AA, 0x9971, 0x51AB, 0x9972, 0x51B3, - 0x9973, 0x51B1, 0x9974, 0x51B2, 0x9975, 0x51B0, 0x9976, 0x51B5, - 0x9977, 0x51BD, 0x9978, 0x51C5, 0x9979, 0x51C9, 0x997A, 0x51DB, - 0x997B, 0x51E0, 0x997C, 0x8655, 0x997D, 0x51E9, 0x997E, 0x51ED, - 0x9980, 0x51F0, 0x9981, 0x51F5, 0x9982, 0x51FE, 0x9983, 0x5204, - 0x9984, 0x520B, 0x9985, 0x5214, 0x9986, 0x520E, 0x9987, 0x5227, - 0x9988, 0x522A, 0x9989, 0x522E, 0x998A, 0x5233, 0x998B, 0x5239, - 0x998C, 0x524F, 0x998D, 0x5244, 0x998E, 0x524B, 0x998F, 0x524C, - 0x9990, 0x525E, 0x9991, 0x5254, 0x9992, 0x526A, 0x9993, 0x5274, - 0x9994, 0x5269, 0x9995, 0x5273, 0x9996, 0x527F, 0x9997, 0x527D, - 0x9998, 0x528D, 0x9999, 0x5294, 0x999A, 0x5292, 0x999B, 0x5271, - 0x999C, 0x5288, 0x999D, 0x5291, 0x999E, 0x8FA8, 0x999F, 0x8FA7, - 0x99A0, 0x52AC, 0x99A1, 0x52AD, 0x99A2, 0x52BC, 0x99A3, 0x52B5, - 0x99A4, 0x52C1, 0x99A5, 0x52CD, 0x99A6, 0x52D7, 0x99A7, 0x52DE, - 0x99A8, 0x52E3, 0x99A9, 0x52E6, 0x99AA, 0x98ED, 0x99AB, 0x52E0, - 0x99AC, 0x52F3, 0x99AD, 0x52F5, 0x99AE, 0x52F8, 0x99AF, 0x52F9, - 0x99B0, 0x5306, 0x99B1, 0x5308, 0x99B2, 0x7538, 0x99B3, 0x530D, - 0x99B4, 0x5310, 0x99B5, 0x530F, 0x99B6, 0x5315, 0x99B7, 0x531A, - 0x99B8, 0x5323, 0x99B9, 0x532F, 0x99BA, 0x5331, 0x99BB, 0x5333, - 0x99BC, 0x5338, 0x99BD, 0x5340, 0x99BE, 0x5346, 0x99BF, 0x5345, - 0x99C0, 0x4E17, 0x99C1, 0x5349, 0x99C2, 0x534D, 0x99C3, 0x51D6, - 0x99C4, 0x535E, 0x99C5, 0x5369, 0x99C6, 0x536E, 0x99C7, 0x5918, - 0x99C8, 0x537B, 0x99C9, 0x5377, 0x99CA, 0x5382, 0x99CB, 0x5396, - 0x99CC, 0x53A0, 0x99CD, 0x53A6, 0x99CE, 0x53A5, 0x99CF, 0x53AE, - 0x99D0, 0x53B0, 0x99D1, 0x53B6, 0x99D2, 0x53C3, 0x99D3, 0x7C12, - 0x99D4, 0x96D9, 0x99D5, 0x53DF, 0x99D6, 0x66FC, 0x99D7, 0x71EE, - 0x99D8, 0x53EE, 0x99D9, 0x53E8, 0x99DA, 0x53ED, 0x99DB, 0x53FA, - 0x99DC, 0x5401, 0x99DD, 0x543D, 0x99DE, 0x5440, 0x99DF, 0x542C, - 0x99E0, 0x542D, 0x99E1, 0x543C, 0x99E2, 0x542E, 0x99E3, 0x5436, - 0x99E4, 0x5429, 0x99E5, 0x541D, 0x99E6, 0x544E, 0x99E7, 0x548F, - 0x99E8, 0x5475, 0x99E9, 0x548E, 0x99EA, 0x545F, 0x99EB, 0x5471, - 0x99EC, 0x5477, 0x99ED, 0x5470, 0x99EE, 0x5492, 0x99EF, 0x547B, - 0x99F0, 0x5480, 0x99F1, 0x5476, 0x99F2, 0x5484, 0x99F3, 0x5490, - 0x99F4, 0x5486, 0x99F5, 0x54C7, 0x99F6, 0x54A2, 0x99F7, 0x54B8, - 0x99F8, 0x54A5, 0x99F9, 0x54AC, 0x99FA, 0x54C4, 0x99FB, 0x54C8, - 0x99FC, 0x54A8, 0x9A40, 0x54AB, 0x9A41, 0x54C2, 0x9A42, 0x54A4, - 0x9A43, 0x54BE, 0x9A44, 0x54BC, 0x9A45, 0x54D8, 0x9A46, 0x54E5, - 0x9A47, 0x54E6, 0x9A48, 0x550F, 0x9A49, 0x5514, 0x9A4A, 0x54FD, - 0x9A4B, 0x54EE, 0x9A4C, 0x54ED, 0x9A4D, 0x54FA, 0x9A4E, 0x54E2, - 0x9A4F, 0x5539, 0x9A50, 0x5540, 0x9A51, 0x5563, 0x9A52, 0x554C, - 0x9A53, 0x552E, 0x9A54, 0x555C, 0x9A55, 0x5545, 0x9A56, 0x5556, - 0x9A57, 0x5557, 0x9A58, 0x5538, 0x9A59, 0x5533, 0x9A5A, 0x555D, - 0x9A5B, 0x5599, 0x9A5C, 0x5580, 0x9A5D, 0x54AF, 0x9A5E, 0x558A, - 0x9A5F, 0x559F, 0x9A60, 0x557B, 0x9A61, 0x557E, 0x9A62, 0x5598, - 0x9A63, 0x559E, 0x9A64, 0x55AE, 0x9A65, 0x557C, 0x9A66, 0x5583, - 0x9A67, 0x55A9, 0x9A68, 0x5587, 0x9A69, 0x55A8, 0x9A6A, 0x55DA, - 0x9A6B, 0x55C5, 0x9A6C, 0x55DF, 0x9A6D, 0x55C4, 0x9A6E, 0x55DC, - 0x9A6F, 0x55E4, 0x9A70, 0x55D4, 0x9A71, 0x5614, 0x9A72, 0x55F7, - 0x9A73, 0x5616, 0x9A74, 0x55FE, 0x9A75, 0x55FD, 0x9A76, 0x561B, - 0x9A77, 0x55F9, 0x9A78, 0x564E, 0x9A79, 0x5650, 0x9A7A, 0x71DF, - 0x9A7B, 0x5634, 0x9A7C, 0x5636, 0x9A7D, 0x5632, 0x9A7E, 0x5638, - 0x9A80, 0x566B, 0x9A81, 0x5664, 0x9A82, 0x562F, 0x9A83, 0x566C, - 0x9A84, 0x566A, 0x9A85, 0x5686, 0x9A86, 0x5680, 0x9A87, 0x568A, - 0x9A88, 0x56A0, 0x9A89, 0x5694, 0x9A8A, 0x568F, 0x9A8B, 0x56A5, - 0x9A8C, 0x56AE, 0x9A8D, 0x56B6, 0x9A8E, 0x56B4, 0x9A8F, 0x56C2, - 0x9A90, 0x56BC, 0x9A91, 0x56C1, 0x9A92, 0x56C3, 0x9A93, 0x56C0, - 0x9A94, 0x56C8, 0x9A95, 0x56CE, 0x9A96, 0x56D1, 0x9A97, 0x56D3, - 0x9A98, 0x56D7, 0x9A99, 0x56EE, 0x9A9A, 0x56F9, 0x9A9B, 0x5700, - 0x9A9C, 0x56FF, 0x9A9D, 0x5704, 0x9A9E, 0x5709, 0x9A9F, 0x5708, - 0x9AA0, 0x570B, 0x9AA1, 0x570D, 0x9AA2, 0x5713, 0x9AA3, 0x5718, - 0x9AA4, 0x5716, 0x9AA5, 0x55C7, 0x9AA6, 0x571C, 0x9AA7, 0x5726, - 0x9AA8, 0x5737, 0x9AA9, 0x5738, 0x9AAA, 0x574E, 0x9AAB, 0x573B, - 0x9AAC, 0x5740, 0x9AAD, 0x574F, 0x9AAE, 0x5769, 0x9AAF, 0x57C0, - 0x9AB0, 0x5788, 0x9AB1, 0x5761, 0x9AB2, 0x577F, 0x9AB3, 0x5789, - 0x9AB4, 0x5793, 0x9AB5, 0x57A0, 0x9AB6, 0x57B3, 0x9AB7, 0x57A4, - 0x9AB8, 0x57AA, 0x9AB9, 0x57B0, 0x9ABA, 0x57C3, 0x9ABB, 0x57C6, - 0x9ABC, 0x57D4, 0x9ABD, 0x57D2, 0x9ABE, 0x57D3, 0x9ABF, 0x580A, - 0x9AC0, 0x57D6, 0x9AC1, 0x57E3, 0x9AC2, 0x580B, 0x9AC3, 0x5819, - 0x9AC4, 0x581D, 0x9AC5, 0x5872, 0x9AC6, 0x5821, 0x9AC7, 0x5862, - 0x9AC8, 0x584B, 0x9AC9, 0x5870, 0x9ACA, 0x6BC0, 0x9ACB, 0x5852, - 0x9ACC, 0x583D, 0x9ACD, 0x5879, 0x9ACE, 0x5885, 0x9ACF, 0x58B9, - 0x9AD0, 0x589F, 0x9AD1, 0x58AB, 0x9AD2, 0x58BA, 0x9AD3, 0x58DE, - 0x9AD4, 0x58BB, 0x9AD5, 0x58B8, 0x9AD6, 0x58AE, 0x9AD7, 0x58C5, - 0x9AD8, 0x58D3, 0x9AD9, 0x58D1, 0x9ADA, 0x58D7, 0x9ADB, 0x58D9, - 0x9ADC, 0x58D8, 0x9ADD, 0x58E5, 0x9ADE, 0x58DC, 0x9ADF, 0x58E4, - 0x9AE0, 0x58DF, 0x9AE1, 0x58EF, 0x9AE2, 0x58FA, 0x9AE3, 0x58F9, - 0x9AE4, 0x58FB, 0x9AE5, 0x58FC, 0x9AE6, 0x58FD, 0x9AE7, 0x5902, - 0x9AE8, 0x590A, 0x9AE9, 0x5910, 0x9AEA, 0x591B, 0x9AEB, 0x68A6, - 0x9AEC, 0x5925, 0x9AED, 0x592C, 0x9AEE, 0x592D, 0x9AEF, 0x5932, - 0x9AF0, 0x5938, 0x9AF1, 0x593E, 0x9AF2, 0x7AD2, 0x9AF3, 0x5955, - 0x9AF4, 0x5950, 0x9AF5, 0x594E, 0x9AF6, 0x595A, 0x9AF7, 0x5958, - 0x9AF8, 0x5962, 0x9AF9, 0x5960, 0x9AFA, 0x5967, 0x9AFB, 0x596C, - 0x9AFC, 0x5969, 0x9B40, 0x5978, 0x9B41, 0x5981, 0x9B42, 0x599D, - 0x9B43, 0x4F5E, 0x9B44, 0x4FAB, 0x9B45, 0x59A3, 0x9B46, 0x59B2, - 0x9B47, 0x59C6, 0x9B48, 0x59E8, 0x9B49, 0x59DC, 0x9B4A, 0x598D, - 0x9B4B, 0x59D9, 0x9B4C, 0x59DA, 0x9B4D, 0x5A25, 0x9B4E, 0x5A1F, - 0x9B4F, 0x5A11, 0x9B50, 0x5A1C, 0x9B51, 0x5A09, 0x9B52, 0x5A1A, - 0x9B53, 0x5A40, 0x9B54, 0x5A6C, 0x9B55, 0x5A49, 0x9B56, 0x5A35, - 0x9B57, 0x5A36, 0x9B58, 0x5A62, 0x9B59, 0x5A6A, 0x9B5A, 0x5A9A, - 0x9B5B, 0x5ABC, 0x9B5C, 0x5ABE, 0x9B5D, 0x5ACB, 0x9B5E, 0x5AC2, - 0x9B5F, 0x5ABD, 0x9B60, 0x5AE3, 0x9B61, 0x5AD7, 0x9B62, 0x5AE6, - 0x9B63, 0x5AE9, 0x9B64, 0x5AD6, 0x9B65, 0x5AFA, 0x9B66, 0x5AFB, - 0x9B67, 0x5B0C, 0x9B68, 0x5B0B, 0x9B69, 0x5B16, 0x9B6A, 0x5B32, - 0x9B6B, 0x5AD0, 0x9B6C, 0x5B2A, 0x9B6D, 0x5B36, 0x9B6E, 0x5B3E, - 0x9B6F, 0x5B43, 0x9B70, 0x5B45, 0x9B71, 0x5B40, 0x9B72, 0x5B51, - 0x9B73, 0x5B55, 0x9B74, 0x5B5A, 0x9B75, 0x5B5B, 0x9B76, 0x5B65, - 0x9B77, 0x5B69, 0x9B78, 0x5B70, 0x9B79, 0x5B73, 0x9B7A, 0x5B75, - 0x9B7B, 0x5B78, 0x9B7C, 0x6588, 0x9B7D, 0x5B7A, 0x9B7E, 0x5B80, - 0x9B80, 0x5B83, 0x9B81, 0x5BA6, 0x9B82, 0x5BB8, 0x9B83, 0x5BC3, - 0x9B84, 0x5BC7, 0x9B85, 0x5BC9, 0x9B86, 0x5BD4, 0x9B87, 0x5BD0, - 0x9B88, 0x5BE4, 0x9B89, 0x5BE6, 0x9B8A, 0x5BE2, 0x9B8B, 0x5BDE, - 0x9B8C, 0x5BE5, 0x9B8D, 0x5BEB, 0x9B8E, 0x5BF0, 0x9B8F, 0x5BF6, - 0x9B90, 0x5BF3, 0x9B91, 0x5C05, 0x9B92, 0x5C07, 0x9B93, 0x5C08, - 0x9B94, 0x5C0D, 0x9B95, 0x5C13, 0x9B96, 0x5C20, 0x9B97, 0x5C22, - 0x9B98, 0x5C28, 0x9B99, 0x5C38, 0x9B9A, 0x5C39, 0x9B9B, 0x5C41, - 0x9B9C, 0x5C46, 0x9B9D, 0x5C4E, 0x9B9E, 0x5C53, 0x9B9F, 0x5C50, - 0x9BA0, 0x5C4F, 0x9BA1, 0x5B71, 0x9BA2, 0x5C6C, 0x9BA3, 0x5C6E, - 0x9BA4, 0x4E62, 0x9BA5, 0x5C76, 0x9BA6, 0x5C79, 0x9BA7, 0x5C8C, - 0x9BA8, 0x5C91, 0x9BA9, 0x5C94, 0x9BAA, 0x599B, 0x9BAB, 0x5CAB, - 0x9BAC, 0x5CBB, 0x9BAD, 0x5CB6, 0x9BAE, 0x5CBC, 0x9BAF, 0x5CB7, - 0x9BB0, 0x5CC5, 0x9BB1, 0x5CBE, 0x9BB2, 0x5CC7, 0x9BB3, 0x5CD9, - 0x9BB4, 0x5CE9, 0x9BB5, 0x5CFD, 0x9BB6, 0x5CFA, 0x9BB7, 0x5CED, - 0x9BB8, 0x5D8C, 0x9BB9, 0x5CEA, 0x9BBA, 0x5D0B, 0x9BBB, 0x5D15, - 0x9BBC, 0x5D17, 0x9BBD, 0x5D5C, 0x9BBE, 0x5D1F, 0x9BBF, 0x5D1B, - 0x9BC0, 0x5D11, 0x9BC1, 0x5D14, 0x9BC2, 0x5D22, 0x9BC3, 0x5D1A, - 0x9BC4, 0x5D19, 0x9BC5, 0x5D18, 0x9BC6, 0x5D4C, 0x9BC7, 0x5D52, - 0x9BC8, 0x5D4E, 0x9BC9, 0x5D4B, 0x9BCA, 0x5D6C, 0x9BCB, 0x5D73, - 0x9BCC, 0x5D76, 0x9BCD, 0x5D87, 0x9BCE, 0x5D84, 0x9BCF, 0x5D82, - 0x9BD0, 0x5DA2, 0x9BD1, 0x5D9D, 0x9BD2, 0x5DAC, 0x9BD3, 0x5DAE, - 0x9BD4, 0x5DBD, 0x9BD5, 0x5D90, 0x9BD6, 0x5DB7, 0x9BD7, 0x5DBC, - 0x9BD8, 0x5DC9, 0x9BD9, 0x5DCD, 0x9BDA, 0x5DD3, 0x9BDB, 0x5DD2, - 0x9BDC, 0x5DD6, 0x9BDD, 0x5DDB, 0x9BDE, 0x5DEB, 0x9BDF, 0x5DF2, - 0x9BE0, 0x5DF5, 0x9BE1, 0x5E0B, 0x9BE2, 0x5E1A, 0x9BE3, 0x5E19, - 0x9BE4, 0x5E11, 0x9BE5, 0x5E1B, 0x9BE6, 0x5E36, 0x9BE7, 0x5E37, - 0x9BE8, 0x5E44, 0x9BE9, 0x5E43, 0x9BEA, 0x5E40, 0x9BEB, 0x5E4E, - 0x9BEC, 0x5E57, 0x9BED, 0x5E54, 0x9BEE, 0x5E5F, 0x9BEF, 0x5E62, - 0x9BF0, 0x5E64, 0x9BF1, 0x5E47, 0x9BF2, 0x5E75, 0x9BF3, 0x5E76, - 0x9BF4, 0x5E7A, 0x9BF5, 0x9EBC, 0x9BF6, 0x5E7F, 0x9BF7, 0x5EA0, - 0x9BF8, 0x5EC1, 0x9BF9, 0x5EC2, 0x9BFA, 0x5EC8, 0x9BFB, 0x5ED0, - 0x9BFC, 0x5ECF, 0x9C40, 0x5ED6, 0x9C41, 0x5EE3, 0x9C42, 0x5EDD, - 0x9C43, 0x5EDA, 0x9C44, 0x5EDB, 0x9C45, 0x5EE2, 0x9C46, 0x5EE1, - 0x9C47, 0x5EE8, 0x9C48, 0x5EE9, 0x9C49, 0x5EEC, 0x9C4A, 0x5EF1, - 0x9C4B, 0x5EF3, 0x9C4C, 0x5EF0, 0x9C4D, 0x5EF4, 0x9C4E, 0x5EF8, - 0x9C4F, 0x5EFE, 0x9C50, 0x5F03, 0x9C51, 0x5F09, 0x9C52, 0x5F5D, - 0x9C53, 0x5F5C, 0x9C54, 0x5F0B, 0x9C55, 0x5F11, 0x9C56, 0x5F16, - 0x9C57, 0x5F29, 0x9C58, 0x5F2D, 0x9C59, 0x5F38, 0x9C5A, 0x5F41, - 0x9C5B, 0x5F48, 0x9C5C, 0x5F4C, 0x9C5D, 0x5F4E, 0x9C5E, 0x5F2F, - 0x9C5F, 0x5F51, 0x9C60, 0x5F56, 0x9C61, 0x5F57, 0x9C62, 0x5F59, - 0x9C63, 0x5F61, 0x9C64, 0x5F6D, 0x9C65, 0x5F73, 0x9C66, 0x5F77, - 0x9C67, 0x5F83, 0x9C68, 0x5F82, 0x9C69, 0x5F7F, 0x9C6A, 0x5F8A, - 0x9C6B, 0x5F88, 0x9C6C, 0x5F91, 0x9C6D, 0x5F87, 0x9C6E, 0x5F9E, - 0x9C6F, 0x5F99, 0x9C70, 0x5F98, 0x9C71, 0x5FA0, 0x9C72, 0x5FA8, - 0x9C73, 0x5FAD, 0x9C74, 0x5FBC, 0x9C75, 0x5FD6, 0x9C76, 0x5FFB, - 0x9C77, 0x5FE4, 0x9C78, 0x5FF8, 0x9C79, 0x5FF1, 0x9C7A, 0x5FDD, - 0x9C7B, 0x60B3, 0x9C7C, 0x5FFF, 0x9C7D, 0x6021, 0x9C7E, 0x6060, - 0x9C80, 0x6019, 0x9C81, 0x6010, 0x9C82, 0x6029, 0x9C83, 0x600E, - 0x9C84, 0x6031, 0x9C85, 0x601B, 0x9C86, 0x6015, 0x9C87, 0x602B, - 0x9C88, 0x6026, 0x9C89, 0x600F, 0x9C8A, 0x603A, 0x9C8B, 0x605A, - 0x9C8C, 0x6041, 0x9C8D, 0x606A, 0x9C8E, 0x6077, 0x9C8F, 0x605F, - 0x9C90, 0x604A, 0x9C91, 0x6046, 0x9C92, 0x604D, 0x9C93, 0x6063, - 0x9C94, 0x6043, 0x9C95, 0x6064, 0x9C96, 0x6042, 0x9C97, 0x606C, - 0x9C98, 0x606B, 0x9C99, 0x6059, 0x9C9A, 0x6081, 0x9C9B, 0x608D, - 0x9C9C, 0x60E7, 0x9C9D, 0x6083, 0x9C9E, 0x609A, 0x9C9F, 0x6084, - 0x9CA0, 0x609B, 0x9CA1, 0x6096, 0x9CA2, 0x6097, 0x9CA3, 0x6092, - 0x9CA4, 0x60A7, 0x9CA5, 0x608B, 0x9CA6, 0x60E1, 0x9CA7, 0x60B8, - 0x9CA8, 0x60E0, 0x9CA9, 0x60D3, 0x9CAA, 0x60B4, 0x9CAB, 0x5FF0, - 0x9CAC, 0x60BD, 0x9CAD, 0x60C6, 0x9CAE, 0x60B5, 0x9CAF, 0x60D8, - 0x9CB0, 0x614D, 0x9CB1, 0x6115, 0x9CB2, 0x6106, 0x9CB3, 0x60F6, - 0x9CB4, 0x60F7, 0x9CB5, 0x6100, 0x9CB6, 0x60F4, 0x9CB7, 0x60FA, - 0x9CB8, 0x6103, 0x9CB9, 0x6121, 0x9CBA, 0x60FB, 0x9CBB, 0x60F1, - 0x9CBC, 0x610D, 0x9CBD, 0x610E, 0x9CBE, 0x6147, 0x9CBF, 0x613E, - 0x9CC0, 0x6128, 0x9CC1, 0x6127, 0x9CC2, 0x614A, 0x9CC3, 0x613F, - 0x9CC4, 0x613C, 0x9CC5, 0x612C, 0x9CC6, 0x6134, 0x9CC7, 0x613D, - 0x9CC8, 0x6142, 0x9CC9, 0x6144, 0x9CCA, 0x6173, 0x9CCB, 0x6177, - 0x9CCC, 0x6158, 0x9CCD, 0x6159, 0x9CCE, 0x615A, 0x9CCF, 0x616B, - 0x9CD0, 0x6174, 0x9CD1, 0x616F, 0x9CD2, 0x6165, 0x9CD3, 0x6171, - 0x9CD4, 0x615F, 0x9CD5, 0x615D, 0x9CD6, 0x6153, 0x9CD7, 0x6175, - 0x9CD8, 0x6199, 0x9CD9, 0x6196, 0x9CDA, 0x6187, 0x9CDB, 0x61AC, - 0x9CDC, 0x6194, 0x9CDD, 0x619A, 0x9CDE, 0x618A, 0x9CDF, 0x6191, - 0x9CE0, 0x61AB, 0x9CE1, 0x61AE, 0x9CE2, 0x61CC, 0x9CE3, 0x61CA, - 0x9CE4, 0x61C9, 0x9CE5, 0x61F7, 0x9CE6, 0x61C8, 0x9CE7, 0x61C3, - 0x9CE8, 0x61C6, 0x9CE9, 0x61BA, 0x9CEA, 0x61CB, 0x9CEB, 0x7F79, - 0x9CEC, 0x61CD, 0x9CED, 0x61E6, 0x9CEE, 0x61E3, 0x9CEF, 0x61F6, - 0x9CF0, 0x61FA, 0x9CF1, 0x61F4, 0x9CF2, 0x61FF, 0x9CF3, 0x61FD, - 0x9CF4, 0x61FC, 0x9CF5, 0x61FE, 0x9CF6, 0x6200, 0x9CF7, 0x6208, - 0x9CF8, 0x6209, 0x9CF9, 0x620D, 0x9CFA, 0x620C, 0x9CFB, 0x6214, - 0x9CFC, 0x621B, 0x9D40, 0x621E, 0x9D41, 0x6221, 0x9D42, 0x622A, - 0x9D43, 0x622E, 0x9D44, 0x6230, 0x9D45, 0x6232, 0x9D46, 0x6233, - 0x9D47, 0x6241, 0x9D48, 0x624E, 0x9D49, 0x625E, 0x9D4A, 0x6263, - 0x9D4B, 0x625B, 0x9D4C, 0x6260, 0x9D4D, 0x6268, 0x9D4E, 0x627C, - 0x9D4F, 0x6282, 0x9D50, 0x6289, 0x9D51, 0x627E, 0x9D52, 0x6292, - 0x9D53, 0x6293, 0x9D54, 0x6296, 0x9D55, 0x62D4, 0x9D56, 0x6283, - 0x9D57, 0x6294, 0x9D58, 0x62D7, 0x9D59, 0x62D1, 0x9D5A, 0x62BB, - 0x9D5B, 0x62CF, 0x9D5C, 0x62FF, 0x9D5D, 0x62C6, 0x9D5E, 0x64D4, - 0x9D5F, 0x62C8, 0x9D60, 0x62DC, 0x9D61, 0x62CC, 0x9D62, 0x62CA, - 0x9D63, 0x62C2, 0x9D64, 0x62C7, 0x9D65, 0x629B, 0x9D66, 0x62C9, - 0x9D67, 0x630C, 0x9D68, 0x62EE, 0x9D69, 0x62F1, 0x9D6A, 0x6327, - 0x9D6B, 0x6302, 0x9D6C, 0x6308, 0x9D6D, 0x62EF, 0x9D6E, 0x62F5, - 0x9D6F, 0x6350, 0x9D70, 0x633E, 0x9D71, 0x634D, 0x9D72, 0x641C, - 0x9D73, 0x634F, 0x9D74, 0x6396, 0x9D75, 0x638E, 0x9D76, 0x6380, - 0x9D77, 0x63AB, 0x9D78, 0x6376, 0x9D79, 0x63A3, 0x9D7A, 0x638F, - 0x9D7B, 0x6389, 0x9D7C, 0x639F, 0x9D7D, 0x63B5, 0x9D7E, 0x636B, - 0x9D80, 0x6369, 0x9D81, 0x63BE, 0x9D82, 0x63E9, 0x9D83, 0x63C0, - 0x9D84, 0x63C6, 0x9D85, 0x63E3, 0x9D86, 0x63C9, 0x9D87, 0x63D2, - 0x9D88, 0x63F6, 0x9D89, 0x63C4, 0x9D8A, 0x6416, 0x9D8B, 0x6434, - 0x9D8C, 0x6406, 0x9D8D, 0x6413, 0x9D8E, 0x6426, 0x9D8F, 0x6436, - 0x9D90, 0x651D, 0x9D91, 0x6417, 0x9D92, 0x6428, 0x9D93, 0x640F, - 0x9D94, 0x6467, 0x9D95, 0x646F, 0x9D96, 0x6476, 0x9D97, 0x644E, - 0x9D98, 0x652A, 0x9D99, 0x6495, 0x9D9A, 0x6493, 0x9D9B, 0x64A5, - 0x9D9C, 0x64A9, 0x9D9D, 0x6488, 0x9D9E, 0x64BC, 0x9D9F, 0x64DA, - 0x9DA0, 0x64D2, 0x9DA1, 0x64C5, 0x9DA2, 0x64C7, 0x9DA3, 0x64BB, - 0x9DA4, 0x64D8, 0x9DA5, 0x64C2, 0x9DA6, 0x64F1, 0x9DA7, 0x64E7, - 0x9DA8, 0x8209, 0x9DA9, 0x64E0, 0x9DAA, 0x64E1, 0x9DAB, 0x62AC, - 0x9DAC, 0x64E3, 0x9DAD, 0x64EF, 0x9DAE, 0x652C, 0x9DAF, 0x64F6, - 0x9DB0, 0x64F4, 0x9DB1, 0x64F2, 0x9DB2, 0x64FA, 0x9DB3, 0x6500, - 0x9DB4, 0x64FD, 0x9DB5, 0x6518, 0x9DB6, 0x651C, 0x9DB7, 0x6505, - 0x9DB8, 0x6524, 0x9DB9, 0x6523, 0x9DBA, 0x652B, 0x9DBB, 0x6534, - 0x9DBC, 0x6535, 0x9DBD, 0x6537, 0x9DBE, 0x6536, 0x9DBF, 0x6538, - 0x9DC0, 0x754B, 0x9DC1, 0x6548, 0x9DC2, 0x6556, 0x9DC3, 0x6555, - 0x9DC4, 0x654D, 0x9DC5, 0x6558, 0x9DC6, 0x655E, 0x9DC7, 0x655D, - 0x9DC8, 0x6572, 0x9DC9, 0x6578, 0x9DCA, 0x6582, 0x9DCB, 0x6583, - 0x9DCC, 0x8B8A, 0x9DCD, 0x659B, 0x9DCE, 0x659F, 0x9DCF, 0x65AB, - 0x9DD0, 0x65B7, 0x9DD1, 0x65C3, 0x9DD2, 0x65C6, 0x9DD3, 0x65C1, - 0x9DD4, 0x65C4, 0x9DD5, 0x65CC, 0x9DD6, 0x65D2, 0x9DD7, 0x65DB, - 0x9DD8, 0x65D9, 0x9DD9, 0x65E0, 0x9DDA, 0x65E1, 0x9DDB, 0x65F1, - 0x9DDC, 0x6772, 0x9DDD, 0x660A, 0x9DDE, 0x6603, 0x9DDF, 0x65FB, - 0x9DE0, 0x6773, 0x9DE1, 0x6635, 0x9DE2, 0x6636, 0x9DE3, 0x6634, - 0x9DE4, 0x661C, 0x9DE5, 0x664F, 0x9DE6, 0x6644, 0x9DE7, 0x6649, - 0x9DE8, 0x6641, 0x9DE9, 0x665E, 0x9DEA, 0x665D, 0x9DEB, 0x6664, - 0x9DEC, 0x6667, 0x9DED, 0x6668, 0x9DEE, 0x665F, 0x9DEF, 0x6662, - 0x9DF0, 0x6670, 0x9DF1, 0x6683, 0x9DF2, 0x6688, 0x9DF3, 0x668E, - 0x9DF4, 0x6689, 0x9DF5, 0x6684, 0x9DF6, 0x6698, 0x9DF7, 0x669D, - 0x9DF8, 0x66C1, 0x9DF9, 0x66B9, 0x9DFA, 0x66C9, 0x9DFB, 0x66BE, - 0x9DFC, 0x66BC, 0x9E40, 0x66C4, 0x9E41, 0x66B8, 0x9E42, 0x66D6, - 0x9E43, 0x66DA, 0x9E44, 0x66E0, 0x9E45, 0x663F, 0x9E46, 0x66E6, - 0x9E47, 0x66E9, 0x9E48, 0x66F0, 0x9E49, 0x66F5, 0x9E4A, 0x66F7, - 0x9E4B, 0x670F, 0x9E4C, 0x6716, 0x9E4D, 0x671E, 0x9E4E, 0x6726, - 0x9E4F, 0x6727, 0x9E50, 0x9738, 0x9E51, 0x672E, 0x9E52, 0x673F, - 0x9E53, 0x6736, 0x9E54, 0x6741, 0x9E55, 0x6738, 0x9E56, 0x6737, - 0x9E57, 0x6746, 0x9E58, 0x675E, 0x9E59, 0x6760, 0x9E5A, 0x6759, - 0x9E5B, 0x6763, 0x9E5C, 0x6764, 0x9E5D, 0x6789, 0x9E5E, 0x6770, - 0x9E5F, 0x67A9, 0x9E60, 0x677C, 0x9E61, 0x676A, 0x9E62, 0x678C, - 0x9E63, 0x678B, 0x9E64, 0x67A6, 0x9E65, 0x67A1, 0x9E66, 0x6785, - 0x9E67, 0x67B7, 0x9E68, 0x67EF, 0x9E69, 0x67B4, 0x9E6A, 0x67EC, - 0x9E6B, 0x67B3, 0x9E6C, 0x67E9, 0x9E6D, 0x67B8, 0x9E6E, 0x67E4, - 0x9E6F, 0x67DE, 0x9E70, 0x67DD, 0x9E71, 0x67E2, 0x9E72, 0x67EE, - 0x9E73, 0x67B9, 0x9E74, 0x67CE, 0x9E75, 0x67C6, 0x9E76, 0x67E7, - 0x9E77, 0x6A9C, 0x9E78, 0x681E, 0x9E79, 0x6846, 0x9E7A, 0x6829, - 0x9E7B, 0x6840, 0x9E7C, 0x684D, 0x9E7D, 0x6832, 0x9E7E, 0x684E, - 0x9E80, 0x68B3, 0x9E81, 0x682B, 0x9E82, 0x6859, 0x9E83, 0x6863, - 0x9E84, 0x6877, 0x9E85, 0x687F, 0x9E86, 0x689F, 0x9E87, 0x688F, - 0x9E88, 0x68AD, 0x9E89, 0x6894, 0x9E8A, 0x689D, 0x9E8B, 0x689B, - 0x9E8C, 0x6883, 0x9E8D, 0x6AAE, 0x9E8E, 0x68B9, 0x9E8F, 0x6874, - 0x9E90, 0x68B5, 0x9E91, 0x68A0, 0x9E92, 0x68BA, 0x9E93, 0x690F, - 0x9E94, 0x688D, 0x9E95, 0x687E, 0x9E96, 0x6901, 0x9E97, 0x68CA, - 0x9E98, 0x6908, 0x9E99, 0x68D8, 0x9E9A, 0x6922, 0x9E9B, 0x6926, - 0x9E9C, 0x68E1, 0x9E9D, 0x690C, 0x9E9E, 0x68CD, 0x9E9F, 0x68D4, - 0x9EA0, 0x68E7, 0x9EA1, 0x68D5, 0x9EA2, 0x6936, 0x9EA3, 0x6912, - 0x9EA4, 0x6904, 0x9EA5, 0x68D7, 0x9EA6, 0x68E3, 0x9EA7, 0x6925, - 0x9EA8, 0x68F9, 0x9EA9, 0x68E0, 0x9EAA, 0x68EF, 0x9EAB, 0x6928, - 0x9EAC, 0x692A, 0x9EAD, 0x691A, 0x9EAE, 0x6923, 0x9EAF, 0x6921, - 0x9EB0, 0x68C6, 0x9EB1, 0x6979, 0x9EB2, 0x6977, 0x9EB3, 0x695C, - 0x9EB4, 0x6978, 0x9EB5, 0x696B, 0x9EB6, 0x6954, 0x9EB7, 0x697E, - 0x9EB8, 0x696E, 0x9EB9, 0x6939, 0x9EBA, 0x6974, 0x9EBB, 0x693D, - 0x9EBC, 0x6959, 0x9EBD, 0x6930, 0x9EBE, 0x6961, 0x9EBF, 0x695E, - 0x9EC0, 0x695D, 0x9EC1, 0x6981, 0x9EC2, 0x696A, 0x9EC3, 0x69B2, - 0x9EC4, 0x69AE, 0x9EC5, 0x69D0, 0x9EC6, 0x69BF, 0x9EC7, 0x69C1, - 0x9EC8, 0x69D3, 0x9EC9, 0x69BE, 0x9ECA, 0x69CE, 0x9ECB, 0x5BE8, - 0x9ECC, 0x69CA, 0x9ECD, 0x69DD, 0x9ECE, 0x69BB, 0x9ECF, 0x69C3, - 0x9ED0, 0x69A7, 0x9ED1, 0x6A2E, 0x9ED2, 0x6991, 0x9ED3, 0x69A0, - 0x9ED4, 0x699C, 0x9ED5, 0x6995, 0x9ED6, 0x69B4, 0x9ED7, 0x69DE, - 0x9ED8, 0x69E8, 0x9ED9, 0x6A02, 0x9EDA, 0x6A1B, 0x9EDB, 0x69FF, - 0x9EDC, 0x6B0A, 0x9EDD, 0x69F9, 0x9EDE, 0x69F2, 0x9EDF, 0x69E7, - 0x9EE0, 0x6A05, 0x9EE1, 0x69B1, 0x9EE2, 0x6A1E, 0x9EE3, 0x69ED, - 0x9EE4, 0x6A14, 0x9EE5, 0x69EB, 0x9EE6, 0x6A0A, 0x9EE7, 0x6A12, - 0x9EE8, 0x6AC1, 0x9EE9, 0x6A23, 0x9EEA, 0x6A13, 0x9EEB, 0x6A44, - 0x9EEC, 0x6A0C, 0x9EED, 0x6A72, 0x9EEE, 0x6A36, 0x9EEF, 0x6A78, - 0x9EF0, 0x6A47, 0x9EF1, 0x6A62, 0x9EF2, 0x6A59, 0x9EF3, 0x6A66, - 0x9EF4, 0x6A48, 0x9EF5, 0x6A38, 0x9EF6, 0x6A22, 0x9EF7, 0x6A90, - 0x9EF8, 0x6A8D, 0x9EF9, 0x6AA0, 0x9EFA, 0x6A84, 0x9EFB, 0x6AA2, - 0x9EFC, 0x6AA3, 0x9F40, 0x6A97, 0x9F41, 0x8617, 0x9F42, 0x6ABB, - 0x9F43, 0x6AC3, 0x9F44, 0x6AC2, 0x9F45, 0x6AB8, 0x9F46, 0x6AB3, - 0x9F47, 0x6AAC, 0x9F48, 0x6ADE, 0x9F49, 0x6AD1, 0x9F4A, 0x6ADF, - 0x9F4B, 0x6AAA, 0x9F4C, 0x6ADA, 0x9F4D, 0x6AEA, 0x9F4E, 0x6AFB, - 0x9F4F, 0x6B05, 0x9F50, 0x8616, 0x9F51, 0x6AFA, 0x9F52, 0x6B12, - 0x9F53, 0x6B16, 0x9F54, 0x9B31, 0x9F55, 0x6B1F, 0x9F56, 0x6B38, - 0x9F57, 0x6B37, 0x9F58, 0x76DC, 0x9F59, 0x6B39, 0x9F5A, 0x98EE, - 0x9F5B, 0x6B47, 0x9F5C, 0x6B43, 0x9F5D, 0x6B49, 0x9F5E, 0x6B50, - 0x9F5F, 0x6B59, 0x9F60, 0x6B54, 0x9F61, 0x6B5B, 0x9F62, 0x6B5F, - 0x9F63, 0x6B61, 0x9F64, 0x6B78, 0x9F65, 0x6B79, 0x9F66, 0x6B7F, - 0x9F67, 0x6B80, 0x9F68, 0x6B84, 0x9F69, 0x6B83, 0x9F6A, 0x6B8D, - 0x9F6B, 0x6B98, 0x9F6C, 0x6B95, 0x9F6D, 0x6B9E, 0x9F6E, 0x6BA4, - 0x9F6F, 0x6BAA, 0x9F70, 0x6BAB, 0x9F71, 0x6BAF, 0x9F72, 0x6BB2, - 0x9F73, 0x6BB1, 0x9F74, 0x6BB3, 0x9F75, 0x6BB7, 0x9F76, 0x6BBC, - 0x9F77, 0x6BC6, 0x9F78, 0x6BCB, 0x9F79, 0x6BD3, 0x9F7A, 0x6BDF, - 0x9F7B, 0x6BEC, 0x9F7C, 0x6BEB, 0x9F7D, 0x6BF3, 0x9F7E, 0x6BEF, - 0x9F80, 0x9EBE, 0x9F81, 0x6C08, 0x9F82, 0x6C13, 0x9F83, 0x6C14, - 0x9F84, 0x6C1B, 0x9F85, 0x6C24, 0x9F86, 0x6C23, 0x9F87, 0x6C5E, - 0x9F88, 0x6C55, 0x9F89, 0x6C62, 0x9F8A, 0x6C6A, 0x9F8B, 0x6C82, - 0x9F8C, 0x6C8D, 0x9F8D, 0x6C9A, 0x9F8E, 0x6C81, 0x9F8F, 0x6C9B, - 0x9F90, 0x6C7E, 0x9F91, 0x6C68, 0x9F92, 0x6C73, 0x9F93, 0x6C92, - 0x9F94, 0x6C90, 0x9F95, 0x6CC4, 0x9F96, 0x6CF1, 0x9F97, 0x6CD3, - 0x9F98, 0x6CBD, 0x9F99, 0x6CD7, 0x9F9A, 0x6CC5, 0x9F9B, 0x6CDD, - 0x9F9C, 0x6CAE, 0x9F9D, 0x6CB1, 0x9F9E, 0x6CBE, 0x9F9F, 0x6CBA, - 0x9FA0, 0x6CDB, 0x9FA1, 0x6CEF, 0x9FA2, 0x6CD9, 0x9FA3, 0x6CEA, - 0x9FA4, 0x6D1F, 0x9FA5, 0x884D, 0x9FA6, 0x6D36, 0x9FA7, 0x6D2B, - 0x9FA8, 0x6D3D, 0x9FA9, 0x6D38, 0x9FAA, 0x6D19, 0x9FAB, 0x6D35, - 0x9FAC, 0x6D33, 0x9FAD, 0x6D12, 0x9FAE, 0x6D0C, 0x9FAF, 0x6D63, - 0x9FB0, 0x6D93, 0x9FB1, 0x6D64, 0x9FB2, 0x6D5A, 0x9FB3, 0x6D79, - 0x9FB4, 0x6D59, 0x9FB5, 0x6D8E, 0x9FB6, 0x6D95, 0x9FB7, 0x6FE4, - 0x9FB8, 0x6D85, 0x9FB9, 0x6DF9, 0x9FBA, 0x6E15, 0x9FBB, 0x6E0A, - 0x9FBC, 0x6DB5, 0x9FBD, 0x6DC7, 0x9FBE, 0x6DE6, 0x9FBF, 0x6DB8, - 0x9FC0, 0x6DC6, 0x9FC1, 0x6DEC, 0x9FC2, 0x6DDE, 0x9FC3, 0x6DCC, - 0x9FC4, 0x6DE8, 0x9FC5, 0x6DD2, 0x9FC6, 0x6DC5, 0x9FC7, 0x6DFA, - 0x9FC8, 0x6DD9, 0x9FC9, 0x6DE4, 0x9FCA, 0x6DD5, 0x9FCB, 0x6DEA, - 0x9FCC, 0x6DEE, 0x9FCD, 0x6E2D, 0x9FCE, 0x6E6E, 0x9FCF, 0x6E2E, - 0x9FD0, 0x6E19, 0x9FD1, 0x6E72, 0x9FD2, 0x6E5F, 0x9FD3, 0x6E3E, - 0x9FD4, 0x6E23, 0x9FD5, 0x6E6B, 0x9FD6, 0x6E2B, 0x9FD7, 0x6E76, - 0x9FD8, 0x6E4D, 0x9FD9, 0x6E1F, 0x9FDA, 0x6E43, 0x9FDB, 0x6E3A, - 0x9FDC, 0x6E4E, 0x9FDD, 0x6E24, 0x9FDE, 0x6EFF, 0x9FDF, 0x6E1D, - 0x9FE0, 0x6E38, 0x9FE1, 0x6E82, 0x9FE2, 0x6EAA, 0x9FE3, 0x6E98, - 0x9FE4, 0x6EC9, 0x9FE5, 0x6EB7, 0x9FE6, 0x6ED3, 0x9FE7, 0x6EBD, - 0x9FE8, 0x6EAF, 0x9FE9, 0x6EC4, 0x9FEA, 0x6EB2, 0x9FEB, 0x6ED4, - 0x9FEC, 0x6ED5, 0x9FED, 0x6E8F, 0x9FEE, 0x6EA5, 0x9FEF, 0x6EC2, - 0x9FF0, 0x6E9F, 0x9FF1, 0x6F41, 0x9FF2, 0x6F11, 0x9FF3, 0x704C, - 0x9FF4, 0x6EEC, 0x9FF5, 0x6EF8, 0x9FF6, 0x6EFE, 0x9FF7, 0x6F3F, - 0x9FF8, 0x6EF2, 0x9FF9, 0x6F31, 0x9FFA, 0x6EEF, 0x9FFB, 0x6F32, - 0x9FFC, 0x6ECC, 0xE040, 0x6F3E, 0xE041, 0x6F13, 0xE042, 0x6EF7, - 0xE043, 0x6F86, 0xE044, 0x6F7A, 0xE045, 0x6F78, 0xE046, 0x6F81, - 0xE047, 0x6F80, 0xE048, 0x6F6F, 0xE049, 0x6F5B, 0xE04A, 0x6FF3, - 0xE04B, 0x6F6D, 0xE04C, 0x6F82, 0xE04D, 0x6F7C, 0xE04E, 0x6F58, - 0xE04F, 0x6F8E, 0xE050, 0x6F91, 0xE051, 0x6FC2, 0xE052, 0x6F66, - 0xE053, 0x6FB3, 0xE054, 0x6FA3, 0xE055, 0x6FA1, 0xE056, 0x6FA4, - 0xE057, 0x6FB9, 0xE058, 0x6FC6, 0xE059, 0x6FAA, 0xE05A, 0x6FDF, - 0xE05B, 0x6FD5, 0xE05C, 0x6FEC, 0xE05D, 0x6FD4, 0xE05E, 0x6FD8, - 0xE05F, 0x6FF1, 0xE060, 0x6FEE, 0xE061, 0x6FDB, 0xE062, 0x7009, - 0xE063, 0x700B, 0xE064, 0x6FFA, 0xE065, 0x7011, 0xE066, 0x7001, - 0xE067, 0x700F, 0xE068, 0x6FFE, 0xE069, 0x701B, 0xE06A, 0x701A, - 0xE06B, 0x6F74, 0xE06C, 0x701D, 0xE06D, 0x7018, 0xE06E, 0x701F, - 0xE06F, 0x7030, 0xE070, 0x703E, 0xE071, 0x7032, 0xE072, 0x7051, - 0xE073, 0x7063, 0xE074, 0x7099, 0xE075, 0x7092, 0xE076, 0x70AF, - 0xE077, 0x70F1, 0xE078, 0x70AC, 0xE079, 0x70B8, 0xE07A, 0x70B3, - 0xE07B, 0x70AE, 0xE07C, 0x70DF, 0xE07D, 0x70CB, 0xE07E, 0x70DD, - 0xE080, 0x70D9, 0xE081, 0x7109, 0xE082, 0x70FD, 0xE083, 0x711C, - 0xE084, 0x7119, 0xE085, 0x7165, 0xE086, 0x7155, 0xE087, 0x7188, - 0xE088, 0x7166, 0xE089, 0x7162, 0xE08A, 0x714C, 0xE08B, 0x7156, - 0xE08C, 0x716C, 0xE08D, 0x718F, 0xE08E, 0x71FB, 0xE08F, 0x7184, - 0xE090, 0x7195, 0xE091, 0x71A8, 0xE092, 0x71AC, 0xE093, 0x71D7, - 0xE094, 0x71B9, 0xE095, 0x71BE, 0xE096, 0x71D2, 0xE097, 0x71C9, - 0xE098, 0x71D4, 0xE099, 0x71CE, 0xE09A, 0x71E0, 0xE09B, 0x71EC, - 0xE09C, 0x71E7, 0xE09D, 0x71F5, 0xE09E, 0x71FC, 0xE09F, 0x71F9, - 0xE0A0, 0x71FF, 0xE0A1, 0x720D, 0xE0A2, 0x7210, 0xE0A3, 0x721B, - 0xE0A4, 0x7228, 0xE0A5, 0x722D, 0xE0A6, 0x722C, 0xE0A7, 0x7230, - 0xE0A8, 0x7232, 0xE0A9, 0x723B, 0xE0AA, 0x723C, 0xE0AB, 0x723F, - 0xE0AC, 0x7240, 0xE0AD, 0x7246, 0xE0AE, 0x724B, 0xE0AF, 0x7258, - 0xE0B0, 0x7274, 0xE0B1, 0x727E, 0xE0B2, 0x7282, 0xE0B3, 0x7281, - 0xE0B4, 0x7287, 0xE0B5, 0x7292, 0xE0B6, 0x7296, 0xE0B7, 0x72A2, - 0xE0B8, 0x72A7, 0xE0B9, 0x72B9, 0xE0BA, 0x72B2, 0xE0BB, 0x72C3, - 0xE0BC, 0x72C6, 0xE0BD, 0x72C4, 0xE0BE, 0x72CE, 0xE0BF, 0x72D2, - 0xE0C0, 0x72E2, 0xE0C1, 0x72E0, 0xE0C2, 0x72E1, 0xE0C3, 0x72F9, - 0xE0C4, 0x72F7, 0xE0C5, 0x500F, 0xE0C6, 0x7317, 0xE0C7, 0x730A, - 0xE0C8, 0x731C, 0xE0C9, 0x7316, 0xE0CA, 0x731D, 0xE0CB, 0x7334, - 0xE0CC, 0x732F, 0xE0CD, 0x7329, 0xE0CE, 0x7325, 0xE0CF, 0x733E, - 0xE0D0, 0x734E, 0xE0D1, 0x734F, 0xE0D2, 0x9ED8, 0xE0D3, 0x7357, - 0xE0D4, 0x736A, 0xE0D5, 0x7368, 0xE0D6, 0x7370, 0xE0D7, 0x7378, - 0xE0D8, 0x7375, 0xE0D9, 0x737B, 0xE0DA, 0x737A, 0xE0DB, 0x73C8, - 0xE0DC, 0x73B3, 0xE0DD, 0x73CE, 0xE0DE, 0x73BB, 0xE0DF, 0x73C0, - 0xE0E0, 0x73E5, 0xE0E1, 0x73EE, 0xE0E2, 0x73DE, 0xE0E3, 0x74A2, - 0xE0E4, 0x7405, 0xE0E5, 0x746F, 0xE0E6, 0x7425, 0xE0E7, 0x73F8, - 0xE0E8, 0x7432, 0xE0E9, 0x743A, 0xE0EA, 0x7455, 0xE0EB, 0x743F, - 0xE0EC, 0x745F, 0xE0ED, 0x7459, 0xE0EE, 0x7441, 0xE0EF, 0x745C, - 0xE0F0, 0x7469, 0xE0F1, 0x7470, 0xE0F2, 0x7463, 0xE0F3, 0x746A, - 0xE0F4, 0x7476, 0xE0F5, 0x747E, 0xE0F6, 0x748B, 0xE0F7, 0x749E, - 0xE0F8, 0x74A7, 0xE0F9, 0x74CA, 0xE0FA, 0x74CF, 0xE0FB, 0x74D4, - 0xE0FC, 0x73F1, 0xE140, 0x74E0, 0xE141, 0x74E3, 0xE142, 0x74E7, - 0xE143, 0x74E9, 0xE144, 0x74EE, 0xE145, 0x74F2, 0xE146, 0x74F0, - 0xE147, 0x74F1, 0xE148, 0x74F8, 0xE149, 0x74F7, 0xE14A, 0x7504, - 0xE14B, 0x7503, 0xE14C, 0x7505, 0xE14D, 0x750C, 0xE14E, 0x750E, - 0xE14F, 0x750D, 0xE150, 0x7515, 0xE151, 0x7513, 0xE152, 0x751E, - 0xE153, 0x7526, 0xE154, 0x752C, 0xE155, 0x753C, 0xE156, 0x7544, - 0xE157, 0x754D, 0xE158, 0x754A, 0xE159, 0x7549, 0xE15A, 0x755B, - 0xE15B, 0x7546, 0xE15C, 0x755A, 0xE15D, 0x7569, 0xE15E, 0x7564, - 0xE15F, 0x7567, 0xE160, 0x756B, 0xE161, 0x756D, 0xE162, 0x7578, - 0xE163, 0x7576, 0xE164, 0x7586, 0xE165, 0x7587, 0xE166, 0x7574, - 0xE167, 0x758A, 0xE168, 0x7589, 0xE169, 0x7582, 0xE16A, 0x7594, - 0xE16B, 0x759A, 0xE16C, 0x759D, 0xE16D, 0x75A5, 0xE16E, 0x75A3, - 0xE16F, 0x75C2, 0xE170, 0x75B3, 0xE171, 0x75C3, 0xE172, 0x75B5, - 0xE173, 0x75BD, 0xE174, 0x75B8, 0xE175, 0x75BC, 0xE176, 0x75B1, - 0xE177, 0x75CD, 0xE178, 0x75CA, 0xE179, 0x75D2, 0xE17A, 0x75D9, - 0xE17B, 0x75E3, 0xE17C, 0x75DE, 0xE17D, 0x75FE, 0xE17E, 0x75FF, - 0xE180, 0x75FC, 0xE181, 0x7601, 0xE182, 0x75F0, 0xE183, 0x75FA, - 0xE184, 0x75F2, 0xE185, 0x75F3, 0xE186, 0x760B, 0xE187, 0x760D, - 0xE188, 0x7609, 0xE189, 0x761F, 0xE18A, 0x7627, 0xE18B, 0x7620, - 0xE18C, 0x7621, 0xE18D, 0x7622, 0xE18E, 0x7624, 0xE18F, 0x7634, - 0xE190, 0x7630, 0xE191, 0x763B, 0xE192, 0x7647, 0xE193, 0x7648, - 0xE194, 0x7646, 0xE195, 0x765C, 0xE196, 0x7658, 0xE197, 0x7661, - 0xE198, 0x7662, 0xE199, 0x7668, 0xE19A, 0x7669, 0xE19B, 0x766A, - 0xE19C, 0x7667, 0xE19D, 0x766C, 0xE19E, 0x7670, 0xE19F, 0x7672, - 0xE1A0, 0x7676, 0xE1A1, 0x7678, 0xE1A2, 0x767C, 0xE1A3, 0x7680, - 0xE1A4, 0x7683, 0xE1A5, 0x7688, 0xE1A6, 0x768B, 0xE1A7, 0x768E, - 0xE1A8, 0x7696, 0xE1A9, 0x7693, 0xE1AA, 0x7699, 0xE1AB, 0x769A, - 0xE1AC, 0x76B0, 0xE1AD, 0x76B4, 0xE1AE, 0x76B8, 0xE1AF, 0x76B9, - 0xE1B0, 0x76BA, 0xE1B1, 0x76C2, 0xE1B2, 0x76CD, 0xE1B3, 0x76D6, - 0xE1B4, 0x76D2, 0xE1B5, 0x76DE, 0xE1B6, 0x76E1, 0xE1B7, 0x76E5, - 0xE1B8, 0x76E7, 0xE1B9, 0x76EA, 0xE1BA, 0x862F, 0xE1BB, 0x76FB, - 0xE1BC, 0x7708, 0xE1BD, 0x7707, 0xE1BE, 0x7704, 0xE1BF, 0x7729, - 0xE1C0, 0x7724, 0xE1C1, 0x771E, 0xE1C2, 0x7725, 0xE1C3, 0x7726, - 0xE1C4, 0x771B, 0xE1C5, 0x7737, 0xE1C6, 0x7738, 0xE1C7, 0x7747, - 0xE1C8, 0x775A, 0xE1C9, 0x7768, 0xE1CA, 0x776B, 0xE1CB, 0x775B, - 0xE1CC, 0x7765, 0xE1CD, 0x777F, 0xE1CE, 0x777E, 0xE1CF, 0x7779, - 0xE1D0, 0x778E, 0xE1D1, 0x778B, 0xE1D2, 0x7791, 0xE1D3, 0x77A0, - 0xE1D4, 0x779E, 0xE1D5, 0x77B0, 0xE1D6, 0x77B6, 0xE1D7, 0x77B9, - 0xE1D8, 0x77BF, 0xE1D9, 0x77BC, 0xE1DA, 0x77BD, 0xE1DB, 0x77BB, - 0xE1DC, 0x77C7, 0xE1DD, 0x77CD, 0xE1DE, 0x77D7, 0xE1DF, 0x77DA, - 0xE1E0, 0x77DC, 0xE1E1, 0x77E3, 0xE1E2, 0x77EE, 0xE1E3, 0x77FC, - 0xE1E4, 0x780C, 0xE1E5, 0x7812, 0xE1E6, 0x7926, 0xE1E7, 0x7820, - 0xE1E8, 0x792A, 0xE1E9, 0x7845, 0xE1EA, 0x788E, 0xE1EB, 0x7874, - 0xE1EC, 0x7886, 0xE1ED, 0x787C, 0xE1EE, 0x789A, 0xE1EF, 0x788C, - 0xE1F0, 0x78A3, 0xE1F1, 0x78B5, 0xE1F2, 0x78AA, 0xE1F3, 0x78AF, - 0xE1F4, 0x78D1, 0xE1F5, 0x78C6, 0xE1F6, 0x78CB, 0xE1F7, 0x78D4, - 0xE1F8, 0x78BE, 0xE1F9, 0x78BC, 0xE1FA, 0x78C5, 0xE1FB, 0x78CA, - 0xE1FC, 0x78EC, 0xE240, 0x78E7, 0xE241, 0x78DA, 0xE242, 0x78FD, - 0xE243, 0x78F4, 0xE244, 0x7907, 0xE245, 0x7912, 0xE246, 0x7911, - 0xE247, 0x7919, 0xE248, 0x792C, 0xE249, 0x792B, 0xE24A, 0x7940, - 0xE24B, 0x7960, 0xE24C, 0x7957, 0xE24D, 0x795F, 0xE24E, 0x795A, - 0xE24F, 0x7955, 0xE250, 0x7953, 0xE251, 0x797A, 0xE252, 0x797F, - 0xE253, 0x798A, 0xE254, 0x799D, 0xE255, 0x79A7, 0xE256, 0x9F4B, - 0xE257, 0x79AA, 0xE258, 0x79AE, 0xE259, 0x79B3, 0xE25A, 0x79B9, - 0xE25B, 0x79BA, 0xE25C, 0x79C9, 0xE25D, 0x79D5, 0xE25E, 0x79E7, - 0xE25F, 0x79EC, 0xE260, 0x79E1, 0xE261, 0x79E3, 0xE262, 0x7A08, - 0xE263, 0x7A0D, 0xE264, 0x7A18, 0xE265, 0x7A19, 0xE266, 0x7A20, - 0xE267, 0x7A1F, 0xE268, 0x7980, 0xE269, 0x7A31, 0xE26A, 0x7A3B, - 0xE26B, 0x7A3E, 0xE26C, 0x7A37, 0xE26D, 0x7A43, 0xE26E, 0x7A57, - 0xE26F, 0x7A49, 0xE270, 0x7A61, 0xE271, 0x7A62, 0xE272, 0x7A69, - 0xE273, 0x9F9D, 0xE274, 0x7A70, 0xE275, 0x7A79, 0xE276, 0x7A7D, - 0xE277, 0x7A88, 0xE278, 0x7A97, 0xE279, 0x7A95, 0xE27A, 0x7A98, - 0xE27B, 0x7A96, 0xE27C, 0x7AA9, 0xE27D, 0x7AC8, 0xE27E, 0x7AB0, - 0xE280, 0x7AB6, 0xE281, 0x7AC5, 0xE282, 0x7AC4, 0xE283, 0x7ABF, - 0xE284, 0x9083, 0xE285, 0x7AC7, 0xE286, 0x7ACA, 0xE287, 0x7ACD, - 0xE288, 0x7ACF, 0xE289, 0x7AD5, 0xE28A, 0x7AD3, 0xE28B, 0x7AD9, - 0xE28C, 0x7ADA, 0xE28D, 0x7ADD, 0xE28E, 0x7AE1, 0xE28F, 0x7AE2, - 0xE290, 0x7AE6, 0xE291, 0x7AED, 0xE292, 0x7AF0, 0xE293, 0x7B02, - 0xE294, 0x7B0F, 0xE295, 0x7B0A, 0xE296, 0x7B06, 0xE297, 0x7B33, - 0xE298, 0x7B18, 0xE299, 0x7B19, 0xE29A, 0x7B1E, 0xE29B, 0x7B35, - 0xE29C, 0x7B28, 0xE29D, 0x7B36, 0xE29E, 0x7B50, 0xE29F, 0x7B7A, - 0xE2A0, 0x7B04, 0xE2A1, 0x7B4D, 0xE2A2, 0x7B0B, 0xE2A3, 0x7B4C, - 0xE2A4, 0x7B45, 0xE2A5, 0x7B75, 0xE2A6, 0x7B65, 0xE2A7, 0x7B74, - 0xE2A8, 0x7B67, 0xE2A9, 0x7B70, 0xE2AA, 0x7B71, 0xE2AB, 0x7B6C, - 0xE2AC, 0x7B6E, 0xE2AD, 0x7B9D, 0xE2AE, 0x7B98, 0xE2AF, 0x7B9F, - 0xE2B0, 0x7B8D, 0xE2B1, 0x7B9C, 0xE2B2, 0x7B9A, 0xE2B3, 0x7B8B, - 0xE2B4, 0x7B92, 0xE2B5, 0x7B8F, 0xE2B6, 0x7B5D, 0xE2B7, 0x7B99, - 0xE2B8, 0x7BCB, 0xE2B9, 0x7BC1, 0xE2BA, 0x7BCC, 0xE2BB, 0x7BCF, - 0xE2BC, 0x7BB4, 0xE2BD, 0x7BC6, 0xE2BE, 0x7BDD, 0xE2BF, 0x7BE9, - 0xE2C0, 0x7C11, 0xE2C1, 0x7C14, 0xE2C2, 0x7BE6, 0xE2C3, 0x7BE5, - 0xE2C4, 0x7C60, 0xE2C5, 0x7C00, 0xE2C6, 0x7C07, 0xE2C7, 0x7C13, - 0xE2C8, 0x7BF3, 0xE2C9, 0x7BF7, 0xE2CA, 0x7C17, 0xE2CB, 0x7C0D, - 0xE2CC, 0x7BF6, 0xE2CD, 0x7C23, 0xE2CE, 0x7C27, 0xE2CF, 0x7C2A, - 0xE2D0, 0x7C1F, 0xE2D1, 0x7C37, 0xE2D2, 0x7C2B, 0xE2D3, 0x7C3D, - 0xE2D4, 0x7C4C, 0xE2D5, 0x7C43, 0xE2D6, 0x7C54, 0xE2D7, 0x7C4F, - 0xE2D8, 0x7C40, 0xE2D9, 0x7C50, 0xE2DA, 0x7C58, 0xE2DB, 0x7C5F, - 0xE2DC, 0x7C64, 0xE2DD, 0x7C56, 0xE2DE, 0x7C65, 0xE2DF, 0x7C6C, - 0xE2E0, 0x7C75, 0xE2E1, 0x7C83, 0xE2E2, 0x7C90, 0xE2E3, 0x7CA4, - 0xE2E4, 0x7CAD, 0xE2E5, 0x7CA2, 0xE2E6, 0x7CAB, 0xE2E7, 0x7CA1, - 0xE2E8, 0x7CA8, 0xE2E9, 0x7CB3, 0xE2EA, 0x7CB2, 0xE2EB, 0x7CB1, - 0xE2EC, 0x7CAE, 0xE2ED, 0x7CB9, 0xE2EE, 0x7CBD, 0xE2EF, 0x7CC0, - 0xE2F0, 0x7CC5, 0xE2F1, 0x7CC2, 0xE2F2, 0x7CD8, 0xE2F3, 0x7CD2, - 0xE2F4, 0x7CDC, 0xE2F5, 0x7CE2, 0xE2F6, 0x9B3B, 0xE2F7, 0x7CEF, - 0xE2F8, 0x7CF2, 0xE2F9, 0x7CF4, 0xE2FA, 0x7CF6, 0xE2FB, 0x7CFA, - 0xE2FC, 0x7D06, 0xE340, 0x7D02, 0xE341, 0x7D1C, 0xE342, 0x7D15, - 0xE343, 0x7D0A, 0xE344, 0x7D45, 0xE345, 0x7D4B, 0xE346, 0x7D2E, - 0xE347, 0x7D32, 0xE348, 0x7D3F, 0xE349, 0x7D35, 0xE34A, 0x7D46, - 0xE34B, 0x7D73, 0xE34C, 0x7D56, 0xE34D, 0x7D4E, 0xE34E, 0x7D72, - 0xE34F, 0x7D68, 0xE350, 0x7D6E, 0xE351, 0x7D4F, 0xE352, 0x7D63, - 0xE353, 0x7D93, 0xE354, 0x7D89, 0xE355, 0x7D5B, 0xE356, 0x7D8F, - 0xE357, 0x7D7D, 0xE358, 0x7D9B, 0xE359, 0x7DBA, 0xE35A, 0x7DAE, - 0xE35B, 0x7DA3, 0xE35C, 0x7DB5, 0xE35D, 0x7DC7, 0xE35E, 0x7DBD, - 0xE35F, 0x7DAB, 0xE360, 0x7E3D, 0xE361, 0x7DA2, 0xE362, 0x7DAF, - 0xE363, 0x7DDC, 0xE364, 0x7DB8, 0xE365, 0x7D9F, 0xE366, 0x7DB0, - 0xE367, 0x7DD8, 0xE368, 0x7DDD, 0xE369, 0x7DE4, 0xE36A, 0x7DDE, - 0xE36B, 0x7DFB, 0xE36C, 0x7DF2, 0xE36D, 0x7DE1, 0xE36E, 0x7E05, - 0xE36F, 0x7E0A, 0xE370, 0x7E23, 0xE371, 0x7E21, 0xE372, 0x7E12, - 0xE373, 0x7E31, 0xE374, 0x7E1F, 0xE375, 0x7E09, 0xE376, 0x7E0B, - 0xE377, 0x7E22, 0xE378, 0x7E46, 0xE379, 0x7E66, 0xE37A, 0x7E3B, - 0xE37B, 0x7E35, 0xE37C, 0x7E39, 0xE37D, 0x7E43, 0xE37E, 0x7E37, - 0xE380, 0x7E32, 0xE381, 0x7E3A, 0xE382, 0x7E67, 0xE383, 0x7E5D, - 0xE384, 0x7E56, 0xE385, 0x7E5E, 0xE386, 0x7E59, 0xE387, 0x7E5A, - 0xE388, 0x7E79, 0xE389, 0x7E6A, 0xE38A, 0x7E69, 0xE38B, 0x7E7C, - 0xE38C, 0x7E7B, 0xE38D, 0x7E83, 0xE38E, 0x7DD5, 0xE38F, 0x7E7D, - 0xE390, 0x8FAE, 0xE391, 0x7E7F, 0xE392, 0x7E88, 0xE393, 0x7E89, - 0xE394, 0x7E8C, 0xE395, 0x7E92, 0xE396, 0x7E90, 0xE397, 0x7E93, - 0xE398, 0x7E94, 0xE399, 0x7E96, 0xE39A, 0x7E8E, 0xE39B, 0x7E9B, - 0xE39C, 0x7E9C, 0xE39D, 0x7F38, 0xE39E, 0x7F3A, 0xE39F, 0x7F45, - 0xE3A0, 0x7F4C, 0xE3A1, 0x7F4D, 0xE3A2, 0x7F4E, 0xE3A3, 0x7F50, - 0xE3A4, 0x7F51, 0xE3A5, 0x7F55, 0xE3A6, 0x7F54, 0xE3A7, 0x7F58, - 0xE3A8, 0x7F5F, 0xE3A9, 0x7F60, 0xE3AA, 0x7F68, 0xE3AB, 0x7F69, - 0xE3AC, 0x7F67, 0xE3AD, 0x7F78, 0xE3AE, 0x7F82, 0xE3AF, 0x7F86, - 0xE3B0, 0x7F83, 0xE3B1, 0x7F88, 0xE3B2, 0x7F87, 0xE3B3, 0x7F8C, - 0xE3B4, 0x7F94, 0xE3B5, 0x7F9E, 0xE3B6, 0x7F9D, 0xE3B7, 0x7F9A, - 0xE3B8, 0x7FA3, 0xE3B9, 0x7FAF, 0xE3BA, 0x7FB2, 0xE3BB, 0x7FB9, - 0xE3BC, 0x7FAE, 0xE3BD, 0x7FB6, 0xE3BE, 0x7FB8, 0xE3BF, 0x8B71, - 0xE3C0, 0x7FC5, 0xE3C1, 0x7FC6, 0xE3C2, 0x7FCA, 0xE3C3, 0x7FD5, - 0xE3C4, 0x7FD4, 0xE3C5, 0x7FE1, 0xE3C6, 0x7FE6, 0xE3C7, 0x7FE9, - 0xE3C8, 0x7FF3, 0xE3C9, 0x7FF9, 0xE3CA, 0x98DC, 0xE3CB, 0x8006, - 0xE3CC, 0x8004, 0xE3CD, 0x800B, 0xE3CE, 0x8012, 0xE3CF, 0x8018, - 0xE3D0, 0x8019, 0xE3D1, 0x801C, 0xE3D2, 0x8021, 0xE3D3, 0x8028, - 0xE3D4, 0x803F, 0xE3D5, 0x803B, 0xE3D6, 0x804A, 0xE3D7, 0x8046, - 0xE3D8, 0x8052, 0xE3D9, 0x8058, 0xE3DA, 0x805A, 0xE3DB, 0x805F, - 0xE3DC, 0x8062, 0xE3DD, 0x8068, 0xE3DE, 0x8073, 0xE3DF, 0x8072, - 0xE3E0, 0x8070, 0xE3E1, 0x8076, 0xE3E2, 0x8079, 0xE3E3, 0x807D, - 0xE3E4, 0x807F, 0xE3E5, 0x8084, 0xE3E6, 0x8086, 0xE3E7, 0x8085, - 0xE3E8, 0x809B, 0xE3E9, 0x8093, 0xE3EA, 0x809A, 0xE3EB, 0x80AD, - 0xE3EC, 0x5190, 0xE3ED, 0x80AC, 0xE3EE, 0x80DB, 0xE3EF, 0x80E5, - 0xE3F0, 0x80D9, 0xE3F1, 0x80DD, 0xE3F2, 0x80C4, 0xE3F3, 0x80DA, - 0xE3F4, 0x80D6, 0xE3F5, 0x8109, 0xE3F6, 0x80EF, 0xE3F7, 0x80F1, - 0xE3F8, 0x811B, 0xE3F9, 0x8129, 0xE3FA, 0x8123, 0xE3FB, 0x812F, - 0xE3FC, 0x814B, 0xE440, 0x968B, 0xE441, 0x8146, 0xE442, 0x813E, - 0xE443, 0x8153, 0xE444, 0x8151, 0xE445, 0x80FC, 0xE446, 0x8171, - 0xE447, 0x816E, 0xE448, 0x8165, 0xE449, 0x8166, 0xE44A, 0x8174, - 0xE44B, 0x8183, 0xE44C, 0x8188, 0xE44D, 0x818A, 0xE44E, 0x8180, - 0xE44F, 0x8182, 0xE450, 0x81A0, 0xE451, 0x8195, 0xE452, 0x81A4, - 0xE453, 0x81A3, 0xE454, 0x815F, 0xE455, 0x8193, 0xE456, 0x81A9, - 0xE457, 0x81B0, 0xE458, 0x81B5, 0xE459, 0x81BE, 0xE45A, 0x81B8, - 0xE45B, 0x81BD, 0xE45C, 0x81C0, 0xE45D, 0x81C2, 0xE45E, 0x81BA, - 0xE45F, 0x81C9, 0xE460, 0x81CD, 0xE461, 0x81D1, 0xE462, 0x81D9, - 0xE463, 0x81D8, 0xE464, 0x81C8, 0xE465, 0x81DA, 0xE466, 0x81DF, - 0xE467, 0x81E0, 0xE468, 0x81E7, 0xE469, 0x81FA, 0xE46A, 0x81FB, - 0xE46B, 0x81FE, 0xE46C, 0x8201, 0xE46D, 0x8202, 0xE46E, 0x8205, - 0xE46F, 0x8207, 0xE470, 0x820A, 0xE471, 0x820D, 0xE472, 0x8210, - 0xE473, 0x8216, 0xE474, 0x8229, 0xE475, 0x822B, 0xE476, 0x8238, - 0xE477, 0x8233, 0xE478, 0x8240, 0xE479, 0x8259, 0xE47A, 0x8258, - 0xE47B, 0x825D, 0xE47C, 0x825A, 0xE47D, 0x825F, 0xE47E, 0x8264, - 0xE480, 0x8262, 0xE481, 0x8268, 0xE482, 0x826A, 0xE483, 0x826B, - 0xE484, 0x822E, 0xE485, 0x8271, 0xE486, 0x8277, 0xE487, 0x8278, - 0xE488, 0x827E, 0xE489, 0x828D, 0xE48A, 0x8292, 0xE48B, 0x82AB, - 0xE48C, 0x829F, 0xE48D, 0x82BB, 0xE48E, 0x82AC, 0xE48F, 0x82E1, - 0xE490, 0x82E3, 0xE491, 0x82DF, 0xE492, 0x82D2, 0xE493, 0x82F4, - 0xE494, 0x82F3, 0xE495, 0x82FA, 0xE496, 0x8393, 0xE497, 0x8303, - 0xE498, 0x82FB, 0xE499, 0x82F9, 0xE49A, 0x82DE, 0xE49B, 0x8306, - 0xE49C, 0x82DC, 0xE49D, 0x8309, 0xE49E, 0x82D9, 0xE49F, 0x8335, - 0xE4A0, 0x8334, 0xE4A1, 0x8316, 0xE4A2, 0x8332, 0xE4A3, 0x8331, - 0xE4A4, 0x8340, 0xE4A5, 0x8339, 0xE4A6, 0x8350, 0xE4A7, 0x8345, - 0xE4A8, 0x832F, 0xE4A9, 0x832B, 0xE4AA, 0x8317, 0xE4AB, 0x8318, - 0xE4AC, 0x8385, 0xE4AD, 0x839A, 0xE4AE, 0x83AA, 0xE4AF, 0x839F, - 0xE4B0, 0x83A2, 0xE4B1, 0x8396, 0xE4B2, 0x8323, 0xE4B3, 0x838E, - 0xE4B4, 0x8387, 0xE4B5, 0x838A, 0xE4B6, 0x837C, 0xE4B7, 0x83B5, - 0xE4B8, 0x8373, 0xE4B9, 0x8375, 0xE4BA, 0x83A0, 0xE4BB, 0x8389, - 0xE4BC, 0x83A8, 0xE4BD, 0x83F4, 0xE4BE, 0x8413, 0xE4BF, 0x83EB, - 0xE4C0, 0x83CE, 0xE4C1, 0x83FD, 0xE4C2, 0x8403, 0xE4C3, 0x83D8, - 0xE4C4, 0x840B, 0xE4C5, 0x83C1, 0xE4C6, 0x83F7, 0xE4C7, 0x8407, - 0xE4C8, 0x83E0, 0xE4C9, 0x83F2, 0xE4CA, 0x840D, 0xE4CB, 0x8422, - 0xE4CC, 0x8420, 0xE4CD, 0x83BD, 0xE4CE, 0x8438, 0xE4CF, 0x8506, - 0xE4D0, 0x83FB, 0xE4D1, 0x846D, 0xE4D2, 0x842A, 0xE4D3, 0x843C, - 0xE4D4, 0x855A, 0xE4D5, 0x8484, 0xE4D6, 0x8477, 0xE4D7, 0x846B, - 0xE4D8, 0x84AD, 0xE4D9, 0x846E, 0xE4DA, 0x8482, 0xE4DB, 0x8469, - 0xE4DC, 0x8446, 0xE4DD, 0x842C, 0xE4DE, 0x846F, 0xE4DF, 0x8479, - 0xE4E0, 0x8435, 0xE4E1, 0x84CA, 0xE4E2, 0x8462, 0xE4E3, 0x84B9, - 0xE4E4, 0x84BF, 0xE4E5, 0x849F, 0xE4E6, 0x84D9, 0xE4E7, 0x84CD, - 0xE4E8, 0x84BB, 0xE4E9, 0x84DA, 0xE4EA, 0x84D0, 0xE4EB, 0x84C1, - 0xE4EC, 0x84C6, 0xE4ED, 0x84D6, 0xE4EE, 0x84A1, 0xE4EF, 0x8521, - 0xE4F0, 0x84FF, 0xE4F1, 0x84F4, 0xE4F2, 0x8517, 0xE4F3, 0x8518, - 0xE4F4, 0x852C, 0xE4F5, 0x851F, 0xE4F6, 0x8515, 0xE4F7, 0x8514, - 0xE4F8, 0x84FC, 0xE4F9, 0x8540, 0xE4FA, 0x8563, 0xE4FB, 0x8558, - 0xE4FC, 0x8548, 0xE540, 0x8541, 0xE541, 0x8602, 0xE542, 0x854B, - 0xE543, 0x8555, 0xE544, 0x8580, 0xE545, 0x85A4, 0xE546, 0x8588, - 0xE547, 0x8591, 0xE548, 0x858A, 0xE549, 0x85A8, 0xE54A, 0x856D, - 0xE54B, 0x8594, 0xE54C, 0x859B, 0xE54D, 0x85EA, 0xE54E, 0x8587, - 0xE54F, 0x859C, 0xE550, 0x8577, 0xE551, 0x857E, 0xE552, 0x8590, - 0xE553, 0x85C9, 0xE554, 0x85BA, 0xE555, 0x85CF, 0xE556, 0x85B9, - 0xE557, 0x85D0, 0xE558, 0x85D5, 0xE559, 0x85DD, 0xE55A, 0x85E5, - 0xE55B, 0x85DC, 0xE55C, 0x85F9, 0xE55D, 0x860A, 0xE55E, 0x8613, - 0xE55F, 0x860B, 0xE560, 0x85FE, 0xE561, 0x85FA, 0xE562, 0x8606, - 0xE563, 0x8622, 0xE564, 0x861A, 0xE565, 0x8630, 0xE566, 0x863F, - 0xE567, 0x864D, 0xE568, 0x4E55, 0xE569, 0x8654, 0xE56A, 0x865F, - 0xE56B, 0x8667, 0xE56C, 0x8671, 0xE56D, 0x8693, 0xE56E, 0x86A3, - 0xE56F, 0x86A9, 0xE570, 0x86AA, 0xE571, 0x868B, 0xE572, 0x868C, - 0xE573, 0x86B6, 0xE574, 0x86AF, 0xE575, 0x86C4, 0xE576, 0x86C6, - 0xE577, 0x86B0, 0xE578, 0x86C9, 0xE579, 0x8823, 0xE57A, 0x86AB, - 0xE57B, 0x86D4, 0xE57C, 0x86DE, 0xE57D, 0x86E9, 0xE57E, 0x86EC, - 0xE580, 0x86DF, 0xE581, 0x86DB, 0xE582, 0x86EF, 0xE583, 0x8712, - 0xE584, 0x8706, 0xE585, 0x8708, 0xE586, 0x8700, 0xE587, 0x8703, - 0xE588, 0x86FB, 0xE589, 0x8711, 0xE58A, 0x8709, 0xE58B, 0x870D, - 0xE58C, 0x86F9, 0xE58D, 0x870A, 0xE58E, 0x8734, 0xE58F, 0x873F, - 0xE590, 0x8737, 0xE591, 0x873B, 0xE592, 0x8725, 0xE593, 0x8729, - 0xE594, 0x871A, 0xE595, 0x8760, 0xE596, 0x875F, 0xE597, 0x8778, - 0xE598, 0x874C, 0xE599, 0x874E, 0xE59A, 0x8774, 0xE59B, 0x8757, - 0xE59C, 0x8768, 0xE59D, 0x876E, 0xE59E, 0x8759, 0xE59F, 0x8753, - 0xE5A0, 0x8763, 0xE5A1, 0x876A, 0xE5A2, 0x8805, 0xE5A3, 0x87A2, - 0xE5A4, 0x879F, 0xE5A5, 0x8782, 0xE5A6, 0x87AF, 0xE5A7, 0x87CB, - 0xE5A8, 0x87BD, 0xE5A9, 0x87C0, 0xE5AA, 0x87D0, 0xE5AB, 0x96D6, - 0xE5AC, 0x87AB, 0xE5AD, 0x87C4, 0xE5AE, 0x87B3, 0xE5AF, 0x87C7, - 0xE5B0, 0x87C6, 0xE5B1, 0x87BB, 0xE5B2, 0x87EF, 0xE5B3, 0x87F2, - 0xE5B4, 0x87E0, 0xE5B5, 0x880F, 0xE5B6, 0x880D, 0xE5B7, 0x87FE, - 0xE5B8, 0x87F6, 0xE5B9, 0x87F7, 0xE5BA, 0x880E, 0xE5BB, 0x87D2, - 0xE5BC, 0x8811, 0xE5BD, 0x8816, 0xE5BE, 0x8815, 0xE5BF, 0x8822, - 0xE5C0, 0x8821, 0xE5C1, 0x8831, 0xE5C2, 0x8836, 0xE5C3, 0x8839, - 0xE5C4, 0x8827, 0xE5C5, 0x883B, 0xE5C6, 0x8844, 0xE5C7, 0x8842, - 0xE5C8, 0x8852, 0xE5C9, 0x8859, 0xE5CA, 0x885E, 0xE5CB, 0x8862, - 0xE5CC, 0x886B, 0xE5CD, 0x8881, 0xE5CE, 0x887E, 0xE5CF, 0x889E, - 0xE5D0, 0x8875, 0xE5D1, 0x887D, 0xE5D2, 0x88B5, 0xE5D3, 0x8872, - 0xE5D4, 0x8882, 0xE5D5, 0x8897, 0xE5D6, 0x8892, 0xE5D7, 0x88AE, - 0xE5D8, 0x8899, 0xE5D9, 0x88A2, 0xE5DA, 0x888D, 0xE5DB, 0x88A4, - 0xE5DC, 0x88B0, 0xE5DD, 0x88BF, 0xE5DE, 0x88B1, 0xE5DF, 0x88C3, - 0xE5E0, 0x88C4, 0xE5E1, 0x88D4, 0xE5E2, 0x88D8, 0xE5E3, 0x88D9, - 0xE5E4, 0x88DD, 0xE5E5, 0x88F9, 0xE5E6, 0x8902, 0xE5E7, 0x88FC, - 0xE5E8, 0x88F4, 0xE5E9, 0x88E8, 0xE5EA, 0x88F2, 0xE5EB, 0x8904, - 0xE5EC, 0x890C, 0xE5ED, 0x890A, 0xE5EE, 0x8913, 0xE5EF, 0x8943, - 0xE5F0, 0x891E, 0xE5F1, 0x8925, 0xE5F2, 0x892A, 0xE5F3, 0x892B, - 0xE5F4, 0x8941, 0xE5F5, 0x8944, 0xE5F6, 0x893B, 0xE5F7, 0x8936, - 0xE5F8, 0x8938, 0xE5F9, 0x894C, 0xE5FA, 0x891D, 0xE5FB, 0x8960, - 0xE5FC, 0x895E, 0xE640, 0x8966, 0xE641, 0x8964, 0xE642, 0x896D, - 0xE643, 0x896A, 0xE644, 0x896F, 0xE645, 0x8974, 0xE646, 0x8977, - 0xE647, 0x897E, 0xE648, 0x8983, 0xE649, 0x8988, 0xE64A, 0x898A, - 0xE64B, 0x8993, 0xE64C, 0x8998, 0xE64D, 0x89A1, 0xE64E, 0x89A9, - 0xE64F, 0x89A6, 0xE650, 0x89AC, 0xE651, 0x89AF, 0xE652, 0x89B2, - 0xE653, 0x89BA, 0xE654, 0x89BD, 0xE655, 0x89BF, 0xE656, 0x89C0, - 0xE657, 0x89DA, 0xE658, 0x89DC, 0xE659, 0x89DD, 0xE65A, 0x89E7, - 0xE65B, 0x89F4, 0xE65C, 0x89F8, 0xE65D, 0x8A03, 0xE65E, 0x8A16, - 0xE65F, 0x8A10, 0xE660, 0x8A0C, 0xE661, 0x8A1B, 0xE662, 0x8A1D, - 0xE663, 0x8A25, 0xE664, 0x8A36, 0xE665, 0x8A41, 0xE666, 0x8A5B, - 0xE667, 0x8A52, 0xE668, 0x8A46, 0xE669, 0x8A48, 0xE66A, 0x8A7C, - 0xE66B, 0x8A6D, 0xE66C, 0x8A6C, 0xE66D, 0x8A62, 0xE66E, 0x8A85, - 0xE66F, 0x8A82, 0xE670, 0x8A84, 0xE671, 0x8AA8, 0xE672, 0x8AA1, - 0xE673, 0x8A91, 0xE674, 0x8AA5, 0xE675, 0x8AA6, 0xE676, 0x8A9A, - 0xE677, 0x8AA3, 0xE678, 0x8AC4, 0xE679, 0x8ACD, 0xE67A, 0x8AC2, - 0xE67B, 0x8ADA, 0xE67C, 0x8AEB, 0xE67D, 0x8AF3, 0xE67E, 0x8AE7, - 0xE680, 0x8AE4, 0xE681, 0x8AF1, 0xE682, 0x8B14, 0xE683, 0x8AE0, - 0xE684, 0x8AE2, 0xE685, 0x8AF7, 0xE686, 0x8ADE, 0xE687, 0x8ADB, - 0xE688, 0x8B0C, 0xE689, 0x8B07, 0xE68A, 0x8B1A, 0xE68B, 0x8AE1, - 0xE68C, 0x8B16, 0xE68D, 0x8B10, 0xE68E, 0x8B17, 0xE68F, 0x8B20, - 0xE690, 0x8B33, 0xE691, 0x97AB, 0xE692, 0x8B26, 0xE693, 0x8B2B, - 0xE694, 0x8B3E, 0xE695, 0x8B28, 0xE696, 0x8B41, 0xE697, 0x8B4C, - 0xE698, 0x8B4F, 0xE699, 0x8B4E, 0xE69A, 0x8B49, 0xE69B, 0x8B56, - 0xE69C, 0x8B5B, 0xE69D, 0x8B5A, 0xE69E, 0x8B6B, 0xE69F, 0x8B5F, - 0xE6A0, 0x8B6C, 0xE6A1, 0x8B6F, 0xE6A2, 0x8B74, 0xE6A3, 0x8B7D, - 0xE6A4, 0x8B80, 0xE6A5, 0x8B8C, 0xE6A6, 0x8B8E, 0xE6A7, 0x8B92, - 0xE6A8, 0x8B93, 0xE6A9, 0x8B96, 0xE6AA, 0x8B99, 0xE6AB, 0x8B9A, - 0xE6AC, 0x8C3A, 0xE6AD, 0x8C41, 0xE6AE, 0x8C3F, 0xE6AF, 0x8C48, - 0xE6B0, 0x8C4C, 0xE6B1, 0x8C4E, 0xE6B2, 0x8C50, 0xE6B3, 0x8C55, - 0xE6B4, 0x8C62, 0xE6B5, 0x8C6C, 0xE6B6, 0x8C78, 0xE6B7, 0x8C7A, - 0xE6B8, 0x8C82, 0xE6B9, 0x8C89, 0xE6BA, 0x8C85, 0xE6BB, 0x8C8A, - 0xE6BC, 0x8C8D, 0xE6BD, 0x8C8E, 0xE6BE, 0x8C94, 0xE6BF, 0x8C7C, - 0xE6C0, 0x8C98, 0xE6C1, 0x621D, 0xE6C2, 0x8CAD, 0xE6C3, 0x8CAA, - 0xE6C4, 0x8CBD, 0xE6C5, 0x8CB2, 0xE6C6, 0x8CB3, 0xE6C7, 0x8CAE, - 0xE6C8, 0x8CB6, 0xE6C9, 0x8CC8, 0xE6CA, 0x8CC1, 0xE6CB, 0x8CE4, - 0xE6CC, 0x8CE3, 0xE6CD, 0x8CDA, 0xE6CE, 0x8CFD, 0xE6CF, 0x8CFA, - 0xE6D0, 0x8CFB, 0xE6D1, 0x8D04, 0xE6D2, 0x8D05, 0xE6D3, 0x8D0A, - 0xE6D4, 0x8D07, 0xE6D5, 0x8D0F, 0xE6D6, 0x8D0D, 0xE6D7, 0x8D10, - 0xE6D8, 0x9F4E, 0xE6D9, 0x8D13, 0xE6DA, 0x8CCD, 0xE6DB, 0x8D14, - 0xE6DC, 0x8D16, 0xE6DD, 0x8D67, 0xE6DE, 0x8D6D, 0xE6DF, 0x8D71, - 0xE6E0, 0x8D73, 0xE6E1, 0x8D81, 0xE6E2, 0x8D99, 0xE6E3, 0x8DC2, - 0xE6E4, 0x8DBE, 0xE6E5, 0x8DBA, 0xE6E6, 0x8DCF, 0xE6E7, 0x8DDA, - 0xE6E8, 0x8DD6, 0xE6E9, 0x8DCC, 0xE6EA, 0x8DDB, 0xE6EB, 0x8DCB, - 0xE6EC, 0x8DEA, 0xE6ED, 0x8DEB, 0xE6EE, 0x8DDF, 0xE6EF, 0x8DE3, - 0xE6F0, 0x8DFC, 0xE6F1, 0x8E08, 0xE6F2, 0x8E09, 0xE6F3, 0x8DFF, - 0xE6F4, 0x8E1D, 0xE6F5, 0x8E1E, 0xE6F6, 0x8E10, 0xE6F7, 0x8E1F, - 0xE6F8, 0x8E42, 0xE6F9, 0x8E35, 0xE6FA, 0x8E30, 0xE6FB, 0x8E34, - 0xE6FC, 0x8E4A, 0xE740, 0x8E47, 0xE741, 0x8E49, 0xE742, 0x8E4C, - 0xE743, 0x8E50, 0xE744, 0x8E48, 0xE745, 0x8E59, 0xE746, 0x8E64, - 0xE747, 0x8E60, 0xE748, 0x8E2A, 0xE749, 0x8E63, 0xE74A, 0x8E55, - 0xE74B, 0x8E76, 0xE74C, 0x8E72, 0xE74D, 0x8E7C, 0xE74E, 0x8E81, - 0xE74F, 0x8E87, 0xE750, 0x8E85, 0xE751, 0x8E84, 0xE752, 0x8E8B, - 0xE753, 0x8E8A, 0xE754, 0x8E93, 0xE755, 0x8E91, 0xE756, 0x8E94, - 0xE757, 0x8E99, 0xE758, 0x8EAA, 0xE759, 0x8EA1, 0xE75A, 0x8EAC, - 0xE75B, 0x8EB0, 0xE75C, 0x8EC6, 0xE75D, 0x8EB1, 0xE75E, 0x8EBE, - 0xE75F, 0x8EC5, 0xE760, 0x8EC8, 0xE761, 0x8ECB, 0xE762, 0x8EDB, - 0xE763, 0x8EE3, 0xE764, 0x8EFC, 0xE765, 0x8EFB, 0xE766, 0x8EEB, - 0xE767, 0x8EFE, 0xE768, 0x8F0A, 0xE769, 0x8F05, 0xE76A, 0x8F15, - 0xE76B, 0x8F12, 0xE76C, 0x8F19, 0xE76D, 0x8F13, 0xE76E, 0x8F1C, - 0xE76F, 0x8F1F, 0xE770, 0x8F1B, 0xE771, 0x8F0C, 0xE772, 0x8F26, - 0xE773, 0x8F33, 0xE774, 0x8F3B, 0xE775, 0x8F39, 0xE776, 0x8F45, - 0xE777, 0x8F42, 0xE778, 0x8F3E, 0xE779, 0x8F4C, 0xE77A, 0x8F49, - 0xE77B, 0x8F46, 0xE77C, 0x8F4E, 0xE77D, 0x8F57, 0xE77E, 0x8F5C, - 0xE780, 0x8F62, 0xE781, 0x8F63, 0xE782, 0x8F64, 0xE783, 0x8F9C, - 0xE784, 0x8F9F, 0xE785, 0x8FA3, 0xE786, 0x8FAD, 0xE787, 0x8FAF, - 0xE788, 0x8FB7, 0xE789, 0x8FDA, 0xE78A, 0x8FE5, 0xE78B, 0x8FE2, - 0xE78C, 0x8FEA, 0xE78D, 0x8FEF, 0xE78E, 0x9087, 0xE78F, 0x8FF4, - 0xE790, 0x9005, 0xE791, 0x8FF9, 0xE792, 0x8FFA, 0xE793, 0x9011, - 0xE794, 0x9015, 0xE795, 0x9021, 0xE796, 0x900D, 0xE797, 0x901E, - 0xE798, 0x9016, 0xE799, 0x900B, 0xE79A, 0x9027, 0xE79B, 0x9036, - 0xE79C, 0x9035, 0xE79D, 0x9039, 0xE79E, 0x8FF8, 0xE79F, 0x904F, - 0xE7A0, 0x9050, 0xE7A1, 0x9051, 0xE7A2, 0x9052, 0xE7A3, 0x900E, - 0xE7A4, 0x9049, 0xE7A5, 0x903E, 0xE7A6, 0x9056, 0xE7A7, 0x9058, - 0xE7A8, 0x905E, 0xE7A9, 0x9068, 0xE7AA, 0x906F, 0xE7AB, 0x9076, - 0xE7AC, 0x96A8, 0xE7AD, 0x9072, 0xE7AE, 0x9082, 0xE7AF, 0x907D, - 0xE7B0, 0x9081, 0xE7B1, 0x9080, 0xE7B2, 0x908A, 0xE7B3, 0x9089, - 0xE7B4, 0x908F, 0xE7B5, 0x90A8, 0xE7B6, 0x90AF, 0xE7B7, 0x90B1, - 0xE7B8, 0x90B5, 0xE7B9, 0x90E2, 0xE7BA, 0x90E4, 0xE7BB, 0x6248, - 0xE7BC, 0x90DB, 0xE7BD, 0x9102, 0xE7BE, 0x9112, 0xE7BF, 0x9119, - 0xE7C0, 0x9132, 0xE7C1, 0x9130, 0xE7C2, 0x914A, 0xE7C3, 0x9156, - 0xE7C4, 0x9158, 0xE7C5, 0x9163, 0xE7C6, 0x9165, 0xE7C7, 0x9169, - 0xE7C8, 0x9173, 0xE7C9, 0x9172, 0xE7CA, 0x918B, 0xE7CB, 0x9189, - 0xE7CC, 0x9182, 0xE7CD, 0x91A2, 0xE7CE, 0x91AB, 0xE7CF, 0x91AF, - 0xE7D0, 0x91AA, 0xE7D1, 0x91B5, 0xE7D2, 0x91B4, 0xE7D3, 0x91BA, - 0xE7D4, 0x91C0, 0xE7D5, 0x91C1, 0xE7D6, 0x91C9, 0xE7D7, 0x91CB, - 0xE7D8, 0x91D0, 0xE7D9, 0x91D6, 0xE7DA, 0x91DF, 0xE7DB, 0x91E1, - 0xE7DC, 0x91DB, 0xE7DD, 0x91FC, 0xE7DE, 0x91F5, 0xE7DF, 0x91F6, - 0xE7E0, 0x921E, 0xE7E1, 0x91FF, 0xE7E2, 0x9214, 0xE7E3, 0x922C, - 0xE7E4, 0x9215, 0xE7E5, 0x9211, 0xE7E6, 0x925E, 0xE7E7, 0x9257, - 0xE7E8, 0x9245, 0xE7E9, 0x9249, 0xE7EA, 0x9264, 0xE7EB, 0x9248, - 0xE7EC, 0x9295, 0xE7ED, 0x923F, 0xE7EE, 0x924B, 0xE7EF, 0x9250, - 0xE7F0, 0x929C, 0xE7F1, 0x9296, 0xE7F2, 0x9293, 0xE7F3, 0x929B, - 0xE7F4, 0x925A, 0xE7F5, 0x92CF, 0xE7F6, 0x92B9, 0xE7F7, 0x92B7, - 0xE7F8, 0x92E9, 0xE7F9, 0x930F, 0xE7FA, 0x92FA, 0xE7FB, 0x9344, - 0xE7FC, 0x932E, 0xE840, 0x9319, 0xE841, 0x9322, 0xE842, 0x931A, - 0xE843, 0x9323, 0xE844, 0x933A, 0xE845, 0x9335, 0xE846, 0x933B, - 0xE847, 0x935C, 0xE848, 0x9360, 0xE849, 0x937C, 0xE84A, 0x936E, - 0xE84B, 0x9356, 0xE84C, 0x93B0, 0xE84D, 0x93AC, 0xE84E, 0x93AD, - 0xE84F, 0x9394, 0xE850, 0x93B9, 0xE851, 0x93D6, 0xE852, 0x93D7, - 0xE853, 0x93E8, 0xE854, 0x93E5, 0xE855, 0x93D8, 0xE856, 0x93C3, - 0xE857, 0x93DD, 0xE858, 0x93D0, 0xE859, 0x93C8, 0xE85A, 0x93E4, - 0xE85B, 0x941A, 0xE85C, 0x9414, 0xE85D, 0x9413, 0xE85E, 0x9403, - 0xE85F, 0x9407, 0xE860, 0x9410, 0xE861, 0x9436, 0xE862, 0x942B, - 0xE863, 0x9435, 0xE864, 0x9421, 0xE865, 0x943A, 0xE866, 0x9441, - 0xE867, 0x9452, 0xE868, 0x9444, 0xE869, 0x945B, 0xE86A, 0x9460, - 0xE86B, 0x9462, 0xE86C, 0x945E, 0xE86D, 0x946A, 0xE86E, 0x9229, - 0xE86F, 0x9470, 0xE870, 0x9475, 0xE871, 0x9477, 0xE872, 0x947D, - 0xE873, 0x945A, 0xE874, 0x947C, 0xE875, 0x947E, 0xE876, 0x9481, - 0xE877, 0x947F, 0xE878, 0x9582, 0xE879, 0x9587, 0xE87A, 0x958A, - 0xE87B, 0x9594, 0xE87C, 0x9596, 0xE87D, 0x9598, 0xE87E, 0x9599, - 0xE880, 0x95A0, 0xE881, 0x95A8, 0xE882, 0x95A7, 0xE883, 0x95AD, - 0xE884, 0x95BC, 0xE885, 0x95BB, 0xE886, 0x95B9, 0xE887, 0x95BE, - 0xE888, 0x95CA, 0xE889, 0x6FF6, 0xE88A, 0x95C3, 0xE88B, 0x95CD, - 0xE88C, 0x95CC, 0xE88D, 0x95D5, 0xE88E, 0x95D4, 0xE88F, 0x95D6, - 0xE890, 0x95DC, 0xE891, 0x95E1, 0xE892, 0x95E5, 0xE893, 0x95E2, - 0xE894, 0x9621, 0xE895, 0x9628, 0xE896, 0x962E, 0xE897, 0x962F, - 0xE898, 0x9642, 0xE899, 0x964C, 0xE89A, 0x964F, 0xE89B, 0x964B, - 0xE89C, 0x9677, 0xE89D, 0x965C, 0xE89E, 0x965E, 0xE89F, 0x965D, - 0xE8A0, 0x965F, 0xE8A1, 0x9666, 0xE8A2, 0x9672, 0xE8A3, 0x966C, - 0xE8A4, 0x968D, 0xE8A5, 0x9698, 0xE8A6, 0x9695, 0xE8A7, 0x9697, - 0xE8A8, 0x96AA, 0xE8A9, 0x96A7, 0xE8AA, 0x96B1, 0xE8AB, 0x96B2, - 0xE8AC, 0x96B0, 0xE8AD, 0x96B4, 0xE8AE, 0x96B6, 0xE8AF, 0x96B8, - 0xE8B0, 0x96B9, 0xE8B1, 0x96CE, 0xE8B2, 0x96CB, 0xE8B3, 0x96C9, - 0xE8B4, 0x96CD, 0xE8B5, 0x894D, 0xE8B6, 0x96DC, 0xE8B7, 0x970D, - 0xE8B8, 0x96D5, 0xE8B9, 0x96F9, 0xE8BA, 0x9704, 0xE8BB, 0x9706, - 0xE8BC, 0x9708, 0xE8BD, 0x9713, 0xE8BE, 0x970E, 0xE8BF, 0x9711, - 0xE8C0, 0x970F, 0xE8C1, 0x9716, 0xE8C2, 0x9719, 0xE8C3, 0x9724, - 0xE8C4, 0x972A, 0xE8C5, 0x9730, 0xE8C6, 0x9739, 0xE8C7, 0x973D, - 0xE8C8, 0x973E, 0xE8C9, 0x9744, 0xE8CA, 0x9746, 0xE8CB, 0x9748, - 0xE8CC, 0x9742, 0xE8CD, 0x9749, 0xE8CE, 0x975C, 0xE8CF, 0x9760, - 0xE8D0, 0x9764, 0xE8D1, 0x9766, 0xE8D2, 0x9768, 0xE8D3, 0x52D2, - 0xE8D4, 0x976B, 0xE8D5, 0x9771, 0xE8D6, 0x9779, 0xE8D7, 0x9785, - 0xE8D8, 0x977C, 0xE8D9, 0x9781, 0xE8DA, 0x977A, 0xE8DB, 0x9786, - 0xE8DC, 0x978B, 0xE8DD, 0x978F, 0xE8DE, 0x9790, 0xE8DF, 0x979C, - 0xE8E0, 0x97A8, 0xE8E1, 0x97A6, 0xE8E2, 0x97A3, 0xE8E3, 0x97B3, - 0xE8E4, 0x97B4, 0xE8E5, 0x97C3, 0xE8E6, 0x97C6, 0xE8E7, 0x97C8, - 0xE8E8, 0x97CB, 0xE8E9, 0x97DC, 0xE8EA, 0x97ED, 0xE8EB, 0x9F4F, - 0xE8EC, 0x97F2, 0xE8ED, 0x7ADF, 0xE8EE, 0x97F6, 0xE8EF, 0x97F5, - 0xE8F0, 0x980F, 0xE8F1, 0x980C, 0xE8F2, 0x9838, 0xE8F3, 0x9824, - 0xE8F4, 0x9821, 0xE8F5, 0x9837, 0xE8F6, 0x983D, 0xE8F7, 0x9846, - 0xE8F8, 0x984F, 0xE8F9, 0x984B, 0xE8FA, 0x986B, 0xE8FB, 0x986F, - 0xE8FC, 0x9870, 0xE940, 0x9871, 0xE941, 0x9874, 0xE942, 0x9873, - 0xE943, 0x98AA, 0xE944, 0x98AF, 0xE945, 0x98B1, 0xE946, 0x98B6, - 0xE947, 0x98C4, 0xE948, 0x98C3, 0xE949, 0x98C6, 0xE94A, 0x98E9, - 0xE94B, 0x98EB, 0xE94C, 0x9903, 0xE94D, 0x9909, 0xE94E, 0x9912, - 0xE94F, 0x9914, 0xE950, 0x9918, 0xE951, 0x9921, 0xE952, 0x991D, - 0xE953, 0x991E, 0xE954, 0x9924, 0xE955, 0x9920, 0xE956, 0x992C, - 0xE957, 0x992E, 0xE958, 0x993D, 0xE959, 0x993E, 0xE95A, 0x9942, - 0xE95B, 0x9949, 0xE95C, 0x9945, 0xE95D, 0x9950, 0xE95E, 0x994B, - 0xE95F, 0x9951, 0xE960, 0x9952, 0xE961, 0x994C, 0xE962, 0x9955, - 0xE963, 0x9997, 0xE964, 0x9998, 0xE965, 0x99A5, 0xE966, 0x99AD, - 0xE967, 0x99AE, 0xE968, 0x99BC, 0xE969, 0x99DF, 0xE96A, 0x99DB, - 0xE96B, 0x99DD, 0xE96C, 0x99D8, 0xE96D, 0x99D1, 0xE96E, 0x99ED, - 0xE96F, 0x99EE, 0xE970, 0x99F1, 0xE971, 0x99F2, 0xE972, 0x99FB, - 0xE973, 0x99F8, 0xE974, 0x9A01, 0xE975, 0x9A0F, 0xE976, 0x9A05, - 0xE977, 0x99E2, 0xE978, 0x9A19, 0xE979, 0x9A2B, 0xE97A, 0x9A37, - 0xE97B, 0x9A45, 0xE97C, 0x9A42, 0xE97D, 0x9A40, 0xE97E, 0x9A43, - 0xE980, 0x9A3E, 0xE981, 0x9A55, 0xE982, 0x9A4D, 0xE983, 0x9A5B, - 0xE984, 0x9A57, 0xE985, 0x9A5F, 0xE986, 0x9A62, 0xE987, 0x9A65, - 0xE988, 0x9A64, 0xE989, 0x9A69, 0xE98A, 0x9A6B, 0xE98B, 0x9A6A, - 0xE98C, 0x9AAD, 0xE98D, 0x9AB0, 0xE98E, 0x9ABC, 0xE98F, 0x9AC0, - 0xE990, 0x9ACF, 0xE991, 0x9AD1, 0xE992, 0x9AD3, 0xE993, 0x9AD4, - 0xE994, 0x9ADE, 0xE995, 0x9ADF, 0xE996, 0x9AE2, 0xE997, 0x9AE3, - 0xE998, 0x9AE6, 0xE999, 0x9AEF, 0xE99A, 0x9AEB, 0xE99B, 0x9AEE, - 0xE99C, 0x9AF4, 0xE99D, 0x9AF1, 0xE99E, 0x9AF7, 0xE99F, 0x9AFB, - 0xE9A0, 0x9B06, 0xE9A1, 0x9B18, 0xE9A2, 0x9B1A, 0xE9A3, 0x9B1F, - 0xE9A4, 0x9B22, 0xE9A5, 0x9B23, 0xE9A6, 0x9B25, 0xE9A7, 0x9B27, - 0xE9A8, 0x9B28, 0xE9A9, 0x9B29, 0xE9AA, 0x9B2A, 0xE9AB, 0x9B2E, - 0xE9AC, 0x9B2F, 0xE9AD, 0x9B32, 0xE9AE, 0x9B44, 0xE9AF, 0x9B43, - 0xE9B0, 0x9B4F, 0xE9B1, 0x9B4D, 0xE9B2, 0x9B4E, 0xE9B3, 0x9B51, - 0xE9B4, 0x9B58, 0xE9B5, 0x9B74, 0xE9B6, 0x9B93, 0xE9B7, 0x9B83, - 0xE9B8, 0x9B91, 0xE9B9, 0x9B96, 0xE9BA, 0x9B97, 0xE9BB, 0x9B9F, - 0xE9BC, 0x9BA0, 0xE9BD, 0x9BA8, 0xE9BE, 0x9BB4, 0xE9BF, 0x9BC0, - 0xE9C0, 0x9BCA, 0xE9C1, 0x9BB9, 0xE9C2, 0x9BC6, 0xE9C3, 0x9BCF, - 0xE9C4, 0x9BD1, 0xE9C5, 0x9BD2, 0xE9C6, 0x9BE3, 0xE9C7, 0x9BE2, - 0xE9C8, 0x9BE4, 0xE9C9, 0x9BD4, 0xE9CA, 0x9BE1, 0xE9CB, 0x9C3A, - 0xE9CC, 0x9BF2, 0xE9CD, 0x9BF1, 0xE9CE, 0x9BF0, 0xE9CF, 0x9C15, - 0xE9D0, 0x9C14, 0xE9D1, 0x9C09, 0xE9D2, 0x9C13, 0xE9D3, 0x9C0C, - 0xE9D4, 0x9C06, 0xE9D5, 0x9C08, 0xE9D6, 0x9C12, 0xE9D7, 0x9C0A, - 0xE9D8, 0x9C04, 0xE9D9, 0x9C2E, 0xE9DA, 0x9C1B, 0xE9DB, 0x9C25, - 0xE9DC, 0x9C24, 0xE9DD, 0x9C21, 0xE9DE, 0x9C30, 0xE9DF, 0x9C47, - 0xE9E0, 0x9C32, 0xE9E1, 0x9C46, 0xE9E2, 0x9C3E, 0xE9E3, 0x9C5A, - 0xE9E4, 0x9C60, 0xE9E5, 0x9C67, 0xE9E6, 0x9C76, 0xE9E7, 0x9C78, - 0xE9E8, 0x9CE7, 0xE9E9, 0x9CEC, 0xE9EA, 0x9CF0, 0xE9EB, 0x9D09, - 0xE9EC, 0x9D08, 0xE9ED, 0x9CEB, 0xE9EE, 0x9D03, 0xE9EF, 0x9D06, - 0xE9F0, 0x9D2A, 0xE9F1, 0x9D26, 0xE9F2, 0x9DAF, 0xE9F3, 0x9D23, - 0xE9F4, 0x9D1F, 0xE9F5, 0x9D44, 0xE9F6, 0x9D15, 0xE9F7, 0x9D12, - 0xE9F8, 0x9D41, 0xE9F9, 0x9D3F, 0xE9FA, 0x9D3E, 0xE9FB, 0x9D46, - 0xE9FC, 0x9D48, 0xEA40, 0x9D5D, 0xEA41, 0x9D5E, 0xEA42, 0x9D64, - 0xEA43, 0x9D51, 0xEA44, 0x9D50, 0xEA45, 0x9D59, 0xEA46, 0x9D72, - 0xEA47, 0x9D89, 0xEA48, 0x9D87, 0xEA49, 0x9DAB, 0xEA4A, 0x9D6F, - 0xEA4B, 0x9D7A, 0xEA4C, 0x9D9A, 0xEA4D, 0x9DA4, 0xEA4E, 0x9DA9, - 0xEA4F, 0x9DB2, 0xEA50, 0x9DC4, 0xEA51, 0x9DC1, 0xEA52, 0x9DBB, - 0xEA53, 0x9DB8, 0xEA54, 0x9DBA, 0xEA55, 0x9DC6, 0xEA56, 0x9DCF, - 0xEA57, 0x9DC2, 0xEA58, 0x9DD9, 0xEA59, 0x9DD3, 0xEA5A, 0x9DF8, - 0xEA5B, 0x9DE6, 0xEA5C, 0x9DED, 0xEA5D, 0x9DEF, 0xEA5E, 0x9DFD, - 0xEA5F, 0x9E1A, 0xEA60, 0x9E1B, 0xEA61, 0x9E1E, 0xEA62, 0x9E75, - 0xEA63, 0x9E79, 0xEA64, 0x9E7D, 0xEA65, 0x9E81, 0xEA66, 0x9E88, - 0xEA67, 0x9E8B, 0xEA68, 0x9E8C, 0xEA69, 0x9E92, 0xEA6A, 0x9E95, - 0xEA6B, 0x9E91, 0xEA6C, 0x9E9D, 0xEA6D, 0x9EA5, 0xEA6E, 0x9EA9, - 0xEA6F, 0x9EB8, 0xEA70, 0x9EAA, 0xEA71, 0x9EAD, 0xEA72, 0x9761, - 0xEA73, 0x9ECC, 0xEA74, 0x9ECE, 0xEA75, 0x9ECF, 0xEA76, 0x9ED0, - 0xEA77, 0x9ED4, 0xEA78, 0x9EDC, 0xEA79, 0x9EDE, 0xEA7A, 0x9EDD, - 0xEA7B, 0x9EE0, 0xEA7C, 0x9EE5, 0xEA7D, 0x9EE8, 0xEA7E, 0x9EEF, - 0xEA80, 0x9EF4, 0xEA81, 0x9EF6, 0xEA82, 0x9EF7, 0xEA83, 0x9EF9, - 0xEA84, 0x9EFB, 0xEA85, 0x9EFC, 0xEA86, 0x9EFD, 0xEA87, 0x9F07, - 0xEA88, 0x9F08, 0xEA89, 0x76B7, 0xEA8A, 0x9F15, 0xEA8B, 0x9F21, - 0xEA8C, 0x9F2C, 0xEA8D, 0x9F3E, 0xEA8E, 0x9F4A, 0xEA8F, 0x9F52, - 0xEA90, 0x9F54, 0xEA91, 0x9F63, 0xEA92, 0x9F5F, 0xEA93, 0x9F60, - 0xEA94, 0x9F61, 0xEA95, 0x9F66, 0xEA96, 0x9F67, 0xEA97, 0x9F6C, - 0xEA98, 0x9F6A, 0xEA99, 0x9F77, 0xEA9A, 0x9F72, 0xEA9B, 0x9F76, - 0xEA9C, 0x9F95, 0xEA9D, 0x9F9C, 0xEA9E, 0x9FA0, 0xEA9F, 0x582F, - 0xEAA0, 0x69C7, 0xEAA1, 0x9059, 0xEAA2, 0x7464, 0xEAA3, 0x51DC, - 0xEAA4, 0x7199, 0xFA40, 0x2170, 0xFA41, 0x2171, 0xFA42, 0x2172, - 0xFA43, 0x2173, 0xFA44, 0x2174, 0xFA45, 0x2175, 0xFA46, 0x2176, - 0xFA47, 0x2177, 0xFA48, 0x2178, 0xFA49, 0x2179, 0xFA55, 0xFFE4, - 0xFA56, 0xFF07, 0xFA57, 0xFF02, 0xFA5C, 0x7E8A, 0xFA5D, 0x891C, - 0xFA5E, 0x9348, 0xFA5F, 0x9288, 0xFA60, 0x84DC, 0xFA61, 0x4FC9, - 0xFA62, 0x70BB, 0xFA63, 0x6631, 0xFA64, 0x68C8, 0xFA65, 0x92F9, - 0xFA66, 0x66FB, 0xFA67, 0x5F45, 0xFA68, 0x4E28, 0xFA69, 0x4EE1, - 0xFA6A, 0x4EFC, 0xFA6B, 0x4F00, 0xFA6C, 0x4F03, 0xFA6D, 0x4F39, - 0xFA6E, 0x4F56, 0xFA6F, 0x4F92, 0xFA70, 0x4F8A, 0xFA71, 0x4F9A, - 0xFA72, 0x4F94, 0xFA73, 0x4FCD, 0xFA74, 0x5040, 0xFA75, 0x5022, - 0xFA76, 0x4FFF, 0xFA77, 0x501E, 0xFA78, 0x5046, 0xFA79, 0x5070, - 0xFA7A, 0x5042, 0xFA7B, 0x5094, 0xFA7C, 0x50F4, 0xFA7D, 0x50D8, - 0xFA7E, 0x514A, 0xFA80, 0x5164, 0xFA81, 0x519D, 0xFA82, 0x51BE, - 0xFA83, 0x51EC, 0xFA84, 0x5215, 0xFA85, 0x529C, 0xFA86, 0x52A6, - 0xFA87, 0x52C0, 0xFA88, 0x52DB, 0xFA89, 0x5300, 0xFA8A, 0x5307, - 0xFA8B, 0x5324, 0xFA8C, 0x5372, 0xFA8D, 0x5393, 0xFA8E, 0x53B2, - 0xFA8F, 0x53DD, 0xFA90, 0xFA0E, 0xFA91, 0x549C, 0xFA92, 0x548A, - 0xFA93, 0x54A9, 0xFA94, 0x54FF, 0xFA95, 0x5586, 0xFA96, 0x5759, - 0xFA97, 0x5765, 0xFA98, 0x57AC, 0xFA99, 0x57C8, 0xFA9A, 0x57C7, - 0xFA9B, 0xFA0F, 0xFA9C, 0xFA10, 0xFA9D, 0x589E, 0xFA9E, 0x58B2, - 0xFA9F, 0x590B, 0xFAA0, 0x5953, 0xFAA1, 0x595B, 0xFAA2, 0x595D, - 0xFAA3, 0x5963, 0xFAA4, 0x59A4, 0xFAA5, 0x59BA, 0xFAA6, 0x5B56, - 0xFAA7, 0x5BC0, 0xFAA8, 0x752F, 0xFAA9, 0x5BD8, 0xFAAA, 0x5BEC, - 0xFAAB, 0x5C1E, 0xFAAC, 0x5CA6, 0xFAAD, 0x5CBA, 0xFAAE, 0x5CF5, - 0xFAAF, 0x5D27, 0xFAB0, 0x5D53, 0xFAB1, 0xFA11, 0xFAB2, 0x5D42, - 0xFAB3, 0x5D6D, 0xFAB4, 0x5DB8, 0xFAB5, 0x5DB9, 0xFAB6, 0x5DD0, - 0xFAB7, 0x5F21, 0xFAB8, 0x5F34, 0xFAB9, 0x5F67, 0xFABA, 0x5FB7, - 0xFABB, 0x5FDE, 0xFABC, 0x605D, 0xFABD, 0x6085, 0xFABE, 0x608A, - 0xFABF, 0x60DE, 0xFAC0, 0x60D5, 0xFAC1, 0x6120, 0xFAC2, 0x60F2, - 0xFAC3, 0x6111, 0xFAC4, 0x6137, 0xFAC5, 0x6130, 0xFAC6, 0x6198, - 0xFAC7, 0x6213, 0xFAC8, 0x62A6, 0xFAC9, 0x63F5, 0xFACA, 0x6460, - 0xFACB, 0x649D, 0xFACC, 0x64CE, 0xFACD, 0x654E, 0xFACE, 0x6600, - 0xFACF, 0x6615, 0xFAD0, 0x663B, 0xFAD1, 0x6609, 0xFAD2, 0x662E, - 0xFAD3, 0x661E, 0xFAD4, 0x6624, 0xFAD5, 0x6665, 0xFAD6, 0x6657, - 0xFAD7, 0x6659, 0xFAD8, 0xFA12, 0xFAD9, 0x6673, 0xFADA, 0x6699, - 0xFADB, 0x66A0, 0xFADC, 0x66B2, 0xFADD, 0x66BF, 0xFADE, 0x66FA, - 0xFADF, 0x670E, 0xFAE0, 0xF929, 0xFAE1, 0x6766, 0xFAE2, 0x67BB, - 0xFAE3, 0x6852, 0xFAE4, 0x67C0, 0xFAE5, 0x6801, 0xFAE6, 0x6844, - 0xFAE7, 0x68CF, 0xFAE8, 0xFA13, 0xFAE9, 0x6968, 0xFAEA, 0xFA14, - 0xFAEB, 0x6998, 0xFAEC, 0x69E2, 0xFAED, 0x6A30, 0xFAEE, 0x6A6B, - 0xFAEF, 0x6A46, 0xFAF0, 0x6A73, 0xFAF1, 0x6A7E, 0xFAF2, 0x6AE2, - 0xFAF3, 0x6AE4, 0xFAF4, 0x6BD6, 0xFAF5, 0x6C3F, 0xFAF6, 0x6C5C, - 0xFAF7, 0x6C86, 0xFAF8, 0x6C6F, 0xFAF9, 0x6CDA, 0xFAFA, 0x6D04, - 0xFAFB, 0x6D87, 0xFAFC, 0x6D6F, 0xFB40, 0x6D96, 0xFB41, 0x6DAC, - 0xFB42, 0x6DCF, 0xFB43, 0x6DF8, 0xFB44, 0x6DF2, 0xFB45, 0x6DFC, - 0xFB46, 0x6E39, 0xFB47, 0x6E5C, 0xFB48, 0x6E27, 0xFB49, 0x6E3C, - 0xFB4A, 0x6EBF, 0xFB4B, 0x6F88, 0xFB4C, 0x6FB5, 0xFB4D, 0x6FF5, - 0xFB4E, 0x7005, 0xFB4F, 0x7007, 0xFB50, 0x7028, 0xFB51, 0x7085, - 0xFB52, 0x70AB, 0xFB53, 0x710F, 0xFB54, 0x7104, 0xFB55, 0x715C, - 0xFB56, 0x7146, 0xFB57, 0x7147, 0xFB58, 0xFA15, 0xFB59, 0x71C1, - 0xFB5A, 0x71FE, 0xFB5B, 0x72B1, 0xFB5C, 0x72BE, 0xFB5D, 0x7324, - 0xFB5E, 0xFA16, 0xFB5F, 0x7377, 0xFB60, 0x73BD, 0xFB61, 0x73C9, - 0xFB62, 0x73D6, 0xFB63, 0x73E3, 0xFB64, 0x73D2, 0xFB65, 0x7407, - 0xFB66, 0x73F5, 0xFB67, 0x7426, 0xFB68, 0x742A, 0xFB69, 0x7429, - 0xFB6A, 0x742E, 0xFB6B, 0x7462, 0xFB6C, 0x7489, 0xFB6D, 0x749F, - 0xFB6E, 0x7501, 0xFB6F, 0x756F, 0xFB70, 0x7682, 0xFB71, 0x769C, - 0xFB72, 0x769E, 0xFB73, 0x769B, 0xFB74, 0x76A6, 0xFB75, 0xFA17, - 0xFB76, 0x7746, 0xFB77, 0x52AF, 0xFB78, 0x7821, 0xFB79, 0x784E, - 0xFB7A, 0x7864, 0xFB7B, 0x787A, 0xFB7C, 0x7930, 0xFB7D, 0xFA18, - 0xFB7E, 0xFA19, 0xFB80, 0xFA1A, 0xFB81, 0x7994, 0xFB82, 0xFA1B, - 0xFB83, 0x799B, 0xFB84, 0x7AD1, 0xFB85, 0x7AE7, 0xFB86, 0xFA1C, - 0xFB87, 0x7AEB, 0xFB88, 0x7B9E, 0xFB89, 0xFA1D, 0xFB8A, 0x7D48, - 0xFB8B, 0x7D5C, 0xFB8C, 0x7DB7, 0xFB8D, 0x7DA0, 0xFB8E, 0x7DD6, - 0xFB8F, 0x7E52, 0xFB90, 0x7F47, 0xFB91, 0x7FA1, 0xFB92, 0xFA1E, - 0xFB93, 0x8301, 0xFB94, 0x8362, 0xFB95, 0x837F, 0xFB96, 0x83C7, - 0xFB97, 0x83F6, 0xFB98, 0x8448, 0xFB99, 0x84B4, 0xFB9A, 0x8553, - 0xFB9B, 0x8559, 0xFB9C, 0x856B, 0xFB9D, 0xFA1F, 0xFB9E, 0x85B0, - 0xFB9F, 0xFA20, 0xFBA0, 0xFA21, 0xFBA1, 0x8807, 0xFBA2, 0x88F5, - 0xFBA3, 0x8A12, 0xFBA4, 0x8A37, 0xFBA5, 0x8A79, 0xFBA6, 0x8AA7, - 0xFBA7, 0x8ABE, 0xFBA8, 0x8ADF, 0xFBA9, 0xFA22, 0xFBAA, 0x8AF6, - 0xFBAB, 0x8B53, 0xFBAC, 0x8B7F, 0xFBAD, 0x8CF0, 0xFBAE, 0x8CF4, - 0xFBAF, 0x8D12, 0xFBB0, 0x8D76, 0xFBB1, 0xFA23, 0xFBB2, 0x8ECF, - 0xFBB3, 0xFA24, 0xFBB4, 0xFA25, 0xFBB5, 0x9067, 0xFBB6, 0x90DE, - 0xFBB7, 0xFA26, 0xFBB8, 0x9115, 0xFBB9, 0x9127, 0xFBBA, 0x91DA, - 0xFBBB, 0x91D7, 0xFBBC, 0x91DE, 0xFBBD, 0x91ED, 0xFBBE, 0x91EE, - 0xFBBF, 0x91E4, 0xFBC0, 0x91E5, 0xFBC1, 0x9206, 0xFBC2, 0x9210, - 0xFBC3, 0x920A, 0xFBC4, 0x923A, 0xFBC5, 0x9240, 0xFBC6, 0x923C, - 0xFBC7, 0x924E, 0xFBC8, 0x9259, 0xFBC9, 0x9251, 0xFBCA, 0x9239, - 0xFBCB, 0x9267, 0xFBCC, 0x92A7, 0xFBCD, 0x9277, 0xFBCE, 0x9278, - 0xFBCF, 0x92E7, 0xFBD0, 0x92D7, 0xFBD1, 0x92D9, 0xFBD2, 0x92D0, - 0xFBD3, 0xFA27, 0xFBD4, 0x92D5, 0xFBD5, 0x92E0, 0xFBD6, 0x92D3, - 0xFBD7, 0x9325, 0xFBD8, 0x9321, 0xFBD9, 0x92FB, 0xFBDA, 0xFA28, - 0xFBDB, 0x931E, 0xFBDC, 0x92FF, 0xFBDD, 0x931D, 0xFBDE, 0x9302, - 0xFBDF, 0x9370, 0xFBE0, 0x9357, 0xFBE1, 0x93A4, 0xFBE2, 0x93C6, - 0xFBE3, 0x93DE, 0xFBE4, 0x93F8, 0xFBE5, 0x9431, 0xFBE6, 0x9445, - 0xFBE7, 0x9448, 0xFBE8, 0x9592, 0xFBE9, 0xF9DC, 0xFBEA, 0xFA29, - 0xFBEB, 0x969D, 0xFBEC, 0x96AF, 0xFBED, 0x9733, 0xFBEE, 0x973B, - 0xFBEF, 0x9743, 0xFBF0, 0x974D, 0xFBF1, 0x974F, 0xFBF2, 0x9751, - 0xFBF3, 0x9755, 0xFBF4, 0x9857, 0xFBF5, 0x9865, 0xFBF6, 0xFA2A, - 0xFBF7, 0xFA2B, 0xFBF8, 0x9927, 0xFBF9, 0xFA2C, 0xFBFA, 0x999E, - 0xFBFB, 0x9A4E, 0xFBFC, 0x9AD9, 0xFC40, 0x9ADC, 0xFC41, 0x9B75, - 0xFC42, 0x9B72, 0xFC43, 0x9B8F, 0xFC44, 0x9BB1, 0xFC45, 0x9BBB, - 0xFC46, 0x9C00, 0xFC47, 0x9D70, 0xFC48, 0x9D6B, 0xFC49, 0xFA2D, - 0xFC4A, 0x9E19, 0xFC4B, 0x9ED1, 0, 0 + 0x8392, 0x30F2, 0x8393, 0x30F3, 0x8394, 0x30F4, 0x8395, 0x30F5, + 0x8396, 0x30F6, 0x839F, 0x0391, 0x83A0, 0x0392, 0x83A1, 0x0393, + 0x83A2, 0x0394, 0x83A3, 0x0395, 0x83A4, 0x0396, 0x83A5, 0x0397, + 0x83A6, 0x0398, 0x83A7, 0x0399, 0x83A8, 0x039A, 0x83A9, 0x039B, + 0x83AA, 0x039C, 0x83AB, 0x039D, 0x83AC, 0x039E, 0x83AD, 0x039F, + 0x83AE, 0x03A0, 0x83AF, 0x03A1, 0x83B0, 0x03A3, 0x83B1, 0x03A4, + 0x83B2, 0x03A5, 0x83B3, 0x03A6, 0x83B4, 0x03A7, 0x83B5, 0x03A8, + 0x83B6, 0x03A9, 0x83BF, 0x03B1, 0x83C0, 0x03B2, 0x83C1, 0x03B3, + 0x83C2, 0x03B4, 0x83C3, 0x03B5, 0x83C4, 0x03B6, 0x83C5, 0x03B7, + 0x83C6, 0x03B8, 0x83C7, 0x03B9, 0x83C8, 0x03BA, 0x83C9, 0x03BB, + 0x83CA, 0x03BC, 0x83CB, 0x03BD, 0x83CC, 0x03BE, 0x83CD, 0x03BF, + 0x83CE, 0x03C0, 0x83CF, 0x03C1, 0x83D0, 0x03C3, 0x83D1, 0x03C4, + 0x83D2, 0x03C5, 0x83D3, 0x03C6, 0x83D4, 0x03C7, 0x83D5, 0x03C8, + 0x83D6, 0x03C9, 0x8440, 0x0410, 0x8441, 0x0411, 0x8442, 0x0412, + 0x8443, 0x0413, 0x8444, 0x0414, 0x8445, 0x0415, 0x8446, 0x0401, + 0x8447, 0x0416, 0x8448, 0x0417, 0x8449, 0x0418, 0x844A, 0x0419, + 0x844B, 0x041A, 0x844C, 0x041B, 0x844D, 0x041C, 0x844E, 0x041D, + 0x844F, 0x041E, 0x8450, 0x041F, 0x8451, 0x0420, 0x8452, 0x0421, + 0x8453, 0x0422, 0x8454, 0x0423, 0x8455, 0x0424, 0x8456, 0x0425, + 0x8457, 0x0426, 0x8458, 0x0427, 0x8459, 0x0428, 0x845A, 0x0429, + 0x845B, 0x042A, 0x845C, 0x042B, 0x845D, 0x042C, 0x845E, 0x042D, + 0x845F, 0x042E, 0x8460, 0x042F, 0x8470, 0x0430, 0x8471, 0x0431, + 0x8472, 0x0432, 0x8473, 0x0433, 0x8474, 0x0434, 0x8475, 0x0435, + 0x8476, 0x0451, 0x8477, 0x0436, 0x8478, 0x0437, 0x8479, 0x0438, + 0x847A, 0x0439, 0x847B, 0x043A, 0x847C, 0x043B, 0x847D, 0x043C, + 0x847E, 0x043D, 0x8480, 0x043E, 0x8481, 0x043F, 0x8482, 0x0440, + 0x8483, 0x0441, 0x8484, 0x0442, 0x8485, 0x0443, 0x8486, 0x0444, + 0x8487, 0x0445, 0x8488, 0x0446, 0x8489, 0x0447, 0x848A, 0x0448, + 0x848B, 0x0449, 0x848C, 0x044A, 0x848D, 0x044B, 0x848E, 0x044C, + 0x848F, 0x044D, 0x8490, 0x044E, 0x8491, 0x044F, 0x849F, 0x2500, + 0x84A0, 0x2502, 0x84A1, 0x250C, 0x84A2, 0x2510, 0x84A3, 0x2518, + 0x84A4, 0x2514, 0x84A5, 0x251C, 0x84A6, 0x252C, 0x84A7, 0x2524, + 0x84A8, 0x2534, 0x84A9, 0x253C, 0x84AA, 0x2501, 0x84AB, 0x2503, + 0x84AC, 0x250F, 0x84AD, 0x2513, 0x84AE, 0x251B, 0x84AF, 0x2517, + 0x84B0, 0x2523, 0x84B1, 0x2533, 0x84B2, 0x252B, 0x84B3, 0x253B, + 0x84B4, 0x254B, 0x84B5, 0x2520, 0x84B6, 0x252F, 0x84B7, 0x2528, + 0x84B8, 0x2537, 0x84B9, 0x253F, 0x84BA, 0x251D, 0x84BB, 0x2530, + 0x84BC, 0x2525, 0x84BD, 0x2538, 0x84BE, 0x2542, 0x8740, 0x2460, + 0x8741, 0x2461, 0x8742, 0x2462, 0x8743, 0x2463, 0x8744, 0x2464, + 0x8745, 0x2465, 0x8746, 0x2466, 0x8747, 0x2467, 0x8748, 0x2468, + 0x8749, 0x2469, 0x874A, 0x246A, 0x874B, 0x246B, 0x874C, 0x246C, + 0x874D, 0x246D, 0x874E, 0x246E, 0x874F, 0x246F, 0x8750, 0x2470, + 0x8751, 0x2471, 0x8752, 0x2472, 0x8753, 0x2473, 0x8754, 0x2160, + 0x8755, 0x2161, 0x8756, 0x2162, 0x8757, 0x2163, 0x8758, 0x2164, + 0x8759, 0x2165, 0x875A, 0x2166, 0x875B, 0x2167, 0x875C, 0x2168, + 0x875D, 0x2169, 0x875F, 0x3349, 0x8760, 0x3314, 0x8761, 0x3322, + 0x8762, 0x334D, 0x8763, 0x3318, 0x8764, 0x3327, 0x8765, 0x3303, + 0x8766, 0x3336, 0x8767, 0x3351, 0x8768, 0x3357, 0x8769, 0x330D, + 0x876A, 0x3326, 0x876B, 0x3323, 0x876C, 0x332B, 0x876D, 0x334A, + 0x876E, 0x333B, 0x876F, 0x339C, 0x8770, 0x339D, 0x8771, 0x339E, + 0x8772, 0x338E, 0x8773, 0x338F, 0x8774, 0x33C4, 0x8775, 0x33A1, + 0x877E, 0x337B, 0x8780, 0x301D, 0x8781, 0x301F, 0x8782, 0x2116, + 0x8783, 0x33CD, 0x8784, 0x2121, 0x8785, 0x32A4, 0x8786, 0x32A5, + 0x8787, 0x32A6, 0x8788, 0x32A7, 0x8789, 0x32A8, 0x878A, 0x3231, + 0x878B, 0x3232, 0x878C, 0x3239, 0x878D, 0x337E, 0x878E, 0x337D, + 0x878F, 0x337C, 0x8793, 0x222E, 0x8794, 0x2211, 0x8798, 0x221F, + 0x8799, 0x22BF, 0x889F, 0x4E9C, 0x88A0, 0x5516, 0x88A1, 0x5A03, + 0x88A2, 0x963F, 0x88A3, 0x54C0, 0x88A4, 0x611B, 0x88A5, 0x6328, + 0x88A6, 0x59F6, 0x88A7, 0x9022, 0x88A8, 0x8475, 0x88A9, 0x831C, + 0x88AA, 0x7A50, 0x88AB, 0x60AA, 0x88AC, 0x63E1, 0x88AD, 0x6E25, + 0x88AE, 0x65ED, 0x88AF, 0x8466, 0x88B0, 0x82A6, 0x88B1, 0x9BF5, + 0x88B2, 0x6893, 0x88B3, 0x5727, 0x88B4, 0x65A1, 0x88B5, 0x6271, + 0x88B6, 0x5B9B, 0x88B7, 0x59D0, 0x88B8, 0x867B, 0x88B9, 0x98F4, + 0x88BA, 0x7D62, 0x88BB, 0x7DBE, 0x88BC, 0x9B8E, 0x88BD, 0x6216, + 0x88BE, 0x7C9F, 0x88BF, 0x88B7, 0x88C0, 0x5B89, 0x88C1, 0x5EB5, + 0x88C2, 0x6309, 0x88C3, 0x6697, 0x88C4, 0x6848, 0x88C5, 0x95C7, + 0x88C6, 0x978D, 0x88C7, 0x674F, 0x88C8, 0x4EE5, 0x88C9, 0x4F0A, + 0x88CA, 0x4F4D, 0x88CB, 0x4F9D, 0x88CC, 0x5049, 0x88CD, 0x56F2, + 0x88CE, 0x5937, 0x88CF, 0x59D4, 0x88D0, 0x5A01, 0x88D1, 0x5C09, + 0x88D2, 0x60DF, 0x88D3, 0x610F, 0x88D4, 0x6170, 0x88D5, 0x6613, + 0x88D6, 0x6905, 0x88D7, 0x70BA, 0x88D8, 0x754F, 0x88D9, 0x7570, + 0x88DA, 0x79FB, 0x88DB, 0x7DAD, 0x88DC, 0x7DEF, 0x88DD, 0x80C3, + 0x88DE, 0x840E, 0x88DF, 0x8863, 0x88E0, 0x8B02, 0x88E1, 0x9055, + 0x88E2, 0x907A, 0x88E3, 0x533B, 0x88E4, 0x4E95, 0x88E5, 0x4EA5, + 0x88E6, 0x57DF, 0x88E7, 0x80B2, 0x88E8, 0x90C1, 0x88E9, 0x78EF, + 0x88EA, 0x4E00, 0x88EB, 0x58F1, 0x88EC, 0x6EA2, 0x88ED, 0x9038, + 0x88EE, 0x7A32, 0x88EF, 0x8328, 0x88F0, 0x828B, 0x88F1, 0x9C2F, + 0x88F2, 0x5141, 0x88F3, 0x5370, 0x88F4, 0x54BD, 0x88F5, 0x54E1, + 0x88F6, 0x56E0, 0x88F7, 0x59FB, 0x88F8, 0x5F15, 0x88F9, 0x98F2, + 0x88FA, 0x6DEB, 0x88FB, 0x80E4, 0x88FC, 0x852D, 0x8940, 0x9662, + 0x8941, 0x9670, 0x8942, 0x96A0, 0x8943, 0x97FB, 0x8944, 0x540B, + 0x8945, 0x53F3, 0x8946, 0x5B87, 0x8947, 0x70CF, 0x8948, 0x7FBD, + 0x8949, 0x8FC2, 0x894A, 0x96E8, 0x894B, 0x536F, 0x894C, 0x9D5C, + 0x894D, 0x7ABA, 0x894E, 0x4E11, 0x894F, 0x7893, 0x8950, 0x81FC, + 0x8951, 0x6E26, 0x8952, 0x5618, 0x8953, 0x5504, 0x8954, 0x6B1D, + 0x8955, 0x851A, 0x8956, 0x9C3B, 0x8957, 0x59E5, 0x8958, 0x53A9, + 0x8959, 0x6D66, 0x895A, 0x74DC, 0x895B, 0x958F, 0x895C, 0x5642, + 0x895D, 0x4E91, 0x895E, 0x904B, 0x895F, 0x96F2, 0x8960, 0x834F, + 0x8961, 0x990C, 0x8962, 0x53E1, 0x8963, 0x55B6, 0x8964, 0x5B30, + 0x8965, 0x5F71, 0x8966, 0x6620, 0x8967, 0x66F3, 0x8968, 0x6804, + 0x8969, 0x6C38, 0x896A, 0x6CF3, 0x896B, 0x6D29, 0x896C, 0x745B, + 0x896D, 0x76C8, 0x896E, 0x7A4E, 0x896F, 0x9834, 0x8970, 0x82F1, + 0x8971, 0x885B, 0x8972, 0x8A60, 0x8973, 0x92ED, 0x8974, 0x6DB2, + 0x8975, 0x75AB, 0x8976, 0x76CA, 0x8977, 0x99C5, 0x8978, 0x60A6, + 0x8979, 0x8B01, 0x897A, 0x8D8A, 0x897B, 0x95B2, 0x897C, 0x698E, + 0x897D, 0x53AD, 0x897E, 0x5186, 0x8980, 0x5712, 0x8981, 0x5830, + 0x8982, 0x5944, 0x8983, 0x5BB4, 0x8984, 0x5EF6, 0x8985, 0x6028, + 0x8986, 0x63A9, 0x8987, 0x63F4, 0x8988, 0x6CBF, 0x8989, 0x6F14, + 0x898A, 0x708E, 0x898B, 0x7114, 0x898C, 0x7159, 0x898D, 0x71D5, + 0x898E, 0x733F, 0x898F, 0x7E01, 0x8990, 0x8276, 0x8991, 0x82D1, + 0x8992, 0x8597, 0x8993, 0x9060, 0x8994, 0x925B, 0x8995, 0x9D1B, + 0x8996, 0x5869, 0x8997, 0x65BC, 0x8998, 0x6C5A, 0x8999, 0x7525, + 0x899A, 0x51F9, 0x899B, 0x592E, 0x899C, 0x5965, 0x899D, 0x5F80, + 0x899E, 0x5FDC, 0x899F, 0x62BC, 0x89A0, 0x65FA, 0x89A1, 0x6A2A, + 0x89A2, 0x6B27, 0x89A3, 0x6BB4, 0x89A4, 0x738B, 0x89A5, 0x7FC1, + 0x89A6, 0x8956, 0x89A7, 0x9D2C, 0x89A8, 0x9D0E, 0x89A9, 0x9EC4, + 0x89AA, 0x5CA1, 0x89AB, 0x6C96, 0x89AC, 0x837B, 0x89AD, 0x5104, + 0x89AE, 0x5C4B, 0x89AF, 0x61B6, 0x89B0, 0x81C6, 0x89B1, 0x6876, + 0x89B2, 0x7261, 0x89B3, 0x4E59, 0x89B4, 0x4FFA, 0x89B5, 0x5378, + 0x89B6, 0x6069, 0x89B7, 0x6E29, 0x89B8, 0x7A4F, 0x89B9, 0x97F3, + 0x89BA, 0x4E0B, 0x89BB, 0x5316, 0x89BC, 0x4EEE, 0x89BD, 0x4F55, + 0x89BE, 0x4F3D, 0x89BF, 0x4FA1, 0x89C0, 0x4F73, 0x89C1, 0x52A0, + 0x89C2, 0x53EF, 0x89C3, 0x5609, 0x89C4, 0x590F, 0x89C5, 0x5AC1, + 0x89C6, 0x5BB6, 0x89C7, 0x5BE1, 0x89C8, 0x79D1, 0x89C9, 0x6687, + 0x89CA, 0x679C, 0x89CB, 0x67B6, 0x89CC, 0x6B4C, 0x89CD, 0x6CB3, + 0x89CE, 0x706B, 0x89CF, 0x73C2, 0x89D0, 0x798D, 0x89D1, 0x79BE, + 0x89D2, 0x7A3C, 0x89D3, 0x7B87, 0x89D4, 0x82B1, 0x89D5, 0x82DB, + 0x89D6, 0x8304, 0x89D7, 0x8377, 0x89D8, 0x83EF, 0x89D9, 0x83D3, + 0x89DA, 0x8766, 0x89DB, 0x8AB2, 0x89DC, 0x5629, 0x89DD, 0x8CA8, + 0x89DE, 0x8FE6, 0x89DF, 0x904E, 0x89E0, 0x971E, 0x89E1, 0x868A, + 0x89E2, 0x4FC4, 0x89E3, 0x5CE8, 0x89E4, 0x6211, 0x89E5, 0x7259, + 0x89E6, 0x753B, 0x89E7, 0x81E5, 0x89E8, 0x82BD, 0x89E9, 0x86FE, + 0x89EA, 0x8CC0, 0x89EB, 0x96C5, 0x89EC, 0x9913, 0x89ED, 0x99D5, + 0x89EE, 0x4ECB, 0x89EF, 0x4F1A, 0x89F0, 0x89E3, 0x89F1, 0x56DE, + 0x89F2, 0x584A, 0x89F3, 0x58CA, 0x89F4, 0x5EFB, 0x89F5, 0x5FEB, + 0x89F6, 0x602A, 0x89F7, 0x6094, 0x89F8, 0x6062, 0x89F9, 0x61D0, + 0x89FA, 0x6212, 0x89FB, 0x62D0, 0x89FC, 0x6539, 0x8A40, 0x9B41, + 0x8A41, 0x6666, 0x8A42, 0x68B0, 0x8A43, 0x6D77, 0x8A44, 0x7070, + 0x8A45, 0x754C, 0x8A46, 0x7686, 0x8A47, 0x7D75, 0x8A48, 0x82A5, + 0x8A49, 0x87F9, 0x8A4A, 0x958B, 0x8A4B, 0x968E, 0x8A4C, 0x8C9D, + 0x8A4D, 0x51F1, 0x8A4E, 0x52BE, 0x8A4F, 0x5916, 0x8A50, 0x54B3, + 0x8A51, 0x5BB3, 0x8A52, 0x5D16, 0x8A53, 0x6168, 0x8A54, 0x6982, + 0x8A55, 0x6DAF, 0x8A56, 0x788D, 0x8A57, 0x84CB, 0x8A58, 0x8857, + 0x8A59, 0x8A72, 0x8A5A, 0x93A7, 0x8A5B, 0x9AB8, 0x8A5C, 0x6D6C, + 0x8A5D, 0x99A8, 0x8A5E, 0x86D9, 0x8A5F, 0x57A3, 0x8A60, 0x67FF, + 0x8A61, 0x86CE, 0x8A62, 0x920E, 0x8A63, 0x5283, 0x8A64, 0x5687, + 0x8A65, 0x5404, 0x8A66, 0x5ED3, 0x8A67, 0x62E1, 0x8A68, 0x64B9, + 0x8A69, 0x683C, 0x8A6A, 0x6838, 0x8A6B, 0x6BBB, 0x8A6C, 0x7372, + 0x8A6D, 0x78BA, 0x8A6E, 0x7A6B, 0x8A6F, 0x899A, 0x8A70, 0x89D2, + 0x8A71, 0x8D6B, 0x8A72, 0x8F03, 0x8A73, 0x90ED, 0x8A74, 0x95A3, + 0x8A75, 0x9694, 0x8A76, 0x9769, 0x8A77, 0x5B66, 0x8A78, 0x5CB3, + 0x8A79, 0x697D, 0x8A7A, 0x984D, 0x8A7B, 0x984E, 0x8A7C, 0x639B, + 0x8A7D, 0x7B20, 0x8A7E, 0x6A2B, 0x8A80, 0x6A7F, 0x8A81, 0x68B6, + 0x8A82, 0x9C0D, 0x8A83, 0x6F5F, 0x8A84, 0x5272, 0x8A85, 0x559D, + 0x8A86, 0x6070, 0x8A87, 0x62EC, 0x8A88, 0x6D3B, 0x8A89, 0x6E07, + 0x8A8A, 0x6ED1, 0x8A8B, 0x845B, 0x8A8C, 0x8910, 0x8A8D, 0x8F44, + 0x8A8E, 0x4E14, 0x8A8F, 0x9C39, 0x8A90, 0x53F6, 0x8A91, 0x691B, + 0x8A92, 0x6A3A, 0x8A93, 0x9784, 0x8A94, 0x682A, 0x8A95, 0x515C, + 0x8A96, 0x7AC3, 0x8A97, 0x84B2, 0x8A98, 0x91DC, 0x8A99, 0x938C, + 0x8A9A, 0x565B, 0x8A9B, 0x9D28, 0x8A9C, 0x6822, 0x8A9D, 0x8305, + 0x8A9E, 0x8431, 0x8A9F, 0x7CA5, 0x8AA0, 0x5208, 0x8AA1, 0x82C5, + 0x8AA2, 0x74E6, 0x8AA3, 0x4E7E, 0x8AA4, 0x4F83, 0x8AA5, 0x51A0, + 0x8AA6, 0x5BD2, 0x8AA7, 0x520A, 0x8AA8, 0x52D8, 0x8AA9, 0x52E7, + 0x8AAA, 0x5DFB, 0x8AAB, 0x559A, 0x8AAC, 0x582A, 0x8AAD, 0x59E6, + 0x8AAE, 0x5B8C, 0x8AAF, 0x5B98, 0x8AB0, 0x5BDB, 0x8AB1, 0x5E72, + 0x8AB2, 0x5E79, 0x8AB3, 0x60A3, 0x8AB4, 0x611F, 0x8AB5, 0x6163, + 0x8AB6, 0x61BE, 0x8AB7, 0x63DB, 0x8AB8, 0x6562, 0x8AB9, 0x67D1, + 0x8ABA, 0x6853, 0x8ABB, 0x68FA, 0x8ABC, 0x6B3E, 0x8ABD, 0x6B53, + 0x8ABE, 0x6C57, 0x8ABF, 0x6F22, 0x8AC0, 0x6F97, 0x8AC1, 0x6F45, + 0x8AC2, 0x74B0, 0x8AC3, 0x7518, 0x8AC4, 0x76E3, 0x8AC5, 0x770B, + 0x8AC6, 0x7AFF, 0x8AC7, 0x7BA1, 0x8AC8, 0x7C21, 0x8AC9, 0x7DE9, + 0x8ACA, 0x7F36, 0x8ACB, 0x7FF0, 0x8ACC, 0x809D, 0x8ACD, 0x8266, + 0x8ACE, 0x839E, 0x8ACF, 0x89B3, 0x8AD0, 0x8ACC, 0x8AD1, 0x8CAB, + 0x8AD2, 0x9084, 0x8AD3, 0x9451, 0x8AD4, 0x9593, 0x8AD5, 0x9591, + 0x8AD6, 0x95A2, 0x8AD7, 0x9665, 0x8AD8, 0x97D3, 0x8AD9, 0x9928, + 0x8ADA, 0x8218, 0x8ADB, 0x4E38, 0x8ADC, 0x542B, 0x8ADD, 0x5CB8, + 0x8ADE, 0x5DCC, 0x8ADF, 0x73A9, 0x8AE0, 0x764C, 0x8AE1, 0x773C, + 0x8AE2, 0x5CA9, 0x8AE3, 0x7FEB, 0x8AE4, 0x8D0B, 0x8AE5, 0x96C1, + 0x8AE6, 0x9811, 0x8AE7, 0x9854, 0x8AE8, 0x9858, 0x8AE9, 0x4F01, + 0x8AEA, 0x4F0E, 0x8AEB, 0x5371, 0x8AEC, 0x559C, 0x8AED, 0x5668, + 0x8AEE, 0x57FA, 0x8AEF, 0x5947, 0x8AF0, 0x5B09, 0x8AF1, 0x5BC4, + 0x8AF2, 0x5C90, 0x8AF3, 0x5E0C, 0x8AF4, 0x5E7E, 0x8AF5, 0x5FCC, + 0x8AF6, 0x63EE, 0x8AF7, 0x673A, 0x8AF8, 0x65D7, 0x8AF9, 0x65E2, + 0x8AFA, 0x671F, 0x8AFB, 0x68CB, 0x8AFC, 0x68C4, 0x8B40, 0x6A5F, + 0x8B41, 0x5E30, 0x8B42, 0x6BC5, 0x8B43, 0x6C17, 0x8B44, 0x6C7D, + 0x8B45, 0x757F, 0x8B46, 0x7948, 0x8B47, 0x5B63, 0x8B48, 0x7A00, + 0x8B49, 0x7D00, 0x8B4A, 0x5FBD, 0x8B4B, 0x898F, 0x8B4C, 0x8A18, + 0x8B4D, 0x8CB4, 0x8B4E, 0x8D77, 0x8B4F, 0x8ECC, 0x8B50, 0x8F1D, + 0x8B51, 0x98E2, 0x8B52, 0x9A0E, 0x8B53, 0x9B3C, 0x8B54, 0x4E80, + 0x8B55, 0x507D, 0x8B56, 0x5100, 0x8B57, 0x5993, 0x8B58, 0x5B9C, + 0x8B59, 0x622F, 0x8B5A, 0x6280, 0x8B5B, 0x64EC, 0x8B5C, 0x6B3A, + 0x8B5D, 0x72A0, 0x8B5E, 0x7591, 0x8B5F, 0x7947, 0x8B60, 0x7FA9, + 0x8B61, 0x87FB, 0x8B62, 0x8ABC, 0x8B63, 0x8B70, 0x8B64, 0x63AC, + 0x8B65, 0x83CA, 0x8B66, 0x97A0, 0x8B67, 0x5409, 0x8B68, 0x5403, + 0x8B69, 0x55AB, 0x8B6A, 0x6854, 0x8B6B, 0x6A58, 0x8B6C, 0x8A70, + 0x8B6D, 0x7827, 0x8B6E, 0x6775, 0x8B6F, 0x9ECD, 0x8B70, 0x5374, + 0x8B71, 0x5BA2, 0x8B72, 0x811A, 0x8B73, 0x8650, 0x8B74, 0x9006, + 0x8B75, 0x4E18, 0x8B76, 0x4E45, 0x8B77, 0x4EC7, 0x8B78, 0x4F11, + 0x8B79, 0x53CA, 0x8B7A, 0x5438, 0x8B7B, 0x5BAE, 0x8B7C, 0x5F13, + 0x8B7D, 0x6025, 0x8B7E, 0x6551, 0x8B80, 0x673D, 0x8B81, 0x6C42, + 0x8B82, 0x6C72, 0x8B83, 0x6CE3, 0x8B84, 0x7078, 0x8B85, 0x7403, + 0x8B86, 0x7A76, 0x8B87, 0x7AAE, 0x8B88, 0x7B08, 0x8B89, 0x7D1A, + 0x8B8A, 0x7CFE, 0x8B8B, 0x7D66, 0x8B8C, 0x65E7, 0x8B8D, 0x725B, + 0x8B8E, 0x53BB, 0x8B8F, 0x5C45, 0x8B90, 0x5DE8, 0x8B91, 0x62D2, + 0x8B92, 0x62E0, 0x8B93, 0x6319, 0x8B94, 0x6E20, 0x8B95, 0x865A, + 0x8B96, 0x8A31, 0x8B97, 0x8DDD, 0x8B98, 0x92F8, 0x8B99, 0x6F01, + 0x8B9A, 0x79A6, 0x8B9B, 0x9B5A, 0x8B9C, 0x4EA8, 0x8B9D, 0x4EAB, + 0x8B9E, 0x4EAC, 0x8B9F, 0x4F9B, 0x8BA0, 0x4FA0, 0x8BA1, 0x50D1, + 0x8BA2, 0x5147, 0x8BA3, 0x7AF6, 0x8BA4, 0x5171, 0x8BA5, 0x51F6, + 0x8BA6, 0x5354, 0x8BA7, 0x5321, 0x8BA8, 0x537F, 0x8BA9, 0x53EB, + 0x8BAA, 0x55AC, 0x8BAB, 0x5883, 0x8BAC, 0x5CE1, 0x8BAD, 0x5F37, + 0x8BAE, 0x5F4A, 0x8BAF, 0x602F, 0x8BB0, 0x6050, 0x8BB1, 0x606D, + 0x8BB2, 0x631F, 0x8BB3, 0x6559, 0x8BB4, 0x6A4B, 0x8BB5, 0x6CC1, + 0x8BB6, 0x72C2, 0x8BB7, 0x72ED, 0x8BB8, 0x77EF, 0x8BB9, 0x80F8, + 0x8BBA, 0x8105, 0x8BBB, 0x8208, 0x8BBC, 0x854E, 0x8BBD, 0x90F7, + 0x8BBE, 0x93E1, 0x8BBF, 0x97FF, 0x8BC0, 0x9957, 0x8BC1, 0x9A5A, + 0x8BC2, 0x4EF0, 0x8BC3, 0x51DD, 0x8BC4, 0x5C2D, 0x8BC5, 0x6681, + 0x8BC6, 0x696D, 0x8BC7, 0x5C40, 0x8BC8, 0x66F2, 0x8BC9, 0x6975, + 0x8BCA, 0x7389, 0x8BCB, 0x6850, 0x8BCC, 0x7C81, 0x8BCD, 0x50C5, + 0x8BCE, 0x52E4, 0x8BCF, 0x5747, 0x8BD0, 0x5DFE, 0x8BD1, 0x9326, + 0x8BD2, 0x65A4, 0x8BD3, 0x6B23, 0x8BD4, 0x6B3D, 0x8BD5, 0x7434, + 0x8BD6, 0x7981, 0x8BD7, 0x79BD, 0x8BD8, 0x7B4B, 0x8BD9, 0x7DCA, + 0x8BDA, 0x82B9, 0x8BDB, 0x83CC, 0x8BDC, 0x887F, 0x8BDD, 0x895F, + 0x8BDE, 0x8B39, 0x8BDF, 0x8FD1, 0x8BE0, 0x91D1, 0x8BE1, 0x541F, + 0x8BE2, 0x9280, 0x8BE3, 0x4E5D, 0x8BE4, 0x5036, 0x8BE5, 0x53E5, + 0x8BE6, 0x533A, 0x8BE7, 0x72D7, 0x8BE8, 0x7396, 0x8BE9, 0x77E9, + 0x8BEA, 0x82E6, 0x8BEB, 0x8EAF, 0x8BEC, 0x99C6, 0x8BED, 0x99C8, + 0x8BEE, 0x99D2, 0x8BEF, 0x5177, 0x8BF0, 0x611A, 0x8BF1, 0x865E, + 0x8BF2, 0x55B0, 0x8BF3, 0x7A7A, 0x8BF4, 0x5076, 0x8BF5, 0x5BD3, + 0x8BF6, 0x9047, 0x8BF7, 0x9685, 0x8BF8, 0x4E32, 0x8BF9, 0x6ADB, + 0x8BFA, 0x91E7, 0x8BFB, 0x5C51, 0x8BFC, 0x5C48, 0x8C40, 0x6398, + 0x8C41, 0x7A9F, 0x8C42, 0x6C93, 0x8C43, 0x9774, 0x8C44, 0x8F61, + 0x8C45, 0x7AAA, 0x8C46, 0x718A, 0x8C47, 0x9688, 0x8C48, 0x7C82, + 0x8C49, 0x6817, 0x8C4A, 0x7E70, 0x8C4B, 0x6851, 0x8C4C, 0x936C, + 0x8C4D, 0x52F2, 0x8C4E, 0x541B, 0x8C4F, 0x85AB, 0x8C50, 0x8A13, + 0x8C51, 0x7FA4, 0x8C52, 0x8ECD, 0x8C53, 0x90E1, 0x8C54, 0x5366, + 0x8C55, 0x8888, 0x8C56, 0x7941, 0x8C57, 0x4FC2, 0x8C58, 0x50BE, + 0x8C59, 0x5211, 0x8C5A, 0x5144, 0x8C5B, 0x5553, 0x8C5C, 0x572D, + 0x8C5D, 0x73EA, 0x8C5E, 0x578B, 0x8C5F, 0x5951, 0x8C60, 0x5F62, + 0x8C61, 0x5F84, 0x8C62, 0x6075, 0x8C63, 0x6176, 0x8C64, 0x6167, + 0x8C65, 0x61A9, 0x8C66, 0x63B2, 0x8C67, 0x643A, 0x8C68, 0x656C, + 0x8C69, 0x666F, 0x8C6A, 0x6842, 0x8C6B, 0x6E13, 0x8C6C, 0x7566, + 0x8C6D, 0x7A3D, 0x8C6E, 0x7CFB, 0x8C6F, 0x7D4C, 0x8C70, 0x7D99, + 0x8C71, 0x7E4B, 0x8C72, 0x7F6B, 0x8C73, 0x830E, 0x8C74, 0x834A, + 0x8C75, 0x86CD, 0x8C76, 0x8A08, 0x8C77, 0x8A63, 0x8C78, 0x8B66, + 0x8C79, 0x8EFD, 0x8C7A, 0x981A, 0x8C7B, 0x9D8F, 0x8C7C, 0x82B8, + 0x8C7D, 0x8FCE, 0x8C7E, 0x9BE8, 0x8C80, 0x5287, 0x8C81, 0x621F, + 0x8C82, 0x6483, 0x8C83, 0x6FC0, 0x8C84, 0x9699, 0x8C85, 0x6841, + 0x8C86, 0x5091, 0x8C87, 0x6B20, 0x8C88, 0x6C7A, 0x8C89, 0x6F54, + 0x8C8A, 0x7A74, 0x8C8B, 0x7D50, 0x8C8C, 0x8840, 0x8C8D, 0x8A23, + 0x8C8E, 0x6708, 0x8C8F, 0x4EF6, 0x8C90, 0x5039, 0x8C91, 0x5026, + 0x8C92, 0x5065, 0x8C93, 0x517C, 0x8C94, 0x5238, 0x8C95, 0x5263, + 0x8C96, 0x55A7, 0x8C97, 0x570F, 0x8C98, 0x5805, 0x8C99, 0x5ACC, + 0x8C9A, 0x5EFA, 0x8C9B, 0x61B2, 0x8C9C, 0x61F8, 0x8C9D, 0x62F3, + 0x8C9E, 0x6372, 0x8C9F, 0x691C, 0x8CA0, 0x6A29, 0x8CA1, 0x727D, + 0x8CA2, 0x72AC, 0x8CA3, 0x732E, 0x8CA4, 0x7814, 0x8CA5, 0x786F, + 0x8CA6, 0x7D79, 0x8CA7, 0x770C, 0x8CA8, 0x80A9, 0x8CA9, 0x898B, + 0x8CAA, 0x8B19, 0x8CAB, 0x8CE2, 0x8CAC, 0x8ED2, 0x8CAD, 0x9063, + 0x8CAE, 0x9375, 0x8CAF, 0x967A, 0x8CB0, 0x9855, 0x8CB1, 0x9A13, + 0x8CB2, 0x9E78, 0x8CB3, 0x5143, 0x8CB4, 0x539F, 0x8CB5, 0x53B3, + 0x8CB6, 0x5E7B, 0x8CB7, 0x5F26, 0x8CB8, 0x6E1B, 0x8CB9, 0x6E90, + 0x8CBA, 0x7384, 0x8CBB, 0x73FE, 0x8CBC, 0x7D43, 0x8CBD, 0x8237, + 0x8CBE, 0x8A00, 0x8CBF, 0x8AFA, 0x8CC0, 0x9650, 0x8CC1, 0x4E4E, + 0x8CC2, 0x500B, 0x8CC3, 0x53E4, 0x8CC4, 0x547C, 0x8CC5, 0x56FA, + 0x8CC6, 0x59D1, 0x8CC7, 0x5B64, 0x8CC8, 0x5DF1, 0x8CC9, 0x5EAB, + 0x8CCA, 0x5F27, 0x8CCB, 0x6238, 0x8CCC, 0x6545, 0x8CCD, 0x67AF, + 0x8CCE, 0x6E56, 0x8CCF, 0x72D0, 0x8CD0, 0x7CCA, 0x8CD1, 0x88B4, + 0x8CD2, 0x80A1, 0x8CD3, 0x80E1, 0x8CD4, 0x83F0, 0x8CD5, 0x864E, + 0x8CD6, 0x8A87, 0x8CD7, 0x8DE8, 0x8CD8, 0x9237, 0x8CD9, 0x96C7, + 0x8CDA, 0x9867, 0x8CDB, 0x9F13, 0x8CDC, 0x4E94, 0x8CDD, 0x4E92, + 0x8CDE, 0x4F0D, 0x8CDF, 0x5348, 0x8CE0, 0x5449, 0x8CE1, 0x543E, + 0x8CE2, 0x5A2F, 0x8CE3, 0x5F8C, 0x8CE4, 0x5FA1, 0x8CE5, 0x609F, + 0x8CE6, 0x68A7, 0x8CE7, 0x6A8E, 0x8CE8, 0x745A, 0x8CE9, 0x7881, + 0x8CEA, 0x8A9E, 0x8CEB, 0x8AA4, 0x8CEC, 0x8B77, 0x8CED, 0x9190, + 0x8CEE, 0x4E5E, 0x8CEF, 0x9BC9, 0x8CF0, 0x4EA4, 0x8CF1, 0x4F7C, + 0x8CF2, 0x4FAF, 0x8CF3, 0x5019, 0x8CF4, 0x5016, 0x8CF5, 0x5149, + 0x8CF6, 0x516C, 0x8CF7, 0x529F, 0x8CF8, 0x52B9, 0x8CF9, 0x52FE, + 0x8CFA, 0x539A, 0x8CFB, 0x53E3, 0x8CFC, 0x5411, 0x8D40, 0x540E, + 0x8D41, 0x5589, 0x8D42, 0x5751, 0x8D43, 0x57A2, 0x8D44, 0x597D, + 0x8D45, 0x5B54, 0x8D46, 0x5B5D, 0x8D47, 0x5B8F, 0x8D48, 0x5DE5, + 0x8D49, 0x5DE7, 0x8D4A, 0x5DF7, 0x8D4B, 0x5E78, 0x8D4C, 0x5E83, + 0x8D4D, 0x5E9A, 0x8D4E, 0x5EB7, 0x8D4F, 0x5F18, 0x8D50, 0x6052, + 0x8D51, 0x614C, 0x8D52, 0x6297, 0x8D53, 0x62D8, 0x8D54, 0x63A7, + 0x8D55, 0x653B, 0x8D56, 0x6602, 0x8D57, 0x6643, 0x8D58, 0x66F4, + 0x8D59, 0x676D, 0x8D5A, 0x6821, 0x8D5B, 0x6897, 0x8D5C, 0x69CB, + 0x8D5D, 0x6C5F, 0x8D5E, 0x6D2A, 0x8D5F, 0x6D69, 0x8D60, 0x6E2F, + 0x8D61, 0x6E9D, 0x8D62, 0x7532, 0x8D63, 0x7687, 0x8D64, 0x786C, + 0x8D65, 0x7A3F, 0x8D66, 0x7CE0, 0x8D67, 0x7D05, 0x8D68, 0x7D18, + 0x8D69, 0x7D5E, 0x8D6A, 0x7DB1, 0x8D6B, 0x8015, 0x8D6C, 0x8003, + 0x8D6D, 0x80AF, 0x8D6E, 0x80B1, 0x8D6F, 0x8154, 0x8D70, 0x818F, + 0x8D71, 0x822A, 0x8D72, 0x8352, 0x8D73, 0x884C, 0x8D74, 0x8861, + 0x8D75, 0x8B1B, 0x8D76, 0x8CA2, 0x8D77, 0x8CFC, 0x8D78, 0x90CA, + 0x8D79, 0x9175, 0x8D7A, 0x9271, 0x8D7B, 0x783F, 0x8D7C, 0x92FC, + 0x8D7D, 0x95A4, 0x8D7E, 0x964D, 0x8D80, 0x9805, 0x8D81, 0x9999, + 0x8D82, 0x9AD8, 0x8D83, 0x9D3B, 0x8D84, 0x525B, 0x8D85, 0x52AB, + 0x8D86, 0x53F7, 0x8D87, 0x5408, 0x8D88, 0x58D5, 0x8D89, 0x62F7, + 0x8D8A, 0x6FE0, 0x8D8B, 0x8C6A, 0x8D8C, 0x8F5F, 0x8D8D, 0x9EB9, + 0x8D8E, 0x514B, 0x8D8F, 0x523B, 0x8D90, 0x544A, 0x8D91, 0x56FD, + 0x8D92, 0x7A40, 0x8D93, 0x9177, 0x8D94, 0x9D60, 0x8D95, 0x9ED2, + 0x8D96, 0x7344, 0x8D97, 0x6F09, 0x8D98, 0x8170, 0x8D99, 0x7511, + 0x8D9A, 0x5FFD, 0x8D9B, 0x60DA, 0x8D9C, 0x9AA8, 0x8D9D, 0x72DB, + 0x8D9E, 0x8FBC, 0x8D9F, 0x6B64, 0x8DA0, 0x9803, 0x8DA1, 0x4ECA, + 0x8DA2, 0x56F0, 0x8DA3, 0x5764, 0x8DA4, 0x58BE, 0x8DA5, 0x5A5A, + 0x8DA6, 0x6068, 0x8DA7, 0x61C7, 0x8DA8, 0x660F, 0x8DA9, 0x6606, + 0x8DAA, 0x6839, 0x8DAB, 0x68B1, 0x8DAC, 0x6DF7, 0x8DAD, 0x75D5, + 0x8DAE, 0x7D3A, 0x8DAF, 0x826E, 0x8DB0, 0x9B42, 0x8DB1, 0x4E9B, + 0x8DB2, 0x4F50, 0x8DB3, 0x53C9, 0x8DB4, 0x5506, 0x8DB5, 0x5D6F, + 0x8DB6, 0x5DE6, 0x8DB7, 0x5DEE, 0x8DB8, 0x67FB, 0x8DB9, 0x6C99, + 0x8DBA, 0x7473, 0x8DBB, 0x7802, 0x8DBC, 0x8A50, 0x8DBD, 0x9396, + 0x8DBE, 0x88DF, 0x8DBF, 0x5750, 0x8DC0, 0x5EA7, 0x8DC1, 0x632B, + 0x8DC2, 0x50B5, 0x8DC3, 0x50AC, 0x8DC4, 0x518D, 0x8DC5, 0x6700, + 0x8DC6, 0x54C9, 0x8DC7, 0x585E, 0x8DC8, 0x59BB, 0x8DC9, 0x5BB0, + 0x8DCA, 0x5F69, 0x8DCB, 0x624D, 0x8DCC, 0x63A1, 0x8DCD, 0x683D, + 0x8DCE, 0x6B73, 0x8DCF, 0x6E08, 0x8DD0, 0x707D, 0x8DD1, 0x91C7, + 0x8DD2, 0x7280, 0x8DD3, 0x7815, 0x8DD4, 0x7826, 0x8DD5, 0x796D, + 0x8DD6, 0x658E, 0x8DD7, 0x7D30, 0x8DD8, 0x83DC, 0x8DD9, 0x88C1, + 0x8DDA, 0x8F09, 0x8DDB, 0x969B, 0x8DDC, 0x5264, 0x8DDD, 0x5728, + 0x8DDE, 0x6750, 0x8DDF, 0x7F6A, 0x8DE0, 0x8CA1, 0x8DE1, 0x51B4, + 0x8DE2, 0x5742, 0x8DE3, 0x962A, 0x8DE4, 0x583A, 0x8DE5, 0x698A, + 0x8DE6, 0x80B4, 0x8DE7, 0x54B2, 0x8DE8, 0x5D0E, 0x8DE9, 0x57FC, + 0x8DEA, 0x7895, 0x8DEB, 0x9DFA, 0x8DEC, 0x4F5C, 0x8DED, 0x524A, + 0x8DEE, 0x548B, 0x8DEF, 0x643E, 0x8DF0, 0x6628, 0x8DF1, 0x6714, + 0x8DF2, 0x67F5, 0x8DF3, 0x7A84, 0x8DF4, 0x7B56, 0x8DF5, 0x7D22, + 0x8DF6, 0x932F, 0x8DF7, 0x685C, 0x8DF8, 0x9BAD, 0x8DF9, 0x7B39, + 0x8DFA, 0x5319, 0x8DFB, 0x518A, 0x8DFC, 0x5237, 0x8E40, 0x5BDF, + 0x8E41, 0x62F6, 0x8E42, 0x64AE, 0x8E43, 0x64E6, 0x8E44, 0x672D, + 0x8E45, 0x6BBA, 0x8E46, 0x85A9, 0x8E47, 0x96D1, 0x8E48, 0x7690, + 0x8E49, 0x9BD6, 0x8E4A, 0x634C, 0x8E4B, 0x9306, 0x8E4C, 0x9BAB, + 0x8E4D, 0x76BF, 0x8E4E, 0x6652, 0x8E4F, 0x4E09, 0x8E50, 0x5098, + 0x8E51, 0x53C2, 0x8E52, 0x5C71, 0x8E53, 0x60E8, 0x8E54, 0x6492, + 0x8E55, 0x6563, 0x8E56, 0x685F, 0x8E57, 0x71E6, 0x8E58, 0x73CA, + 0x8E59, 0x7523, 0x8E5A, 0x7B97, 0x8E5B, 0x7E82, 0x8E5C, 0x8695, + 0x8E5D, 0x8B83, 0x8E5E, 0x8CDB, 0x8E5F, 0x9178, 0x8E60, 0x9910, + 0x8E61, 0x65AC, 0x8E62, 0x66AB, 0x8E63, 0x6B8B, 0x8E64, 0x4ED5, + 0x8E65, 0x4ED4, 0x8E66, 0x4F3A, 0x8E67, 0x4F7F, 0x8E68, 0x523A, + 0x8E69, 0x53F8, 0x8E6A, 0x53F2, 0x8E6B, 0x55E3, 0x8E6C, 0x56DB, + 0x8E6D, 0x58EB, 0x8E6E, 0x59CB, 0x8E6F, 0x59C9, 0x8E70, 0x59FF, + 0x8E71, 0x5B50, 0x8E72, 0x5C4D, 0x8E73, 0x5E02, 0x8E74, 0x5E2B, + 0x8E75, 0x5FD7, 0x8E76, 0x601D, 0x8E77, 0x6307, 0x8E78, 0x652F, + 0x8E79, 0x5B5C, 0x8E7A, 0x65AF, 0x8E7B, 0x65BD, 0x8E7C, 0x65E8, + 0x8E7D, 0x679D, 0x8E7E, 0x6B62, 0x8E80, 0x6B7B, 0x8E81, 0x6C0F, + 0x8E82, 0x7345, 0x8E83, 0x7949, 0x8E84, 0x79C1, 0x8E85, 0x7CF8, + 0x8E86, 0x7D19, 0x8E87, 0x7D2B, 0x8E88, 0x80A2, 0x8E89, 0x8102, + 0x8E8A, 0x81F3, 0x8E8B, 0x8996, 0x8E8C, 0x8A5E, 0x8E8D, 0x8A69, + 0x8E8E, 0x8A66, 0x8E8F, 0x8A8C, 0x8E90, 0x8AEE, 0x8E91, 0x8CC7, + 0x8E92, 0x8CDC, 0x8E93, 0x96CC, 0x8E94, 0x98FC, 0x8E95, 0x6B6F, + 0x8E96, 0x4E8B, 0x8E97, 0x4F3C, 0x8E98, 0x4F8D, 0x8E99, 0x5150, + 0x8E9A, 0x5B57, 0x8E9B, 0x5BFA, 0x8E9C, 0x6148, 0x8E9D, 0x6301, + 0x8E9E, 0x6642, 0x8E9F, 0x6B21, 0x8EA0, 0x6ECB, 0x8EA1, 0x6CBB, + 0x8EA2, 0x723E, 0x8EA3, 0x74BD, 0x8EA4, 0x75D4, 0x8EA5, 0x78C1, + 0x8EA6, 0x793A, 0x8EA7, 0x800C, 0x8EA8, 0x8033, 0x8EA9, 0x81EA, + 0x8EAA, 0x8494, 0x8EAB, 0x8F9E, 0x8EAC, 0x6C50, 0x8EAD, 0x9E7F, + 0x8EAE, 0x5F0F, 0x8EAF, 0x8B58, 0x8EB0, 0x9D2B, 0x8EB1, 0x7AFA, + 0x8EB2, 0x8EF8, 0x8EB3, 0x5B8D, 0x8EB4, 0x96EB, 0x8EB5, 0x4E03, + 0x8EB6, 0x53F1, 0x8EB7, 0x57F7, 0x8EB8, 0x5931, 0x8EB9, 0x5AC9, + 0x8EBA, 0x5BA4, 0x8EBB, 0x6089, 0x8EBC, 0x6E7F, 0x8EBD, 0x6F06, + 0x8EBE, 0x75BE, 0x8EBF, 0x8CEA, 0x8EC0, 0x5B9F, 0x8EC1, 0x8500, + 0x8EC2, 0x7BE0, 0x8EC3, 0x5072, 0x8EC4, 0x67F4, 0x8EC5, 0x829D, + 0x8EC6, 0x5C61, 0x8EC7, 0x854A, 0x8EC8, 0x7E1E, 0x8EC9, 0x820E, + 0x8ECA, 0x5199, 0x8ECB, 0x5C04, 0x8ECC, 0x6368, 0x8ECD, 0x8D66, + 0x8ECE, 0x659C, 0x8ECF, 0x716E, 0x8ED0, 0x793E, 0x8ED1, 0x7D17, + 0x8ED2, 0x8005, 0x8ED3, 0x8B1D, 0x8ED4, 0x8ECA, 0x8ED5, 0x906E, + 0x8ED6, 0x86C7, 0x8ED7, 0x90AA, 0x8ED8, 0x501F, 0x8ED9, 0x52FA, + 0x8EDA, 0x5C3A, 0x8EDB, 0x6753, 0x8EDC, 0x707C, 0x8EDD, 0x7235, + 0x8EDE, 0x914C, 0x8EDF, 0x91C8, 0x8EE0, 0x932B, 0x8EE1, 0x82E5, + 0x8EE2, 0x5BC2, 0x8EE3, 0x5F31, 0x8EE4, 0x60F9, 0x8EE5, 0x4E3B, + 0x8EE6, 0x53D6, 0x8EE7, 0x5B88, 0x8EE8, 0x624B, 0x8EE9, 0x6731, + 0x8EEA, 0x6B8A, 0x8EEB, 0x72E9, 0x8EEC, 0x73E0, 0x8EED, 0x7A2E, + 0x8EEE, 0x816B, 0x8EEF, 0x8DA3, 0x8EF0, 0x9152, 0x8EF1, 0x9996, + 0x8EF2, 0x5112, 0x8EF3, 0x53D7, 0x8EF4, 0x546A, 0x8EF5, 0x5BFF, + 0x8EF6, 0x6388, 0x8EF7, 0x6A39, 0x8EF8, 0x7DAC, 0x8EF9, 0x9700, + 0x8EFA, 0x56DA, 0x8EFB, 0x53CE, 0x8EFC, 0x5468, 0x8F40, 0x5B97, + 0x8F41, 0x5C31, 0x8F42, 0x5DDE, 0x8F43, 0x4FEE, 0x8F44, 0x6101, + 0x8F45, 0x62FE, 0x8F46, 0x6D32, 0x8F47, 0x79C0, 0x8F48, 0x79CB, + 0x8F49, 0x7D42, 0x8F4A, 0x7E4D, 0x8F4B, 0x7FD2, 0x8F4C, 0x81ED, + 0x8F4D, 0x821F, 0x8F4E, 0x8490, 0x8F4F, 0x8846, 0x8F50, 0x8972, + 0x8F51, 0x8B90, 0x8F52, 0x8E74, 0x8F53, 0x8F2F, 0x8F54, 0x9031, + 0x8F55, 0x914B, 0x8F56, 0x916C, 0x8F57, 0x96C6, 0x8F58, 0x919C, + 0x8F59, 0x4EC0, 0x8F5A, 0x4F4F, 0x8F5B, 0x5145, 0x8F5C, 0x5341, + 0x8F5D, 0x5F93, 0x8F5E, 0x620E, 0x8F5F, 0x67D4, 0x8F60, 0x6C41, + 0x8F61, 0x6E0B, 0x8F62, 0x7363, 0x8F63, 0x7E26, 0x8F64, 0x91CD, + 0x8F65, 0x9283, 0x8F66, 0x53D4, 0x8F67, 0x5919, 0x8F68, 0x5BBF, + 0x8F69, 0x6DD1, 0x8F6A, 0x795D, 0x8F6B, 0x7E2E, 0x8F6C, 0x7C9B, + 0x8F6D, 0x587E, 0x8F6E, 0x719F, 0x8F6F, 0x51FA, 0x8F70, 0x8853, + 0x8F71, 0x8FF0, 0x8F72, 0x4FCA, 0x8F73, 0x5CFB, 0x8F74, 0x6625, + 0x8F75, 0x77AC, 0x8F76, 0x7AE3, 0x8F77, 0x821C, 0x8F78, 0x99FF, + 0x8F79, 0x51C6, 0x8F7A, 0x5FAA, 0x8F7B, 0x65EC, 0x8F7C, 0x696F, + 0x8F7D, 0x6B89, 0x8F7E, 0x6DF3, 0x8F80, 0x6E96, 0x8F81, 0x6F64, + 0x8F82, 0x76FE, 0x8F83, 0x7D14, 0x8F84, 0x5DE1, 0x8F85, 0x9075, + 0x8F86, 0x9187, 0x8F87, 0x9806, 0x8F88, 0x51E6, 0x8F89, 0x521D, + 0x8F8A, 0x6240, 0x8F8B, 0x6691, 0x8F8C, 0x66D9, 0x8F8D, 0x6E1A, + 0x8F8E, 0x5EB6, 0x8F8F, 0x7DD2, 0x8F90, 0x7F72, 0x8F91, 0x66F8, + 0x8F92, 0x85AF, 0x8F93, 0x85F7, 0x8F94, 0x8AF8, 0x8F95, 0x52A9, + 0x8F96, 0x53D9, 0x8F97, 0x5973, 0x8F98, 0x5E8F, 0x8F99, 0x5F90, + 0x8F9A, 0x6055, 0x8F9B, 0x92E4, 0x8F9C, 0x9664, 0x8F9D, 0x50B7, + 0x8F9E, 0x511F, 0x8F9F, 0x52DD, 0x8FA0, 0x5320, 0x8FA1, 0x5347, + 0x8FA2, 0x53EC, 0x8FA3, 0x54E8, 0x8FA4, 0x5546, 0x8FA5, 0x5531, + 0x8FA6, 0x5617, 0x8FA7, 0x5968, 0x8FA8, 0x59BE, 0x8FA9, 0x5A3C, + 0x8FAA, 0x5BB5, 0x8FAB, 0x5C06, 0x8FAC, 0x5C0F, 0x8FAD, 0x5C11, + 0x8FAE, 0x5C1A, 0x8FAF, 0x5E84, 0x8FB0, 0x5E8A, 0x8FB1, 0x5EE0, + 0x8FB2, 0x5F70, 0x8FB3, 0x627F, 0x8FB4, 0x6284, 0x8FB5, 0x62DB, + 0x8FB6, 0x638C, 0x8FB7, 0x6377, 0x8FB8, 0x6607, 0x8FB9, 0x660C, + 0x8FBA, 0x662D, 0x8FBB, 0x6676, 0x8FBC, 0x677E, 0x8FBD, 0x68A2, + 0x8FBE, 0x6A1F, 0x8FBF, 0x6A35, 0x8FC0, 0x6CBC, 0x8FC1, 0x6D88, + 0x8FC2, 0x6E09, 0x8FC3, 0x6E58, 0x8FC4, 0x713C, 0x8FC5, 0x7126, + 0x8FC6, 0x7167, 0x8FC7, 0x75C7, 0x8FC8, 0x7701, 0x8FC9, 0x785D, + 0x8FCA, 0x7901, 0x8FCB, 0x7965, 0x8FCC, 0x79F0, 0x8FCD, 0x7AE0, + 0x8FCE, 0x7B11, 0x8FCF, 0x7CA7, 0x8FD0, 0x7D39, 0x8FD1, 0x8096, + 0x8FD2, 0x83D6, 0x8FD3, 0x848B, 0x8FD4, 0x8549, 0x8FD5, 0x885D, + 0x8FD6, 0x88F3, 0x8FD7, 0x8A1F, 0x8FD8, 0x8A3C, 0x8FD9, 0x8A54, + 0x8FDA, 0x8A73, 0x8FDB, 0x8C61, 0x8FDC, 0x8CDE, 0x8FDD, 0x91A4, + 0x8FDE, 0x9266, 0x8FDF, 0x937E, 0x8FE0, 0x9418, 0x8FE1, 0x969C, + 0x8FE2, 0x9798, 0x8FE3, 0x4E0A, 0x8FE4, 0x4E08, 0x8FE5, 0x4E1E, + 0x8FE6, 0x4E57, 0x8FE7, 0x5197, 0x8FE8, 0x5270, 0x8FE9, 0x57CE, + 0x8FEA, 0x5834, 0x8FEB, 0x58CC, 0x8FEC, 0x5B22, 0x8FED, 0x5E38, + 0x8FEE, 0x60C5, 0x8FEF, 0x64FE, 0x8FF0, 0x6761, 0x8FF1, 0x6756, + 0x8FF2, 0x6D44, 0x8FF3, 0x72B6, 0x8FF4, 0x7573, 0x8FF5, 0x7A63, + 0x8FF6, 0x84B8, 0x8FF7, 0x8B72, 0x8FF8, 0x91B8, 0x8FF9, 0x9320, + 0x8FFA, 0x5631, 0x8FFB, 0x57F4, 0x8FFC, 0x98FE, 0x9040, 0x62ED, + 0x9041, 0x690D, 0x9042, 0x6B96, 0x9043, 0x71ED, 0x9044, 0x7E54, + 0x9045, 0x8077, 0x9046, 0x8272, 0x9047, 0x89E6, 0x9048, 0x98DF, + 0x9049, 0x8755, 0x904A, 0x8FB1, 0x904B, 0x5C3B, 0x904C, 0x4F38, + 0x904D, 0x4FE1, 0x904E, 0x4FB5, 0x904F, 0x5507, 0x9050, 0x5A20, + 0x9051, 0x5BDD, 0x9052, 0x5BE9, 0x9053, 0x5FC3, 0x9054, 0x614E, + 0x9055, 0x632F, 0x9056, 0x65B0, 0x9057, 0x664B, 0x9058, 0x68EE, + 0x9059, 0x699B, 0x905A, 0x6D78, 0x905B, 0x6DF1, 0x905C, 0x7533, + 0x905D, 0x75B9, 0x905E, 0x771F, 0x905F, 0x795E, 0x9060, 0x79E6, + 0x9061, 0x7D33, 0x9062, 0x81E3, 0x9063, 0x82AF, 0x9064, 0x85AA, + 0x9065, 0x89AA, 0x9066, 0x8A3A, 0x9067, 0x8EAB, 0x9068, 0x8F9B, + 0x9069, 0x9032, 0x906A, 0x91DD, 0x906B, 0x9707, 0x906C, 0x4EBA, + 0x906D, 0x4EC1, 0x906E, 0x5203, 0x906F, 0x5875, 0x9070, 0x58EC, + 0x9071, 0x5C0B, 0x9072, 0x751A, 0x9073, 0x5C3D, 0x9074, 0x814E, + 0x9075, 0x8A0A, 0x9076, 0x8FC5, 0x9077, 0x9663, 0x9078, 0x976D, + 0x9079, 0x7B25, 0x907A, 0x8ACF, 0x907B, 0x9808, 0x907C, 0x9162, + 0x907D, 0x56F3, 0x907E, 0x53A8, 0x9080, 0x9017, 0x9081, 0x5439, + 0x9082, 0x5782, 0x9083, 0x5E25, 0x9084, 0x63A8, 0x9085, 0x6C34, + 0x9086, 0x708A, 0x9087, 0x7761, 0x9088, 0x7C8B, 0x9089, 0x7FE0, + 0x908A, 0x8870, 0x908B, 0x9042, 0x908C, 0x9154, 0x908D, 0x9310, + 0x908E, 0x9318, 0x908F, 0x968F, 0x9090, 0x745E, 0x9091, 0x9AC4, + 0x9092, 0x5D07, 0x9093, 0x5D69, 0x9094, 0x6570, 0x9095, 0x67A2, + 0x9096, 0x8DA8, 0x9097, 0x96DB, 0x9098, 0x636E, 0x9099, 0x6749, + 0x909A, 0x6919, 0x909B, 0x83C5, 0x909C, 0x9817, 0x909D, 0x96C0, + 0x909E, 0x88FE, 0x909F, 0x6F84, 0x90A0, 0x647A, 0x90A1, 0x5BF8, + 0x90A2, 0x4E16, 0x90A3, 0x702C, 0x90A4, 0x755D, 0x90A5, 0x662F, + 0x90A6, 0x51C4, 0x90A7, 0x5236, 0x90A8, 0x52E2, 0x90A9, 0x59D3, + 0x90AA, 0x5F81, 0x90AB, 0x6027, 0x90AC, 0x6210, 0x90AD, 0x653F, + 0x90AE, 0x6574, 0x90AF, 0x661F, 0x90B0, 0x6674, 0x90B1, 0x68F2, + 0x90B2, 0x6816, 0x90B3, 0x6B63, 0x90B4, 0x6E05, 0x90B5, 0x7272, + 0x90B6, 0x751F, 0x90B7, 0x76DB, 0x90B8, 0x7CBE, 0x90B9, 0x8056, + 0x90BA, 0x58F0, 0x90BB, 0x88FD, 0x90BC, 0x897F, 0x90BD, 0x8AA0, + 0x90BE, 0x8A93, 0x90BF, 0x8ACB, 0x90C0, 0x901D, 0x90C1, 0x9192, + 0x90C2, 0x9752, 0x90C3, 0x9759, 0x90C4, 0x6589, 0x90C5, 0x7A0E, + 0x90C6, 0x8106, 0x90C7, 0x96BB, 0x90C8, 0x5E2D, 0x90C9, 0x60DC, + 0x90CA, 0x621A, 0x90CB, 0x65A5, 0x90CC, 0x6614, 0x90CD, 0x6790, + 0x90CE, 0x77F3, 0x90CF, 0x7A4D, 0x90D0, 0x7C4D, 0x90D1, 0x7E3E, + 0x90D2, 0x810A, 0x90D3, 0x8CAC, 0x90D4, 0x8D64, 0x90D5, 0x8DE1, + 0x90D6, 0x8E5F, 0x90D7, 0x78A9, 0x90D8, 0x5207, 0x90D9, 0x62D9, + 0x90DA, 0x63A5, 0x90DB, 0x6442, 0x90DC, 0x6298, 0x90DD, 0x8A2D, + 0x90DE, 0x7A83, 0x90DF, 0x7BC0, 0x90E0, 0x8AAC, 0x90E1, 0x96EA, + 0x90E2, 0x7D76, 0x90E3, 0x820C, 0x90E4, 0x8749, 0x90E5, 0x4ED9, + 0x90E6, 0x5148, 0x90E7, 0x5343, 0x90E8, 0x5360, 0x90E9, 0x5BA3, + 0x90EA, 0x5C02, 0x90EB, 0x5C16, 0x90EC, 0x5DDD, 0x90ED, 0x6226, + 0x90EE, 0x6247, 0x90EF, 0x64B0, 0x90F0, 0x6813, 0x90F1, 0x6834, + 0x90F2, 0x6CC9, 0x90F3, 0x6D45, 0x90F4, 0x6D17, 0x90F5, 0x67D3, + 0x90F6, 0x6F5C, 0x90F7, 0x714E, 0x90F8, 0x717D, 0x90F9, 0x65CB, + 0x90FA, 0x7A7F, 0x90FB, 0x7BAD, 0x90FC, 0x7DDA, 0x9140, 0x7E4A, + 0x9141, 0x7FA8, 0x9142, 0x817A, 0x9143, 0x821B, 0x9144, 0x8239, + 0x9145, 0x85A6, 0x9146, 0x8A6E, 0x9147, 0x8CCE, 0x9148, 0x8DF5, + 0x9149, 0x9078, 0x914A, 0x9077, 0x914B, 0x92AD, 0x914C, 0x9291, + 0x914D, 0x9583, 0x914E, 0x9BAE, 0x914F, 0x524D, 0x9150, 0x5584, + 0x9151, 0x6F38, 0x9152, 0x7136, 0x9153, 0x5168, 0x9154, 0x7985, + 0x9155, 0x7E55, 0x9156, 0x81B3, 0x9157, 0x7CCE, 0x9158, 0x564C, + 0x9159, 0x5851, 0x915A, 0x5CA8, 0x915B, 0x63AA, 0x915C, 0x66FE, + 0x915D, 0x66FD, 0x915E, 0x695A, 0x915F, 0x72D9, 0x9160, 0x758F, + 0x9161, 0x758E, 0x9162, 0x790E, 0x9163, 0x7956, 0x9164, 0x79DF, + 0x9165, 0x7C97, 0x9166, 0x7D20, 0x9167, 0x7D44, 0x9168, 0x8607, + 0x9169, 0x8A34, 0x916A, 0x963B, 0x916B, 0x9061, 0x916C, 0x9F20, + 0x916D, 0x50E7, 0x916E, 0x5275, 0x916F, 0x53CC, 0x9170, 0x53E2, + 0x9171, 0x5009, 0x9172, 0x55AA, 0x9173, 0x58EE, 0x9174, 0x594F, + 0x9175, 0x723D, 0x9176, 0x5B8B, 0x9177, 0x5C64, 0x9178, 0x531D, + 0x9179, 0x60E3, 0x917A, 0x60F3, 0x917B, 0x635C, 0x917C, 0x6383, + 0x917D, 0x633F, 0x917E, 0x63BB, 0x9180, 0x64CD, 0x9181, 0x65E9, + 0x9182, 0x66F9, 0x9183, 0x5DE3, 0x9184, 0x69CD, 0x9185, 0x69FD, + 0x9186, 0x6F15, 0x9187, 0x71E5, 0x9188, 0x4E89, 0x9189, 0x75E9, + 0x918A, 0x76F8, 0x918B, 0x7A93, 0x918C, 0x7CDF, 0x918D, 0x7DCF, + 0x918E, 0x7D9C, 0x918F, 0x8061, 0x9190, 0x8349, 0x9191, 0x8358, + 0x9192, 0x846C, 0x9193, 0x84BC, 0x9194, 0x85FB, 0x9195, 0x88C5, + 0x9196, 0x8D70, 0x9197, 0x9001, 0x9198, 0x906D, 0x9199, 0x9397, + 0x919A, 0x971C, 0x919B, 0x9A12, 0x919C, 0x50CF, 0x919D, 0x5897, + 0x919E, 0x618E, 0x919F, 0x81D3, 0x91A0, 0x8535, 0x91A1, 0x8D08, + 0x91A2, 0x9020, 0x91A3, 0x4FC3, 0x91A4, 0x5074, 0x91A5, 0x5247, + 0x91A6, 0x5373, 0x91A7, 0x606F, 0x91A8, 0x6349, 0x91A9, 0x675F, + 0x91AA, 0x6E2C, 0x91AB, 0x8DB3, 0x91AC, 0x901F, 0x91AD, 0x4FD7, + 0x91AE, 0x5C5E, 0x91AF, 0x8CCA, 0x91B0, 0x65CF, 0x91B1, 0x7D9A, + 0x91B2, 0x5352, 0x91B3, 0x8896, 0x91B4, 0x5176, 0x91B5, 0x63C3, + 0x91B6, 0x5B58, 0x91B7, 0x5B6B, 0x91B8, 0x5C0A, 0x91B9, 0x640D, + 0x91BA, 0x6751, 0x91BB, 0x905C, 0x91BC, 0x4ED6, 0x91BD, 0x591A, + 0x91BE, 0x592A, 0x91BF, 0x6C70, 0x91C0, 0x8A51, 0x91C1, 0x553E, + 0x91C2, 0x5815, 0x91C3, 0x59A5, 0x91C4, 0x60F0, 0x91C5, 0x6253, + 0x91C6, 0x67C1, 0x91C7, 0x8235, 0x91C8, 0x6955, 0x91C9, 0x9640, + 0x91CA, 0x99C4, 0x91CB, 0x9A28, 0x91CC, 0x4F53, 0x91CD, 0x5806, + 0x91CE, 0x5BFE, 0x91CF, 0x8010, 0x91D0, 0x5CB1, 0x91D1, 0x5E2F, + 0x91D2, 0x5F85, 0x91D3, 0x6020, 0x91D4, 0x614B, 0x91D5, 0x6234, + 0x91D6, 0x66FF, 0x91D7, 0x6CF0, 0x91D8, 0x6EDE, 0x91D9, 0x80CE, + 0x91DA, 0x817F, 0x91DB, 0x82D4, 0x91DC, 0x888B, 0x91DD, 0x8CB8, + 0x91DE, 0x9000, 0x91DF, 0x902E, 0x91E0, 0x968A, 0x91E1, 0x9EDB, + 0x91E2, 0x9BDB, 0x91E3, 0x4EE3, 0x91E4, 0x53F0, 0x91E5, 0x5927, + 0x91E6, 0x7B2C, 0x91E7, 0x918D, 0x91E8, 0x984C, 0x91E9, 0x9DF9, + 0x91EA, 0x6EDD, 0x91EB, 0x7027, 0x91EC, 0x5353, 0x91ED, 0x5544, + 0x91EE, 0x5B85, 0x91EF, 0x6258, 0x91F0, 0x629E, 0x91F1, 0x62D3, + 0x91F2, 0x6CA2, 0x91F3, 0x6FEF, 0x91F4, 0x7422, 0x91F5, 0x8A17, + 0x91F6, 0x9438, 0x91F7, 0x6FC1, 0x91F8, 0x8AFE, 0x91F9, 0x8338, + 0x91FA, 0x51E7, 0x91FB, 0x86F8, 0x91FC, 0x53EA, 0x9240, 0x53E9, + 0x9241, 0x4F46, 0x9242, 0x9054, 0x9243, 0x8FB0, 0x9244, 0x596A, + 0x9245, 0x8131, 0x9246, 0x5DFD, 0x9247, 0x7AEA, 0x9248, 0x8FBF, + 0x9249, 0x68DA, 0x924A, 0x8C37, 0x924B, 0x72F8, 0x924C, 0x9C48, + 0x924D, 0x6A3D, 0x924E, 0x8AB0, 0x924F, 0x4E39, 0x9250, 0x5358, + 0x9251, 0x5606, 0x9252, 0x5766, 0x9253, 0x62C5, 0x9254, 0x63A2, + 0x9255, 0x65E6, 0x9256, 0x6B4E, 0x9257, 0x6DE1, 0x9258, 0x6E5B, + 0x9259, 0x70AD, 0x925A, 0x77ED, 0x925B, 0x7AEF, 0x925C, 0x7BAA, + 0x925D, 0x7DBB, 0x925E, 0x803D, 0x925F, 0x80C6, 0x9260, 0x86CB, + 0x9261, 0x8A95, 0x9262, 0x935B, 0x9263, 0x56E3, 0x9264, 0x58C7, + 0x9265, 0x5F3E, 0x9266, 0x65AD, 0x9267, 0x6696, 0x9268, 0x6A80, + 0x9269, 0x6BB5, 0x926A, 0x7537, 0x926B, 0x8AC7, 0x926C, 0x5024, + 0x926D, 0x77E5, 0x926E, 0x5730, 0x926F, 0x5F1B, 0x9270, 0x6065, + 0x9271, 0x667A, 0x9272, 0x6C60, 0x9273, 0x75F4, 0x9274, 0x7A1A, + 0x9275, 0x7F6E, 0x9276, 0x81F4, 0x9277, 0x8718, 0x9278, 0x9045, + 0x9279, 0x99B3, 0x927A, 0x7BC9, 0x927B, 0x755C, 0x927C, 0x7AF9, + 0x927D, 0x7B51, 0x927E, 0x84C4, 0x9280, 0x9010, 0x9281, 0x79E9, + 0x9282, 0x7A92, 0x9283, 0x8336, 0x9284, 0x5AE1, 0x9285, 0x7740, + 0x9286, 0x4E2D, 0x9287, 0x4EF2, 0x9288, 0x5B99, 0x9289, 0x5FE0, + 0x928A, 0x62BD, 0x928B, 0x663C, 0x928C, 0x67F1, 0x928D, 0x6CE8, + 0x928E, 0x866B, 0x928F, 0x8877, 0x9290, 0x8A3B, 0x9291, 0x914E, + 0x9292, 0x92F3, 0x9293, 0x99D0, 0x9294, 0x6A17, 0x9295, 0x7026, + 0x9296, 0x732A, 0x9297, 0x82E7, 0x9298, 0x8457, 0x9299, 0x8CAF, + 0x929A, 0x4E01, 0x929B, 0x5146, 0x929C, 0x51CB, 0x929D, 0x558B, + 0x929E, 0x5BF5, 0x929F, 0x5E16, 0x92A0, 0x5E33, 0x92A1, 0x5E81, + 0x92A2, 0x5F14, 0x92A3, 0x5F35, 0x92A4, 0x5F6B, 0x92A5, 0x5FB4, + 0x92A6, 0x61F2, 0x92A7, 0x6311, 0x92A8, 0x66A2, 0x92A9, 0x671D, + 0x92AA, 0x6F6E, 0x92AB, 0x7252, 0x92AC, 0x753A, 0x92AD, 0x773A, + 0x92AE, 0x8074, 0x92AF, 0x8139, 0x92B0, 0x8178, 0x92B1, 0x8776, + 0x92B2, 0x8ABF, 0x92B3, 0x8ADC, 0x92B4, 0x8D85, 0x92B5, 0x8DF3, + 0x92B6, 0x929A, 0x92B7, 0x9577, 0x92B8, 0x9802, 0x92B9, 0x9CE5, + 0x92BA, 0x52C5, 0x92BB, 0x6357, 0x92BC, 0x76F4, 0x92BD, 0x6715, + 0x92BE, 0x6C88, 0x92BF, 0x73CD, 0x92C0, 0x8CC3, 0x92C1, 0x93AE, + 0x92C2, 0x9673, 0x92C3, 0x6D25, 0x92C4, 0x589C, 0x92C5, 0x690E, + 0x92C6, 0x69CC, 0x92C7, 0x8FFD, 0x92C8, 0x939A, 0x92C9, 0x75DB, + 0x92CA, 0x901A, 0x92CB, 0x585A, 0x92CC, 0x6802, 0x92CD, 0x63B4, + 0x92CE, 0x69FB, 0x92CF, 0x4F43, 0x92D0, 0x6F2C, 0x92D1, 0x67D8, + 0x92D2, 0x8FBB, 0x92D3, 0x8526, 0x92D4, 0x7DB4, 0x92D5, 0x9354, + 0x92D6, 0x693F, 0x92D7, 0x6F70, 0x92D8, 0x576A, 0x92D9, 0x58F7, + 0x92DA, 0x5B2C, 0x92DB, 0x7D2C, 0x92DC, 0x722A, 0x92DD, 0x540A, + 0x92DE, 0x91E3, 0x92DF, 0x9DB4, 0x92E0, 0x4EAD, 0x92E1, 0x4F4E, + 0x92E2, 0x505C, 0x92E3, 0x5075, 0x92E4, 0x5243, 0x92E5, 0x8C9E, + 0x92E6, 0x5448, 0x92E7, 0x5824, 0x92E8, 0x5B9A, 0x92E9, 0x5E1D, + 0x92EA, 0x5E95, 0x92EB, 0x5EAD, 0x92EC, 0x5EF7, 0x92ED, 0x5F1F, + 0x92EE, 0x608C, 0x92EF, 0x62B5, 0x92F0, 0x633A, 0x92F1, 0x63D0, + 0x92F2, 0x68AF, 0x92F3, 0x6C40, 0x92F4, 0x7887, 0x92F5, 0x798E, + 0x92F6, 0x7A0B, 0x92F7, 0x7DE0, 0x92F8, 0x8247, 0x92F9, 0x8A02, + 0x92FA, 0x8AE6, 0x92FB, 0x8E44, 0x92FC, 0x9013, 0x9340, 0x90B8, + 0x9341, 0x912D, 0x9342, 0x91D8, 0x9343, 0x9F0E, 0x9344, 0x6CE5, + 0x9345, 0x6458, 0x9346, 0x64E2, 0x9347, 0x6575, 0x9348, 0x6EF4, + 0x9349, 0x7684, 0x934A, 0x7B1B, 0x934B, 0x9069, 0x934C, 0x93D1, + 0x934D, 0x6EBA, 0x934E, 0x54F2, 0x934F, 0x5FB9, 0x9350, 0x64A4, + 0x9351, 0x8F4D, 0x9352, 0x8FED, 0x9353, 0x9244, 0x9354, 0x5178, + 0x9355, 0x586B, 0x9356, 0x5929, 0x9357, 0x5C55, 0x9358, 0x5E97, + 0x9359, 0x6DFB, 0x935A, 0x7E8F, 0x935B, 0x751C, 0x935C, 0x8CBC, + 0x935D, 0x8EE2, 0x935E, 0x985B, 0x935F, 0x70B9, 0x9360, 0x4F1D, + 0x9361, 0x6BBF, 0x9362, 0x6FB1, 0x9363, 0x7530, 0x9364, 0x96FB, + 0x9365, 0x514E, 0x9366, 0x5410, 0x9367, 0x5835, 0x9368, 0x5857, + 0x9369, 0x59AC, 0x936A, 0x5C60, 0x936B, 0x5F92, 0x936C, 0x6597, + 0x936D, 0x675C, 0x936E, 0x6E21, 0x936F, 0x767B, 0x9370, 0x83DF, + 0x9371, 0x8CED, 0x9372, 0x9014, 0x9373, 0x90FD, 0x9374, 0x934D, + 0x9375, 0x7825, 0x9376, 0x783A, 0x9377, 0x52AA, 0x9378, 0x5EA6, + 0x9379, 0x571F, 0x937A, 0x5974, 0x937B, 0x6012, 0x937C, 0x5012, + 0x937D, 0x515A, 0x937E, 0x51AC, 0x9380, 0x51CD, 0x9381, 0x5200, + 0x9382, 0x5510, 0x9383, 0x5854, 0x9384, 0x5858, 0x9385, 0x5957, + 0x9386, 0x5B95, 0x9387, 0x5CF6, 0x9388, 0x5D8B, 0x9389, 0x60BC, + 0x938A, 0x6295, 0x938B, 0x642D, 0x938C, 0x6771, 0x938D, 0x6843, + 0x938E, 0x68BC, 0x938F, 0x68DF, 0x9390, 0x76D7, 0x9391, 0x6DD8, + 0x9392, 0x6E6F, 0x9393, 0x6D9B, 0x9394, 0x706F, 0x9395, 0x71C8, + 0x9396, 0x5F53, 0x9397, 0x75D8, 0x9398, 0x7977, 0x9399, 0x7B49, + 0x939A, 0x7B54, 0x939B, 0x7B52, 0x939C, 0x7CD6, 0x939D, 0x7D71, + 0x939E, 0x5230, 0x939F, 0x8463, 0x93A0, 0x8569, 0x93A1, 0x85E4, + 0x93A2, 0x8A0E, 0x93A3, 0x8B04, 0x93A4, 0x8C46, 0x93A5, 0x8E0F, + 0x93A6, 0x9003, 0x93A7, 0x900F, 0x93A8, 0x9419, 0x93A9, 0x9676, + 0x93AA, 0x982D, 0x93AB, 0x9A30, 0x93AC, 0x95D8, 0x93AD, 0x50CD, + 0x93AE, 0x52D5, 0x93AF, 0x540C, 0x93B0, 0x5802, 0x93B1, 0x5C0E, + 0x93B2, 0x61A7, 0x93B3, 0x649E, 0x93B4, 0x6D1E, 0x93B5, 0x77B3, + 0x93B6, 0x7AE5, 0x93B7, 0x80F4, 0x93B8, 0x8404, 0x93B9, 0x9053, + 0x93BA, 0x9285, 0x93BB, 0x5CE0, 0x93BC, 0x9D07, 0x93BD, 0x533F, + 0x93BE, 0x5F97, 0x93BF, 0x5FB3, 0x93C0, 0x6D9C, 0x93C1, 0x7279, + 0x93C2, 0x7763, 0x93C3, 0x79BF, 0x93C4, 0x7BE4, 0x93C5, 0x6BD2, + 0x93C6, 0x72EC, 0x93C7, 0x8AAD, 0x93C8, 0x6803, 0x93C9, 0x6A61, + 0x93CA, 0x51F8, 0x93CB, 0x7A81, 0x93CC, 0x6934, 0x93CD, 0x5C4A, + 0x93CE, 0x9CF6, 0x93CF, 0x82EB, 0x93D0, 0x5BC5, 0x93D1, 0x9149, + 0x93D2, 0x701E, 0x93D3, 0x5678, 0x93D4, 0x5C6F, 0x93D5, 0x60C7, + 0x93D6, 0x6566, 0x93D7, 0x6C8C, 0x93D8, 0x8C5A, 0x93D9, 0x9041, + 0x93DA, 0x9813, 0x93DB, 0x5451, 0x93DC, 0x66C7, 0x93DD, 0x920D, + 0x93DE, 0x5948, 0x93DF, 0x90A3, 0x93E0, 0x5185, 0x93E1, 0x4E4D, + 0x93E2, 0x51EA, 0x93E3, 0x8599, 0x93E4, 0x8B0E, 0x93E5, 0x7058, + 0x93E6, 0x637A, 0x93E7, 0x934B, 0x93E8, 0x6962, 0x93E9, 0x99B4, + 0x93EA, 0x7E04, 0x93EB, 0x7577, 0x93EC, 0x5357, 0x93ED, 0x6960, + 0x93EE, 0x8EDF, 0x93EF, 0x96E3, 0x93F0, 0x6C5D, 0x93F1, 0x4E8C, + 0x93F2, 0x5C3C, 0x93F3, 0x5F10, 0x93F4, 0x8FE9, 0x93F5, 0x5302, + 0x93F6, 0x8CD1, 0x93F7, 0x8089, 0x93F8, 0x8679, 0x93F9, 0x5EFF, + 0x93FA, 0x65E5, 0x93FB, 0x4E73, 0x93FC, 0x5165, 0x9440, 0x5982, + 0x9441, 0x5C3F, 0x9442, 0x97EE, 0x9443, 0x4EFB, 0x9444, 0x598A, + 0x9445, 0x5FCD, 0x9446, 0x8A8D, 0x9447, 0x6FE1, 0x9448, 0x79B0, + 0x9449, 0x7962, 0x944A, 0x5BE7, 0x944B, 0x8471, 0x944C, 0x732B, + 0x944D, 0x71B1, 0x944E, 0x5E74, 0x944F, 0x5FF5, 0x9450, 0x637B, + 0x9451, 0x649A, 0x9452, 0x71C3, 0x9453, 0x7C98, 0x9454, 0x4E43, + 0x9455, 0x5EFC, 0x9456, 0x4E4B, 0x9457, 0x57DC, 0x9458, 0x56A2, + 0x9459, 0x60A9, 0x945A, 0x6FC3, 0x945B, 0x7D0D, 0x945C, 0x80FD, + 0x945D, 0x8133, 0x945E, 0x81BF, 0x945F, 0x8FB2, 0x9460, 0x8997, + 0x9461, 0x86A4, 0x9462, 0x5DF4, 0x9463, 0x628A, 0x9464, 0x64AD, + 0x9465, 0x8987, 0x9466, 0x6777, 0x9467, 0x6CE2, 0x9468, 0x6D3E, + 0x9469, 0x7436, 0x946A, 0x7834, 0x946B, 0x5A46, 0x946C, 0x7F75, + 0x946D, 0x82AD, 0x946E, 0x99AC, 0x946F, 0x4FF3, 0x9470, 0x5EC3, + 0x9471, 0x62DD, 0x9472, 0x6392, 0x9473, 0x6557, 0x9474, 0x676F, + 0x9475, 0x76C3, 0x9476, 0x724C, 0x9477, 0x80CC, 0x9478, 0x80BA, + 0x9479, 0x8F29, 0x947A, 0x914D, 0x947B, 0x500D, 0x947C, 0x57F9, + 0x947D, 0x5A92, 0x947E, 0x6885, 0x9480, 0x6973, 0x9481, 0x7164, + 0x9482, 0x72FD, 0x9483, 0x8CB7, 0x9484, 0x58F2, 0x9485, 0x8CE0, + 0x9486, 0x966A, 0x9487, 0x9019, 0x9488, 0x877F, 0x9489, 0x79E4, + 0x948A, 0x77E7, 0x948B, 0x8429, 0x948C, 0x4F2F, 0x948D, 0x5265, + 0x948E, 0x535A, 0x948F, 0x62CD, 0x9490, 0x67CF, 0x9491, 0x6CCA, + 0x9492, 0x767D, 0x9493, 0x7B94, 0x9494, 0x7C95, 0x9495, 0x8236, + 0x9496, 0x8584, 0x9497, 0x8FEB, 0x9498, 0x66DD, 0x9499, 0x6F20, + 0x949A, 0x7206, 0x949B, 0x7E1B, 0x949C, 0x83AB, 0x949D, 0x99C1, + 0x949E, 0x9EA6, 0x949F, 0x51FD, 0x94A0, 0x7BB1, 0x94A1, 0x7872, + 0x94A2, 0x7BB8, 0x94A3, 0x8087, 0x94A4, 0x7B48, 0x94A5, 0x6AE8, + 0x94A6, 0x5E61, 0x94A7, 0x808C, 0x94A8, 0x7551, 0x94A9, 0x7560, + 0x94AA, 0x516B, 0x94AB, 0x9262, 0x94AC, 0x6E8C, 0x94AD, 0x767A, + 0x94AE, 0x9197, 0x94AF, 0x9AEA, 0x94B0, 0x4F10, 0x94B1, 0x7F70, + 0x94B2, 0x629C, 0x94B3, 0x7B4F, 0x94B4, 0x95A5, 0x94B5, 0x9CE9, + 0x94B6, 0x567A, 0x94B7, 0x5859, 0x94B8, 0x86E4, 0x94B9, 0x96BC, + 0x94BA, 0x4F34, 0x94BB, 0x5224, 0x94BC, 0x534A, 0x94BD, 0x53CD, + 0x94BE, 0x53DB, 0x94BF, 0x5E06, 0x94C0, 0x642C, 0x94C1, 0x6591, + 0x94C2, 0x677F, 0x94C3, 0x6C3E, 0x94C4, 0x6C4E, 0x94C5, 0x7248, + 0x94C6, 0x72AF, 0x94C7, 0x73ED, 0x94C8, 0x7554, 0x94C9, 0x7E41, + 0x94CA, 0x822C, 0x94CB, 0x85E9, 0x94CC, 0x8CA9, 0x94CD, 0x7BC4, + 0x94CE, 0x91C6, 0x94CF, 0x7169, 0x94D0, 0x9812, 0x94D1, 0x98EF, + 0x94D2, 0x633D, 0x94D3, 0x6669, 0x94D4, 0x756A, 0x94D5, 0x76E4, + 0x94D6, 0x78D0, 0x94D7, 0x8543, 0x94D8, 0x86EE, 0x94D9, 0x532A, + 0x94DA, 0x5351, 0x94DB, 0x5426, 0x94DC, 0x5983, 0x94DD, 0x5E87, + 0x94DE, 0x5F7C, 0x94DF, 0x60B2, 0x94E0, 0x6249, 0x94E1, 0x6279, + 0x94E2, 0x62AB, 0x94E3, 0x6590, 0x94E4, 0x6BD4, 0x94E5, 0x6CCC, + 0x94E6, 0x75B2, 0x94E7, 0x76AE, 0x94E8, 0x7891, 0x94E9, 0x79D8, + 0x94EA, 0x7DCB, 0x94EB, 0x7F77, 0x94EC, 0x80A5, 0x94ED, 0x88AB, + 0x94EE, 0x8AB9, 0x94EF, 0x8CBB, 0x94F0, 0x907F, 0x94F1, 0x975E, + 0x94F2, 0x98DB, 0x94F3, 0x6A0B, 0x94F4, 0x7C38, 0x94F5, 0x5099, + 0x94F6, 0x5C3E, 0x94F7, 0x5FAE, 0x94F8, 0x6787, 0x94F9, 0x6BD8, + 0x94FA, 0x7435, 0x94FB, 0x7709, 0x94FC, 0x7F8E, 0x9540, 0x9F3B, + 0x9541, 0x67CA, 0x9542, 0x7A17, 0x9543, 0x5339, 0x9544, 0x758B, + 0x9545, 0x9AED, 0x9546, 0x5F66, 0x9547, 0x819D, 0x9548, 0x83F1, + 0x9549, 0x8098, 0x954A, 0x5F3C, 0x954B, 0x5FC5, 0x954C, 0x7562, + 0x954D, 0x7B46, 0x954E, 0x903C, 0x954F, 0x6867, 0x9550, 0x59EB, + 0x9551, 0x5A9B, 0x9552, 0x7D10, 0x9553, 0x767E, 0x9554, 0x8B2C, + 0x9555, 0x4FF5, 0x9556, 0x5F6A, 0x9557, 0x6A19, 0x9558, 0x6C37, + 0x9559, 0x6F02, 0x955A, 0x74E2, 0x955B, 0x7968, 0x955C, 0x8868, + 0x955D, 0x8A55, 0x955E, 0x8C79, 0x955F, 0x5EDF, 0x9560, 0x63CF, + 0x9561, 0x75C5, 0x9562, 0x79D2, 0x9563, 0x82D7, 0x9564, 0x9328, + 0x9565, 0x92F2, 0x9566, 0x849C, 0x9567, 0x86ED, 0x9568, 0x9C2D, + 0x9569, 0x54C1, 0x956A, 0x5F6C, 0x956B, 0x658C, 0x956C, 0x6D5C, + 0x956D, 0x7015, 0x956E, 0x8CA7, 0x956F, 0x8CD3, 0x9570, 0x983B, + 0x9571, 0x654F, 0x9572, 0x74F6, 0x9573, 0x4E0D, 0x9574, 0x4ED8, + 0x9575, 0x57E0, 0x9576, 0x592B, 0x9577, 0x5A66, 0x9578, 0x5BCC, + 0x9579, 0x51A8, 0x957A, 0x5E03, 0x957B, 0x5E9C, 0x957C, 0x6016, + 0x957D, 0x6276, 0x957E, 0x6577, 0x9580, 0x65A7, 0x9581, 0x666E, + 0x9582, 0x6D6E, 0x9583, 0x7236, 0x9584, 0x7B26, 0x9585, 0x8150, + 0x9586, 0x819A, 0x9587, 0x8299, 0x9588, 0x8B5C, 0x9589, 0x8CA0, + 0x958A, 0x8CE6, 0x958B, 0x8D74, 0x958C, 0x961C, 0x958D, 0x9644, + 0x958E, 0x4FAE, 0x958F, 0x64AB, 0x9590, 0x6B66, 0x9591, 0x821E, + 0x9592, 0x8461, 0x9593, 0x856A, 0x9594, 0x90E8, 0x9595, 0x5C01, + 0x9596, 0x6953, 0x9597, 0x98A8, 0x9598, 0x847A, 0x9599, 0x8557, + 0x959A, 0x4F0F, 0x959B, 0x526F, 0x959C, 0x5FA9, 0x959D, 0x5E45, + 0x959E, 0x670D, 0x959F, 0x798F, 0x95A0, 0x8179, 0x95A1, 0x8907, + 0x95A2, 0x8986, 0x95A3, 0x6DF5, 0x95A4, 0x5F17, 0x95A5, 0x6255, + 0x95A6, 0x6CB8, 0x95A7, 0x4ECF, 0x95A8, 0x7269, 0x95A9, 0x9B92, + 0x95AA, 0x5206, 0x95AB, 0x543B, 0x95AC, 0x5674, 0x95AD, 0x58B3, + 0x95AE, 0x61A4, 0x95AF, 0x626E, 0x95B0, 0x711A, 0x95B1, 0x596E, + 0x95B2, 0x7C89, 0x95B3, 0x7CDE, 0x95B4, 0x7D1B, 0x95B5, 0x96F0, + 0x95B6, 0x6587, 0x95B7, 0x805E, 0x95B8, 0x4E19, 0x95B9, 0x4F75, + 0x95BA, 0x5175, 0x95BB, 0x5840, 0x95BC, 0x5E63, 0x95BD, 0x5E73, + 0x95BE, 0x5F0A, 0x95BF, 0x67C4, 0x95C0, 0x4E26, 0x95C1, 0x853D, + 0x95C2, 0x9589, 0x95C3, 0x965B, 0x95C4, 0x7C73, 0x95C5, 0x9801, + 0x95C6, 0x50FB, 0x95C7, 0x58C1, 0x95C8, 0x7656, 0x95C9, 0x78A7, + 0x95CA, 0x5225, 0x95CB, 0x77A5, 0x95CC, 0x8511, 0x95CD, 0x7B86, + 0x95CE, 0x504F, 0x95CF, 0x5909, 0x95D0, 0x7247, 0x95D1, 0x7BC7, + 0x95D2, 0x7DE8, 0x95D3, 0x8FBA, 0x95D4, 0x8FD4, 0x95D5, 0x904D, + 0x95D6, 0x4FBF, 0x95D7, 0x52C9, 0x95D8, 0x5A29, 0x95D9, 0x5F01, + 0x95DA, 0x97AD, 0x95DB, 0x4FDD, 0x95DC, 0x8217, 0x95DD, 0x92EA, + 0x95DE, 0x5703, 0x95DF, 0x6355, 0x95E0, 0x6B69, 0x95E1, 0x752B, + 0x95E2, 0x88DC, 0x95E3, 0x8F14, 0x95E4, 0x7A42, 0x95E5, 0x52DF, + 0x95E6, 0x5893, 0x95E7, 0x6155, 0x95E8, 0x620A, 0x95E9, 0x66AE, + 0x95EA, 0x6BCD, 0x95EB, 0x7C3F, 0x95EC, 0x83E9, 0x95ED, 0x5023, + 0x95EE, 0x4FF8, 0x95EF, 0x5305, 0x95F0, 0x5446, 0x95F1, 0x5831, + 0x95F2, 0x5949, 0x95F3, 0x5B9D, 0x95F4, 0x5CF0, 0x95F5, 0x5CEF, + 0x95F6, 0x5D29, 0x95F7, 0x5E96, 0x95F8, 0x62B1, 0x95F9, 0x6367, + 0x95FA, 0x653E, 0x95FB, 0x65B9, 0x95FC, 0x670B, 0x9640, 0x6CD5, + 0x9641, 0x6CE1, 0x9642, 0x70F9, 0x9643, 0x7832, 0x9644, 0x7E2B, + 0x9645, 0x80DE, 0x9646, 0x82B3, 0x9647, 0x840C, 0x9648, 0x84EC, + 0x9649, 0x8702, 0x964A, 0x8912, 0x964B, 0x8A2A, 0x964C, 0x8C4A, + 0x964D, 0x90A6, 0x964E, 0x92D2, 0x964F, 0x98FD, 0x9650, 0x9CF3, + 0x9651, 0x9D6C, 0x9652, 0x4E4F, 0x9653, 0x4EA1, 0x9654, 0x508D, + 0x9655, 0x5256, 0x9656, 0x574A, 0x9657, 0x59A8, 0x9658, 0x5E3D, + 0x9659, 0x5FD8, 0x965A, 0x5FD9, 0x965B, 0x623F, 0x965C, 0x66B4, + 0x965D, 0x671B, 0x965E, 0x67D0, 0x965F, 0x68D2, 0x9660, 0x5192, + 0x9661, 0x7D21, 0x9662, 0x80AA, 0x9663, 0x81A8, 0x9664, 0x8B00, + 0x9665, 0x8C8C, 0x9666, 0x8CBF, 0x9667, 0x927E, 0x9668, 0x9632, + 0x9669, 0x5420, 0x966A, 0x982C, 0x966B, 0x5317, 0x966C, 0x50D5, + 0x966D, 0x535C, 0x966E, 0x58A8, 0x966F, 0x64B2, 0x9670, 0x6734, + 0x9671, 0x7267, 0x9672, 0x7766, 0x9673, 0x7A46, 0x9674, 0x91E6, + 0x9675, 0x52C3, 0x9676, 0x6CA1, 0x9677, 0x6B86, 0x9678, 0x5800, + 0x9679, 0x5E4C, 0x967A, 0x5954, 0x967B, 0x672C, 0x967C, 0x7FFB, + 0x967D, 0x51E1, 0x967E, 0x76C6, 0x9680, 0x6469, 0x9681, 0x78E8, + 0x9682, 0x9B54, 0x9683, 0x9EBB, 0x9684, 0x57CB, 0x9685, 0x59B9, + 0x9686, 0x6627, 0x9687, 0x679A, 0x9688, 0x6BCE, 0x9689, 0x54E9, + 0x968A, 0x69D9, 0x968B, 0x5E55, 0x968C, 0x819C, 0x968D, 0x6795, + 0x968E, 0x9BAA, 0x968F, 0x67FE, 0x9690, 0x9C52, 0x9691, 0x685D, + 0x9692, 0x4EA6, 0x9693, 0x4FE3, 0x9694, 0x53C8, 0x9695, 0x62B9, + 0x9696, 0x672B, 0x9697, 0x6CAB, 0x9698, 0x8FC4, 0x9699, 0x4FAD, + 0x969A, 0x7E6D, 0x969B, 0x9EBF, 0x969C, 0x4E07, 0x969D, 0x6162, + 0x969E, 0x6E80, 0x969F, 0x6F2B, 0x96A0, 0x8513, 0x96A1, 0x5473, + 0x96A2, 0x672A, 0x96A3, 0x9B45, 0x96A4, 0x5DF3, 0x96A5, 0x7B95, + 0x96A6, 0x5CAC, 0x96A7, 0x5BC6, 0x96A8, 0x871C, 0x96A9, 0x6E4A, + 0x96AA, 0x84D1, 0x96AB, 0x7A14, 0x96AC, 0x8108, 0x96AD, 0x5999, + 0x96AE, 0x7C8D, 0x96AF, 0x6C11, 0x96B0, 0x7720, 0x96B1, 0x52D9, + 0x96B2, 0x5922, 0x96B3, 0x7121, 0x96B4, 0x725F, 0x96B5, 0x77DB, + 0x96B6, 0x9727, 0x96B7, 0x9D61, 0x96B8, 0x690B, 0x96B9, 0x5A7F, + 0x96BA, 0x5A18, 0x96BB, 0x51A5, 0x96BC, 0x540D, 0x96BD, 0x547D, + 0x96BE, 0x660E, 0x96BF, 0x76DF, 0x96C0, 0x8FF7, 0x96C1, 0x9298, + 0x96C2, 0x9CF4, 0x96C3, 0x59EA, 0x96C4, 0x725D, 0x96C5, 0x6EC5, + 0x96C6, 0x514D, 0x96C7, 0x68C9, 0x96C8, 0x7DBF, 0x96C9, 0x7DEC, + 0x96CA, 0x9762, 0x96CB, 0x9EBA, 0x96CC, 0x6478, 0x96CD, 0x6A21, + 0x96CE, 0x8302, 0x96CF, 0x5984, 0x96D0, 0x5B5F, 0x96D1, 0x6BDB, + 0x96D2, 0x731B, 0x96D3, 0x76F2, 0x96D4, 0x7DB2, 0x96D5, 0x8017, + 0x96D6, 0x8499, 0x96D7, 0x5132, 0x96D8, 0x6728, 0x96D9, 0x9ED9, + 0x96DA, 0x76EE, 0x96DB, 0x6762, 0x96DC, 0x52FF, 0x96DD, 0x9905, + 0x96DE, 0x5C24, 0x96DF, 0x623B, 0x96E0, 0x7C7E, 0x96E1, 0x8CB0, + 0x96E2, 0x554F, 0x96E3, 0x60B6, 0x96E4, 0x7D0B, 0x96E5, 0x9580, + 0x96E6, 0x5301, 0x96E7, 0x4E5F, 0x96E8, 0x51B6, 0x96E9, 0x591C, + 0x96EA, 0x723A, 0x96EB, 0x8036, 0x96EC, 0x91CE, 0x96ED, 0x5F25, + 0x96EE, 0x77E2, 0x96EF, 0x5384, 0x96F0, 0x5F79, 0x96F1, 0x7D04, + 0x96F2, 0x85AC, 0x96F3, 0x8A33, 0x96F4, 0x8E8D, 0x96F5, 0x9756, + 0x96F6, 0x67F3, 0x96F7, 0x85AE, 0x96F8, 0x9453, 0x96F9, 0x6109, + 0x96FA, 0x6108, 0x96FB, 0x6CB9, 0x96FC, 0x7652, 0x9740, 0x8AED, + 0x9741, 0x8F38, 0x9742, 0x552F, 0x9743, 0x4F51, 0x9744, 0x512A, + 0x9745, 0x52C7, 0x9746, 0x53CB, 0x9747, 0x5BA5, 0x9748, 0x5E7D, + 0x9749, 0x60A0, 0x974A, 0x6182, 0x974B, 0x63D6, 0x974C, 0x6709, + 0x974D, 0x67DA, 0x974E, 0x6E67, 0x974F, 0x6D8C, 0x9750, 0x7336, + 0x9751, 0x7337, 0x9752, 0x7531, 0x9753, 0x7950, 0x9754, 0x88D5, + 0x9755, 0x8A98, 0x9756, 0x904A, 0x9757, 0x9091, 0x9758, 0x90F5, + 0x9759, 0x96C4, 0x975A, 0x878D, 0x975B, 0x5915, 0x975C, 0x4E88, + 0x975D, 0x4F59, 0x975E, 0x4E0E, 0x975F, 0x8A89, 0x9760, 0x8F3F, + 0x9761, 0x9810, 0x9762, 0x50AD, 0x9763, 0x5E7C, 0x9764, 0x5996, + 0x9765, 0x5BB9, 0x9766, 0x5EB8, 0x9767, 0x63DA, 0x9768, 0x63FA, + 0x9769, 0x64C1, 0x976A, 0x66DC, 0x976B, 0x694A, 0x976C, 0x69D8, + 0x976D, 0x6D0B, 0x976E, 0x6EB6, 0x976F, 0x7194, 0x9770, 0x7528, + 0x9771, 0x7AAF, 0x9772, 0x7F8A, 0x9773, 0x8000, 0x9774, 0x8449, + 0x9775, 0x84C9, 0x9776, 0x8981, 0x9777, 0x8B21, 0x9778, 0x8E0A, + 0x9779, 0x9065, 0x977A, 0x967D, 0x977B, 0x990A, 0x977C, 0x617E, + 0x977D, 0x6291, 0x977E, 0x6B32, 0x9780, 0x6C83, 0x9781, 0x6D74, + 0x9782, 0x7FCC, 0x9783, 0x7FFC, 0x9784, 0x6DC0, 0x9785, 0x7F85, + 0x9786, 0x87BA, 0x9787, 0x88F8, 0x9788, 0x6765, 0x9789, 0x83B1, + 0x978A, 0x983C, 0x978B, 0x96F7, 0x978C, 0x6D1B, 0x978D, 0x7D61, + 0x978E, 0x843D, 0x978F, 0x916A, 0x9790, 0x4E71, 0x9791, 0x5375, + 0x9792, 0x5D50, 0x9793, 0x6B04, 0x9794, 0x6FEB, 0x9795, 0x85CD, + 0x9796, 0x862D, 0x9797, 0x89A7, 0x9798, 0x5229, 0x9799, 0x540F, + 0x979A, 0x5C65, 0x979B, 0x674E, 0x979C, 0x68A8, 0x979D, 0x7406, + 0x979E, 0x7483, 0x979F, 0x75E2, 0x97A0, 0x88CF, 0x97A1, 0x88E1, + 0x97A2, 0x91CC, 0x97A3, 0x96E2, 0x97A4, 0x9678, 0x97A5, 0x5F8B, + 0x97A6, 0x7387, 0x97A7, 0x7ACB, 0x97A8, 0x844E, 0x97A9, 0x63A0, + 0x97AA, 0x7565, 0x97AB, 0x5289, 0x97AC, 0x6D41, 0x97AD, 0x6E9C, + 0x97AE, 0x7409, 0x97AF, 0x7559, 0x97B0, 0x786B, 0x97B1, 0x7C92, + 0x97B2, 0x9686, 0x97B3, 0x7ADC, 0x97B4, 0x9F8D, 0x97B5, 0x4FB6, + 0x97B6, 0x616E, 0x97B7, 0x65C5, 0x97B8, 0x865C, 0x97B9, 0x4E86, + 0x97BA, 0x4EAE, 0x97BB, 0x50DA, 0x97BC, 0x4E21, 0x97BD, 0x51CC, + 0x97BE, 0x5BEE, 0x97BF, 0x6599, 0x97C0, 0x6881, 0x97C1, 0x6DBC, + 0x97C2, 0x731F, 0x97C3, 0x7642, 0x97C4, 0x77AD, 0x97C5, 0x7A1C, + 0x97C6, 0x7CE7, 0x97C7, 0x826F, 0x97C8, 0x8AD2, 0x97C9, 0x907C, + 0x97CA, 0x91CF, 0x97CB, 0x9675, 0x97CC, 0x9818, 0x97CD, 0x529B, + 0x97CE, 0x7DD1, 0x97CF, 0x502B, 0x97D0, 0x5398, 0x97D1, 0x6797, + 0x97D2, 0x6DCB, 0x97D3, 0x71D0, 0x97D4, 0x7433, 0x97D5, 0x81E8, + 0x97D6, 0x8F2A, 0x97D7, 0x96A3, 0x97D8, 0x9C57, 0x97D9, 0x9E9F, + 0x97DA, 0x7460, 0x97DB, 0x5841, 0x97DC, 0x6D99, 0x97DD, 0x7D2F, + 0x97DE, 0x985E, 0x97DF, 0x4EE4, 0x97E0, 0x4F36, 0x97E1, 0x4F8B, + 0x97E2, 0x51B7, 0x97E3, 0x52B1, 0x97E4, 0x5DBA, 0x97E5, 0x601C, + 0x97E6, 0x73B2, 0x97E7, 0x793C, 0x97E8, 0x82D3, 0x97E9, 0x9234, + 0x97EA, 0x96B7, 0x97EB, 0x96F6, 0x97EC, 0x970A, 0x97ED, 0x9E97, + 0x97EE, 0x9F62, 0x97EF, 0x66A6, 0x97F0, 0x6B74, 0x97F1, 0x5217, + 0x97F2, 0x52A3, 0x97F3, 0x70C8, 0x97F4, 0x88C2, 0x97F5, 0x5EC9, + 0x97F6, 0x604B, 0x97F7, 0x6190, 0x97F8, 0x6F23, 0x97F9, 0x7149, + 0x97FA, 0x7C3E, 0x97FB, 0x7DF4, 0x97FC, 0x806F, 0x9840, 0x84EE, + 0x9841, 0x9023, 0x9842, 0x932C, 0x9843, 0x5442, 0x9844, 0x9B6F, + 0x9845, 0x6AD3, 0x9846, 0x7089, 0x9847, 0x8CC2, 0x9848, 0x8DEF, + 0x9849, 0x9732, 0x984A, 0x52B4, 0x984B, 0x5A41, 0x984C, 0x5ECA, + 0x984D, 0x5F04, 0x984E, 0x6717, 0x984F, 0x697C, 0x9850, 0x6994, + 0x9851, 0x6D6A, 0x9852, 0x6F0F, 0x9853, 0x7262, 0x9854, 0x72FC, + 0x9855, 0x7BED, 0x9856, 0x8001, 0x9857, 0x807E, 0x9858, 0x874B, + 0x9859, 0x90CE, 0x985A, 0x516D, 0x985B, 0x9E93, 0x985C, 0x7984, + 0x985D, 0x808B, 0x985E, 0x9332, 0x985F, 0x8AD6, 0x9860, 0x502D, + 0x9861, 0x548C, 0x9862, 0x8A71, 0x9863, 0x6B6A, 0x9864, 0x8CC4, + 0x9865, 0x8107, 0x9866, 0x60D1, 0x9867, 0x67A0, 0x9868, 0x9DF2, + 0x9869, 0x4E99, 0x986A, 0x4E98, 0x986B, 0x9C10, 0x986C, 0x8A6B, + 0x986D, 0x85C1, 0x986E, 0x8568, 0x986F, 0x6900, 0x9870, 0x6E7E, + 0x9871, 0x7897, 0x9872, 0x8155, 0x989F, 0x5F0C, 0x98A0, 0x4E10, + 0x98A1, 0x4E15, 0x98A2, 0x4E2A, 0x98A3, 0x4E31, 0x98A4, 0x4E36, + 0x98A5, 0x4E3C, 0x98A6, 0x4E3F, 0x98A7, 0x4E42, 0x98A8, 0x4E56, + 0x98A9, 0x4E58, 0x98AA, 0x4E82, 0x98AB, 0x4E85, 0x98AC, 0x8C6B, + 0x98AD, 0x4E8A, 0x98AE, 0x8212, 0x98AF, 0x5F0D, 0x98B0, 0x4E8E, + 0x98B1, 0x4E9E, 0x98B2, 0x4E9F, 0x98B3, 0x4EA0, 0x98B4, 0x4EA2, + 0x98B5, 0x4EB0, 0x98B6, 0x4EB3, 0x98B7, 0x4EB6, 0x98B8, 0x4ECE, + 0x98B9, 0x4ECD, 0x98BA, 0x4EC4, 0x98BB, 0x4EC6, 0x98BC, 0x4EC2, + 0x98BD, 0x4ED7, 0x98BE, 0x4EDE, 0x98BF, 0x4EED, 0x98C0, 0x4EDF, + 0x98C1, 0x4EF7, 0x98C2, 0x4F09, 0x98C3, 0x4F5A, 0x98C4, 0x4F30, + 0x98C5, 0x4F5B, 0x98C6, 0x4F5D, 0x98C7, 0x4F57, 0x98C8, 0x4F47, + 0x98C9, 0x4F76, 0x98CA, 0x4F88, 0x98CB, 0x4F8F, 0x98CC, 0x4F98, + 0x98CD, 0x4F7B, 0x98CE, 0x4F69, 0x98CF, 0x4F70, 0x98D0, 0x4F91, + 0x98D1, 0x4F6F, 0x98D2, 0x4F86, 0x98D3, 0x4F96, 0x98D4, 0x5118, + 0x98D5, 0x4FD4, 0x98D6, 0x4FDF, 0x98D7, 0x4FCE, 0x98D8, 0x4FD8, + 0x98D9, 0x4FDB, 0x98DA, 0x4FD1, 0x98DB, 0x4FDA, 0x98DC, 0x4FD0, + 0x98DD, 0x4FE4, 0x98DE, 0x4FE5, 0x98DF, 0x501A, 0x98E0, 0x5028, + 0x98E1, 0x5014, 0x98E2, 0x502A, 0x98E3, 0x5025, 0x98E4, 0x5005, + 0x98E5, 0x4F1C, 0x98E6, 0x4FF6, 0x98E7, 0x5021, 0x98E8, 0x5029, + 0x98E9, 0x502C, 0x98EA, 0x4FFE, 0x98EB, 0x4FEF, 0x98EC, 0x5011, + 0x98ED, 0x5006, 0x98EE, 0x5043, 0x98EF, 0x5047, 0x98F0, 0x6703, + 0x98F1, 0x5055, 0x98F2, 0x5050, 0x98F3, 0x5048, 0x98F4, 0x505A, + 0x98F5, 0x5056, 0x98F6, 0x506C, 0x98F7, 0x5078, 0x98F8, 0x5080, + 0x98F9, 0x509A, 0x98FA, 0x5085, 0x98FB, 0x50B4, 0x98FC, 0x50B2, + 0x9940, 0x50C9, 0x9941, 0x50CA, 0x9942, 0x50B3, 0x9943, 0x50C2, + 0x9944, 0x50D6, 0x9945, 0x50DE, 0x9946, 0x50E5, 0x9947, 0x50ED, + 0x9948, 0x50E3, 0x9949, 0x50EE, 0x994A, 0x50F9, 0x994B, 0x50F5, + 0x994C, 0x5109, 0x994D, 0x5101, 0x994E, 0x5102, 0x994F, 0x5116, + 0x9950, 0x5115, 0x9951, 0x5114, 0x9952, 0x511A, 0x9953, 0x5121, + 0x9954, 0x513A, 0x9955, 0x5137, 0x9956, 0x513C, 0x9957, 0x513B, + 0x9958, 0x513F, 0x9959, 0x5140, 0x995A, 0x5152, 0x995B, 0x514C, + 0x995C, 0x5154, 0x995D, 0x5162, 0x995E, 0x7AF8, 0x995F, 0x5169, + 0x9960, 0x516A, 0x9961, 0x516E, 0x9962, 0x5180, 0x9963, 0x5182, + 0x9964, 0x56D8, 0x9965, 0x518C, 0x9966, 0x5189, 0x9967, 0x518F, + 0x9968, 0x5191, 0x9969, 0x5193, 0x996A, 0x5195, 0x996B, 0x5196, + 0x996C, 0x51A4, 0x996D, 0x51A6, 0x996E, 0x51A2, 0x996F, 0x51A9, + 0x9970, 0x51AA, 0x9971, 0x51AB, 0x9972, 0x51B3, 0x9973, 0x51B1, + 0x9974, 0x51B2, 0x9975, 0x51B0, 0x9976, 0x51B5, 0x9977, 0x51BD, + 0x9978, 0x51C5, 0x9979, 0x51C9, 0x997A, 0x51DB, 0x997B, 0x51E0, + 0x997C, 0x8655, 0x997D, 0x51E9, 0x997E, 0x51ED, 0x9980, 0x51F0, + 0x9981, 0x51F5, 0x9982, 0x51FE, 0x9983, 0x5204, 0x9984, 0x520B, + 0x9985, 0x5214, 0x9986, 0x520E, 0x9987, 0x5227, 0x9988, 0x522A, + 0x9989, 0x522E, 0x998A, 0x5233, 0x998B, 0x5239, 0x998C, 0x524F, + 0x998D, 0x5244, 0x998E, 0x524B, 0x998F, 0x524C, 0x9990, 0x525E, + 0x9991, 0x5254, 0x9992, 0x526A, 0x9993, 0x5274, 0x9994, 0x5269, + 0x9995, 0x5273, 0x9996, 0x527F, 0x9997, 0x527D, 0x9998, 0x528D, + 0x9999, 0x5294, 0x999A, 0x5292, 0x999B, 0x5271, 0x999C, 0x5288, + 0x999D, 0x5291, 0x999E, 0x8FA8, 0x999F, 0x8FA7, 0x99A0, 0x52AC, + 0x99A1, 0x52AD, 0x99A2, 0x52BC, 0x99A3, 0x52B5, 0x99A4, 0x52C1, + 0x99A5, 0x52CD, 0x99A6, 0x52D7, 0x99A7, 0x52DE, 0x99A8, 0x52E3, + 0x99A9, 0x52E6, 0x99AA, 0x98ED, 0x99AB, 0x52E0, 0x99AC, 0x52F3, + 0x99AD, 0x52F5, 0x99AE, 0x52F8, 0x99AF, 0x52F9, 0x99B0, 0x5306, + 0x99B1, 0x5308, 0x99B2, 0x7538, 0x99B3, 0x530D, 0x99B4, 0x5310, + 0x99B5, 0x530F, 0x99B6, 0x5315, 0x99B7, 0x531A, 0x99B8, 0x5323, + 0x99B9, 0x532F, 0x99BA, 0x5331, 0x99BB, 0x5333, 0x99BC, 0x5338, + 0x99BD, 0x5340, 0x99BE, 0x5346, 0x99BF, 0x5345, 0x99C0, 0x4E17, + 0x99C1, 0x5349, 0x99C2, 0x534D, 0x99C3, 0x51D6, 0x99C4, 0x535E, + 0x99C5, 0x5369, 0x99C6, 0x536E, 0x99C7, 0x5918, 0x99C8, 0x537B, + 0x99C9, 0x5377, 0x99CA, 0x5382, 0x99CB, 0x5396, 0x99CC, 0x53A0, + 0x99CD, 0x53A6, 0x99CE, 0x53A5, 0x99CF, 0x53AE, 0x99D0, 0x53B0, + 0x99D1, 0x53B6, 0x99D2, 0x53C3, 0x99D3, 0x7C12, 0x99D4, 0x96D9, + 0x99D5, 0x53DF, 0x99D6, 0x66FC, 0x99D7, 0x71EE, 0x99D8, 0x53EE, + 0x99D9, 0x53E8, 0x99DA, 0x53ED, 0x99DB, 0x53FA, 0x99DC, 0x5401, + 0x99DD, 0x543D, 0x99DE, 0x5440, 0x99DF, 0x542C, 0x99E0, 0x542D, + 0x99E1, 0x543C, 0x99E2, 0x542E, 0x99E3, 0x5436, 0x99E4, 0x5429, + 0x99E5, 0x541D, 0x99E6, 0x544E, 0x99E7, 0x548F, 0x99E8, 0x5475, + 0x99E9, 0x548E, 0x99EA, 0x545F, 0x99EB, 0x5471, 0x99EC, 0x5477, + 0x99ED, 0x5470, 0x99EE, 0x5492, 0x99EF, 0x547B, 0x99F0, 0x5480, + 0x99F1, 0x5476, 0x99F2, 0x5484, 0x99F3, 0x5490, 0x99F4, 0x5486, + 0x99F5, 0x54C7, 0x99F6, 0x54A2, 0x99F7, 0x54B8, 0x99F8, 0x54A5, + 0x99F9, 0x54AC, 0x99FA, 0x54C4, 0x99FB, 0x54C8, 0x99FC, 0x54A8, + 0x9A40, 0x54AB, 0x9A41, 0x54C2, 0x9A42, 0x54A4, 0x9A43, 0x54BE, + 0x9A44, 0x54BC, 0x9A45, 0x54D8, 0x9A46, 0x54E5, 0x9A47, 0x54E6, + 0x9A48, 0x550F, 0x9A49, 0x5514, 0x9A4A, 0x54FD, 0x9A4B, 0x54EE, + 0x9A4C, 0x54ED, 0x9A4D, 0x54FA, 0x9A4E, 0x54E2, 0x9A4F, 0x5539, + 0x9A50, 0x5540, 0x9A51, 0x5563, 0x9A52, 0x554C, 0x9A53, 0x552E, + 0x9A54, 0x555C, 0x9A55, 0x5545, 0x9A56, 0x5556, 0x9A57, 0x5557, + 0x9A58, 0x5538, 0x9A59, 0x5533, 0x9A5A, 0x555D, 0x9A5B, 0x5599, + 0x9A5C, 0x5580, 0x9A5D, 0x54AF, 0x9A5E, 0x558A, 0x9A5F, 0x559F, + 0x9A60, 0x557B, 0x9A61, 0x557E, 0x9A62, 0x5598, 0x9A63, 0x559E, + 0x9A64, 0x55AE, 0x9A65, 0x557C, 0x9A66, 0x5583, 0x9A67, 0x55A9, + 0x9A68, 0x5587, 0x9A69, 0x55A8, 0x9A6A, 0x55DA, 0x9A6B, 0x55C5, + 0x9A6C, 0x55DF, 0x9A6D, 0x55C4, 0x9A6E, 0x55DC, 0x9A6F, 0x55E4, + 0x9A70, 0x55D4, 0x9A71, 0x5614, 0x9A72, 0x55F7, 0x9A73, 0x5616, + 0x9A74, 0x55FE, 0x9A75, 0x55FD, 0x9A76, 0x561B, 0x9A77, 0x55F9, + 0x9A78, 0x564E, 0x9A79, 0x5650, 0x9A7A, 0x71DF, 0x9A7B, 0x5634, + 0x9A7C, 0x5636, 0x9A7D, 0x5632, 0x9A7E, 0x5638, 0x9A80, 0x566B, + 0x9A81, 0x5664, 0x9A82, 0x562F, 0x9A83, 0x566C, 0x9A84, 0x566A, + 0x9A85, 0x5686, 0x9A86, 0x5680, 0x9A87, 0x568A, 0x9A88, 0x56A0, + 0x9A89, 0x5694, 0x9A8A, 0x568F, 0x9A8B, 0x56A5, 0x9A8C, 0x56AE, + 0x9A8D, 0x56B6, 0x9A8E, 0x56B4, 0x9A8F, 0x56C2, 0x9A90, 0x56BC, + 0x9A91, 0x56C1, 0x9A92, 0x56C3, 0x9A93, 0x56C0, 0x9A94, 0x56C8, + 0x9A95, 0x56CE, 0x9A96, 0x56D1, 0x9A97, 0x56D3, 0x9A98, 0x56D7, + 0x9A99, 0x56EE, 0x9A9A, 0x56F9, 0x9A9B, 0x5700, 0x9A9C, 0x56FF, + 0x9A9D, 0x5704, 0x9A9E, 0x5709, 0x9A9F, 0x5708, 0x9AA0, 0x570B, + 0x9AA1, 0x570D, 0x9AA2, 0x5713, 0x9AA3, 0x5718, 0x9AA4, 0x5716, + 0x9AA5, 0x55C7, 0x9AA6, 0x571C, 0x9AA7, 0x5726, 0x9AA8, 0x5737, + 0x9AA9, 0x5738, 0x9AAA, 0x574E, 0x9AAB, 0x573B, 0x9AAC, 0x5740, + 0x9AAD, 0x574F, 0x9AAE, 0x5769, 0x9AAF, 0x57C0, 0x9AB0, 0x5788, + 0x9AB1, 0x5761, 0x9AB2, 0x577F, 0x9AB3, 0x5789, 0x9AB4, 0x5793, + 0x9AB5, 0x57A0, 0x9AB6, 0x57B3, 0x9AB7, 0x57A4, 0x9AB8, 0x57AA, + 0x9AB9, 0x57B0, 0x9ABA, 0x57C3, 0x9ABB, 0x57C6, 0x9ABC, 0x57D4, + 0x9ABD, 0x57D2, 0x9ABE, 0x57D3, 0x9ABF, 0x580A, 0x9AC0, 0x57D6, + 0x9AC1, 0x57E3, 0x9AC2, 0x580B, 0x9AC3, 0x5819, 0x9AC4, 0x581D, + 0x9AC5, 0x5872, 0x9AC6, 0x5821, 0x9AC7, 0x5862, 0x9AC8, 0x584B, + 0x9AC9, 0x5870, 0x9ACA, 0x6BC0, 0x9ACB, 0x5852, 0x9ACC, 0x583D, + 0x9ACD, 0x5879, 0x9ACE, 0x5885, 0x9ACF, 0x58B9, 0x9AD0, 0x589F, + 0x9AD1, 0x58AB, 0x9AD2, 0x58BA, 0x9AD3, 0x58DE, 0x9AD4, 0x58BB, + 0x9AD5, 0x58B8, 0x9AD6, 0x58AE, 0x9AD7, 0x58C5, 0x9AD8, 0x58D3, + 0x9AD9, 0x58D1, 0x9ADA, 0x58D7, 0x9ADB, 0x58D9, 0x9ADC, 0x58D8, + 0x9ADD, 0x58E5, 0x9ADE, 0x58DC, 0x9ADF, 0x58E4, 0x9AE0, 0x58DF, + 0x9AE1, 0x58EF, 0x9AE2, 0x58FA, 0x9AE3, 0x58F9, 0x9AE4, 0x58FB, + 0x9AE5, 0x58FC, 0x9AE6, 0x58FD, 0x9AE7, 0x5902, 0x9AE8, 0x590A, + 0x9AE9, 0x5910, 0x9AEA, 0x591B, 0x9AEB, 0x68A6, 0x9AEC, 0x5925, + 0x9AED, 0x592C, 0x9AEE, 0x592D, 0x9AEF, 0x5932, 0x9AF0, 0x5938, + 0x9AF1, 0x593E, 0x9AF2, 0x7AD2, 0x9AF3, 0x5955, 0x9AF4, 0x5950, + 0x9AF5, 0x594E, 0x9AF6, 0x595A, 0x9AF7, 0x5958, 0x9AF8, 0x5962, + 0x9AF9, 0x5960, 0x9AFA, 0x5967, 0x9AFB, 0x596C, 0x9AFC, 0x5969, + 0x9B40, 0x5978, 0x9B41, 0x5981, 0x9B42, 0x599D, 0x9B43, 0x4F5E, + 0x9B44, 0x4FAB, 0x9B45, 0x59A3, 0x9B46, 0x59B2, 0x9B47, 0x59C6, + 0x9B48, 0x59E8, 0x9B49, 0x59DC, 0x9B4A, 0x598D, 0x9B4B, 0x59D9, + 0x9B4C, 0x59DA, 0x9B4D, 0x5A25, 0x9B4E, 0x5A1F, 0x9B4F, 0x5A11, + 0x9B50, 0x5A1C, 0x9B51, 0x5A09, 0x9B52, 0x5A1A, 0x9B53, 0x5A40, + 0x9B54, 0x5A6C, 0x9B55, 0x5A49, 0x9B56, 0x5A35, 0x9B57, 0x5A36, + 0x9B58, 0x5A62, 0x9B59, 0x5A6A, 0x9B5A, 0x5A9A, 0x9B5B, 0x5ABC, + 0x9B5C, 0x5ABE, 0x9B5D, 0x5ACB, 0x9B5E, 0x5AC2, 0x9B5F, 0x5ABD, + 0x9B60, 0x5AE3, 0x9B61, 0x5AD7, 0x9B62, 0x5AE6, 0x9B63, 0x5AE9, + 0x9B64, 0x5AD6, 0x9B65, 0x5AFA, 0x9B66, 0x5AFB, 0x9B67, 0x5B0C, + 0x9B68, 0x5B0B, 0x9B69, 0x5B16, 0x9B6A, 0x5B32, 0x9B6B, 0x5AD0, + 0x9B6C, 0x5B2A, 0x9B6D, 0x5B36, 0x9B6E, 0x5B3E, 0x9B6F, 0x5B43, + 0x9B70, 0x5B45, 0x9B71, 0x5B40, 0x9B72, 0x5B51, 0x9B73, 0x5B55, + 0x9B74, 0x5B5A, 0x9B75, 0x5B5B, 0x9B76, 0x5B65, 0x9B77, 0x5B69, + 0x9B78, 0x5B70, 0x9B79, 0x5B73, 0x9B7A, 0x5B75, 0x9B7B, 0x5B78, + 0x9B7C, 0x6588, 0x9B7D, 0x5B7A, 0x9B7E, 0x5B80, 0x9B80, 0x5B83, + 0x9B81, 0x5BA6, 0x9B82, 0x5BB8, 0x9B83, 0x5BC3, 0x9B84, 0x5BC7, + 0x9B85, 0x5BC9, 0x9B86, 0x5BD4, 0x9B87, 0x5BD0, 0x9B88, 0x5BE4, + 0x9B89, 0x5BE6, 0x9B8A, 0x5BE2, 0x9B8B, 0x5BDE, 0x9B8C, 0x5BE5, + 0x9B8D, 0x5BEB, 0x9B8E, 0x5BF0, 0x9B8F, 0x5BF6, 0x9B90, 0x5BF3, + 0x9B91, 0x5C05, 0x9B92, 0x5C07, 0x9B93, 0x5C08, 0x9B94, 0x5C0D, + 0x9B95, 0x5C13, 0x9B96, 0x5C20, 0x9B97, 0x5C22, 0x9B98, 0x5C28, + 0x9B99, 0x5C38, 0x9B9A, 0x5C39, 0x9B9B, 0x5C41, 0x9B9C, 0x5C46, + 0x9B9D, 0x5C4E, 0x9B9E, 0x5C53, 0x9B9F, 0x5C50, 0x9BA0, 0x5C4F, + 0x9BA1, 0x5B71, 0x9BA2, 0x5C6C, 0x9BA3, 0x5C6E, 0x9BA4, 0x4E62, + 0x9BA5, 0x5C76, 0x9BA6, 0x5C79, 0x9BA7, 0x5C8C, 0x9BA8, 0x5C91, + 0x9BA9, 0x5C94, 0x9BAA, 0x599B, 0x9BAB, 0x5CAB, 0x9BAC, 0x5CBB, + 0x9BAD, 0x5CB6, 0x9BAE, 0x5CBC, 0x9BAF, 0x5CB7, 0x9BB0, 0x5CC5, + 0x9BB1, 0x5CBE, 0x9BB2, 0x5CC7, 0x9BB3, 0x5CD9, 0x9BB4, 0x5CE9, + 0x9BB5, 0x5CFD, 0x9BB6, 0x5CFA, 0x9BB7, 0x5CED, 0x9BB8, 0x5D8C, + 0x9BB9, 0x5CEA, 0x9BBA, 0x5D0B, 0x9BBB, 0x5D15, 0x9BBC, 0x5D17, + 0x9BBD, 0x5D5C, 0x9BBE, 0x5D1F, 0x9BBF, 0x5D1B, 0x9BC0, 0x5D11, + 0x9BC1, 0x5D14, 0x9BC2, 0x5D22, 0x9BC3, 0x5D1A, 0x9BC4, 0x5D19, + 0x9BC5, 0x5D18, 0x9BC6, 0x5D4C, 0x9BC7, 0x5D52, 0x9BC8, 0x5D4E, + 0x9BC9, 0x5D4B, 0x9BCA, 0x5D6C, 0x9BCB, 0x5D73, 0x9BCC, 0x5D76, + 0x9BCD, 0x5D87, 0x9BCE, 0x5D84, 0x9BCF, 0x5D82, 0x9BD0, 0x5DA2, + 0x9BD1, 0x5D9D, 0x9BD2, 0x5DAC, 0x9BD3, 0x5DAE, 0x9BD4, 0x5DBD, + 0x9BD5, 0x5D90, 0x9BD6, 0x5DB7, 0x9BD7, 0x5DBC, 0x9BD8, 0x5DC9, + 0x9BD9, 0x5DCD, 0x9BDA, 0x5DD3, 0x9BDB, 0x5DD2, 0x9BDC, 0x5DD6, + 0x9BDD, 0x5DDB, 0x9BDE, 0x5DEB, 0x9BDF, 0x5DF2, 0x9BE0, 0x5DF5, + 0x9BE1, 0x5E0B, 0x9BE2, 0x5E1A, 0x9BE3, 0x5E19, 0x9BE4, 0x5E11, + 0x9BE5, 0x5E1B, 0x9BE6, 0x5E36, 0x9BE7, 0x5E37, 0x9BE8, 0x5E44, + 0x9BE9, 0x5E43, 0x9BEA, 0x5E40, 0x9BEB, 0x5E4E, 0x9BEC, 0x5E57, + 0x9BED, 0x5E54, 0x9BEE, 0x5E5F, 0x9BEF, 0x5E62, 0x9BF0, 0x5E64, + 0x9BF1, 0x5E47, 0x9BF2, 0x5E75, 0x9BF3, 0x5E76, 0x9BF4, 0x5E7A, + 0x9BF5, 0x9EBC, 0x9BF6, 0x5E7F, 0x9BF7, 0x5EA0, 0x9BF8, 0x5EC1, + 0x9BF9, 0x5EC2, 0x9BFA, 0x5EC8, 0x9BFB, 0x5ED0, 0x9BFC, 0x5ECF, + 0x9C40, 0x5ED6, 0x9C41, 0x5EE3, 0x9C42, 0x5EDD, 0x9C43, 0x5EDA, + 0x9C44, 0x5EDB, 0x9C45, 0x5EE2, 0x9C46, 0x5EE1, 0x9C47, 0x5EE8, + 0x9C48, 0x5EE9, 0x9C49, 0x5EEC, 0x9C4A, 0x5EF1, 0x9C4B, 0x5EF3, + 0x9C4C, 0x5EF0, 0x9C4D, 0x5EF4, 0x9C4E, 0x5EF8, 0x9C4F, 0x5EFE, + 0x9C50, 0x5F03, 0x9C51, 0x5F09, 0x9C52, 0x5F5D, 0x9C53, 0x5F5C, + 0x9C54, 0x5F0B, 0x9C55, 0x5F11, 0x9C56, 0x5F16, 0x9C57, 0x5F29, + 0x9C58, 0x5F2D, 0x9C59, 0x5F38, 0x9C5A, 0x5F41, 0x9C5B, 0x5F48, + 0x9C5C, 0x5F4C, 0x9C5D, 0x5F4E, 0x9C5E, 0x5F2F, 0x9C5F, 0x5F51, + 0x9C60, 0x5F56, 0x9C61, 0x5F57, 0x9C62, 0x5F59, 0x9C63, 0x5F61, + 0x9C64, 0x5F6D, 0x9C65, 0x5F73, 0x9C66, 0x5F77, 0x9C67, 0x5F83, + 0x9C68, 0x5F82, 0x9C69, 0x5F7F, 0x9C6A, 0x5F8A, 0x9C6B, 0x5F88, + 0x9C6C, 0x5F91, 0x9C6D, 0x5F87, 0x9C6E, 0x5F9E, 0x9C6F, 0x5F99, + 0x9C70, 0x5F98, 0x9C71, 0x5FA0, 0x9C72, 0x5FA8, 0x9C73, 0x5FAD, + 0x9C74, 0x5FBC, 0x9C75, 0x5FD6, 0x9C76, 0x5FFB, 0x9C77, 0x5FE4, + 0x9C78, 0x5FF8, 0x9C79, 0x5FF1, 0x9C7A, 0x5FDD, 0x9C7B, 0x60B3, + 0x9C7C, 0x5FFF, 0x9C7D, 0x6021, 0x9C7E, 0x6060, 0x9C80, 0x6019, + 0x9C81, 0x6010, 0x9C82, 0x6029, 0x9C83, 0x600E, 0x9C84, 0x6031, + 0x9C85, 0x601B, 0x9C86, 0x6015, 0x9C87, 0x602B, 0x9C88, 0x6026, + 0x9C89, 0x600F, 0x9C8A, 0x603A, 0x9C8B, 0x605A, 0x9C8C, 0x6041, + 0x9C8D, 0x606A, 0x9C8E, 0x6077, 0x9C8F, 0x605F, 0x9C90, 0x604A, + 0x9C91, 0x6046, 0x9C92, 0x604D, 0x9C93, 0x6063, 0x9C94, 0x6043, + 0x9C95, 0x6064, 0x9C96, 0x6042, 0x9C97, 0x606C, 0x9C98, 0x606B, + 0x9C99, 0x6059, 0x9C9A, 0x6081, 0x9C9B, 0x608D, 0x9C9C, 0x60E7, + 0x9C9D, 0x6083, 0x9C9E, 0x609A, 0x9C9F, 0x6084, 0x9CA0, 0x609B, + 0x9CA1, 0x6096, 0x9CA2, 0x6097, 0x9CA3, 0x6092, 0x9CA4, 0x60A7, + 0x9CA5, 0x608B, 0x9CA6, 0x60E1, 0x9CA7, 0x60B8, 0x9CA8, 0x60E0, + 0x9CA9, 0x60D3, 0x9CAA, 0x60B4, 0x9CAB, 0x5FF0, 0x9CAC, 0x60BD, + 0x9CAD, 0x60C6, 0x9CAE, 0x60B5, 0x9CAF, 0x60D8, 0x9CB0, 0x614D, + 0x9CB1, 0x6115, 0x9CB2, 0x6106, 0x9CB3, 0x60F6, 0x9CB4, 0x60F7, + 0x9CB5, 0x6100, 0x9CB6, 0x60F4, 0x9CB7, 0x60FA, 0x9CB8, 0x6103, + 0x9CB9, 0x6121, 0x9CBA, 0x60FB, 0x9CBB, 0x60F1, 0x9CBC, 0x610D, + 0x9CBD, 0x610E, 0x9CBE, 0x6147, 0x9CBF, 0x613E, 0x9CC0, 0x6128, + 0x9CC1, 0x6127, 0x9CC2, 0x614A, 0x9CC3, 0x613F, 0x9CC4, 0x613C, + 0x9CC5, 0x612C, 0x9CC6, 0x6134, 0x9CC7, 0x613D, 0x9CC8, 0x6142, + 0x9CC9, 0x6144, 0x9CCA, 0x6173, 0x9CCB, 0x6177, 0x9CCC, 0x6158, + 0x9CCD, 0x6159, 0x9CCE, 0x615A, 0x9CCF, 0x616B, 0x9CD0, 0x6174, + 0x9CD1, 0x616F, 0x9CD2, 0x6165, 0x9CD3, 0x6171, 0x9CD4, 0x615F, + 0x9CD5, 0x615D, 0x9CD6, 0x6153, 0x9CD7, 0x6175, 0x9CD8, 0x6199, + 0x9CD9, 0x6196, 0x9CDA, 0x6187, 0x9CDB, 0x61AC, 0x9CDC, 0x6194, + 0x9CDD, 0x619A, 0x9CDE, 0x618A, 0x9CDF, 0x6191, 0x9CE0, 0x61AB, + 0x9CE1, 0x61AE, 0x9CE2, 0x61CC, 0x9CE3, 0x61CA, 0x9CE4, 0x61C9, + 0x9CE5, 0x61F7, 0x9CE6, 0x61C8, 0x9CE7, 0x61C3, 0x9CE8, 0x61C6, + 0x9CE9, 0x61BA, 0x9CEA, 0x61CB, 0x9CEB, 0x7F79, 0x9CEC, 0x61CD, + 0x9CED, 0x61E6, 0x9CEE, 0x61E3, 0x9CEF, 0x61F6, 0x9CF0, 0x61FA, + 0x9CF1, 0x61F4, 0x9CF2, 0x61FF, 0x9CF3, 0x61FD, 0x9CF4, 0x61FC, + 0x9CF5, 0x61FE, 0x9CF6, 0x6200, 0x9CF7, 0x6208, 0x9CF8, 0x6209, + 0x9CF9, 0x620D, 0x9CFA, 0x620C, 0x9CFB, 0x6214, 0x9CFC, 0x621B, + 0x9D40, 0x621E, 0x9D41, 0x6221, 0x9D42, 0x622A, 0x9D43, 0x622E, + 0x9D44, 0x6230, 0x9D45, 0x6232, 0x9D46, 0x6233, 0x9D47, 0x6241, + 0x9D48, 0x624E, 0x9D49, 0x625E, 0x9D4A, 0x6263, 0x9D4B, 0x625B, + 0x9D4C, 0x6260, 0x9D4D, 0x6268, 0x9D4E, 0x627C, 0x9D4F, 0x6282, + 0x9D50, 0x6289, 0x9D51, 0x627E, 0x9D52, 0x6292, 0x9D53, 0x6293, + 0x9D54, 0x6296, 0x9D55, 0x62D4, 0x9D56, 0x6283, 0x9D57, 0x6294, + 0x9D58, 0x62D7, 0x9D59, 0x62D1, 0x9D5A, 0x62BB, 0x9D5B, 0x62CF, + 0x9D5C, 0x62FF, 0x9D5D, 0x62C6, 0x9D5E, 0x64D4, 0x9D5F, 0x62C8, + 0x9D60, 0x62DC, 0x9D61, 0x62CC, 0x9D62, 0x62CA, 0x9D63, 0x62C2, + 0x9D64, 0x62C7, 0x9D65, 0x629B, 0x9D66, 0x62C9, 0x9D67, 0x630C, + 0x9D68, 0x62EE, 0x9D69, 0x62F1, 0x9D6A, 0x6327, 0x9D6B, 0x6302, + 0x9D6C, 0x6308, 0x9D6D, 0x62EF, 0x9D6E, 0x62F5, 0x9D6F, 0x6350, + 0x9D70, 0x633E, 0x9D71, 0x634D, 0x9D72, 0x641C, 0x9D73, 0x634F, + 0x9D74, 0x6396, 0x9D75, 0x638E, 0x9D76, 0x6380, 0x9D77, 0x63AB, + 0x9D78, 0x6376, 0x9D79, 0x63A3, 0x9D7A, 0x638F, 0x9D7B, 0x6389, + 0x9D7C, 0x639F, 0x9D7D, 0x63B5, 0x9D7E, 0x636B, 0x9D80, 0x6369, + 0x9D81, 0x63BE, 0x9D82, 0x63E9, 0x9D83, 0x63C0, 0x9D84, 0x63C6, + 0x9D85, 0x63E3, 0x9D86, 0x63C9, 0x9D87, 0x63D2, 0x9D88, 0x63F6, + 0x9D89, 0x63C4, 0x9D8A, 0x6416, 0x9D8B, 0x6434, 0x9D8C, 0x6406, + 0x9D8D, 0x6413, 0x9D8E, 0x6426, 0x9D8F, 0x6436, 0x9D90, 0x651D, + 0x9D91, 0x6417, 0x9D92, 0x6428, 0x9D93, 0x640F, 0x9D94, 0x6467, + 0x9D95, 0x646F, 0x9D96, 0x6476, 0x9D97, 0x644E, 0x9D98, 0x652A, + 0x9D99, 0x6495, 0x9D9A, 0x6493, 0x9D9B, 0x64A5, 0x9D9C, 0x64A9, + 0x9D9D, 0x6488, 0x9D9E, 0x64BC, 0x9D9F, 0x64DA, 0x9DA0, 0x64D2, + 0x9DA1, 0x64C5, 0x9DA2, 0x64C7, 0x9DA3, 0x64BB, 0x9DA4, 0x64D8, + 0x9DA5, 0x64C2, 0x9DA6, 0x64F1, 0x9DA7, 0x64E7, 0x9DA8, 0x8209, + 0x9DA9, 0x64E0, 0x9DAA, 0x64E1, 0x9DAB, 0x62AC, 0x9DAC, 0x64E3, + 0x9DAD, 0x64EF, 0x9DAE, 0x652C, 0x9DAF, 0x64F6, 0x9DB0, 0x64F4, + 0x9DB1, 0x64F2, 0x9DB2, 0x64FA, 0x9DB3, 0x6500, 0x9DB4, 0x64FD, + 0x9DB5, 0x6518, 0x9DB6, 0x651C, 0x9DB7, 0x6505, 0x9DB8, 0x6524, + 0x9DB9, 0x6523, 0x9DBA, 0x652B, 0x9DBB, 0x6534, 0x9DBC, 0x6535, + 0x9DBD, 0x6537, 0x9DBE, 0x6536, 0x9DBF, 0x6538, 0x9DC0, 0x754B, + 0x9DC1, 0x6548, 0x9DC2, 0x6556, 0x9DC3, 0x6555, 0x9DC4, 0x654D, + 0x9DC5, 0x6558, 0x9DC6, 0x655E, 0x9DC7, 0x655D, 0x9DC8, 0x6572, + 0x9DC9, 0x6578, 0x9DCA, 0x6582, 0x9DCB, 0x6583, 0x9DCC, 0x8B8A, + 0x9DCD, 0x659B, 0x9DCE, 0x659F, 0x9DCF, 0x65AB, 0x9DD0, 0x65B7, + 0x9DD1, 0x65C3, 0x9DD2, 0x65C6, 0x9DD3, 0x65C1, 0x9DD4, 0x65C4, + 0x9DD5, 0x65CC, 0x9DD6, 0x65D2, 0x9DD7, 0x65DB, 0x9DD8, 0x65D9, + 0x9DD9, 0x65E0, 0x9DDA, 0x65E1, 0x9DDB, 0x65F1, 0x9DDC, 0x6772, + 0x9DDD, 0x660A, 0x9DDE, 0x6603, 0x9DDF, 0x65FB, 0x9DE0, 0x6773, + 0x9DE1, 0x6635, 0x9DE2, 0x6636, 0x9DE3, 0x6634, 0x9DE4, 0x661C, + 0x9DE5, 0x664F, 0x9DE6, 0x6644, 0x9DE7, 0x6649, 0x9DE8, 0x6641, + 0x9DE9, 0x665E, 0x9DEA, 0x665D, 0x9DEB, 0x6664, 0x9DEC, 0x6667, + 0x9DED, 0x6668, 0x9DEE, 0x665F, 0x9DEF, 0x6662, 0x9DF0, 0x6670, + 0x9DF1, 0x6683, 0x9DF2, 0x6688, 0x9DF3, 0x668E, 0x9DF4, 0x6689, + 0x9DF5, 0x6684, 0x9DF6, 0x6698, 0x9DF7, 0x669D, 0x9DF8, 0x66C1, + 0x9DF9, 0x66B9, 0x9DFA, 0x66C9, 0x9DFB, 0x66BE, 0x9DFC, 0x66BC, + 0x9E40, 0x66C4, 0x9E41, 0x66B8, 0x9E42, 0x66D6, 0x9E43, 0x66DA, + 0x9E44, 0x66E0, 0x9E45, 0x663F, 0x9E46, 0x66E6, 0x9E47, 0x66E9, + 0x9E48, 0x66F0, 0x9E49, 0x66F5, 0x9E4A, 0x66F7, 0x9E4B, 0x670F, + 0x9E4C, 0x6716, 0x9E4D, 0x671E, 0x9E4E, 0x6726, 0x9E4F, 0x6727, + 0x9E50, 0x9738, 0x9E51, 0x672E, 0x9E52, 0x673F, 0x9E53, 0x6736, + 0x9E54, 0x6741, 0x9E55, 0x6738, 0x9E56, 0x6737, 0x9E57, 0x6746, + 0x9E58, 0x675E, 0x9E59, 0x6760, 0x9E5A, 0x6759, 0x9E5B, 0x6763, + 0x9E5C, 0x6764, 0x9E5D, 0x6789, 0x9E5E, 0x6770, 0x9E5F, 0x67A9, + 0x9E60, 0x677C, 0x9E61, 0x676A, 0x9E62, 0x678C, 0x9E63, 0x678B, + 0x9E64, 0x67A6, 0x9E65, 0x67A1, 0x9E66, 0x6785, 0x9E67, 0x67B7, + 0x9E68, 0x67EF, 0x9E69, 0x67B4, 0x9E6A, 0x67EC, 0x9E6B, 0x67B3, + 0x9E6C, 0x67E9, 0x9E6D, 0x67B8, 0x9E6E, 0x67E4, 0x9E6F, 0x67DE, + 0x9E70, 0x67DD, 0x9E71, 0x67E2, 0x9E72, 0x67EE, 0x9E73, 0x67B9, + 0x9E74, 0x67CE, 0x9E75, 0x67C6, 0x9E76, 0x67E7, 0x9E77, 0x6A9C, + 0x9E78, 0x681E, 0x9E79, 0x6846, 0x9E7A, 0x6829, 0x9E7B, 0x6840, + 0x9E7C, 0x684D, 0x9E7D, 0x6832, 0x9E7E, 0x684E, 0x9E80, 0x68B3, + 0x9E81, 0x682B, 0x9E82, 0x6859, 0x9E83, 0x6863, 0x9E84, 0x6877, + 0x9E85, 0x687F, 0x9E86, 0x689F, 0x9E87, 0x688F, 0x9E88, 0x68AD, + 0x9E89, 0x6894, 0x9E8A, 0x689D, 0x9E8B, 0x689B, 0x9E8C, 0x6883, + 0x9E8D, 0x6AAE, 0x9E8E, 0x68B9, 0x9E8F, 0x6874, 0x9E90, 0x68B5, + 0x9E91, 0x68A0, 0x9E92, 0x68BA, 0x9E93, 0x690F, 0x9E94, 0x688D, + 0x9E95, 0x687E, 0x9E96, 0x6901, 0x9E97, 0x68CA, 0x9E98, 0x6908, + 0x9E99, 0x68D8, 0x9E9A, 0x6922, 0x9E9B, 0x6926, 0x9E9C, 0x68E1, + 0x9E9D, 0x690C, 0x9E9E, 0x68CD, 0x9E9F, 0x68D4, 0x9EA0, 0x68E7, + 0x9EA1, 0x68D5, 0x9EA2, 0x6936, 0x9EA3, 0x6912, 0x9EA4, 0x6904, + 0x9EA5, 0x68D7, 0x9EA6, 0x68E3, 0x9EA7, 0x6925, 0x9EA8, 0x68F9, + 0x9EA9, 0x68E0, 0x9EAA, 0x68EF, 0x9EAB, 0x6928, 0x9EAC, 0x692A, + 0x9EAD, 0x691A, 0x9EAE, 0x6923, 0x9EAF, 0x6921, 0x9EB0, 0x68C6, + 0x9EB1, 0x6979, 0x9EB2, 0x6977, 0x9EB3, 0x695C, 0x9EB4, 0x6978, + 0x9EB5, 0x696B, 0x9EB6, 0x6954, 0x9EB7, 0x697E, 0x9EB8, 0x696E, + 0x9EB9, 0x6939, 0x9EBA, 0x6974, 0x9EBB, 0x693D, 0x9EBC, 0x6959, + 0x9EBD, 0x6930, 0x9EBE, 0x6961, 0x9EBF, 0x695E, 0x9EC0, 0x695D, + 0x9EC1, 0x6981, 0x9EC2, 0x696A, 0x9EC3, 0x69B2, 0x9EC4, 0x69AE, + 0x9EC5, 0x69D0, 0x9EC6, 0x69BF, 0x9EC7, 0x69C1, 0x9EC8, 0x69D3, + 0x9EC9, 0x69BE, 0x9ECA, 0x69CE, 0x9ECB, 0x5BE8, 0x9ECC, 0x69CA, + 0x9ECD, 0x69DD, 0x9ECE, 0x69BB, 0x9ECF, 0x69C3, 0x9ED0, 0x69A7, + 0x9ED1, 0x6A2E, 0x9ED2, 0x6991, 0x9ED3, 0x69A0, 0x9ED4, 0x699C, + 0x9ED5, 0x6995, 0x9ED6, 0x69B4, 0x9ED7, 0x69DE, 0x9ED8, 0x69E8, + 0x9ED9, 0x6A02, 0x9EDA, 0x6A1B, 0x9EDB, 0x69FF, 0x9EDC, 0x6B0A, + 0x9EDD, 0x69F9, 0x9EDE, 0x69F2, 0x9EDF, 0x69E7, 0x9EE0, 0x6A05, + 0x9EE1, 0x69B1, 0x9EE2, 0x6A1E, 0x9EE3, 0x69ED, 0x9EE4, 0x6A14, + 0x9EE5, 0x69EB, 0x9EE6, 0x6A0A, 0x9EE7, 0x6A12, 0x9EE8, 0x6AC1, + 0x9EE9, 0x6A23, 0x9EEA, 0x6A13, 0x9EEB, 0x6A44, 0x9EEC, 0x6A0C, + 0x9EED, 0x6A72, 0x9EEE, 0x6A36, 0x9EEF, 0x6A78, 0x9EF0, 0x6A47, + 0x9EF1, 0x6A62, 0x9EF2, 0x6A59, 0x9EF3, 0x6A66, 0x9EF4, 0x6A48, + 0x9EF5, 0x6A38, 0x9EF6, 0x6A22, 0x9EF7, 0x6A90, 0x9EF8, 0x6A8D, + 0x9EF9, 0x6AA0, 0x9EFA, 0x6A84, 0x9EFB, 0x6AA2, 0x9EFC, 0x6AA3, + 0x9F40, 0x6A97, 0x9F41, 0x8617, 0x9F42, 0x6ABB, 0x9F43, 0x6AC3, + 0x9F44, 0x6AC2, 0x9F45, 0x6AB8, 0x9F46, 0x6AB3, 0x9F47, 0x6AAC, + 0x9F48, 0x6ADE, 0x9F49, 0x6AD1, 0x9F4A, 0x6ADF, 0x9F4B, 0x6AAA, + 0x9F4C, 0x6ADA, 0x9F4D, 0x6AEA, 0x9F4E, 0x6AFB, 0x9F4F, 0x6B05, + 0x9F50, 0x8616, 0x9F51, 0x6AFA, 0x9F52, 0x6B12, 0x9F53, 0x6B16, + 0x9F54, 0x9B31, 0x9F55, 0x6B1F, 0x9F56, 0x6B38, 0x9F57, 0x6B37, + 0x9F58, 0x76DC, 0x9F59, 0x6B39, 0x9F5A, 0x98EE, 0x9F5B, 0x6B47, + 0x9F5C, 0x6B43, 0x9F5D, 0x6B49, 0x9F5E, 0x6B50, 0x9F5F, 0x6B59, + 0x9F60, 0x6B54, 0x9F61, 0x6B5B, 0x9F62, 0x6B5F, 0x9F63, 0x6B61, + 0x9F64, 0x6B78, 0x9F65, 0x6B79, 0x9F66, 0x6B7F, 0x9F67, 0x6B80, + 0x9F68, 0x6B84, 0x9F69, 0x6B83, 0x9F6A, 0x6B8D, 0x9F6B, 0x6B98, + 0x9F6C, 0x6B95, 0x9F6D, 0x6B9E, 0x9F6E, 0x6BA4, 0x9F6F, 0x6BAA, + 0x9F70, 0x6BAB, 0x9F71, 0x6BAF, 0x9F72, 0x6BB2, 0x9F73, 0x6BB1, + 0x9F74, 0x6BB3, 0x9F75, 0x6BB7, 0x9F76, 0x6BBC, 0x9F77, 0x6BC6, + 0x9F78, 0x6BCB, 0x9F79, 0x6BD3, 0x9F7A, 0x6BDF, 0x9F7B, 0x6BEC, + 0x9F7C, 0x6BEB, 0x9F7D, 0x6BF3, 0x9F7E, 0x6BEF, 0x9F80, 0x9EBE, + 0x9F81, 0x6C08, 0x9F82, 0x6C13, 0x9F83, 0x6C14, 0x9F84, 0x6C1B, + 0x9F85, 0x6C24, 0x9F86, 0x6C23, 0x9F87, 0x6C5E, 0x9F88, 0x6C55, + 0x9F89, 0x6C62, 0x9F8A, 0x6C6A, 0x9F8B, 0x6C82, 0x9F8C, 0x6C8D, + 0x9F8D, 0x6C9A, 0x9F8E, 0x6C81, 0x9F8F, 0x6C9B, 0x9F90, 0x6C7E, + 0x9F91, 0x6C68, 0x9F92, 0x6C73, 0x9F93, 0x6C92, 0x9F94, 0x6C90, + 0x9F95, 0x6CC4, 0x9F96, 0x6CF1, 0x9F97, 0x6CD3, 0x9F98, 0x6CBD, + 0x9F99, 0x6CD7, 0x9F9A, 0x6CC5, 0x9F9B, 0x6CDD, 0x9F9C, 0x6CAE, + 0x9F9D, 0x6CB1, 0x9F9E, 0x6CBE, 0x9F9F, 0x6CBA, 0x9FA0, 0x6CDB, + 0x9FA1, 0x6CEF, 0x9FA2, 0x6CD9, 0x9FA3, 0x6CEA, 0x9FA4, 0x6D1F, + 0x9FA5, 0x884D, 0x9FA6, 0x6D36, 0x9FA7, 0x6D2B, 0x9FA8, 0x6D3D, + 0x9FA9, 0x6D38, 0x9FAA, 0x6D19, 0x9FAB, 0x6D35, 0x9FAC, 0x6D33, + 0x9FAD, 0x6D12, 0x9FAE, 0x6D0C, 0x9FAF, 0x6D63, 0x9FB0, 0x6D93, + 0x9FB1, 0x6D64, 0x9FB2, 0x6D5A, 0x9FB3, 0x6D79, 0x9FB4, 0x6D59, + 0x9FB5, 0x6D8E, 0x9FB6, 0x6D95, 0x9FB7, 0x6FE4, 0x9FB8, 0x6D85, + 0x9FB9, 0x6DF9, 0x9FBA, 0x6E15, 0x9FBB, 0x6E0A, 0x9FBC, 0x6DB5, + 0x9FBD, 0x6DC7, 0x9FBE, 0x6DE6, 0x9FBF, 0x6DB8, 0x9FC0, 0x6DC6, + 0x9FC1, 0x6DEC, 0x9FC2, 0x6DDE, 0x9FC3, 0x6DCC, 0x9FC4, 0x6DE8, + 0x9FC5, 0x6DD2, 0x9FC6, 0x6DC5, 0x9FC7, 0x6DFA, 0x9FC8, 0x6DD9, + 0x9FC9, 0x6DE4, 0x9FCA, 0x6DD5, 0x9FCB, 0x6DEA, 0x9FCC, 0x6DEE, + 0x9FCD, 0x6E2D, 0x9FCE, 0x6E6E, 0x9FCF, 0x6E2E, 0x9FD0, 0x6E19, + 0x9FD1, 0x6E72, 0x9FD2, 0x6E5F, 0x9FD3, 0x6E3E, 0x9FD4, 0x6E23, + 0x9FD5, 0x6E6B, 0x9FD6, 0x6E2B, 0x9FD7, 0x6E76, 0x9FD8, 0x6E4D, + 0x9FD9, 0x6E1F, 0x9FDA, 0x6E43, 0x9FDB, 0x6E3A, 0x9FDC, 0x6E4E, + 0x9FDD, 0x6E24, 0x9FDE, 0x6EFF, 0x9FDF, 0x6E1D, 0x9FE0, 0x6E38, + 0x9FE1, 0x6E82, 0x9FE2, 0x6EAA, 0x9FE3, 0x6E98, 0x9FE4, 0x6EC9, + 0x9FE5, 0x6EB7, 0x9FE6, 0x6ED3, 0x9FE7, 0x6EBD, 0x9FE8, 0x6EAF, + 0x9FE9, 0x6EC4, 0x9FEA, 0x6EB2, 0x9FEB, 0x6ED4, 0x9FEC, 0x6ED5, + 0x9FED, 0x6E8F, 0x9FEE, 0x6EA5, 0x9FEF, 0x6EC2, 0x9FF0, 0x6E9F, + 0x9FF1, 0x6F41, 0x9FF2, 0x6F11, 0x9FF3, 0x704C, 0x9FF4, 0x6EEC, + 0x9FF5, 0x6EF8, 0x9FF6, 0x6EFE, 0x9FF7, 0x6F3F, 0x9FF8, 0x6EF2, + 0x9FF9, 0x6F31, 0x9FFA, 0x6EEF, 0x9FFB, 0x6F32, 0x9FFC, 0x6ECC, + 0xE040, 0x6F3E, 0xE041, 0x6F13, 0xE042, 0x6EF7, 0xE043, 0x6F86, + 0xE044, 0x6F7A, 0xE045, 0x6F78, 0xE046, 0x6F81, 0xE047, 0x6F80, + 0xE048, 0x6F6F, 0xE049, 0x6F5B, 0xE04A, 0x6FF3, 0xE04B, 0x6F6D, + 0xE04C, 0x6F82, 0xE04D, 0x6F7C, 0xE04E, 0x6F58, 0xE04F, 0x6F8E, + 0xE050, 0x6F91, 0xE051, 0x6FC2, 0xE052, 0x6F66, 0xE053, 0x6FB3, + 0xE054, 0x6FA3, 0xE055, 0x6FA1, 0xE056, 0x6FA4, 0xE057, 0x6FB9, + 0xE058, 0x6FC6, 0xE059, 0x6FAA, 0xE05A, 0x6FDF, 0xE05B, 0x6FD5, + 0xE05C, 0x6FEC, 0xE05D, 0x6FD4, 0xE05E, 0x6FD8, 0xE05F, 0x6FF1, + 0xE060, 0x6FEE, 0xE061, 0x6FDB, 0xE062, 0x7009, 0xE063, 0x700B, + 0xE064, 0x6FFA, 0xE065, 0x7011, 0xE066, 0x7001, 0xE067, 0x700F, + 0xE068, 0x6FFE, 0xE069, 0x701B, 0xE06A, 0x701A, 0xE06B, 0x6F74, + 0xE06C, 0x701D, 0xE06D, 0x7018, 0xE06E, 0x701F, 0xE06F, 0x7030, + 0xE070, 0x703E, 0xE071, 0x7032, 0xE072, 0x7051, 0xE073, 0x7063, + 0xE074, 0x7099, 0xE075, 0x7092, 0xE076, 0x70AF, 0xE077, 0x70F1, + 0xE078, 0x70AC, 0xE079, 0x70B8, 0xE07A, 0x70B3, 0xE07B, 0x70AE, + 0xE07C, 0x70DF, 0xE07D, 0x70CB, 0xE07E, 0x70DD, 0xE080, 0x70D9, + 0xE081, 0x7109, 0xE082, 0x70FD, 0xE083, 0x711C, 0xE084, 0x7119, + 0xE085, 0x7165, 0xE086, 0x7155, 0xE087, 0x7188, 0xE088, 0x7166, + 0xE089, 0x7162, 0xE08A, 0x714C, 0xE08B, 0x7156, 0xE08C, 0x716C, + 0xE08D, 0x718F, 0xE08E, 0x71FB, 0xE08F, 0x7184, 0xE090, 0x7195, + 0xE091, 0x71A8, 0xE092, 0x71AC, 0xE093, 0x71D7, 0xE094, 0x71B9, + 0xE095, 0x71BE, 0xE096, 0x71D2, 0xE097, 0x71C9, 0xE098, 0x71D4, + 0xE099, 0x71CE, 0xE09A, 0x71E0, 0xE09B, 0x71EC, 0xE09C, 0x71E7, + 0xE09D, 0x71F5, 0xE09E, 0x71FC, 0xE09F, 0x71F9, 0xE0A0, 0x71FF, + 0xE0A1, 0x720D, 0xE0A2, 0x7210, 0xE0A3, 0x721B, 0xE0A4, 0x7228, + 0xE0A5, 0x722D, 0xE0A6, 0x722C, 0xE0A7, 0x7230, 0xE0A8, 0x7232, + 0xE0A9, 0x723B, 0xE0AA, 0x723C, 0xE0AB, 0x723F, 0xE0AC, 0x7240, + 0xE0AD, 0x7246, 0xE0AE, 0x724B, 0xE0AF, 0x7258, 0xE0B0, 0x7274, + 0xE0B1, 0x727E, 0xE0B2, 0x7282, 0xE0B3, 0x7281, 0xE0B4, 0x7287, + 0xE0B5, 0x7292, 0xE0B6, 0x7296, 0xE0B7, 0x72A2, 0xE0B8, 0x72A7, + 0xE0B9, 0x72B9, 0xE0BA, 0x72B2, 0xE0BB, 0x72C3, 0xE0BC, 0x72C6, + 0xE0BD, 0x72C4, 0xE0BE, 0x72CE, 0xE0BF, 0x72D2, 0xE0C0, 0x72E2, + 0xE0C1, 0x72E0, 0xE0C2, 0x72E1, 0xE0C3, 0x72F9, 0xE0C4, 0x72F7, + 0xE0C5, 0x500F, 0xE0C6, 0x7317, 0xE0C7, 0x730A, 0xE0C8, 0x731C, + 0xE0C9, 0x7316, 0xE0CA, 0x731D, 0xE0CB, 0x7334, 0xE0CC, 0x732F, + 0xE0CD, 0x7329, 0xE0CE, 0x7325, 0xE0CF, 0x733E, 0xE0D0, 0x734E, + 0xE0D1, 0x734F, 0xE0D2, 0x9ED8, 0xE0D3, 0x7357, 0xE0D4, 0x736A, + 0xE0D5, 0x7368, 0xE0D6, 0x7370, 0xE0D7, 0x7378, 0xE0D8, 0x7375, + 0xE0D9, 0x737B, 0xE0DA, 0x737A, 0xE0DB, 0x73C8, 0xE0DC, 0x73B3, + 0xE0DD, 0x73CE, 0xE0DE, 0x73BB, 0xE0DF, 0x73C0, 0xE0E0, 0x73E5, + 0xE0E1, 0x73EE, 0xE0E2, 0x73DE, 0xE0E3, 0x74A2, 0xE0E4, 0x7405, + 0xE0E5, 0x746F, 0xE0E6, 0x7425, 0xE0E7, 0x73F8, 0xE0E8, 0x7432, + 0xE0E9, 0x743A, 0xE0EA, 0x7455, 0xE0EB, 0x743F, 0xE0EC, 0x745F, + 0xE0ED, 0x7459, 0xE0EE, 0x7441, 0xE0EF, 0x745C, 0xE0F0, 0x7469, + 0xE0F1, 0x7470, 0xE0F2, 0x7463, 0xE0F3, 0x746A, 0xE0F4, 0x7476, + 0xE0F5, 0x747E, 0xE0F6, 0x748B, 0xE0F7, 0x749E, 0xE0F8, 0x74A7, + 0xE0F9, 0x74CA, 0xE0FA, 0x74CF, 0xE0FB, 0x74D4, 0xE0FC, 0x73F1, + 0xE140, 0x74E0, 0xE141, 0x74E3, 0xE142, 0x74E7, 0xE143, 0x74E9, + 0xE144, 0x74EE, 0xE145, 0x74F2, 0xE146, 0x74F0, 0xE147, 0x74F1, + 0xE148, 0x74F8, 0xE149, 0x74F7, 0xE14A, 0x7504, 0xE14B, 0x7503, + 0xE14C, 0x7505, 0xE14D, 0x750C, 0xE14E, 0x750E, 0xE14F, 0x750D, + 0xE150, 0x7515, 0xE151, 0x7513, 0xE152, 0x751E, 0xE153, 0x7526, + 0xE154, 0x752C, 0xE155, 0x753C, 0xE156, 0x7544, 0xE157, 0x754D, + 0xE158, 0x754A, 0xE159, 0x7549, 0xE15A, 0x755B, 0xE15B, 0x7546, + 0xE15C, 0x755A, 0xE15D, 0x7569, 0xE15E, 0x7564, 0xE15F, 0x7567, + 0xE160, 0x756B, 0xE161, 0x756D, 0xE162, 0x7578, 0xE163, 0x7576, + 0xE164, 0x7586, 0xE165, 0x7587, 0xE166, 0x7574, 0xE167, 0x758A, + 0xE168, 0x7589, 0xE169, 0x7582, 0xE16A, 0x7594, 0xE16B, 0x759A, + 0xE16C, 0x759D, 0xE16D, 0x75A5, 0xE16E, 0x75A3, 0xE16F, 0x75C2, + 0xE170, 0x75B3, 0xE171, 0x75C3, 0xE172, 0x75B5, 0xE173, 0x75BD, + 0xE174, 0x75B8, 0xE175, 0x75BC, 0xE176, 0x75B1, 0xE177, 0x75CD, + 0xE178, 0x75CA, 0xE179, 0x75D2, 0xE17A, 0x75D9, 0xE17B, 0x75E3, + 0xE17C, 0x75DE, 0xE17D, 0x75FE, 0xE17E, 0x75FF, 0xE180, 0x75FC, + 0xE181, 0x7601, 0xE182, 0x75F0, 0xE183, 0x75FA, 0xE184, 0x75F2, + 0xE185, 0x75F3, 0xE186, 0x760B, 0xE187, 0x760D, 0xE188, 0x7609, + 0xE189, 0x761F, 0xE18A, 0x7627, 0xE18B, 0x7620, 0xE18C, 0x7621, + 0xE18D, 0x7622, 0xE18E, 0x7624, 0xE18F, 0x7634, 0xE190, 0x7630, + 0xE191, 0x763B, 0xE192, 0x7647, 0xE193, 0x7648, 0xE194, 0x7646, + 0xE195, 0x765C, 0xE196, 0x7658, 0xE197, 0x7661, 0xE198, 0x7662, + 0xE199, 0x7668, 0xE19A, 0x7669, 0xE19B, 0x766A, 0xE19C, 0x7667, + 0xE19D, 0x766C, 0xE19E, 0x7670, 0xE19F, 0x7672, 0xE1A0, 0x7676, + 0xE1A1, 0x7678, 0xE1A2, 0x767C, 0xE1A3, 0x7680, 0xE1A4, 0x7683, + 0xE1A5, 0x7688, 0xE1A6, 0x768B, 0xE1A7, 0x768E, 0xE1A8, 0x7696, + 0xE1A9, 0x7693, 0xE1AA, 0x7699, 0xE1AB, 0x769A, 0xE1AC, 0x76B0, + 0xE1AD, 0x76B4, 0xE1AE, 0x76B8, 0xE1AF, 0x76B9, 0xE1B0, 0x76BA, + 0xE1B1, 0x76C2, 0xE1B2, 0x76CD, 0xE1B3, 0x76D6, 0xE1B4, 0x76D2, + 0xE1B5, 0x76DE, 0xE1B6, 0x76E1, 0xE1B7, 0x76E5, 0xE1B8, 0x76E7, + 0xE1B9, 0x76EA, 0xE1BA, 0x862F, 0xE1BB, 0x76FB, 0xE1BC, 0x7708, + 0xE1BD, 0x7707, 0xE1BE, 0x7704, 0xE1BF, 0x7729, 0xE1C0, 0x7724, + 0xE1C1, 0x771E, 0xE1C2, 0x7725, 0xE1C3, 0x7726, 0xE1C4, 0x771B, + 0xE1C5, 0x7737, 0xE1C6, 0x7738, 0xE1C7, 0x7747, 0xE1C8, 0x775A, + 0xE1C9, 0x7768, 0xE1CA, 0x776B, 0xE1CB, 0x775B, 0xE1CC, 0x7765, + 0xE1CD, 0x777F, 0xE1CE, 0x777E, 0xE1CF, 0x7779, 0xE1D0, 0x778E, + 0xE1D1, 0x778B, 0xE1D2, 0x7791, 0xE1D3, 0x77A0, 0xE1D4, 0x779E, + 0xE1D5, 0x77B0, 0xE1D6, 0x77B6, 0xE1D7, 0x77B9, 0xE1D8, 0x77BF, + 0xE1D9, 0x77BC, 0xE1DA, 0x77BD, 0xE1DB, 0x77BB, 0xE1DC, 0x77C7, + 0xE1DD, 0x77CD, 0xE1DE, 0x77D7, 0xE1DF, 0x77DA, 0xE1E0, 0x77DC, + 0xE1E1, 0x77E3, 0xE1E2, 0x77EE, 0xE1E3, 0x77FC, 0xE1E4, 0x780C, + 0xE1E5, 0x7812, 0xE1E6, 0x7926, 0xE1E7, 0x7820, 0xE1E8, 0x792A, + 0xE1E9, 0x7845, 0xE1EA, 0x788E, 0xE1EB, 0x7874, 0xE1EC, 0x7886, + 0xE1ED, 0x787C, 0xE1EE, 0x789A, 0xE1EF, 0x788C, 0xE1F0, 0x78A3, + 0xE1F1, 0x78B5, 0xE1F2, 0x78AA, 0xE1F3, 0x78AF, 0xE1F4, 0x78D1, + 0xE1F5, 0x78C6, 0xE1F6, 0x78CB, 0xE1F7, 0x78D4, 0xE1F8, 0x78BE, + 0xE1F9, 0x78BC, 0xE1FA, 0x78C5, 0xE1FB, 0x78CA, 0xE1FC, 0x78EC, + 0xE240, 0x78E7, 0xE241, 0x78DA, 0xE242, 0x78FD, 0xE243, 0x78F4, + 0xE244, 0x7907, 0xE245, 0x7912, 0xE246, 0x7911, 0xE247, 0x7919, + 0xE248, 0x792C, 0xE249, 0x792B, 0xE24A, 0x7940, 0xE24B, 0x7960, + 0xE24C, 0x7957, 0xE24D, 0x795F, 0xE24E, 0x795A, 0xE24F, 0x7955, + 0xE250, 0x7953, 0xE251, 0x797A, 0xE252, 0x797F, 0xE253, 0x798A, + 0xE254, 0x799D, 0xE255, 0x79A7, 0xE256, 0x9F4B, 0xE257, 0x79AA, + 0xE258, 0x79AE, 0xE259, 0x79B3, 0xE25A, 0x79B9, 0xE25B, 0x79BA, + 0xE25C, 0x79C9, 0xE25D, 0x79D5, 0xE25E, 0x79E7, 0xE25F, 0x79EC, + 0xE260, 0x79E1, 0xE261, 0x79E3, 0xE262, 0x7A08, 0xE263, 0x7A0D, + 0xE264, 0x7A18, 0xE265, 0x7A19, 0xE266, 0x7A20, 0xE267, 0x7A1F, + 0xE268, 0x7980, 0xE269, 0x7A31, 0xE26A, 0x7A3B, 0xE26B, 0x7A3E, + 0xE26C, 0x7A37, 0xE26D, 0x7A43, 0xE26E, 0x7A57, 0xE26F, 0x7A49, + 0xE270, 0x7A61, 0xE271, 0x7A62, 0xE272, 0x7A69, 0xE273, 0x9F9D, + 0xE274, 0x7A70, 0xE275, 0x7A79, 0xE276, 0x7A7D, 0xE277, 0x7A88, + 0xE278, 0x7A97, 0xE279, 0x7A95, 0xE27A, 0x7A98, 0xE27B, 0x7A96, + 0xE27C, 0x7AA9, 0xE27D, 0x7AC8, 0xE27E, 0x7AB0, 0xE280, 0x7AB6, + 0xE281, 0x7AC5, 0xE282, 0x7AC4, 0xE283, 0x7ABF, 0xE284, 0x9083, + 0xE285, 0x7AC7, 0xE286, 0x7ACA, 0xE287, 0x7ACD, 0xE288, 0x7ACF, + 0xE289, 0x7AD5, 0xE28A, 0x7AD3, 0xE28B, 0x7AD9, 0xE28C, 0x7ADA, + 0xE28D, 0x7ADD, 0xE28E, 0x7AE1, 0xE28F, 0x7AE2, 0xE290, 0x7AE6, + 0xE291, 0x7AED, 0xE292, 0x7AF0, 0xE293, 0x7B02, 0xE294, 0x7B0F, + 0xE295, 0x7B0A, 0xE296, 0x7B06, 0xE297, 0x7B33, 0xE298, 0x7B18, + 0xE299, 0x7B19, 0xE29A, 0x7B1E, 0xE29B, 0x7B35, 0xE29C, 0x7B28, + 0xE29D, 0x7B36, 0xE29E, 0x7B50, 0xE29F, 0x7B7A, 0xE2A0, 0x7B04, + 0xE2A1, 0x7B4D, 0xE2A2, 0x7B0B, 0xE2A3, 0x7B4C, 0xE2A4, 0x7B45, + 0xE2A5, 0x7B75, 0xE2A6, 0x7B65, 0xE2A7, 0x7B74, 0xE2A8, 0x7B67, + 0xE2A9, 0x7B70, 0xE2AA, 0x7B71, 0xE2AB, 0x7B6C, 0xE2AC, 0x7B6E, + 0xE2AD, 0x7B9D, 0xE2AE, 0x7B98, 0xE2AF, 0x7B9F, 0xE2B0, 0x7B8D, + 0xE2B1, 0x7B9C, 0xE2B2, 0x7B9A, 0xE2B3, 0x7B8B, 0xE2B4, 0x7B92, + 0xE2B5, 0x7B8F, 0xE2B6, 0x7B5D, 0xE2B7, 0x7B99, 0xE2B8, 0x7BCB, + 0xE2B9, 0x7BC1, 0xE2BA, 0x7BCC, 0xE2BB, 0x7BCF, 0xE2BC, 0x7BB4, + 0xE2BD, 0x7BC6, 0xE2BE, 0x7BDD, 0xE2BF, 0x7BE9, 0xE2C0, 0x7C11, + 0xE2C1, 0x7C14, 0xE2C2, 0x7BE6, 0xE2C3, 0x7BE5, 0xE2C4, 0x7C60, + 0xE2C5, 0x7C00, 0xE2C6, 0x7C07, 0xE2C7, 0x7C13, 0xE2C8, 0x7BF3, + 0xE2C9, 0x7BF7, 0xE2CA, 0x7C17, 0xE2CB, 0x7C0D, 0xE2CC, 0x7BF6, + 0xE2CD, 0x7C23, 0xE2CE, 0x7C27, 0xE2CF, 0x7C2A, 0xE2D0, 0x7C1F, + 0xE2D1, 0x7C37, 0xE2D2, 0x7C2B, 0xE2D3, 0x7C3D, 0xE2D4, 0x7C4C, + 0xE2D5, 0x7C43, 0xE2D6, 0x7C54, 0xE2D7, 0x7C4F, 0xE2D8, 0x7C40, + 0xE2D9, 0x7C50, 0xE2DA, 0x7C58, 0xE2DB, 0x7C5F, 0xE2DC, 0x7C64, + 0xE2DD, 0x7C56, 0xE2DE, 0x7C65, 0xE2DF, 0x7C6C, 0xE2E0, 0x7C75, + 0xE2E1, 0x7C83, 0xE2E2, 0x7C90, 0xE2E3, 0x7CA4, 0xE2E4, 0x7CAD, + 0xE2E5, 0x7CA2, 0xE2E6, 0x7CAB, 0xE2E7, 0x7CA1, 0xE2E8, 0x7CA8, + 0xE2E9, 0x7CB3, 0xE2EA, 0x7CB2, 0xE2EB, 0x7CB1, 0xE2EC, 0x7CAE, + 0xE2ED, 0x7CB9, 0xE2EE, 0x7CBD, 0xE2EF, 0x7CC0, 0xE2F0, 0x7CC5, + 0xE2F1, 0x7CC2, 0xE2F2, 0x7CD8, 0xE2F3, 0x7CD2, 0xE2F4, 0x7CDC, + 0xE2F5, 0x7CE2, 0xE2F6, 0x9B3B, 0xE2F7, 0x7CEF, 0xE2F8, 0x7CF2, + 0xE2F9, 0x7CF4, 0xE2FA, 0x7CF6, 0xE2FB, 0x7CFA, 0xE2FC, 0x7D06, + 0xE340, 0x7D02, 0xE341, 0x7D1C, 0xE342, 0x7D15, 0xE343, 0x7D0A, + 0xE344, 0x7D45, 0xE345, 0x7D4B, 0xE346, 0x7D2E, 0xE347, 0x7D32, + 0xE348, 0x7D3F, 0xE349, 0x7D35, 0xE34A, 0x7D46, 0xE34B, 0x7D73, + 0xE34C, 0x7D56, 0xE34D, 0x7D4E, 0xE34E, 0x7D72, 0xE34F, 0x7D68, + 0xE350, 0x7D6E, 0xE351, 0x7D4F, 0xE352, 0x7D63, 0xE353, 0x7D93, + 0xE354, 0x7D89, 0xE355, 0x7D5B, 0xE356, 0x7D8F, 0xE357, 0x7D7D, + 0xE358, 0x7D9B, 0xE359, 0x7DBA, 0xE35A, 0x7DAE, 0xE35B, 0x7DA3, + 0xE35C, 0x7DB5, 0xE35D, 0x7DC7, 0xE35E, 0x7DBD, 0xE35F, 0x7DAB, + 0xE360, 0x7E3D, 0xE361, 0x7DA2, 0xE362, 0x7DAF, 0xE363, 0x7DDC, + 0xE364, 0x7DB8, 0xE365, 0x7D9F, 0xE366, 0x7DB0, 0xE367, 0x7DD8, + 0xE368, 0x7DDD, 0xE369, 0x7DE4, 0xE36A, 0x7DDE, 0xE36B, 0x7DFB, + 0xE36C, 0x7DF2, 0xE36D, 0x7DE1, 0xE36E, 0x7E05, 0xE36F, 0x7E0A, + 0xE370, 0x7E23, 0xE371, 0x7E21, 0xE372, 0x7E12, 0xE373, 0x7E31, + 0xE374, 0x7E1F, 0xE375, 0x7E09, 0xE376, 0x7E0B, 0xE377, 0x7E22, + 0xE378, 0x7E46, 0xE379, 0x7E66, 0xE37A, 0x7E3B, 0xE37B, 0x7E35, + 0xE37C, 0x7E39, 0xE37D, 0x7E43, 0xE37E, 0x7E37, 0xE380, 0x7E32, + 0xE381, 0x7E3A, 0xE382, 0x7E67, 0xE383, 0x7E5D, 0xE384, 0x7E56, + 0xE385, 0x7E5E, 0xE386, 0x7E59, 0xE387, 0x7E5A, 0xE388, 0x7E79, + 0xE389, 0x7E6A, 0xE38A, 0x7E69, 0xE38B, 0x7E7C, 0xE38C, 0x7E7B, + 0xE38D, 0x7E83, 0xE38E, 0x7DD5, 0xE38F, 0x7E7D, 0xE390, 0x8FAE, + 0xE391, 0x7E7F, 0xE392, 0x7E88, 0xE393, 0x7E89, 0xE394, 0x7E8C, + 0xE395, 0x7E92, 0xE396, 0x7E90, 0xE397, 0x7E93, 0xE398, 0x7E94, + 0xE399, 0x7E96, 0xE39A, 0x7E8E, 0xE39B, 0x7E9B, 0xE39C, 0x7E9C, + 0xE39D, 0x7F38, 0xE39E, 0x7F3A, 0xE39F, 0x7F45, 0xE3A0, 0x7F4C, + 0xE3A1, 0x7F4D, 0xE3A2, 0x7F4E, 0xE3A3, 0x7F50, 0xE3A4, 0x7F51, + 0xE3A5, 0x7F55, 0xE3A6, 0x7F54, 0xE3A7, 0x7F58, 0xE3A8, 0x7F5F, + 0xE3A9, 0x7F60, 0xE3AA, 0x7F68, 0xE3AB, 0x7F69, 0xE3AC, 0x7F67, + 0xE3AD, 0x7F78, 0xE3AE, 0x7F82, 0xE3AF, 0x7F86, 0xE3B0, 0x7F83, + 0xE3B1, 0x7F88, 0xE3B2, 0x7F87, 0xE3B3, 0x7F8C, 0xE3B4, 0x7F94, + 0xE3B5, 0x7F9E, 0xE3B6, 0x7F9D, 0xE3B7, 0x7F9A, 0xE3B8, 0x7FA3, + 0xE3B9, 0x7FAF, 0xE3BA, 0x7FB2, 0xE3BB, 0x7FB9, 0xE3BC, 0x7FAE, + 0xE3BD, 0x7FB6, 0xE3BE, 0x7FB8, 0xE3BF, 0x8B71, 0xE3C0, 0x7FC5, + 0xE3C1, 0x7FC6, 0xE3C2, 0x7FCA, 0xE3C3, 0x7FD5, 0xE3C4, 0x7FD4, + 0xE3C5, 0x7FE1, 0xE3C6, 0x7FE6, 0xE3C7, 0x7FE9, 0xE3C8, 0x7FF3, + 0xE3C9, 0x7FF9, 0xE3CA, 0x98DC, 0xE3CB, 0x8006, 0xE3CC, 0x8004, + 0xE3CD, 0x800B, 0xE3CE, 0x8012, 0xE3CF, 0x8018, 0xE3D0, 0x8019, + 0xE3D1, 0x801C, 0xE3D2, 0x8021, 0xE3D3, 0x8028, 0xE3D4, 0x803F, + 0xE3D5, 0x803B, 0xE3D6, 0x804A, 0xE3D7, 0x8046, 0xE3D8, 0x8052, + 0xE3D9, 0x8058, 0xE3DA, 0x805A, 0xE3DB, 0x805F, 0xE3DC, 0x8062, + 0xE3DD, 0x8068, 0xE3DE, 0x8073, 0xE3DF, 0x8072, 0xE3E0, 0x8070, + 0xE3E1, 0x8076, 0xE3E2, 0x8079, 0xE3E3, 0x807D, 0xE3E4, 0x807F, + 0xE3E5, 0x8084, 0xE3E6, 0x8086, 0xE3E7, 0x8085, 0xE3E8, 0x809B, + 0xE3E9, 0x8093, 0xE3EA, 0x809A, 0xE3EB, 0x80AD, 0xE3EC, 0x5190, + 0xE3ED, 0x80AC, 0xE3EE, 0x80DB, 0xE3EF, 0x80E5, 0xE3F0, 0x80D9, + 0xE3F1, 0x80DD, 0xE3F2, 0x80C4, 0xE3F3, 0x80DA, 0xE3F4, 0x80D6, + 0xE3F5, 0x8109, 0xE3F6, 0x80EF, 0xE3F7, 0x80F1, 0xE3F8, 0x811B, + 0xE3F9, 0x8129, 0xE3FA, 0x8123, 0xE3FB, 0x812F, 0xE3FC, 0x814B, + 0xE440, 0x968B, 0xE441, 0x8146, 0xE442, 0x813E, 0xE443, 0x8153, + 0xE444, 0x8151, 0xE445, 0x80FC, 0xE446, 0x8171, 0xE447, 0x816E, + 0xE448, 0x8165, 0xE449, 0x8166, 0xE44A, 0x8174, 0xE44B, 0x8183, + 0xE44C, 0x8188, 0xE44D, 0x818A, 0xE44E, 0x8180, 0xE44F, 0x8182, + 0xE450, 0x81A0, 0xE451, 0x8195, 0xE452, 0x81A4, 0xE453, 0x81A3, + 0xE454, 0x815F, 0xE455, 0x8193, 0xE456, 0x81A9, 0xE457, 0x81B0, + 0xE458, 0x81B5, 0xE459, 0x81BE, 0xE45A, 0x81B8, 0xE45B, 0x81BD, + 0xE45C, 0x81C0, 0xE45D, 0x81C2, 0xE45E, 0x81BA, 0xE45F, 0x81C9, + 0xE460, 0x81CD, 0xE461, 0x81D1, 0xE462, 0x81D9, 0xE463, 0x81D8, + 0xE464, 0x81C8, 0xE465, 0x81DA, 0xE466, 0x81DF, 0xE467, 0x81E0, + 0xE468, 0x81E7, 0xE469, 0x81FA, 0xE46A, 0x81FB, 0xE46B, 0x81FE, + 0xE46C, 0x8201, 0xE46D, 0x8202, 0xE46E, 0x8205, 0xE46F, 0x8207, + 0xE470, 0x820A, 0xE471, 0x820D, 0xE472, 0x8210, 0xE473, 0x8216, + 0xE474, 0x8229, 0xE475, 0x822B, 0xE476, 0x8238, 0xE477, 0x8233, + 0xE478, 0x8240, 0xE479, 0x8259, 0xE47A, 0x8258, 0xE47B, 0x825D, + 0xE47C, 0x825A, 0xE47D, 0x825F, 0xE47E, 0x8264, 0xE480, 0x8262, + 0xE481, 0x8268, 0xE482, 0x826A, 0xE483, 0x826B, 0xE484, 0x822E, + 0xE485, 0x8271, 0xE486, 0x8277, 0xE487, 0x8278, 0xE488, 0x827E, + 0xE489, 0x828D, 0xE48A, 0x8292, 0xE48B, 0x82AB, 0xE48C, 0x829F, + 0xE48D, 0x82BB, 0xE48E, 0x82AC, 0xE48F, 0x82E1, 0xE490, 0x82E3, + 0xE491, 0x82DF, 0xE492, 0x82D2, 0xE493, 0x82F4, 0xE494, 0x82F3, + 0xE495, 0x82FA, 0xE496, 0x8393, 0xE497, 0x8303, 0xE498, 0x82FB, + 0xE499, 0x82F9, 0xE49A, 0x82DE, 0xE49B, 0x8306, 0xE49C, 0x82DC, + 0xE49D, 0x8309, 0xE49E, 0x82D9, 0xE49F, 0x8335, 0xE4A0, 0x8334, + 0xE4A1, 0x8316, 0xE4A2, 0x8332, 0xE4A3, 0x8331, 0xE4A4, 0x8340, + 0xE4A5, 0x8339, 0xE4A6, 0x8350, 0xE4A7, 0x8345, 0xE4A8, 0x832F, + 0xE4A9, 0x832B, 0xE4AA, 0x8317, 0xE4AB, 0x8318, 0xE4AC, 0x8385, + 0xE4AD, 0x839A, 0xE4AE, 0x83AA, 0xE4AF, 0x839F, 0xE4B0, 0x83A2, + 0xE4B1, 0x8396, 0xE4B2, 0x8323, 0xE4B3, 0x838E, 0xE4B4, 0x8387, + 0xE4B5, 0x838A, 0xE4B6, 0x837C, 0xE4B7, 0x83B5, 0xE4B8, 0x8373, + 0xE4B9, 0x8375, 0xE4BA, 0x83A0, 0xE4BB, 0x8389, 0xE4BC, 0x83A8, + 0xE4BD, 0x83F4, 0xE4BE, 0x8413, 0xE4BF, 0x83EB, 0xE4C0, 0x83CE, + 0xE4C1, 0x83FD, 0xE4C2, 0x8403, 0xE4C3, 0x83D8, 0xE4C4, 0x840B, + 0xE4C5, 0x83C1, 0xE4C6, 0x83F7, 0xE4C7, 0x8407, 0xE4C8, 0x83E0, + 0xE4C9, 0x83F2, 0xE4CA, 0x840D, 0xE4CB, 0x8422, 0xE4CC, 0x8420, + 0xE4CD, 0x83BD, 0xE4CE, 0x8438, 0xE4CF, 0x8506, 0xE4D0, 0x83FB, + 0xE4D1, 0x846D, 0xE4D2, 0x842A, 0xE4D3, 0x843C, 0xE4D4, 0x855A, + 0xE4D5, 0x8484, 0xE4D6, 0x8477, 0xE4D7, 0x846B, 0xE4D8, 0x84AD, + 0xE4D9, 0x846E, 0xE4DA, 0x8482, 0xE4DB, 0x8469, 0xE4DC, 0x8446, + 0xE4DD, 0x842C, 0xE4DE, 0x846F, 0xE4DF, 0x8479, 0xE4E0, 0x8435, + 0xE4E1, 0x84CA, 0xE4E2, 0x8462, 0xE4E3, 0x84B9, 0xE4E4, 0x84BF, + 0xE4E5, 0x849F, 0xE4E6, 0x84D9, 0xE4E7, 0x84CD, 0xE4E8, 0x84BB, + 0xE4E9, 0x84DA, 0xE4EA, 0x84D0, 0xE4EB, 0x84C1, 0xE4EC, 0x84C6, + 0xE4ED, 0x84D6, 0xE4EE, 0x84A1, 0xE4EF, 0x8521, 0xE4F0, 0x84FF, + 0xE4F1, 0x84F4, 0xE4F2, 0x8517, 0xE4F3, 0x8518, 0xE4F4, 0x852C, + 0xE4F5, 0x851F, 0xE4F6, 0x8515, 0xE4F7, 0x8514, 0xE4F8, 0x84FC, + 0xE4F9, 0x8540, 0xE4FA, 0x8563, 0xE4FB, 0x8558, 0xE4FC, 0x8548, + 0xE540, 0x8541, 0xE541, 0x8602, 0xE542, 0x854B, 0xE543, 0x8555, + 0xE544, 0x8580, 0xE545, 0x85A4, 0xE546, 0x8588, 0xE547, 0x8591, + 0xE548, 0x858A, 0xE549, 0x85A8, 0xE54A, 0x856D, 0xE54B, 0x8594, + 0xE54C, 0x859B, 0xE54D, 0x85EA, 0xE54E, 0x8587, 0xE54F, 0x859C, + 0xE550, 0x8577, 0xE551, 0x857E, 0xE552, 0x8590, 0xE553, 0x85C9, + 0xE554, 0x85BA, 0xE555, 0x85CF, 0xE556, 0x85B9, 0xE557, 0x85D0, + 0xE558, 0x85D5, 0xE559, 0x85DD, 0xE55A, 0x85E5, 0xE55B, 0x85DC, + 0xE55C, 0x85F9, 0xE55D, 0x860A, 0xE55E, 0x8613, 0xE55F, 0x860B, + 0xE560, 0x85FE, 0xE561, 0x85FA, 0xE562, 0x8606, 0xE563, 0x8622, + 0xE564, 0x861A, 0xE565, 0x8630, 0xE566, 0x863F, 0xE567, 0x864D, + 0xE568, 0x4E55, 0xE569, 0x8654, 0xE56A, 0x865F, 0xE56B, 0x8667, + 0xE56C, 0x8671, 0xE56D, 0x8693, 0xE56E, 0x86A3, 0xE56F, 0x86A9, + 0xE570, 0x86AA, 0xE571, 0x868B, 0xE572, 0x868C, 0xE573, 0x86B6, + 0xE574, 0x86AF, 0xE575, 0x86C4, 0xE576, 0x86C6, 0xE577, 0x86B0, + 0xE578, 0x86C9, 0xE579, 0x8823, 0xE57A, 0x86AB, 0xE57B, 0x86D4, + 0xE57C, 0x86DE, 0xE57D, 0x86E9, 0xE57E, 0x86EC, 0xE580, 0x86DF, + 0xE581, 0x86DB, 0xE582, 0x86EF, 0xE583, 0x8712, 0xE584, 0x8706, + 0xE585, 0x8708, 0xE586, 0x8700, 0xE587, 0x8703, 0xE588, 0x86FB, + 0xE589, 0x8711, 0xE58A, 0x8709, 0xE58B, 0x870D, 0xE58C, 0x86F9, + 0xE58D, 0x870A, 0xE58E, 0x8734, 0xE58F, 0x873F, 0xE590, 0x8737, + 0xE591, 0x873B, 0xE592, 0x8725, 0xE593, 0x8729, 0xE594, 0x871A, + 0xE595, 0x8760, 0xE596, 0x875F, 0xE597, 0x8778, 0xE598, 0x874C, + 0xE599, 0x874E, 0xE59A, 0x8774, 0xE59B, 0x8757, 0xE59C, 0x8768, + 0xE59D, 0x876E, 0xE59E, 0x8759, 0xE59F, 0x8753, 0xE5A0, 0x8763, + 0xE5A1, 0x876A, 0xE5A2, 0x8805, 0xE5A3, 0x87A2, 0xE5A4, 0x879F, + 0xE5A5, 0x8782, 0xE5A6, 0x87AF, 0xE5A7, 0x87CB, 0xE5A8, 0x87BD, + 0xE5A9, 0x87C0, 0xE5AA, 0x87D0, 0xE5AB, 0x96D6, 0xE5AC, 0x87AB, + 0xE5AD, 0x87C4, 0xE5AE, 0x87B3, 0xE5AF, 0x87C7, 0xE5B0, 0x87C6, + 0xE5B1, 0x87BB, 0xE5B2, 0x87EF, 0xE5B3, 0x87F2, 0xE5B4, 0x87E0, + 0xE5B5, 0x880F, 0xE5B6, 0x880D, 0xE5B7, 0x87FE, 0xE5B8, 0x87F6, + 0xE5B9, 0x87F7, 0xE5BA, 0x880E, 0xE5BB, 0x87D2, 0xE5BC, 0x8811, + 0xE5BD, 0x8816, 0xE5BE, 0x8815, 0xE5BF, 0x8822, 0xE5C0, 0x8821, + 0xE5C1, 0x8831, 0xE5C2, 0x8836, 0xE5C3, 0x8839, 0xE5C4, 0x8827, + 0xE5C5, 0x883B, 0xE5C6, 0x8844, 0xE5C7, 0x8842, 0xE5C8, 0x8852, + 0xE5C9, 0x8859, 0xE5CA, 0x885E, 0xE5CB, 0x8862, 0xE5CC, 0x886B, + 0xE5CD, 0x8881, 0xE5CE, 0x887E, 0xE5CF, 0x889E, 0xE5D0, 0x8875, + 0xE5D1, 0x887D, 0xE5D2, 0x88B5, 0xE5D3, 0x8872, 0xE5D4, 0x8882, + 0xE5D5, 0x8897, 0xE5D6, 0x8892, 0xE5D7, 0x88AE, 0xE5D8, 0x8899, + 0xE5D9, 0x88A2, 0xE5DA, 0x888D, 0xE5DB, 0x88A4, 0xE5DC, 0x88B0, + 0xE5DD, 0x88BF, 0xE5DE, 0x88B1, 0xE5DF, 0x88C3, 0xE5E0, 0x88C4, + 0xE5E1, 0x88D4, 0xE5E2, 0x88D8, 0xE5E3, 0x88D9, 0xE5E4, 0x88DD, + 0xE5E5, 0x88F9, 0xE5E6, 0x8902, 0xE5E7, 0x88FC, 0xE5E8, 0x88F4, + 0xE5E9, 0x88E8, 0xE5EA, 0x88F2, 0xE5EB, 0x8904, 0xE5EC, 0x890C, + 0xE5ED, 0x890A, 0xE5EE, 0x8913, 0xE5EF, 0x8943, 0xE5F0, 0x891E, + 0xE5F1, 0x8925, 0xE5F2, 0x892A, 0xE5F3, 0x892B, 0xE5F4, 0x8941, + 0xE5F5, 0x8944, 0xE5F6, 0x893B, 0xE5F7, 0x8936, 0xE5F8, 0x8938, + 0xE5F9, 0x894C, 0xE5FA, 0x891D, 0xE5FB, 0x8960, 0xE5FC, 0x895E, + 0xE640, 0x8966, 0xE641, 0x8964, 0xE642, 0x896D, 0xE643, 0x896A, + 0xE644, 0x896F, 0xE645, 0x8974, 0xE646, 0x8977, 0xE647, 0x897E, + 0xE648, 0x8983, 0xE649, 0x8988, 0xE64A, 0x898A, 0xE64B, 0x8993, + 0xE64C, 0x8998, 0xE64D, 0x89A1, 0xE64E, 0x89A9, 0xE64F, 0x89A6, + 0xE650, 0x89AC, 0xE651, 0x89AF, 0xE652, 0x89B2, 0xE653, 0x89BA, + 0xE654, 0x89BD, 0xE655, 0x89BF, 0xE656, 0x89C0, 0xE657, 0x89DA, + 0xE658, 0x89DC, 0xE659, 0x89DD, 0xE65A, 0x89E7, 0xE65B, 0x89F4, + 0xE65C, 0x89F8, 0xE65D, 0x8A03, 0xE65E, 0x8A16, 0xE65F, 0x8A10, + 0xE660, 0x8A0C, 0xE661, 0x8A1B, 0xE662, 0x8A1D, 0xE663, 0x8A25, + 0xE664, 0x8A36, 0xE665, 0x8A41, 0xE666, 0x8A5B, 0xE667, 0x8A52, + 0xE668, 0x8A46, 0xE669, 0x8A48, 0xE66A, 0x8A7C, 0xE66B, 0x8A6D, + 0xE66C, 0x8A6C, 0xE66D, 0x8A62, 0xE66E, 0x8A85, 0xE66F, 0x8A82, + 0xE670, 0x8A84, 0xE671, 0x8AA8, 0xE672, 0x8AA1, 0xE673, 0x8A91, + 0xE674, 0x8AA5, 0xE675, 0x8AA6, 0xE676, 0x8A9A, 0xE677, 0x8AA3, + 0xE678, 0x8AC4, 0xE679, 0x8ACD, 0xE67A, 0x8AC2, 0xE67B, 0x8ADA, + 0xE67C, 0x8AEB, 0xE67D, 0x8AF3, 0xE67E, 0x8AE7, 0xE680, 0x8AE4, + 0xE681, 0x8AF1, 0xE682, 0x8B14, 0xE683, 0x8AE0, 0xE684, 0x8AE2, + 0xE685, 0x8AF7, 0xE686, 0x8ADE, 0xE687, 0x8ADB, 0xE688, 0x8B0C, + 0xE689, 0x8B07, 0xE68A, 0x8B1A, 0xE68B, 0x8AE1, 0xE68C, 0x8B16, + 0xE68D, 0x8B10, 0xE68E, 0x8B17, 0xE68F, 0x8B20, 0xE690, 0x8B33, + 0xE691, 0x97AB, 0xE692, 0x8B26, 0xE693, 0x8B2B, 0xE694, 0x8B3E, + 0xE695, 0x8B28, 0xE696, 0x8B41, 0xE697, 0x8B4C, 0xE698, 0x8B4F, + 0xE699, 0x8B4E, 0xE69A, 0x8B49, 0xE69B, 0x8B56, 0xE69C, 0x8B5B, + 0xE69D, 0x8B5A, 0xE69E, 0x8B6B, 0xE69F, 0x8B5F, 0xE6A0, 0x8B6C, + 0xE6A1, 0x8B6F, 0xE6A2, 0x8B74, 0xE6A3, 0x8B7D, 0xE6A4, 0x8B80, + 0xE6A5, 0x8B8C, 0xE6A6, 0x8B8E, 0xE6A7, 0x8B92, 0xE6A8, 0x8B93, + 0xE6A9, 0x8B96, 0xE6AA, 0x8B99, 0xE6AB, 0x8B9A, 0xE6AC, 0x8C3A, + 0xE6AD, 0x8C41, 0xE6AE, 0x8C3F, 0xE6AF, 0x8C48, 0xE6B0, 0x8C4C, + 0xE6B1, 0x8C4E, 0xE6B2, 0x8C50, 0xE6B3, 0x8C55, 0xE6B4, 0x8C62, + 0xE6B5, 0x8C6C, 0xE6B6, 0x8C78, 0xE6B7, 0x8C7A, 0xE6B8, 0x8C82, + 0xE6B9, 0x8C89, 0xE6BA, 0x8C85, 0xE6BB, 0x8C8A, 0xE6BC, 0x8C8D, + 0xE6BD, 0x8C8E, 0xE6BE, 0x8C94, 0xE6BF, 0x8C7C, 0xE6C0, 0x8C98, + 0xE6C1, 0x621D, 0xE6C2, 0x8CAD, 0xE6C3, 0x8CAA, 0xE6C4, 0x8CBD, + 0xE6C5, 0x8CB2, 0xE6C6, 0x8CB3, 0xE6C7, 0x8CAE, 0xE6C8, 0x8CB6, + 0xE6C9, 0x8CC8, 0xE6CA, 0x8CC1, 0xE6CB, 0x8CE4, 0xE6CC, 0x8CE3, + 0xE6CD, 0x8CDA, 0xE6CE, 0x8CFD, 0xE6CF, 0x8CFA, 0xE6D0, 0x8CFB, + 0xE6D1, 0x8D04, 0xE6D2, 0x8D05, 0xE6D3, 0x8D0A, 0xE6D4, 0x8D07, + 0xE6D5, 0x8D0F, 0xE6D6, 0x8D0D, 0xE6D7, 0x8D10, 0xE6D8, 0x9F4E, + 0xE6D9, 0x8D13, 0xE6DA, 0x8CCD, 0xE6DB, 0x8D14, 0xE6DC, 0x8D16, + 0xE6DD, 0x8D67, 0xE6DE, 0x8D6D, 0xE6DF, 0x8D71, 0xE6E0, 0x8D73, + 0xE6E1, 0x8D81, 0xE6E2, 0x8D99, 0xE6E3, 0x8DC2, 0xE6E4, 0x8DBE, + 0xE6E5, 0x8DBA, 0xE6E6, 0x8DCF, 0xE6E7, 0x8DDA, 0xE6E8, 0x8DD6, + 0xE6E9, 0x8DCC, 0xE6EA, 0x8DDB, 0xE6EB, 0x8DCB, 0xE6EC, 0x8DEA, + 0xE6ED, 0x8DEB, 0xE6EE, 0x8DDF, 0xE6EF, 0x8DE3, 0xE6F0, 0x8DFC, + 0xE6F1, 0x8E08, 0xE6F2, 0x8E09, 0xE6F3, 0x8DFF, 0xE6F4, 0x8E1D, + 0xE6F5, 0x8E1E, 0xE6F6, 0x8E10, 0xE6F7, 0x8E1F, 0xE6F8, 0x8E42, + 0xE6F9, 0x8E35, 0xE6FA, 0x8E30, 0xE6FB, 0x8E34, 0xE6FC, 0x8E4A, + 0xE740, 0x8E47, 0xE741, 0x8E49, 0xE742, 0x8E4C, 0xE743, 0x8E50, + 0xE744, 0x8E48, 0xE745, 0x8E59, 0xE746, 0x8E64, 0xE747, 0x8E60, + 0xE748, 0x8E2A, 0xE749, 0x8E63, 0xE74A, 0x8E55, 0xE74B, 0x8E76, + 0xE74C, 0x8E72, 0xE74D, 0x8E7C, 0xE74E, 0x8E81, 0xE74F, 0x8E87, + 0xE750, 0x8E85, 0xE751, 0x8E84, 0xE752, 0x8E8B, 0xE753, 0x8E8A, + 0xE754, 0x8E93, 0xE755, 0x8E91, 0xE756, 0x8E94, 0xE757, 0x8E99, + 0xE758, 0x8EAA, 0xE759, 0x8EA1, 0xE75A, 0x8EAC, 0xE75B, 0x8EB0, + 0xE75C, 0x8EC6, 0xE75D, 0x8EB1, 0xE75E, 0x8EBE, 0xE75F, 0x8EC5, + 0xE760, 0x8EC8, 0xE761, 0x8ECB, 0xE762, 0x8EDB, 0xE763, 0x8EE3, + 0xE764, 0x8EFC, 0xE765, 0x8EFB, 0xE766, 0x8EEB, 0xE767, 0x8EFE, + 0xE768, 0x8F0A, 0xE769, 0x8F05, 0xE76A, 0x8F15, 0xE76B, 0x8F12, + 0xE76C, 0x8F19, 0xE76D, 0x8F13, 0xE76E, 0x8F1C, 0xE76F, 0x8F1F, + 0xE770, 0x8F1B, 0xE771, 0x8F0C, 0xE772, 0x8F26, 0xE773, 0x8F33, + 0xE774, 0x8F3B, 0xE775, 0x8F39, 0xE776, 0x8F45, 0xE777, 0x8F42, + 0xE778, 0x8F3E, 0xE779, 0x8F4C, 0xE77A, 0x8F49, 0xE77B, 0x8F46, + 0xE77C, 0x8F4E, 0xE77D, 0x8F57, 0xE77E, 0x8F5C, 0xE780, 0x8F62, + 0xE781, 0x8F63, 0xE782, 0x8F64, 0xE783, 0x8F9C, 0xE784, 0x8F9F, + 0xE785, 0x8FA3, 0xE786, 0x8FAD, 0xE787, 0x8FAF, 0xE788, 0x8FB7, + 0xE789, 0x8FDA, 0xE78A, 0x8FE5, 0xE78B, 0x8FE2, 0xE78C, 0x8FEA, + 0xE78D, 0x8FEF, 0xE78E, 0x9087, 0xE78F, 0x8FF4, 0xE790, 0x9005, + 0xE791, 0x8FF9, 0xE792, 0x8FFA, 0xE793, 0x9011, 0xE794, 0x9015, + 0xE795, 0x9021, 0xE796, 0x900D, 0xE797, 0x901E, 0xE798, 0x9016, + 0xE799, 0x900B, 0xE79A, 0x9027, 0xE79B, 0x9036, 0xE79C, 0x9035, + 0xE79D, 0x9039, 0xE79E, 0x8FF8, 0xE79F, 0x904F, 0xE7A0, 0x9050, + 0xE7A1, 0x9051, 0xE7A2, 0x9052, 0xE7A3, 0x900E, 0xE7A4, 0x9049, + 0xE7A5, 0x903E, 0xE7A6, 0x9056, 0xE7A7, 0x9058, 0xE7A8, 0x905E, + 0xE7A9, 0x9068, 0xE7AA, 0x906F, 0xE7AB, 0x9076, 0xE7AC, 0x96A8, + 0xE7AD, 0x9072, 0xE7AE, 0x9082, 0xE7AF, 0x907D, 0xE7B0, 0x9081, + 0xE7B1, 0x9080, 0xE7B2, 0x908A, 0xE7B3, 0x9089, 0xE7B4, 0x908F, + 0xE7B5, 0x90A8, 0xE7B6, 0x90AF, 0xE7B7, 0x90B1, 0xE7B8, 0x90B5, + 0xE7B9, 0x90E2, 0xE7BA, 0x90E4, 0xE7BB, 0x6248, 0xE7BC, 0x90DB, + 0xE7BD, 0x9102, 0xE7BE, 0x9112, 0xE7BF, 0x9119, 0xE7C0, 0x9132, + 0xE7C1, 0x9130, 0xE7C2, 0x914A, 0xE7C3, 0x9156, 0xE7C4, 0x9158, + 0xE7C5, 0x9163, 0xE7C6, 0x9165, 0xE7C7, 0x9169, 0xE7C8, 0x9173, + 0xE7C9, 0x9172, 0xE7CA, 0x918B, 0xE7CB, 0x9189, 0xE7CC, 0x9182, + 0xE7CD, 0x91A2, 0xE7CE, 0x91AB, 0xE7CF, 0x91AF, 0xE7D0, 0x91AA, + 0xE7D1, 0x91B5, 0xE7D2, 0x91B4, 0xE7D3, 0x91BA, 0xE7D4, 0x91C0, + 0xE7D5, 0x91C1, 0xE7D6, 0x91C9, 0xE7D7, 0x91CB, 0xE7D8, 0x91D0, + 0xE7D9, 0x91D6, 0xE7DA, 0x91DF, 0xE7DB, 0x91E1, 0xE7DC, 0x91DB, + 0xE7DD, 0x91FC, 0xE7DE, 0x91F5, 0xE7DF, 0x91F6, 0xE7E0, 0x921E, + 0xE7E1, 0x91FF, 0xE7E2, 0x9214, 0xE7E3, 0x922C, 0xE7E4, 0x9215, + 0xE7E5, 0x9211, 0xE7E6, 0x925E, 0xE7E7, 0x9257, 0xE7E8, 0x9245, + 0xE7E9, 0x9249, 0xE7EA, 0x9264, 0xE7EB, 0x9248, 0xE7EC, 0x9295, + 0xE7ED, 0x923F, 0xE7EE, 0x924B, 0xE7EF, 0x9250, 0xE7F0, 0x929C, + 0xE7F1, 0x9296, 0xE7F2, 0x9293, 0xE7F3, 0x929B, 0xE7F4, 0x925A, + 0xE7F5, 0x92CF, 0xE7F6, 0x92B9, 0xE7F7, 0x92B7, 0xE7F8, 0x92E9, + 0xE7F9, 0x930F, 0xE7FA, 0x92FA, 0xE7FB, 0x9344, 0xE7FC, 0x932E, + 0xE840, 0x9319, 0xE841, 0x9322, 0xE842, 0x931A, 0xE843, 0x9323, + 0xE844, 0x933A, 0xE845, 0x9335, 0xE846, 0x933B, 0xE847, 0x935C, + 0xE848, 0x9360, 0xE849, 0x937C, 0xE84A, 0x936E, 0xE84B, 0x9356, + 0xE84C, 0x93B0, 0xE84D, 0x93AC, 0xE84E, 0x93AD, 0xE84F, 0x9394, + 0xE850, 0x93B9, 0xE851, 0x93D6, 0xE852, 0x93D7, 0xE853, 0x93E8, + 0xE854, 0x93E5, 0xE855, 0x93D8, 0xE856, 0x93C3, 0xE857, 0x93DD, + 0xE858, 0x93D0, 0xE859, 0x93C8, 0xE85A, 0x93E4, 0xE85B, 0x941A, + 0xE85C, 0x9414, 0xE85D, 0x9413, 0xE85E, 0x9403, 0xE85F, 0x9407, + 0xE860, 0x9410, 0xE861, 0x9436, 0xE862, 0x942B, 0xE863, 0x9435, + 0xE864, 0x9421, 0xE865, 0x943A, 0xE866, 0x9441, 0xE867, 0x9452, + 0xE868, 0x9444, 0xE869, 0x945B, 0xE86A, 0x9460, 0xE86B, 0x9462, + 0xE86C, 0x945E, 0xE86D, 0x946A, 0xE86E, 0x9229, 0xE86F, 0x9470, + 0xE870, 0x9475, 0xE871, 0x9477, 0xE872, 0x947D, 0xE873, 0x945A, + 0xE874, 0x947C, 0xE875, 0x947E, 0xE876, 0x9481, 0xE877, 0x947F, + 0xE878, 0x9582, 0xE879, 0x9587, 0xE87A, 0x958A, 0xE87B, 0x9594, + 0xE87C, 0x9596, 0xE87D, 0x9598, 0xE87E, 0x9599, 0xE880, 0x95A0, + 0xE881, 0x95A8, 0xE882, 0x95A7, 0xE883, 0x95AD, 0xE884, 0x95BC, + 0xE885, 0x95BB, 0xE886, 0x95B9, 0xE887, 0x95BE, 0xE888, 0x95CA, + 0xE889, 0x6FF6, 0xE88A, 0x95C3, 0xE88B, 0x95CD, 0xE88C, 0x95CC, + 0xE88D, 0x95D5, 0xE88E, 0x95D4, 0xE88F, 0x95D6, 0xE890, 0x95DC, + 0xE891, 0x95E1, 0xE892, 0x95E5, 0xE893, 0x95E2, 0xE894, 0x9621, + 0xE895, 0x9628, 0xE896, 0x962E, 0xE897, 0x962F, 0xE898, 0x9642, + 0xE899, 0x964C, 0xE89A, 0x964F, 0xE89B, 0x964B, 0xE89C, 0x9677, + 0xE89D, 0x965C, 0xE89E, 0x965E, 0xE89F, 0x965D, 0xE8A0, 0x965F, + 0xE8A1, 0x9666, 0xE8A2, 0x9672, 0xE8A3, 0x966C, 0xE8A4, 0x968D, + 0xE8A5, 0x9698, 0xE8A6, 0x9695, 0xE8A7, 0x9697, 0xE8A8, 0x96AA, + 0xE8A9, 0x96A7, 0xE8AA, 0x96B1, 0xE8AB, 0x96B2, 0xE8AC, 0x96B0, + 0xE8AD, 0x96B4, 0xE8AE, 0x96B6, 0xE8AF, 0x96B8, 0xE8B0, 0x96B9, + 0xE8B1, 0x96CE, 0xE8B2, 0x96CB, 0xE8B3, 0x96C9, 0xE8B4, 0x96CD, + 0xE8B5, 0x894D, 0xE8B6, 0x96DC, 0xE8B7, 0x970D, 0xE8B8, 0x96D5, + 0xE8B9, 0x96F9, 0xE8BA, 0x9704, 0xE8BB, 0x9706, 0xE8BC, 0x9708, + 0xE8BD, 0x9713, 0xE8BE, 0x970E, 0xE8BF, 0x9711, 0xE8C0, 0x970F, + 0xE8C1, 0x9716, 0xE8C2, 0x9719, 0xE8C3, 0x9724, 0xE8C4, 0x972A, + 0xE8C5, 0x9730, 0xE8C6, 0x9739, 0xE8C7, 0x973D, 0xE8C8, 0x973E, + 0xE8C9, 0x9744, 0xE8CA, 0x9746, 0xE8CB, 0x9748, 0xE8CC, 0x9742, + 0xE8CD, 0x9749, 0xE8CE, 0x975C, 0xE8CF, 0x9760, 0xE8D0, 0x9764, + 0xE8D1, 0x9766, 0xE8D2, 0x9768, 0xE8D3, 0x52D2, 0xE8D4, 0x976B, + 0xE8D5, 0x9771, 0xE8D6, 0x9779, 0xE8D7, 0x9785, 0xE8D8, 0x977C, + 0xE8D9, 0x9781, 0xE8DA, 0x977A, 0xE8DB, 0x9786, 0xE8DC, 0x978B, + 0xE8DD, 0x978F, 0xE8DE, 0x9790, 0xE8DF, 0x979C, 0xE8E0, 0x97A8, + 0xE8E1, 0x97A6, 0xE8E2, 0x97A3, 0xE8E3, 0x97B3, 0xE8E4, 0x97B4, + 0xE8E5, 0x97C3, 0xE8E6, 0x97C6, 0xE8E7, 0x97C8, 0xE8E8, 0x97CB, + 0xE8E9, 0x97DC, 0xE8EA, 0x97ED, 0xE8EB, 0x9F4F, 0xE8EC, 0x97F2, + 0xE8ED, 0x7ADF, 0xE8EE, 0x97F6, 0xE8EF, 0x97F5, 0xE8F0, 0x980F, + 0xE8F1, 0x980C, 0xE8F2, 0x9838, 0xE8F3, 0x9824, 0xE8F4, 0x9821, + 0xE8F5, 0x9837, 0xE8F6, 0x983D, 0xE8F7, 0x9846, 0xE8F8, 0x984F, + 0xE8F9, 0x984B, 0xE8FA, 0x986B, 0xE8FB, 0x986F, 0xE8FC, 0x9870, + 0xE940, 0x9871, 0xE941, 0x9874, 0xE942, 0x9873, 0xE943, 0x98AA, + 0xE944, 0x98AF, 0xE945, 0x98B1, 0xE946, 0x98B6, 0xE947, 0x98C4, + 0xE948, 0x98C3, 0xE949, 0x98C6, 0xE94A, 0x98E9, 0xE94B, 0x98EB, + 0xE94C, 0x9903, 0xE94D, 0x9909, 0xE94E, 0x9912, 0xE94F, 0x9914, + 0xE950, 0x9918, 0xE951, 0x9921, 0xE952, 0x991D, 0xE953, 0x991E, + 0xE954, 0x9924, 0xE955, 0x9920, 0xE956, 0x992C, 0xE957, 0x992E, + 0xE958, 0x993D, 0xE959, 0x993E, 0xE95A, 0x9942, 0xE95B, 0x9949, + 0xE95C, 0x9945, 0xE95D, 0x9950, 0xE95E, 0x994B, 0xE95F, 0x9951, + 0xE960, 0x9952, 0xE961, 0x994C, 0xE962, 0x9955, 0xE963, 0x9997, + 0xE964, 0x9998, 0xE965, 0x99A5, 0xE966, 0x99AD, 0xE967, 0x99AE, + 0xE968, 0x99BC, 0xE969, 0x99DF, 0xE96A, 0x99DB, 0xE96B, 0x99DD, + 0xE96C, 0x99D8, 0xE96D, 0x99D1, 0xE96E, 0x99ED, 0xE96F, 0x99EE, + 0xE970, 0x99F1, 0xE971, 0x99F2, 0xE972, 0x99FB, 0xE973, 0x99F8, + 0xE974, 0x9A01, 0xE975, 0x9A0F, 0xE976, 0x9A05, 0xE977, 0x99E2, + 0xE978, 0x9A19, 0xE979, 0x9A2B, 0xE97A, 0x9A37, 0xE97B, 0x9A45, + 0xE97C, 0x9A42, 0xE97D, 0x9A40, 0xE97E, 0x9A43, 0xE980, 0x9A3E, + 0xE981, 0x9A55, 0xE982, 0x9A4D, 0xE983, 0x9A5B, 0xE984, 0x9A57, + 0xE985, 0x9A5F, 0xE986, 0x9A62, 0xE987, 0x9A65, 0xE988, 0x9A64, + 0xE989, 0x9A69, 0xE98A, 0x9A6B, 0xE98B, 0x9A6A, 0xE98C, 0x9AAD, + 0xE98D, 0x9AB0, 0xE98E, 0x9ABC, 0xE98F, 0x9AC0, 0xE990, 0x9ACF, + 0xE991, 0x9AD1, 0xE992, 0x9AD3, 0xE993, 0x9AD4, 0xE994, 0x9ADE, + 0xE995, 0x9ADF, 0xE996, 0x9AE2, 0xE997, 0x9AE3, 0xE998, 0x9AE6, + 0xE999, 0x9AEF, 0xE99A, 0x9AEB, 0xE99B, 0x9AEE, 0xE99C, 0x9AF4, + 0xE99D, 0x9AF1, 0xE99E, 0x9AF7, 0xE99F, 0x9AFB, 0xE9A0, 0x9B06, + 0xE9A1, 0x9B18, 0xE9A2, 0x9B1A, 0xE9A3, 0x9B1F, 0xE9A4, 0x9B22, + 0xE9A5, 0x9B23, 0xE9A6, 0x9B25, 0xE9A7, 0x9B27, 0xE9A8, 0x9B28, + 0xE9A9, 0x9B29, 0xE9AA, 0x9B2A, 0xE9AB, 0x9B2E, 0xE9AC, 0x9B2F, + 0xE9AD, 0x9B32, 0xE9AE, 0x9B44, 0xE9AF, 0x9B43, 0xE9B0, 0x9B4F, + 0xE9B1, 0x9B4D, 0xE9B2, 0x9B4E, 0xE9B3, 0x9B51, 0xE9B4, 0x9B58, + 0xE9B5, 0x9B74, 0xE9B6, 0x9B93, 0xE9B7, 0x9B83, 0xE9B8, 0x9B91, + 0xE9B9, 0x9B96, 0xE9BA, 0x9B97, 0xE9BB, 0x9B9F, 0xE9BC, 0x9BA0, + 0xE9BD, 0x9BA8, 0xE9BE, 0x9BB4, 0xE9BF, 0x9BC0, 0xE9C0, 0x9BCA, + 0xE9C1, 0x9BB9, 0xE9C2, 0x9BC6, 0xE9C3, 0x9BCF, 0xE9C4, 0x9BD1, + 0xE9C5, 0x9BD2, 0xE9C6, 0x9BE3, 0xE9C7, 0x9BE2, 0xE9C8, 0x9BE4, + 0xE9C9, 0x9BD4, 0xE9CA, 0x9BE1, 0xE9CB, 0x9C3A, 0xE9CC, 0x9BF2, + 0xE9CD, 0x9BF1, 0xE9CE, 0x9BF0, 0xE9CF, 0x9C15, 0xE9D0, 0x9C14, + 0xE9D1, 0x9C09, 0xE9D2, 0x9C13, 0xE9D3, 0x9C0C, 0xE9D4, 0x9C06, + 0xE9D5, 0x9C08, 0xE9D6, 0x9C12, 0xE9D7, 0x9C0A, 0xE9D8, 0x9C04, + 0xE9D9, 0x9C2E, 0xE9DA, 0x9C1B, 0xE9DB, 0x9C25, 0xE9DC, 0x9C24, + 0xE9DD, 0x9C21, 0xE9DE, 0x9C30, 0xE9DF, 0x9C47, 0xE9E0, 0x9C32, + 0xE9E1, 0x9C46, 0xE9E2, 0x9C3E, 0xE9E3, 0x9C5A, 0xE9E4, 0x9C60, + 0xE9E5, 0x9C67, 0xE9E6, 0x9C76, 0xE9E7, 0x9C78, 0xE9E8, 0x9CE7, + 0xE9E9, 0x9CEC, 0xE9EA, 0x9CF0, 0xE9EB, 0x9D09, 0xE9EC, 0x9D08, + 0xE9ED, 0x9CEB, 0xE9EE, 0x9D03, 0xE9EF, 0x9D06, 0xE9F0, 0x9D2A, + 0xE9F1, 0x9D26, 0xE9F2, 0x9DAF, 0xE9F3, 0x9D23, 0xE9F4, 0x9D1F, + 0xE9F5, 0x9D44, 0xE9F6, 0x9D15, 0xE9F7, 0x9D12, 0xE9F8, 0x9D41, + 0xE9F9, 0x9D3F, 0xE9FA, 0x9D3E, 0xE9FB, 0x9D46, 0xE9FC, 0x9D48, + 0xEA40, 0x9D5D, 0xEA41, 0x9D5E, 0xEA42, 0x9D64, 0xEA43, 0x9D51, + 0xEA44, 0x9D50, 0xEA45, 0x9D59, 0xEA46, 0x9D72, 0xEA47, 0x9D89, + 0xEA48, 0x9D87, 0xEA49, 0x9DAB, 0xEA4A, 0x9D6F, 0xEA4B, 0x9D7A, + 0xEA4C, 0x9D9A, 0xEA4D, 0x9DA4, 0xEA4E, 0x9DA9, 0xEA4F, 0x9DB2, + 0xEA50, 0x9DC4, 0xEA51, 0x9DC1, 0xEA52, 0x9DBB, 0xEA53, 0x9DB8, + 0xEA54, 0x9DBA, 0xEA55, 0x9DC6, 0xEA56, 0x9DCF, 0xEA57, 0x9DC2, + 0xEA58, 0x9DD9, 0xEA59, 0x9DD3, 0xEA5A, 0x9DF8, 0xEA5B, 0x9DE6, + 0xEA5C, 0x9DED, 0xEA5D, 0x9DEF, 0xEA5E, 0x9DFD, 0xEA5F, 0x9E1A, + 0xEA60, 0x9E1B, 0xEA61, 0x9E1E, 0xEA62, 0x9E75, 0xEA63, 0x9E79, + 0xEA64, 0x9E7D, 0xEA65, 0x9E81, 0xEA66, 0x9E88, 0xEA67, 0x9E8B, + 0xEA68, 0x9E8C, 0xEA69, 0x9E92, 0xEA6A, 0x9E95, 0xEA6B, 0x9E91, + 0xEA6C, 0x9E9D, 0xEA6D, 0x9EA5, 0xEA6E, 0x9EA9, 0xEA6F, 0x9EB8, + 0xEA70, 0x9EAA, 0xEA71, 0x9EAD, 0xEA72, 0x9761, 0xEA73, 0x9ECC, + 0xEA74, 0x9ECE, 0xEA75, 0x9ECF, 0xEA76, 0x9ED0, 0xEA77, 0x9ED4, + 0xEA78, 0x9EDC, 0xEA79, 0x9EDE, 0xEA7A, 0x9EDD, 0xEA7B, 0x9EE0, + 0xEA7C, 0x9EE5, 0xEA7D, 0x9EE8, 0xEA7E, 0x9EEF, 0xEA80, 0x9EF4, + 0xEA81, 0x9EF6, 0xEA82, 0x9EF7, 0xEA83, 0x9EF9, 0xEA84, 0x9EFB, + 0xEA85, 0x9EFC, 0xEA86, 0x9EFD, 0xEA87, 0x9F07, 0xEA88, 0x9F08, + 0xEA89, 0x76B7, 0xEA8A, 0x9F15, 0xEA8B, 0x9F21, 0xEA8C, 0x9F2C, + 0xEA8D, 0x9F3E, 0xEA8E, 0x9F4A, 0xEA8F, 0x9F52, 0xEA90, 0x9F54, + 0xEA91, 0x9F63, 0xEA92, 0x9F5F, 0xEA93, 0x9F60, 0xEA94, 0x9F61, + 0xEA95, 0x9F66, 0xEA96, 0x9F67, 0xEA97, 0x9F6C, 0xEA98, 0x9F6A, + 0xEA99, 0x9F77, 0xEA9A, 0x9F72, 0xEA9B, 0x9F76, 0xEA9C, 0x9F95, + 0xEA9D, 0x9F9C, 0xEA9E, 0x9FA0, 0xEA9F, 0x582F, 0xEAA0, 0x69C7, + 0xEAA1, 0x9059, 0xEAA2, 0x7464, 0xEAA3, 0x51DC, 0xEAA4, 0x7199, + 0xFA40, 0x2170, 0xFA41, 0x2171, 0xFA42, 0x2172, 0xFA43, 0x2173, + 0xFA44, 0x2174, 0xFA45, 0x2175, 0xFA46, 0x2176, 0xFA47, 0x2177, + 0xFA48, 0x2178, 0xFA49, 0x2179, 0xFA55, 0xFFE4, 0xFA56, 0xFF07, + 0xFA57, 0xFF02, 0xFA5C, 0x7E8A, 0xFA5D, 0x891C, 0xFA5E, 0x9348, + 0xFA5F, 0x9288, 0xFA60, 0x84DC, 0xFA61, 0x4FC9, 0xFA62, 0x70BB, + 0xFA63, 0x6631, 0xFA64, 0x68C8, 0xFA65, 0x92F9, 0xFA66, 0x66FB, + 0xFA67, 0x5F45, 0xFA68, 0x4E28, 0xFA69, 0x4EE1, 0xFA6A, 0x4EFC, + 0xFA6B, 0x4F00, 0xFA6C, 0x4F03, 0xFA6D, 0x4F39, 0xFA6E, 0x4F56, + 0xFA6F, 0x4F92, 0xFA70, 0x4F8A, 0xFA71, 0x4F9A, 0xFA72, 0x4F94, + 0xFA73, 0x4FCD, 0xFA74, 0x5040, 0xFA75, 0x5022, 0xFA76, 0x4FFF, + 0xFA77, 0x501E, 0xFA78, 0x5046, 0xFA79, 0x5070, 0xFA7A, 0x5042, + 0xFA7B, 0x5094, 0xFA7C, 0x50F4, 0xFA7D, 0x50D8, 0xFA7E, 0x514A, + 0xFA80, 0x5164, 0xFA81, 0x519D, 0xFA82, 0x51BE, 0xFA83, 0x51EC, + 0xFA84, 0x5215, 0xFA85, 0x529C, 0xFA86, 0x52A6, 0xFA87, 0x52C0, + 0xFA88, 0x52DB, 0xFA89, 0x5300, 0xFA8A, 0x5307, 0xFA8B, 0x5324, + 0xFA8C, 0x5372, 0xFA8D, 0x5393, 0xFA8E, 0x53B2, 0xFA8F, 0x53DD, + 0xFA90, 0xFA0E, 0xFA91, 0x549C, 0xFA92, 0x548A, 0xFA93, 0x54A9, + 0xFA94, 0x54FF, 0xFA95, 0x5586, 0xFA96, 0x5759, 0xFA97, 0x5765, + 0xFA98, 0x57AC, 0xFA99, 0x57C8, 0xFA9A, 0x57C7, 0xFA9B, 0xFA0F, + 0xFA9C, 0xFA10, 0xFA9D, 0x589E, 0xFA9E, 0x58B2, 0xFA9F, 0x590B, + 0xFAA0, 0x5953, 0xFAA1, 0x595B, 0xFAA2, 0x595D, 0xFAA3, 0x5963, + 0xFAA4, 0x59A4, 0xFAA5, 0x59BA, 0xFAA6, 0x5B56, 0xFAA7, 0x5BC0, + 0xFAA8, 0x752F, 0xFAA9, 0x5BD8, 0xFAAA, 0x5BEC, 0xFAAB, 0x5C1E, + 0xFAAC, 0x5CA6, 0xFAAD, 0x5CBA, 0xFAAE, 0x5CF5, 0xFAAF, 0x5D27, + 0xFAB0, 0x5D53, 0xFAB1, 0xFA11, 0xFAB2, 0x5D42, 0xFAB3, 0x5D6D, + 0xFAB4, 0x5DB8, 0xFAB5, 0x5DB9, 0xFAB6, 0x5DD0, 0xFAB7, 0x5F21, + 0xFAB8, 0x5F34, 0xFAB9, 0x5F67, 0xFABA, 0x5FB7, 0xFABB, 0x5FDE, + 0xFABC, 0x605D, 0xFABD, 0x6085, 0xFABE, 0x608A, 0xFABF, 0x60DE, + 0xFAC0, 0x60D5, 0xFAC1, 0x6120, 0xFAC2, 0x60F2, 0xFAC3, 0x6111, + 0xFAC4, 0x6137, 0xFAC5, 0x6130, 0xFAC6, 0x6198, 0xFAC7, 0x6213, + 0xFAC8, 0x62A6, 0xFAC9, 0x63F5, 0xFACA, 0x6460, 0xFACB, 0x649D, + 0xFACC, 0x64CE, 0xFACD, 0x654E, 0xFACE, 0x6600, 0xFACF, 0x6615, + 0xFAD0, 0x663B, 0xFAD1, 0x6609, 0xFAD2, 0x662E, 0xFAD3, 0x661E, + 0xFAD4, 0x6624, 0xFAD5, 0x6665, 0xFAD6, 0x6657, 0xFAD7, 0x6659, + 0xFAD8, 0xFA12, 0xFAD9, 0x6673, 0xFADA, 0x6699, 0xFADB, 0x66A0, + 0xFADC, 0x66B2, 0xFADD, 0x66BF, 0xFADE, 0x66FA, 0xFADF, 0x670E, + 0xFAE0, 0xF929, 0xFAE1, 0x6766, 0xFAE2, 0x67BB, 0xFAE3, 0x6852, + 0xFAE4, 0x67C0, 0xFAE5, 0x6801, 0xFAE6, 0x6844, 0xFAE7, 0x68CF, + 0xFAE8, 0xFA13, 0xFAE9, 0x6968, 0xFAEA, 0xFA14, 0xFAEB, 0x6998, + 0xFAEC, 0x69E2, 0xFAED, 0x6A30, 0xFAEE, 0x6A6B, 0xFAEF, 0x6A46, + 0xFAF0, 0x6A73, 0xFAF1, 0x6A7E, 0xFAF2, 0x6AE2, 0xFAF3, 0x6AE4, + 0xFAF4, 0x6BD6, 0xFAF5, 0x6C3F, 0xFAF6, 0x6C5C, 0xFAF7, 0x6C86, + 0xFAF8, 0x6C6F, 0xFAF9, 0x6CDA, 0xFAFA, 0x6D04, 0xFAFB, 0x6D87, + 0xFAFC, 0x6D6F, 0xFB40, 0x6D96, 0xFB41, 0x6DAC, 0xFB42, 0x6DCF, + 0xFB43, 0x6DF8, 0xFB44, 0x6DF2, 0xFB45, 0x6DFC, 0xFB46, 0x6E39, + 0xFB47, 0x6E5C, 0xFB48, 0x6E27, 0xFB49, 0x6E3C, 0xFB4A, 0x6EBF, + 0xFB4B, 0x6F88, 0xFB4C, 0x6FB5, 0xFB4D, 0x6FF5, 0xFB4E, 0x7005, + 0xFB4F, 0x7007, 0xFB50, 0x7028, 0xFB51, 0x7085, 0xFB52, 0x70AB, + 0xFB53, 0x710F, 0xFB54, 0x7104, 0xFB55, 0x715C, 0xFB56, 0x7146, + 0xFB57, 0x7147, 0xFB58, 0xFA15, 0xFB59, 0x71C1, 0xFB5A, 0x71FE, + 0xFB5B, 0x72B1, 0xFB5C, 0x72BE, 0xFB5D, 0x7324, 0xFB5E, 0xFA16, + 0xFB5F, 0x7377, 0xFB60, 0x73BD, 0xFB61, 0x73C9, 0xFB62, 0x73D6, + 0xFB63, 0x73E3, 0xFB64, 0x73D2, 0xFB65, 0x7407, 0xFB66, 0x73F5, + 0xFB67, 0x7426, 0xFB68, 0x742A, 0xFB69, 0x7429, 0xFB6A, 0x742E, + 0xFB6B, 0x7462, 0xFB6C, 0x7489, 0xFB6D, 0x749F, 0xFB6E, 0x7501, + 0xFB6F, 0x756F, 0xFB70, 0x7682, 0xFB71, 0x769C, 0xFB72, 0x769E, + 0xFB73, 0x769B, 0xFB74, 0x76A6, 0xFB75, 0xFA17, 0xFB76, 0x7746, + 0xFB77, 0x52AF, 0xFB78, 0x7821, 0xFB79, 0x784E, 0xFB7A, 0x7864, + 0xFB7B, 0x787A, 0xFB7C, 0x7930, 0xFB7D, 0xFA18, 0xFB7E, 0xFA19, + 0xFB80, 0xFA1A, 0xFB81, 0x7994, 0xFB82, 0xFA1B, 0xFB83, 0x799B, + 0xFB84, 0x7AD1, 0xFB85, 0x7AE7, 0xFB86, 0xFA1C, 0xFB87, 0x7AEB, + 0xFB88, 0x7B9E, 0xFB89, 0xFA1D, 0xFB8A, 0x7D48, 0xFB8B, 0x7D5C, + 0xFB8C, 0x7DB7, 0xFB8D, 0x7DA0, 0xFB8E, 0x7DD6, 0xFB8F, 0x7E52, + 0xFB90, 0x7F47, 0xFB91, 0x7FA1, 0xFB92, 0xFA1E, 0xFB93, 0x8301, + 0xFB94, 0x8362, 0xFB95, 0x837F, 0xFB96, 0x83C7, 0xFB97, 0x83F6, + 0xFB98, 0x8448, 0xFB99, 0x84B4, 0xFB9A, 0x8553, 0xFB9B, 0x8559, + 0xFB9C, 0x856B, 0xFB9D, 0xFA1F, 0xFB9E, 0x85B0, 0xFB9F, 0xFA20, + 0xFBA0, 0xFA21, 0xFBA1, 0x8807, 0xFBA2, 0x88F5, 0xFBA3, 0x8A12, + 0xFBA4, 0x8A37, 0xFBA5, 0x8A79, 0xFBA6, 0x8AA7, 0xFBA7, 0x8ABE, + 0xFBA8, 0x8ADF, 0xFBA9, 0xFA22, 0xFBAA, 0x8AF6, 0xFBAB, 0x8B53, + 0xFBAC, 0x8B7F, 0xFBAD, 0x8CF0, 0xFBAE, 0x8CF4, 0xFBAF, 0x8D12, + 0xFBB0, 0x8D76, 0xFBB1, 0xFA23, 0xFBB2, 0x8ECF, 0xFBB3, 0xFA24, + 0xFBB4, 0xFA25, 0xFBB5, 0x9067, 0xFBB6, 0x90DE, 0xFBB7, 0xFA26, + 0xFBB8, 0x9115, 0xFBB9, 0x9127, 0xFBBA, 0x91DA, 0xFBBB, 0x91D7, + 0xFBBC, 0x91DE, 0xFBBD, 0x91ED, 0xFBBE, 0x91EE, 0xFBBF, 0x91E4, + 0xFBC0, 0x91E5, 0xFBC1, 0x9206, 0xFBC2, 0x9210, 0xFBC3, 0x920A, + 0xFBC4, 0x923A, 0xFBC5, 0x9240, 0xFBC6, 0x923C, 0xFBC7, 0x924E, + 0xFBC8, 0x9259, 0xFBC9, 0x9251, 0xFBCA, 0x9239, 0xFBCB, 0x9267, + 0xFBCC, 0x92A7, 0xFBCD, 0x9277, 0xFBCE, 0x9278, 0xFBCF, 0x92E7, + 0xFBD0, 0x92D7, 0xFBD1, 0x92D9, 0xFBD2, 0x92D0, 0xFBD3, 0xFA27, + 0xFBD4, 0x92D5, 0xFBD5, 0x92E0, 0xFBD6, 0x92D3, 0xFBD7, 0x9325, + 0xFBD8, 0x9321, 0xFBD9, 0x92FB, 0xFBDA, 0xFA28, 0xFBDB, 0x931E, + 0xFBDC, 0x92FF, 0xFBDD, 0x931D, 0xFBDE, 0x9302, 0xFBDF, 0x9370, + 0xFBE0, 0x9357, 0xFBE1, 0x93A4, 0xFBE2, 0x93C6, 0xFBE3, 0x93DE, + 0xFBE4, 0x93F8, 0xFBE5, 0x9431, 0xFBE6, 0x9445, 0xFBE7, 0x9448, + 0xFBE8, 0x9592, 0xFBE9, 0xF9DC, 0xFBEA, 0xFA29, 0xFBEB, 0x969D, + 0xFBEC, 0x96AF, 0xFBED, 0x9733, 0xFBEE, 0x973B, 0xFBEF, 0x9743, + 0xFBF0, 0x974D, 0xFBF1, 0x974F, 0xFBF2, 0x9751, 0xFBF3, 0x9755, + 0xFBF4, 0x9857, 0xFBF5, 0x9865, 0xFBF6, 0xFA2A, 0xFBF7, 0xFA2B, + 0xFBF8, 0x9927, 0xFBF9, 0xFA2C, 0xFBFA, 0x999E, 0xFBFB, 0x9A4E, + 0xFBFC, 0x9AD9, 0xFC40, 0x9ADC, 0xFC41, 0x9B75, 0xFC42, 0x9B72, + 0xFC43, 0x9B8F, 0xFC44, 0x9BB1, 0xFC45, 0x9BBB, 0xFC46, 0x9C00, + 0xFC47, 0x9D70, 0xFC48, 0x9D6B, 0xFC49, 0xFA2D, 0xFC4A, 0x9E19, + 0xFC4B, 0x9ED1, 0, 0 }; #endif @@ -3725,7 +3724,7 @@ const WCHAR sjis2uni[] = { WCHAR ff_convert ( /* Converted code, 0 means conversion error */ WCHAR chr, /* Character code to be converted */ - UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ + UINT dir /* 0: Unicode to OEM code, 1: OEM code to Unicode */ ) { const WCHAR *p; @@ -3737,10 +3736,10 @@ WCHAR ff_convert ( /* Converted code, 0 means conversion error */ c = chr; } else { #if !_TINY_TABLE - if (dir) { /* OEMCP to unicode */ + if (dir) { /* OEM code to unicode */ p = sjis2uni; hi = sizeof sjis2uni / 4 - 1; - } else { /* Unicode to OEMCP */ + } else { /* Unicode to OEM code */ p = uni2sjis; hi = sizeof uni2sjis / 4 - 1; } @@ -3755,7 +3754,7 @@ WCHAR ff_convert ( /* Converted code, 0 means conversion error */ } c = n ? p[i * 2 + 1] : 0; #else - if (dir) { /* OEMCP to unicode (Incremental search)*/ + if (dir) { /* OEM code to unicode (Incremental search)*/ p = &uni2sjis[1]; do { c = *p; @@ -3763,7 +3762,7 @@ WCHAR ff_convert ( /* Converted code, 0 means conversion error */ } while (c && c != chr); p -= 3; c = *p; - } else { /* Unicode to OEMCP */ + } else { /* Unicode to OEM code */ li = 0; hi = sizeof uni2sjis / 4 - 1; for (n = 16; n; n--) { i = li + (hi - li) / 2; @@ -3783,16 +3782,48 @@ WCHAR ff_convert ( /* Converted code, 0 means conversion error */ -WCHAR ff_wtoupper ( /* Upper converted character */ - WCHAR chr /* Input character */ +WCHAR ff_wtoupper ( + WCHAR chr /* Unicode character to be upper converted */ ) { - static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; - static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; - int i; + static const WCHAR lower[] = { /* Lower case characters to be converted */ + /* Latin Supplement */ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, + /* Latin Extended-A */ 0x101,0x103,0x105,0x107,0x109,0x10B,0x10D,0x10F,0x111,0x113,0x115,0x117,0x119,0x11B,0x11D,0x11F,0x121,0x123,0x125,0x127,0x129,0x12B,0x12D,0x12F,0x131,0x133,0x135,0x137,0x13A,0x13C,0x13E,0x140,0x142,0x144,0x146,0x148,0x14B,0x14D,0x14F,0x151,0x153,0x155,0x157,0x159,0x15B,0x15D,0x15F,0x161,0x163,0x165,0x167,0x169,0x16B,0x16D,0x16F,0x171,0x173,0x175,0x177,0x17A,0x17C,0x17E, + /* Latin Extended-B */ 0x183,0x185,0x188,0x18C,0x192,0x199,0x1A1,0x1A3,0x1A8,0x1AD,0x1B0,0x1B4,0x1B6,0x1B9,0x1BD,0x1C6,0x1C9,0x1CC,0x1CE,0x1D0,0x1D2,0x1D4,0x1D6,0x1D8,0x1DA,0x1DC,0x1DD,0x1DF,0x1E1,0x1E3,0x1E5,0x1E7,0x1E9,0x1EB,0x1ED,0x1EF,0x1F3,0x1F5,0x1FB,0x1FD,0x1FF,0x201,0x203,0x205,0x207,0x209,0x20B,0x20D,0x20F,0x211,0x213,0x215,0x217, + /* Greek, Coptic */ 0x3B1,0x3B2,0x3B3,0x3B4,0x3B5,0x3B6,0x3B7,0x3B8,0x3B9,0x3BA,0x3BB,0x3BC,0x3BD,0x3BE,0x3BF,0x3C0,0x3C1,0x3C3,0x3C4,0x3C5,0x3C6,0x3C7,0x3C8,0x3C9,0x3CA,0x3CB,0x3CC,0x3CD,0x3CE,0x3E3,0x3E5,0x3E7,0x3E9,0x3EB, + /* Cyrillic */ 0x430,0x431,0x432,0x433,0x434,0x435,0x436,0x437,0x438,0x439,0x43A,0x43B,0x43C,0x43D,0x43E,0x43F,0x440,0x441,0x442,0x443,0x444,0x445,0x446,0x447,0x448,0x449,0x44A,0x44B,0x44C,0x44D,0x44E,0x44F,0x452,0x453,0x454,0x455,0x456,0x457,0x458,0x459,0x45A,0x45B,0x45C,0x45E,0x45F,0x461,0x463,0x465,0x467,0x469,0x46B,0x46D,0x46F,0x471,0x473,0x475,0x477,0x479,0x47B,0x47D,0x47F,0x481,0x491,0x493,0x495,0x497,0x499,0x49B,0x49D,0x49F,0x4A1,0x4A3,0x4A5,0x4A7,0x4A9,0x4AB,0x4AD,0x4AF,0x4B1,0x4B3,0x4B5,0x4B7,0x4B9,0x4BB,0x4BD,0x4BF,0x4C2,0x4C4,0x4C8,0x4D1,0x4D3,0x4D5,0x4D7,0x4D9,0x4DB,0x4DD,0x4DF,0x4E1,0x4E3,0x4E5,0x4E7,0x4E9,0x4EB,0x4ED,0x4EF,0x4F1,0x4F3,0x4F5,0x4F9, + /* Armenian */ 0x561,0x562,0x563,0x564,0x565,0x566,0x567,0x568,0x569,0x56A,0x56B,0x56C,0x56D,0x56E,0x56F,0x570,0x571,0x572,0x573,0x574,0x575,0x576,0x577,0x578,0x579,0x57A,0x57B,0x57C,0x57D,0x57E,0x57F,0x580,0x581,0x582,0x583,0x584,0x585,0x586, + /* Latin Extended Additional */ 0x1E01,0x1E03,0x1E05,0x1E07,0x1E09,0x1E0B,0x1E0D,0x1E0F,0x1E11,0x1E13,0x1E15,0x1E17,0x1E19,0x1E1B,0x1E1D,0x1E1F,0x1E21,0x1E23,0x1E25,0x1E27,0x1E29,0x1E2B,0x1E2D,0x1E2F,0x1E31,0x1E33,0x1E35,0x1E37,0x1E39,0x1E3B,0x1E3D,0x1E3F,0x1E41,0x1E43,0x1E45,0x1E47,0x1E49,0x1E4B,0x1E4D,0x1E4F,0x1E51,0x1E53,0x1E55,0x1E57,0x1E59,0x1E5B,0x1E5D,0x1E5F,0x1E61,0x1E63,0x1E65,0x1E67,0x1E69,0x1E6B,0x1E6D,0x1E6F,0x1E71,0x1E73,0x1E75,0x1E77,0x1E79,0x1E7B,0x1E7D,0x1E7F,0x1E81,0x1E83,0x1E85,0x1E87,0x1E89,0x1E8B,0x1E8D,0x1E8F,0x1E91,0x1E93,0x1E95,0x1E97,0x1E99,0x1E9B,0x1E9D,0x1E9F,0x1EA1,0x1EA3,0x1EA5,0x1EA7,0x1EA9,0x1EAB,0x1EAD,0x1EAF,0x1EB1,0x1EB3,0x1EB5,0x1EB7,0x1EB9,0x1EBB,0x1EBD,0x1EBF,0x1EC1,0x1EC3,0x1EC5,0x1EC7,0x1EC9,0x1ECB,0x1ECD,0x1ECF,0x1ED1,0x1ED3,0x1ED5,0x1ED7,0x1ED9,0x1EDB,0x1EDD,0x1EDF,0x1EE1,0x1EE3,0x1EE5,0x1EE7,0x1EE9,0x1EEB,0x1EED,0x1EEF,0x1EF1,0x1EF3,0x1EF5,0x1EF7,0x1EF9, + /* Number forms */ 0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176,0x2177,0x2178,0x2179,0x217A,0x217B,0x217C,0x217D,0x217E,0x217F, + /* Full-width */ 0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57,0xFF58,0xFF59,0xFF5A + }; + static const WCHAR upper[] = { /* Upper case characters correspond to lower[] */ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x178, + 0x100,0x102,0x104,0x106,0x108,0x10A,0x10C,0x10E,0x110,0x112,0x114,0x116,0x118,0x11A,0x11C,0x11E,0x120,0x122,0x124,0x126,0x128,0x12A,0x12C,0x12E,0x130,0x132,0x134,0x136,0x139,0x13B,0x13D,0x13F,0x141,0x143,0x145,0x147,0x14A,0x14C,0x14E,0x150,0x152,0x154,0x156,0x158,0x15A,0x15C,0x15E,0x160,0x162,0x164,0x166,0x168,0x16A,0x16C,0x16E,0x170,0x172,0x174,0x176,0x179,0x17B,0x17D, + 0x182,0x184,0x187,0x18B,0x191,0x198,0x1A0,0x1A2,0x1A7,0x1AC,0x1AF,0x1B3,0x1B5,0x1B8,0x1BC,0x1C4,0x1C7,0x1CA,0x1CD,0x1CF,0x1D1,0x1D3,0x1D5,0x1D7,0x1D9,0x1DB,0x18E,0x1DE,0x1E0,0x1E2,0x1E4,0x1E6,0x1E8,0x1EA,0x1EC,0x1EE,0x1F1,0x1F4,0x1FA,0x1FC,0x1FE,0x200,0x202,0x204,0x206,0x208,0x20A,0x20C,0x20E,0x210,0x212,0x214,0x216, + 0x391,0x392,0x393,0x394,0x395,0x396,0x397,0x398,0x399,0x39A,0x39B,0x39C,0x39D,0x39E,0x39F,0x3A0,0x3A1,0x3A3,0x3A4,0x3A5,0x3A6,0x3A7,0x3A8,0x3A9,0x3AA,0x3AB,0x38C,0x38E,0x38F,0x3E2,0x3E4,0x3E6,0x3E8,0x3EA, + 0x410,0x411,0x412,0x413,0x414,0x415,0x416,0x417,0x418,0x419,0x41A,0x41B,0x41C,0x41D,0x41E,0x41F,0x420,0x421,0x422,0x423,0x424,0x425,0x426,0x427,0x428,0x429,0x42A,0x42B,0x42C,0x42D,0x42E,0x42F,0x402,0x403,0x404,0x405,0x406,0x407,0x408,0x409,0x40A,0x40B,0x40C,0x40E,0x40F,0x460,0x462,0x464,0x466,0x468,0x46A,0x46C,0x46E,0x470,0x472,0x474,0x476,0x478,0x47A,0x47C,0x47E,0x480,0x490,0x492,0x494,0x496,0x498,0x49A,0x49C,0x49E,0x4A0,0x4A2,0x4A4,0x4A6,0x4A8,0x4AA,0x4AC,0x4AE,0x4B0,0x4B2,0x4B4,0x4B6,0x4B8,0x4BA,0x4BC,0x4BE,0x4C1,0x4C3,0x5C7,0x4D0,0x4D2,0x4D4,0x4D6,0x4D8,0x4DA,0x4DC,0x4DE,0x4E0,0x4E2,0x4E4,0x4E6,0x4E8,0x4EA,0x4EC,0x4EE,0x4F0,0x4F2,0x4F4,0x4F8, + 0x531,0x532,0x533,0x534,0x535,0x536,0x537,0x538,0x539,0x53A,0x53B,0x53C,0x53D,0x53E,0x53F,0x540,0x541,0x542,0x543,0x544,0x545,0x546,0x547,0x548,0x549,0x54A,0x54B,0x54C,0x54D,0x54E,0x54F,0x550,0x551,0x552,0x553,0x554,0x555,0x556, + 0x1E00,0x1E02,0x1E04,0x1E06,0x1E08,0x1E0A,0x1E0C,0x1E0E,0x1E10,0x1E12,0x1E14,0x1E16,0x1E18,0x1E1A,0x1E1C,0x1E1E,0x1E20,0x1E22,0x1E24,0x1E26,0x1E28,0x1E2A,0x1E2C,0x1E2E,0x1E30,0x1E32,0x1E34,0x1E36,0x1E38,0x1E3A,0x1E3C,0x1E3E,0x1E40,0x1E42,0x1E44,0x1E46,0x1E48,0x1E4A,0x1E4C,0x1E4E,0x1E50,0x1E52,0x1E54,0x1E56,0x1E58,0x1E5A,0x1E5C,0x1E5E,0x1E60,0x1E62,0x1E64,0x1E66,0x1E68,0x1E6A,0x1E6C,0x1E6E,0x1E70,0x1E72,0x1E74,0x1E76,0x1E78,0x1E7A,0x1E7C,0x1E7E,0x1E80,0x1E82,0x1E84,0x1E86,0x1E88,0x1E8A,0x1E8C,0x1E8E,0x1E90,0x1E92,0x1E94,0x1E96,0x1E98,0x1E9A,0x1E9C,0x1E9E,0x1EA0,0x1EA2,0x1EA4,0x1EA6,0x1EA8,0x1EAA,0x1EAC,0x1EAE,0x1EB0,0x1EB2,0x1EB4,0x1EB6,0x1EB8,0x1EBA,0x1EBC,0x1EBE,0x1EC0,0x1EC2,0x1EC4,0x1EC6,0x1EC8,0x1ECA,0x1ECC,0x1ECE,0x1ED0,0x1ED2,0x1ED4,0x1ED6,0x1ED8,0x1EDA,0x1EDC,0x1EDE,0x1EE0,0x1EE2,0x1EE4,0x1EE6,0x1EE8,0x1EEA,0x1EEC,0x1EEE,0x1EF0,0x1EF2,0x1EF4,0x1EF6,0x1EF8, + 0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,0x2167,0x2168,0x2169,0x216A,0x216B,0x216C,0x216D,0x216E,0x216F, + 0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28,0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38,0xFF39,0xFF3A + }; + UINT i, n, hi, li; - for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + if (chr < 0x80) { /* ASCII characters (acceleration) */ + if (chr >= 0x61 && chr <= 0x7A) chr -= 0x20; - return tbl_lower[i] ? tbl_upper[i] : chr; + } else { /* Extended characters */ + n = 12; li = 0; hi = sizeof lower / sizeof lower[0]; + do { + i = li + (hi - li) / 2; + if (chr == lower[i]) break; + if (chr > lower[i]) li = i; else hi = i; + } while (--n); + if (n) chr = upper[i]; + } + + return chr; } + diff --git a/firmware/chibios-portapack/ext/fatfs/src/option/cc936.c b/firmware/chibios-portapack/ext/fatfs/src/option/cc936.c index 84bc3297..4c20783e 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/option/cc936.c +++ b/firmware/chibios-portapack/ext/fatfs/src/option/cc936.c @@ -1,6 +1,5 @@ /*------------------------------------------------------------------------*/ -/* Unicode - OEM code bidirectional converter (C)ChaN, 2009 */ -/* */ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2015 */ /* CP936 (Simplified Chinese GBK) */ /*------------------------------------------------------------------------*/ @@ -10923,7 +10922,7 @@ const WCHAR oem2uni[] = { WCHAR ff_convert ( /* Converted code, 0 means conversion error */ WCHAR chr, /* Character code to be converted */ - UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ + UINT dir /* 0: Unicode to OEM code, 1: OEM code to Unicode */ ) { const WCHAR *p; @@ -10934,10 +10933,10 @@ WCHAR ff_convert ( /* Converted code, 0 means conversion error */ if (chr < 0x80) { /* ASCII */ c = chr; } else { - if (dir) { /* OEMCP to unicode */ + if (dir) { /* OEM code to unicode */ p = oem2uni; hi = sizeof oem2uni / 4 - 1; - } else { /* Unicode to OEMCP */ + } else { /* Unicode to OEM code */ p = uni2oem; hi = sizeof uni2oem / 4 - 1; } @@ -10958,16 +10957,48 @@ WCHAR ff_convert ( /* Converted code, 0 means conversion error */ -WCHAR ff_wtoupper ( /* Upper converted character */ - WCHAR chr /* Input character */ +WCHAR ff_wtoupper ( + WCHAR chr /* Unicode character to be upper converted */ ) { - static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; - static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; - int i; + static const WCHAR lower[] = { /* Lower case characters to be converted */ + /* Latin Supplement */ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, + /* Latin Extended-A */ 0x101,0x103,0x105,0x107,0x109,0x10B,0x10D,0x10F,0x111,0x113,0x115,0x117,0x119,0x11B,0x11D,0x11F,0x121,0x123,0x125,0x127,0x129,0x12B,0x12D,0x12F,0x131,0x133,0x135,0x137,0x13A,0x13C,0x13E,0x140,0x142,0x144,0x146,0x148,0x14B,0x14D,0x14F,0x151,0x153,0x155,0x157,0x159,0x15B,0x15D,0x15F,0x161,0x163,0x165,0x167,0x169,0x16B,0x16D,0x16F,0x171,0x173,0x175,0x177,0x17A,0x17C,0x17E, + /* Latin Extended-B */ 0x183,0x185,0x188,0x18C,0x192,0x199,0x1A1,0x1A3,0x1A8,0x1AD,0x1B0,0x1B4,0x1B6,0x1B9,0x1BD,0x1C6,0x1C9,0x1CC,0x1CE,0x1D0,0x1D2,0x1D4,0x1D6,0x1D8,0x1DA,0x1DC,0x1DD,0x1DF,0x1E1,0x1E3,0x1E5,0x1E7,0x1E9,0x1EB,0x1ED,0x1EF,0x1F3,0x1F5,0x1FB,0x1FD,0x1FF,0x201,0x203,0x205,0x207,0x209,0x20B,0x20D,0x20F,0x211,0x213,0x215,0x217, + /* Greek, Coptic */ 0x3B1,0x3B2,0x3B3,0x3B4,0x3B5,0x3B6,0x3B7,0x3B8,0x3B9,0x3BA,0x3BB,0x3BC,0x3BD,0x3BE,0x3BF,0x3C0,0x3C1,0x3C3,0x3C4,0x3C5,0x3C6,0x3C7,0x3C8,0x3C9,0x3CA,0x3CB,0x3CC,0x3CD,0x3CE,0x3E3,0x3E5,0x3E7,0x3E9,0x3EB, + /* Cyrillic */ 0x430,0x431,0x432,0x433,0x434,0x435,0x436,0x437,0x438,0x439,0x43A,0x43B,0x43C,0x43D,0x43E,0x43F,0x440,0x441,0x442,0x443,0x444,0x445,0x446,0x447,0x448,0x449,0x44A,0x44B,0x44C,0x44D,0x44E,0x44F,0x452,0x453,0x454,0x455,0x456,0x457,0x458,0x459,0x45A,0x45B,0x45C,0x45E,0x45F,0x461,0x463,0x465,0x467,0x469,0x46B,0x46D,0x46F,0x471,0x473,0x475,0x477,0x479,0x47B,0x47D,0x47F,0x481,0x491,0x493,0x495,0x497,0x499,0x49B,0x49D,0x49F,0x4A1,0x4A3,0x4A5,0x4A7,0x4A9,0x4AB,0x4AD,0x4AF,0x4B1,0x4B3,0x4B5,0x4B7,0x4B9,0x4BB,0x4BD,0x4BF,0x4C2,0x4C4,0x4C8,0x4D1,0x4D3,0x4D5,0x4D7,0x4D9,0x4DB,0x4DD,0x4DF,0x4E1,0x4E3,0x4E5,0x4E7,0x4E9,0x4EB,0x4ED,0x4EF,0x4F1,0x4F3,0x4F5,0x4F9, + /* Armenian */ 0x561,0x562,0x563,0x564,0x565,0x566,0x567,0x568,0x569,0x56A,0x56B,0x56C,0x56D,0x56E,0x56F,0x570,0x571,0x572,0x573,0x574,0x575,0x576,0x577,0x578,0x579,0x57A,0x57B,0x57C,0x57D,0x57E,0x57F,0x580,0x581,0x582,0x583,0x584,0x585,0x586, + /* Latin Extended Additional */ 0x1E01,0x1E03,0x1E05,0x1E07,0x1E09,0x1E0B,0x1E0D,0x1E0F,0x1E11,0x1E13,0x1E15,0x1E17,0x1E19,0x1E1B,0x1E1D,0x1E1F,0x1E21,0x1E23,0x1E25,0x1E27,0x1E29,0x1E2B,0x1E2D,0x1E2F,0x1E31,0x1E33,0x1E35,0x1E37,0x1E39,0x1E3B,0x1E3D,0x1E3F,0x1E41,0x1E43,0x1E45,0x1E47,0x1E49,0x1E4B,0x1E4D,0x1E4F,0x1E51,0x1E53,0x1E55,0x1E57,0x1E59,0x1E5B,0x1E5D,0x1E5F,0x1E61,0x1E63,0x1E65,0x1E67,0x1E69,0x1E6B,0x1E6D,0x1E6F,0x1E71,0x1E73,0x1E75,0x1E77,0x1E79,0x1E7B,0x1E7D,0x1E7F,0x1E81,0x1E83,0x1E85,0x1E87,0x1E89,0x1E8B,0x1E8D,0x1E8F,0x1E91,0x1E93,0x1E95,0x1E97,0x1E99,0x1E9B,0x1E9D,0x1E9F,0x1EA1,0x1EA3,0x1EA5,0x1EA7,0x1EA9,0x1EAB,0x1EAD,0x1EAF,0x1EB1,0x1EB3,0x1EB5,0x1EB7,0x1EB9,0x1EBB,0x1EBD,0x1EBF,0x1EC1,0x1EC3,0x1EC5,0x1EC7,0x1EC9,0x1ECB,0x1ECD,0x1ECF,0x1ED1,0x1ED3,0x1ED5,0x1ED7,0x1ED9,0x1EDB,0x1EDD,0x1EDF,0x1EE1,0x1EE3,0x1EE5,0x1EE7,0x1EE9,0x1EEB,0x1EED,0x1EEF,0x1EF1,0x1EF3,0x1EF5,0x1EF7,0x1EF9, + /* Number forms */ 0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176,0x2177,0x2178,0x2179,0x217A,0x217B,0x217C,0x217D,0x217E,0x217F, + /* Full-width */ 0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57,0xFF58,0xFF59,0xFF5A + }; + static const WCHAR upper[] = { /* Upper case characters correspond to lower[] */ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x178, + 0x100,0x102,0x104,0x106,0x108,0x10A,0x10C,0x10E,0x110,0x112,0x114,0x116,0x118,0x11A,0x11C,0x11E,0x120,0x122,0x124,0x126,0x128,0x12A,0x12C,0x12E,0x130,0x132,0x134,0x136,0x139,0x13B,0x13D,0x13F,0x141,0x143,0x145,0x147,0x14A,0x14C,0x14E,0x150,0x152,0x154,0x156,0x158,0x15A,0x15C,0x15E,0x160,0x162,0x164,0x166,0x168,0x16A,0x16C,0x16E,0x170,0x172,0x174,0x176,0x179,0x17B,0x17D, + 0x182,0x184,0x187,0x18B,0x191,0x198,0x1A0,0x1A2,0x1A7,0x1AC,0x1AF,0x1B3,0x1B5,0x1B8,0x1BC,0x1C4,0x1C7,0x1CA,0x1CD,0x1CF,0x1D1,0x1D3,0x1D5,0x1D7,0x1D9,0x1DB,0x18E,0x1DE,0x1E0,0x1E2,0x1E4,0x1E6,0x1E8,0x1EA,0x1EC,0x1EE,0x1F1,0x1F4,0x1FA,0x1FC,0x1FE,0x200,0x202,0x204,0x206,0x208,0x20A,0x20C,0x20E,0x210,0x212,0x214,0x216, + 0x391,0x392,0x393,0x394,0x395,0x396,0x397,0x398,0x399,0x39A,0x39B,0x39C,0x39D,0x39E,0x39F,0x3A0,0x3A1,0x3A3,0x3A4,0x3A5,0x3A6,0x3A7,0x3A8,0x3A9,0x3AA,0x3AB,0x38C,0x38E,0x38F,0x3E2,0x3E4,0x3E6,0x3E8,0x3EA, + 0x410,0x411,0x412,0x413,0x414,0x415,0x416,0x417,0x418,0x419,0x41A,0x41B,0x41C,0x41D,0x41E,0x41F,0x420,0x421,0x422,0x423,0x424,0x425,0x426,0x427,0x428,0x429,0x42A,0x42B,0x42C,0x42D,0x42E,0x42F,0x402,0x403,0x404,0x405,0x406,0x407,0x408,0x409,0x40A,0x40B,0x40C,0x40E,0x40F,0x460,0x462,0x464,0x466,0x468,0x46A,0x46C,0x46E,0x470,0x472,0x474,0x476,0x478,0x47A,0x47C,0x47E,0x480,0x490,0x492,0x494,0x496,0x498,0x49A,0x49C,0x49E,0x4A0,0x4A2,0x4A4,0x4A6,0x4A8,0x4AA,0x4AC,0x4AE,0x4B0,0x4B2,0x4B4,0x4B6,0x4B8,0x4BA,0x4BC,0x4BE,0x4C1,0x4C3,0x5C7,0x4D0,0x4D2,0x4D4,0x4D6,0x4D8,0x4DA,0x4DC,0x4DE,0x4E0,0x4E2,0x4E4,0x4E6,0x4E8,0x4EA,0x4EC,0x4EE,0x4F0,0x4F2,0x4F4,0x4F8, + 0x531,0x532,0x533,0x534,0x535,0x536,0x537,0x538,0x539,0x53A,0x53B,0x53C,0x53D,0x53E,0x53F,0x540,0x541,0x542,0x543,0x544,0x545,0x546,0x547,0x548,0x549,0x54A,0x54B,0x54C,0x54D,0x54E,0x54F,0x550,0x551,0x552,0x553,0x554,0x555,0x556, + 0x1E00,0x1E02,0x1E04,0x1E06,0x1E08,0x1E0A,0x1E0C,0x1E0E,0x1E10,0x1E12,0x1E14,0x1E16,0x1E18,0x1E1A,0x1E1C,0x1E1E,0x1E20,0x1E22,0x1E24,0x1E26,0x1E28,0x1E2A,0x1E2C,0x1E2E,0x1E30,0x1E32,0x1E34,0x1E36,0x1E38,0x1E3A,0x1E3C,0x1E3E,0x1E40,0x1E42,0x1E44,0x1E46,0x1E48,0x1E4A,0x1E4C,0x1E4E,0x1E50,0x1E52,0x1E54,0x1E56,0x1E58,0x1E5A,0x1E5C,0x1E5E,0x1E60,0x1E62,0x1E64,0x1E66,0x1E68,0x1E6A,0x1E6C,0x1E6E,0x1E70,0x1E72,0x1E74,0x1E76,0x1E78,0x1E7A,0x1E7C,0x1E7E,0x1E80,0x1E82,0x1E84,0x1E86,0x1E88,0x1E8A,0x1E8C,0x1E8E,0x1E90,0x1E92,0x1E94,0x1E96,0x1E98,0x1E9A,0x1E9C,0x1E9E,0x1EA0,0x1EA2,0x1EA4,0x1EA6,0x1EA8,0x1EAA,0x1EAC,0x1EAE,0x1EB0,0x1EB2,0x1EB4,0x1EB6,0x1EB8,0x1EBA,0x1EBC,0x1EBE,0x1EC0,0x1EC2,0x1EC4,0x1EC6,0x1EC8,0x1ECA,0x1ECC,0x1ECE,0x1ED0,0x1ED2,0x1ED4,0x1ED6,0x1ED8,0x1EDA,0x1EDC,0x1EDE,0x1EE0,0x1EE2,0x1EE4,0x1EE6,0x1EE8,0x1EEA,0x1EEC,0x1EEE,0x1EF0,0x1EF2,0x1EF4,0x1EF6,0x1EF8, + 0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,0x2167,0x2168,0x2169,0x216A,0x216B,0x216C,0x216D,0x216E,0x216F, + 0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28,0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38,0xFF39,0xFF3A + }; + UINT i, n, hi, li; - for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + if (chr < 0x80) { /* ASCII characters (acceleration) */ + if (chr >= 0x61 && chr <= 0x7A) chr -= 0x20; - return tbl_lower[i] ? tbl_upper[i] : chr; + } else { /* Extended characters */ + n = 12; li = 0; hi = sizeof lower / sizeof lower[0]; + do { + i = li + (hi - li) / 2; + if (chr == lower[i]) break; + if (chr > lower[i]) li = i; else hi = i; + } while (--n); + if (n) chr = upper[i]; + } + + return chr; } + diff --git a/firmware/chibios-portapack/ext/fatfs/src/option/cc949.c b/firmware/chibios-portapack/ext/fatfs/src/option/cc949.c index 0abda85e..f646e004 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/option/cc949.c +++ b/firmware/chibios-portapack/ext/fatfs/src/option/cc949.c @@ -1,6 +1,5 @@ /*------------------------------------------------------------------------*/ -/* Unicode - OEM code bidirectional converter (C)ChaN, 2009 */ -/* */ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2015 */ /* CP949 (Korean EUC-KR) */ /*------------------------------------------------------------------------*/ @@ -8552,7 +8551,7 @@ const WCHAR oem2uni[] = { WCHAR ff_convert ( /* Converted code, 0 means conversion error */ WCHAR chr, /* Character code to be converted */ - UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ + UINT dir /* 0: Unicode to OEM code, 1: OEM code to Unicode */ ) { const WCHAR *p; @@ -8563,10 +8562,10 @@ WCHAR ff_convert ( /* Converted code, 0 means conversion error */ if (chr < 0x80) { /* ASCII */ c = chr; } else { - if (dir) { /* OEMCP to unicode */ + if (dir) { /* OEM code to unicode */ p = oem2uni; hi = sizeof oem2uni / 4 - 1; - } else { /* Unicode to OEMCP */ + } else { /* Unicode to OEM code */ p = uni2oem; hi = sizeof uni2oem / 4 - 1; } @@ -8588,16 +8587,48 @@ WCHAR ff_convert ( /* Converted code, 0 means conversion error */ -WCHAR ff_wtoupper ( /* Upper converted character */ - WCHAR chr /* Input character */ +WCHAR ff_wtoupper ( + WCHAR chr /* Unicode character to be upper converted */ ) { - static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; - static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; - int i; + static const WCHAR lower[] = { /* Lower case characters to be converted */ + /* Latin Supplement */ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, + /* Latin Extended-A */ 0x101,0x103,0x105,0x107,0x109,0x10B,0x10D,0x10F,0x111,0x113,0x115,0x117,0x119,0x11B,0x11D,0x11F,0x121,0x123,0x125,0x127,0x129,0x12B,0x12D,0x12F,0x131,0x133,0x135,0x137,0x13A,0x13C,0x13E,0x140,0x142,0x144,0x146,0x148,0x14B,0x14D,0x14F,0x151,0x153,0x155,0x157,0x159,0x15B,0x15D,0x15F,0x161,0x163,0x165,0x167,0x169,0x16B,0x16D,0x16F,0x171,0x173,0x175,0x177,0x17A,0x17C,0x17E, + /* Latin Extended-B */ 0x183,0x185,0x188,0x18C,0x192,0x199,0x1A1,0x1A3,0x1A8,0x1AD,0x1B0,0x1B4,0x1B6,0x1B9,0x1BD,0x1C6,0x1C9,0x1CC,0x1CE,0x1D0,0x1D2,0x1D4,0x1D6,0x1D8,0x1DA,0x1DC,0x1DD,0x1DF,0x1E1,0x1E3,0x1E5,0x1E7,0x1E9,0x1EB,0x1ED,0x1EF,0x1F3,0x1F5,0x1FB,0x1FD,0x1FF,0x201,0x203,0x205,0x207,0x209,0x20B,0x20D,0x20F,0x211,0x213,0x215,0x217, + /* Greek, Coptic */ 0x3B1,0x3B2,0x3B3,0x3B4,0x3B5,0x3B6,0x3B7,0x3B8,0x3B9,0x3BA,0x3BB,0x3BC,0x3BD,0x3BE,0x3BF,0x3C0,0x3C1,0x3C3,0x3C4,0x3C5,0x3C6,0x3C7,0x3C8,0x3C9,0x3CA,0x3CB,0x3CC,0x3CD,0x3CE,0x3E3,0x3E5,0x3E7,0x3E9,0x3EB, + /* Cyrillic */ 0x430,0x431,0x432,0x433,0x434,0x435,0x436,0x437,0x438,0x439,0x43A,0x43B,0x43C,0x43D,0x43E,0x43F,0x440,0x441,0x442,0x443,0x444,0x445,0x446,0x447,0x448,0x449,0x44A,0x44B,0x44C,0x44D,0x44E,0x44F,0x452,0x453,0x454,0x455,0x456,0x457,0x458,0x459,0x45A,0x45B,0x45C,0x45E,0x45F,0x461,0x463,0x465,0x467,0x469,0x46B,0x46D,0x46F,0x471,0x473,0x475,0x477,0x479,0x47B,0x47D,0x47F,0x481,0x491,0x493,0x495,0x497,0x499,0x49B,0x49D,0x49F,0x4A1,0x4A3,0x4A5,0x4A7,0x4A9,0x4AB,0x4AD,0x4AF,0x4B1,0x4B3,0x4B5,0x4B7,0x4B9,0x4BB,0x4BD,0x4BF,0x4C2,0x4C4,0x4C8,0x4D1,0x4D3,0x4D5,0x4D7,0x4D9,0x4DB,0x4DD,0x4DF,0x4E1,0x4E3,0x4E5,0x4E7,0x4E9,0x4EB,0x4ED,0x4EF,0x4F1,0x4F3,0x4F5,0x4F9, + /* Armenian */ 0x561,0x562,0x563,0x564,0x565,0x566,0x567,0x568,0x569,0x56A,0x56B,0x56C,0x56D,0x56E,0x56F,0x570,0x571,0x572,0x573,0x574,0x575,0x576,0x577,0x578,0x579,0x57A,0x57B,0x57C,0x57D,0x57E,0x57F,0x580,0x581,0x582,0x583,0x584,0x585,0x586, + /* Latin Extended Additional */ 0x1E01,0x1E03,0x1E05,0x1E07,0x1E09,0x1E0B,0x1E0D,0x1E0F,0x1E11,0x1E13,0x1E15,0x1E17,0x1E19,0x1E1B,0x1E1D,0x1E1F,0x1E21,0x1E23,0x1E25,0x1E27,0x1E29,0x1E2B,0x1E2D,0x1E2F,0x1E31,0x1E33,0x1E35,0x1E37,0x1E39,0x1E3B,0x1E3D,0x1E3F,0x1E41,0x1E43,0x1E45,0x1E47,0x1E49,0x1E4B,0x1E4D,0x1E4F,0x1E51,0x1E53,0x1E55,0x1E57,0x1E59,0x1E5B,0x1E5D,0x1E5F,0x1E61,0x1E63,0x1E65,0x1E67,0x1E69,0x1E6B,0x1E6D,0x1E6F,0x1E71,0x1E73,0x1E75,0x1E77,0x1E79,0x1E7B,0x1E7D,0x1E7F,0x1E81,0x1E83,0x1E85,0x1E87,0x1E89,0x1E8B,0x1E8D,0x1E8F,0x1E91,0x1E93,0x1E95,0x1E97,0x1E99,0x1E9B,0x1E9D,0x1E9F,0x1EA1,0x1EA3,0x1EA5,0x1EA7,0x1EA9,0x1EAB,0x1EAD,0x1EAF,0x1EB1,0x1EB3,0x1EB5,0x1EB7,0x1EB9,0x1EBB,0x1EBD,0x1EBF,0x1EC1,0x1EC3,0x1EC5,0x1EC7,0x1EC9,0x1ECB,0x1ECD,0x1ECF,0x1ED1,0x1ED3,0x1ED5,0x1ED7,0x1ED9,0x1EDB,0x1EDD,0x1EDF,0x1EE1,0x1EE3,0x1EE5,0x1EE7,0x1EE9,0x1EEB,0x1EED,0x1EEF,0x1EF1,0x1EF3,0x1EF5,0x1EF7,0x1EF9, + /* Number forms */ 0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176,0x2177,0x2178,0x2179,0x217A,0x217B,0x217C,0x217D,0x217E,0x217F, + /* Full-width */ 0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57,0xFF58,0xFF59,0xFF5A + }; + static const WCHAR upper[] = { /* Upper case characters correspond to lower[] */ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x178, + 0x100,0x102,0x104,0x106,0x108,0x10A,0x10C,0x10E,0x110,0x112,0x114,0x116,0x118,0x11A,0x11C,0x11E,0x120,0x122,0x124,0x126,0x128,0x12A,0x12C,0x12E,0x130,0x132,0x134,0x136,0x139,0x13B,0x13D,0x13F,0x141,0x143,0x145,0x147,0x14A,0x14C,0x14E,0x150,0x152,0x154,0x156,0x158,0x15A,0x15C,0x15E,0x160,0x162,0x164,0x166,0x168,0x16A,0x16C,0x16E,0x170,0x172,0x174,0x176,0x179,0x17B,0x17D, + 0x182,0x184,0x187,0x18B,0x191,0x198,0x1A0,0x1A2,0x1A7,0x1AC,0x1AF,0x1B3,0x1B5,0x1B8,0x1BC,0x1C4,0x1C7,0x1CA,0x1CD,0x1CF,0x1D1,0x1D3,0x1D5,0x1D7,0x1D9,0x1DB,0x18E,0x1DE,0x1E0,0x1E2,0x1E4,0x1E6,0x1E8,0x1EA,0x1EC,0x1EE,0x1F1,0x1F4,0x1FA,0x1FC,0x1FE,0x200,0x202,0x204,0x206,0x208,0x20A,0x20C,0x20E,0x210,0x212,0x214,0x216, + 0x391,0x392,0x393,0x394,0x395,0x396,0x397,0x398,0x399,0x39A,0x39B,0x39C,0x39D,0x39E,0x39F,0x3A0,0x3A1,0x3A3,0x3A4,0x3A5,0x3A6,0x3A7,0x3A8,0x3A9,0x3AA,0x3AB,0x38C,0x38E,0x38F,0x3E2,0x3E4,0x3E6,0x3E8,0x3EA, + 0x410,0x411,0x412,0x413,0x414,0x415,0x416,0x417,0x418,0x419,0x41A,0x41B,0x41C,0x41D,0x41E,0x41F,0x420,0x421,0x422,0x423,0x424,0x425,0x426,0x427,0x428,0x429,0x42A,0x42B,0x42C,0x42D,0x42E,0x42F,0x402,0x403,0x404,0x405,0x406,0x407,0x408,0x409,0x40A,0x40B,0x40C,0x40E,0x40F,0x460,0x462,0x464,0x466,0x468,0x46A,0x46C,0x46E,0x470,0x472,0x474,0x476,0x478,0x47A,0x47C,0x47E,0x480,0x490,0x492,0x494,0x496,0x498,0x49A,0x49C,0x49E,0x4A0,0x4A2,0x4A4,0x4A6,0x4A8,0x4AA,0x4AC,0x4AE,0x4B0,0x4B2,0x4B4,0x4B6,0x4B8,0x4BA,0x4BC,0x4BE,0x4C1,0x4C3,0x5C7,0x4D0,0x4D2,0x4D4,0x4D6,0x4D8,0x4DA,0x4DC,0x4DE,0x4E0,0x4E2,0x4E4,0x4E6,0x4E8,0x4EA,0x4EC,0x4EE,0x4F0,0x4F2,0x4F4,0x4F8, + 0x531,0x532,0x533,0x534,0x535,0x536,0x537,0x538,0x539,0x53A,0x53B,0x53C,0x53D,0x53E,0x53F,0x540,0x541,0x542,0x543,0x544,0x545,0x546,0x547,0x548,0x549,0x54A,0x54B,0x54C,0x54D,0x54E,0x54F,0x550,0x551,0x552,0x553,0x554,0x555,0x556, + 0x1E00,0x1E02,0x1E04,0x1E06,0x1E08,0x1E0A,0x1E0C,0x1E0E,0x1E10,0x1E12,0x1E14,0x1E16,0x1E18,0x1E1A,0x1E1C,0x1E1E,0x1E20,0x1E22,0x1E24,0x1E26,0x1E28,0x1E2A,0x1E2C,0x1E2E,0x1E30,0x1E32,0x1E34,0x1E36,0x1E38,0x1E3A,0x1E3C,0x1E3E,0x1E40,0x1E42,0x1E44,0x1E46,0x1E48,0x1E4A,0x1E4C,0x1E4E,0x1E50,0x1E52,0x1E54,0x1E56,0x1E58,0x1E5A,0x1E5C,0x1E5E,0x1E60,0x1E62,0x1E64,0x1E66,0x1E68,0x1E6A,0x1E6C,0x1E6E,0x1E70,0x1E72,0x1E74,0x1E76,0x1E78,0x1E7A,0x1E7C,0x1E7E,0x1E80,0x1E82,0x1E84,0x1E86,0x1E88,0x1E8A,0x1E8C,0x1E8E,0x1E90,0x1E92,0x1E94,0x1E96,0x1E98,0x1E9A,0x1E9C,0x1E9E,0x1EA0,0x1EA2,0x1EA4,0x1EA6,0x1EA8,0x1EAA,0x1EAC,0x1EAE,0x1EB0,0x1EB2,0x1EB4,0x1EB6,0x1EB8,0x1EBA,0x1EBC,0x1EBE,0x1EC0,0x1EC2,0x1EC4,0x1EC6,0x1EC8,0x1ECA,0x1ECC,0x1ECE,0x1ED0,0x1ED2,0x1ED4,0x1ED6,0x1ED8,0x1EDA,0x1EDC,0x1EDE,0x1EE0,0x1EE2,0x1EE4,0x1EE6,0x1EE8,0x1EEA,0x1EEC,0x1EEE,0x1EF0,0x1EF2,0x1EF4,0x1EF6,0x1EF8, + 0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,0x2167,0x2168,0x2169,0x216A,0x216B,0x216C,0x216D,0x216E,0x216F, + 0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28,0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38,0xFF39,0xFF3A + }; + UINT i, n, hi, li; - for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + if (chr < 0x80) { /* ASCII characters (acceleration) */ + if (chr >= 0x61 && chr <= 0x7A) chr -= 0x20; - return tbl_lower[i] ? tbl_upper[i] : chr; + } else { /* Extended characters */ + n = 12; li = 0; hi = sizeof lower / sizeof lower[0]; + do { + i = li + (hi - li) / 2; + if (chr == lower[i]) break; + if (chr > lower[i]) li = i; else hi = i; + } while (--n); + if (n) chr = upper[i]; + } + + return chr; } + diff --git a/firmware/chibios-portapack/ext/fatfs/src/option/cc950.c b/firmware/chibios-portapack/ext/fatfs/src/option/cc950.c index d914b6d8..064f5ca5 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/option/cc950.c +++ b/firmware/chibios-portapack/ext/fatfs/src/option/cc950.c @@ -1,6 +1,5 @@ /*------------------------------------------------------------------------*/ -/* Unicode - OEM code bidirectional converter (C)ChaN, 2009 */ -/* */ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2015 */ /* CP950 (Traditional Chinese Big5) */ /*------------------------------------------------------------------------*/ @@ -6778,7 +6777,7 @@ const WCHAR oem2uni[] = { WCHAR ff_convert ( /* Converted code, 0 means conversion error */ WCHAR chr, /* Character code to be converted */ - UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ + UINT dir /* 0: Unicode to OEM code, 1: OEM code to Unicode */ ) { const WCHAR *p; @@ -6789,10 +6788,10 @@ WCHAR ff_convert ( /* Converted code, 0 means conversion error */ if (chr < 0x80) { /* ASCII */ c = chr; } else { - if (dir) { /* OEMCP to unicode */ + if (dir) { /* OEM code to unicode */ p = oem2uni; hi = sizeof oem2uni / 4 - 1; - } else { /* Unicode to OEMCP */ + } else { /* Unicode to OEM code */ p = uni2oem; hi = sizeof uni2oem / 4 - 1; } @@ -6814,16 +6813,48 @@ WCHAR ff_convert ( /* Converted code, 0 means conversion error */ -WCHAR ff_wtoupper ( /* Upper converted character */ - WCHAR chr /* Input character */ +WCHAR ff_wtoupper ( + WCHAR chr /* Unicode character to be upper converted */ ) { - static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; - static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; - int i; + static const WCHAR lower[] = { /* Lower case characters to be converted */ + /* Latin Supplement */ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, + /* Latin Extended-A */ 0x101,0x103,0x105,0x107,0x109,0x10B,0x10D,0x10F,0x111,0x113,0x115,0x117,0x119,0x11B,0x11D,0x11F,0x121,0x123,0x125,0x127,0x129,0x12B,0x12D,0x12F,0x131,0x133,0x135,0x137,0x13A,0x13C,0x13E,0x140,0x142,0x144,0x146,0x148,0x14B,0x14D,0x14F,0x151,0x153,0x155,0x157,0x159,0x15B,0x15D,0x15F,0x161,0x163,0x165,0x167,0x169,0x16B,0x16D,0x16F,0x171,0x173,0x175,0x177,0x17A,0x17C,0x17E, + /* Latin Extended-B */ 0x183,0x185,0x188,0x18C,0x192,0x199,0x1A1,0x1A3,0x1A8,0x1AD,0x1B0,0x1B4,0x1B6,0x1B9,0x1BD,0x1C6,0x1C9,0x1CC,0x1CE,0x1D0,0x1D2,0x1D4,0x1D6,0x1D8,0x1DA,0x1DC,0x1DD,0x1DF,0x1E1,0x1E3,0x1E5,0x1E7,0x1E9,0x1EB,0x1ED,0x1EF,0x1F3,0x1F5,0x1FB,0x1FD,0x1FF,0x201,0x203,0x205,0x207,0x209,0x20B,0x20D,0x20F,0x211,0x213,0x215,0x217, + /* Greek, Coptic */ 0x3B1,0x3B2,0x3B3,0x3B4,0x3B5,0x3B6,0x3B7,0x3B8,0x3B9,0x3BA,0x3BB,0x3BC,0x3BD,0x3BE,0x3BF,0x3C0,0x3C1,0x3C3,0x3C4,0x3C5,0x3C6,0x3C7,0x3C8,0x3C9,0x3CA,0x3CB,0x3CC,0x3CD,0x3CE,0x3E3,0x3E5,0x3E7,0x3E9,0x3EB, + /* Cyrillic */ 0x430,0x431,0x432,0x433,0x434,0x435,0x436,0x437,0x438,0x439,0x43A,0x43B,0x43C,0x43D,0x43E,0x43F,0x440,0x441,0x442,0x443,0x444,0x445,0x446,0x447,0x448,0x449,0x44A,0x44B,0x44C,0x44D,0x44E,0x44F,0x452,0x453,0x454,0x455,0x456,0x457,0x458,0x459,0x45A,0x45B,0x45C,0x45E,0x45F,0x461,0x463,0x465,0x467,0x469,0x46B,0x46D,0x46F,0x471,0x473,0x475,0x477,0x479,0x47B,0x47D,0x47F,0x481,0x491,0x493,0x495,0x497,0x499,0x49B,0x49D,0x49F,0x4A1,0x4A3,0x4A5,0x4A7,0x4A9,0x4AB,0x4AD,0x4AF,0x4B1,0x4B3,0x4B5,0x4B7,0x4B9,0x4BB,0x4BD,0x4BF,0x4C2,0x4C4,0x4C8,0x4D1,0x4D3,0x4D5,0x4D7,0x4D9,0x4DB,0x4DD,0x4DF,0x4E1,0x4E3,0x4E5,0x4E7,0x4E9,0x4EB,0x4ED,0x4EF,0x4F1,0x4F3,0x4F5,0x4F9, + /* Armenian */ 0x561,0x562,0x563,0x564,0x565,0x566,0x567,0x568,0x569,0x56A,0x56B,0x56C,0x56D,0x56E,0x56F,0x570,0x571,0x572,0x573,0x574,0x575,0x576,0x577,0x578,0x579,0x57A,0x57B,0x57C,0x57D,0x57E,0x57F,0x580,0x581,0x582,0x583,0x584,0x585,0x586, + /* Latin Extended Additional */ 0x1E01,0x1E03,0x1E05,0x1E07,0x1E09,0x1E0B,0x1E0D,0x1E0F,0x1E11,0x1E13,0x1E15,0x1E17,0x1E19,0x1E1B,0x1E1D,0x1E1F,0x1E21,0x1E23,0x1E25,0x1E27,0x1E29,0x1E2B,0x1E2D,0x1E2F,0x1E31,0x1E33,0x1E35,0x1E37,0x1E39,0x1E3B,0x1E3D,0x1E3F,0x1E41,0x1E43,0x1E45,0x1E47,0x1E49,0x1E4B,0x1E4D,0x1E4F,0x1E51,0x1E53,0x1E55,0x1E57,0x1E59,0x1E5B,0x1E5D,0x1E5F,0x1E61,0x1E63,0x1E65,0x1E67,0x1E69,0x1E6B,0x1E6D,0x1E6F,0x1E71,0x1E73,0x1E75,0x1E77,0x1E79,0x1E7B,0x1E7D,0x1E7F,0x1E81,0x1E83,0x1E85,0x1E87,0x1E89,0x1E8B,0x1E8D,0x1E8F,0x1E91,0x1E93,0x1E95,0x1E97,0x1E99,0x1E9B,0x1E9D,0x1E9F,0x1EA1,0x1EA3,0x1EA5,0x1EA7,0x1EA9,0x1EAB,0x1EAD,0x1EAF,0x1EB1,0x1EB3,0x1EB5,0x1EB7,0x1EB9,0x1EBB,0x1EBD,0x1EBF,0x1EC1,0x1EC3,0x1EC5,0x1EC7,0x1EC9,0x1ECB,0x1ECD,0x1ECF,0x1ED1,0x1ED3,0x1ED5,0x1ED7,0x1ED9,0x1EDB,0x1EDD,0x1EDF,0x1EE1,0x1EE3,0x1EE5,0x1EE7,0x1EE9,0x1EEB,0x1EED,0x1EEF,0x1EF1,0x1EF3,0x1EF5,0x1EF7,0x1EF9, + /* Number forms */ 0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176,0x2177,0x2178,0x2179,0x217A,0x217B,0x217C,0x217D,0x217E,0x217F, + /* Full-width */ 0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57,0xFF58,0xFF59,0xFF5A + }; + static const WCHAR upper[] = { /* Upper case characters correspond to lower[] */ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x178, + 0x100,0x102,0x104,0x106,0x108,0x10A,0x10C,0x10E,0x110,0x112,0x114,0x116,0x118,0x11A,0x11C,0x11E,0x120,0x122,0x124,0x126,0x128,0x12A,0x12C,0x12E,0x130,0x132,0x134,0x136,0x139,0x13B,0x13D,0x13F,0x141,0x143,0x145,0x147,0x14A,0x14C,0x14E,0x150,0x152,0x154,0x156,0x158,0x15A,0x15C,0x15E,0x160,0x162,0x164,0x166,0x168,0x16A,0x16C,0x16E,0x170,0x172,0x174,0x176,0x179,0x17B,0x17D, + 0x182,0x184,0x187,0x18B,0x191,0x198,0x1A0,0x1A2,0x1A7,0x1AC,0x1AF,0x1B3,0x1B5,0x1B8,0x1BC,0x1C4,0x1C7,0x1CA,0x1CD,0x1CF,0x1D1,0x1D3,0x1D5,0x1D7,0x1D9,0x1DB,0x18E,0x1DE,0x1E0,0x1E2,0x1E4,0x1E6,0x1E8,0x1EA,0x1EC,0x1EE,0x1F1,0x1F4,0x1FA,0x1FC,0x1FE,0x200,0x202,0x204,0x206,0x208,0x20A,0x20C,0x20E,0x210,0x212,0x214,0x216, + 0x391,0x392,0x393,0x394,0x395,0x396,0x397,0x398,0x399,0x39A,0x39B,0x39C,0x39D,0x39E,0x39F,0x3A0,0x3A1,0x3A3,0x3A4,0x3A5,0x3A6,0x3A7,0x3A8,0x3A9,0x3AA,0x3AB,0x38C,0x38E,0x38F,0x3E2,0x3E4,0x3E6,0x3E8,0x3EA, + 0x410,0x411,0x412,0x413,0x414,0x415,0x416,0x417,0x418,0x419,0x41A,0x41B,0x41C,0x41D,0x41E,0x41F,0x420,0x421,0x422,0x423,0x424,0x425,0x426,0x427,0x428,0x429,0x42A,0x42B,0x42C,0x42D,0x42E,0x42F,0x402,0x403,0x404,0x405,0x406,0x407,0x408,0x409,0x40A,0x40B,0x40C,0x40E,0x40F,0x460,0x462,0x464,0x466,0x468,0x46A,0x46C,0x46E,0x470,0x472,0x474,0x476,0x478,0x47A,0x47C,0x47E,0x480,0x490,0x492,0x494,0x496,0x498,0x49A,0x49C,0x49E,0x4A0,0x4A2,0x4A4,0x4A6,0x4A8,0x4AA,0x4AC,0x4AE,0x4B0,0x4B2,0x4B4,0x4B6,0x4B8,0x4BA,0x4BC,0x4BE,0x4C1,0x4C3,0x5C7,0x4D0,0x4D2,0x4D4,0x4D6,0x4D8,0x4DA,0x4DC,0x4DE,0x4E0,0x4E2,0x4E4,0x4E6,0x4E8,0x4EA,0x4EC,0x4EE,0x4F0,0x4F2,0x4F4,0x4F8, + 0x531,0x532,0x533,0x534,0x535,0x536,0x537,0x538,0x539,0x53A,0x53B,0x53C,0x53D,0x53E,0x53F,0x540,0x541,0x542,0x543,0x544,0x545,0x546,0x547,0x548,0x549,0x54A,0x54B,0x54C,0x54D,0x54E,0x54F,0x550,0x551,0x552,0x553,0x554,0x555,0x556, + 0x1E00,0x1E02,0x1E04,0x1E06,0x1E08,0x1E0A,0x1E0C,0x1E0E,0x1E10,0x1E12,0x1E14,0x1E16,0x1E18,0x1E1A,0x1E1C,0x1E1E,0x1E20,0x1E22,0x1E24,0x1E26,0x1E28,0x1E2A,0x1E2C,0x1E2E,0x1E30,0x1E32,0x1E34,0x1E36,0x1E38,0x1E3A,0x1E3C,0x1E3E,0x1E40,0x1E42,0x1E44,0x1E46,0x1E48,0x1E4A,0x1E4C,0x1E4E,0x1E50,0x1E52,0x1E54,0x1E56,0x1E58,0x1E5A,0x1E5C,0x1E5E,0x1E60,0x1E62,0x1E64,0x1E66,0x1E68,0x1E6A,0x1E6C,0x1E6E,0x1E70,0x1E72,0x1E74,0x1E76,0x1E78,0x1E7A,0x1E7C,0x1E7E,0x1E80,0x1E82,0x1E84,0x1E86,0x1E88,0x1E8A,0x1E8C,0x1E8E,0x1E90,0x1E92,0x1E94,0x1E96,0x1E98,0x1E9A,0x1E9C,0x1E9E,0x1EA0,0x1EA2,0x1EA4,0x1EA6,0x1EA8,0x1EAA,0x1EAC,0x1EAE,0x1EB0,0x1EB2,0x1EB4,0x1EB6,0x1EB8,0x1EBA,0x1EBC,0x1EBE,0x1EC0,0x1EC2,0x1EC4,0x1EC6,0x1EC8,0x1ECA,0x1ECC,0x1ECE,0x1ED0,0x1ED2,0x1ED4,0x1ED6,0x1ED8,0x1EDA,0x1EDC,0x1EDE,0x1EE0,0x1EE2,0x1EE4,0x1EE6,0x1EE8,0x1EEA,0x1EEC,0x1EEE,0x1EF0,0x1EF2,0x1EF4,0x1EF6,0x1EF8, + 0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,0x2167,0x2168,0x2169,0x216A,0x216B,0x216C,0x216D,0x216E,0x216F, + 0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28,0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38,0xFF39,0xFF3A + }; + UINT i, n, hi, li; - for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + if (chr < 0x80) { /* ASCII characters (acceleration) */ + if (chr >= 0x61 && chr <= 0x7A) chr -= 0x20; - return tbl_lower[i] ? tbl_upper[i] : chr; + } else { /* Extended characters */ + n = 12; li = 0; hi = sizeof lower / sizeof lower[0]; + do { + i = li + (hi - li) / 2; + if (chr == lower[i]) break; + if (chr > lower[i]) li = i; else hi = i; + } while (--n); + if (n) chr = upper[i]; + } + + return chr; } + diff --git a/firmware/chibios-portapack/ext/fatfs/src/option/ccsbcs.c b/firmware/chibios-portapack/ext/fatfs/src/option/ccsbcs.c index b16db303..37f763ef 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/option/ccsbcs.c +++ b/firmware/chibios-portapack/ext/fatfs/src/option/ccsbcs.c @@ -1,28 +1,24 @@ /*------------------------------------------------------------------------*/ -/* Unicode - Local code bidirectional converter (C)ChaN, 2012 */ +/* Unicode - Local code bidirectional converter (C)ChaN, 2015 */ /* (SBCS code pages) */ /*------------------------------------------------------------------------*/ -/* 437 U.S. (OEM) -/ 720 Arabic (OEM) -/ 1256 Arabic (Windows) -/ 737 Greek (OEM) -/ 1253 Greek (Windows) -/ 1250 Central Europe (Windows) -/ 775 Baltic (OEM) -/ 1257 Baltic (Windows) -/ 850 Multilingual Latin 1 (OEM) -/ 852 Latin 2 (OEM) -/ 1252 Latin 1 (Windows) -/ 855 Cyrillic (OEM) -/ 1251 Cyrillic (Windows) -/ 866 Russian (OEM) -/ 857 Turkish (OEM) -/ 1254 Turkish (Windows) -/ 858 Multilingual Latin 1 + Euro (OEM) -/ 862 Hebrew (OEM) -/ 1255 Hebrew (Windows) -/ 874 Thai (OEM, Windows) -/ 1258 Vietnam (OEM, Windows) +/* 437 U.S. +/ 720 Arabic +/ 737 Greek +/ 771 KBL +/ 775 Baltic +/ 850 Latin 1 +/ 852 Latin 2 +/ 855 Cyrillic +/ 857 Turkish +/ 860 Portuguese +/ 861 Icelandic +/ 862 Hebrew +/ 863 Canadian French +/ 864 Arabic +/ 865 Nordic +/ 866 Russian +/ 869 Greek 2 */ #include "../ff.h" @@ -32,475 +28,253 @@ #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP437(0x80-0xFF) to Unicode conversion table */ - 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, - 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, - 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, - 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, - 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, - 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, - 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, - 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, - 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, - 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, - 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 720 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP720(0x80-0xFF) to Unicode conversion table */ - 0x0000, 0x0000, 0x00E9, 0x00E2, 0x0000, 0x00E0, 0x0000, 0x00E7, - 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0651, 0x0652, 0x00F4, 0x00A4, 0x0640, 0x00FB, 0x00F9, - 0x0621, 0x0622, 0x0623, 0x0624, 0x00A3, 0x0625, 0x0626, 0x0627, - 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, - 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x00AB, 0x00BB, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, - 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, - 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0641, 0x00B5, 0x0642, - 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, - 0x2261, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x2248, - 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 + 0x0000, 0x0000, 0x00E9, 0x00E2, 0x0000, 0x00E0, 0x0000, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0651, 0x0652, 0x00F4, 0x00A4, 0x0640, 0x00FB, 0x00F9, 0x0621, 0x0622, 0x0623, 0x0624, 0x00A3, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0641, 0x00B5, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, + 0x2261, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 737 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP737(0x80-0xFF) to Unicode conversion table */ - 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, - 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, - 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, - 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, - 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, - 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, - 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, - 0x03C9, 0x03AC, 0x03AD, 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, - 0x03CB, 0x03CE, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E, - 0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, 0x03AB, 0x00F7, 0x2248, - 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, + 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, + 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03C9, 0x03AC, 0x03AD, 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, 0x03CB, 0x03CE, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E, + 0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, 0x03AB, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 771 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP771(0x80-0xFF) to Unicode conversion table */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x0104, 0x0105, 0x010C, 0x010D, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x0118, 0x0119, 0x0116, 0x0117, 0x012E, 0x012F, 0x0160, 0x0161, 0x0172, 0x0173, 0x016A, 0x016B, 0x017D, 0x017E, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 775 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP775(0x80-0xFF) to Unicode conversion table */ - 0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, - 0x0142, 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5, - 0x00C9, 0x00E6, 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, - 0x015B, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4, - 0x0100, 0x012A, 0x00F3, 0x017B, 0x017C, 0x017A, 0x201D, 0x00A6, - 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x0141, 0x00AB, 0x00BB, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010C, 0x0118, - 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D, - 0x0105, 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, - 0x017E, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, - 0x00D3, 0x00DF, 0x014C, 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, - 0x0136, 0x0137, 0x013B, 0x013C, 0x0146, 0x0112, 0x0145, 0x2019, - 0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x201E, - 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 + 0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, 0x0142, 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4, + 0x0100, 0x012A, 0x00F3, 0x017B, 0x017C, 0x017A, 0x201D, 0x00A6, 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x0141, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010C, 0x0118, 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D, + 0x0105, 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, 0x017E, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x00D3, 0x00DF, 0x014C, 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, 0x0136, 0x0137, 0x013B, 0x013C, 0x0146, 0x0112, 0x0145, 0x2019, + 0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x201E, 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 850 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP850(0x80-0xFF) to Unicode conversion table */ - 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, - 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, - 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, - 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, - 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, - 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, - 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, - 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, - 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, - 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, - 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, - 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, - 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 852 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP852(0x80-0xFF) to Unicode conversion table */ - 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, - 0x0142, 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106, - 0x00C9, 0x0139, 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, - 0x015B, 0x00D6, 0x00DC, 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D, - 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x0104, 0x0105, 0x017D, 0x017E, - 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, 0x015F, 0x00AB, 0x00BB, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x011A, - 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, - 0x0111, 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, - 0x011B, 0x2518, 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580, - 0x00D3, 0x00DF, 0x00D4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, - 0x0154, 0x00DA, 0x0155, 0x0170, 0x00FD, 0x00DD, 0x0163, 0x00B4, - 0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, 0x00A7, 0x00F7, 0x00B8, - 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, 0x25A0, 0x00A0 + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, 0x0142, 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106, + 0x00C9, 0x0139, 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x0104, 0x0105, 0x017D, 0x017E, 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, 0x015F, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x011A, 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x0111, 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, 0x011B, 0x2518, 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, 0x0154, 0x00DA, 0x0155, 0x0170, 0x00FD, 0x00DD, 0x0163, 0x00B4, + 0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 855 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP855(0x80-0xFF) to Unicode conversion table */ - 0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, - 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, - 0x0459, 0x0409, 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, - 0x045E, 0x040E, 0x045F, 0x040F, 0x044E, 0x042E, 0x044A, 0x042A, - 0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, - 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00AB, 0x00BB, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, - 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, - 0x043B, 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, - 0x043F, 0x2518, 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580, - 0x042F, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, - 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044C, 0x042C, 0x2116, - 0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, 0x0448, 0x0428, 0x044D, - 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, 0x25A0, 0x00A0 + 0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, + 0x0459, 0x0409, 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, 0x045E, 0x040E, 0x045F, 0x040F, 0x044E, 0x042E, 0x044A, 0x042A, + 0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x043B, 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, 0x043F, 0x2518, 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580, + 0x042F, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044C, 0x042C, 0x2116, + 0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, 0x0448, 0x0428, 0x044D, 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 857 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP857(0x80-0xFF) to Unicode conversion table */ - 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, - 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5, - 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, - 0x0130, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F, - 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x011E, 0x011F, - 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, - 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, - 0x00BA, 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0x0000, 0x00CD, 0x00CE, - 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, - 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x0000, - 0x00D7, 0x00DA, 0x00DB, 0x00D9, 0x00EC, 0x00FF, 0x00AF, 0x00B4, - 0x00AD, 0x00B1, 0x0000, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, - 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x0130, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x011E, 0x011F, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00BA, 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0x0000, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x0000, 0x00D7, 0x00DA, 0x00DB, 0x00D9, 0x00EC, 0x00FF, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x0000, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 }; -#elif _CODE_PAGE == 858 +#elif _CODE_PAGE == 860 #define _TBLDEF 1 static -const WCHAR Tbl[] = { /* CP858(0x80-0xFF) to Unicode conversion table */ - 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, - 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, - 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, - 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, - 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, - 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, - 0x00A9, 0x2563, 0x2551, 0x2557, 0x2550, 0x00A2, 0x00A5, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, - 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x20AC, 0x00CD, 0x00CE, - 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00C6, 0x00CC, 0x2580, - 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, - 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, - 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, - 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +const WCHAR Tbl[] = { /* CP860(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E3, 0x00E0, 0x00C1, 0x00E7, 0x00EA, 0x00CA, 0x00E8, 0x00CD, 0x00D4, 0x00EC, 0x00C3, 0x00C2, + 0x00C9, 0x00C0, 0x00C8, 0x00F4, 0x00F5, 0x00F2, 0x00DA, 0x00F9, 0x00CC, 0x00D5, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x20A7, 0x00D3, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00D2, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 861 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP861(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00D0, 0x00F0, 0x00DE, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00FE, 0x00FB, 0x00DD, 0x00FD, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00C1, 0x00CD, 0x00D3, 0x00DA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 862 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP862(0x80-0xFF) to Unicode conversion table */ - 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, - 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, - 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, - 0x05E8, 0x05E9, 0x05EA, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, - 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, - 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, - 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, - 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, - 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, - 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, - 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 863 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP863(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00C2, 0x00E0, 0x00B6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x2017, 0x00C0, + 0x00C9, 0x00C8, 0x00CA, 0x00F4, 0x00CB, 0x00CF, 0x00FB, 0x00F9, 0x00A4, 0x00D4, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x00DB, 0x0192, + 0x00A6, 0x00B4, 0x00F3, 0x00FA, 0x00A8, 0x00BB, 0x00B3, 0x00AF, 0x00CE, 0x3210, 0x00AC, 0x00BD, 0x00BC, 0x00BE, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2219, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 864 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP864(0x80-0xFF) to Unicode conversion table */ + 0x00B0, 0x00B7, 0x2219, 0x221A, 0x2592, 0x2500, 0x2502, 0x253C, 0x2524, 0x252C, 0x251C, 0x2534, 0x2510, 0x250C, 0x2514, 0x2518, + 0x03B2, 0x221E, 0x03C6, 0x00B1, 0x00BD, 0x00BC, 0x2248, 0x00AB, 0x00BB, 0xFEF7, 0xFEF8, 0x0000, 0x0000, 0xFEFB, 0xFEFC, 0x0000, + 0x00A0, 0x00AD, 0xFE82, 0x00A3, 0x00A4, 0xFE84, 0x0000, 0x20AC, 0xFE8E, 0xFE8F, 0xFE95, 0xFE99, 0x060C, 0xFE9D, 0xFEA1, 0xFEA5, + 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669, 0xFED1, 0x061B, 0xFEB1, 0xFEB5, 0xFEB9, 0x061F, + 0x00A2, 0xFE80, 0xFE81, 0xFE83, 0xFE85, 0xFECA, 0xFE8B, 0xFE8D, 0xFE91, 0xFE93, 0xFE97, 0xFE9B, 0xFE9F, 0xFEA3, 0xFEA7, 0xFEA9, + 0xFEAB, 0xFEAD, 0xFEAF, 0xFEB3, 0xFEB7, 0xFEBB, 0xFEBF, 0xFEC1, 0xFEC5, 0xFECB, 0xFECF, 0x00A6, 0x00AC, 0x00F7, 0x00D7, 0xFEC9, + 0x0640, 0xFED3, 0xFED7, 0xFEDB, 0xFEDF, 0xFEE3, 0xFEE7, 0xFEEB, 0xFEED, 0xFEEF, 0xFEF3, 0xFEBD, 0xFECC, 0xFECE, 0xFECD, 0xFEE1, + 0xFE7D, 0x0651, 0xFEE5, 0xFEE9, 0xFEEC, 0xFEF0, 0xFEF2, 0xFED0, 0xFED5, 0xFEF5, 0xFEF6, 0xFEDD, 0xFED9, 0xFEF1, 0x25A0, 0x0000 +}; + +#elif _CODE_PAGE == 865 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP865(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C5, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00A4, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 866 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP866(0x80-0xFF) to Unicode conversion table */ - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, - 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, - 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, - 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0 + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0 }; -#elif _CODE_PAGE == 874 +#elif _CODE_PAGE == 869 #define _TBLDEF 1 static -const WCHAR Tbl[] = { /* CP874(0x80-0xFF) to Unicode conversion table */ - 0x20AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x2026, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, - 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F, - 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, - 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F, - 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, - 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F, - 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, - 0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F, - 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, - 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F, - 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, - 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -#elif _CODE_PAGE == 1250 -#define _TBLDEF 1 -static -const WCHAR Tbl[] = { /* CP1250(0x80-0xFF) to Unicode conversion table */ - 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, - 0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179, - 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A, - 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B, - 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C, - 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, - 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, - 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, - 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, - 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, - 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, - 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, - 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 -}; - -#elif _CODE_PAGE == 1251 -#define _TBLDEF 1 -static -const WCHAR Tbl[] = { /* CP1251(0x80-0xFF) to Unicode conversion table */ - 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, - 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, - 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x0000, 0x2111, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, - 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, - 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407, - 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, - 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457, - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F -}; - -#elif _CODE_PAGE == 1252 -#define _TBLDEF 1 -static -const WCHAR Tbl[] = { /* CP1252(0x80-0xFF) to Unicode conversion table */ - 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, - 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000, - 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178, - 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, - 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, - 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, - 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, - 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, - 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, - 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, - 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, - 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF -}; - -#elif _CODE_PAGE == 1253 -#define _TBLDEF 1 -static -const WCHAR Tbl[] = { /* CP1253(0x80-0xFF) to Unicode conversion table */ - 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, - 0x0000, 0x2030, 0x0000, 0x2039, 0x000C, 0x0000, 0x0000, 0x0000, - 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, - 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7, - 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, - 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, - 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, - 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, - 0x03A8, 0x03A9, 0x03AA, 0x03AD, 0x03AC, 0x03AD, 0x03AE, 0x03AF, - 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, - 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, - 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, - 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000 -}; - -#elif _CODE_PAGE == 1254 -#define _TBLDEF 1 -static -const WCHAR Tbl[] = { /* CP1254(0x80-0xFF) to Unicode conversion table */ - 0x20AC, 0x0000, 0x210A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, - 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, - 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, - 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, - 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, - 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, - 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, - 0x00D8, 0x00D9, 0x00DA, 0x00BD, 0x00DC, 0x0130, 0x015E, 0x00DF, - 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, - 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, - 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, - 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF -}; - -#elif _CODE_PAGE == 1255 -#define _TBLDEF 1 -static -const WCHAR Tbl[] = { /* CP1255(0x80-0xFF) to Unicode conversion table */ - 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, - 0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, - 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, - 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, - 0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF, - 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3, - 0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, - 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, - 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, - 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000 -}; - -#elif _CODE_PAGE == 1256 -#define _TBLDEF 1 -static -const WCHAR Tbl[] = { /* CP1256(0x80-0xFF) to Unicode conversion table */ - 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, - 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, - 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA, - 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F, - 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, - 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, - 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, - 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0640, 0x0642, 0x0643, - 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, - 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF, - 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, - 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2 -}; - -#elif _CODE_PAGE == 1257 -#define _TBLDEF 1 -static -const WCHAR Tbl[] = { /* CP1257(0x80-0xFF) to Unicode conversion table */ - 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, - 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8, - 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000, - 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7, - 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, - 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, - 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, - 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, - 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, - 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, - 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, - 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, - 0x0173, 0x014E, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9 -}; - -#elif _CODE_PAGE == 1258 -#define _TBLDEF 1 -static -const WCHAR Tbl[] = { /* CP1258(0x80-0xFF) to Unicode conversion table */ - 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, - 0x02C6, 0x2030, 0x0000, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, - 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x02DC, 0x2122, 0x0000, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, - 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, - 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7, - 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF, - 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7, - 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF, - 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7, - 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF, - 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7, - 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF +const WCHAR Tbl[] = { /* CP869(0x80-0xFF) to Unicode conversion table */ + 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x0386, 0x00B7, 0x00B7, 0x00AC, 0x00A6, 0x2018, 0x2019, 0x0388, 0x2015, 0x0389, + 0x038A, 0x03AA, 0x038C, 0x00B7, 0x00B7, 0x038E, 0x03AB, 0x00A9, 0x038F, 0x00B2, 0x00B3, 0x03AC, 0x00A3, 0x03AD, 0x03AE, 0x03AF, + 0x03CA, 0x0390, 0x03CC, 0x03CD, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x00BD, 0x0398, 0x0399, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x039A, 0x039B, 0x039C, 0x039D, 0x2563, 0x2551, 0x2557, 0x255D, 0x039E, 0x039F, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0A30, 0x03A1, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x03A3, + 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x2518, 0x250C, 0x2588, 0x2584, 0x03B4, 0x03B5, 0x2580, + 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x0384, + 0x00AD, 0x00B1, 0x03C5, 0x03C6, 0x03C7, 0x00A7, 0x03C8, 0x0385, 0x00B0, 0x00A8, 0x03C9, 0x03CB, 0x03B0, 0x03CE, 0x25A0, 0x00A0 }; #endif #if !_TBLDEF || !_USE_LFN -#error This file is not needed in current configuration. Remove from the project. +#error This file is not needed at current configuration. Remove from the project. #endif + + WCHAR ff_convert ( /* Converted character, Returns zero on error */ WCHAR chr, /* Character code to be converted */ - UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ + UINT dir /* 0: Unicode to OEM code, 1: OEM code to Unicode */ ) { WCHAR c; @@ -510,10 +284,10 @@ WCHAR ff_convert ( /* Converted character, Returns zero on error */ c = chr; } else { - if (dir) { /* OEMCP to Unicode */ + if (dir) { /* OEM code to Unicode */ c = (chr >= 0x100) ? 0 : Tbl[chr - 0x80]; - } else { /* Unicode to OEMCP */ + } else { /* Unicode to OEM code */ for (c = 0; c < 0x80; c++) { if (chr == Tbl[c]) break; } @@ -525,16 +299,50 @@ WCHAR ff_convert ( /* Converted character, Returns zero on error */ } -WCHAR ff_wtoupper ( /* Upper converted character */ - WCHAR chr /* Input character */ + + +WCHAR ff_wtoupper ( /* Returns upper converted character */ + WCHAR chr /* Unicode character to be upper converted */ ) { - static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; - static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; - int i; + static const WCHAR lower[] = { /* Lower case characters to be converted */ + /* Latin Supplement */ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, + /* Latin Extended-A */ 0x101,0x103,0x105,0x107,0x109,0x10B,0x10D,0x10F,0x111,0x113,0x115,0x117,0x119,0x11B,0x11D,0x11F,0x121,0x123,0x125,0x127,0x129,0x12B,0x12D,0x12F,0x131,0x133,0x135,0x137,0x13A,0x13C,0x13E,0x140,0x142,0x144,0x146,0x148,0x14B,0x14D,0x14F,0x151,0x153,0x155,0x157,0x159,0x15B,0x15D,0x15F,0x161,0x163,0x165,0x167,0x169,0x16B,0x16D,0x16F,0x171,0x173,0x175,0x177,0x17A,0x17C,0x17E, + /* Latin Extended-B */ 0x183,0x185,0x188,0x18C,0x192,0x199,0x1A1,0x1A3,0x1A8,0x1AD,0x1B0,0x1B4,0x1B6,0x1B9,0x1BD,0x1C6,0x1C9,0x1CC,0x1CE,0x1D0,0x1D2,0x1D4,0x1D6,0x1D8,0x1DA,0x1DC,0x1DD,0x1DF,0x1E1,0x1E3,0x1E5,0x1E7,0x1E9,0x1EB,0x1ED,0x1EF,0x1F3,0x1F5,0x1FB,0x1FD,0x1FF,0x201,0x203,0x205,0x207,0x209,0x20B,0x20D,0x20F,0x211,0x213,0x215,0x217, + /* Greek, Coptic */ 0x3B1,0x3B2,0x3B3,0x3B4,0x3B5,0x3B6,0x3B7,0x3B8,0x3B9,0x3BA,0x3BB,0x3BC,0x3BD,0x3BE,0x3BF,0x3C0,0x3C1,0x3C3,0x3C4,0x3C5,0x3C6,0x3C7,0x3C8,0x3C9,0x3CA,0x3CB,0x3CC,0x3CD,0x3CE,0x3E3,0x3E5,0x3E7,0x3E9,0x3EB, + /* Cyrillic */ 0x430,0x431,0x432,0x433,0x434,0x435,0x436,0x437,0x438,0x439,0x43A,0x43B,0x43C,0x43D,0x43E,0x43F,0x440,0x441,0x442,0x443,0x444,0x445,0x446,0x447,0x448,0x449,0x44A,0x44B,0x44C,0x44D,0x44E,0x44F,0x452,0x453,0x454,0x455,0x456,0x457,0x458,0x459,0x45A,0x45B,0x45C,0x45E,0x45F,0x461,0x463,0x465,0x467,0x469,0x46B,0x46D,0x46F,0x471,0x473,0x475,0x477,0x479,0x47B,0x47D,0x47F,0x481,0x491,0x493,0x495,0x497,0x499,0x49B,0x49D,0x49F,0x4A1,0x4A3,0x4A5,0x4A7,0x4A9,0x4AB,0x4AD,0x4AF,0x4B1,0x4B3,0x4B5,0x4B7,0x4B9,0x4BB,0x4BD,0x4BF,0x4C2,0x4C4,0x4C8,0x4D1,0x4D3,0x4D5,0x4D7,0x4D9,0x4DB,0x4DD,0x4DF,0x4E1,0x4E3,0x4E5,0x4E7,0x4E9,0x4EB,0x4ED,0x4EF,0x4F1,0x4F3,0x4F5,0x4F9, + /* Armenian */ 0x561,0x562,0x563,0x564,0x565,0x566,0x567,0x568,0x569,0x56A,0x56B,0x56C,0x56D,0x56E,0x56F,0x570,0x571,0x572,0x573,0x574,0x575,0x576,0x577,0x578,0x579,0x57A,0x57B,0x57C,0x57D,0x57E,0x57F,0x580,0x581,0x582,0x583,0x584,0x585,0x586, + /* Latin Extended Additional */ 0x1E01,0x1E03,0x1E05,0x1E07,0x1E09,0x1E0B,0x1E0D,0x1E0F,0x1E11,0x1E13,0x1E15,0x1E17,0x1E19,0x1E1B,0x1E1D,0x1E1F,0x1E21,0x1E23,0x1E25,0x1E27,0x1E29,0x1E2B,0x1E2D,0x1E2F,0x1E31,0x1E33,0x1E35,0x1E37,0x1E39,0x1E3B,0x1E3D,0x1E3F,0x1E41,0x1E43,0x1E45,0x1E47,0x1E49,0x1E4B,0x1E4D,0x1E4F,0x1E51,0x1E53,0x1E55,0x1E57,0x1E59,0x1E5B,0x1E5D,0x1E5F,0x1E61,0x1E63,0x1E65,0x1E67,0x1E69,0x1E6B,0x1E6D,0x1E6F,0x1E71,0x1E73,0x1E75,0x1E77,0x1E79,0x1E7B,0x1E7D,0x1E7F,0x1E81,0x1E83,0x1E85,0x1E87,0x1E89,0x1E8B,0x1E8D,0x1E8F,0x1E91,0x1E93,0x1E95,0x1E97,0x1E99,0x1E9B,0x1E9D,0x1E9F,0x1EA1,0x1EA3,0x1EA5,0x1EA7,0x1EA9,0x1EAB,0x1EAD,0x1EAF,0x1EB1,0x1EB3,0x1EB5,0x1EB7,0x1EB9,0x1EBB,0x1EBD,0x1EBF,0x1EC1,0x1EC3,0x1EC5,0x1EC7,0x1EC9,0x1ECB,0x1ECD,0x1ECF,0x1ED1,0x1ED3,0x1ED5,0x1ED7,0x1ED9,0x1EDB,0x1EDD,0x1EDF,0x1EE1,0x1EE3,0x1EE5,0x1EE7,0x1EE9,0x1EEB,0x1EED,0x1EEF,0x1EF1,0x1EF3,0x1EF5,0x1EF7,0x1EF9, + /* Number forms */ 0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176,0x2177,0x2178,0x2179,0x217A,0x217B,0x217C,0x217D,0x217E,0x217F, + /* Full-width */ 0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57,0xFF58,0xFF59,0xFF5A + }; + static const WCHAR upper[] = { /* Upper case characters correspond to lower[] */ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x178, + 0x100,0x102,0x104,0x106,0x108,0x10A,0x10C,0x10E,0x110,0x112,0x114,0x116,0x118,0x11A,0x11C,0x11E,0x120,0x122,0x124,0x126,0x128,0x12A,0x12C,0x12E,0x130,0x132,0x134,0x136,0x139,0x13B,0x13D,0x13F,0x141,0x143,0x145,0x147,0x14A,0x14C,0x14E,0x150,0x152,0x154,0x156,0x158,0x15A,0x15C,0x15E,0x160,0x162,0x164,0x166,0x168,0x16A,0x16C,0x16E,0x170,0x172,0x174,0x176,0x179,0x17B,0x17D, + 0x182,0x184,0x187,0x18B,0x191,0x198,0x1A0,0x1A2,0x1A7,0x1AC,0x1AF,0x1B3,0x1B5,0x1B8,0x1BC,0x1C4,0x1C7,0x1CA,0x1CD,0x1CF,0x1D1,0x1D3,0x1D5,0x1D7,0x1D9,0x1DB,0x18E,0x1DE,0x1E0,0x1E2,0x1E4,0x1E6,0x1E8,0x1EA,0x1EC,0x1EE,0x1F1,0x1F4,0x1FA,0x1FC,0x1FE,0x200,0x202,0x204,0x206,0x208,0x20A,0x20C,0x20E,0x210,0x212,0x214,0x216, + 0x391,0x392,0x393,0x394,0x395,0x396,0x397,0x398,0x399,0x39A,0x39B,0x39C,0x39D,0x39E,0x39F,0x3A0,0x3A1,0x3A3,0x3A4,0x3A5,0x3A6,0x3A7,0x3A8,0x3A9,0x3AA,0x3AB,0x38C,0x38E,0x38F,0x3E2,0x3E4,0x3E6,0x3E8,0x3EA, + 0x410,0x411,0x412,0x413,0x414,0x415,0x416,0x417,0x418,0x419,0x41A,0x41B,0x41C,0x41D,0x41E,0x41F,0x420,0x421,0x422,0x423,0x424,0x425,0x426,0x427,0x428,0x429,0x42A,0x42B,0x42C,0x42D,0x42E,0x42F,0x402,0x403,0x404,0x405,0x406,0x407,0x408,0x409,0x40A,0x40B,0x40C,0x40E,0x40F,0x460,0x462,0x464,0x466,0x468,0x46A,0x46C,0x46E,0x470,0x472,0x474,0x476,0x478,0x47A,0x47C,0x47E,0x480,0x490,0x492,0x494,0x496,0x498,0x49A,0x49C,0x49E,0x4A0,0x4A2,0x4A4,0x4A6,0x4A8,0x4AA,0x4AC,0x4AE,0x4B0,0x4B2,0x4B4,0x4B6,0x4B8,0x4BA,0x4BC,0x4BE,0x4C1,0x4C3,0x5C7,0x4D0,0x4D2,0x4D4,0x4D6,0x4D8,0x4DA,0x4DC,0x4DE,0x4E0,0x4E2,0x4E4,0x4E6,0x4E8,0x4EA,0x4EC,0x4EE,0x4F0,0x4F2,0x4F4,0x4F8, + 0x531,0x532,0x533,0x534,0x535,0x536,0x537,0x538,0x539,0x53A,0x53B,0x53C,0x53D,0x53E,0x53F,0x540,0x541,0x542,0x543,0x544,0x545,0x546,0x547,0x548,0x549,0x54A,0x54B,0x54C,0x54D,0x54E,0x54F,0x550,0x551,0x552,0x553,0x554,0x555,0x556, + 0x1E00,0x1E02,0x1E04,0x1E06,0x1E08,0x1E0A,0x1E0C,0x1E0E,0x1E10,0x1E12,0x1E14,0x1E16,0x1E18,0x1E1A,0x1E1C,0x1E1E,0x1E20,0x1E22,0x1E24,0x1E26,0x1E28,0x1E2A,0x1E2C,0x1E2E,0x1E30,0x1E32,0x1E34,0x1E36,0x1E38,0x1E3A,0x1E3C,0x1E3E,0x1E40,0x1E42,0x1E44,0x1E46,0x1E48,0x1E4A,0x1E4C,0x1E4E,0x1E50,0x1E52,0x1E54,0x1E56,0x1E58,0x1E5A,0x1E5C,0x1E5E,0x1E60,0x1E62,0x1E64,0x1E66,0x1E68,0x1E6A,0x1E6C,0x1E6E,0x1E70,0x1E72,0x1E74,0x1E76,0x1E78,0x1E7A,0x1E7C,0x1E7E,0x1E80,0x1E82,0x1E84,0x1E86,0x1E88,0x1E8A,0x1E8C,0x1E8E,0x1E90,0x1E92,0x1E94,0x1E96,0x1E98,0x1E9A,0x1E9C,0x1E9E,0x1EA0,0x1EA2,0x1EA4,0x1EA6,0x1EA8,0x1EAA,0x1EAC,0x1EAE,0x1EB0,0x1EB2,0x1EB4,0x1EB6,0x1EB8,0x1EBA,0x1EBC,0x1EBE,0x1EC0,0x1EC2,0x1EC4,0x1EC6,0x1EC8,0x1ECA,0x1ECC,0x1ECE,0x1ED0,0x1ED2,0x1ED4,0x1ED6,0x1ED8,0x1EDA,0x1EDC,0x1EDE,0x1EE0,0x1EE2,0x1EE4,0x1EE6,0x1EE8,0x1EEA,0x1EEC,0x1EEE,0x1EF0,0x1EF2,0x1EF4,0x1EF6,0x1EF8, + 0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,0x2167,0x2168,0x2169,0x216A,0x216B,0x216C,0x216D,0x216E,0x216F, + 0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28,0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38,0xFF39,0xFF3A + }; + UINT i, n, hi, li; - for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + if (chr < 0x80) { /* ASCII characters (acceleration) */ + if (chr >= 0x61 && chr <= 0x7A) chr -= 0x20; - return tbl_lower[i] ? tbl_upper[i] : chr; + } else { /* Non ASCII characters (table search) */ + n = 12; li = 0; hi = sizeof lower / sizeof lower[0]; + do { + i = li + (hi - li) / 2; + if (chr == lower[i]) break; + if (chr > lower[i]) li = i; else hi = i; + } while (--n); + if (n) chr = upper[i]; + } + + return chr; } + diff --git a/firmware/chibios-portapack/ext/fatfs/src/option/unicode.c b/firmware/chibios-portapack/ext/fatfs/src/option/unicode.c index 22e0320a..170e2e09 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/option/unicode.c +++ b/firmware/chibios-portapack/ext/fatfs/src/option/unicode.c @@ -10,7 +10,7 @@ #include "cc949.c" #elif _CODE_PAGE == 950 /* Traditional Chinese Big5 */ #include "cc950.c" -#else /* Small character-set */ +#else /* Single Byte Character-Set */ #include "ccsbcs.c" #endif diff --git a/firmware/chibios-portapack/ext/fatfs/src/patch1.patch b/firmware/chibios-portapack/ext/fatfs/src/patch1.patch deleted file mode 100644 index 2082b06f..00000000 --- a/firmware/chibios-portapack/ext/fatfs/src/patch1.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- ff_patch1.c Thu Nov 13 21:16:07 2014 -+++ ff_patch1.c Wed Nov 26 19:42:01 2014 -@@ -164,6 +164,9 @@ - - /* Timestamp feature */ --#if _FS_NORTC --#define GET_FATTIME() ((DWORD)_NORTC_YEAR << 25 | (DWORD)_NORTC_MON << 21 | (DWORD)_NORTC_MDAY << 16) -+#if _FS_NORTC == 1 -+#if _NORTC_YEAR < 1980 || _NORTC_YEAR > 2107 || _NORTC_MON < 1 || _NORTC_MON > 12 || _NORTC_MDAY < 1 || _NORTC_MDAY > 31 -+#error Invalid _FS_NORTC settings -+#endif -+#define GET_FATTIME() ((DWORD)(_NORTC_YEAR - 1980) << 25 | (DWORD)_NORTC_MON << 21 | (DWORD)_NORTC_MDAY << 16) - #else - #define GET_FATTIME() get_fattime() From 95361b003603e323a6f800c0c39739c7da68f622 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 19 Apr 2016 09:52:38 -0700 Subject: [PATCH 155/164] Rename ffconf.h -> ffconf_template.h To avoid #include problems with ffconf.h inside individual firmware executable projects. --- .../ext/fatfs/src/{ffconf.h => ffconf_template.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename firmware/chibios-portapack/ext/fatfs/src/{ffconf.h => ffconf_template.h} (100%) diff --git a/firmware/chibios-portapack/ext/fatfs/src/ffconf.h b/firmware/chibios-portapack/ext/fatfs/src/ffconf_template.h similarity index 100% rename from firmware/chibios-portapack/ext/fatfs/src/ffconf.h rename to firmware/chibios-portapack/ext/fatfs/src/ffconf_template.h From 75cf0c2f4e46f38daa44b31cd8b25cb83451e05f Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 19 Apr 2016 10:09:17 -0700 Subject: [PATCH 156/164] Update ffconf.h Had to change codepage to 437 due to deprication of prior codepage 1252. --- firmware/application/ffconf.h | 552 +++++++++++++++++----------------- 1 file changed, 279 insertions(+), 273 deletions(-) diff --git a/firmware/application/ffconf.h b/firmware/application/ffconf.h index e2bb33b3..99f80701 100644 --- a/firmware/application/ffconf.h +++ b/firmware/application/ffconf.h @@ -1,273 +1,279 @@ -/* CHIBIOS FIX */ -#include "ch.h" - -/*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module configuration file R0.10c (C)ChaN, 2014 -/---------------------------------------------------------------------------*/ - -#define _FFCONF 80376 /* Revision ID */ - -/*---------------------------------------------------------------------------/ -/ Functions and Buffer Configurations -/---------------------------------------------------------------------------*/ - -#define _FS_TINY 0 -/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) -/ At the tiny configuration, size of the file object (FIL) is reduced _MAX_SS -/ bytes. Instead of private sector buffer eliminated from the file object, -/ common sector buffer in the file system object (FATFS) is used for the file -/ data transfer. */ - - -#define _FS_READONLY 0 -/* This option switches read-only configuration. (0:Read/Write or 1:Read-only) -/ Read-only configuration removes basic writing API functions, f_write(), -/ f_sync(), f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), -/ f_getfree() and optional writing functions as well. */ - - -#define _FS_MINIMIZE 0 -/* This option defines minimization level to remove some API functions. -/ -/ 0: All basic functions are enabled. -/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_chmod(), f_utime(), -/ f_truncate() and f_rename() function are removed. -/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. -/ 3: f_lseek() function is removed in addition to 2. */ - - -#define _USE_STRFUNC 1 -/* This option switches string functions, f_gets(), f_putc(), f_puts() and -/ f_printf(). -/ -/ 0: Disable string functions. -/ 1: Enable without LF-CRLF conversion. -/ 2: Enable with LF-CRLF conversion. */ - - -#define _USE_MKFS 0 -/* This option switches f_mkfs() function. (0:Disable or 1:Enable) -/ To enable it, also _FS_READONLY need to be set to 0. */ - - -#define _USE_FASTSEEK 1 -/* This option switches fast seek feature. (0:Disable or 1:Enable) */ - - -#define _USE_LABEL 0 -/* This option switches volume label functions, f_getlabel() and f_setlabel(). -/ (0:Disable or 1:Enable) */ - - -#define _USE_FORWARD 0 -/* This option switches f_forward() function. (0:Disable or 1:Enable) */ -/* To enable it, also _FS_TINY need to be set to 1. */ - - -/*---------------------------------------------------------------------------/ -/ Locale and Namespace Configurations -/---------------------------------------------------------------------------*/ - -#define _CODE_PAGE 1252 -/* This option specifies the OEM code page to be used on the target system. -/ Incorrect setting of the code page can cause a file open failure. -/ -/ 932 - Japanese Shift_JIS (DBCS, OEM, Windows) -/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) -/ 949 - Korean (DBCS, OEM, Windows) -/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) -/ 1250 - Central Europe (Windows) -/ 1251 - Cyrillic (Windows) -/ 1252 - Latin 1 (Windows) -/ 1253 - Greek (Windows) -/ 1254 - Turkish (Windows) -/ 1255 - Hebrew (Windows) -/ 1256 - Arabic (Windows) -/ 1257 - Baltic (Windows) -/ 1258 - Vietnam (OEM, Windows) -/ 437 - U.S. (OEM) -/ 720 - Arabic (OEM) -/ 737 - Greek (OEM) -/ 775 - Baltic (OEM) -/ 850 - Multilingual Latin 1 (OEM) -/ 858 - Multilingual Latin 1 + Euro (OEM) -/ 852 - Latin 2 (OEM) -/ 855 - Cyrillic (OEM) -/ 866 - Russian (OEM) -/ 857 - Turkish (OEM) -/ 862 - Hebrew (OEM) -/ 874 - Thai (OEM, Windows) -/ 1 - ASCII (No extended character. Valid for only non-LFN configuration.) */ - - -#define _USE_LFN 0 -#define _MAX_LFN 255 -/* The _USE_LFN option switches the LFN feature. -/ -/ 0: Disable LFN feature. _MAX_LFN has no effect. -/ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. -/ 2: Enable LFN with dynamic working buffer on the STACK. -/ 3: Enable LFN with dynamic working buffer on the HEAP. -/ -/ When enable the LFN feature, Unicode handling functions (option/unicode.c) must -/ be added to the project. The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. -/ When use stack for the working buffer, take care on stack overflow. When use heap -/ memory for the working buffer, memory management functions, ff_memalloc() and -/ ff_memfree(), must be added to the project. */ - - -#define _LFN_UNICODE 0 -/* This option switches character encoding on the API. (0:ANSI/OEM or 1:Unicode) -/ To use Unicode string for the path name, enable LFN feature and set _LFN_UNICODE -/ to 1. This option also affects behavior of string I/O functions. */ - - -#define _STRF_ENCODE 3 -/* When _LFN_UNICODE is 1, this option selects the character encoding on the file to -/ be read/written via string I/O functions, f_gets(), f_putc(), f_puts and f_printf(). -/ -/ 0: ANSI/OEM -/ 1: UTF-16LE -/ 2: UTF-16BE -/ 3: UTF-8 -/ -/ When _LFN_UNICODE is 0, this option has no effect. */ - - -#define _FS_RPATH 0 -/* This option configures relative path feature. -/ -/ 0: Disable relative path feature and remove related functions. -/ 1: Enable relative path feature. f_chdir() and f_chdrive() are available. -/ 2: f_getcwd() function is available in addition to 1. -/ -/ Note that directory items read via f_readdir() are affected by this option. */ - - -/*---------------------------------------------------------------------------/ -/ Drive/Volume Configurations -/---------------------------------------------------------------------------*/ - -#define _VOLUMES 1 -/* Number of volumes (logical drives) to be used. */ - - -#define _STR_VOLUME_ID 0 -#define _VOLUME_STRS "RAM","NAND","CF","SD1","SD2","USB1","USB2","USB3" -/* _STR_VOLUME_ID option switches string volume ID feature. -/ When _STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive -/ number in the path name. _VOLUME_STRS defines the drive ID strings for each -/ logical drives. Number of items must be equal to _VOLUMES. Valid characters for -/ the drive ID strings are: A-Z and 0-9. */ - - -#define _MULTI_PARTITION 0 -/* This option switches multi-partition feature. By default (0), each logical drive -/ number is bound to the same physical drive number and only an FAT volume found on -/ the physical drive will be mounted. When multi-partition feature is enabled (1), -/ each logical drive number is bound to arbitrary physical drive and partition -/ listed in the VolToPart[]. Also f_fdisk() funciton will be enabled. */ - - -#define _MIN_SS 512 -#define _MAX_SS 512 -/* These options configure the range of sector size to be supported. (512, 1024, -/ 2048 or 4096) Always set both 512 for most systems, all type of memory cards and -/ harddisk. But a larger value may be required for on-board flash memory and some -/ type of optical media. When _MAX_SS is larger than _MIN_SS, FatFs is configured -/ to variable sector size and GET_SECTOR_SIZE command must be implemented to the -/ disk_ioctl() function. */ - - -#define _USE_TRIM 0 -/* This option switches ATA-TRIM feature. (0:Disable or 1:Enable) -/ To enable Trim feature, also CTRL_TRIM command should be implemented to the -/ disk_ioctl() function. */ - - -#define _FS_NOFSINFO 0 -/* If you need to know correct free space on the FAT32 volume, set bit 0 of this -/ option, and f_getfree() function at first time after volume mount will force -/ a full FAT scan. Bit 1 controls the use of last allocated cluster number. -/ -/ bit0=0: Use free cluster count in the FSINFO if available. -/ bit0=1: Do not trust free cluster count in the FSINFO. -/ bit1=0: Use last allocated cluster number in the FSINFO if available. -/ bit1=1: Do not trust last allocated cluster number in the FSINFO. -*/ - - - -/*---------------------------------------------------------------------------/ -/ System Configurations -/---------------------------------------------------------------------------*/ - -#define _FS_NORTC 0 -#define _NORTC_MON 11 -#define _NORTC_MDAY 9 -#define _NORTC_YEAR 2014 -/* The _FS_NORTC option switches timestamp feature. If the system does not have -/ an RTC function or valid timestamp is not needed, set _FS_NORTC to 1 to disable -/ the timestamp feature. All objects modified by FatFs will have a fixed timestamp -/ defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR. -/ When timestamp feature is enabled (_FS_NORTC == 0), get_fattime() function need -/ to be added to the project to read current time form RTC. _NORTC_MON, -/ _NORTC_MDAY and _NORTC_YEAR have no effect. -/ These options have no effect at read-only configuration (_FS_READONLY == 1). */ - - -#define _FS_LOCK 0 -/* The _FS_LOCK option switches file lock feature to control duplicated file open -/ and illegal operation to open objects. This option must be 0 when _FS_READONLY -/ is 1. -/ -/ 0: Disable file lock feature. To avoid volume corruption, application program -/ should avoid illegal open, remove and rename to the open objects. -/ >0: Enable file lock feature. The value defines how many files/sub-directories -/ can be opened simultaneously under file lock control. Note that the file -/ lock feature is independent of re-entrancy. */ - - -#define _FS_REENTRANT 1 -#define _FS_TIMEOUT 1000 -#define _SYNC_t Semaphore * -/* The _FS_REENTRANT option switches the re-entrancy (thread safe) of the FatFs -/ module itself. Note that regardless of this option, file access to different -/ volume is always re-entrant and volume control functions, f_mount(), f_mkfs() -/ and f_fdisk() function, are always not re-entrant. Only file/directory access -/ to the same volume is under control of this feature. -/ -/ 0: Disable re-entrancy. _FS_TIMEOUT and _SYNC_t have no effect. -/ 1: Enable re-entrancy. Also user provided synchronization handlers, -/ ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj() -/ function, must be added to the project. Samples are available in -/ option/syscall.c. -/ -/ The _FS_TIMEOUT defines timeout period in unit of time tick. -/ The _SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, -/ SemaphoreHandle_t and etc.. */ - - -#define _WORD_ACCESS 0 -/* The _WORD_ACCESS option is an only platform dependent option. It defines -/ which access method is used to the word data on the FAT volume. -/ -/ 0: Byte-by-byte access. Always compatible with all platforms. -/ 1: Word access. Do not choose this unless under both the following conditions. -/ -/ * Address misaligned memory access is always allowed to ALL instructions. -/ * Byte order on the memory is little-endian. -/ -/ If it is the case, _WORD_ACCESS can also be set to 1 to reduce code size. -/ Following table shows allowable settings of some processor types. -/ -/ ARM7TDMI 0 ColdFire 0 V850E 0 -/ Cortex-M3 0 Z80 0/1 V850ES 0/1 -/ Cortex-M0 0 x86 0/1 TLCS-870 0/1 -/ AVR 0/1 RX600(LE) 0/1 TLCS-900 0/1 -/ AVR32 0 RL78 0 R32C 0 -/ PIC18 0/1 SH-2 0 M16C 0/1 -/ PIC24 0 H8S 0 MSP430 0 -/ PIC32 0 H8/300H 0 8051 0/1 -*/ - +/* CHIBIOS FIX */ +#include "ch.h" + +/*---------------------------------------------------------------------------/ +/ FatFs - FAT file system module configuration file R0.11a (C)ChaN, 2015 +/---------------------------------------------------------------------------*/ + +#define _FFCONF 64180 /* Revision ID */ + +/*---------------------------------------------------------------------------/ +/ Function Configurations +/---------------------------------------------------------------------------*/ + +#define _FS_READONLY 0 +/* This option switches read-only configuration. (0:Read/Write or 1:Read-only) +/ Read-only configuration removes writing API functions, f_write(), f_sync(), +/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() +/ and optional writing functions as well. */ + + +#define _FS_MINIMIZE 0 +/* This option defines minimization level to remove some basic API functions. +/ +/ 0: All basic functions are enabled. +/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_chmod(), f_utime(), +/ f_truncate() and f_rename() function are removed. +/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. +/ 3: f_lseek() function is removed in addition to 2. */ + + +#define _USE_STRFUNC 1 +/* This option switches string functions, f_gets(), f_putc(), f_puts() and +/ f_printf(). +/ +/ 0: Disable string functions. +/ 1: Enable without LF-CRLF conversion. +/ 2: Enable with LF-CRLF conversion. */ + + +#define _USE_FIND 0 +/* This option switches filtered directory read feature and related functions, +/ f_findfirst() and f_findnext(). (0:Disable or 1:Enable) */ + + +#define _USE_MKFS 0 +/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ + + +#define _USE_FASTSEEK 1 +/* This option switches fast seek feature. (0:Disable or 1:Enable) */ + + +#define _USE_LABEL 0 +/* This option switches volume label functions, f_getlabel() and f_setlabel(). +/ (0:Disable or 1:Enable) */ + + +#define _USE_FORWARD 0 +/* This option switches f_forward() function. (0:Disable or 1:Enable) +/ To enable it, also _FS_TINY need to be set to 1. */ + + +/*---------------------------------------------------------------------------/ +/ Locale and Namespace Configurations +/---------------------------------------------------------------------------*/ + +#define _CODE_PAGE 437 +/* This option specifies the OEM code page to be used on the target system. +/ Incorrect setting of the code page can cause a file open failure. +/ +/ 1 - ASCII (No extended character. Non-LFN cfg. only) +/ 437 - U.S. +/ 720 - Arabic +/ 737 - Greek +/ 771 - KBL +/ 775 - Baltic +/ 850 - Latin 1 +/ 852 - Latin 2 +/ 855 - Cyrillic +/ 857 - Turkish +/ 860 - Portuguese +/ 861 - Icelandic +/ 862 - Hebrew +/ 863 - Canadian French +/ 864 - Arabic +/ 865 - Nordic +/ 866 - Russian +/ 869 - Greek 2 +/ 932 - Japanese (DBCS) +/ 936 - Simplified Chinese (DBCS) +/ 949 - Korean (DBCS) +/ 950 - Traditional Chinese (DBCS) +*/ + + +#define _USE_LFN 0 +#define _MAX_LFN 255 +/* The _USE_LFN option switches the LFN feature. +/ +/ 0: Disable LFN feature. _MAX_LFN has no effect. +/ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. +/ 2: Enable LFN with dynamic working buffer on the STACK. +/ 3: Enable LFN with dynamic working buffer on the HEAP. +/ +/ When enable the LFN feature, Unicode handling functions (option/unicode.c) must +/ be added to the project. The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. +/ When use stack for the working buffer, take care on stack overflow. When use heap +/ memory for the working buffer, memory management functions, ff_memalloc() and +/ ff_memfree(), must be added to the project. */ + + +#define _LFN_UNICODE 0 +/* This option switches character encoding on the API. (0:ANSI/OEM or 1:Unicode) +/ To use Unicode string for the path name, enable LFN feature and set _LFN_UNICODE +/ to 1. This option also affects behavior of string I/O functions. */ + + +#define _STRF_ENCODE 3 +/* When _LFN_UNICODE is 1, this option selects the character encoding on the file to +/ be read/written via string I/O functions, f_gets(), f_putc(), f_puts and f_printf(). +/ +/ 0: ANSI/OEM +/ 1: UTF-16LE +/ 2: UTF-16BE +/ 3: UTF-8 +/ +/ When _LFN_UNICODE is 0, this option has no effect. */ + + +#define _FS_RPATH 0 +/* This option configures relative path feature. +/ +/ 0: Disable relative path feature and remove related functions. +/ 1: Enable relative path feature. f_chdir() and f_chdrive() are available. +/ 2: f_getcwd() function is available in addition to 1. +/ +/ Note that directory items read via f_readdir() are affected by this option. */ + + +/*---------------------------------------------------------------------------/ +/ Drive/Volume Configurations +/---------------------------------------------------------------------------*/ + +#define _VOLUMES 1 +/* Number of volumes (logical drives) to be used. */ + + +#define _STR_VOLUME_ID 0 +#define _VOLUME_STRS "RAM","NAND","CF","SD1","SD2","USB1","USB2","USB3" +/* _STR_VOLUME_ID option switches string volume ID feature. +/ When _STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive +/ number in the path name. _VOLUME_STRS defines the drive ID strings for each +/ logical drives. Number of items must be equal to _VOLUMES. Valid characters for +/ the drive ID strings are: A-Z and 0-9. */ + + +#define _MULTI_PARTITION 0 +/* This option switches multi-partition feature. By default (0), each logical drive +/ number is bound to the same physical drive number and only an FAT volume found on +/ the physical drive will be mounted. When multi-partition feature is enabled (1), +/ each logical drive number is bound to arbitrary physical drive and partition +/ listed in the VolToPart[]. Also f_fdisk() funciton will be available. */ + + +#define _MIN_SS 512 +#define _MAX_SS 512 +/* These options configure the range of sector size to be supported. (512, 1024, +/ 2048 or 4096) Always set both 512 for most systems, all type of memory cards and +/ harddisk. But a larger value may be required for on-board flash memory and some +/ type of optical media. When _MAX_SS is larger than _MIN_SS, FatFs is configured +/ to variable sector size and GET_SECTOR_SIZE command must be implemented to the +/ disk_ioctl() function. */ + + +#define _USE_TRIM 0 +/* This option switches ATA-TRIM feature. (0:Disable or 1:Enable) +/ To enable Trim feature, also CTRL_TRIM command should be implemented to the +/ disk_ioctl() function. */ + + +#define _FS_NOFSINFO 0 +/* If you need to know correct free space on the FAT32 volume, set bit 0 of this +/ option, and f_getfree() function at first time after volume mount will force +/ a full FAT scan. Bit 1 controls the use of last allocated cluster number. +/ +/ bit0=0: Use free cluster count in the FSINFO if available. +/ bit0=1: Do not trust free cluster count in the FSINFO. +/ bit1=0: Use last allocated cluster number in the FSINFO if available. +/ bit1=1: Do not trust last allocated cluster number in the FSINFO. +*/ + + + +/*---------------------------------------------------------------------------/ +/ System Configurations +/---------------------------------------------------------------------------*/ + +#define _FS_TINY 0 +/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) +/ At the tiny configuration, size of the file object (FIL) is reduced _MAX_SS +/ bytes. Instead of private sector buffer eliminated from the file object, +/ common sector buffer in the file system object (FATFS) is used for the file +/ data transfer. */ + + +#define _FS_NORTC 0 +#define _NORTC_MON 1 +#define _NORTC_MDAY 1 +#define _NORTC_YEAR 2015 +/* The _FS_NORTC option switches timestamp feature. If the system does not have +/ an RTC function or valid timestamp is not needed, set _FS_NORTC to 1 to disable +/ the timestamp feature. All objects modified by FatFs will have a fixed timestamp +/ defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR. +/ When timestamp feature is enabled (_FS_NORTC == 0), get_fattime() function need +/ to be added to the project to read current time form RTC. _NORTC_MON, +/ _NORTC_MDAY and _NORTC_YEAR have no effect. +/ These options have no effect at read-only configuration (_FS_READONLY == 1). */ + + +#define _FS_LOCK 0 +/* The _FS_LOCK option switches file lock feature to control duplicated file open +/ and illegal operation to open objects. This option must be 0 when _FS_READONLY +/ is 1. +/ +/ 0: Disable file lock feature. To avoid volume corruption, application program +/ should avoid illegal open, remove and rename to the open objects. +/ >0: Enable file lock feature. The value defines how many files/sub-directories +/ can be opened simultaneously under file lock control. Note that the file +/ lock feature is independent of re-entrancy. */ + + +#define _FS_REENTRANT 1 +#define _FS_TIMEOUT 1000 +#define _SYNC_t Semaphore * +/* The _FS_REENTRANT option switches the re-entrancy (thread safe) of the FatFs +/ module itself. Note that regardless of this option, file access to different +/ volume is always re-entrant and volume control functions, f_mount(), f_mkfs() +/ and f_fdisk() function, are always not re-entrant. Only file/directory access +/ to the same volume is under control of this feature. +/ +/ 0: Disable re-entrancy. _FS_TIMEOUT and _SYNC_t have no effect. +/ 1: Enable re-entrancy. Also user provided synchronization handlers, +/ ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj() +/ function, must be added to the project. Samples are available in +/ option/syscall.c. +/ +/ The _FS_TIMEOUT defines timeout period in unit of time tick. +/ The _SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, +/ SemaphoreHandle_t and etc.. A header file for O/S definitions needs to be +/ included somewhere in the scope of ff.c. */ + + +#define _WORD_ACCESS 0 +/* The _WORD_ACCESS option is an only platform dependent option. It defines +/ which access method is used to the word data on the FAT volume. +/ +/ 0: Byte-by-byte access. Always compatible with all platforms. +/ 1: Word access. Do not choose this unless under both the following conditions. +/ +/ * Address misaligned memory access is always allowed to ALL instructions. +/ * Byte order on the memory is little-endian. +/ +/ If it is the case, _WORD_ACCESS can also be set to 1 to reduce code size. +/ Following table shows allowable settings of some type of processors. +/ +/ ARM7TDMI 0 *2 ColdFire 0 *1 V850E 0 *2 +/ Cortex-M3 0 *3 Z80 0/1 V850ES 0/1 +/ Cortex-M0 0 *2 x86 0/1 TLCS-870 0/1 +/ AVR 0/1 RX600(LE) 0/1 TLCS-900 0/1 +/ AVR32 0 *1 RL78 0 *2 R32C 0 *2 +/ PIC18 0/1 SH-2 0 *1 M16C 0/1 +/ PIC24 0 *2 H8S 0 *1 MSP430 0 *2 +/ PIC32 0 *1 H8/300H 0 *1 8051 0/1 +/ +/ *1:Big-endian. +/ *2:Unaligned memory access is not supported. +/ *3:Some compilers generate LDM/STM for mem_cpy function. +*/ + From 6de2df7c99d2c9dbfc6d650d3977afae4e78353e Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 19 Apr 2016 11:57:22 -0700 Subject: [PATCH 157/164] Enable FatFs f_findfirst, f_findnext. --- firmware/application/ffconf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/application/ffconf.h b/firmware/application/ffconf.h index 99f80701..2212ff1e 100644 --- a/firmware/application/ffconf.h +++ b/firmware/application/ffconf.h @@ -37,7 +37,7 @@ / 2: Enable with LF-CRLF conversion. */ -#define _USE_FIND 0 +#define _USE_FIND 1 /* This option switches filtered directory read feature and related functions, / f_findfirst() and f_findnext(). (0:Disable or 1:Enable) */ From 8119980370cb8afc24844ae77869a67f8d1a3bf5 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 20 Apr 2016 09:54:19 -0700 Subject: [PATCH 158/164] Widen capture mode sampling rate, baseband filter. --- firmware/application/capture_app.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware/application/capture_app.hpp b/firmware/application/capture_app.hpp index ac09816f..8888f9f0 100644 --- a/firmware/application/capture_app.hpp +++ b/firmware/application/capture_app.hpp @@ -96,8 +96,8 @@ public: private: static constexpr ui::Dim header_height = 2 * 16; - static constexpr uint32_t sampling_rate = 2457600; - static constexpr uint32_t baseband_bandwidth = 1750000; + static constexpr uint32_t sampling_rate = 4000000; + static constexpr uint32_t baseband_bandwidth = 2500000; std::unique_ptr capture_thread; From 749298414466108ffee212e1688d4c9a2d704406 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 20 Apr 2016 09:56:35 -0700 Subject: [PATCH 159/164] Add filesystem directory enumeration. Borrow API from std::filesystem -- Boost and C++17. --- firmware/application/file.cpp | 30 ++++++++++++++++++ firmware/application/file.hpp | 59 +++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/firmware/application/file.cpp b/firmware/application/file.cpp index a14325e0..1458f12d 100644 --- a/firmware/application/file.cpp +++ b/firmware/application/file.cpp @@ -78,3 +78,33 @@ bool File::sync() { const auto result = f_sync(&f); return (result == FR_OK); } + +namespace std { +namespace filesystem { + +directory_iterator::directory_iterator( + const char* path, + const char* wild +) { + impl = std::make_shared(); + const auto result = f_findfirst(&impl->dir, &impl->filinfo, path, wild); + if( result != FR_OK ) { + impl.reset(); + // TODO: Throw exception if/when I enable exceptions... + } +} + +directory_iterator& directory_iterator::operator++() { + const auto result = f_findnext(&impl->dir, &impl->filinfo); + if( (result != FR_OK) || (impl->filinfo.fname[0] == 0) ) { + impl.reset(); + } + return *this; +} + +bool is_regular_file(const file_status s) { + return !(s & AM_DIR); +} + +} /* namespace filesystem */ +} /* namespace std */ diff --git a/firmware/application/file.hpp b/firmware/application/file.hpp index 5a4524cf..ed13a06e 100644 --- a/firmware/application/file.hpp +++ b/firmware/application/file.hpp @@ -27,6 +27,8 @@ #include #include #include +#include +#include class File { public: @@ -55,4 +57,61 @@ private: FIL f; }; +namespace std { +namespace filesystem { + +using file_status = BYTE; + +struct directory_entry : public FILINFO { + file_status status() const { + return fattrib; + } + + const std::string path() const noexcept { return fname; }; +}; + +class directory_iterator { + struct Impl { + DIR dir; + directory_entry filinfo; + + ~Impl() { + f_closedir(&dir); + } + }; + + std::shared_ptr impl; + + friend bool operator!=(const directory_iterator& lhs, const directory_iterator& rhs); + +public: + using difference_type = std::ptrdiff_t; + using value_type = directory_entry; + using pointer = const directory_entry*; + using reference = const directory_entry&; + using iterator_category = std::input_iterator_tag; + + directory_iterator() noexcept { }; + directory_iterator(const char* path, const char* wild); + + ~directory_iterator() { } + + directory_iterator& operator++(); + + reference operator*() const { + // TODO: Exception or assert if impl == nullptr. + return impl->filinfo; + } +}; + +inline const directory_iterator& begin(const directory_iterator& iter) noexcept { return iter; }; +inline directory_iterator end(const directory_iterator&) noexcept { return { }; }; + +inline bool operator!=(const directory_iterator& lhs, const directory_iterator& rhs) { return lhs.impl != rhs.impl; }; + +bool is_regular_file(const file_status s); + +} /* namespace filesystem */ +} /* namespace std */ + #endif/*__FILE_H__*/ From f49d04fe7a2fae0c174d313c744d780dc3cf28d7 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 20 Apr 2016 09:57:17 -0700 Subject: [PATCH 160/164] Functions to select next filename based on matching pattern. Used for capture, audio, screenshot file naming. --- firmware/application/file.cpp | 60 +++++++++++++++++++++++++++++++++++ firmware/application/file.hpp | 2 ++ 2 files changed, 62 insertions(+) diff --git a/firmware/application/file.cpp b/firmware/application/file.cpp index 1458f12d..288f5bde 100644 --- a/firmware/application/file.cpp +++ b/firmware/application/file.cpp @@ -21,6 +21,8 @@ #include "file.hpp" +#include + File::~File() { close(); } @@ -79,6 +81,64 @@ bool File::sync() { return (result == FR_OK); } +static std::string find_last_file_matching_pattern(const std::string& pattern) { + std::string last_match; + for(const auto& entry : std::filesystem::directory_iterator("", pattern.c_str())) { + if( std::filesystem::is_regular_file(entry.status()) ) { + const auto match = entry.path(); + if( match > last_match ) { + last_match = match; + } + } + } + return last_match; +} + +static std::string increment_filename_ordinal(const std::string& filename) { + std::string result { filename }; + + auto it = result.rbegin(); + + // Back up past extension. + for(; it != result.rend(); ++it) { + if( *it == '.' ) { + ++it; + break; + } + } + if( it == result.rend() ) { + return { }; + } + + // Increment decimal number before the extension. + for(; it != result.rend(); ++it) { + const auto c = *it; + if( c < '0' ) { + return { }; + } else if( c < '9' ) { + *it += 1; + break; + } else if( c == '9' ) { + *it = '0'; + } else { + return { }; + } + } + + return result; +} + +std::string next_filename_matching_pattern(const std::string& filename_pattern) { + auto filename = find_last_file_matching_pattern(filename_pattern); + if( filename.empty() ) { + filename = filename_pattern; + std::replace(std::begin(filename), std::end(filename), '?', '0'); + } else { + filename = increment_filename_ordinal(filename); + } + return filename; +} + namespace std { namespace filesystem { diff --git a/firmware/application/file.hpp b/firmware/application/file.hpp index ed13a06e..71e454be 100644 --- a/firmware/application/file.hpp +++ b/firmware/application/file.hpp @@ -57,6 +57,8 @@ private: FIL f; }; +std::string next_filename_matching_pattern(const std::string& filename_pattern); + namespace std { namespace filesystem { From 1c544a663b83f9b9a792a7e255614c0ab6aa3608 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 20 Apr 2016 10:22:05 -0700 Subject: [PATCH 161/164] Use automatic file naming for screen capture .png files. --- firmware/application/ui_navigation.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index 2b245dd6..002a8f47 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -35,6 +35,7 @@ #include "core_control.hpp" +#include "file.hpp" #include "png_writer.hpp" namespace ui { @@ -80,7 +81,12 @@ void SystemStatusView::set_title(const std::string new_value) { } void SystemStatusView::on_camera() { - PNGWriter png { "capture.png" }; + const auto filename = next_filename_matching_pattern("SCR_????.PNG"); + if( filename.empty() ) { + return; + } + + PNGWriter png { filename }; for(int i=0; i<320; i++) { std::array row; From 9d635b3fcf38246abf074e3ed7aa0fbfe933bc85 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 20 Apr 2016 10:22:50 -0700 Subject: [PATCH 162/164] Use sequential file naming for audio recording. --- firmware/application/analog_audio_app.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/firmware/application/analog_audio_app.cpp b/firmware/application/analog_audio_app.cpp index 7d5cae40..5e4593b4 100644 --- a/firmware/application/analog_audio_app.cpp +++ b/firmware/application/analog_audio_app.cpp @@ -26,6 +26,7 @@ using namespace portapack; #include "audio.hpp" +#include "file.hpp" #include "utility.hpp" @@ -294,7 +295,10 @@ void AnalogAudioView::update_modulation(const ReceiverModel::Mode modulation) { receiver_model.enable(); if( !is_wideband_spectrum_mode ) { - audio_thread = std::make_unique("audio.s16"); + const auto filename = next_filename_matching_pattern("AUD_????.S16"); + if( !filename.empty() ) { + audio_thread = std::make_unique(filename); + } audio::output::unmute(); } } From f38fca168e3e081b1067aae9a7c8da34922bcd94 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 20 Apr 2016 10:23:59 -0700 Subject: [PATCH 163/164] Use sequential file naming for baseband capture files. --- firmware/application/capture_app.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/firmware/application/capture_app.cpp b/firmware/application/capture_app.cpp index 97ca6ec7..617d4e6b 100644 --- a/firmware/application/capture_app.cpp +++ b/firmware/application/capture_app.cpp @@ -24,6 +24,8 @@ #include "portapack.hpp" using namespace portapack; +#include "file.hpp" + #include "utility.hpp" namespace ui { @@ -103,7 +105,12 @@ void CaptureAppView::on_start_stop() { capture_thread.reset(); button_start_stop.set_bitmap(&bitmap_record); } else { - capture_thread = std::make_unique("baseband.c16"); + const auto filename = next_filename_matching_pattern("BBD_????.C16"); + if( filename.empty() ) { + return; + } + + capture_thread = std::make_unique(filename); button_start_stop.set_bitmap(&bitmap_stop); } } From e4b86d149ccb89ce9a80244e8299e76299815f2e Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 20 Apr 2016 10:24:39 -0700 Subject: [PATCH 164/164] Change file recording behavior to create new file instead of appending. --- firmware/application/audio_thread.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/application/audio_thread.hpp b/firmware/application/audio_thread.hpp index 99d82c18..37802fe8 100644 --- a/firmware/application/audio_thread.hpp +++ b/firmware/application/audio_thread.hpp @@ -100,7 +100,7 @@ private: } msg_t run() { - if( !file.open_for_append(file_path) ) { + if( !file.open_for_writing(file_path) ) { return false; }